TriggerSleepAction can't cause a desync (well, unless you do it for a local player)
ну раз двое опытных картоделов пишут не использовать в сетевой игре TriggerSleepAction, значит на то есть причины
если только это не старый новый миф для xgm.guru/p/wc3/Jass-MythBusters
я не понял
а чё, так можно было?
на тестах всё прекрасно работает для разных игроков с личным циклом
globals
integer PLAYERS=12
integer array GO
endglobals
function GOO3_Actions takes nothing returns nothing
local integer i=GetPlayerId(GetTriggerPlayer())+1
local integer j=1
loop
exitwhen j>10
if GO[i]==1 then
call BJDebugMsg("111 "+GetPlayerName(Player(i-1)))
call TriggerSleepAction(2)
endif
if GO[i]==1 then
call BJDebugMsg("222 "+GetPlayerName(Player(i-1)))
call TriggerSleepAction(2)
endif
if GO[i]==1 then
call BJDebugMsg("333 "+GetPlayerName(Player(i-1)))
call TriggerSleepAction(2)
endif
set j=j+1
endloop
endfunction
function GOO3 takes nothing returns nothing
local integer i=GetPlayerId(GetTriggerPlayer())+1
if GO[i]==0 then
set GO[i]=1
call GOO3_Actions()
else
set GO[i]=0
endif
endfunction
function Start takes nothing returns nothing
local string s=StringCase(GetEventPlayerChatString(),false)
if s=="-g3" then
call GOO3()
endif
endfunction
function Start_init takes nothing returns nothing
local trigger t=CreateTrigger()
local integer i=1
loop
exitwhen i>PLAYERS
call TriggerRegisterPlayerChatEvent(t,Player(i-1),"-",false)
set i=i+1
endloop
call TriggerAddAction(t,function Start)
endfunction
call Start_init()
и никакие глобалки не нужны
да ещё к тому же прекрасно можно передавать без ХТ переменные внутрь сна, чего нельзя было делать в таймерном и периодически-тригерном решениях
да ещё и логика кода супер простая
требую созвать консилиум по этому вопросу
:3: syntax error
:3: Undefined type MAX_PLAYER
:4: syntax error
:4: Undefined type MAX_PLAYER
:37: Undeclared variable gg_trg_Loop
после починки кривокода видно, что каждый тикающий ускоряет тик всех остальных
это то, с чем я столкнулся в начале этого сообщения
для проверки этого феномена достаточно выставить таймер 5 секунд
и в 3 окнах одновременно отправить go
через 5 секунд у каждого будет по 3 тика, чего не может быть т.к. для трех тиков нужно 15 секунд
почему бы не добавить inject-статус на левый side-bar программы?
когда успешно заинжектился - чтобы загорался зеленый квадратик / кругляш
иначе - красный
приходится инжект проверять через mouse lock или строку чата или через бинд на move
На какой версии фатал, где краш лог? ФПС даже на предыдущей прекрасно повышался. Можно не будем выдумывать баги? :(
ты пользуешься 10-кой
а на 7-ке проблемы с инжектом на 3.1.11.68 (вплоть до того что WFE-ланчером запускать war3.exe 1.26 оригинального варика без модов, не говоря уже про автоинжект и multiwindow - ничего не работает, заинжектиться целая проблема)
и год-два назад были проблемы с крашами и работой половины кнопок (v1.26) (и нет, винда не от васяна, и да - проблемы на разных компах а не только на одном) (и да MS VC++ и прочие дотнеты установлены)
так что обзаведись виртуалками на всякий и погоняй WFE пару часов на семёрке, проверяя все кнопки - краш или не работа какой-то мемхакной кнопки не заставит себя долго ждать (тесты всегда проводились на стандартных melee картах от близов)
накалякал вариант на тригере, таймерные тригеры у игроков также личные
по сути ничем не отличается по исполнению от таймера by nazarpunk
те же самые SaveInteger , LoadInteger
и ничего не оптимизировано, ничего не занулялось в конце функций
globals
integer PLAYERS=12
integer array GO
integer array N
trigger array tgo2
integer array tgo2_init
hashtable ht=InitHashtable()
endglobals
function GOO2_Actions takes nothing returns nothing
local integer i=LoadInteger(ht,GetHandleId(GetTriggeringTrigger()),0)
set N[i]=N[i]+1
if ModuloInteger(N[i],3)==1 then
call BJDebugMsg(I2S(N[i])+" Action 1: "+GetPlayerName(Player(i-1)))
elseif ModuloInteger(N[i],3)==2 then
call BJDebugMsg(I2S(N[i])+" Action 2: "+GetPlayerName(Player(i-1)))
elseif ModuloInteger(N[i],3)==0 then
call BJDebugMsg(I2S(N[i])+" Action 3: "+GetPlayerName(Player(i-1)))
//set N[i]=0
endif
endfunction
function GOO2 takes nothing returns nothing
local integer i=GetPlayerId(GetTriggerPlayer())+1
if tgo2_init[i]==0 then
set tgo2_init[i]=1
set tgo2[i]=CreateTrigger()
call SaveInteger(ht,GetHandleId(tgo2[i]),0,i)
call TriggerRegisterTimerEvent(tgo2[i], 1,true)
call TriggerAddAction(tgo2[i], function GOO2_Actions)
call DisableTrigger(tgo2[i])
endif
if GO[i]==0 then
set GO[i]=1
call EnableTrigger(tgo2[i])
else
set GO[i]=0
set N[i]=0
call DisableTrigger(tgo2[i])
call BJDebugMsg("STOP: "+GetPlayerName(Player(i-1)))
endif
endfunction
function Start takes nothing returns nothing
local string s=StringCase(GetEventPlayerChatString(),false)
elseif s=="-g2" then
call GOO2()
endif
endfunction
function Start_init takes nothing returns nothing
local trigger t=CreateTrigger()
local integer i=1
loop
exitwhen i>PLAYERS
call TriggerRegisterPlayerChatEvent(t,Player(i-1),"-",false)
set i=i+1
endloop
call TriggerAddAction(t,function Start)
endfunction
call Start_init()
имелись ввиду глобалки простые типа integer и string
в общем хештейбл я так понял это как словарь (еще и с древовидной child-parent структурой), из которого можно по нужной фразе вытянуть сохранённое значение
в данном случае тянется номер игрока по привязанному к нему id таймера. классное решение
globals
string MyTimerLib___msg="-run"
integer MyTimerLib___i
integer array MyTimerLib___action
timer array MyTimerLib___ticker
boolean array MyTimerLib___running
hashtable MyTimerLib___ht=InitHashtable()
endglobals
function MyTimerLib___anon__1 takes nothing returns nothing
set MyTimerLib___i=LoadInteger(MyTimerLib___ht,GetHandleId(GetExpiredTimer()),0)
set MyTimerLib___action[MyTimerLib___i]=MyTimerLib___action[MyTimerLib___i]+1
call BJDebugMsg("Player: "+I2S(MyTimerLib___i)+", action: "+I2S(MyTimerLib___action[MyTimerLib___i]))
if(MyTimerLib___action[MyTimerLib___i]==2)then
set MyTimerLib___action[MyTimerLib___i]=-1
endif
endfunction
function MyTimerLib___anon__0 takes nothing returns nothing
set MyTimerLib___i=GetPlayerId(GetTriggerPlayer())
if(MyTimerLib___running[MyTimerLib___i])then
call PauseTimer(MyTimerLib___ticker[MyTimerLib___i])
set MyTimerLib___action[MyTimerLib___i]=-1
set MyTimerLib___running[MyTimerLib___i]=false
call BJDebugMsg("Player: "+I2S(MyTimerLib___i)+", stop")
return
endif
set MyTimerLib___running[MyTimerLib___i]=true
call TimerStart(MyTimerLib___ticker[MyTimerLib___i],.3,true,function MyTimerLib___anon__1)
endfunction
function MyTimerLib___onInit takes nothing returns nothing
local trigger t=CreateTrigger()
set MyTimerLib___i=0
loop
exitwhen(MyTimerLib___i>=bj_MAX_PLAYER_SLOTS)
if(GetPlayerController(Player(MyTimerLib___i))==MAP_CONTROL_USER and GetPlayerSlotState(Player(MyTimerLib___i))==PLAYER_SLOT_STATE_PLAYING)then
call TriggerRegisterPlayerChatEvent(t,Player(MyTimerLib___i),MyTimerLib___msg,false)
set MyTimerLib___action[MyTimerLib___i]=-1
set MyTimerLib___running[MyTimerLib___i]=false
set MyTimerLib___ticker[MyTimerLib___i]=CreateTimer()
call SaveInteger(MyTimerLib___ht,GetHandleId(MyTimerLib___ticker[MyTimerLib___i]),0,MyTimerLib___i)
endif
set MyTimerLib___i=MyTimerLib___i+1
endloop
call TriggerAddAction(t,function MyTimerLib___anon__0)
set t=null
endfunction
call ExecuteFunc("MyTimerLib___onInit")
т.е. на глобалках и таймерах подобный код не сделать с отдельным таймером для каждого плеера? (кроме как топорно отдельную функцию под отдельного плеера)
т.е. решить проблему передачи номера игрока внутрь таймера, что ты успешно проделал через HT
function test takes nothing returns nothing
local integer i=0
loop
exitwhen i>bj_MAX_PLAYERS
if GetLocalPlayer()==Player(i) then
call BJDebugMsg(I2S(GetPlayerId(GetLocalPlayer())))
endif
set i=i+1
endloop
endfunction
у меня выше с таймерами алгоритмика хромала (если несколько раз отправить -g - то чаще тикало, таймеры накладывались)
у nazarpunk алгоритмика хорошая и рабочая
вот что получилось для 4х игроков на таймерах:
(из них у 1го игрока идёт общий подсчёт действий, у остальных без подсчёта)
globals
integer PLAYERS=12
integer array GO
integer array N
timer array Ti
endglobals
function OnPeriodic_4 takes nothing returns nothing
local integer i=4
set N[i]=N[i]+1
if N[i]==1 then
call BJDebugMsg("Action 1: "+GetPlayerName(Player(i-1)))
elseif N[i]==2 then
call BJDebugMsg("Action 2: "+GetPlayerName(Player(i-1)))
elseif N[i]==3 then
call BJDebugMsg("Action 3: "+GetPlayerName(Player(i-1)))
set N[i]=0
endif
endfunction
function OnPeriodic_3 takes nothing returns nothing
local integer i=3
set N[i]=N[i]+1
if N[i]==1 then
call BJDebugMsg("Action 1: "+GetPlayerName(Player(i-1)))
elseif N[i]==2 then
call BJDebugMsg("Action 2: "+GetPlayerName(Player(i-1)))
elseif N[i]==3 then
call BJDebugMsg("Action 3: "+GetPlayerName(Player(i-1)))
set N[i]=0
endif
endfunction
function OnPeriodic_2 takes nothing returns nothing
local integer i=2
set N[i]=N[i]+1
if N[i]==1 then
call BJDebugMsg("Action 1: "+GetPlayerName(Player(i-1)))
elseif N[i]==2 then
call BJDebugMsg("Action 2: "+GetPlayerName(Player(i-1)))
elseif N[i]==3 then
call BJDebugMsg("Action 3: "+GetPlayerName(Player(i-1)))
set N[i]=0
endif
endfunction
function OnPeriodic_1 takes nothing returns nothing
local integer i=1
set N[i]=N[i]+1
if ModuloInteger(N[i],3)==1 then
call BJDebugMsg(I2S(N[i])+" Action 1: "+GetPlayerName(Player(i-1)))
elseif ModuloInteger(N[i],3)==2 then
call BJDebugMsg(I2S(N[i])+" Action 2: "+GetPlayerName(Player(i-1)))
elseif ModuloInteger(N[i],3)==0 then
call BJDebugMsg(I2S(N[i])+" Action 3: "+GetPlayerName(Player(i-1)))
//set N[i]=0
endif
endfunction
function GOO takes nothing returns nothing
local integer i=GetPlayerId(GetTriggerPlayer())+1
if GO[i]==0 then
set GO[i]=1
set Ti[i]=CreateTimer()
else
set GO[i]=0
call PauseTimer(Ti[i])
call DestroyTimer(Ti[i])
call BJDebugMsg("STOP: "+GetPlayerName(Player(i-1)))
endif
set N[i]=0
if GO[i]==1 and i==1 then
call TimerStart(Ti[i], 1, true, function OnPeriodic_1)
elseif GO[i]==1 and i==2 then
call TimerStart(Ti[i], 1, true, function OnPeriodic_2)
elseif GO[i]==1 and i==3 then
call TimerStart(Ti[i], 1, true, function OnPeriodic_3)
elseif GO[i]==1 and i==4 then
call TimerStart(Ti[i], 1, true, function OnPeriodic_4)
endif
endfunction
function Start takes nothing returns nothing
local string s=StringCase(GetEventPlayerChatString(),false)
if s=="-g" then
call GOO()
endif
endfunction
function Start_init takes nothing returns nothing
local trigger t=CreateTrigger()
local integer i=1
loop
exitwhen i>PLAYERS
call TriggerRegisterPlayerChatEvent(t,Player(i-1),"-",false)
set i=i+1
endloop
call TriggerAddAction(t,function Start)
endfunction
call Start_init()
в первом твоём коде:
ты загнал таймер сразу в Start_init
хотя эта функция вообще за чат отвечает, как и Start
т.е. до твоей правки они были универсальны, а после твоей правки стали бесполезно-громоздки, т.к. получился отдельный большой тригер-чата исключительно под таймер
+ если я правильно прочитал твой код в Start_init - то при старте карты у тебя включится таймер в бэк режиме, оттягивая на себя ресурсы просто так
+ у нас с панком команда из чата работает как вкл/выкл, как и было заявлено в первом посте. а у тебя получается она является стартующей. т.е. она только вкл
+ дебаг:
:39: Index missing for array variable TIME
:40: Index missing for array variable TIME
надо заменить
"timer array TIME" на "timer TIME=null" - для 1го кода
или оставить "timer array TIME" - для 2го кода
в обоих случаях дебаг строка выходит только в 1й тик таймера и потом перестаёт выводиться. что-то с алгоритмикой
второй код аналогично - только первая строка
попробую поискать где ошибка и как-то адаптировать чтобы заработало
вот
ты этой строкой выключаешь таймер после первого тика сразу внутри самого таймера
по поводу твоего второго варианта:
каждый 1 тик работает 12 раз (по количеству плееров)
т.е. если 1й игрок пишет -g то за 1 тик выдает 12 строк
видимо потому что в Start_init ты 12 раз запускаешь 12 таймеров т.е. 12 функций OnPeriodic за 1 тик
попробуй сам на карте
не вор , а моддер
или ты про воровство скопированных битов? своровать можно только физический оригинал и обладатель оригинала ОБЕДНЕЕТ на то количество штук, сколько ты своровал. а скопированные биты ты никак не можешь своровать. т.к. после копирования - это лично твоя копия и принадлежит тебе
или ты думаешь движок сайта xgm тоже с нуля писан и не задействует никаких сторонних библиотек?
а товарищ майор когда свою коробку СОРМ-2 и СОРМ-3 подключает между провайдером и тобой - он кто? вор или блюститель порядка?
Можно один таймер для всех, а когда таймер истекает, то циклом проверять всех игроков и в зависимости переменной записаной на игрока выполнять действия
я уже так попробовал, выше вот в начале этого сообщения , там всё описано. есть идеи по коду? либо свой напилить, либо у меня ошибку найти?
а тем временем я сделал говнокод (который работает) с полностью раздельными таймерами на каждого игрока
не получается одной функцией обрабатывать отдельные таймеры под каждого игрока
каждый новый игрок включивший таймер ускоряет тик у каждого включившего.
т.е. если 3 игрока запустят таймер - то у всех из них тик будет чаще в 3 раза
или это надо делать своей отдельной функцией под каждого игрока?
т.е Spell_1 Spell_2 Spell_3 + OnPeriodic_1 OnPeriodic_2 OnPeriodic_3
бред конечно, что нельзя в таймерную функцию передавать переменные. кто-то запустил функцию по таймеру, а кто? да хз кто, тикает и ладно
globals
integer PLAYERS=12
integer array N
timer array Ti
timer array TIME
integer array GO
endglobals
function OnPeriodic takes nothing returns nothing
local integer i=1
loop
exitwhen i>PLAYERS
if GO[i]==1 then
set Ti[i] = GetExpiredTimer()
call BJDebugMsg("timer i "+I2S(i)+"__GO[i] "+I2S(GO[i])+"__N [i] "+I2S(N[i])+"__Name "+GetPlayerName(Player(i-1)))
set N[i]=N[i]+1
endif
if GO[i]==0 then
call PauseTimer(Ti[i])
call DestroyTimer(Ti[i])
endif
set i=i+1
endloop
set Ti[i] = null
endfunction
function Spell takes nothing returns nothing
local integer i=GetPlayerId(GetTriggerPlayer())+1
set TIME[i] = CreateTimer()
call BJDebugMsg("TIME "+I2S(i))
call TimerStart(TIME[i], 1, true, function OnPeriodic)
set TIME[i] = null
endfunction
function GOO takes nothing returns nothing
local integer i=GetPlayerId(GetTriggerPlayer())+1
if GO[i]==0 then
set GO[i]=1
call BJDebugMsg("GO 1")
call Spell()
else
set GO[i]=0
call BJDebugMsg("GO 0")
set N[i]=0
endif
endfunction
function Start takes nothing returns nothing
local string s=StringCase(GetEventPlayerChatString(),false)
if s=="-g" then
call GOO()
endif
endfunction
function Start_init takes nothing returns nothing
local trigger t=CreateTrigger()
local integer i=1
loop
exitwhen i>PLAYERS
call TriggerRegisterPlayerChatEvent(t,Player(i-1),"-",false)
set i=i+1
endloop
call TriggerAddAction(t,function Start)
endfunction
globals
integer MyTimerLib__n=-1
timer MyTimerLib__ticker=CreateTimer()
string MyTimerLib__msg="-run"
boolean MyTimerLib__running=false
player MyTimerLib__p
endglobals
function MyTimerLib__anon__1 takes nothing returns nothing
set MyTimerLib__n=MyTimerLib__n+1
if(MyTimerLib__n==0)then
call BJDebugMsg("action 1: "+I2S(GetPlayerId(MyTimerLib__p)))
endif
if(MyTimerLib__n==1)then
call BJDebugMsg("action 2: "+I2S(GetPlayerId(MyTimerLib__p)))
endif
if(MyTimerLib__n==2)then
call BJDebugMsg("action 3: "+I2S(GetPlayerId(MyTimerLib__p)))
set MyTimerLib__n=-1
endif
endfunction
function MyTimerLib__anon__0 takes nothing returns nothing
set MyTimerLib__p=GetTriggerPlayer()
if(MyTimerLib__running)then
call PauseTimer(MyTimerLib__ticker)
set MyTimerLib__n=-1
set MyTimerLib__running=false
call BJDebugMsg("stop")
return
endif
set MyTimerLib__running=true
call TimerStart(MyTimerLib__ticker,.3,true,function MyTimerLib__anon__1)
endfunction
function MyTimerLib__onInit takes nothing returns nothing
local trigger t=CreateTrigger()
local integer i=0
set i=0
loop
exitwhen(i>=bj_MAX_PLAYER_SLOTS)
if(GetPlayerController(Player(i))==MAP_CONTROL_USER and GetPlayerSlotState(Player(i))==PLAYER_SLOT_STATE_PLAYING)then
call TriggerRegisterPlayerChatEvent(t,Player(i),MyTimerLib__msg,false)
endif
set i=i+1
endloop
call TriggerAddAction(t,function MyTimerLib__anon__0)
set t=null
endfunction
call ExecuteFunc("MyTimerLib__onInit")
твой код работает если таймер один общий на всех, только я уже дальше пошёл в самом верху этого сообщения, пытаясь запилить свои действия для каждого игрока, пока не выходит чаша
как передать GetPlayerId(GetTriggerPlayer()) в таймерную функцию MyTimerLib___anon__0 ?
или таймер такого не может - поэтому надо перебором всех плееров?
Зачем брать из камеры, если камера юзает число из чата?)
зачем брать из чата, когда можно взять из координат камеры?
ты сам пробовал хоть раз написать -создатьюнита +25724 -15876 ? попробуй
а потом попробуй 10 раз для разных координат написать
может потом ты поймешь смысол этой темы уже
то был как пример синхронизации данных т.е вывода локального значения у локального игрока в глобальную общую переменную, но там же и указано, что такого невозможно сделать через чат, т.к. попросту на джасе нет функции написания сообщения в чат от игрока
а это зависит от количества операций? одно дело периодически передавать координаты постоянно. а другое дело - передать две координаты, скажем 1 раз в 10 секунд или 1 раз в минуту. только вопрос - сколько строк кода такое займёт. я там вижу и доп файлы в той карте "ExtraCache.dat" "text.fdf" - слишком всё это громоздко, и наверное зависит от целеполагания. когда такая фича является основой карты - это можно понять. а когда хочешь сделать просто БОНУСОМ функцию, то пару сотен строк кода и доп файлы - дороговато
if GetLocalPlayer()==GetOwningPlayer(s)then //взять конкретного игрока
call StoreReal(AL,NKB(s),"MouseX",x) //засейвить мышь в хэш
call StoreReal(AL,NKB(s),"MouseY",y)
call SyncStoredReal(AL,NKB(s),"MouseX") //отправить кэш в синк
call SyncStoredReal(AL,NKB(s),"MouseY")
endif
call StoreReal(AL,NKB(s),"MouseX",0) //перезаписать коорды всем
call StoreReal(AL,NKB(s),"MouseY",0)
попробую покурить, посмотрю на инпут лаг
паладин перемещающийся по мыше красного игрока
о, там даже есть пример именно того что нужно
и инпут лаг как раз 0.2 сек
похоже на первое решение в этой теме, точно покурю
только видимо размер кода очень большой на всё это, измеряется сотнями строк
Ред. host_pi
» WarCraft 3 / как сделать 3 разных действия с одной периодичностью по таймеру?
вот тут пишут
если только это не старый новый миф для xgm.guru/p/wc3/Jass-MythBusters
Ред. host_pi
» WarCraft 3 / как сделать 3 разных действия с одной периодичностью по таймеру?
есть ссылки на статьи? пошёл погуглить
Ред. host_pi
» WarCraft 3 / Есть ли у кого-то *.mix который показывает путь к карте?
TFTLocal такое умеет xgm.guru/p/wc3/TFTLocal
Ред. host_pi
» WarCraft 3 / как сделать 3 разных действия с одной периодичностью по таймеру?
а чё, так можно было?
на тестах всё прекрасно работает для разных игроков с личным циклом
да ещё к тому же прекрасно можно передавать без ХТ переменные внутрь сна, чего нельзя было делать в таймерном и периодически-тригерном решениях
да ещё и логика кода супер простая
требую созвать консилиум по этому вопросу
» WarCraft 3 / как сделать 3 разных действия с одной периодичностью по таймеру?
кривокодие:
это то, с чем я столкнулся в начале этого сообщения
для проверки этого феномена достаточно выставить таймер 5 секунд
и в 3 окнах одновременно отправить go
через 5 секунд у каждого будет по 3 тика, чего не может быть т.к. для трех тиков нужно 15 секунд
кривокодие:
кривокодие:
надо заменить
Ред. host_pi
» WarCraft 3 / WFE - Warcraft Feature Extender
когда успешно заинжектился - чтобы загорался зеленый квадратик / кругляш
иначе - красный
приходится инжект проверять через mouse lock или строку чата или через бинд на move
а на 7-ке проблемы с инжектом на 3.1.11.68 (вплоть до того что WFE-ланчером запускать war3.exe 1.26 оригинального варика без модов, не говоря уже про автоинжект и multiwindow - ничего не работает, заинжектиться целая проблема)
и год-два назад были проблемы с крашами и работой половины кнопок (v1.26) (и нет, винда не от васяна, и да - проблемы на разных компах а не только на одном) (и да MS VC++ и прочие дотнеты установлены)
так что обзаведись виртуалками на всякий и погоняй WFE пару часов на семёрке, проверяя все кнопки - краш или не работа какой-то мемхакной кнопки не заставит себя долго ждать (тесты всегда проводились на стандартных melee картах от близов)
» WarCraft 3 / Good Jassspy (JASS логер)
» WarCraft 3 / Быстрые анимации в главном меню
Ред. host_pi
» WarCraft 3 / как сделать 3 разных действия с одной периодичностью по таймеру?
по сути ничем не отличается по исполнению от таймера by nazarpunk
те же самые SaveInteger , LoadInteger
и ничего не оптимизировано, ничего не занулялось в конце функций
» WarCraft 3 / Депротект (знаю заеженная тема)
Ред. host_pi
» WarCraft 3 / как сделать 3 разных действия с одной периодичностью по таймеру?
nazarpunk:
в общем хештейбл я так понял это как словарь (еще и с древовидной child-parent структурой), из которого можно по нужной фразе вытянуть сохранённое значение
в данном случае тянется номер игрока по привязанному к нему id таймера. классное решение
Ред. host_pi
» WarCraft 3 / как сделать 3 разных действия с одной периодичностью по таймеру?
т.е. решить проблему передачи номера игрока внутрь таймера, что ты успешно проделал через HT
Ред. host_pi
» WarCraft 3 / возможно ли ч/з BJDebugMsg передать разный текст разным игрокам?
Ред. host_pi
» WarCraft 3 / как сделать 3 разных действия с одной периодичностью по таймеру?
у nazarpunk алгоритмика хорошая и рабочая
вот что получилось для 4х игроков на таймерах:
(из них у 1го игрока идёт общий подсчёт действий, у остальных без подсчёта)
ты загнал таймер сразу в Start_init
хотя эта функция вообще за чат отвечает, как и Start
т.е. до твоей правки они были универсальны, а после твоей правки стали бесполезно-громоздки, т.к. получился отдельный большой тригер-чата исключительно под таймер
+ если я правильно прочитал твой код в Start_init - то при старте карты у тебя включится таймер в бэк режиме, оттягивая на себя ресурсы просто так
+ у нас с панком команда из чата работает как вкл/выкл, как и было заявлено в первом посте. а у тебя получается она является стартующей. т.е. она только вкл
+ дебаг:
:39: Index missing for array variable TIME
:40: Index missing for array variable TIME
надо заменить
"timer array TIME" на "timer TIME=null" - для 1го кода
или оставить "timer array TIME" - для 2го кода
каждый 1 тик работает 12 раз (по количеству плееров)
т.е. если 1й игрок пишет -g то за 1 тик выдает 12 строк
видимо потому что в Start_init ты 12 раз запускаешь 12 таймеров т.е. 12 функций OnPeriodic за 1 тик
попробуй сам на карте
Ред. host_pi
» WarCraft 3 / Депротект (знаю заеженная тема)
или ты про воровство скопированных битов? своровать можно только физический оригинал и обладатель оригинала ОБЕДНЕЕТ на то количество штук, сколько ты своровал. а скопированные биты ты никак не можешь своровать. т.к. после копирования - это лично твоя копия и принадлежит тебе
или ты думаешь движок сайта xgm тоже с нуля писан и не задействует никаких сторонних библиотек?
а товарищ майор когда свою коробку СОРМ-2 и СОРМ-3 подключает между провайдером и тобой - он кто? вор или блюститель порядка?
Ред. host_pi
» WarCraft 3 / как сделать 3 разных действия с одной периодичностью по таймеру?
как доделаю на тригерах - в один пост запощу оба варианта своего решения
Ред. host_pi
» WarCraft 3 / как сделать 3 разных действия с одной периодичностью по таймеру?
Ред. host_pi
» WarCraft 3 / как сделать 3 разных действия с одной периодичностью по таймеру?
каждый новый игрок включивший таймер ускоряет тик у каждого включившего.
т.е. если 3 игрока запустят таймер - то у всех из них тик будет чаще в 3 раза
т.е Spell_1 Spell_2 Spell_3 + OnPeriodic_1 OnPeriodic_2 OnPeriodic_3
бред конечно, что нельзя в таймерную функцию передавать переменные. кто-то запустил функцию по таймеру, а кто? да хз кто, тикает и ладно
Ред. host_pi
» WarCraft 3 / как сделать 3 разных действия с одной периодичностью по таймеру?
или таймер такого не может - поэтому надо перебором всех плееров?
Ред. host_pi
» WarCraft 3 / как сделать 3 разных действия с одной периодичностью по таймеру?
» WarCraft 3 / Как вставить карту в другую карту?
Ред. host_pi
» WarCraft 3 / как присвоить локальные значения игрока в глобальные переменные?
ты сам пробовал хоть раз написать -создатьюнита +25724 -15876 ? попробуй
а потом попробуй 10 раз для разных координат написать
может потом ты поймешь смысол этой темы уже
Ред. host_pi
» WarCraft 3 / как присвоить локальные значения игрока в глобальные переменные?
» WarCraft 3 / Good Jassspy (JASS логер)
https://www.xgm.guru/p/wc3/spy-jass
Ред. host_pi
» WarCraft 3 / как присвоить локальные значения игрока в глобальные переменные?
quq_CCCP:
и инпут лаг как раз 0.2 сек
похоже на первое решение в этой теме, точно покурю
только видимо размер кода очень большой на всё это, измеряется сотнями строк