Worldedit
  Worldedit
Le site sur l'éditeur de warcraft 3 !
 
  FAQFAQ   RechercherRechercher   Liste des MembresListe des Membres    Groupes d'utilisateursGroupes d'utilisateurs   medals.php?sid=caa009c82c9590afeeda4fe6d00f3f9aMédailles   S'enregistrerS'enregistrer 
 ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 
  FAQFAQ World Editor   UploadUploader une map ou une image    UploadAjouter sa map à l'annuaire   UploadConsulter l'annuaire

dummy unit qui ne veut pas mourir...

 
Poster un nouveau sujet   Répondre au sujet    Worldedit Index du Forum -> Aide sur les déclencheurs
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
 Crowolf
Animateur


Inscrit le: 21 Avr 2008
Messages: 1607
Sujets: 81
Spécialité en worldedit: Utiliser le travail des autres
Médailles: 3 (En savoir plus...)
Grand décorateur (Quantité : 2) Rédacteur de tuto #3 (Quantité : 1)

MessagePosté le: 10/09/11 17:29    Sujet du message: dummy unit qui ne veut pas mourir... Citer

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

endscope


_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Crowolf
Animateur


Inscrit le: 21 Avr 2008
Messages: 1607
Sujets: 81
Spécialité en worldedit: Utiliser le travail des autres
Médailles: 3 (En savoir plus...)
Grand décorateur (Quantité : 2) Rédacteur de tuto #3 (Quantité : 1)

MessagePosté le: 10/09/11 19:11    Sujet du message: Citer

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 Smile

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]
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Tirlititi



Inscrit le: 21 Fév 2010
Messages: 1785
Sujets: 22
Spécialité en worldedit: La modestie
Médailles: 1 (En savoir plus...)
Grand mage créateur de sort (Quantité : 1)

MessagePosté le: 10/09/11 19:26    Sujet du message: Citer

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.
_________________
Warcraft III, c'était mieux avant. Y'avait des purs chefs-d'oeuvres du mapping !
Road Of Glory (par moi)
Casse-briques (par moi)
Temple de Glace (par moi)
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Worldedit Index du Forum -> Aide sur les déclencheurs Toutes les heures sont au format GMT + 1 Heure
Page 1 sur 1
La question posée dans ce topic a été résolue !

 
Sauter vers:  
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


Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : phpBB-fr.com