|
Баг-репорты Описываем проблемы и ошибки работы ядра |
|
Опции темы | Поиск в этой теме | Опции просмотра |
05.10.2010, 09:17 | #1 |
Почетный флудер
Старожил
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
|
Слетающий комбатлог и пет по имени "неизвестно"
Проблема заключается в периодическом "затыкании" комбатлога на клиентах и пропадании имен петов.
В результате разборок выявлено, что запрос PET_NAME_QUERY от клиента приходит до того как выполнится запрос в базу на поднятие оттуда темпунсаммоненного или нового пета (вероятность естественно 50/50). Частичное решение проблемы: http://github.com/insider42/mangos/c...461bf1c2ad9d9c Полное решение проблемы (предлагается только путь): Код:
=========== Pet.h bool IsInWorld() const {return (!m_loading && !m_removed && Object::IsInWorld()); } =========== PetHandler.cpp void WorldSession::HandlePetNameQueryOpcode( WorldPacket & recv_data ) { DETAIL_LOG( "HandlePetNameQuery. CMSG_PET_NAME_QUERY" ); uint32 petnumber; ObjectGuid petguid; recv_data >> petnumber; recv_data >> petguid; SendPetNameQuery(petguid,petnumber); } void WorldSession::SendPetNameQuery( ObjectGuid petguid, uint32 petnumber) { Creature* _pet = GetPlayer()->GetMap()->GetAnyTypeCreature(petguid); if (!_pet || !_pet->isPet()) return; Pet* pet = (Pet*)_pet; uint32 sleeptime = 0; while (!pet->IsInWorld() && sleeptime < 2000) { ACE_Based::Thread::Sleep(100); sleeptime += 100; } if (!pet->IsInWorld() || pet->GetCharmInfo()->GetPetNumber() != petnumber) { WorldPacket data(SMSG_PET_NAME_QUERY_RESPONSE, (4+1)); data << uint32(petnumber); data << uint8(0); _player->GetSession()->SendPacket(&data); return; } else if (pet) { std::string name = pet->GetName(); WorldPacket data(SMSG_PET_NAME_QUERY_RESPONSE, (4+4+name.size()+1)); data << uint32(petnumber); data << name.c_str(); data << uint32(pet->GetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP)); if( pet->isPet() && ((Pet*)pet)->GetDeclinedNames() ) { data << uint8(1); for(int i = 0; i < MAX_DECLINED_NAME_CASES; ++i) data << ((Pet*)pet)->GetDeclinedNames()->name[i]; } else data << uint8(0); _player->GetSession()->SendPacket(&data); } } PS оттестировано, работает как положено. PPS как выяснилось, на серверах с особо тормозной базой 2х секунд явно не хватает, плюс еще при некоторых телепортах таже история. Приходится ставить 10 и более, никаких проблем это не вызывает. Для тестирования пробовал ставить минуту. Последний раз редактировалось rsa; 05.10.2010 в 13:36. Причина: репорты. |
Пользователь сказал cпасибо: | Burned (05.10.2010) |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
У кого-нибудь есть снифф "воскрешения союзника"? | rsa | Запросы | 8 | 01.02.2011 03:20 |
[10678] Revert "[10675] Ignore BOA items reputation requirements at use." | newsbot | CMaNGOS Commits | 0 | 04.11.2010 12:30 |
[10558] Fix spell "Spinning" (64385) for item "Unusual Compass" (45984) | newsbot | CMaNGOS Commits | 0 | 29.09.2010 23:20 |
[10509] Fix some "foo initialized after bar" gcc warnings and remove some unused variables. | newsbot | CMaNGOS Commits | 0 | 20.09.2010 11:14 |
[10179] Add "missing" spells in commented form for Aura::TriggerSpell() | newsbot | CMaNGOS Commits | 0 | 11.07.2010 13:40 |