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=421bdbfa8f64d525a1d237eceb620ab5Mé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

Optimisation: Alliance System

 
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: 22/01/10 12:08    Sujet du message: Optimisation: Alliance System Citer

Library qui permet de créer des alliances entre joueur par l'entrée d'une commande:

-ally XXXX
ou de lui déclarer la guerre
-unally XXXX

On a le droit à maximum 3 alliés.

Les terroristes et les aliens ne peuvent pas avoir d'alliés.

Nécessite:

TextDisplay
SoundUtils
JSDialog

Jass:
library AllianceSystem initializer init needs TextDisplay,SoundUtils,JSDialog,Table

globals
    private constant string ALLY_COMMAND = "-ally"
    private constant string UNALLY_COMMAND = "-unally"
    string array AllianceAlt1 [12]
    string array AllianceAlt2 [12]
    string array AllianceAlt3 [12]
    integer array PlayerAllies [12]
    private StringTable Str_table
    private integer AllyCommand_length
    private integer UnAllyCommand_length
endglobals

//! textmacro t__AllianceSystem_Init takes PLAYER_NUMBER , COMMAND
    // j'ai fait la textmacro en partant de l'hypothèse que pour la commande l'index minimum est 1 et non 0, comme les joueurs en gui
    set Str_table[I2S($PLAYER_NUMBER$)] = $PLAYER_NUMBER$
    set Str_table["$COMMAND$"] = $PLAYER_NUMBER$
    set Str_table[(GetPlayerName(Player($PLAYER_NUMBER$-1)))] = $PLAYER_NUMBER$ // si un joueur peut changer de nom en cours de partie, il faut effacer cette valeur et remplacer avec le nouveau nom du joueur
