online faq recherche accueil
 

Il y a 173 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici

 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet :

[Map] Russian Roulette v1.1.0

 
n°4590815
Jihnn
Soccer addicted
Posté le 07-08-2007 à 05:31:22  profilanswer
 

Plop,
 
Voilà, je me suis remis au mapmaking et j'ai terminé une petite map aujourd'hui (petite, c'est le cas de le dire, 32x32 :whistle:)
 
C'est basé sur le jeu de la roulette russe (si vous savez pas ce que c'est, google!). J'aimerais avoir vos avis vis à vis les triggers (en JASS). Si vous avez envie de la jouer, allez-y ! J'ai testé un peu seul (C'est pas super joué à la roulette russe seul, 'faudrait appeler ça "suicide" :o) et ça a l'air de fonctionner, si vous trouvez des bugs, j'essaierai de les fixer :D
 
Todo List
- Système de compte à rebours pour éviter les AFK
- Euh, pas grand chose d'autre :ack:
 
Russian Roulette v1.1.0
 
Jihnn


---------------
[:aaltar:2] Eneth - Balance [:aaltar:5] Danite - Frost
Blizzware.com : Site de news à propos des jeux de Blizzard Entertainment.
n°4590816
Kuchiki By​akuya
Stfu.
Posté le 07-08-2007 à 06:00:02  profilanswer
 

Bon retour parmis nous... enfin parmis la confrérie des MM.
 
Je testerai ta map dès que je rentrerai chez moi (je suis joueur, j'aime la roulette russe :evil: )


Message édité par Kuchiki Byakuya le 07-08-2007 à 06:00:14
n°4590826
Jihnn
Soccer addicted
Posté le 08-08-2007 à 03:48:04  profilanswer
 

Merci :)

 

Selon le message de Troll-Brain sur l'autre topic, il y aurait moyen de faire quelque chose de mieux que 8 triggers "Roll <Color>" avec GetLocalPlayer().
Est-ce que ceci ferait l'affaire ?

 
Code :
  1. function Trig_Roll_Actions takes nothing returns nothing
  2.     if (GetPlayerId( GetLocalPlayer() ) == udg_CurrentPlayer) then
  3.         set udg_CurrentSlot = GetRandomInt( 1, 8 )
  4.         call DisplayTimedTextToPlayer( GetLocalPlayer(), 0, 0, 5, "Container has been rolled by "+ GetPlayerName( GetLocalPlayer() ) +"!" )
  5.     endif
  6. endfunction
  7. //===========================================================================
  8. function InitTrig_Roll takes nothing returns nothing
  9.     set gg_trg_Roll = CreateTrigger(  )
  10.     call TriggerRegisterPlayerChatEvent( gg_trg_Roll, GetLocalPlayer(), "-roll", true )
  11.     call TriggerAddAction( gg_trg_Roll, function Trig_Roll_Actions )
  12. endfunction
 

Le problème, cette fois, c'est que je ne sais pas comment activer le déclencheur seulement pour un seul joueur (celui dont c'est le tour).
Je vais continuer à chercher, si vous avez une solution, faites-m'en part!

 

Edit: Bah en fait c'était pas vraiment plus dûr :ack:, le code est édité. 'faut maintenant que je trouve un moyen pour optimiser le trigger "Choose Player" (vraiment long je trouve)
Edit²: Hop, arrangé ça en supprimmant complètement Choose Player :ack:. Voici maintenant l'autre trigger, Release, qui devrait remplacer l'autre.

