• Страница 1 из 1
  • 1
Модератор форума: Dimitro  
Крашится сервер
grivach
Скаут
Всем привет!
создал автоивент (через бд), все вроде было нормально. Решил рестартнуть сервер (ради добавления новых мобов) и тут выхватил вот такую ошибку , из-за которой сервер крашится. Помогите решить проблему , с меня +

Сообщение # 1 отредактировано grivach - Вторник, 08.03.2016, 01:50
pak3935
Чемпион
Лучьше бы собрал ядро в дебаге и приложил крашлог.
Могу предполагать что у нпс слишком большой guid .
Сообщение # 2 написано 08.03.2016 в 11:53
p620
Маршал
mGameEventCreatureGuids определен как (если разворачивать typedef'ы):
Код
std::vector<std::list<uint32>> mGameEventCreatureGuids;

и предназначен для хранения GUID'ов существ, участвующих в событиях.
GameEventMgr::GameEventSpawn() и GameEventMgr::GameEventUnspawn() - методы, вызывающиеся при включении/выключении события (ID события передается им в качестве аргумента).
Первое, что они делают, это проверяют, можно ли заняться удалением/добавлением существ, участвующих в событии, из мира/в мир. Для этого вычисляется internal_event_id (таким образом обеспечивается поддержка отрицательных event_ID):
Код
int32 internal_event_id = mGameEvent.size() + event_id - 1;

А проверка выглядит следующим образом:
Код
if (internal_event_id < 0 || internal_event_id >= int32(mGameEventCreatureGuids.size()))

Немного-немало, от id требуется, чтобы он не был меньше нуля или больше/равен размеру вышеупомянутого контейнера, ибо именно им предстоит его индексировать.
Если же такое происходит, выводится сообщение следующего содержания и осуществляется возврат из метода:
Код
TC_LOG_ERROR("gameevent", "GameEventMgr::GameEventUnspawn attempt access to out of range mGameEventCreatureGuids element %i (size: " SIZEFMTD ")",
            internal_event_id, mGameEventCreatureGuids.size());

У Вас size выводится равным нулю. А это значит, что на момент вызова вышеназванных методов не было подготовлено ни одного экземпляра существа ни для одного события.
Этот размер устанавливается вручную внутри GameEventMgr::Initialize() на основе данных, полученных при исполнении следующего запроса в базу world:
Код
SELECT MAX(eventEntry) FROM game_event;

Выглядит это следующим образом:
Код
QueryResult result = WorldDatabase.Query("SELECT MAX(eventEntry) FROM game_event");
    if (result)
    {
        Field* fields = result->Fetch();

        uint32 maxEventId = fields[0].GetUInt8();

        // Id starts with 1 and vector with 0, thus increment
        maxEventId++; // ++maxEventId;

        // ...

       mGameEventCreatureGuids.resize(maxEventId * 2 - 1);

       // ...
    }

И здесь моя поддержка заканчивается, так как на моей версии ядра нулем размер быть не может (GameEventMgr::Initialize() выполняется безусловно при инициализации мира, и никакие прочие вызовы этому предшествовать не могут):
Если запрос вернет NULL (пустая таблица), GetUInt8() вернет 0, произойдет инкременция, и вектор будет содержать 1 элемент (1 * 2 - 1).
Если запрос вернет единицу, - то уже три элемента (2 * 2 - 1).

Либо прикладывайте точный список действий, которые выполнялись для создания события, либо отлаживайте ядро с этими входными данными, проверяя, что же там плохо заканчивается.
Сообщение # 3 отредактировано p620 - Вторник, 08.03.2016, 13:28
r0m1ntik
Центурион
grivach, отпишите в скайп: dev-diversant помогу понятным языком)
Сообщение # 4 написано 08.03.2016 в 14:46
grivach
Скаут
парни , всем спасибо!  Решил проблему откатом бд на 1 день biggrin
как я сразу не догадался?)

Тему можно удалять.
Сообщение # 5 написано 08.03.2016 в 15:35
  • Страница 1 из 1
  • 1
Поиск: