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=07b9b1ecefd109e5e2c8e1a029c2b9e9Mé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

Petit Bug TriggerDynamique [vJass]

 
Poster un nouveau sujet   Répondre au sujet    Worldedit Index du Forum -> Les sorts
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
 LightDragoon
Ptit Nouveau


Inscrit le: 01 Mai 2014
Messages: 35
Sujets: 5
Spécialité en worldedit: France


MessagePosté le: 15/11/14 11:41    Sujet du message: Petit Bug TriggerDynamique [vJass] Citer

Bonjour à tous,
J'ai essayé de faire un sort alors tout d'abord voilà le descriptif du sort.

Tempest Blade [ACTIF] :
Saber déchaîne toute la puissance d'excalibur, envoyant une tempête de coups en avant, repoussant les ennemis et leur infligeant 5xPuissance.
Les ennemis tués rapportent 1.5xContitution points de vie et 1.5xRessource points de mana.
(Puissance=Agilité,Ressource = Intelligence, Constitution = Force)

Et voici donc le scope de mon sort..Mais le problème c'est que le trigger dynamique avec la function knock ne se lance pas je ne comprend pas pourquoi :
Secret:


Jass:

scope TempestBlade initializer check

/*************************************************************CONFIG************************************************************************/

globals
    private         constant        attacktype          AT                =   ATTACK_TYPE_HERO
    private         constant        damagetype          DT                =   DAMAGE_TYPE_DEATH
    private         constant        integer             CONSTANT          =   5                  //C'est le facteur par lequelle la stat va être multiplié changé le si vous voulez augmentez ou diminuez les dégats
    private         constant        string              SE                =  "Abilities\\Spells\\Undead\\Unsummon\\UnsummonTarget.mdx"
    private         constant        integer             REG               =   2
    private         constant        integer             SPELL             =   'A005'
    private         constant        real                KNOCK             =   25
    private                         hashtable           ht                =   InitHashtable()
endglobals




/*************************************************************FUNCTIONS************************************************************************/
private function Targets takes unit tu, unit caster returns boolean
    //Les unités affecté par le spell
        return (GetWidgetLife(tu) > 0.405) and (IsUnitType(tu, UNIT_TYPE_STRUCTURE) == false) and (IsUnitType(tu, UNIT_TYPE_MAGIC_IMMUNE) == false) and IsPlayerAlly(GetOwningPlayer(tu), GetOwningPlayer(caster)) == false
endfunction

private function dammage takes group g, unit caster, integer AGI, integer CONSTANT,attacktype AT, damagetype DT returns nothing
  local unit f
        loop
            set f = FirstOfGroup(g)
            exitwhen(f == null)
            if Targets(f,caster) then
            call UnitDamageTarget(caster, f, (AGI*CONSTANT) , true, false, AT, DT, null)
           
            endif
            call GroupRemoveUnit(g, f)
            set f = null
        endloop
    call DestroyGroup(g)
endfunction

function Destroy takes nothing returns nothing
    local unit caster = LoadUnitHandle(ht,0,GetHandleId(GetExpiredTimer()))
    local group g = GetUnitsInRangeOfLocAll(1500,GetUnitLoc(caster))
    local unit f
    loop
    exitwhen(f == null)
    set f = FirstOfGroup(g)
    if GetUnitUserData(f) == 10 then
    call SetUnitUserData(f,0)
    endif
    call GroupRemoveUnit(g,f)
    endloop
    call DestroyTrigger( LoadTriggerHandle(ht,0,GetHandleId( GetExpiredTimer())))
    call FlushChildHashtable( ht, GetHandleId( GetExpiredTimer()) )
    call DestroyTimer(GetExpiredTimer())

endfunction


function knock takes nothing returns nothing
local unit  f
local unit  caster = LoadUnitHandle(ht,0,GetHandleId(GetTriggeringTrigger()))
local location p1
local location pcast = GetUnitLoc(caster)
local location p2
local location s = LoadLocationHandle(ht,0,GetHandleId(GetTriggeringTrigger()))
local real ang
local group g = GetUnitsInRangeOfLocAll(400,s)
local boolean b = (GetWidgetLife(f) > 0.405) and (IsUnitType(f, UNIT_TYPE_STRUCTURE) == false) and IsPlayerAlly(GetOwningPlayer(f), GetOwningPlayer(caster)) == false
call DestroyEffect(AddSpecialEffect(SE,GetUnitX(caster),GetUnitY(caster)))
  loop
    set f = FirstOfGroup(g)
    exitwhen(f == null)
       
            set p1 = GetUnitLoc(f)
            set ang = AngleBetweenPoints(p1, pcast)
            set p2 = PolarProjectionBJ(p1, KNOCK, ang)
            call SetUnitPositionLoc(f,p2)
            call DestroyEffect(AddSpecialEffect(SE,GetUnitX(f),GetUnitY(f)))
           
       
        call GroupRemoveUnit(g, f)

    endloop
    call RemoveLocation(p1)
    call RemoveLocation(p2)
        set f = null
        set p1 = null
        set p2 = null
