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

хендл - это целое число в хэш таблице варика(ид объекта)
хэндл в данном случае это номер ячейки памяти
хэштейблы тут вообще не причём
в варике реализовано нечто наподобие сборки мусора для хэндллов
если хэндл используется(занесён в переменную) то память не помечается как свободная
по коду
используй таймеры вместо триггеров
лучше использовать стек вместо хэштейбла
`
ОЖИДАНИЕ РЕКЛАМЫ...

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