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=a6c0a6237855c30a637623464cf0ad7dMé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

Me servir d'Autoindex correctement
Aller à la page Précédente  1, 2, 3  Suivante
 
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
 jk2pach
Invité








MessagePosté le: 10/03/10 17:42    Sujet du message: Citer

Ah mais oui. J'ai juste oublié de le virer dans l'Event :O
_________________
Revenir en haut
 Troll-Brain
Ri1kamoua


Inscrit le: 23 Aoû 2007
Messages: 7143
Sujets: 147
Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance
Médailles: 2 (En savoir plus...)
Rédacteur de tuto #3 (Quantité : 1) Grand mage créateur de sort (Quantité : 1)

MessagePosté le: 10/03/10 18:05    Sujet du message: Citer

Nouveau code ?

I don't believe in you that much, sorry.
_________________
Le violet, c'est moche.
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 jk2pach
Invité








MessagePosté le: 10/03/10 18:12    Sujet du message: Citer

Et tu as raison.

En fait la condition en plus du filter: si je la vire tel que ci-dessous, le trigger va fonctionner pour toutes les unités non?

Vu que la fonction CheckStatus appelle local str this = str[whichUnit], ça créé automatiquement une struct non?
Jass:
scope PhalanxCreeps initializer init

globals
    private constant integer SPELL1 = 'A008'
    private constant integer SPELL2 = 'A04J'
    private constant real DURATION = 15.
    private constant integer AI_ENABLED = 'A04D'
endglobals


    private struct str
        unit caster
        boolean isdefending = false
        timer ti = null
   
            private static method createFilter takes unit u returns boolean
                return (GetUnitAbilityLevel(u,SPELL1)>=1 or GetUnitAbilityLevel(u,SPELL2)>=1) and IsUnitType(u,UNIT_TYPE_HERO)==false
            endmethod
           
            private method onCreate takes nothing returns nothing
                set .isdefending = false
                set .caster = me
                set .ti = null
            endmethod
            implement AutoCreate
           
            private method onDestroy takes nothing returns nothing
                call ReleaseTimer(.ti)
                set .ti = null
                set .isdefending = false
                set .caster = null
            endmethod
            implement AutoDestroy
           
    endstruct

    private function Update takes nothing returns nothing
    local str this = GetTimerData(GetExpiredTimer() )
        call IssueImmediateOrder(this.caster,"undefend")
        set this.isdefending = false
    endfunction

    private function IniWait takes unit whichUnit returns nothing
        local str  this = str[whichUnit]
            set this.isdefending = true
            set this.caster = whichUnit
            call IssueImmediateOrder(this.caster,"defend")
            set this.ti = NewTimer()
            call SetTimerData(this.ti, this)
            call TimerStart (this.ti,DURATION, false, function Update)
    endfunction
   
    private function CheckStatus takes unit whichUnit returns nothing
        local str  this = str[whichUnit]
        if this.isdefending == false then
            call IniWait(whichUnit)
        endif
    endfunction

    private function Conditions takes nothing returns boolean
        local unit victim = GetTriggerUnit()
            if victim!= null and GetUnitState(victim,UNIT_STATE_LIFE)>0 then
                call CheckStatus(victim)
            endif
            set victim = null
            return false
    endfunction

    public function init takes nothing returns nothing
        local trigger t = CreateTrigger()
            call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_ATTACKED )
            call TriggerAddCondition(t, Condition(function Conditions))
    endfunction

endscope

_________________
Revenir en haut
 Troll-Brain
Ri1kamoua


Inscrit le: 23 Aoû 2007
Messages: 7143
Sujets: 147
Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance
Médailles: 2 (En savoir plus...)
Rédacteur de tuto #3 (Quantité : 1) Grand mage créateur de sort (Quantité : 1)

MessagePosté le: 10/03/10 18:49    Sujet du message: Citer

En toute logique si le code a été bien conçu str[<unit>] devrait être égal à 0 pour une unité dont aucune instance a été liée, mais en aucun cas cela ne créé une instance, on obtient simplement l'instance liée à l'unité.
Mais oui tu dois faire toi même cette vérification car le booléen avec pour index 0 sera forcément égal à false.

- CheckStatus est plutôt inutile car tu ne l'appelles qu'une fois tu peux parfaitement l'inliner, puis côté speed freak une fonction qui prend un ou plusieurs arguments est "couteuse", contrairement à une fonction sans arguments. (oui oui l'échelle de valeur est bien en dessous de la milli seconde Razz )