Code :
  1. function Trig_Release_Actions takes nothing returns nothing
  2.     local unit peon = gg_unit_hpea_0000
  3.     if (GetPlayerId( GetLocalPlayer() ) == udg_CurrentPlayer) then
  4.         if (udg_CurrentSlot==udg_Bullet) then
  5.             call SetUnitExploded( peon, true )
  6.             call KillUnit( peon )
  7.             call DisplayTimedTextToPlayer( GetLocalPlayer(), 5, GetPlayerName( GetLocalPlayer() )+" has died! Adding a new bullet..." )
  8.             call ForceRemovePlayer( udg_Players, GetLocalPlayer() )
  9.             set udg_Bullet=GetRandomInt( 1, 8 )
  10.             // Pas sûr du tout de ce if...
  11.             if (CountPlayersInForceBJ( udg_Players ) > 1) then
  12.                 call CustomDefeatBJ( GetLocalPlayer(), "You died!" )
  13.             else
  14.                 call CustomVictoryBJ( GetLocalPlayer(), true, true )
  15.             endif
  16.         else
  17.             set udg_CurrentSlot=udg_CurrentSlot+1
  18.             if (udg_CurrentSlot > 8) then
  19.                 set udg_CurrentSlot=1
  20.             endif
  21.             call DisplayTimedTextToPlayer( GetLocalPlayer(), 5, GetPlayerName( GetLocalPlayer() )+" didn't die. Let's hope the next player has as much luck as him!" )
  22.         endif
  23.        
  24.         set udg_CurrentPlayer = udg_CurrentPlayer + 1
  25.        
  26.         if (udg_CurrentPlayer > 7) then
  27.             set udg_CurrentPlayer = 0
  28.         endif
  29.        
  30.         loop
  31.             exitwhen (GetPlayerSlotState( Player(udg_CurrentPlayer) ) == PLAYER_SLOT_STATE_PLAYING)
  32.             set udg_CurrentPlayer = udg_CurrentPlayer + 1
  33.         endloop
  34.        
  35.         call DisplayTimedTextToPlayer( GetLocalPlayer(), 5, "It's now "+GetPlayerName( Player(udg_CurrentPlayer) )+"'s turn!" )
  36.     endif
  37.    
  38.     set peon = null
  39. endfunction
  40. //===========================================================================
  41. function InitTrig_Release takes nothing returns nothing
  42.     set gg_trg_Release = CreateTrigger(  )
  43.     call TriggerRegisterPlayerChatEvent( gg_trg_Release, GetLocalPlayer(), "-release", true )
  44.     call TriggerAddAction( gg_trg_Release, function Trig_Release_Actions )
  45. endfunction
 

J'aimerais savoir si ces deux triggers fonctionneront (théoriquement) puisque je ne peux pas vraiment essayer seul (je ne peux pas hoster non plus et je n'ai pas d'amis qui jouent encore à W3) :ack:

 

Et enfin, pour mon pûr plaisir, Choose Trigger comportait 104 lignes à lesquelles il fallait ajouter toutes celles des autres triggers "Release <color>", maintenant, celui-là ne demande que 48 lignes :D

 

Edit³: Comme World Edit plante quand j'essaie de sauvegarder (lors de la sauvegarde du script justement), j'imagine qu'il y a un problème. J'vais essayer de trouver, si vous voyez pas un autre édit, libre à vous de m'aider :D


Message édité par Jihnn le 08-08-2007 à 04:46:44

---------------
[:aaltar:2] Eneth - Balance [:aaltar:5] Danite - Frost
Blizzware.com : Site de news à propos des jeux de Blizzard Entertainment.
n°4590827
lunatique
Posté le 08-08-2007 à 03:54:53  profilanswer
 

Fait attention avec GetLocalPlayer(), si mal utilisé, tu peux créer une désynchronisation sur battle.net, déconnectant ainsi les joueurs.

n°4590828
Jihnn
Soccer addicted
Posté le 08-08-2007 à 04:33:23  profilanswer
 

Ok merci, donc à la lecture de ton message, j'imagine que j'utilise mal GetLocalPlayer() ?
Pourrais-tu m'aider, je suis débordé :ack:

 

J'ai trouvé un des problèmes : DisplayTimedTextToPlayer demande plus d'arguments que DisplayedTimedTextToForce, bref je vais chercher sur google les autres arguments parce que "x" et "y" comme nom, en sachant que ce sont des réels, ça m'aident pas trop :ack:
Je pense tout de suite à des coordonnées, mais des coordonnées de quoi ? L'emplacement du message sur l'écran ? Ça fait bizarre :ack:

 

