Вообщем триггер двигает кастера к точке издания способности, не получается сделать так что бы юнит проходя по деревьям ломал их а не просто игнорировал, а также не мог проходить через иные препятствия в виде гор или любых препятствий кроме деревьев(деревья ломал).
Триггер:
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 или проверку предметом
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Триггер:
function Trig_Charge_Actions2 takes nothing returns nothing
call KillDestructable(GetFilterDestructable())
endfunction
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
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 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
return GetSpellAbilityId() == 'A025' Равкод абилки
endfunction
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