18

» WarCraft 3 / Некорректно срабатывает триггер

Перед тем как нанести урон отключай тригер gg_trg_Retrebiution, после включай его
18

» WarCraft 3 / Помогите с библиотеками

Нужна переменная на последний индекс "МАХ".
Юнит умирает
Если в отряде количество юнитов <= 0
Units[МАХ] = Units[индекс умершего]
МАХ = МАХ - 1
Когда добавляеш, увеличиваешь МАХ + 1 і Units ставь индекс МАХ
18

» WarCraft 3 / Лаг при герое

Уменьшить количество уровней способности, либо добавить все способности даммику и на старте его создать
18

» WarCraft 3 / Вылет из игры при постройке магазина

Есть подозрение, что проблема может быть в предмете который в магазин добавляешь. Попробуй те предметы по одному добавить
18

» WarCraft 3 / как сделать 3 разных действия с одной периодичностью по таймеру?

через 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) можно, но для сети не рекомендуется. Почитаешь какие последствия могут быть. Для одного игрока тебе будет идеальный вариант
18

» WarCraft 3 / как сделать 3 разных действия с одной периодичностью по таймеру?

Я там описал смысл передачи, думал условия уже построиш для своей задачи.
Три варианта
Через цикл всем по таймеру
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
18

» WarCraft 3 / как сделать 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
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
18

» WarCraft 3 / как сделать 3 разных действия с одной периодичностью по таймеру?

Можно один таймер для всех, а когда таймер истекает, то циклом проверять всех игроков и в зависимости переменной записаной на игрока выполнять действия
Или сохранять значение в хеш по id таймера
18

» WarCraft 3 / как присвоить локальные значения игрока в глобальные переменные?

host_pi, Ну ты и душнила ))
Просто возьми друга, и протести создание юнита в центре камеры, с вероятностю в 98% десинхрона не будет(2% на то, что не понял тебя). Но не проверяй значение переменных, а именно функцию в целом.
18

» WarCraft 3 / Призываемый сундук

anton1623, Еще можно при касте способности, записать в переменную точку сундука и кастера. Потом запустить периодический таймер в котором сверяешь дистанцию между точками и если больше установленой то паузишь таймер и прячешь сундук
18

» WarCraft 3 / Выбор героя

LosKalmaros, Можно сделать блок камеры в центре области, а при нажатии влево(вправо) юниты будут смещатся в сторону за пределы камеры.
Прм: Если игрок нажал влево, тогда создается герой справа от камеры. Центрального героя плавно двигаеш влево и удаляешь, а созданого справа двигаеш в центр.
Наработок не встречал, но система довольно простая
18

» WarCraft 3 / Помогите реализовать альтернативную систему добычи ресурсов

Два триггера при постройке здания с проверкой и также после уничтожения. Действие установить игроку значение ресурсов - дерево - (математика) текущее значение дерева +(-при уничтожении) 1000
18

» WarCraft 3 / как уничтожить все таймер-диалоги timerdialog ?

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

» WarCraft 3 / как уничтожить все таймер-диалоги timerdialog ?

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])
18

» WarCraft 3 / как уничтожить все таймер-диалоги timerdialog ?

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])
18

» WarCraft 3 / как уничтожить все таймер-диалоги timerdialog ?

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 Помню читал, что в редких случаях если не запаузить таймер, игра может вызвать внутрисистемную ошибку. Мне не повезло с такой ошибкой встретится, но на всякий также на паузу ставил
18

» WarCraft 3 / Помогите реализовать новую систему найма войск

Способность в Альянсе, кажется називаеться Ополчение, попробуй ей поставить таймер в 0.
18

» WarCraft 3 / Способность фуры из Доты

Хештаблица тебе поможет решить дилему, сдесь есть статьи как ею пользоватся.
18

» WarCraft 3 / Как сделать пассивную способность активной?

Способ чтоб пасивку не было видно. Пассивную засунуть в предметную способность "книга заклинаний" и заблокировать книгу и пасивку для игрока при изучении активной и ее добавлении юниту. После, при активации разблокировать пасивку и зблокировать в конце таймера
18

» WarCraft 3 / Количество убийств юнита

В категории "unit" есть команда схожая на SetUnitDataValue(точное не помню). Там можно задать число которое будет привязано к юниту, а потом с помощью глобальной массива ссылатся на GetUnitDataValue