- Tu n'es pas obligé de nullifier les timer étant donné que ceux ci sont recyclés (jamais détruits)

- On peut le tester facilement, mais je doute fortement qu'un event "une unité est attaquée" puisse se produire sur une unité morte

- Ce n'est pas une façon safe de vérifier si une unité est morte, go IsUnitType(<unit>,UNIT_TYPE_DEAD), et si tu as une possibilité d'avoir une ghost unit ou null rajoute or GetUnitTypeId(<unit>) == 0, en effet il est à mes yeux plus judicieux de considérer une telle unité comme morte plutôt que vivante.
_________________
Le violet, c'est moche.
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 jk2pach
Invité








MessagePosté le: 10/03/10 21:47    Sujet du message: Citer

Jass:
scope PhalanxCreeps initializer init

globals
    private constant integer SPELL1 = 'A008'
    private constant integer SPELL2 = 'A04J'
    private constant real DURATION = 15.
    private constant integer AI_ENABLED = 'A04D'
endglobals


    private struct str
        unit caster
        boolean isdefending = false
        timer ti = null
   
            private static method createFilter takes unit u returns boolean
                return (GetUnitAbilityLevel(u,SPELL1)>=1 or GetUnitAbilityLevel(u,SPELL2)>=1) and IsUnitType(u,UNIT_TYPE_HERO)==false
            endmethod
           
            private method onCreate takes nothing returns nothing
                set .isdefending = false
                set .caster = me
                set .ti = null
            endmethod
            implement AutoCreate
           
            private method onDestroy takes nothing returns nothing
                call ReleaseTimer(.ti)
                set .isdefending = false
                set .caster = null
            endmethod
            implement AutoDestroy
           
    endstruct

    private function Update takes nothing returns nothing
        local str this = GetTimerData(GetExpiredTimer() )
            call IssueImmediateOrder(this.caster,"undefend")
            set this.isdefending = false
    endfunction

    private function IniWait takes unit whichUnit returns nothing
        local str  this = str[whichUnit]
            set this.isdefending = true
            set this.caster = whichUnit
            call IssueImmediateOrder(this.caster,"defend")
            set this.ti = NewTimer()
            call SetTimerData(this.ti, this)
            call TimerStart (this.ti,DURATION, false, function Update)
    endfunction
   
    private function Conditions takes nothing returns boolean
        local unit victim = GetTriggerUnit()
        local str  this = str[GetTriggerUnit()]
            if this != 0 and this.isdefending == false then
                call IniWait(victim)
            endif
            set victim = null
            return false
    endfunction

    public function init takes nothing returns nothing
        local trigger t = CreateTrigger()
            call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_ATTACKED )
            call TriggerAddCondition(t, Condition(function Conditions))
    endfunction

endscope

_________________
Revenir en haut
 Troll-Brain
Ri1kamoua


Inscrit le: 23 Aoû 2007
Messages: 7143
Sujets: 147
Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance
Médailles: 2 (En savoir plus...)
Grand mage créateur de sort (Quantité : 1) Rédacteur de tuto #3 (Quantité : 1)

MessagePosté le: 10/03/10 22:05    Sujet du message: Citer

- Même combat pour IniWait, quel horrible nom d'ailleurs Confused

- le bug de IsUnitType est résolu

- Comme tu utilises l'allocation naturelle des structs tu n'as pas besoin de définir la valeur des membres de la struct dans la method onCreate, donner la valeur par défaut suffit pour que la valeur initiale soit donnée aux membres de l'instance.
Tu peux donc supprimer onCreate.

- c'est inutile de définir la valeur par défaut des variable array (ce qu'est un membre d'une struct), c'est fait automatiquement par le jassounet.
_________________
Le violet, c'est moche.


Dernière édition par Troll-Brain le 10/03/10 22:24; édité 2 fois
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 jk2pach
Invité








MessagePosté le: 10/03/10 22:14    Sujet du message: Citer

IsUnitType: cool. Ca m'évitera de passer par des capacités pour remplacer les booléens.

Ici ca change rien en revanche non?

Nouvelle version:

Jass:
scope PhalanxCreeps initializer init

globals
    private constant integer SPELL1 = 'A008'
    private constant integer SPELL2 = 'A04J'
    private constant real DURATION = 15.
    private constant integer AI_ENABLED = 'A04D'
