Вообщем триггер двигает кастера к точке издания способности, не получается сделать так что бы юнит проходя по деревьям ломал их а не просто игнорировал, а также не мог проходить через иные препятствия в виде гор или любых препятствий кроме деревьев(деревья ломал).
Триггер:
function Polet_Actions2 takes nothing returns nothing
    local timer timerAct = GetExpiredTimer()
    local integer id = GetHandleId(timerAct)
    local unit caster = LoadUnitHandle(Hash, id,StringHash("caster"))
    local real process = LoadReal(Hash, id,StringHash("process")) + LoadReal(Hash, id,StringHash("speed"))
    local group groupAct
    local unit u = null
    
    if process > LoadReal(Hash, id, StringHash("distance")) then
        call DestroyGroup(LoadGroupHandle(Hash, id, StringHash("group")))
        call FlushChildHashtable(Hash, id)
        call PauseTimer(timerAct)
        call DestroyTimer(timerAct)
    else
        call SaveReal(Hash, id, StringHash("process"), process)
        call SetUnitX(caster, GetUnitX(caster) + LoadReal(Hash, id, StringHash("speed")) * Cos(LoadReal(Hash, id, StringHash("angle")) * bj_DEGTORAD))
        call SetUnitY(caster, GetUnitY(caster) + LoadReal(Hash, id, StringHash("speed")) * Sin(LoadReal(Hash, id, StringHash("angle")) * bj_DEGTORAD))
        call PauseUnit(caster,true)
        call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Items\\TomeOfRetraining\\TomeOfRetrainingCaster.mdl", GetUnitX(caster),GetUnitY(caster))) 
        set groupAct = CreateGroup()
        call GroupEnumUnitsInRange(groupAct, GetUnitX(caster), GetUnitY(caster), LoadReal(Hash, id, StringHash("aoe")), null)
        loop
            set u = FirstOfGroup(groupAct)
            exitwhen u == null
            if GetWidgetLife(u) > 0.405 and not IsUnitInGroup(u, LoadGroupHandle(Hash, id, StringHash("group"))) then
                if not IsUnitType(u, UNIT_TYPE_MAGIC_IMMUNE) then
                    if IsUnitEnemy(u, GetOwningPlayer(caster)) then
                        call UnitDamageTarget(caster, u, LoadReal(Hash, id, StringHash("damage")), false, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
                        call DestroyEffect(AddSpecialEffectTarget(LoadStr(Hash, id, StringHash("damageEffect")), u, "origin"))
                        call GroupAddUnit(LoadGroupHandle(Hash, id, StringHash("group")), u)
                    endif
                endif
            endif
            call GroupRemoveUnit(groupAct, u)
        endloop
        call PauseUnit(caster,false)
        call DestroyGroup(groupAct)
    endif
    
    set caster = null
    set timerAct = null
    set groupAct = null
endfunction

function Polet_Actions takes nothing returns nothing
    local unit caster = GetTriggerUnit()
    local real xCaster = GetUnitX(caster)
    local real yCaster = GetUnitY(caster)
    local location Point = GetSpellTargetLoc()
    local real xTarget = GetSpellTargetX()
    local real yTarget = GetSpellTargetY()
    local real angle = bj_RADTODEG * Atan2(yTarget - yCaster, xTarget - xCaster)

    local integer level = GetUnitAbilityLevel(caster, 'A06I')
    local real damage = 75 + (25 * level)
    local real aoe = 150
    local real speed = 900
    local real distance = 400 + (level * 200)
    
    local string damageEffect = "Abilities\\Spells\\Orc\\WarStomp\\WarStompCaster.mdl"
    
    local timer timerAct = CreateTimer()
    local integer id = GetHandleId(timerAct)
    
    call SaveUnitHandle(Hash, id, StringHash("caster"), caster)
    
    call SaveReal(Hash, id, StringHash("distance"), distance)
    call SaveReal(Hash, id, StringHash("damage"), damage)
    call SaveReal(Hash, id, StringHash("aoe"), aoe)
    call SaveReal(Hash, id, StringHash("speed"), speed  * 0.03)
    call SaveReal(Hash, id, StringHash("angle"), angle)
    
    call SaveStr(Hash, id, StringHash("damageEffect"), damageEffect)
    
    call SaveReal(Hash, id, StringHash("process"), 0)
    call SaveGroupHandle(Hash, id, StringHash("group"), CreateGroup())
    
    call TimerStart(timerAct, 0.03, true, function Polet_Actions2)
    
    set caster = null
    set timerAct = null
endfunction

function Polet_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A06I' 
endfunction

function InitTrig_Polet takes nothing returns nothing
    set gg_trg_Polet = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Polet, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Polet, Condition( function Polet_Conditions ) )
    call TriggerAddAction( gg_trg_Polet, function Polet_Actions )
endfunction

Принятый ответ

Arlando, проверяя следующую точку, ломаешь деревья и смотришь на проходимость через функцию IsTerrainPathable или проверку предметом
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
13
2 года назад
0
А как ты реализовывал разрушение деревьев? Я у тебя в коде не вижу ничего, что заставило бы ломать деревья. А вообще, так же в функции таймера выбирай деревья в радиусе от юнита
0
1
2 года назад
0
ValdionWorld, Да я вырезал функцию после того как не получилось. Попробую
0
1
2 года назад
0
ValdionWorld, С деревьями вопрос решил а как сделать еще что бы я не мог способностью забираться на более высокие препятствия или за карту перемещаться
1
27
2 года назад
1
Arlando, проверяя следующую точку, ломаешь деревья и смотришь на проходимость через функцию IsTerrainPathable или проверку предметом
Принятый ответ
0
1
2 года назад
0
Крч если кому то нужно будет то вот(да можно было сделать лучше)
Триггер:
function Trig_Charge_Actions2 takes nothing returns nothing
call KillDestructable(GetFilterDestructable())
endfunction
function Charge_Actions1 takes nothing returns nothing
local timer timerAct = GetExpiredTimer()
local integer id = GetHandleId(timerAct)
local unit caster = LoadUnitHandle(Hash, id,StringHash("caster"))
local integer level = GetUnitAbilityLevel(caster, 'A025')
local real process = LoadReal(Hash, id,StringHash("process")) + LoadReal(Hash, id,StringHash("speed"))
local location Point = LoadLocationHandle(Hash, id,StringHash("Point"))
local location casterLoc = GetUnitLoc(caster)
local group groupAct
local unit dummy
local unit u = null
local effect e = LoadEffectHandle(Hash, id,StringHash("e"))

