Привет, знатокам 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:
Карта:

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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
33
шта?
сейчас бы при игре в варкрафт больше часа на сессию тратить в 2020
38
Ща в вов столько в рейды не ходят, хз что вы там выдумываете)
P.s. какие накопления ошибки float?
16
я ж написал про д2 и тайминги, которые съезжают в длинных играх (60+)
щас бы думать, что именно вы - целевая аудитория тех игр, о которых рассуждаете, и лучше знаете среднюю сессию
38
Пообщались в дискорде и пришли к выводу, что юзать ieee float32 в таймерах - криворукость разрабов, в ос юзаются int микросекунды.
В других случаях проблема бы прокатила из-за float64, но не в 32 битном вц3. Про доту ничего не скажу, не запускал ни разу в жизни.
Что касается автора, результат с периодом 0.005 так и не получил
23
Что касается автора, результат с периодом 0.005 так и не получил
Результат отрицательный. Проблем не было. Проблема только при ''грязной игре''. Вот тут расснихрон через 30 сек примерно:
Сохранение игрок 1:
Сохранение игрок 2:
Карта:

Проблема похоже всё-же в том, что накопился какой-то рассинхрон из-за разности времени исполнения функций. Не знаю, как это возможно. Но думаю, если отключить запись реплеев и сделать функцию симметричной для всех игроков (т.е. сделать одинаковый порядок выполнения функций для разных машин), будет легче. Спасибо за наводки.

Просто сейчас порядок такой.
Игрок 1:
GetUnitX() -> GetUnitY() -> GetLocalPlayer() -> SetCameraQuickPosition(x,y) ... -> GetUnitX() -> GetUnitY() -> GetLocalPlayer()
Игрок 2:
GetUnitX() -> GetUnitY() -> GetLocalPlayer() -> GetUnitX() -> GetUnitY() -> GetLocalPlayer() -> SetCameraQuickPosition(x,y) ...
Можно более оптимально переписать код, как здесь xgm.guru/p/wc3/Rassinkhron-ot-GetLocalPlayer---SetCameraQuickPos... и тогда у всех игроков будет порядок:
GetLocalPlayer() -> GetUnitX() -> GetUnitY() -> SetCameraQuickPosition(x,y) ...
Это, наверное, позволит Warcraft не форсировать desync при выполнении этого кода,.
23
PT153:
makkad, скрипт кинь. Файл - экспортировать скрипт.
Могу, но там огромная карта. В любом случае, jassspy указывет на это место.
23
PT153:
makkad, что за jassspy? И если можешь, то чего не кинул?
Пока нет доступа к компьютеру к файлу.
Для проверки кода подойдёт программа UnrealJassSpy www.hiveworkshop.com/threads/unreal-jass-spy-1-26a.244384
Кидаешь её файлы в папку с игрой, запускаещь игру, ждешь внедрения (жмешь ок), запускаешь карту. Потом в логах JassSpy.txt смотришь на каком месте у тебя прервалась игра.
38
Так это для фаталов, а не десинков. Десинк происходит не сразу на той же инструкции
Проверить легко - убери именно этот код из карты и она продолжит десинкаться
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.