Привет, знатокам Warcraft! Нужна ваша помощь, чтобы спасти функционал карты.
Есть код, позволяющий по нажатию "space" перевести камеру игрока i на позицию юнита udg_Hero[i], где i - номер игрока (i = 0, 1 или 2).
Проблема в том, что в достаточно долгосрочной перспективе (минимум часа через 2-3, с учётом ежесекундного исполнения триггера), этот код приводит к рассинхронизации. Т.е. в какой-то момент, при выполнении этого куска кода (проверено JassSpy), одного из игроков выбрасывает.
Вопросы.
1) В чём причины рассинхронизации, если внутри блока if GetLocalPlayer() == Player(i) then ... endif не создаются динамические объекты.
2) Есть ли наработки для альтернативного решения перевода камеры по space? (обязательно без мемхака)
3) Можно ли задавать SetCameraQuickPosition(x,y) естественным образом без триггеров, т.е. как-то симулировать события, приводящие к гарантированной установке этого флага в нужном месте в нужный момент для нужного игрока.
Спасибо.
Версия Warcraft 1.26a
function Trig_CameraSystem_Actions takes nothing returns nothing
    local real x
    local real y
    local integer i=0
    loop
        if udg_Hero[i]!=null then
            set x=GetUnitX(udg_Hero[i])
            set y=GetUnitY(udg_Hero[i])
            if GetLocalPlayer() == Player(i) then
                call SetCameraQuickPosition(x,y)
                call SetCameraQuickPosition(x,y)
                call SetCameraQuickPosition(x,y)
                call SetCameraQuickPosition(x,y)
                call SetCameraQuickPosition(x,y)
                call SetCameraQuickPosition(x,y)
            endif
        endif
        exitwhen i==2
        set i=i+1
    endloop
endfunction

//===========================================================================
function InitTrig_CameraSystem takes nothing returns nothing
    set gg_trg_CameraSystem = CreateTrigger(  )
    call TriggerRegisterTimerEvent( gg_trg_CameraSystem, 1.00, true )
    call TriggerAddAction( gg_trg_CameraSystem, function Trig_CameraSystem_Actions )
endfunction
Файлы, где происходит десинк.
Сохранение игрок 1:
Сохранение игрок 2:
Карта:

По возможности убери все способности на порчу, в коде намёков на десинки не увидел.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
23
PT153:
makkad, что за jassspy? И если можешь, то чего не кинул?
Пока нет доступа к компьютеру к файлу.
Для проверки кода подойдёт программа UnrealJassSpy www.hiveworkshop.com/threads/unreal-jass-spy-1-26a.244384
Кидаешь её файлы в папку с игрой, запускаещь игру, ждешь внедрения (жмешь ок), запускаешь карту. Потом в логах JassSpy.txt смотришь на каком месте у тебя прервалась игра.
38
Так это для фаталов, а не десинков. Десинк происходит не сразу на той же инструкции
Проверить легко - убери именно этот код из карты и она продолжит десинкаться
23
ScorpioT1000:
Так это для фаталов, а не десинков. Десинк происходит не сразу на той же инструкции
Проверить легко - убери именно этот код из карты и она продолжит десинкаться
Достаточно мгновенно и стабильно, на этой инструкции плюс минус две функции. Плюс есть триггер, который включается при выходе игрока, и на второй машине, которая остаётся в игре, он включается сразу после этой функции.

PT153:
Порча в карте есть?
Да. Достаточно много.

Спасибо всем за ответы. Да, буду в том чмсле проверять и без этого кода. Ошибка редко ловится с нуля и невоспроизводима. Пока стабильно есть только те сохранения в той конкретной игре и версии, где происходит этот десинк.
Мне кажется, причину найти будет невозможно. Но у меня хорошее предчувствие уже по имеющимся советам оптимизации. Скорее больше хотелось узнать про альтернативы.
То что это может быть глюком записи реплея говорит следующее 1) В реплеях действительно похоже сохраняются все позиции CameraQuickPosition 2) Разный размер файлов сохранений у игроков 3) Отключение записи реплеев зрительно немного повысило производительность в мультиплеере
28
Мне кажется, причину найти будет невозможно.
Ты код скинь. Как это сделать, я уже сказал. Много, не много - не важно, во всех текстовых редакторах есть поиск.
Файл - экспортировать скрипт.
Да. Достаточно много.

Был случай.
Строению даётся способность "Порча" во время игры. После того как для любого юнита вызывается SetUnitPositionLoc, происходит десинхронизация.
23
PT153,
Спасибо за инфу. Но нет, в данном случае юнитам во время игры порчу не давал.
Код карты прикрепил.
Загруженные файлы
28
По возможности убери все способности на порчу, в коде намёков на десинки не увидел.
Принятый ответ
29
у неё, в отличие от д2, тайминги появления нейтралов, рун, крипов не будут съезжать
По-моему это уже пофиксили. Но я не думаю, что это было из-за накопления ошибки флоатов в привычном понимании, а скорее из-за обычной логической ошибки в скедулинге событий из-за нецелого деления круглых минут на время тика.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.