Код Карты
//!===================================================================================
//                   (Код Карты) 
//!===================================================================================
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

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

хендл - это целое число в хэш таблице варика(ид объекта)
хэндл в данном случае это номер ячейки памяти
хэштейблы тут вообще не причём
в варике реализовано нечто наподобие сборки мусора для хэндллов
если хэндл используется(занесён в переменную) то память не помечается как свободная
по коду
используй таймеры вместо триггеров
лучше использовать стек вместо хэштейбла
0
5
9 лет назад
0
локалки должны объявляться в начале кода а не в середине или в конце, иначе может вообще каша возникнуть. не юзай EVENT_WIDGET_DEATH
если тебе нужно юнита отловить. если итем или еще что, то да, норм, но если юнита, то юзай для юнита именно событие, оно быстрее соображает.
call UnitApplyTimedLife(d, 'BTLF', 2.50) не удаляет юнита из игры. эта функция вообще не удаляет юнита и он остается висеть гдето в памяти.
вообще с динамическими триггерами будь осторожнее, если ими не управлять должным образом то проблемы возникнуть могут.
0
25
9 лет назад
0
call UnitApplyTimedLife(d, 'BTLF', 2.50) не удаляет юнита из игры. эта функция вообще не удаляет юнита и он остается висеть гдето в памяти.
Что ты черт побери несешь? Эта функция очень даже хорошо удаляет юнитов из игры, другое дело что юнит должен быть не воскрешаемым.
0
28
9 лет назад
0
pusha1999, пруф?
0
5
9 лет назад
0
хендлы смотри. думаю сам знаешь как выводить хендлы в текст. и увидишь
0
25
9 лет назад
0
pusha1999, это все потому что локалки нужно вычищать, а не забывать о их существовании...
0
5
9 лет назад
0
Ancient, и ты мне написал что я не понимаю про поточность в варике....причем тут локалки вычищать и хендлы...вообще разные понятия. чувак. не позорился бы. хендл - это целое число в хэш таблице варика(ид объекта) а переменная хендла не может иметь потомучто это просто ссылка на объект, локальная она или нет. и да, я локалки обнулять никогда не забываю.
0
28
9 лет назад
Отредактирован nvc123
0
хендл - это целое число в хэш таблице варика(ид объекта)
хэндл в данном случае это номер ячейки памяти
хэштейблы тут вообще не причём
в варике реализовано нечто наподобие сборки мусора для хэндллов
если хэндл используется(занесён в переменную) то память не помечается как свободная
по коду
используй таймеры вместо триггеров
лучше использовать стек вместо хэштейбла
Принятый ответ
0
29
9 лет назад
0
Nickol,
не надо использовать локальные триггеры
Чтобы оставить комментарий, пожалуйста, войдите на сайт.