//! 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 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 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
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
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...)
Posté le: 20/03/10 22:22 Sujet du message:
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. _________________
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...)
Posté le: 20/03/10 22:55 Sujet du message:
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. _________________
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...)
Posté le: 21/03/10 09:58 Sujet du message:
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 _________________
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...)
Posté le: 21/03/10 11:55 Sujet du message:
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?
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...)
Posté le: 21/03/10 12:25 Sujet du message:
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. _________________
Page 1 sur 1 La question posée dans ce topic a été résolue !
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