GTAOnline.net
San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: Nikko™ le 21 Mai 2009, 20:42:37
-
Bonjour bonjour,
J'ai une petite question a poser. :D
J'ai trouvé comment faire pour que quand un killerid tue un playerid, le playerid reste en "spec" sur le killerid.
Maintenant, j'ai eu l'idée de faire en sorte que lorsque le joueur qui "spec" apuie clique avec sa souris (je fait ca avec le KeyStatChange..), ca change de perso a voir (Comme dans Counter strike quoi ...) Mais je ne sais pas comment faire pour que ca switch de joueur ...
Merci si vous pouvez m'aider :)
++
nikko
-
quand il dead tu creer une var global qui enregistre l id du killer puis tu spec sur le killer ensuite met dans la callback keystatechange des qu il appuye sur la touche que tu veut ca prend la var et +1 ensuite tu spec sur la variable mais va attention regarde si le jouer est connecte et s il n'est pas deja en train de spec =D
-
Salut,
tu devrais te créer une fonction FindNextPlayerToSpectate ou un nom du genre, tu peut t'inspirer de celle de barron qui vient avec le serveur à la base
++Sim++
-
Merci sim j'ai vu ca, mais je ne comprend pas trop leur code a vrai dire ...
++
nikko
-
Poste le est on essayera de t expliquer ;)
-
Salut,
observons le code....
ObserverSwitchToNextVehicle(playerid)
{
new x=0;
while(x!=MAX_PLAYERS) { // MAX_PLAYERS iterations
gPlayerObserving[playerid]++;
if(gPlayerObserving[playerid] == MAX_PLAYERS) {
// we need to cycle back to the start
gPlayerObserving[playerid] = 0;
}
// see if the target player has a vehicle,
// if so assign this player to observe it
if(gPlayerVehicles[gPlayerObserving[playerid]] != 0) {
PlayerSpectateVehicle(playerid,gPlayerVehicles[gPlayerObserving[playerid]]);
return;
}
x++;
}
// didn't find any vehicles to observe. we'll have to default to last
PlayerSpectateVehicle(playerid,gPlayerVehicles[gPlayerObserving[playerid]]);
}
voilà la fonction, il nous faut maintenant la décortiquer....
new x=0;
while(x!=MAX_PLAYERS) { // MAX_PLAYERS iterations
x++;
comme tu le vois, la loop continue jusqu'à ce que l'on est fais le tour de tous les joueurs (la loop a exécutée un tour complet de tous les 200 joueurs, ou une quantité différente si l'on change la valeur de MAX_PLAYERS)
par la suite, la loop vérifie si l'on est rendu au plus haut possible, quand il n'y a plus de joueur, il faudrait sans doute revenir au début pour faire une belle fonction, c'est d'ailleurs exactement ce que fais le code, on augmente le nombre correspondant au joueur regardé par le spectateur puis si l'on est rendu au bout, on recommence au début:
gPlayerObserving[playerid]++;
if(gPlayerObserving[playerid] == MAX_PLAYERS) {
// we need to cycle back to the start
gPlayerObserving[playerid] = 0;
}
puis le dernier ne te concerne pas tellement, comme dans barron le joueur doit ce trouver dans un rc pour être regardé, on test s'il y est et on assigne le spectateur à ce joueur...
if(gPlayerVehicles[gPlayerObserving[playerid]] != 0) {
PlayerSpectateVehicle(playerid,gPlayerVehicles[gPlayerObserving[playerid]]);
return;
}
dans ton cas, ton joueur serait en spectateur sur le joueur qui l'as tué, il faudrait une variable qui conserve le ID de ce joueur, puis tu exécute l'équivaleut de ce code selon le critère que tu désireras, par contre si tu veut l'exécuter en sens in verse tu n'as qu'à changer 2 choses:
gPlayerObserving[playerid]--;
if(gPlayerObserving[playerid] < 0) {
// we need to cycle back to the start
gPlayerObserving[playerid] = MAX_PLAYERS;
}
et voilà, en espérant que ce code soit plus claire pour toi :D
++Sim++