Edit: Nouveau problème : Comment différencier, avec les triggers plus haut, quelle unité il faut supprimer ? Si c'était possible de faire une fonction du genre S2U (U voulant dire unité), ce serait super :ack:, mais je doute que ça existe :(
Edit²: Voilà, les problèmes des triggers ont été corrigés (rien de trop bête (enfin si) : j'ai utilisé la variable "udg_Custom_Player" alors que le vrai non était "udg_CustomPlayer" et j'ai utilisé le nom de fonctions d'initialisation des anciens triggers (copié/collé, c'est le mal))

 

Mon principal problème est donc l'explosion de l'unité du joueur. Je sais pas trop comment faire, si ça peut vous aider chaque joueur n'a qu'une seule unité

 

Edit³: La solution à laquelle j'ai pensé serait d'utiliser un array, ça doit être le moyen le plus facile


Message édité par Jihnn le 08-08-2007 à 04:50:48

---------------
[:aaltar:2] Eneth - Balance [:aaltar:5] Danite - Frost
Blizzware.com : Site de news à propos des jeux de Blizzard Entertainment.
n°4590829
lunatique
Posté le 08-08-2007 à 04:56:43  profilanswer
 

Si les unités sont créé à l'initialisation (sont déjà présent sur ta map quand tu l'enregistre), ils ont déjà une variable attaché à eux. Sinon, au moment où tu les créé, soit tu les attaches à une variable globale, soit tu les attache au game cache. Sache que les variables globales sont plus rapides (nanosecondes) que le game cache. L'utilisation du game cache n'est donc pas à prioriser dans ce cas.
 
Habituellement on utilise des fonctions comme ça avec GetLocalPlayer()
 
function DoNothingForPlayer takes player Joueur returns nothing
 if GetLocalPlayer()==Joueur then
    call DoNothing()
 endif
endfunction

n°4590830
Jihnn
Soccer addicted
Posté le 08-08-2007 à 04:59:17  profilanswer
 

Je suis plus ou moins sûr d'avoir compris ta fonction. Bref, il faut tester si GetLocalPlayer() est le joueur en question (celui avec lequel on veut effectuer une action), mais si c'est le cas, quelle est l'utilité ? Je veux dire, qu'est-ce qu'on gagne à effectuer directement l'action avec GetLocalPlayer ou le joueur en question ?
Aussi, tu dis que si les unités sont déjà créées (ce qui est le cas sur ma map), elle ont une variable globale. Qu'elle est-elle ?
En regardant le war3map.j de ma carte, seule une unité se voit obtenir une variable globale, le reste, ce sont des locales.

 

Je vais créer une copie de ma map et la bidouiller un peu pour voir si je peux utiliser une de mes propres variables globales

 

Edit²: Effectivement, ça a eu l'air de marcher. Maintenant, 'faudrait seulement que je test. Je vais updater la nouvelle version de la map et la mettre en téléchargement, attendant ainsi vos nouveaux commentaires!

 

Lien retiré
Nota: La map requiert à présent l'utilisation de l'extension (array)

 

Je viens de voir que le .j n'a pas été modifié correctement. Je le retouche et je re-upload

 

En fait, j'ai pas trouvé comment changer le war3map.j de la map avec mon war3map.j perso. J'utilise WinMPQ, j'ouvre le fichier .w3x, je supprime le .j, je fais "Add Files" et j'ajoute le mien. Y a-t-il une autre manipulation après ?


Message édité par Jihnn le 08-08-2007 à 05:33:50

---------------
[:aaltar:2] Eneth - Balance [:aaltar:5] Danite - Frost
Blizzware.com : Site de news à propos des jeux de Blizzard Entertainment.
n°4590832
lunatique
Posté le 08-08-2007 à 08:48:37  profilanswer
 

Toutes les unités ont une variables globales. Je ne me rappel plus exactement de la syntax mais c'est comme les régions; gg_rtc_nomdetarégion = une région déjà sur ta map. De mémoire, c'est un truc du genre gg_'A00S'_0001. où 'A00S' représente l'ID de l'unité. Pour trouver cela, fait un déclencheur bidon, fait comme condition une condition bidon avec unit comparison, choisi ton unité avec "choisir une unité", ensuite fait "transformer en texte" ton déclo, et tu va voir apparaître ton unité en variable globale.

