Вот код, в котором потерялся юнит (Не убирается, дебаг не возвращает ID)
    private function AnimationTimerFollowup takes timerData data returns nothing
        
        call RemoveUnit(data.u)
        call CreateItem('MI00', GetLocationX(data.l), GetLocationY(data.l))    
        set data.u = null
        set data.l = null
        call data.destroy()
    endfunction
До вызова такие объявления:
        local unit u = GetTriggerUnit()
        local player p = GetOwningPlayer(u)
        local location l = GetUnitLoc(u)
        local timer t = NewTimer()
        local timerData animData = timerData.create()
        
        set animData.u = u
        set animData.l = l
И сам вызов функции:
            call SetUnitAnimationReverseFollowed(u, 3, 1, 1, true, FollowUpFunc.AnimationTimerFollowup, animData)
Функция вызывается нормально, так как айтем создается правильно, юнита не трогал между локалками и вызовом. В упор не вижу в чем проблема.
Заранее спасибо.

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

зачем внешние очишаеш структуру?
Порой это нужно.

Замени GetTriggerUnit() на GetSpellAbilityUnit().
ApaxHoqpuJL:
call SetUnitAnimationReverseFollowed(u, 3, 1, 1, true, FollowUpFunc.AnimationTimerFollowup, animData)
А это что такое? Что за FollowUpFunc.AnimationTimerFollowup?
`
ОЖИДАНИЕ РЕКЛАМЫ...
2
26
5 лет назад
2
покажите весь код
0
23
5 лет назад
0
зачем внешние очишаеш структуру? когда есть спец destroy через метод onDestroy и там подчишай что станет легче и так у тя не все показано а лишь линейный код
0
3
5 лет назад
Отредактирован ApaxHoqpuJL
0
scope PackBuilding initializer Init //Packs a building into an item !T; !G
                                    //TODO: Beautify
                                    //GLITCHED: heals fully after packing in; Does not provide the item back if cancelled
                                    //GLITCHED: Upon destruction of the item altar flag does not reset
    globals
        private constant integer SPELL_ID = 'MS00'
    endglobals
    
    private struct timerData //Used by the antiblight and animation timers
        unit u
        location l 
    endstruct
    
    private function RemoveBlightUnit takes nothing returns nothing
        //Kills the antiblight unit
        local timerData data = GetTimerData(GetExpiredTimer())
        
        call ReleaseTimer(GetExpiredTimer())
        call RemoveUnit(data.u)
        set data.u = null
        call data.destroy()
    endfunction
    
    private function AnimationTimerFollowup takes timerData data returns nothing
        
        call RemoveUnit(data.u)
        call CreateItem('MI00', GetLocationX(data.l), GetLocationY(data.l))    
        set data.u = null
        set data.l = null
        call data.destroy()
    endfunction
    
    private function Conditions takes nothing returns boolean
        return (GetSpellAbilityId() == SPELL_ID)
    endfunction
    
    private function Actions takes nothing returns nothing
        local unit u = GetTriggerUnit()
        local player p = GetOwningPlayer(u)
        local location l = GetUnitLoc(u)
        local timer t = NewTimer()
        local timerData blightData = timerData.create()
        local timerData animData = timerData.create()
        local unit blight = (CreateUnit(p, 'spu0', GetLocationX(l), GetLocationY(l), 0))
        
        set animData.u = u
        set animData.l = l 
        
        call TriggerSleepAction(0)

        //Remove the building and create an item at it's location.        
        if GetUnitTypeId(u) == 'm000' then
            call SetUnitAnimationReverseFollowed(u, 3, 1, 1, true, FollowUpFunc.AnimationTimerFollowup, animData)
            
        elseif GetUnitTypeId(u) == 'm001' then
            call RemoveUnit(u)
            call CreateItem('MI01', GetLocationX(l), GetLocationY(l))
            
            //Set the IsInItem flag to prevent multiple altars.
            set playerProperties[GetPlayerId(p)].isAhdesAltarInItem = true
            
        elseif GetUnitTypeId(u) == 'm002' then
            call RemoveUnit(u)
            call CreateItem('MI02', GetLocationX(l), GetLocationY(l))
            
        elseif GetUnitTypeId(u) == 'm003' then
            call RemoveUnit(u)
            call CreateItem('MI03', GetLocationX(l), GetLocationY(l))
            
        endif
        
        //This whole thing to wait a second before killing the blight unit
        //Waiting is required for the antiblight to spread
        //I didn't use dispel because of possible cheese with it.
        set blightData.u = blight
        call SetTimerData(t, blightData)
        call TimerStart(t, 1, false, function RemoveBlightUnit)
        
        //Cleanup
        set blightData.u = null
        set animData.u = null
        call blightData.destroy()
        call animData.destroy()
        set blight = null
        set p = null
        set u = null
        set l = null
    endfunction
    
    private function Init takes nothing returns nothing
        local trigger t = CreateTrigger()
        
        call TriggerAddAction(t, function Actions)
        call TriggerAddCondition(t, Condition(function Conditions))
        call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_SPELL_EFFECT)
        
        set t = null
    endfunction

endscope
Вот весь скоп. Через onDestroy еще не очень привык, перепишу.
И либа таймера анимации здесь: www.wc3c.net/showthread.php?t=103936
1
28
5 лет назад
1
зачем внешние очишаеш структуру?
Порой это нужно.

Замени GetTriggerUnit() на GetSpellAbilityUnit().
ApaxHoqpuJL:
call SetUnitAnimationReverseFollowed(u, 3, 1, 1, true, FollowUpFunc.AnimationTimerFollowup, animData)
А это что такое? Что за FollowUpFunc.AnimationTimerFollowup?
Принятый ответ
0
23
5 лет назад
0
PT153, но сути
method onDestroy takes noting returns nothing
if this.u != null then
	set this.u = null
endif
if this.l != null then
	set this.l = null
endif
endmethod
data.destroy() и все чтобы не хранили его ссылку на юнитов =) а если необходимо внешне то удаляем внешнее =)
0
32
5 лет назад
0
pro100master,destroy просто позволяет в эти ячейки записывать снова, но в глобалках так и висят значения.
Кстати юнитов с ходу удалять ненужно, просто убивайте, возможны баги, лучше чтобы движок сам утилизировал юнита, ремув это крайние меры для визуальных даммиков и тому подобное, которое никакими абилки не взаимодействует с остальными.
0
23
5 лет назад
0
quq_CCCP, хендлы останет если на него сылает даже удаленый юнит как бы! А когда почишаеш то хендл уменшает даже если мусор удалил юнитов! Или я ошибься =) Суть ответ выше уже написали заменить триггер на каст юнит
2
3
5 лет назад
Отредактирован ApaxHoqpuJL
2
PT153, FollowUpFunc это интерфейс в той либе. Помогает данные в функцию запихивать после таймера. AnimationTimerFollowup это функция, которая в скопе.
quq_CCCP Юнита здесь было предпочтительнее ремувнуть, чтобы death анимация не играла и эффект взрыва не появлялся.
Замена GetTriggerUnit на GetSpellAbilityUnit помогла, запомню на будущее. Спасибо всем.
0
32
5 лет назад
0
ApaxHoqpuJL, если дамик плюнет ядом в героя а даммика удалить, убийца будет неизвестен, суицид... Возможны и другие чудеса, о которых писал лич в своем блоге. Я сталкивался что у меня ломались стандартные абилки на ровном месте...
0
3
5 лет назад
0
quq_CCCP, Тут всего лишь здание в предмет сворачивается, так что можно не париться. Но в будущем буду осторожен, спасибо.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.