endfunction


/*************************************************************ACTIONS************************************************************************/
private function Actions takes nothing returns nothing
        local    location s         = GetSpellTargetLoc()
        local    unit     caster    = GetSpellAbilityUnit()
        local    integer  pui       = GetHeroAgi(caster, true)
        local    integer  con       = GetHeroStr(caster, true)
        local    integer  res       = GetHeroInt(caster, true)
        local    trigger  trig
        local    group    g         = GetUnitsInRangeOfLocAll(400, s)
        local    timer    tim
        set trig = CreateTrigger()
       ///Fin de déclaration
       set tim = CreateTimer()
       //HASHTABLE
       call SaveTriggerHandle(ht,0,GetHandleId(tim),trig)
       call SaveUnitHandle(ht,0,GetHandleId(trig),caster)
       call SaveLocationHandle(ht,0,GetHandleId(trig),s)
       //FINHASHTABLE
       
       //TriggerSet
       call TimerStart(tim, 1.00, TRUE, function Destroy)
       call TriggerRegisterTimerEventPeriodic(trig,0.05)
       call TriggerAddAction(trig, function knock)
       //EndTriggerSet
       
       //Dammage
       
       call dammage(g,caster,pui,CONSTANT,AT,DT)
   
       
endfunction

/*************************************************************TRIGGER************************************************************************/
private function init takes nothing returns nothing
 if GetSpellAbilityId() == SPELL then
    call Actions()
    endif
endfunction


private function check takes nothing returns nothing
    set gg_trg_TempestBlade = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_TempestBlade, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddAction( gg_trg_TempestBlade, function init )
endfunction

endscope


Merci d'avance.
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Adresse AIM
 Ectelion
Membre reconnu


Inscrit le: 12 Nov 2011
Messages: 1062
Sujets: 107
Spécialité en worldedit: Inactif(Enfin presque)
Médailles: 1 (En savoir plus...)
Créateur d'unité (Quantité : 1)

MessagePosté le: 15/11/14 14:20    Sujet du message: Citer

Tu es sûr qu'il ne se lance pas ? Peut-être se lance t-il mais ne fonctionne pas. Met un BJDebugMsg au début de la fonction knock, si il apparaît pas en jeu, c'est bien que la fonction ne prend pas effet,sinon c'est qu'elle bug quelque part.
_________________
Inactif(Enfn presque)
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 LightDragoon
Ptit Nouveau


Inscrit le: 01 Mai 2014
Messages: 35
Sujets: 5
Spécialité en worldedit: France


MessagePosté le: 15/11/14 14:42    Sujet du message: Citer

J'ai essayé avec un
Jass:
call BJDebugMsg("bug")

Et donc le trigger dynamique ne se lance pas pourtant y'a pas l'air d'avoir de problème ni au niveau de la création du trigger ni dans l'event du trigger..
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Adresse AIM
 Ectelion
Membre reconnu


Inscrit le: 12 Nov 2011
Messages: 1062
Sujets: 107
Spécialité en worldedit: Inactif(Enfin presque)
Médailles: 1 (En savoir plus...)
Créateur d'unité (Quantité : 1)

MessagePosté le: 15/11/14 15:34    Sujet du message: Citer

Essaye de mettre la handle du lanceur plutôt que celle du timer, pour voir si ça vient de là.
_________________
Inactif(Enfn presque)
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 LightDragoon
Ptit Nouveau


Inscrit le: 01 Mai 2014
Messages: 35
Sujets: 5
Spécialité en worldedit: France


MessagePosté le: 15/11/14 15:43    Sujet du message: Citer

Non visiblement ça ne marche pas non plus...
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Adresse AIM
 LightDragoon
Ptit Nouveau


Inscrit le: 01 Mai 2014
Messages: 35
Sujets: 5
Spécialité en worldedit: France


MessagePosté le: 15/11/14 19:38    Sujet du message: Citer

J'ai changé de method en passant par un timer..Désormais ça marche !
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Adresse AIM
 Sapeur-Goblin
Floodeur prématuré


Inscrit le: 14 Oct 2009
Messages: 719
Sujets: 40
Spécialité en worldedit: Les bugs
Médailles: 1 (En savoir plus...)
Créateur d'unité (Quantité : 1)

MessagePosté le: 15/11/14 19:41    Sujet du message: Citer

Ectelion a écrit:
Essaye de mettre la handle du lanceur plutôt que celle du timer, pour voir si ça vient de là.


Dans la GRANDE majorité des cas, l'handle du timer est bien plus appréciable. Celui du lanceur bousille juste la multi-instanciabilité.
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Ectelion
Membre reconnu


