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

Titre: Problème Yrace
Posté 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'

Titre: Re : Problème Yrace
Posté par: v331 le 26 Juillet 2009, 00:38:46
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
Titre: Re : Problème Yrace
Posté par: FuSion le 26 Juillet 2009, 15:24:14
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'
Titre: Re : Problème Yrace
Posté par: cristab le 26 Juillet 2009, 15:31:14
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.
Titre: Re : Problème Yrace
Posté par: FuSion le 26 Juillet 2009, 16:21:24
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'
Titre: Re : Problème Yrace
Posté par: cristab le 26 Juillet 2009, 16:33:55
je t'es fourni la reponse dans le post
Titre: Re : Problème Yrace
Posté par: FuSion le 26 Juillet 2009, 18:18:08
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'
Titre: Re : Problème Yrace
Posté par: /cartman le 27 Juillet 2009, 18:08:41
loge toi en rcon  :-\
Titre: Re : Problème Yrace
Posté par: Ssk le 27 Juillet 2009, 21:45:27
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 =)
Titre: Re : Problème Yrace
Posté par: FuSion le 28 Juillet 2009, 00:28:09
Salut,

Problème reglé grâce à stargate, vous pouviez locker ;) ...

[HS] Desolé sasuke :p [/HS]

++
FS'
Titre: Re : Problème Yrace
Posté par: v331 le 28 Juillet 2009, 11:21:27
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
Titre: Re : Problème Yrace
Posté par: /cartman le 28 Juillet 2009, 13:06:50
se n'est pas une variable utilise float_cos  et sin   :cheers
Titre: Re : Problème Yrace
Posté par: v331 le 28 Juillet 2009, 17:44:21
"float_cos" ? tu peu developper stp?  :happy
Titre: Re : Problème Yrace
Posté par: /cartman le 29 Juillet 2009, 06:24:27
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

++
Titre: Re : Problème Yrace
Posté par: v331 le 29 Juillet 2009, 13:43:36
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
Titre: Re : Problème Yrace
Posté par: /cartman le 29 Juillet 2009, 14:41:09
heu je te dirais sa se soir :D la je n'est pas le temps  :bangin

++
Titre: Re : Re : Problème Yrace
Posté par: S!m le 29 Juillet 2009, 15:50:29
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++
Titre: Re : Problème Yrace
Posté par: Syg le 29 Juillet 2009, 16:41:53
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
Titre: Re : Problème Yrace
Posté par: v331 le 29 Juillet 2009, 16:46:30
 ;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
Titre: Re : Problème Yrace
Posté par: Syg le 29 Juillet 2009, 16:49:48
Tu n'as qu'a changer ces deux lignes :
                              new target;
                                new next;


par

                              new target = 0;
                                new next = 1;

++
Syg
Titre: Re : Problème Yrace
Posté par: v331 le 29 Juillet 2009, 16:56:24
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 ?  ???
Titre: Re : Problème Yrace
Posté par: Syg le 29 Juillet 2009, 17:21:45
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
Titre: Re : Problème Yrace
Posté par: v331 le 29 Juillet 2009, 17:43:10
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
Titre: Re : Problème Yrace
Posté par: FuSion le 29 Juillet 2009, 19:22:00
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'
Titre: Re : Re : Problème Yrace
Posté par: /cartman le 29 Juillet 2009, 20:05:56
il te manque peut etre   /* Calcul de l'angle avec l'axe des X */   ^^






 
Titre: Re : Problème Yrace
Posté par: FuSion le 29 Juillet 2009, 20:17:03
/* Calcul de l'angle avec l'axe des X */
    Angle = Angle - 90.0;

C'est sa non ?

++
FS'
Titre: Re : Problème Yrace
Posté par: S!m le 29 Juillet 2009, 21:36:44
Salut,

le code posté par Syg devrait être utilisé dans une fonction à part qui retournerais comme valeur l'Angle

++Sim++
Titre: Re : Problème Yrace
Posté par: v331 le 30 Juillet 2009, 13:36:58
c'est a dire ?
 ???
Je suis un peu perdu . . .  ;D ;D ;D ;D
Titre: Re : Problème Yrace
Posté par: Syg le 30 Juillet 2009, 14:13:14
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
Titre: Re : Problème Yrace
Posté par: v331 le 30 Juillet 2009, 15:05:12
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
Titre: Re : Problème Yrace
Posté par: Syg le 30 Juillet 2009, 16:47:23
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
Titre: Re : Problème Yrace
Posté par: v331 le 30 Juillet 2009, 18:00:38
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.
Titre: Re : Problème Yrace
Posté par: FuSion le 05 Août 2009, 20:27:25
Problème reglé

++
FS'

A locker  :lock