n°4590836
Jihnn
Soccer addicted
Posté le 08-08-2007 à 15:01:57  profilanswer
 

Oui, c'est gg_unt_hpea_000X.
Mais une seule n'est créée, je comprends pas trop pourquoi (en regardant le .j)


---------------
[:aaltar:2] Eneth - Balance [:aaltar:5] Danite - Frost
Blizzware.com : Site de news à propos des jeux de Blizzard Entertainment.
n°4590838
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 08-08-2007 à 17:38:06  profilanswer
 

pour utiliser tes propres globales sans passer par l'éditeur de variable, utilise we helper ou mieux télecharge le jassnewgenpack sur wc3campaigns.net et lit la doc associé.
Ca t'évitera notament les crashs du à une erreur de script lors de la sauvegarde
sinon y'a des fonctions en jass sur le forum worldedit pour t'aider à comprendre comment fonctionne GetLocalPlayer()
Mais il ne faut surtout pas faire une action pour un joueur seulement , du genre run trigger pour un seul joueur, car cela désynchronisera.
 
sinon pour les unités une variable globale est déclarée pour l'unité placée sur la map uniquement si on la sélectionne via l'éditeur de déclencheur.
Tu as du déjà remarqué d'ailleurs que la liste de choix des unités est au départ vide puis augmente au fur et à mesure des sélections
 
 


---------------
Je ne prends que sur rendez vous.
Assurez vous d'avoir un moyen de paiement conséquent, et de préférence en liquide, avant de me quémander la moindre question.
 
n°4590842
Jihnn
Soccer addicted
Posté le 08-08-2007 à 17:55:05  profilanswer
 

J'y ai pensé mais je me suis dit que ça pouvait pas être ça :ack:
 
Merci :)


---------------
[:aaltar:2] Eneth - Balance [:aaltar:5] Danite - Frost
Blizzware.com : Site de news à propos des jeux de Blizzard Entertainment.
n°4590844
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 08-08-2007 à 18:36:57  profilanswer
 

Jihnn a écrit :

J'y ai pensé mais je me suis dit que ça pouvait pas être ça :ack:
 
Merci :)


 
Au lieu de tester pensivement , pense à tester  :D  
 


---------------
Je ne prends que sur rendez vous.
Assurez vous d'avoir un moyen de paiement conséquent, et de préférence en liquide, avant de me quémander la moindre question.
 
n°4590856
Jihnn
Soccer addicted
Posté le 10-08-2007 à 05:50:39  profilanswer
 

Nouveau problème :

 

J'ai utilisé les compétences pour la première fois. Bref, après plusieurs tests (autant en JASS qu'en GUI), et après avoir pensé réussir quelque chose de potable, voici mes deux triggers :

 

Roll

Code :
  1. function Trig_Roll_Conditions takes nothing returns boolean
  2.     if ( not ( GetSpellAbilityId() == 'A000' ) ) then
  3.         return false
  4.     endif
  5.     return true
  6. endfunction
  7. function Trig_Roll_Actions takes nothing returns nothing
  8.     if (GetPlayerId( GetTriggerPlayer() ) == udg_CurrentPlayer) then
  9.         set udg_CurrentSlot = GetRandomInt( 1, 8 )
  10.         call DisplayTimedTextToPlayer( GetLocalPlayer(), 0, 0, 5, "Container has been rolled by "+ GetPlayerName( GetTriggerPlayer() ) +"!" )
  11.     endif
  12. endfunction
  13. //===========================================================================
  14. function InitTrig_Roll takes nothing returns nothing
  15.     set gg_trg_Roll = CreateTrigger(  )
  16.     call TriggerRegisterAnyUnitEventBJ( gg_trg_Roll, EVENT_PLAYER_UNIT_SPELL_CAST )
  17.     call TriggerAddCondition( gg_trg_Roll, Condition( function Trig_Roll_Conditions ) )
  18.     call TriggerAddAction( gg_trg_Roll, function Trig_Roll_Actions )
  19. endfunction
 

Release