Inscrit le: 12 Nov 2011
Messages: 1062
Sujets: 107
Spécialité en worldedit: Inactif(Enfin presque)
Médailles: 1 (En savoir plus...)
Créateur d'unité (Quantité : 1)

MessagePosté le: 15/11/14 23:36    Sujet du message: Citer

Sapeur-Goblin a écrit:
Ectelion a écrit:
Essaye de mettre la handle du lanceur plutôt que celle du timer, pour voir si ça vient de là.


Dans la GRANDE majorité des cas, l'handle du timer est bien plus appréciable. Celui du lanceur bousille juste la multi-instanciabilité.


Secret:

Personnellement j'utilise un dummy pour faire la handle, comme il en utilisait pas, je lui ait conseillé d'utiliser celle du lanceur. Car en effet comme il n'utilisait pas TimerUtils(qui est quand même présent dans de nombreux sorts/systèmes), j'ai supposé que le problème venait de l'assignation/récupération de la handle du timer et ait cherché une méthode pour le vérifier. (ça venait d'autre part)

Secret:

En plus le problème là c'est même pas la multi-instanciabilité.



Ensuite, généralement peu de sorts sont multi-instanciables au point d'être lançables part la même unité en un temps infime(sauf dans les maps de test, même si c'est quand même pas nécessaire). Donc j'imagine que dans une grande majorité de cas on peut utiliser l'handle du lanceur(enfin ça c'est un autre débat).



Je vois pas d'où peut venir l'erreur, regarde juste si le trigger ne vaut pas null pour quelque raison que ce soit.
_________________
Inactif(Enfn presque)
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Tirlititi



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

MessagePosté le: 15/11/14 23:42    Sujet du message: Citer

Jass:
       call SaveUnitHandle(ht,0,GetHandleId(trig),caster)
       call SaveLocationHandle(ht,0,GetHandleId(trig),s)


Tu utilises deux fois le même emplacement pour stocker deux choses différentes : la location va remplacer l'unité.
Utilise un autre index pour la location (n'oublie pas de le modifier pour le load aussi).

On peut stocker un booléan, un entier, un réel et un handle dans un même slot de hashtable sans problème. Comme tu as deux handle, là, ça rentre en conflit.

Sans doute que tu as eu l'impression que le trigger ne se lançait pas parce qu'il est arrêté pendant la création des variables locales parce que l'unité est invalide.

Enfin, si tu es passé sur une autre méthode, c'est bon, mais tu le sauras pour la prochaine fois.
_________________
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é
 LightDragoon
Ptit Nouveau


Inscrit le: 01 Mai 2014
Messages: 35
Sujets: 5
Spécialité en worldedit: France


MessagePosté le: 16/11/14 10:38    Sujet du message: Citer

Ah ouais j'avais pas fait gaffe y'a la même key...Merci en tout cas mais je suis passé par une fonction gentiment fournit par Flo Very Happy ! Mais je saurais pour la prochaine fois
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Adresse AIM
 Sapeur-Goblin
Floodeur prématuré


Inscrit le: 14 Oct 2009
Messages: 719
Sujets: 40
Spécialité en worldedit: Les bugs
Médailles: 1 (En savoir plus...)
Créateur d'unité (Quantité : 1)

MessagePosté le: 16/11/14 13:37    Sujet du message: Citer

Ectelion a écrit:
Personnellement j'utilise un dummy pour faire la handle, comme il en utilisait pas, je lui ait conseillé d'utiliser celle du lanceur.

Si tu utilises un dummy, oui, ça marche.

Citation:
Car en effet comme il n'utilisait pas TimerUtils(qui est quand même présent dans de nombreux sorts/systèmes), j'ai supposé que le problème venait de l'assignation/récupération de la handle du timer et ait cherché une méthode pour le vérifier. (ça venait d'autre part)

Ça ne change absolument rien d'utiliser timerutils ou pas.

Citation:
En plus le problème là c'est même pas la multi-instanciabilité

Non, ce n'est pas ça le problème de départ mais ce que tu proposes ajoute ce dysfonctionnement. Donc autant éviter.

Citation:
Ensuite, généralement peu de sorts sont multi-instanciables au point d'être lançables part la même unité en un temps infime(sauf dans les maps de test, même si c'est quand même pas nécessaire). Donc j'imagine que dans une grande majorité de cas on peut utiliser l'handle du lanceur

Si si, c'est justement ça la multi-instanciabilité. Et si, c'est nécessaire. Pour un sort qui dure 10 secondes avec 2 secondes de rechargement, j'ai bien envie de voir la gueule de l'effet avec ta pseudo-multi-instanciabilité.

Citation:
(enfin ça c'est un autre débat)

Si, c'est justement ça le débat.
_________________
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 -> Les sorts 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