|
|
Модератор форума: Dimitro |
Форум TrinityCore [TrinityCore] Help Крашится сервер (Парни , хэлп!) |
Крашится сервер |
Всем привет!
создал автоивент (через бд), все вроде было нормально. Решил рестартнуть сервер (ради добавления новых мобов) и тут выхватил вот такую ошибку , из-за которой сервер крашится. Помогите решить проблему , с меня + |
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). Либо прикладывайте точный список действий, которые выполнялись для создания события, либо отлаживайте ядро с этими входными данными, проверяя, что же там плохо заканчивается. |
| |||
| |||