Code :
  1. function Trig_Release_Conditions takes nothing returns boolean
  2.     if ( not ( GetSpellAbilityId() == 'A001' ) ) then
  3.         return false
  4.     endif
  5.     return true
  6. endfunction
  7. function Trig_Release_Actions takes nothing returns nothing
  8.    // Making sure it's the right player
  9.     if (GetPlayerId( GetTriggerPlayer() ) == udg_CurrentPlayer) then
  10.         // Is it the bullet, or not ?
  11.         if (udg_CurrentSlot==udg_Bullet) then
  12.             // It is, exploding the unit and killing it. Then, nullifying the variable to prevent leaks
  13.             call SetUnitExploded( udg_Peons[udg_CurrentPlayer], true )
  14.             call KillUnit( udg_Peons[udg_CurrentPlayer] )
  15.             set udg_Peons[udg_CurrentPlayer] = null
  16.             call DisplayTimedTextToPlayer( GetLocalPlayer(), 0, 0, 5, GetPlayerName( GetLocalPlayer() )+" has died! Adding a new bullet..." )
  17.            
  18.             // Remove the player from the force
  19.             call ForceRemovePlayer( udg_Players, GetLocalPlayer() )
  20.             // Checking numbers of players in force
  21.             if (CountPlayersInForceBJ( udg_Players ) > 1) then
  22.                 call CustomDefeatBJ( GetLocalPlayer(), "You died!" )
  23.             else
  24.                 call CustomVictoryBJ( GetLocalPlayer(), true, true )
  25.             endif
  26.             // Randoming the bullet slot
  27.             set udg_Bullet=GetRandomInt( 1, 8 )
  28.         else
  29.             // The player released on an empty slot
  30.             set udg_CurrentSlot=udg_CurrentSlot+1
  31.             if (udg_CurrentSlot > 8) then
  32.                 set udg_CurrentSlot=1
  33.             endif
  34.             // Removing abilities, so the player doesn't spam them when it's not his turn
  35.             call DisplayTimedTextToPlayer( GetLocalPlayer(), 0, 0, 5, GetPlayerName( GetLocalPlayer() )+" didn't die. Let's hope the next player has as much luck as him!" )
  36.             call UnitRemoveAbility( udg_Peons[ udg_CurrentPlayer ], 'A000' )
  37.             call UnitRemoveAbility( udg_Peons[ udg_CurrentPlayer ], 'A001' )
  38.         endif
  39.        
  40.         /////////////////
  41.         // Next Player //
  42.         /////////////////
  43.         set udg_CurrentPlayer = udg_CurrentPlayer + 1
  44.      
  45.         // Make sure the next player exists
  46.         if (udg_CurrentPlayer > 7) then
  47.             set udg_CurrentPlayer = 0
  48.         endif
  49.      
  50.         // Make sure the next player is playing
  51.         loop
  52.             exitwhen (GetPlayerSlotState( Player(udg_CurrentPlayer) ) == PLAYER_SLOT_STATE_PLAYING)
  53.             set udg_CurrentPlayer = udg_CurrentPlayer + 1
  54.             if ( udg_CurrentPlayer > 7) then
  55.                 set udg_CurrentPlayer = 0
  56.             endif
  57.         endloop
  58.         // Adding abilities to the peon
  59.         call UnitAddAbility( udg_Peons[ udg_CurrentPlayer ], 'A000' )
  60.         call UnitAddAbility( udg_Peons[ udg_CurrentPlayer ], 'A001' )
  61.    
  62.         call DisplayTimedTextToPlayer( GetLocalPlayer(), 0, 0, 5, "It's now "+GetPlayerName( Player(udg_CurrentPlayer) )+"'s turn!" )
  63.     endif
  64. endfunction
  65. //===========================================================================
  66. function InitTrig_Release takes nothing returns nothing
  67.     set gg_trg_Release = CreateTrigger(  )
  68.     call TriggerRegisterAnyUnitEventBJ( gg_trg_Release, EVENT_PLAYER_UNIT_SPELL_CAST )
  69.     call TriggerAddCondition( gg_trg_Release, Condition( function Trig_Release_Conditions ) )
  70.     call TriggerAddAction( gg_trg_Release, function Trig_Release_Actions )
  71. endfunction
 