if process > LoadReal(Hash, id, StringHash("distance")) or IsTerrainPathable(GetUnitX(caster) + LoadReal(Hash, id, StringHash("speed")) * Cos(LoadReal(Hash, id, StringHash("angle")) * bj_DEGTORAD),GetUnitY(caster) + LoadReal(Hash, id, StringHash("speed")) * Sin(LoadReal(Hash, id, StringHash("angle")) * bj_DEGTORAD), PATHING_TYPE_PEONHARVESTPATHING) == true then
call DestroyGroup(LoadGroupHandle(Hash, id, StringHash("group")))
call FlushChildHashtable(Hash, id)
call PauseTimer(timerAct)
call DestroyTimer(timerAct)
call DestroyEffect(e)
call PauseUnit(caster,false)
set dummy = CreateUnit(GetOwningPlayer(caster),'h01A',GetUnitX(caster),GetUnitY(caster), bj_UNIT_FACING)
call UnitAddAbility(dummy,'A02A')//Стан
call SetUnitAbilityLevel(dummy,'A02A', level)
call IssueImmediateOrder(dummy,"stomp")
call KillUnit(dummy)
call RemoveUnit(dummy)
else
call SaveReal(Hash, id, StringHash("process"), process)
call SetUnitX(caster, GetUnitX(caster) + LoadReal(Hash, id, StringHash("speed")) * Cos(LoadReal(Hash, id, StringHash("angle")) * bj_DEGTORAD))
call SetUnitY(caster, GetUnitY(caster) + LoadReal(Hash, id, StringHash("speed")) * Sin(LoadReal(Hash, id, StringHash("angle")) * bj_DEGTORAD))
set groupAct = CreateGroup()
call GroupEnumUnitsInRange(groupAct, GetUnitX(caster), GetUnitY(caster), LoadReal(Hash, id, StringHash("aoe")), null)
loop
set u = FirstOfGroup(groupAct)
exitwhen u == null
if GetWidgetLife(u) > 0.405 and not IsUnitInGroup(u, LoadGroupHandle(Hash, id, StringHash("group"))) then
if not IsUnitType(u, UNIT_TYPE_MAGIC_IMMUNE) then
if IsUnitEnemy(u, GetOwningPlayer(caster)) then
call UnitDamageTarget(caster, u, LoadReal(Hash, id, StringHash("damage")), false, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
call GroupAddUnit(LoadGroupHandle(Hash, id, StringHash("group")), u)
endif
endif
endif
call GroupRemoveUnit(groupAct, u)
call EnumDestructablesInCircleBJ( 200.00, Location(GetUnitX(caster), GetUnitY(caster)), function Trig_Charge_Actions2)
endloop
call DestroyGroup(groupAct)
endif
set caster = null
set timerAct = null
set groupAct = null
set dummy = null
endfunction
function Charge_Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local real xCaster = GetUnitX(caster)
local real yCaster = GetUnitY(caster)
local location Point = GetSpellTargetLoc()
local real xTarget = GetSpellTargetX()
local real yTarget = GetSpellTargetY()
local effect e
local real angle = bj_RADTODEG * Atan2(yTarget - yCaster, xTarget - xCaster)
local integer level = GetUnitAbilityLevel(caster, 'A025')
local real damage = 75 + (25 * level) Урон
local real aoe = 125 Аое урона
local real speed = 1000 Скорость
local real distance = 600 + 200 * level Маскимальная дистанция

local timer timerAct = CreateTimer()
local integer id = GetHandleId(timerAct)

call SaveUnitHandle(Hash, id, StringHash("caster"), caster)

call SaveLocationHandle(Hash, id, StringHash("Point"), Point)
call SaveReal(Hash, id, StringHash("distance"), distance)
call SaveReal(Hash, id, StringHash("damage"), damage)
call SaveReal(Hash, id, StringHash("aoe"), aoe)
call SaveReal(Hash, id, StringHash("speed"), speed * 0.03)
call SaveReal(Hash, id, StringHash("angle"), angle)

call SaveReal(Hash, id, StringHash("process"), 0)
call SaveGroupHandle(Hash, id, StringHash("group"), CreateGroup())

set e = AddSpecialEffectTarget("war3mapImported\\Valiant Charge Royal.mdx", caster, "origin")//Эффект
call SaveEffectHandle(Hash,id,StringHash("e"), e)

call PauseUnit(caster,true)
call TimerStart(timerAct, 0.03, true, function Charge_Actions1)

set caster = null
set timerAct = null
endfunction
function Charge_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A025' Равкод абилки
endfunction
function InitTrig_Charge takes nothing returns nothing
set gg_trg_Charge = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ( gg_trg_Charge, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Charge, Condition( function Charge_Conditions ) )
call TriggerAddAction( gg_trg_Charge, function Charge_Actions )
endfunction
Чтобы оставить комментарий, пожалуйста, войдите на сайт.