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=967024f953fe1746c7af0c990437683bMé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

bj_wantDestroyGroup ?
Aller à la page 1, 2  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
 Max
Floodeur prématuré


Inscrit le: 13 Jan 2009
Messages: 550
Sujets: 47
Spécialité en worldedit: La partie déclencheurs sauf le GUI.


MessagePosté le: 15/07/09 17:05    Sujet du message: bj_wantDestroyGroup ? Citer

Pour aider un pote, je lui ai fait un déclo de slide en GUI que voici :
Gui:
Trigger:
Slide
Collapse Evénements
Temps - Every 0.01 seconds of game time
Conditions
Collapse Actions
Custom script:   set bj_wantDestroyGroup = true
Collapse Groupe unité - Pick every unit in (Units of type Sub Zero) and do (Actions)
Collapse Boucle - Actions
Collapse If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Collapse Si - Conditions
((Picked unit) is alive) Egal à  TRUE
Collapse Alors - Actions
Set heroLoc = (Position of (Picked unit))
Collapse If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Collapse Si - Conditions
(Terrain type at heroLoc) Egal à  Glacier d'Icecrown - Briques empilées
Collapse Alors - Actions
Set heroNewLoc = (heroLoc offset by SlideSpeed towards (Facing of (Picked unit)) degrees)
Unité - Move (Picked unit) instantly to heroNewLoc
Custom script:   call RemoveLocation(udg_heroNewLoc)
Sinon - Actions
Custom script:   call RemoveLocation(udg_heroLoc)
Collapse Sinon - Actions

"set bj_wantDestroyGroup = true" sert à supprimer le groupe créé, pour éviter le leak. Cependant, alors que je pensais que le groupe serait supprimé à la fin des actions de la boucle, il est apparemment supprimé juste après le premier pick (la première unité). Si c'est comme ça que cela fonctionne, je ne vois pas l'intérêt de la variable "bj_wantDestroyGroup". J'ai dû raté quelque chose...

Edit : si je remplace les actions du pick every unit par un simple affichage d'un texte, l'affichage ne se fait qu'une seule fois...
_________________
Maximaxou@northrend