//! endtextmacro

    private function SetAlliancesVariables takes nothing returns nothing
            //! runtextmacro t__AllianceSystem_Init(" 1","red")
            //! runtextmacro t__AllianceSystem_Init(" 2","blue")
            //! runtextmacro t__AllianceSystem_Init(" 3","teal")
            //! runtextmacro t__AllianceSystem_Init(" 4","purple")
            //! runtextmacro t__AllianceSystem_Init(" 5","yellow")
            //! runtextmacro t__AllianceSystem_Init(" 6","orange")
            //! runtextmacro t__AllianceSystem_Init(" 7","green")
            //! runtextmacro t__AllianceSystem_Init(" 8","pink")
            //! runtextmacro t__AllianceSystem_Init(" 9","grey")
            //! runtextmacro t__AllianceSystem_Init(" 10","light blue")
            //! runtextmacro t__AllianceSystem_Init(" 11","dark green")
            //! runtextmacro t__AllianceSystem_Init(" 12","brown")
    endfunction

    private function SetAccept takes integer key , unit whichUnit, integer dialogInteger, string btnString, integer id returns nothing
            call DisplayTextToPlayer(Player(key),0.,0.,"You are now allied with "+PlayerColor[id]+GetPlayerName(Player(id)))
            call DisplayTextToPlayer(Player(id),0.,0.,"You are now allied with "+PlayerColor[key]+GetPlayerName(Player(key)))
            call RunSoundForPlayer(SOUND_HINT,Player(key))
            call RunSoundForPlayer(SOUND_HINT,Player(id))
            call SetPlayerAllianceStateBJ(Player(key),Player(id),bj_ALLIANCE_ALLIED_VISION)
            call SetPlayerAllianceStateBJ(Player(id),Player(key),bj_ALLIANCE_ALLIED_VISION)
            set PlayerAllies[key]=PlayerAllies[key]+1
            set PlayerAllies[id]=PlayerAllies[id]+1
    endfunction

    private function SetRefuse takes integer key , unit whichUnit, integer dialogInteger, string btnString, integer id returns nothing
            call RunSoundForPlayer(SOUND_ERROR,Player(key))
            call RunSoundForPlayer(SOUND_ERROR,Player(id))
            call DisplayTextToPlayer(Player(key),0.,0.,"You have refused to be allied with "+PlayerColor[id]+GetPlayerName(Player(id)))
            call DisplayTextToPlayer(Player(id),0.,0.,PlayerColor[key]+GetPlayerName(Player(key))+" has refused the alliance")
    endfunction
   
    private function IsPlayerIndexInvalid takes integer i returns boolean
        return Terrorist[i] or Alien[i]
    endfunction

    private function SetAlliance takes nothing returns boolean
        local player whichPlayer = GetTriggerPlayer()
        local integer whichPlayerId = GetPlayerId(whichPlayer)
        local string text = GetEventPlayerChatString()
        local integer string_length = StringLength(text)
        local integer index
   
        if IsPlayerIndexInvalid(whichPlayerId) then
            call ErrorSound(whichPlayer)
            call DisplayTextToPlayer(whichPlayer,0.,0.,"As Terrorist or Alien you can not ally anyone")
            return false //works only when player is not alien/terrorist
        endif
       
        if SubString(text,0,AllyCommand_length) == ALLY_COMMAND then
           
            set text = SubString(text,AllyCommand_length+1,string_length) // on extrait la commande après le "-ally" ou ce que tu as spécifié comme string pour l'alliance (ALLY_COMMAND)
            set index = Str_table[text] // récupération de l'index du joueur concerné
           
            if index == 0 then // commande invalide
           
                call ErrorSound(whichPlayer)
                call DisplayTextToPlayer(whichPlayer,0.,0.,"Invalide Player ID")
                set whichPlayer = null
                return false
               
            endif
            set index = index-1 // GUI style
           
            if IsPlayerIndexInvalid(index) then
           
                call ErrorSound(whichPlayer)
                call DisplayTextToPlayer(whichPlayer,0.,0.,PlayerColor[index]+GetPlayerName(Player(index))+"|r can not have allies.")
                set whichPlayer = null
                return false
               
            endif

            if not IsPlayerAlly(whichPlayer,Player(index)) then //if players not already allied
     
                if PlayerAllies[whichPlayerId]<3 then //if less than 3 allies, i don't care everybody <3 me
               
                    call Clear(index,PlayerColor[whichPlayerId]+GetPlayerName(whichPlayer)+"|r wants to ally you", null,0 )
                    call AddButton(index,"Accept", SetAccept, index, null, whichPlayerId)
                    call AddButton(index,"Refuse", SetRefuse, index, null, whichPlayerId)
                    call Show(index)

                else
               
                    call ErrorSound(whichPlayer)
                    call DisplayTextToPlayer(whichPlayer,0.,0.,"You have already 3 allies.")
                    set whichPlayer = null
                    return false

                endif
           
            else   //if players are already allied 
           
                call ErrorSound(whichPlayer)
                call DisplayTextToPlayer(whichPlayer,0.,0.,"You already are allied to "+PlayerColor[index]+GetPlayerName(Player(index)))
                set whichPlayer = null               
                return false
               
            endif
           
        elseif SubString(text,0,UnAllyCommand_length) == UNALLY_COMMAND then
       
            set text = SubString(text,UnAllyCommand_length+1,string_length) // on extrait la commande après le "-ally" ou ce que tu as spécifié comme string pour l'alliance (ALLY_COMMAND)
            set index = Str_table[text] // récupération de l'index du joueur concerné
           
            if index == 0 then // commande invalide
           
                call ErrorSound(whichPlayer)
                call DisplayTextToPlayer(whichPlayer,0.,0.,"Invalide Player ID")
                set whichPlayer = null
                return false
               
            endif
           
            set index = index-1 // GUI style
           
            if IsPlayerEnemy(whichPlayer,Player(index))==false then
           
                call SetPlayerAllianceStateBJ(whichPlayer,Player(index),bj_ALLIANCE_UNALLIED)
                call SetPlayerAllianceStateBJ(Player(index),whichPlayer,bj_ALLIANCE_UNALLIED)
                call DisplayTextToPlayer(Player(index),0.,0.,PlayerColor[whichPlayerId]+GetPlayerName(whichPlayer)+"|r has declared war to you")
                call DisplayTextToPlayer(whichPlayer,0.,0.,"You have declared the war to: "+PlayerColor[index]+GetPlayerName(Player(index)))                   
                call RunSoundForPlayer(SOUND_ALARM,Player(index))
                call RunSoundForPlayer(SOUND_ALARM,whichPlayer)
                set PlayerAllies[whichPlayerId]=PlayerAllies[whichPlayerId]-1
                set PlayerAllies[index]=PlayerAllies[index]-1
                set whichPlayer = null
                return false
               
            else
           
                call ErrorSound(whichPlayer)
                call DisplayTextToPlayer(whichPlayer,0.,0.,"You already are in war with "+PlayerColor[index]+GetPlayerName(Player(index)))
                set whichPlayer = null
                return false
               
            endif
           
        endif
       
        return false