Le problème : Peu importe le spell que j'utilise, les deux triggers sont déclenchés. Je comprends pas pourquoi, et je me réfère une fois de plus ici :)

 

Merci d'avance,

 

Jihnn


Message édité par Jihnn le 10-08-2007 à 05:50:52

---------------
[:aaltar:2] Eneth - Balance [:aaltar:5] Danite - Frost
Blizzware.com : Site de news à propos des jeux de Blizzard Entertainment.
n°4590857
lunatique
Posté le 10-08-2007 à 10:38:34  profilanswer
 

Code :
  1. function Trig_Roll_Conditions takes nothing returns boolean
  2. return GetSpellAbilityId() == 'A000'
  3. endfunction
  4. function Trig_Roll_Actions takes nothing returns nothing
  5.     if (GetPlayerId(GetOwningPlayer(GetSpellAbilityUnit())) == udg_CurrentPlayer) then
  6.         set udg_CurrentSlot = GetRandomInt( 1, 8 )
  7.         call DisplayTimedTextToPlayer(GetOwningPlayer(GetSpellAbilityUnit()), 0, 0, 5, "Container has been rolled by "+ GetPlayerName(GetOwningPlayer(GetSpellAbilityUnit())) +"!" )
  8.     endif
  9. endfunction
  10. //===========================================================================
  11. function InitTrig_Roll takes nothing returns nothing
  12.     set gg_trg_Roll = CreateTrigger(  )
  13.     call TriggerRegisterAnyUnitEventBJ( gg_trg_Roll, EVENT_PLAYER_UNIT_SPELL_CAST )
  14.     call TriggerAddCondition( gg_trg_Roll, Condition( function Trig_Roll_Conditions ) )
  15.     call TriggerAddAction( gg_trg_Roll, function Trig_Roll_Actions )
  16. endfunction


 
Release

Code :
  1. function Trig_Release_Conditions takes nothing returns boolean
  2. return GetSpellAbilityId() == 'A001'
  3. endfunction
  4. function Trig_Release_Actions takes nothing returns nothing
  5.    // Making sure it's the right player
  6.     if (GetPlayerId(GetOwningPlayer(GetSpellAbilityUnit())) == udg_CurrentPlayer) then
  7.         // Is it the bullet, or not ?
  8.         if (udg_CurrentSlot==udg_Bullet) then
  9.             // It is, exploding the unit and killing it. Then, nullifying the variable to prevent leaks
  10.             call SetUnitExploded( udg_Peons[udg_CurrentPlayer], true )
  11.             call KillUnit( udg_Peons[udg_CurrentPlayer] )
  12.             set udg_Peons[udg_CurrentPlayer] = null
  13.             call DisplayTimedTextToPlayer(GetOwningPlayer(GetSpellAbilityUnit()), 0, 0, 5, GetPlayerName(GetOwningPlayer(GetSpellAbilityUnit()))+" has died! Adding a new bullet..." )
  14.            
  15.             // Remove the player from the force
  16.             call ForceRemovePlayer( udg_Players,GetOwningPlayer(GetSpellAbilityUnit()))
  17.             // Checking numbers of players in force
  18.             if (CountPlayersInForceBJ( udg_Players ) > 1) then
  19.                 call CustomDefeatBJ(GetOwningPlayer(GetSpellAbilityUnit()), "You died!" )
  20.             else
  21.                 call CustomVictoryBJ(GetOwningPlayer(GetSpellAbilityUnit()), true, true )
  22.             endif
  23.             // Randoming the bullet slot
  24.             set udg_Bullet=GetRandomInt( 1, 8 )
  25.         else
  26.             // The player released on an empty slot
  27.             set udg_CurrentSlot=udg_CurrentSlot+1
  28.             if (udg_CurrentSlot > 8) then
  29.                 set udg_CurrentSlot=1
  30.             endif
  31.             // Removing abilities, so the player doesn't spam them when it's not his turn
  32.             call DisplayTimedTextToPlayer(GetOwningPlayer(GetSpellAbilityUnit()), 0, 0, 5, GetPlayerName(GetOwningPlayer(GetSpellAbilityUnit()))+" didn't die. Let's hope the next player has as much luck as him!" )
  33.             call UnitRemoveAbility( udg_Peons[ udg_CurrentPlayer ], 'A000' )
  34.             call UnitRemoveAbility( udg_Peons[ udg_CurrentPlayer ], 'A001' )
  35.         endif
  36.        
  37.         /////////////////
  38.         // Next Player //
  39.         /////////////////
  40.         set udg_CurrentPlayer = udg_CurrentPlayer + 1
  41.      
  42.         // Make sure the next player exists
  43.         if (udg_CurrentPlayer > 7) then
  44.             set udg_CurrentPlayer = 0
  45.         endif
  46.      
  47.         // Make sure the next player is playing
  48.         loop
  49.             exitwhen (GetPlayerSlotState( Player(udg_CurrentPlayer) ) == PLAYER_SLOT_STATE_PLAYING)
  50.             set udg_CurrentPlayer = udg_CurrentPlayer + 1
  51.             if ( udg_CurrentPlayer > 7) then
  52.                 set udg_CurrentPlayer = 0
  53.             endif
  54.         endloop
  55.         // Adding abilities to the peon
  56.         call UnitAddAbility( udg_Peons[ udg_CurrentPlayer ], 'A000' )
  57.         call UnitAddAbility( udg_Peons[ udg_CurrentPlayer ], 'A001' )
  58.    
  59.         call DisplayTimedTextToPlayer(GetOwningPlayer(GetSpellAbilityUnit()), 0, 0, 5, "It's now "+GetPlayerName( Player(udg_CurrentPlayer) )+"'s turn!" )
  60.     endif
  61. endfunction
  62. //===========================================================================
  63. function InitTrig_Release takes nothing returns nothing
  64.     set gg_trg_Release = CreateTrigger(  )
  65.     call TriggerRegisterAnyUnitEventBJ( gg_trg_Release, EVENT_PLAYER_UNIT_SPELL_CAST )
  66.     call TriggerAddCondition( gg_trg_Release, Condition( function Trig_Release_Conditions ) )
  67.     call TriggerAddAction( gg_trg_Release, function Trig_Release_Actions )
  68. endfunction


 
