WarCraft 3: Еще одни причины крашей и десинков в рефордже

» Раздел: Триггеры и объекты
Столкнулся с такой проблемой, что игра крашится во время загрузочного экрана только в мультиплеере.
Путем пыток и выключения всего поочереди нашел причину, это функция TriggerRegisterPlayerEvent() и все ее аналоги, включая BJ, созданные на инициализации карты.
Примеры:
BlzTriggerRegisterPlayerKeyEvent()
TriggerRegisterPlayerMouseEventBJ()
Рассмотрим более подробно.
Мы создадим обычный гуишный триггер, конвертируем его в текст и присвоим событие
call BlzTriggerRegisterPlayerKeyEvent(F1,Player(i),OSKEY_F1,0,true)
Оно срабатывает, когда игрок нажимает F1.
И если нажать F1 во время загрузочного экрана (т.к. триггеры создаются в процессе загрузки), даже если функция вызова пустая, - приведет к десинхронизации (игра закроется с ошибкой когда шкала загрузки дойдет до конца, но не покажет вам картинку)
Игра будет думать что это краш, а остальные игроки увидят что вылетевший игрок "просто покинул игру", но на самом деле это десинк, потому что:
мб оно начинало работать в разные моменты времени изза разницы скорости загрузки карты
Следовательно, создавать такие функции нужно ТОЛЬКО после 0.00 игры.
Решил создать отдельный тред, потому что ошибка на самом деле очень распространенная, даже на хгм я видел 2 темы, а на хайве их намного больше накопилось за 2 года, но причину так и не могли найти. Теперь она есть.


Views: 131

PT153 #1 - 2 months ago 0
Голосов: +0 / -0
А причём тут наработка, это статья.
Obelick #2 - 2 months ago 0
Голосов: +0 / -0
Я хз так опубликовали, это не я
PT153 #3 - 2 months ago 0
Голосов: +0 / -0
Obelick, ну так ты же выбираешь категорию.

Исправил.