endglobals


    private struct str
        unit caster = me
        boolean isdefending = false
        timer ti = null
   
            private static method createFilter takes unit u returns boolean
                return (GetUnitAbilityLevel(u,SPELL1)>=1 or GetUnitAbilityLevel(u,SPELL2)>=1) and IsUnitType(u,UNIT_TYPE_HERO)==false
            endmethod
           
            implement AutoCreate
           
            private method onDestroy takes nothing returns nothing
                call ReleaseTimer(.ti)
                set .isdefending = false
                set .caster = null
            endmethod
            implement AutoDestroy
           
    endstruct

    private function Update takes nothing returns nothing
        local str this = GetTimerData(GetExpiredTimer() )
            call IssueImmediateOrder(this.caster,"undefend")
            set this.isdefending = false
    endfunction
   
    private function CheckIfSpellIsPossible takes nothing returns boolean
        local unit victim = GetTriggerUnit()
        local str  this = str[GetTriggerUnit()]
            if this != 0 and this.isdefending == false then
                set this.isdefending = true
                call IssueImmediateOrder(victim,"defend")
                set this.ti = NewTimer()
                call SetTimerData(this.ti, this)
                call TimerStart (this.ti,DURATION, false, function Update)
            endif
            set victim = null
            return false
    endfunction

    public function init takes nothing returns nothing
        local trigger t = CreateTrigger()
            call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_ATTACKED )
            call TriggerAddCondition(t, Condition(function CheckIfSpellIsPossible))
    endfunction

endscope

_________________
Revenir en haut
 Troll-Brain
Ri1kamoua


Inscrit le: 23 Aoû 2007
Messages: 7143
Sujets: 147
Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance
Médailles: 2 (En savoir plus...)
Rédacteur de tuto #3 (Quantité : 1) Grand mage créateur de sort (Quantité : 1)

MessagePosté le: 10/03/10 22:16    Sujet du message: Citer

J'ai édité mon post, et c'est plus sexy d'utiliser "not"
_________________
Le violet, c'est moche.
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 jk2pach
Invité








MessagePosté le: 10/03/10 22:23    Sujet du message: Citer

ton post édité: ça change quoi?
not: pourquoi?
_________________
Revenir en haut
 Troll-Brain
Ri1kamoua


Inscrit le: 23 Aoû 2007
Messages: 7143
Sujets: 147
Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance
Médailles: 2 (En savoir plus...)
Rédacteur de tuto #3 (Quantité : 1) Grand mage créateur de sort (Quantité : 1)

MessagePosté le: 10/03/10 22:25    Sujet du message: Citer

Citation:
- c'est inutile de définir la valeur par défaut des variable array (ce qu'est un membre d'une struct), c'est fait automatiquement par le jassounet.

Ce n'est pas le cas des membre static par contre, qui eux sont de simple variable non array, et crash le thread en cours si une variable non initialisée est utilisée.

Je chipote mais c'est toujours bon de savoir le plus de choses possibles ^^

IsUnitType(u,UNIT_TYPE_HERO)==false --> not IsUnitType(u,UNIT_TYPE_HERO)
_________________
Le violet, c'est moche.


Dernière édition par Troll-Brain le 10/03/10 22:31; édité 1 fois
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 jk2pach
Invité








MessagePosté le: 10/03/10 22:30    Sujet du message: Citer

D'accord mais le "me" d'Autoindex j'en fais quoi?

Jass:
scope PhalanxCreeps initializer init

globals
    private constant integer SPELL1 = 'A008'
    private constant integer SPELL2 = 'A04J'
    private constant real DURATION = 15.
    private constant integer AI_ENABLED = 'A04D'
endglobals


    private struct str
        unit caster
        boolean isdefending
        timer ti
   
            private static method createFilter takes unit u returns boolean
                return (GetUnitAbilityLevel(u,SPELL1)>=1 or GetUnitAbilityLevel(u,SPELL2)>=1) and not IsUnitType(u,UNIT_TYPE_HERO)==true
            endmethod
           
            implement AutoCreate
           
            private method onDestroy takes nothing returns nothing
                call ReleaseTimer(.ti)
                set .isdefending = false
                set .caster = null
            endmethod
            implement AutoDestroy
           
    endstruct

    private function Update takes nothing returns nothing
        local str this = GetTimerData(GetExpiredTimer() )
            call IssueImmediateOrder(this.caster,"undefend")
            set this.isdefending = false
    endfunction
   
    private function CheckIfSpellIsPossible takes nothing returns boolean
        local unit victim = GetTriggerUnit()
        local str  this = str[GetTriggerUnit()]
            if this != 0 and this.isdefending == false then
                set this.caster = victim
                set this.isdefending = true
                call IssueImmediateOrder(victim,"defend")
                set this.ti = NewTimer()
                call SetTimerData(this.ti, this)
                call TimerStart (this.ti,DURATION, false, function Update)
            endif
            set victim = null
            return false
    endfunction

    public function init takes nothing returns nothing
        local trigger t = CreateTrigger()
            call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_ATTACKED )
            call TriggerAddCondition(t, Condition(function CheckIfSpellIsPossible))
    endfunction

