Нужна переменная на последний индекс "МАХ".
Юнит умирает
Если в отряде количество юнитов <= 0
Units[МАХ] = Units[индекс умершего]
МАХ = МАХ - 1
Когда добавляеш, увеличиваешь МАХ + 1 і Units ставь индекс МАХ
через 5 секунд у каждого будет по 3 тика, чего не может быть т.к. для трех тиков нужно 15 секунд
Не то условие добавил
Через цикл все з таймером
globals
constant integer MAX_PLAYER = 12
timer array TimerStartAction [MAX_PLAYER]
integer array AnyAction[MAX_PLAYER]
endglobals
function StartAction takes nothing returns nothing
local integer l = 0
loop
exitwhen l >= MAX_PLAYER
if TimerStartAction[l] == GetExpiredTimer() then
if AnyAction[l] == 1 then
call DisplayTimedTextToPlayer(Player(l),0,0,20,"Start any action 1. Start this action by player #"+I2S(l+1))
elseif AnyAction[l] == 2 then
call DisplayTimedTextToPlayer(Player(l),0,0,20,"Start any action 2. Start this action by player #"+I2S(l+1))
elseif AnyAction[l] == 3 then
call DisplayTimedTextToPlayer(Player(l),0,0,20,"Start any action 3. Start this action by player #"+I2S(l+1))
set AnyAction[l] = 0
call PauseTimer(TimerStartAction[l])
endif
set AnyAction[l] = AnyAction[l] + 1
endif
set l = l + 1
endloop
endfunction
function EnterChatMessage takes nothing returns nothing
local integer pId = GetPlayerId(GetTriggerPlayer())
call TimerStart(TimerStartAction[pId], 5, true, function StartAction)
set AnyAction[pId] = 1
endfunction
//===========================================================================
function InitTrig_Loop takes nothing returns nothing
local integer i = 0
set gg_trg_Loop = CreateTrigger()
loop
exitwhen i >= MAX_PLAYER
call TriggerRegisterPlayerChatEvent( gg_trg_Loop, Player(i), "go", true )
set TimerStartAction[i] = CreateTimer()
set i = i + 1
endloop
call TriggerAddAction(gg_trg_Loop, function EnterChatMessage )
endfunction
Нужен триггер с названием Loop или создать свой триггер MAX_PLAYER - Просто константа, вJNGP Rebuildтак можно, ошибок не будет
Через call TriggerSleepAction(2) можно, но для сети не рекомендуется. Почитаешь какие последствия могут быть. Для одного игрока тебе будет идеальный вариант
Я там описал смысл передачи, думал условия уже построиш для своей задачи.
Три варианта
Через цикл всем по таймеру
globals
constant integer MAX_PLAYER = 12
timer array TimerStartAction [MAX_PLAYER]
integer array AnyAction[MAX_PLAYER]
endglobals
function StartAction takes nothing returns nothing
local integer l = 0
loop
exitwhen l >= MAX_PLAYER
if AnyAction[l] > 0 and AnyAction[l] < 4 then
if AnyAction[l] == 1 then
call DisplayTimedTextToPlayer(Player(l),0,0,20,"Start any action 1. Start this action by player #"+I2S(l+1))
elseif AnyAction[l] == 2 then
call DisplayTimedTextToPlayer(Player(l),0,0,20,"Start any action 2. Start this action by player #"+I2S(l+1))
elseif AnyAction[l] == 3 then
call DisplayTimedTextToPlayer(Player(l),0,0,20,"Start any action 3. Start this action by player #"+I2S(l+1))
endif
set AnyAction[l] = AnyAction[l] + 1
else
set AnyAction[l] = 0
call PauseTimer(TimerStartAction[l])
endif
set l = l + 1
endloop
endfunction
function EnterChatMessage takes nothing returns nothing
local integer pId = GetPlayerId(GetTriggerPlayer())
call TimerStart(TimerStartAction[pId], 0.3, true, function StartAction)
set AnyAction[pId] = 1
endfunction
//===========================================================================
function InitTrig_Loop takes nothing returns nothing
local integer i = 0
set gg_trg_Loop = CreateTrigger()
loop
exitwhen i >= MAX_PLAYER
call TriggerRegisterPlayerChatEvent( gg_trg_Loop, Player(i), "go", true )
set TimerStartAction[i] = CreateTimer()
set i = i + 1
endloop
call TriggerAddAction(gg_trg_Loop, function EnterChatMessage )
endfunction
Через цикл один таймер
globals
constant integer MAX_PLAYER1 = 12
timer TimerStartAction1 = CreateTimer()
real array PlayerTimeExpiered[MAX_PLAYER1]
endglobals
function StartAction1 takes nothing returns nothing
local integer l = 0
loop
exitwhen l >= MAX_PLAYER1
if PlayerTimeExpiered[l] >= 0 and PlayerTimeExpiered[l] < 4 then
if PlayerTimeExpiered[l] == 1 then
call DisplayTimedTextToPlayer(Player(l),0,0,20,"Start any action 1. Start this action by player #"+I2S(l+1))
elseif PlayerTimeExpiered[l] == 2 then
call DisplayTimedTextToPlayer(Player(l),0,0,20,"Start any action 2. Start this action by player #"+I2S(l+1))
elseif PlayerTimeExpiered[l] == 3 then
call DisplayTimedTextToPlayer(Player(l),0,0,20,"Start any action 3. Start this action by player #"+I2S(l+1))
endif
set PlayerTimeExpiered[l] = PlayerTimeExpiered[l] + 1 //1 = one tick of timer = 0.3 sec
endif
set l = l + 1
endloop
endfunction
function EnterChatMessage1 takes nothing returns nothing
set PlayerTimeExpiered[GetPlayerId(GetTriggerPlayer())] = 0
endfunction
//===========================================================================
function InitTrig_StaticTimer takes nothing returns nothing
local integer i = 0
set gg_trg_StaticTimer = CreateTrigger()
loop
exitwhen i >= MAX_PLAYER1
call TriggerRegisterPlayerChatEvent( gg_trg_StaticTimer, Player(i), "go", true )
set PlayerTimeExpiered[i] = -1
set i = i + 1
endloop
call TriggerAddAction(gg_trg_StaticTimer, function EnterChatMessage1 )
call TimerStart( TimerStartAction1, 0.3, true, function StartAction1)
endfunction
Через хеш
globals
constant integer MAX_PLAYER2 = 12
timer array TimerStartAction2[MAX_PLAYER2]
integer array ActionID[MAX_PLAYER2]
hashtable htb = InitHashtable()
endglobals
function StartAction2 takes nothing returns nothing
local integer l = 0
local integer pId = LoadInteger(htb, GetHandleId(GetExpiredTimer()), StringHash("StartAction2"))
if ActionID[pId] == 1 then
call DisplayTimedTextToPlayer(Player(l),0,0,20,"Start any action 1. Start this action by player #"+I2S(l+1))
elseif ActionID[pId] == 2 then
call DisplayTimedTextToPlayer(Player(l),0,0,20,"Start any action 2. Start this action by player #"+I2S(l+1))
elseif ActionID[pId] == 3 then
call DisplayTimedTextToPlayer(Player(l),0,0,20,"Start any action 3. Start this action by player #"+I2S(l+1))
call PauseTimer(GetExpiredTimer())
endif
set ActionID[pId] = ActionID[pId] + 1
endfunction
function EnterChatMessage2 takes nothing returns nothing
local integer pId = GetPlayerId(GetTriggerPlayer())
set ActionID[pId] = 1
call SaveInteger(htb, GetHandleId(TimerStartAction2[pId]), StringHash("StartAction2"), pId)
call TimerStart(TimerStartAction2[pId], 0.3, true, function StartAction2)
endfunction
//===========================================================================
function InitTrig_SaveHandle takes nothing returns nothing
local integer i = 0
set gg_trg_SaveHandle = CreateTrigger()
loop
exitwhen i >= MAX_PLAYER2
call TriggerRegisterPlayerChatEvent( gg_trg_SaveHandle, Player(i), "go", true )
set TimerStartAction2[i] = CreateTimer()
set i = i + 1
endloop
call TriggerAddAction(gg_trg_SaveHandle, function EnterChatMessage2 )
endfunction
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
call BJDebugMsg("timer i "+I2S(i)+"__GO[i] "+I2S(GO[i])+"__N [i] "+I2S(N[i])+"__Name "+GetPlayerName(Player(i-1)))
set GO[i] = 0
endif
set i = i + 1
endloop
endfunction
function Start takes nothing returns nothing
local string s=StringCase(GetEventPlayerChatString(),false)
local integer i=GetPlayerId(GetTriggerPlayer())+1
if s=="-g" then
set GO[i] = 1
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)
call TriggerAddAction(t, function Start)
set i=i+1
endloop
set TIME = CreateTimer()
call TimerStart(TIME, 0.3, true, function OnPeriodic)
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)
call TriggerAddAction(t, function Start)
set TIME[i] = CreateTimer()
call TimerStart(TIME[i], 0.3, true, function OnPeriodic)
set i=i+1
endloop
endfunction
Можно один таймер для всех, а когда таймер истекает, то циклом проверять всех игроков и в зависимости переменной записаной на игрока выполнять действия
Или сохранять значение в хеш по id таймера
host_pi, Ну ты и душнила ))
Просто возьми друга, и протести создание юнита в центре камеры, с вероятностю в 98% десинхрона не будет(2% на то, что не понял тебя). Но не проверяй значение переменных, а именно функцию в целом.
anton1623, Еще можно при касте способности, записать в переменную точку сундука и кастера. Потом запустить периодический таймер в котором сверяешь дистанцию между точками и если больше установленой то паузишь таймер и прячешь сундук
LosKalmaros, Можно сделать блок камеры в центре области, а при нажатии влево(вправо) юниты будут смещатся в сторону за пределы камеры.
Прм: Если игрок нажал влево, тогда создается герой справа от камеры. Центрального героя плавно двигаеш влево и удаляешь, а созданого справа двигаеш в центр.
Наработок не встречал, но система довольно простая
Два триггера при постройке здания с проверкой и также после уничтожения. Действие установить игроку значение ресурсов - дерево - (математика) текущее значение дерева +(-при уничтожении) 1000
вообще говоря, почему-то варкрафт для окна TestDialog при повторном создании такого же - не заменяет его вместо ранее созданного, а добавляет новое. т.е. на одной переменной TestDialog висят много окон. в этом и суть вопроса
Систама внутри создает окно. Но тебе нужно сохранить окно в переменную(тумбочку), чтоб потом дать програме понять в какой переменной(тумбочке) хранится твое окно. А у тебя одна переменная(тумбочка) на все окна. И когда ты создаешь новое окно и кладешь в переменную(тумбочку) то програма выбросит старое окно потому чтот новое не поместится.
host_pi, Ты хочешь приготовить яишницу не добавляя яйца. Добавлю еще вариант с добавлением в код выше "мы тут," не изменением.
globals
timer t = CreateTimer()
timerdialog TestDialog = null
timerdialog TestDialogArr array [3]
endglobals
TimerStart(t,60,false,null)
set TestDialog=CreateTimerDialogBJ(t,"Time")
set TestDialogArr[0] = TestDialog
set TestDialog=CreateTimerDialogBJ(t,"Time")
set TestDialogArr[1] = TestDialog
set TestDialog=CreateTimerDialogBJ(t,"Time")
set TestDialogArr[2] = TestDialog
// мы тут
call DestroyTimerDialog(TestDialogArr[0])
call DestroyTimerDialog(TestDialogArr[1])
call DestroyTimerDialog(TestDialogArr[2])
host_pi, Используй массив как уже и сказал. Дело в том что глобальная переменная перезаписивается. Для каждого окошка должна быть своя переменная
globals
timerdialog TestDialog array [3]
endglobals
set TestDialog[0]=CreateTimerDialogBJ(t,"Time")
set TestDialog[1]=CreateTimerDialogBJ(t,"Time")
set TestDialog[2]=CreateTimerDialogBJ(t,"Time")
// мы тут
call DestroyTimerDialog(TestDialog[0])
call DestroyTimerDialog(TestDialog[1])
call DestroyTimerDialog(TestDialog[2])
2.1 Тебе нужен массив и каждий записать в пустую ячейку
globals
timerdialog tDialog array [20] //- 20 макс количество таймеров
endglobals
// Записать новый таймер диалог
local integer i = 0
loop
exitwhen 20 >= i
if tDialog[i] == null then
tDialog[i] = new CreateDialog()
exithen true
endif
set i = i + 1
endloop
// Удалить таймер диалоги
local integer i = 0
loop
exitwhen 20 >= i
if tDialog[i] != null then
tDialog[i] = DestroyDialog()
endif
set i = i + 1
endloop
endif
3.1 Помню читал, что в редких случаях если не запаузить таймер, игра может вызвать внутрисистемную ошибку. Мне не повезло с такой ошибкой встретится, но на всякий также на паузу ставил
Способ чтоб пасивку не было видно. Пассивную засунуть в предметную способность "книга заклинаний" и заблокировать книгу и пасивку для игрока при изучении активной и ее добавлении юниту. После, при активации разблокировать пасивку и зблокировать в конце таймера
В категории "unit" есть команда схожая на SetUnitDataValue(точное не помню). Там можно задать число которое будет привязано к юниту, а потом с помощью глобальной массива ссылатся на GetUnitDataValue
Ред. Borodach
» WarCraft 3 / Некорректно срабатывает триггер
» WarCraft 3 / Помогите с библиотеками
Юнит умирает
Если в отряде количество юнитов <= 0
Units[МАХ] = Units[индекс умершего]
МАХ = МАХ - 1
Когда добавляеш, увеличиваешь МАХ + 1 і Units ставь индекс МАХ
» WarCraft 3 / Обьеденить триггеры
» WarCraft 3 / Лаг при герое
» WarCraft 3 / Вылет из игры при постройке магазина
Ред. Borodach
» WarCraft 3 / как сделать 3 разных действия с одной периодичностью по таймеру?
MAX_PLAYER - Просто константа, в JNGP Rebuild так можно, ошибок не будет
Ред. Borodach
» WarCraft 3 / как сделать 3 разных действия с одной периодичностью по таймеру?
Три варианта
Ред. Borodach
» WarCraft 3 / как сделать 3 разных действия с одной периодичностью по таймеру?
» WarCraft 3 / как сделать 3 разных действия с одной периодичностью по таймеру?
Или сохранять значение в хеш по id таймера
» WarCraft 3 / как сделать 3 разных действия с одной периодичностью по таймеру?
» WarCraft 3 / как присвоить локальные значения игрока в глобальные переменные?
Просто возьми друга, и протести создание юнита в центре камеры, с вероятностю в 98% десинхрона не будет(2% на то, что не понял тебя). Но не проверяй значение переменных, а именно функцию в целом.
» WarCraft 3 / Уменьшение урона юнита при атаке
» WarCraft 3 / Как сделать чтобы статистика игрока сохранялась. Если можно
» WarCraft 3 / Призываемый сундук
» WarCraft 3 / Выбор героя
Прм: Если игрок нажал влево, тогда создается герой справа от камеры. Центрального героя плавно двигаеш влево и удаляешь, а созданого справа двигаеш в центр.
Наработок не встречал, но система довольно простая
Ред. Borodach
» WarCraft 3 / Помогите реализовать альтернативную систему добычи ресурсов
» WarCraft 3 / как уничтожить все таймер-диалоги timerdialog ?
» WarCraft 3 / как уничтожить все таймер-диалоги timerdialog ?
Ред. Borodach
» WarCraft 3 / как уничтожить все таймер-диалоги timerdialog ?
Ред. Borodach
» WarCraft 3 / как уничтожить все таймер-диалоги timerdialog ?
Ред. Borodach
» WarCraft 3 / Утечки?
Ред. Borodach
» WarCraft 3 / Помогите реализовать новую систему найма войск
» WarCraft 3 / Способность фуры из Доты
» WarCraft 3 / Как сделать пассивную способность активной?
» WarCraft 3 / Количество убийств юнита