Привет, знатокам 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) естественным образом без триггеров, т.е. как-то симулировать события, приводящие к гарантированной установке этого флага в нужном месте в нужный момент для нужного игрока.
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:
Сохранение игрок 1:
Сохранение игрок 2:
Карта:
Принятый ответ
По возможности убери все способности на порчу, в коде намёков на десинки не увидел.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован ScorpioT1000
Этот код не вызывает десинх, покажите другой, с пробеломА зачем столько раз вызывать одну функцию?Отредактирован Берги
И всегда можно обвинять реф, что в нём что-то поломали, а что игра 2003 года с тонной багов никто не хочет признавать, Она не расчитана на 2-3 часа игры в принципе. Если вы видели как играли в игру какую-то (Название вашей любимой игры) карту и по 10 часов и по 20. Значит она была крайне простой или "удачно" написанной. (не буду ничего говорить про скилл китайцев/корейцев, они гавнокодеры как и мы все здесь). 2-3 часа для кастомки и так мега супер хороший результат.
Отредактирован makkad
эта игра поддерживает сейв-лоад, имеет защиту от накопления ошибки float в виде 300-секундных "актов". Она способна играть столько, сколько сможет обеспечить программист триггеров, и у неё, в отличие от д2, тайминги появления нейтралов, рун, крипов не будут съезжать. 10 часов - это средняя сессия в какой-нибудь варкрафтовской ORPG средней руки.
Отредактирован ScorpioT1000
щас бы думать, что именно вы - целевая аудитория тех игр, о которых рассуждаете, и лучше знаете среднюю сессию
Отредактирован ScorpioT1000
Отредактирован makkad
Игрок 1:
GetUnitX() -> GetUnitY() -> GetLocalPlayer() -> SetCameraQuickPosition(x,y) ... -> GetUnitX() -> GetUnitY() -> GetLocalPlayer()
Игрок 2:
GetUnitX() -> GetUnitY() -> GetLocalPlayer() -> GetUnitX() -> GetUnitY() -> GetLocalPlayer() -> SetCameraQuickPosition(x,y) ...
GetLocalPlayer() -> GetUnitX() -> GetUnitY() -> SetCameraQuickPosition(x,y) ...
Отредактирован ScorpioT1000
Отредактирован PT153
Спасибо за инфу. Но нет, в данном случае юнитам во время игры порчу не давал.