Добавлен kg_toly
globals
unit missle
real magX
real magY
real tarX
real tarY
endglobals
function Trig_Froze_Conditions takes nothing returns boolean
if GetSpellAbilityId() == 'A000' then
return true
endif
return false
endfunction
function Check takes nothing returns boolean
return GetBooleanAnd( IsUnitAliveBJ(GetFilterUnit()), GetOwningPlayer(GetFilterUnit()) != GetOwningPlayer(missle) )
endfunction
function CheckActions takes nothing returns nothing
local unit picked = GetEnumUnit()
SetUnitLifeBJ( picked, ( GetUnitStateSwap(UNIT_STATE_LIFE, picked) - 250.00 ) )
SetUnitLifePercentBJ( picked, ( GetUnitLifePercent(picked) - 5.00 ) )
AddSpecialEffect( "Abilities\\Spells\\Undead\\FrostNova\\FrostNovaTarget.mdl", GetUnitX(picked), GetUnitY(picked) )
DestroyEffect(GetLastCreatedEffectBJ())
set picked = null
endfunction
function Move takes nothing returns nothing
local real vecX = ( tarX - magX ) / ((SquareRoot((tarX-magX) * (tarX-magX) + (tarY-magY) * (tarY-magY)) ) / 2 )
local real vecY = ( tarY - magY ) / ((SquareRoot((tarX-magX) * (tarX-magX) + (tarY-magY) * (tarY-magY)) ) / 2 )
local real misX = GetUnitX(missle)
local real misY = GetUnitY(missle)
local group g = CreateGroup()
call GroupEnumUnitsInRange( g, misX, misY, 150, Condition(function Check) )
local group check = g
SetUnitX(missle, misX + vecX)
SetUnitY(missle, misY + vecY)
if SquareRoot((tarX-misX) * (tarX-misX) + (tarY-misY) * (tarY-misY)) < 100 then
DestroyTimer(GetExpiredTimer())
RemoveUnit(missle)
ForGroup( check, function CheckActions )
endif
DestroyGroup(g)
DestroyGroup(check)
set g = null
set check = null
endfunction
function Trig_Froze_Actions takes nothing returns nothing
local unit mage = GetSpellAbilityUnit()
local unit target = GetSpellTargetUnit()
local timer t = CreateTimer()
// RemoveUnit(missle)
// set missle = null
set magX = GetUnitX(mage)
set magY = GetUnitY(mage)
set tarX = GetUnitX(target)
set tarY = GetUnitY(target)
set missle = CreateUnit( GetOwningPlayer( mage ), 'hpea', magX, magY, 270 )
TimerStart( t, 0.01, true, function Move )
set mage = null
set target = null
set t = null
endfunction
//===========================================================================
function InitTrig_Froze takes nothing returns nothing
set gg_trg_Froze = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Froze, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Froze, Condition( function Trig_Froze_Conditions ) )
call TriggerAddAction( gg_trg_Froze, function Trig_Froze_Actions )
endfunction
(Когда я удаляю missle в начале, то юнит не спавнится, по этому я закоментил 2 линии.)
При использовании способности появляется 2-3 хендла и при срабатывании CheckActions 2-4 хендла. Где происходит утечка?
При использовании способности появляется 2-3 хендла и при срабатывании CheckActions 2-4 хендла. Где происходит утечка?
Принятый ответ
у тебя не удаляется последний созданный эффект потому что ты не особо понимаешь основ пока что
AddSpecialEffect( "Abilities\\Spells\\Undead\\FrostNova\\FrostNovaTarget.mdl", GetUnitX(picked), GetUnitY(picked) )
DestroyEffect(GetLastCreatedEffectBJ())
--->
bj_lastCreatedEffect = AddSpecialEffect( "Abilities\\Spells\\Undead\\FrostNova\\FrostNovaTarget.mdl", GetUnitX(picked), GetUnitY(picked) )
DestroyEffect(bj_lastCreatedEffect)
либо же (лучше в твоём случае) --->
DestroyEffect(AddSpecialEffect( "Abilities\\Spells\\Undead\\FrostNova\\FrostNovaTarget.mdl", GetUnitX(picked), GetUnitY(picked) ) )
внутренности GetLastCreatedEffectBJ() следующие
function GetLastCreatedEffectBJ takes nothing returns effect
return bj_lastCreatedEffect
endfunction
т.к. ты не присвоил этой переменной никакое значение (свой созданный эффект), то и удалять игре нечего
вот так выглядит гуишная функция создания эффекта
вот так выглядит гуишная функция создания эффекта
function AddSpecialEffectLocBJ takes location where, string modelName returns effect
set bj_lastCreatedEffect = AddSpecialEffectLoc(modelName, where)
return bj_lastCreatedEffect
endfunction
старайся раскрывать красные (бж) функции доставая нативки (это не всегда необходимо), и улучшай логику своего кода, а-ля
function Trig_Froze_Conditions takes nothing returns boolean
if GetSpellAbilityId() == 'A000' then
return true
endif
return false
endfunction
--->
function Trig_Froze_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A000'
endfunction
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
вот так выглядит гуишная функция создания эффекта
Ред. quq_CCCP
используется так
Функция возвращает триггер, на ID которого мы можем записать остальные данные и получить их в другой функции.
Код тоже не идеален, но вполне удобен, юзаются триггеры вместо таймеров, т.к тут отслеживаются события.
geu = nil zabyl
Ред. PROSHELDOTU
если ты создал handle юнит — героя при старте мапы игроку, то он будет у тебя до конца игры