Projet Max Escape Creation (éditeur d'escapes : mazes/slides) : http://max.slid.free.fr/maxEscapeCreation/
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 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: 15/07/09 18:29    Sujet du message: Citer

Jass:
function ForGroupBJ takes group whichGroup, code callback returns nothing
    // If the user wants the group destroyed, remember that fact and clear
    // the flag, in case it is used again in the callback.
    local boolean wantDestroy = bj_wantDestroyGroup
    set bj_wantDestroyGroup = false

    call ForGroup(whichGroup, callback)

    // If the user wants the group destroyed, do so now.
    if (wantDestroy) then
        call DestroyGroup(whichGroup)
    endif
endfunction


Tu confirmes qu'en désactivant le custom script tu ne boucles toujours que sur une unité alors qu'il y a en plusieurs de ce type non masquées et sur la map ?

Bien que je ne me rappelle plus si le fait d'avoir la compétence infestation et être hide empêche une unité d'être énumérée par son id, ou non, à tester.
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Keitaro_Ura
Floodozaurus


Inscrit le: 21 Aoû 2007
Messages: 2073
Sujets: 38
Spécialité en worldedit: Oui
Médailles: 1 (En savoir plus...)
Rédacteur de tuto #2 (Quantité : 1)

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

La fonction bj_wantDestroyGroup annule les effets d'un groupe qui a (Units of type), il faut que tu passes par une variable groupe unité que tu définira et détruira (fonction DestroyGroup) après l'avoir utilisé pour éviter le leak.
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 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: 15/07/09 19:12    Sujet du message: Citer

Keitaro_Ura a écrit:
La fonction bj_wantDestroyGroup annule les effets d'un groupe qui a (Units of type), il faut que tu passes par une variable groupe unité que tu définira et détruira (fonction DestroyGroup) après l'avoir utilisé pour éviter le leak.

Je me rappelle avoir dit une merde du genre, mais après relecture de la fonction gui je crois que je m'étais simplement trompé car pour ce cas précis, le gui utilise 2 groupes.
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Keitaro_Ura
Floodozaurus


Inscrit le: 21 Aoû 2007
Messages: 2073
Sujets: 38
Spécialité en worldedit: Oui
Médailles: 1 (En savoir plus...)
Rédacteur de tuto #2 (Quantité : 1)

MessagePosté le: 15/07/09 19:18    Sujet du message: Citer

Sauf que je fais ça tout le temps et ça fonctionne à chaque fois.
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 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: 15/07/09 19:19    Sujet du message: Citer

Keitaro_Ura a écrit:
Sauf que je fais ça tout le temps et ça fonctionne à chaque fois.

Et si tu emploies le custom script à la place cela ne fonctionne pas ?
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Keitaro_Ura
Floodozaurus


Inscrit le: 21 Aoû 2007
Messages: 2073
Sujets: 38
Spécialité en worldedit: Oui
Médailles: 1 (En savoir plus...)
Rédacteur de tuto #2 (Quantité : 1)

MessagePosté le: 15/07/09 19:22    Sujet du message: Citer

Pas toujours non, donc pour être sûr, j'utilise la méthode que j'ai citée.
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 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: 15/07/09 19:25    Sujet du message: Citer

Keitaro_Ura a écrit:
Pas toujours non, donc pour être sûr, j'utilise la méthode que j'ai citée.

Hmm cela semble plus être une faute de ta part, mais par souci d'exactitude je ferais des tests et regarderais le code plus attentivement pour en être certain.
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Keitaro_Ura
Floodozaurus


Inscrit le: 21 Aoû 2007
Messages: 2073
Sujets: 38
Spécialité en worldedit: Oui
Médailles: 1 (En savoir plus...)
Rédacteur de tuto #2 (Quantité : 1)

MessagePosté le: 15/07/09 19:54    Sujet du message: Citer

La preuve en est que son déclencheur ne marche pas Rolling Eyes

Je ne cherche pas à tout savoir, moi, tant que ça fonctionne (et c'est pas toujours le cas, sur worldedit), ça me convient.
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 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: 15/07/09 21:21    Sujet du message: Citer

Keitaro_Ura a écrit:
La preuve en est que son déclencheur ne marche pas Rolling Eyes

Je ne cherche pas à tout savoir, moi, tant que ça fonctionne (et c'est pas toujours le cas, sur worldedit), ça me convient.

Actuellement la seule preuve que l'on ait c'est que cela ne fonctionne pas dans certaines circonstances, qui peuvent ne rien à voir avec l'utilisation du custom script ou non.
J'ai horreur des conclusions hâtives , attendons au moins la réponse de Max.
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Max
Floodeur prématuré


Inscrit le: 13 Jan 2009
Messages: 550
Sujets: 47
Spécialité en worldedit: La partie déclencheurs sauf le GUI.


MessagePosté le: 15/07/09 23:02    Sujet du message: Citer

Troll-Brain a écrit:
Tu confirmes qu'en désactivant le custom script tu ne boucles toujours que sur une unité alors qu'il y a en plusieurs de ce type non masquées et sur la map ?

Bien que je ne me rappelle plus si le fait d'avoir la compétence infestation et être hide empêche une unité d'être énumérée par son id, ou non, à tester.

Si je désactive le custom script, le déclo fonctionne bien et les 11 héros présents slident bien. Et si je remplace toutes les actions par l'affichage d'un texte, celui-ci est bien affiché 11 fois. Autrement dit ce n'est pas la création du groupe le problème, mais le moment de sa destruction.

Keitaro_Ura a écrit:
La fonction bj_wantDestroyGroup annule les effets d'un groupe qui a (Units of type), il faut que tu passes par une variable groupe unité que tu définira et détruira (fonction DestroyGroup) après l'avoir utilisé pour éviter le leak.

Je ne comprends pas en quoi un groupe créé par la fonction (Units of type) pourrait se comporter différemment de groupes créés par d'autres fonctions oO. L'intérêt du bj_wantDestroyGroup est justement censé être il me semble, de ne pas avoir besoin d'utiliser une variable pour éviter le leak.

edit : et pourtant c'est le cas. En remplaçant (Units of type) par (Units in region), ça fonctionne très bien, ça boucle pour chaque unité concernée.

J'ai une supposition à faire : peut-être que lors du pick every unit d'un groupe créé par la fonction (Units of type), il y a entre chaque pick d'unité, un certain temps qui s'écoule, comme si ça prenait plus de temps à l'ordinateur de récupérer l'unité suivante du groupe.. du coup le groupe serait détruit avant le démarrage des actions pour la deuxième unité. Cette supposition est basée sur le fait que "toutes les actions seraient exécutées séquentiellement (dans l'ordre), sauf dans le cas de délai d'attente, comme lors de l'action wait" (cette phrase est de moi, tirée de mon expérience, peut-être que je me trompe ou que ce n'est pas si simple).
_________________
Maximaxou@northrend

Projet Max Escape Creation (éditeur d'escapes : mazes/slides) : http://max.slid.free.fr/maxEscapeCreation/
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 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: 16/07/09 20:08    Sujet du message: Citer

Je peux avoir une map de démo ?

Gui:
Trigger:
test
Collapse Evénements
Joueur - Joueur 1 (Rouge) skips a cinematic sequence
Temps - Every 0.01 seconds of game time
Conditions
Collapse Actions
Partie - Display to (All players) the text:
Custom script:   set bj_wantDestroyGroup = true
Collapse Groupe unité - Pick every unit in (Units of type Fantassin) and do (Actions)
Collapse Boucle - Actions
Collapse If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Collapse Si - Conditions
((Picked unit) is alive) Egal à  TRUE
Collapse Alors - Actions
Set heroLoc = (Position of (Picked unit))
Collapse If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Collapse Si - Conditions
(Terrain type at heroLoc) Egal à  Eté de Lordaeron - Terre
Collapse Alors - Actions
Set heroNewLoc = (heroLoc offset by 10.00 towards (Facing of (Picked unit)) degrees)
Unité - Move (Picked unit) instantly to heroNewLoc
Custom script:   call RemoveLocation(udg_heroNewLoc)
Sinon - Actions
Custom script:   call RemoveLocation(udg_heroLoc)
Sinon - Actions
Partie - Display to (All players) the text: loop


La seule différence c'est que j'utilise une valeur pour l'offset au lieu d'une variable serait ce la goutte d'eau qui ne fait pas déborder le vase ?
J'ai vraiment du mal à le croire ...
Surtout qu'en fait non j'utilise en plus une fonction plus couteuse, le display text.

Mais même avec l'event périodique 0.01s il semble que j'ai bien le nombre de "loop" correct affiché.
J'ai testé avec 12 fantassins sur la map.
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Max
Floodeur prématuré


Inscrit le: 13 Jan 2009
Messages: 550
Sujets: 47
Spécialité en worldedit: La partie déclencheurs sauf le GUI.


MessagePosté le: 17/07/09 04:14    Sujet du message: Citer

Map de démo : test bj_wantDestroyGroup.w3x

Tu as oublié une différence... je suppose que tes 12 fantassins doivent appartenir au joueur rouge.
_________________
Maximaxou@northrend

Projet Max Escape Creation (éditeur d'escapes : mazes/slides) : http://max.slid.free.fr/maxEscapeCreation/
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 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: 17/07/09 16:56    Sujet du message: Citer

Max a écrit:
Tu as oublié une différence... je suppose que tes 12 fantassins doivent appartenir au joueur rouge.

"Tu n'as pas deviné " convient mieux,
Étrange je ne loop que sur les unités du joueur rouge, quel que soit le joueur que je choisisse d'incarner et le nombre de fantassins.

Et en effet ne pas utiliser le custom script mais utiliser une variable résout le problème, strange very strange.
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 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: 17/07/09 18:56    Sujet du message: Citer

*Musique d'X-file*

La vérité est ailleurs Exclamation

Fonctions gui modifiées pour afficher du texte

Jass:
function GetUnitsOfTypeIdAllFilter2 takes nothing returns boolean
    call BJDebugMsg("evaluated")
    return GetUnitTypeId(GetFilterUnit()) == bj_groupEnumTypeId
endfunction

function GetUnitsOfTypeIdAll2 takes integer unitid returns group
    local group   result = CreateGroup()
    local group   g      = CreateGroup()
    local integer index
    local unit u = CreateUnit(Player(0),'hpea',0.,0.,0.)

    call BJDebugMsg("GetUnitsOfTypeIdAll2")
    set index = 0
    loop
        set bj_groupEnumTypeId = unitid
        call GroupClear(g)
        call BJDebugMsg(I2S(index))
        call GroupAddUnit(g,u)
        if IsUnitInGroup(u,g) then
            call BJDebugMsg("added")
        else
            call BJDebugMsg("not added")
        endif
        call GroupRemoveUnit(g,u)
       
        call GroupEnumUnitsOfPlayer(g, Player(index), Filter(function GetUnitsOfTypeIdAllFilter2))
        if bj_wantDestroyGroup == true then
            call BJDebugMsg("wtf ?!")
        else
            call BJDebugMsg("normal")
        endif
       
        call GroupAddGroup(g, result)

        set index = index + 1
        exitwhen index == bj_MAX_PLAYER_SLOTS
    endloop
    call DestroyGroup(g)
    call BJDebugMsg("destroyed")
    call RemoveUnit(u)

    return result
endfunction

function ForGroupBJ2 takes group whichGroup, code callback returns nothing
    // If the user wants the group destroyed, remember that fact and clear
    // the flag, in case it is used again in the callback.
    local boolean wantDestroy = bj_wantDestroyGroup
    set bj_wantDestroyGroup = false

    call BJDebugMsg("ForGroup")
    if bj_wantDestroyGroup == true then
        call BJDebugMsg("bj == true ?!!!!!")
    else
        call BJDebugMsg("bj == normal ")
    endif
   
    call ForGroup(whichGroup, callback)
    call BJDebugMsg("FG2")

    // If the user wants the group destroyed, do so now.
    if (wantDestroy) then
        call DestroyGroup(whichGroup)
    endif
endfunction


trigger de test :

Jass:
function Trig_test_Func003Func001Func003C takes nothing returns boolean
    if ( not ( GetTerrainTypeBJ(udg_heroLoc) == 'Ldrt' ) ) then
        return false
    endif
    return true
endfunction

function Trig_test_Func003Func001C takes nothing returns boolean
    if ( not ( IsUnitAliveBJ(GetEnumUnit()) == true ) ) then
        return false
    endif
    return true
endfunction

function Trig_test_Func003A takes nothing returns nothing
    if ( Trig_test_Func003Func001C() ) then
        call DisplayTextToForce( GetPlayersAll(), "TRIGSTR_006" )
        set udg_heroLoc = GetUnitLoc(GetEnumUnit())
        if ( Trig_test_Func003Func001Func003C() ) then
            call DisplayTextToForce( GetPlayersAll(), "TRIGSTR_007" )
            set udg_heroNewLoc = PolarProjectionBJ(udg_heroLoc, 256, GetUnitFacing(GetEnumUnit()))
            call SetUnitPositionLoc( GetEnumUnit(), udg_heroNewLoc )
            call RemoveLocation(udg_heroNewLoc)
        else
        endif
        call RemoveLocation(udg_heroLoc)
    else
    endif
    call DisplayTextToForce( GetPlayersAll(), "TRIGSTR_001" )
    call DisplayTextToForce( GetPlayersAll(), GetPlayerName(GetOwningPlayer(GetEnumUnit())) )
endfunction

function Trig_test_Actions takes nothing returns nothing
    call DisplayTextToForce( GetPlayersAll(), "test" )
    set bj_wantDestroyGroup = true
    call ForGroupBJ2( GetUnitsOfTypeIdAll2('hfoo'), function Trig_test_Func003A )
endfunction

//===========================================================================
function InitTrig_test takes nothing returns nothing
    set gg_trg_test = CreateTrigger(  )
    call TriggerRegisterPlayerEventEndCinematic( gg_trg_test, Player(0) )
    call TriggerRegisterPlayerEventEndCinematic( gg_trg_test, Player(7) )
    call TriggerAddAction( gg_trg_test, function Trig_test_Actions )
endfunction


"ForGroup" s'affiche après "GetUnitsOfTypeIdAll2" Confused Shocked Surprised Exclamation Question
Ce qui fait que dans l'enum du group bj_wantDestroyGroup est encore égal à true, et au premier GroupAddGroup le groupe g est détruit ...
Et donc seules les unités du joueur rouge (Player(0)) sont énumérés.

Moi pas comprendre pourquoi les fonctions sont appelées dans cet ordre ...
Faudra que je fasses plus de tests à ce propos.
_________________
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
Aller à la page 1, 2  Suivante
Page 1 sur 2
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