GTAOnline.net
San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: Xx_Men_xX le 26 Mai 2013, 15:26:51
-
Coucou,
Est-ce qu'il y a quelqu'un qui c'est comment faire un truc du genre. Je tape /checkpoint, sa créer un checkpoint a un certain endroit, puis quand je vais dedans sa créer encore un nouveau checkpoint à un autre endroit. J'avait penser à faire ça dans :
public OnPlayerEnterCheckpoint(playerid)
{
return 1;
}
Mais le problème c'est que c'est "universel" c'est-à-dire que sa feras ça sur TOUS les checkpoints, TOUTE les commandes qui auront un SetPlayerCheckpoint feront pareille donc c'est embettant. J'ai trouvé la fonction :
IsPlayerInCheckpoint()
mais elle ne fais pas ce que je souhaite faire.
Là j'ai fais ça :
CMD:checkpoint(playerid, params[])
{
new checkpoint1;
checkpoint1 = SetPlayerCheckpoint(playerid, 2045.3282,-2494.0386,14.4701, 10); //Je créer un premier checkpoint
//Par là j'aimerais, faire que, lorsque le joueur arrive dans le checkpoint1, sa le désactive puis sa active un nouveau checkpoint mais ailleurs.
return 1;
}
Pourriez-vous m'aider s'il vous plait ?
Je vous remercie d'avance pour votre aide.
-
Je pense qu'il faut faire un tableau, par contre ne me demande pas comment faire je maîtrise pas ^^
sinon, des checkpoints normaux pas normals ^^
-
checkpoint1 = SetPlayerCheckpoint(playerid, 2045.3282,-2494.0386,14.4701, 10); //Je créer un premier
cette assignation est visiblement inutile puisque visiblement celle ci ne retourne rien.
http://wiki.sa-mp.com/wiki/SetPlayerCheckpoint (http://wiki.sa-mp.com/wiki/SetPlayerCheckpoint)
Bien que ce soit dommage (ça aurait été pratique)
La solution annexe est soit de faire un
http://wiki.sa-mp.com/wiki/DisablePlayerCheckpoint (http://wiki.sa-mp.com/wiki/DisablePlayerCheckpoint)
dans ton OnPlayerEnterCheckpoint puis avec une comparaison des coordonnée du Player et de ceux des checkpoints ( qui serait stocker dans un tableau ) d'assigner les coordonnée du chekpoint suivant dans ton tableau.
Après ce que tu décrit ça ressemble typiquement a un système de checkpoint de course.
Tu peux donc regarder les script qui sont fait pour organiser des courses cela pourra t'aider.
-
c'est pas trop compliquer au faite.
tu doit detecter dans quel checkpoint le jouer est entrée
premeirement , declare une variable global et met la a 1
new moncheckpoint[MAX_PLAYERS] = 1;
dans OnPlayerEnterCheckpoint
public OnPlayerEnterCheckpoint(playerid)
{
if(moncheckpoint[playerid] == 1)
{
DisablePlayerCheckpoint(playerid);
moncheckpoint[MAX_PLAYERS] = 2;
SetPlayerCheckpoint... ton 2e checkpoint...
}
if(moncheckpoint[playerid] == 2)
{
DisablePlayerCheckpoint(playerid);
moncheckpoint[MAX_PLAYERS] = 3;
SetPlayerCheckpoint... ton 3e checkpoint...
}
if(moncheckpoint[playerid] == 3)
{
DisablePlayerCheckpoint(playerid);
moncheckpoint[MAX_PLAYERS] = 0;
fin de ton parcours
}
return 1;
}
explication
new moncheckoint[MAX_PLAYER] = 1;
on crée la variable , on y insert l'id du joueur , et on met la variable a 1.
il faut inserer l'id du joueur sinon un autre joueur peut le prendre a sa place.
if(moncheckpoint[playerid] == 1)
verifie si le joueur est entrée dans ton premier checkpoint , affin qu'il ne puisse pas passer du checkpoint 1 au checkpoint 3 sans passer par le 2.
DisablePlayerCheckpoint(playerid;
parce que sa-mp limite les checkpoint a un seul par joueur
donc il faut en enlever un pour un mettre un nouveau.
j'espere que t'a compris et que ca t'a aider
-
new moncheckoint[MAX_PLAYER] = 1;
on crée la variable , on y insert l'id du joueur , et on met la variable a 1.
il faut inserer l'id du joueur sinon un autre joueur peut le prendre a sa place.
Je me permet de te corriger, il faut mettre la variable à -1. Car l'id des checkpoints peut être également 0.
++
Je fais semblant d'aider, tu comprendras pourquoi je dis ça :smile:.
-
Dans ce cas précis, il me semble plus intéressant d'utiliser une condition de la forme switch. De plus, puisqu'on dispose d'un identificateur à valeur numérique, il peut être intéressant de ne pas créer de condition, et par exemple en utilisant un tableau, d'utiliser l'identificateur pour obtenir les bonnes coordonnées des checkpoint.
Cela devrait donc s'apparenter à... :
public OnPlayerEnterCheckpoint(playerid)
{
// ...
DisablePlayerCheckpoint(playerid);
moncheckpoint[playerid]++;
SetPlayerCheckpoint(playerid, coordonnesCheckpoint[moncheckpoint[playerid]][0],
coordonnesCheckpoint[moncheckpoint[playerid]][1],
coordonnesCheckpoint[moncheckpoint[playerid]][2], 2.0);
// ...
}
À toi d'ajouter les conditions nécessaires au bon déroulement du parcours, à savoir vérifier que le joueur ne se trouve pas dans le dernier checkpoint, qu'il est bien en train de pratiquer le parcours, et j'en passe.
Bonne chance. :wink:
-
new moncheckoint[MAX_PLAYER] = 1;
on crée la variable , on y insert l'id du joueur , et on met la variable a 1.
il faut inserer l'id du joueur sinon un autre joueur peut le prendre a sa place.
Je me permet de te corriger, il faut mettre la variable à -1. Car l'id des checkpoints peut être également 0.
++
Je fais semblant d'aider, tu comprendras pourquoi je dis ça :smile:.
bravo enfin un truc qui saute au yeaux que t'a vue et pas fait semblant d'aider !
effectivement peut mettre -1 , mais pour comprendre , c'est moin compliquer de commencer a 1.
les debutant ont de la misere a commencer a 0.
-
Tu sors ça d'où ? En quoi un débutant a plus de mal à taper le chiffre 0 ou -1 que 1 ? Je sais bien que la plupart ont le Q.I. d'une huître, mais quand-même...
PS - Nous sommes sur un forum d'entraide avec une ambiance amicale, ce serait sympathique de rester amicaux les uns avec les autres, sans quoi les modérateurs feront leur travail. :wink:
-
new moncheckoint[MAX_PLAYER] = 1;
on crée la variable , on y insert l'id du joueur , et on met la variable a 1.
il faut inserer l'id du joueur sinon un autre joueur peut le prendre a sa place.
Je me permet de te corriger, il faut mettre la variable à -1. Car l'id des checkpoints peut être également 0.
++
Je fais semblant d'aider, tu comprendras pourquoi je dis ça :smile:.
Il peut commencer par la valeur qu'il veut, les checkpoints n'ont pas d'ID.
-
Par soucis de compatibilité avec la technique que j'ai citée plus haut, il serait en fait bien de commencer avec la valeur 0, pour la lecture du tableau.
-
premeirement , declare une variable global et met la a 1
new moncheckpoint[MAX_PLAYERS] = 1;
On parle ici d'un tableau, ça serait bien d'agir sur lui en tant que tel:
new moncheckpoint[MAX_PLAYERS] = {1};
Et aussi, serait-il possible de faire un petit effort sur l'orthographe, c'est des erreurs qui peuvent être très simplement évités à l'aide de ton navigateur (s'il supporte la correction orthographique).
Au niveau des accords, conjugaisons, je ne suis pas casse-pied (moi même je suis un benêt), mais là, c'est à la limite du lisible.
-
Je ne suis pas un expert pawn mais il me semble que
new moncheckpoint[MAX_PLAYERS] = 1;
est tout à fait correct.
la syntaxe {} c'est quand tu souhaite introduire plusieurs valeur dans différente case non?
-
Nope, Xartrick a raison ^^
-
Même si ça fonctionne sans les accolades, par convention, c'est mieux de les mettre. De toute manière, Rafffel, si tu fais :
new monTableau[5] = {1};
Ton tableau contiendra ces valeurs là :
1 0 0 0 0
Et si tu souhaites le remplir avec la valeur 1 dans chaque case, tu dois utiliser une boucle. Là où ça devient embêtant, c'est que le langage Pawn ne nous permet pas d'utiliser de pointeurs. Or, ça aurait été très utile pour se faire une fonction de la forme :
void initTab(int *tab, int len, int value)
Ce qui est faisable en langage C... On doit donc utiliser des boucles partout, et se passer d'une fonction du genre.
-
Juste faire un tableau de coordonnée dans l'ordre voulu pour ensuite incrémenter une variable de 1 a chaque passage dans le checkpoint et l'utiliser pour sortir les coordonnées, simple ?
-
Peut-être que les pointeurs n'existent pas en PAWN, mais les références si. Or un tableau est toujours passé en référence en PAWN, on peut faire une fonction qui initialise un tableau par une valeur en faisant.
new tableau[256];
main()
{
initArray(tableau, 1);
}
initArray(arr[], value, arr_size = sizeof(arr))
{
new i;
for(i = 0; i < arr_size; i++)
{
arr[i] = value;
}
}
Ou au pire, on peut faire ça.
new tableau[256] = {1, ...};
-
Je n'avais pas pensé à la technique du sizeof, c'est bien pratique, effectivement. Il suffit d'ajouter une boucle pour les tableaux multi-dimensionnels. :)