Inscrit le: 21 Avr 2008 Messages: 1607 Sujets: 81 Spécialité en worldedit: Utiliser le travail des autres Médailles: 3 (En savoir plus...)
Posté le: 10/09/11 17:29 Sujet du message: dummy unit qui ne veut pas mourir...
Hi, j'ai un petit problème avec un sort, il est sensé invoquer une unité dummy avec Immolation pour tuer les méchants ennemis.
Ce sort est basé sur Tranquillité, avec un temps de canalisation. L'unité dummy doit rester tant que le caster est en train de canaliser.
Le problème, c'est que l'unité créée par déclencheur ne veut pas mourir à la fin du sort...
J'ai essayé avec des unités déjà présentes sur la map et elles, elles meurent sans problèmes...
Je peux vous upload la map si vous avez besoin. Merci de jeter un coup d'oeil.
Secret:
Jass:
scope FireAngel initializer Init
//===========================================================================
//===========================================================================
//===========================================================================
globals
private constant integer SPELL_ID = 'A015'
private constant integer DUMMY_ID = 'o002'
private constant real SPELL_DURATION = 3.0
private constant real TIMERTICK = 0.3
private constant string ORDER_ID = "tranquility"
endglobals
//===========================================================================
//===========================================================================
//===========================================================================
private struct Data
unit caster
unit dummy
real x
real y
real angle
static method create takes unit c returns Data
local Data D = Data.allocate()
set D.caster = c
set D.x = GetUnitX(c)
set D.y = GetUnitY(c)
set D.angle = GetUnitFacing(c)
call CreateUnit(GetOwningPlayer(c), DUMMY_ID, D.x, D.y, D.angle)
set D.dummy = GetLastCreatedUnit()
call UnitApplyTimedLife(D.dummy, 'BTLF', SPELL_DURATION)
return D
endmethod
endstruct
private function Loop takes nothing returns nothing
local timer t = GetExpiredTimer()
local Data D = Data(GetTimerData(t))
if (GetUnitCurrentOrder(D.caster) != String2OrderIdBJ(ORDER_ID)) then
call KillUnit(D.dummy)
//call RemoveUnit(D.dummy)
call ReleaseTimer(t)
endif
set t = null
endfunction
private function Actions takes nothing returns nothing
local Data D = Data.create(GetTriggerUnit())
local timer t = NewTimer()
call SetTimerData(t, integer (D))
call TimerStart(t, TIMERTICK, true, function Loop)
set t = null
endfunction
//===========================================================================
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
//===========================================================================
private function Init takes nothing returns nothing
local trigger FireAngelTrg = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ( FireAngelTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( FireAngelTrg, Condition( function Conditions ) )
call TriggerAddAction( FireAngelTrg, function Actions )
endfunction
Inscrit le: 21 Avr 2008 Messages: 1607 Sujets: 81 Spécialité en worldedit: Utiliser le travail des autres Médailles: 3 (En savoir plus...)
Posté le: 10/09/11 19:11 Sujet du message:
C'est bon, j'ai réglé le problème, j'ai fait
Jass:
set D.dummy = CreateUnit(GetOwningPlayer(c), DUMMY_ID, D.x, D.y, D.angle)
à la place de
Jass:
call CreateUnit(GetOwningPlayer(c), DUMMY_ID, D.x, D.y, D.angle)
set D.dummy = GetLastCreatedUnit()
C'est mieux, c'est plus rapide
Est-ce que quelqu'un pourrait quand même regarder si le sort ne fait pas de leaks et si on peut améliorer (dans la limite de ma compréhension) le code.
je vous met la map, vous pourrez voir où j'en suis ^^
[url=http://communots.free.fr/upload/(12)DivideAndConquer-Extension_V0.00513156782.w3x]Divide and Conquire[/url] _________________
Inscrit le: 21 Fév 2010 Messages: 1785 Sujets: 22 Spécialité en worldedit: La modestie Médailles: 1 (En savoir plus...)
Posté le: 10/09/11 19:26 Sujet du message:
Tu devrais utiliser D.destroy() lorsque tu supprimes ton dummy, sinon l'ID de la structure n'est pas recyclé (il me semble).
Tu peux aussi mettre tes actions dans la condition, c'est plus rapide. :
Jass:
private function Conditions takes nothing returns boolean
local Data D
local timer t
if GetSpellAbilityId() == SPELL_ID then
set D=Data.create(GetTriggerUnit())
set t=NewTimer()
call SetTimerData(t, integer (D))
call TimerStart(t, TIMERTICK, true, function Loop)
set t = null
endif
endfunction
Après, la seulle optimisation que tu peux faire, c'est utiliser des events genre "EVENT_UNIT_SPELL_FINISH" au lieu d'un périodique qui regarde l'ordre. Mais je sais pas si ça se déclenche bien comme il faut. _________________
Page 1 sur 1 La question posée dans ce topic a été résolue !
Vous ne pouvez pas poster de nouveaux sujets dans ce forum Vous ne pouvez pas répondre aux sujets dans ce forum Vous ne pouvez pas éditer vos messages dans ce forum Vous ne pouvez pas supprimer vos messages dans ce forum Vous ne pouvez pas voter dans les sondages de ce forum