Я протестировал на предметах, но результат меня дико огорчил.
Код
native TriggerRegisterDeathEvent takes trigger whichTrigger, widget whichWidget returns event
Это функция вызвалась 4 раза, когда предмет сдыхал.
Теперь к делу: я использовал сравнение виджета с предметом. Путём получения объекта такого предмет через GetTriggerWidget(), оно работает. Но одно но!!!!!!!!!
Стоит одному предмету сдохнуть, сразу срабатывает другое.. Это как понимать?
Оказывается для этого События смерти - Удаление Предмета тоже считается как смерть.
Зачем я делаю такое, что убирать утечки от некоторых предметов типа книг, которые не убираются по донной воле метелей.
Для чего я это сделал такой тест? - ну конечно ради интереса
Код
//?Library NoItemLeaks
scope NoItemLeaks initializer InitFunc
globals
//Items Zone
private constant integer ItemStock_A = 0
private constant integer ItemStock_Max_A = 4045
private constant integer ItemStock_B = 4045
private constant integer ItemStock_Max_B = 8090
private integer ItemStock_I = 0
private item array ItemStock
private item array ItemTempStock
//Triggers Zone
trigger TriggerZone = null
private triggeraction TriggerAct = null
private timer TriggerZoneTimer = null
endglobals
private function RefreshItem takes nothing returns nothing
local integer i = ItemStock_A
local integer max = ItemStock_Max_A
local integer stock = 0
if ItemStock_I != max then
set max = ItemStock_I
endif
loop
exitwhen i == max
if ItemStock[i] != null then
set ItemTempStock[stock] = ItemStock[i]
set stock = stock + 1
endif
set i = i + 1
endloop
set ItemStock_I = stock
loop
exitwhen i == ItemStock_I
if ItemStock[i] != null then
set ItemStock[i] = ItemTempStock[i]
set stock = stock + 1
endif
set i = i + 1
endloop
endfunction
function RegisterItem takes item whichItem returns nothing
if ItemStock_I <= ItemStock_Max_B then
set ItemStock[ItemStock_I] = whichItem
set ItemStock_I = ItemStock_I + 1
else
call RemoveItem(whichItem)
call BJDebugMsg("I don't registly greather items")
endif
endfunction
private function SeekItem takes widget whichItem returns item
local integer i = ItemStock_A
local integer max = ItemStock_Max_A
local boolean b = false
if ItemStock_I < max then
set max = ItemStock_I
endif
loop
exitwhen i == ItemStock_Max_A or b
if whichItem == ItemStock[i] then
set b = true
endif
set i = i + 1
endloop
if not b and ItemStock_I >= ItemStock_B then
set i = ItemStock_B
loop
exitwhen i == ItemStock_I or b
if whichItem == ItemStock[i] then
set b = true
endif
set i = i + 1
endloop
endif
if not b then
return null
endif
return ItemStock[i]
endfunction
private function ItemDeathEvent takes nothing returns nothing
local item t = SeekItem(GetTriggerWidget())
call BJDebugMsg("What?")
if t != null then
call RemoveItem(t)
endif
call RefreshItem()
set t = null
endfunction
private function callduos takes nothing returns nothing
local integer i = ItemStock_A
local integer max = ItemStock_Max_A
call TriggerRemoveAction(TriggerZone,TriggerAct)
call DestroyTrigger(TriggerZone)
set TriggerZone = CreateTrigger()
set TriggerAct = TriggerAddAction(TriggerZone, function ItemDeathEvent)
if ItemStock_I != max then
set max = ItemStock_I
endif
loop
exitwhen i == max
if ItemStock[i] != null then
call TriggerRegisterDeathEvent( TriggerZone, ItemStock[i] )
endif
set i = i + 1
endloop
endfunction
private function InitFunc takes nothing returns nothing
set TriggerZoneTimer = CreateTimer()
set TriggerZone = CreateTrigger()
set TriggerAct = TriggerAddAction(TriggerZone, function ItemDeathEvent)
call TimerStart( TriggerZoneTimer, 300., true, function callduos )
endfunction
endscope
function RegisterItemDeathEvent takes item whichItem returns nothing
call RegisterItem(whichItem)
call TriggerRegisterDeathEvent( TriggerZone, whichItem )
endfunction
Код
scope Test initializer Vexbugallant
private function Vexbugallant takes nothing returns nothing
call RegisterItemDeathEvent( gg_item_tint_0003 )
call RegisterItemDeathEvent( gg_item_manh_0004 )
call RegisterItemDeathEvent( gg_item_tint_0002 )
call RegisterItemDeathEvent( gg_item_manh_0005 )
endfunction
endscope