// c'est vraiment trop la misère avec tes if j'ai passé plus d'1 heure pour en arriver jusque là !!!!!!
// j'ai arrêté les frais, mais je suppose que c'est suffisant
// NE LES IMBRIQUE PAS TANT QUE CELA OMG LAISSE LES RESPIRER ...
    endfunction

    private function init takes nothing returns nothing
        local trigger t = CreateTrigger()
        local integer i = 0
       
            set Str_table = StringTable.create()
            set AllyCommand_length = StringLength(ALLY_COMMAND)
            set UnAllyCommand_length = StringLength(UNALLY_COMMAND)
            call SetAlliancesVariables()
            loop
                exitwhen i > MAXPLAYER
                set PlayerAllies[i]=0
                call TriggerRegisterPlayerChatEvent( t, Player(i), ALLY_COMMAND, false )
                call TriggerRegisterPlayerChatEvent( t, Player(i), UNALLY_COMMAND, false )
                set i = i + 1
            endloop
            call TriggerAddCondition(t, Condition(function SetAlliance))
           
    endfunction   

endlibrary


Ce qui suit n'est plus d'actualité
Secret:

Note: j'utilise le système de dialogue de Profet.

Là c'est pareil, j'utilise des boucles à gogo. Vois-tu une manière d'améliorer ce déclencheur?
Il consiste, quand le joueur rentre une commande (ally/unally) à envoyer une proposition d'alliance au joueur cible (pour les non Alien/non Terroristes, vérifiés avec booléens). Si le joueur accepte, l'alliance est créée. Sinon il ne se passe rien.
Le joueur qui reçoit l'invitation de dialogue la reçoit sous forme de dialogues.
Un joueur ne peut avoir que trois alliés.

Ancienne version supprimée pour alléger la page


_________________


Dernière édition par jk2pach le 06/04/10 21:33; édité 5 fois
Revenir en haut
 jk2pach
Invité








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

Version Library

Nécessite:

TextDisplay
SoundUtils
JSDialog


Ancienne version supprimée pour alléger la page
_________________


Dernière édition par jk2pach le 21/03/10 12:10; édité 2 fois
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: 20/03/10 19:15    Sujet du message: Citer

"undeclared variable SOUND_ALARM"
_________________
Le violet, c'est moche.
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 jk2pach
Invité








MessagePosté le: 20/03/10 19:40    Sujet du message: Citer

Ah pardon c'est une pseudo-globale que j'utilise ailleurs.
Jass:
globals
integer SOUND_ALARM
endglobals


dans l'init de la library (édité pour les besoins du forum)
Jass:
set SOUND_ALARM = DefineSound("Alarm.mp3", 1463, false, false)

_________________
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: 20/03/10 21:41    Sujet du message: Citer

Ancienne version supprimée pour alléger la page
Notes :

- Lis tous les commentaires, et tant que nu n'auras pas des if/then lisibles comme les miens je ne regarderais pas tes autres codes.

- StringHash ne tient pas compte de la casse StringHash("string") == StringHash("sTrIng"), c'est plutôt utile dans ce cas ci.

- Désormais tu es autorisé à changer les constantes string pour les commande ally et unally sans devoir modifier le code.
_________________
Le violet, c'est moche.
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 jk2pach
Invité








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

Merci.

Je trouvais les if then else imbriqués plus faciles à lire vu qu'ils étaient décalées les uns par rapport aux autres.

Jass:
call s__StringTable__setindex(AllianceSystem__Str_table,StringHash("red"), 1)


Cannot convert interger to string. Il y en a une dizaine comme ça.

J'ai aussi rajouté deux endifs sur la fonction "principale" (la condition du déclencheur) et son return false.

(J'ai viré SOUND_ALARM vu qu'il existe déjà sur ma carte mais le principe reste pareil)
Ancienne version supprimée pour alléger la page
_________________


Dernière édition par jk2pach le 21/03/10 12:11; édité 1 fois
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: 20/03/10 22:22    Sujet du message: Citer

Autant pour moi, je n'ai pas besoin de StringHash (même si c'est utilisé par Table)

