Работаю над синематиком где есть такая сцена: в героя стреляет стрелок из мушкета, но тот успевает поднять щит и отразить пулю, хотя сам при этом отталкивается на небольшое расстояние от силы выстрела. Как это реализовать на триггерах?

Сделал вариант на гуи, если тебе выше не подходят. Но тут чисто для синематика на одного юнита, просто чтобы ты понял суть

Вот скрины
Русификатор на триггерах!
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...
24
Так-же, как и без синематика - таймер на малом периоде и движение через изменение координат юнита. Подробный ответ на этот вопрос есть в базе статей.
1
prog:
Так-же, как и без синематика - таймер на малом периоде и движение через изменение координат юнита. Подробный ответ на этот вопрос есть в базе статей.
а можно тогда ссылку на статью или скриншот цепочки триггеров? я потому что ничего подобного там не видел
28
О, недавно делал помойные волны, там такой же принцип отталкивания работает
Вот и сама функция
private function move1 takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer i = GetHandleId(t)
    local unit u = LoadUnitHandle(H,i,0)
    local real a = LoadReal(H,i,1)
    local real d = LoadReal(H,i,2)
    local real tm = LoadReal(H,i,3)+0.03
    
    if tm > WaveDiscardingTime then
        call PauseTimer(t)
        call DestroyTimer(t)
        call FlushChildHashtable(H,i)
    else
        call SetUnitX(u,GetUnitX(u)+d*Cos(a))
        call SetUnitY(u,GetUnitY(u)+d*Sin(a))
        call SaveReal(H,i,2,d-(WaveDiscarding/WaveDiscardingTime*0.03))
        call SaveReal(H,i,3,tm)
    endif
    
    set t = null
    set u = null
endfunction
В ячейке 0 - юнит, 1 - угол куда отталкивать, 2 - сила отталкивания (WaveDiscarding), 3 (+0.03) - периодичность истекаемого таймера, чтобы через время остановить отталкивание
Вот формула d-(WaveDiscarding/WaveDiscardingTime*0.03)
WaveDiscarding и WaveDiscardingTime это глобалки, можешь просто сохранить в другие ячейки локальные значения

Upd: но некоторые моменты нужно учесть, у меня этого пока что нет и в итоге юнита может вытолкнуть за границы карты или в непроходимую местность
28
Вот, посмотри

код
scope MySc
globals
define private H = udg_Hash // Название твоей хэш-таблицы

define private AbilityID = 'A000' // ID способности
define private DummyID = 'u000' // ID дамми-юнита

define private Discarding = 5.00 // Сила отбрасывания
define private DiscardingTime = 1.00 // Время отбрасывания
endglobals
//==========================================================================
private function IsUnitDead takes unit u returns boolean
    return IsUnitType(u,UNIT_TYPE_DEAD) or GetUnitTypeId(u) == 0
endfunction

private function move1 takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer i = GetHandleId(t)
    local unit u = LoadUnitHandle(H,i,0)
    local real a = LoadReal(H,i,1)
    local real d = LoadReal(H,i,2)
    local real tm = LoadReal(H,i,3)+0.01
    
    if tm > DiscardingTime or IsUnitDead(u) then
        call PauseTimer(t)
        call DestroyTimer(t)
        call FlushChildHashtable(H,i)
    else
        call SetUnitX(u,GetUnitX(u)+d*Cos(a))
        call SetUnitY(u,GetUnitY(u)+d*Sin(a))
        call SaveReal(H,i,2,d-(Discarding/DiscardingTime*0.01))
        call SaveReal(H,i,3,tm)
    endif
    
    set t = null
    set u = null
endfunction

private function Actions takes nothing returns nothing
    local timer t = CreateTimer()
    local integer i = GetHandleId(t)
    local unit u = GetSpellTargetUnit()
    local unit uu = GetSpellAbilityUnit()
    
    //Создание дамми-щита
    set bj_lastCreatedUnit = CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE),DummyID,GetUnitX(u),GetUnitY(u),Atan2(GetUnitY(uu)-GetUnitY(u),GetUnitX(uu)-GetUnitX(u))*bj_RADTODEG)
    call UnitApplyTimedLife(bj_lastCreatedUnit,'BTLF',1.)
    set bj_lastCreatedUnit = null
    //===================
    
    call SaveUnitHandle(H,i,0,u)
    call SaveReal(H,i,1,Atan2(GetUnitY(u)-GetUnitY(uu),GetUnitX(u)-GetUnitX(uu)))
    call SaveReal(H,i,2,Discarding)
    call TimerStart(t,0.01,true,function move1)
    
    set t = null
    set u = null
    set uu = null
endfunction

//===========================================================================
private function Conditions takes nothing returns boolean
    return GetSpellAbilityId() == AbilityID
endfunction

function InitTrig_Phoenix takes nothing returns nothing
    local trigger t = CreateTrigger()
    local integer index = 0
    loop
        call TriggerRegisterPlayerUnitEvent(t,Player(index),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
        set index = index + 1
        exitwhen index == bj_MAX_PLAYER_SLOTS
    endloop
    call TriggerAddCondition(t,Condition(function Conditions))
    call TriggerAddAction(t,function Actions)
    set t = null
endfunction
endscope
Загруженные файлы
28
Сделал вариант на гуи, если тебе выше не подходят. Но тут чисто для синематика на одного юнита, просто чтобы ты понял суть

Вот скрины
Русификатор на триггерах!
Загруженные файлы
Принятый ответ
1
rsfghd:
Сделал вариант на гуи, если тебе выше не подходят. Но тут чисто для синематика на одного юнита, просто чтобы ты понял суть

Вот скрины
Русификатор на триггерах!
золотой человек, спасибо от души!
Чтобы оставить комментарий, пожалуйста, войдите на сайт.