Voilà j'ai essayé d'optimiser ton code car y'avais des trucs sans sens. Premièrement l'utilisation de ton GetLocalPlayer() n'a aucune utilité et je ne vois pas comment l'ordi peut deviner qui est le joueur car tu ne lui donne pas de valeurs à qui se reférer. Deuxièmement, GetTriggeringPlayer(), comme dit dans un message précédent, c'est un "Event Response", une réponse à un événement. Du style, un joueur qui la partie, un joueur tappe un message, un joueur [...], pas une unité initie l'effet d'une compétence, un joueur.
 
Donc je l'ai remplacé par GetOwningPlayer(GetSpellAbilityUnit()) qui renvoie la personne détenant l'unité ayant lancé la compétence.
 
Deuxièmement, les conditions déjàs préfait par l'éditeur sont parfois non optimisés. Une fonction du style :
 
function Condition takes nothing returns boolean
 return true
endfunction
 
renvoie true ou false. Pour renvoyer true, ce qui fait que la fonction s'exécute, tu n'a qu'à mettre return GetSpellAbility == 'TONCODE' à la place de faire if then, else, endif.  
 
Sinon DisplayTimedTextToPlayer renvoieun teste pour un seul joueur. Si tu veux l'envoyer à tous les joueurs utilise plutôt DisplayTimedTextToForce qui est dans le fond la même fonction mais avec un GetLocalPlayer().
 

Code :
  1. function DisplayTimedTextToForce takes force toForce, real duration, string message returns nothing
  2.     if (IsPlayerInForce(GetLocalPlayer(), toForce)) then
  3.         // Use only local code (no net traffic) within this block to avoid desyncs.
  4.         call DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, duration, message)
  5.     endif
  6. endfunction


 

n°4590858
Jihnn
Soccer addicted
Posté le 10-08-2007 à 15:47:04  profilanswer
 

