Сразу предупрежу, база YTDB последняя.
Сегодня ненароком уронил свой сервер, пользуясь командой
.gobject turn #guid.
Функция отработала (объект пропал и появился в нужном месте), но после чего всё зависло. По идее, в чат должно было написать что-то вроде "Game Object #id turned", однако вместо этого сервер упал.
Благо, на машине (вместе с MaNGOS) у меня стоит MSVC++.
Вылетела ошибка и windows предложил мне отладку программы. В ходе расследования определил, что падение происходит из-за финального
PSendSysMessage() (что и требовалось доказать). Далее отладчик сообщил мне первый аргумент этой функции (HEX: 0x00...114 = DEC: 276).
Решил проверить, что же у меня там в базе лежит. Полез в mangos_string, нашёл id 276. АГА, вот оно! Истинная структура: "
Game Object |cffffffff|Hgameobject:%d|h[%s]|h|r (GUID: %u) turned". Из этого я понял, что в эту структуру подставляется 3 значения.
Полез в ядро (level2.cpp:
bool ChatHandler::HandleGameObjectTurnCommand(const char* args)), и очумел.
Код:
PSendSysMessage(LANG_COMMAND_TURNOBJMESSAGE, obj->GetGUIDLow(), obj->GetGOInfo()->name, obj->GetGUIDLow(), o);
В функцию передавалось не 3, а целых
4 параметра (не считая id mangos_string). Не долго думая, убрал с конца переменную ориентации (зачем ей там быть, это ведь только чат?). Собираю...
Собрал. Теперь команда работает без падения.
Баг? Кривизна моих рук/головы?
Фикс в аттаче (подогнан под 9948).
P.s. Странно только то, что эта ошибка замечена мною даже в ветке 0.12, а никто ничего не отпостил (хотя, может быть потому, что недо-админы не суются к нам, а чОткие пацаны просто не используют эту команду
).