endscope

_________________
Revenir en haut
 Troll-Brain
Ri1kamoua


Inscrit le: 23 Aoû 2007
Messages: 7143
Sujets: 147
Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance
Médailles: 2 (En savoir plus...)
Grand mage créateur de sort (Quantité : 1) Rédacteur de tuto #3 (Quantité : 1)

MessagePosté le: 10/03/10 22:33    Sujet du message: Citer

Bah c'était bien ce que tu avais fait pour "caster".
Mais hmm faudrait que je vérifie le code compilé, t'es peut être obligé de le faire dans la method onCreate, je regarderais cela demain.

PS : J'ai édité mon précédent post.

PS2 : Mais lol enlève le == true !!!
_________________
Le violet, c'est moche.
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 jk2pach
Invité








MessagePosté le: 11/03/10 23:15    Sujet du message: Citer

Ca donne ça, et ça fonctionne:
Jass:
scope PhalanxCreeps initializer init

globals
    private constant integer SPELL1 = 'A008'
    private constant integer SPELL2 = 'A04J'
    private constant real DURATION = 15.
    private constant integer AI_ENABLED = 'A04D'
endglobals


    private struct str
        unit caster
        boolean isdefending
        timer ti
   
            private static method createFilter takes unit u returns boolean
                return (GetUnitAbilityLevel(u,SPELL1)>=1 or GetUnitAbilityLevel(u,SPELL2)>=1) and not IsUnitType(u,UNIT_TYPE_HERO)
            endmethod
           
            implement AutoCreate
           
            private method onDestroy takes nothing returns nothing
                call ReleaseTimer(.ti)
                set .isdefending = false
                set .caster = null
            endmethod
            implement AutoDestroy
           
    endstruct

    private function Update takes nothing returns nothing
        local str this = GetTimerData(GetExpiredTimer() )
            call IssueImmediateOrder(this.caster,"undefend")
            set this.isdefending = false
    endfunction
   
    private function CheckIfSpellIsPossible takes nothing returns boolean
        local unit victim = GetTriggerUnit()
        local str  this = str[GetTriggerUnit()]
            if this != 0 and this.isdefending == false then
                set this.caster = victim
                set this.isdefending = true
                call IssueImmediateOrder(victim,"defend")
                set this.ti = NewTimer()
                call SetTimerData(this.ti, this)
                call TimerStart (this.ti,DURATION, false, function Update)
            endif
            set victim = null
            return false
    endfunction

    public function init takes nothing returns nothing
        local trigger t = CreateTrigger()
            call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_ATTACKED )
            call TriggerAddCondition(t, Condition(function CheckIfSpellIsPossible))
    endfunction

endscope


Ce que je me demande c'est: du coup le timer n'est released que quand l'unité quitte la carte non?
_________________
Revenir en haut
 Troll-Brain
Ri1kamoua


Inscrit le: 23 Aoû 2007
Messages: 7143
Sujets: 147
Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance
Médailles: 2 (En savoir plus...)
Rédacteur de tuto #3 (Quantité : 1) Grand mage créateur de sort (Quantité : 1)

MessagePosté le: 14/03/10 16:59    Sujet du message: Citer

J'ai décider de boycotter les modules Auto... d'AutoIndex, c'est trop chiant à utiliser les method on...
Je go coder les miens.
_________________
Le violet, c'est moche.
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 jk2pach
Invité








MessagePosté le: 15/03/10 00:27    Sujet du message: Citer

Rah mine.

Je venais de m'y mettre. En quoi c'est chian?

Je trouve ça assez simple en fait.
_________________
Revenir en haut
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
Aller à la page Précédente  1, 2, 3  Suivante
Page 2 sur 3
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