Pour le deuxième trigger (release, j'y ai pensé que ce matin) : je ne l'avais pas modifié par rapport au premier, j'y avais seulement ajouté la condition.

 

Ensuite, j'avais testé GetTriggerPlayer(), ça m'avait l'air de fonctionner, tant pis alors ^^

 

Et tu parles de DisplayTimedTextToForce, pourquoi l'utiliser par rapport à DisplayTimedTextToPlayer avec GetLocalPlayer() ? Je n'y vois pas d'avantages, à moins justement qu'il ne faille qu'envoyer le message à un groupe en particulier.
Edit: Ah, peut-être qu'avec tous les GetLocalPlayer, tu as pensé que je voulais envoyer le message seulement à un joueur, ben en fait, c'est plutôt à tout le monde ^^ /finedit

 

Bref, merci bien, je vais regarder tout ça et essayer d'apprendre de mes erreurs ^^

 

Edit²: Même en changeant le code, ça execute toujours les deux triggers. Je vais vous passer la map, c'est peut-être un problème avec les sorts (comme je l'ai dit avant, première fois que je les utilisais)
Lien: Russian Roulette v1.1.5

 

Edit³: J'ai trouvé le problème : j'avais utilisé le même sort de base. C'est quand même bizarre...


Message édité par Jihnn le 10-08-2007 à 16:31:38

---------------
[:aaltar:2] Eneth - Balance [:aaltar:5] Danite - Frost
Blizzware.com : Site de news à propos des jeux de Blizzard Entertainment.
n°4590859
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 10-08-2007 à 16:33:19  profilanswer
 

Je ne suis pas d'accord avec Watterly l'event unité générique est à part des autres événements.
GetTriggeringPlayer renvoie bien le bon joueur.
Car voici comment est faite la fonction qui enregistre l'évènement :

Code :
  1. function TriggerRegisterAnyUnitEventBJ takes trigger trig, playerunitevent whichEvent returns nothing
  2.     local integer index
  3.     set index = 0
  4.     loop
  5.         call TriggerRegisterPlayerUnitEvent(trig, Player(index), whichEvent, null)
  6.         set index = index + 1
  7.         exitwhen index == bj_MAX_PLAYER_SLOTS
  8.     endloop
  9. endfunction


 
Ensuite si on veut afficher un message pour tous les joueurs c'est totally useless d'utiliser le DisplayTextToForce.
Le DisplayTextToPlayer associé au GetLocalPlayer est plus efficace et pas besoin de gestion de leak car on ne créé pas de groupe
 
PS: Par contre en effet avec un evenement unite spécifique GetTriggeringPlayer ne renvoie rien car ce n'est pas un event de joueur


---------------
Je ne prends que sur rendez vous.
Assurez vous d'avoir un moyen de paiement conséquent, et de préférence en liquide, avant de me quémander la moindre question.
 
n°4590860
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 10-08-2007 à 16:36:20  profilanswer
 

Ah oui tu ne peux utiliser en même temps plusieurs sort basés sur le même sort.
A cause des ordres.
Le fait de changer les texte ordres ne change rien, sauf pour le sort cannaliser 'ANcl'


---------------
Je ne prends que sur rendez vous.
Assurez vous d'avoir un moyen de paiement conséquent, et de préférence en liquide, avant de me quémander la moindre question.
 
n°4590863
lunatique
Posté le 11-08-2007 à 08:45:39  profilanswer
 

Ah j'avais pas vu que c'était RegisterPlayerUnit, je suis trop habitué à specific unit event. Dls mon erreur xD.

n°4590864
Troll-Brai​n
http://worldedit.free.fr/forum
Posté le 11-08-2007 à 12:58:26  profilanswer
 

Escuces rejetées la fonction était clairement une non native (BJ), et puis je l'ai déjà dit plusieurs fois sur le forum worldedit  :D


Message édité par Troll-Brain le 11-08-2007 à 12:58:46

---------------
Je ne prends que sur rendez vous.
Assurez vous d'avoir un moyen de paiement conséquent, et de préférence en liquide, avant de me quémander la moindre question.
 
n°4590866
lunatique
Posté le 11-08-2007 à 18:48:05  profilanswer
 

Mais euh!!!!!!!!!! xD


Aller à :
Ajouter une réponse