Ru-MaNGOS

Вернуться   Ru-MaNGOS > Ядро > Баг-репорты

Важная информация

Баг-репорты Описываем проблемы и ошибки работы ядра

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 05.10.2010, 09:17   #1
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию Слетающий комбатлог и пет по имени "неизвестно"

Проблема заключается в периодическом "затыкании" комбатлога на клиентах и пропадании имен петов.
В результате разборок выявлено, что запрос 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);
    }
}
Почему не предлагаю патчем - во первых использование sleep() в коде дурной тон, по хорошему это надо делать через блокировки, а это - уже к разработчикам. Во вторых у меня в коде петов куда глубже изменения и патча не выйдет. Но думаю мысль понятна.
PS оттестировано, работает как положено.

PPS как выяснилось, на серверах с особо тормозной базой 2х секунд явно не хватает, плюс еще при некоторых телепортах таже история. Приходится ставить 10 и более, никаких проблем это не вызывает. Для тестирования пробовал ставить минуту.

Последний раз редактировалось rsa; 05.10.2010 в 13:36. Причина: репорты.
rsa вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
Burned (05.10.2010)
 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
У кого-нибудь есть снифф "воскрешения союзника"? 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


Текущее время: 07:25. Часовой пояс GMT +3.


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot