GTAOnline.net
San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: FuSion le 24 Juillet 2009, 23:55:05
-
Salut,
J'aimerai apprendre ce langage 'Pawno', alors j'essaye de monter un script a partir de plusieurs :ninja
J'ai trouvé le système de course 'Yrace', j'ai chercher des modifications pour téléporter le joueur a la case de départ lors de son /join.
J'ai trouvé ce post : http://www.gtaonline.fr/forums/index.php/topic,5618.msg78424.html (http://www.gtaonline.fr/forums/index.php/topic,5618.msg78424.html) ,après j'ai pris ce postbin http://pastebin.gtaonline.fr/pastebin.php?show=516 (http://pastebin.gtaonline.fr/pastebin.php?show=516) de gtafan.
Mon problème c'est en lançant la course, un joueur y accède et la course commence sans attendre que les autres viennent, quand on essaye d'accéder pendant le compte a rebours, un message nous informe que la course a déjà commencé.
Comme je débute, j'ai pas su d'où viens le problème :boulz
Si quelqu'un sait comment régler ce problème, sa serait vraiment sympa.
Merci de votre prochaine aide.
++
FS'
-
lu il faut que tu mette une fonction freez player quand il tape /ready ou /join (je c pu) , tu te reporte a la ligne concerner (/join) est tu rajoute la fonction freez , puis quand l'admin tape la fonction pour lancer la course , il fau la rajouter l'action unfreez. :happy
v331 (stargate)
ps: je sens que tu va pa tro comprendre non ? :blink :dry
-
Salut,
Tu disais vrai j'ai rien compris :-[
Tu peux me faire un script contenant ce launch race par admin stp ?
Je suis nouveau dans le langage pawn donc je m'y connais pas trop
++
FS'
-
tenter de lire les post quand vous telecharger
dcmd_join(playerid,params[])
{
#pragma unused params
if(RaceBuilders[playerid] != 0)
{
SendClientMessage(playerid, COLOR_YELLOW, "You are currently building a race, can't join. Use /clearrace to exit build mode.");
return 1;
}
if(RaceParticipant[playerid]>0)
{
SendClientMessage(playerid, COLOR_YELLOW, "You've already joined the race!");
}
else if(RaceActive==1 && RaceStart==0)
{
if(PrizeMode >= 2 && GetPlayerMoney(playerid) < JoinFee)
{
format(ystring,sizeof(ystring),"You don't have enough money to join the race! (Join fee: %d$)",JoinFee);
SendClientMessage(playerid, COLOR_YELLOW, ystring);
return 1;
}
else if (PrizeMode >= 2)
{
new tempval;
tempval=(-1)*JoinFee;
GivePlayerMoney(playerid,tempval);
Pot+=JoinFee;
}
CurrentCheckpoint[playerid]=0;
if(Racemode == 3)
{
SetRaceCheckpoint(playerid,LCurrentCheckpoint,LCurrentCheckpoint-1);
CurrentCheckpoint[playerid]=LCurrentCheckpoint;
}
else SetRaceCheckpoint(playerid,0,1);
RaceParticipant[playerid]=1;
CurrentLap[playerid]=0;
SendClientMessage(playerid, COLOR_GREEN, "You have joined the race, go to the start!");
Participants++;
SetPlayerPos(playerid,RaceCheckpoints[0][0],RaceCheckpoints[0][1],RaceCheckpoints[0][2]);
if(IsPlayerInAnyVehicle(playerid))
{
SetVehiclePos(GetPlayerVehicleID(playerid),RaceCheckpoints[0][0],RaceCheckpoints[0][1],RaceCheckpoints[0][2]);
}
}
else if(RaceActive==1 && RaceStart==1)
{
SendClientMessage(playerid, COLOR_YELLOW, "The race has already started, can't join.");
}
else
{
SendClientMessage(playerid, COLOR_YELLOW, "There is no race you can join.");
}
return 1;
}
Or something cbf wasting brain energy atm.
-
Salut,
Je suis un débutant en pawno donc je m'y connais pas trop en lecture ...
Si je savais régler mon problème, je l'aurais fait ..
++
FS'
-
je t'es fourni la reponse dans le post
-
Re,
Dans ton script le joueur est obligé de faire /ready, je veux par exemple que c'est l'admin qui lance la course, comme dans le poste de stargate(v331)
++
FS'
-
loge toi en rcon :-\
-
Salut,
J'aimerai apprendre ce langage 'Pawno', alors j'essaye de monter un script a partir de plusieurs :ninja
Desole de faire du HS, mais quand tu dit apprendre pawno ce n est pas un langage, le langage en question ce nomme le PAwn le logiciel qui permet d editer le code s appel Pawno =)
Voila tout =)
-
Salut,
Problème reglé grâce à stargate, vous pouviez locker ;) ...
[HS] Desolé sasuke :p [/HS]
++
FS'
-
merci merci :p
Juste un dernier truc a regler c'est le decalage des voitures quand on tape /join ainsi que que la voiture soit bien orienté par rapport au depard du sens de la course, j'ai esayé plein de chose , mais rien ne fonction vraiment .Je croi qu'i faut creer une variable mais je n'arrive pas trop.
Est ce que quelqu'un aurait cette variable ?
(v331)stargate
-
se n'est pas une variable utilise float_cos et sin :cheers
-
"float_cos" ? tu peu developper stp? :happy
-
include float.inc ^^ je vais pas te donner le bout de code :p il faut déja que tu comprenne le principe de trigonométrie :cheers
essaye de crée quelque et nous pourrons en discuter :P
++
-
J'ai penser faire comme ca pour le decalage et etre dans le bon sens de la course:
new target;
new next;
new Float:NormeAB;
new Float:SinAngle;
new Float:Angle;
NormeAB = floatsqroot ((RaceCheckpoints[next][0]-RaceCheckpoints[target][0])*(RaceCheckpoints[next][0]-RaceCheckpoints[target][0]) + (RaceCheckpoints[next][1]-RaceCheckpoints[target][1])*(RaceCheckpoints[next][1]-RaceCheckpoints[target][1]));
SinAngle = (RaceCheckpoints[next][1]-RaceCheckpoints[target][1])/NormeAB;
Angle = asin (SinAngle);
if (RaceCheckpoints[target][0] > NormeAB)
{
Angle = 180.0 - Angle;
}
else
{
Angle = Angle - 90.0;
}
Voila que pense tu de ca ? ^^
Par contre je l'ai assayer et je l'ai mis dans la commande /join mais ca na pas marcher.
help please :-X
-
heu je te dirais sa se soir :D la je n'est pas le temps :bangin
++
-
Salut,
j'ai pu voir quelques erreurs...
par exemple:
Angle = asin (SinAngle);//la bonne fonction n'est pas arcsin, quand on est à l'angle qui est normalement 90°, sur sa-mp l'angle est en fais 0° (tout est décaler de 90° dans le sens anti-horaire
if (RaceCheckpoints[target][0] > NormeAB)//ce test n'est pas le bon, tu dois plutôt tester si le delta-X est positif ou negatif...
{
Angle = 180.0 - Angle;
}
else
{
Angle = Angle - 90.0;
}
alors voilà, corrige légèrement ton code et tu aura le bon angle
++Sim++
-
Mais ta plus grosse erreur vient du faite que ton vecteur AB (entre le premier et le deuxième CP) est en fait le vecteur AA !!! (donc avec une norme égale à 0).
new target;
new next;
NormeAB = floatsqroot ((RaceCheckpoints[next][0]-RaceCheckpoints[target][0])*(RaceCheckpoints[next][0]-RaceCheckpoints[target][0]) + (RaceCheckpoints[next][1]-RaceCheckpoints[target][1])*(RaceCheckpoints[next][1]-RaceCheckpoints[target][1]));
SinAngle = (RaceCheckpoints[next][1]-RaceCheckpoints[target][1])/NormeAB;
Dans le code ci-dessus, target et next ne sont pas initialisés, ils valent donc 0 tous les deux.
Dans ton cas, il n'est pas nécessaire de passer par des variables car tu vas toujours faire test calcul pour les CP0 et CP1.
Mais la modification la plus facile est la suivante :
new target = 0; // CP de départ (0)
new next = 1; // Premier CP (1)
++
Syg
-
;D ;D oula est ce qu' on pourrait me faire un bilan (un final de script) parce que la j'ai un peu de mal.
merci a tous
-
Tu n'as qu'a changer ces deux lignes :
new target;
new next;
par
new target = 0;
new next = 1;
++
Syg
-
ok donc :
new target = 0;
new next = 1;
new Float:NormeAB;
new Float:SinAngle;
new Float:Angle;
NormeAB = floatsqroot ((RaceCheckpoints[next][0]-RaceCheckpoints[target][0])*(RaceCheckpoints[next][0]-RaceCheckpoints[target][0]) + (RaceCheckpoints[next][1]-RaceCheckpoints[target][1])*(RaceCheckpoints[next][1]-RaceCheckpoints[target][1]));
SinAngle = (RaceCheckpoints[next][1]-RaceCheckpoints[target][1])/NormeAB;
Angle = asin (SinAngle); // je change ca par quoi ?
if (RaceCheckpoints[target][0] > NormeAB) // et ca ?
{
Angle = 180.0 - Angle;
}
else
{
Angle = Angle - 90.0;
}
Et la le script est bon ? ???
-
Voici ton code corrigé et simplifié (avec des variables intermédiaire pour plus de clarté) :
new Float:nx, Float:tx, Float:ny, Float:ty ;
new Float:NormeAB;
new Float:Angle;
tx = RaceCheckpoints[0][0]; // X CP de départ (target)
ty = RaceCheckpoints[0][1]; // Y CP de départ (target)
nx = RaceCheckpoints[1][0]; // X Premier CP (next)
ny = RaceCheckpoints[1][1]; // Y Premier CP (next)
/* Calcul de la norme du vecteur entre le CP de départ et le premier CP */
NormeAB = floatsqroot ((nx-tx)*(nx-tx) + (ny-ty)*(ny-ty));
/* Angle formé par ce vecteur avec l'axe des Y */
Angle = asin ((ny-ty)/NormeAB);
/* Correction de l'angle dans le cas d'un angle inversé */
if (tx > nx)
{
Angle = 180.0 - Angle;
}
/* Calcul de l'angle avec l'axe des X */
Angle = Angle - 90.0;
La variable Angle est directement utilisable dans SetVehicleZAngle ou SetPlayerFacingAngle
Les corrections que j'ai faîtes sont inspirées de ce que j'utilise sur Lalu's Stunt.
++
Syg
-
j'ai essyr ton script il marche pas on est figer puis rien :
dcmd_join(playerid,params[])
{
new Float:nx, Float:tx, Float:ny, Float:ty ;
new Float:NormeAB;
new Float:Angle;
tx = RaceCheckpoints[0][0]; // X CP de départ (target)
ty = RaceCheckpoints[0][1]; // Y CP de départ (target)
nx = RaceCheckpoints[1][0]; // X Premier CP (next)
ny = RaceCheckpoints[1][1]; // Y Premier CP (next)
/* Calcul de la norme du vecteur entre le CP de départ et le premier CP */
NormeAB = floatsqroot ((nx-tx)*(nx-tx) + (ny-ty)*(ny-ty));
/* Angle formé par ce vecteur avec l'axe des Y */
SetVehicleZAngle (Angle = asin ((ny-ty)/NormeAB));
/* Correction de l'angle dans le cas d'un angle inversé */
if (tx > nx)
{
Angle = 180.0 - Angle;
}
/* Calcul de l'angle avec l'axe des X */
Angle = Angle - 90.0;
TogglePlayerControllable(playerid, 0);
if(RaceBuilders[playerid] != 0)
{
SendClientMessage(playerid, COLOR_YELLOW, "You are currently building a race, can't join. Use /clearrace to exit build mode.");
return 1;
}
help please
-
Re,
S'il y'a une possibilité de poster le dcmd_join complet sa serait vraiment superbe.
Entant que tester du script de v331, j'ai remarqué que sa nous sort : Vous avez rejoins la course, et on reste freezer sur place sans téléportation ni autre.
++
FS'
-
il te manque peut etre /* Calcul de l'angle avec l'axe des X */ ^^
-
/* Calcul de l'angle avec l'axe des X */
Angle = Angle - 90.0;
C'est sa non ?
++
FS'
-
Salut,
le code posté par Syg devrait être utilisé dans une fonction à part qui retournerais comme valeur l'Angle
++Sim++
-
c'est a dire ?
???
Je suis un peu perdu . . . ;D ;D ;D ;D
-
Su Lalu's, Stunt, comme vous avez pu vous en rendre compte, la commande /join permet simplement de positionner le joueur correctement sur la ligne de départ. Ensuite, l'organisateur de la course (M+, modo ou admin) va lancer la course au moyen de la commande adéquate après avoir demandé aux joueurs si ils sont prêts.
Ma réponse ne concernait que le calcul de l'angle (et comme le dit très justement Sim, ce calcul pourrait être fait dons une fonction à part qui ne fait que ça).
Pour le positionnement du joueur, il manque un téléport vers le CP de départ.
Ensuite, il te faudra écrire la commande qui permet de lancer la course (compte à rebours, messages, defreeze des joueurs, ...).
++
Syg
-
la commande existe il n'y a que l'admin qui peu taper /ready et la course se lance "tout le mone est pret la course va commancer" les joueurs sont defreez , . . .
Le probleme n'est pas la c'est quand les joueur font /join de 1: il faut que qu'il soit dans le bon angle (ca c'est presque regler)
de 2: il faut que les voiture soient l'une a coter de l'autre et pour cela j'ai pensé a ca:
#define DECALAGE_X 2
#define DECALAGE_Y 2
#define DECALAGE_Z 2
new participants;
ca au de debut
Participants++;
SetPlayerPos(playerid,RaceCheckpoints[0][0]+participants*DECALAGE_X,RaceCheckpoints[0][1]+participants*DECALAGE_Y,RaceCheckpoints[0][2]+participants*DECALAGE_Z);
et ca dans la commande /join
-
Tu es sur la bonne voie (bien que le décalage sur Z, la hauteur, soit inutile. Tu ne vas certainement pas faire plusieurs couches de participants :) ).
Mais il te reste beaucoup de chose à faire (et pas forcément simple) :
- Le positionnement sur la grille de départ doit être calculé en fonction de l'angle que tu as trouvé précédemment (une rotation de cet angle, centrée sur le CP de départ)
- Il ne faut pas utiliser le décalage sur X et Y de la même façon, sinon tes joueurs se retrouveront sur une diagonale.
Il faut d'abord utiliser le décalage sur X (pour une première ligne de participants) puis lorsque cette première ligne est remplie, passer à la ligne suivante (décalage de Y).
Bon courage. Je te conseille vivement de faire des dessins pour essayer de te représenter la chose.
Par contre, il faudra certainement que tu gères les joueurs qui quitte la course avant le départ. Car avec ton système, un joueur qui fait /join puis /leave puis /join, etc... va "consommer" toutes les places disponibles.
Ce n'est pas forcément très facile à mettre en place.
Une des solutions consiste à empêcher les joueurs de faire /leave si la course n'a pas commencé, ceci t'éviteras d'avoir à coder ce que je viens de citer juste en dessus.
++
Syg
-
Bon tou d'abord j'ai enlever les positon Z puis j'ai ressayer en plus de faire un dessin :happy , mais ca n'a pas marché.
#define DECALAGE_X 2
#define DECALAGE_Y 2
new participants;
Participants++;
SetPlayerPos(playerid,RaceCheckpoints[0][0]+participants*DECALAGE_X,RaceCheckpoints[0][1]+participants*DECALAGE_X,RaceCheckpoints[0][2]+participants*DECALAGE_X);
SetPlayerPos(playerid,RaceCheckpoints[0][0]+participants*DECALAGE_Y,RaceCheckpoints[0][1]+participants*DECALAGE_X,RaceCheckpoints[0][2]+participants*DECALAGE_X);
#pragma unused params
je sait qu'il me manque des truc , mais je ne sait pas comment mis prendre.
-
Problème reglé
++
FS'
A locker :lock