Jass:
//! textmacro t__AllianceSystem_Init takes PLAYER_NUMBER , COMMAND
    // j'ai fait la textmacro en partant de l'hypothèse que pour la commande l'index minimum est 1 et non 0, comme les joueurs en gui
    set Str_table[I2S($PLAYER_NUMBER$)] = $PLAYER_NUMBER$
    set Str_table["$COMMAND$"] = $PLAYER_NUMBER$
    set Str_table[(GetPlayerName(Player($PLAYER_NUMBER$-1)))] = $PLAYER_NUMBER$ // si un joueur peut changer de nom en cours de partie, il faut effacer cette valeur et remplacer avec le nouveau nom du joueur
//! endtextmacro


Citation:
trouvais les if then else imbriqués plus faciles à lire vu qu'ils étaient décalées les uns par rapport aux autres.

Lol ?
Je peux imaginer que tu puisses le penser au moment de taper le code, mais certainement pas au moment de débugger, fais un sondage si tu veux mais l'imbrication de tes if, qui plus en est sans aucun saut de ligne, est vraiment indigeste.

Et j'ai gardé le décalage mais seulement pour ceux qui sont imbriqués l'un dans l'autre, imho ma façon d'indenter est bien meilleure.
Et oui, cette exigence n'est non plus pas négociable.
_________________
Le violet, c'est moche.
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 jk2pach
Invité








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

D'ac.

Je vais éditer mes codes petit à petit.

Je te laisse le choix du prochain système :p

Cette fois ça fonctionne.
_________________
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: 20/03/10 22:55    Sujet du message: Citer

Bah à vrai dire si tu as compris la méthode d'utilisation d'une hashtable au lieu d'une loop tu peux déjà toi même éditer certains de tes codes.
Dans le cas contraire faut que j'explique mieux, mais ca ne servirait strictement à rien que tu fasses simplement du copier/coller.
_________________
Le violet, c'est moche.
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 jk2pach
Invité








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

On est bien d'accord.

Pour ça que je vais tenter le système de recyclage.

Reste ces foutues macros que je ne connais toujours pas.

Edit: enfin je crois que je commence à les comprendre

Voilà d'ailleurs la version finale du système d'alliances.
Ancienne version supprimée pour alléger la page

Voir le premier message
_________________


Dernière édition par jk2pach le 21/03/10 12:11; édité 1 fois
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: 21/03/10 09:58    Sujet du message: Citer

Il n'est pas nécessaire de nullifier une variable player, car on ne peut créer/détruire un player.
A part cela ca me semble très correct Wink
_________________
Le violet, c'est moche.
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 jk2pach
Invité








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

Bah la en même temps je n'ai pas fait grand chose pour la deuxième partie hein :/

Variable player: oO je croyais qu'on était obligé, que c'était un handle.

Enfin:

Au hasard: pour le système de recyclage, le raisonnement est le même, sauf que je remplace le stringtable par un hashtable?
_________________
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: 21/03/10 11:55    Sujet du message: Citer

Apocalypse a écrit:
Bah la en même temps je n'ai pas fait grand chose pour la deuxième partie hein :/

Certes.

Citation:
Variable player: oO je croyais qu'on était obligé, que c'était un handle.

C'est bien un handle, mais ce n'est pas pour autant que l'on puisse créer/détruire un player.
Nullifier un handle est nécessaire uniquement quand on peut le détruire, pour que son son id puisse être recyclé quand il est détruit (aucune variable ne doit pointer dessus)

Citation:
Au hasard: pour le système de recyclage, le raisonnement est le même, sauf que je remplace le stringtable par un hashtable?

Tu parles de quel library ?
_________________
Le violet, c'est moche.
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 jk2pach
Invité








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

Dismantle unit/ Destroy building
_________________
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: 21/03/10 12:25    Sujet du message: Citer

Zofète les variables AllianceAltX ne servent plus à rien.
Enfin je supposes que tu les utilises ailleurs étant donné qu'elles ne sont pas private, dans ce cas tu peux toujours les définir dans la textmacro, même si tu devrais avoir besoin de moins de variables.

PS : chat event ne prend pas la casse en compte, par contre les comparaisons de string oui.

AllianceAlt: en fait je ne m'en sers plus du tout.

La casse: c'est à ça que servaient les AllianceAlt.
_________________
Le violet, c'est moche.
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