Код Карты
//!===================================================================================
// (Код Карты)
//!===================================================================================
function DT takes trigger t returns nothing
call FlushChildHashtable(udg_H,GetHandleId(t))
call DestroyTrigger(t)
set t = null
endfunction
function TriggerInitAll takes trigger trig, playerunitevent whichEvent returns nothing
local integer i
set i = 0
loop
call TriggerRegisterPlayerUnitEvent(trig, Player(i), whichEvent, null)
set i = i + 1
exitwhen i == bj_MAX_PLAYER_SLOTS
endloop
set trig = null
set whichEvent = null
endfunction
Сам триггер
//!===================================================================================
// (Сам триггер)
//!===================================================================================
function ShadowCondition takes nothing returns boolean
local trigger TZ = GetTriggeringTrigger()
local unit u = LoadUnitHandle(udg_H,GetHandleId(TZ),1)
if GetTriggerEventId()==EVENT_WIDGET_DEATH then
if GetTriggerUnit()== u then
call UnitRemoveBuffBJ( 'Binv', u )
call DT(TZ)
endif
endif
if GetTriggerEventId()==EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER then
if GetTriggerUnit()== u then
call UnitRemoveBuffBJ( 'Binv', u )
call DT(TZ)
endif
endif
if GetTriggerEventId()==EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER then
if GetTriggerUnit()== u then
call UnitRemoveBuffBJ( 'Binv', u )
call DT(TZ)
endif
endif
if GetTriggerEventId()==EVENT_PLAYER_UNIT_ATTACKED then
if GetTriggerUnit()== u then
call UnitRemoveBuffBJ( 'Binv', u )
call DT(TZ)
endif
endif
set u = null
return false
endfunction
function ShadowScroll takes unit u,real time returns nothing
local trigger TU = CreateTrigger()
call TriggerRegisterTimerEvent(TU,time,false)
call TriggerRegisterPlayerUnitEvent(TU,GetOwningPlayer(u),EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER, null)
call TriggerRegisterPlayerUnitEvent(TU,GetOwningPlayer(u),EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER, null)
call TriggerRegisterPlayerUnitEvent(TU,GetOwningPlayer(u),EVENT_PLAYER_UNIT_ATTACKED, null)
call TriggerRegisterUnitEvent(TU,u,EVENT_UNIT_DEATH )
call TriggerAddCondition(TU,Condition(function ShadowCondition))
local effect e = AddSpecialEffectTarget("Abilities\\Spells\\Undead\\DeathandDecay\\DeathandDecayTarget.mdl",u,"chest")
local effect e2 = AddSpecialEffectTarget("Abilities\\Spells\\Undead\\DeathandDecay\\DeathandDecayTarget.mdl",u,"hand left")
local effect e3 = AddSpecialEffectTarget("Abilities\\Spells\\Undead\\DeathandDecay\\DeathandDecayTarget.mdl",u,"hand left")
local unit d = CreateUnit(GetOwningPlayer(u),'udes',GetUnitX(u), GetUnitY(u), 0)
call IssueImmediateOrder( u, "holdposition" )
call UnitAddAbility(d,'Aivs')
call UnitApplyTimedLife(d, 'BTLF', 2.50)
call IssueTargetOrder(d,"invisibility",u)
call SaveUnitHandle(udg_H,GetHandleId(TU),1,u)
call DestroyEffect(e)
call DestroyEffect(e2)
call DestroyEffect(e3)
set e = null
set e2 = null
set e3 = null
set d = null
set TU = null
endfunction
//!===============================================================================================================================
//
//!===============================================================================================================================
function Trig_ShadowAmulet_Actions takes nothing returns nothing
local unit a = GetSpellAbilityUnit()
if GetSpellAbilityId() == 'ANcl' then
call ShadowScroll(a,1)
endif
set a = null
endfunction
//===========================================================================
function InitTrig_ShadowAmulet takes nothing returns nothing
local trigger ShadowAmmulet = CreateTrigger( )
call TriggerInitAll(ShadowAmmulet, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddAction(ShadowAmmulet, function Trig_ShadowAmulet_Actions )
set ShadowAmmulet = null
endfunction
Принятый ответ
хендл - это целое число в хэш таблице варика(ид объекта)
хэндл в данном случае это номер ячейки памяти
хэштейблы тут вообще не причём
в варике реализовано нечто наподобие сборки мусора для хэндллов
если хэндл используется(занесён в переменную) то память не помечается как свободная
по коду
используй таймеры вместо триггеров
лучше использовать стек вместо хэштейбла
хэштейблы тут вообще не причём
в варике реализовано нечто наподобие сборки мусора для хэндллов
если хэндл используется(занесён в переменную) то память не помечается как свободная
по коду
используй таймеры вместо триггеров
лучше использовать стек вместо хэштейбла
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
если тебе нужно юнита отловить. если итем или еще что, то да, норм, но если юнита, то юзай для юнита именно событие, оно быстрее соображает.
call UnitApplyTimedLife(d, 'BTLF', 2.50) не удаляет юнита из игры. эта функция вообще не удаляет юнита и он остается висеть гдето в памяти.
вообще с динамическими триггерами будь осторожнее, если ими не управлять должным образом то проблемы возникнуть могут.
Отредактирован nvc123
хэштейблы тут вообще не причём
в варике реализовано нечто наподобие сборки мусора для хэндллов
если хэндл используется(занесён в переменную) то память не помечается как свободная
по коду
используй таймеры вместо триггеров
лучше использовать стек вместо хэштейбла
не надо использовать локальные триггеры