• 22 Avril 2025, 22:08:48


Auteur Sujet: codes/scripts utiles  (Lu 132474 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne Leonidas300

  • *
  • Bandit
  • Pawno-Amateur, a déjà crée plusieurs système
  • Messages: 301
    • Voir le profil
Re : codes/scripts utiles
« Réponse #225 le: 25 Juillet 2010, 19:43:58 »
hein ?




Zombi PAWN,Créateur de *** ****** ********* !

Cherche hébérgement SA:MP! [PM Moi]
Merci à vous

Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : codes/scripts utiles
« Réponse #226 le: 25 Juillet 2010, 21:32:05 »
Ca faisait un moment que je n'étais pas passé par là.
Je vais donc faire mon chieur ..... :)

1 - Pour Dizzy : La fonction IsNumeric existe certainement en C (même code qu'en PAWN) depuis avant ta naissance. Donc t'en approprier les crédits me semble un peu abusé. D'ailleurs, la fonction que tu montres se trouve dans <utils.h>, pas dans <dutils.h> (dans cette include, elle prend en compte le signe du nombre).
Pour l'autre fonction, <dutil.h> en contient une avec le même nom et le même paramètre (ce qui me parait louche, personnellement, étant français, quand je fais une fonction moi même, je lui donne un nom français ainsi qu'à ses paramètres).
Concernant le contenu de ta fonction ValidEmail, il est très différent du contenu de celle qu'on trouve dans <dutils.h> ce qui pourrait indiquer que c'est toi qui l'a écrite.

2 - Pour sazuke :
Hérésie !!!!
Pourquoi faire un #define à l'intérieur d'une fonction, autant mettre directement le code.
Hérésie 2 !!!!
Utilisation de continue dans une boucle for = truc de débutant qui ne sait pas coder et qui croit optimiser son code :
Le tien :
for(new i = 0; i < GetMaxPlayers(); i++)
{
   if(!IsPlayerConnected( i )){continue;}
   GetPlayerPos(playerid, x1, y1, z1);
   
   if(DISTANCE(x, y, z, x1, y1, z1) < Distance)
   {
    Distance = DISTANCE(x, y, z, x1, y1, z1);
       Playerid = i;
   }
}
Le mien (qui fait la même chose) :
for(new i = 0; i < GetMaxPlayers(); i++)
{
if (IsPlayerConnected (i)) // On ne traite que les joueurs connectés
{
GetPlayerPos (playerid, x1, y1, z1);

if (DISTANCE (x, y, z, x1, y1, z1) < Distance)
{
Distance = DISTANCE (x, y, z, x1, y1, z1);
Playerid = i;
}
}
}

Autre chose, le floatsqroot consomme beaucoup de ressources, pour ta comparaison il vaut mieux élever la distance au carré. De même que faire un floatpower pour élever au carré consomme plus que de simplement multiplier le nombre par lui même.
De plus, faire le calcul 2 fois consommera presque 2 fois plus de temps CPU.

Autre remarque : grosse erreur d'inattention dans le deuxième GetPlayerPos, il faut mettre i, pas playerid.

Mais l'erreur la plus grosse que tu es faîte dans cette fonction c'est que ta boucle for va faire le test pour TOUS les joueurs, y compris le joueur pour lequel on appelle la fonction. Et le résultat sera donc toujours le même : Le joueur le plus proche du joueur X est ..... le joueur X lui-même :).

Au final, on oublie le #define qui ne servira plus à rien (ça ma fait du mal quand j'ai vu ça :(), on corrige tous les petits défauts cités ci-dessus et on obtient un version optimisée (non testée mais je suis confiant) :
stock JoueurLePlusProche( playerid )
{
if(!IsPlayerConnected( playerid )){return -1;}
new PlusProcheJoueur = INVALID_PLAYER_ID;
new Float:Distance = 3000000000000.0; // Distance que je pense être impossible entre deux joueurs ^^
new Float:x, Float:y, Float:z, Float:x1, Float:y1, Float:z1, Float:D;
GetPlayerPos(playerid, x, y, z);

for(new i = 0; i < GetMaxPlayers (); i++)
{
if (IsPlayerConnected (i) && i != playerid) // Il ne faut pas faire le test pour le joueur lui-même
{
GetPlayerPos (i, x1, y1, z1);
D=(x-x1)*(x-x1)+(y-y1)*(y-y1)+(z-z1)*(z-z1);
if(D < Distance*Distance)
{
Distance = floatsqroot (D);
PlusProcheJoueur = i;
}
}
}
return PlusProcheJoueur;
}
NB : Les crédits restent à sazuke car c'est lui qui a eu l'idée de cette fonction, ce qui est certainement la chose le plus difficile en programmation (avoir des idées).

++
Syg
« Modifié: 25 Juillet 2010, 21:34:49 par Syg »
Courtesy of GtaManiac

Hors ligne Ssk

  • *
  • Lulu's Stunt - Le serveur stunt de Lulu !
  • Messages: 8154
    • Voir le profil
Re : codes/scripts utiles
« Réponse #227 le: 25 Juillet 2010, 21:41:19 »
Ah, ouais j'avoue que je n'y avais pas penser à ne pas tester le joueur lui même lol


Sinon je ne comprend pas le problème du continue ^^


(Merci Syg pour la correction ^^ )



Derrière tout programme se cache un programmeur, je considère le monde comme un programme.
Mon blog

Hors ligne cristab

  • *
  • Messages: 8379
    • Voir le profil
Re : Re : codes/scripts utiles
« Réponse #228 le: 25 Juillet 2010, 21:46:26 »

NB : Les crédits restent à sazuke car c'est lui qui a eu l'idée de cette fonction, ce qui est certainement la chose le plus difficile en programmation (avoir des idées).


j'avoue ^^

par contre j'appuie aussi le fait que si une personne cree une fonction (une personne fr) sa fonction le mieux pour lui c'est q'elle soit FR

exemple je suis en train de coder le serveur LZR avec un systeme achat de voiture qui fonctionne d'ailleur mais il manque encore trois commande on peu remarquer que mes var sont en FR

CarInfo[Voit][vendu]= dini_Int(CarAccount(Voit), "vendu");
CarInfo[Voit][proprio]= dini_Int(CompteVoiture(Voit), "proprio");
CarInfo[Voit][X]= dini_Int(CompteVoiture(Voit), "x");
CarInfo[Voit][Y]= dini_Int(CompteVoiture(Voit), "y");
CarInfo[Voit][Z]= dini_Int(CompteVoiture(Voit), "z");
CarInfo[Voit][A]= dini_Int(CompteVoiture(Voit), "a");
CarInfo[Voit][C1]= dini_Int(CompteVoiture(Voit), "Couleur1");
CarInfo[Voit][C2]= dini_Int(CompteVoiture(Voit), "Couleur2");
CarInfo[Voit][autorisevente]= dini_Int(CompteVoiture(Voit), "Autorisevente");
CarInfo[Voit][PrixAchat]= dini_Int(CompteVoiture(Voit), "PrixAchat");
CarInfo[Voit][PrixRevente]= dini_Int(CompteVoiture(Voit), "PrixRevente");
sauf pour CarInfo car VoitureInfo sa m'aurais enerver ^^
pas d'aide en PM, vous êtes sur un forum est il me semble que vous êtes la pour avoir de l'aide donc pourquoi MP une seul personne qui ne vous répondra pas alors qu'il y a plein de membre ici

Hors ligne Ssk

  • *
  • Lulu's Stunt - Le serveur stunt de Lulu !
  • Messages: 8154
    • Voir le profil
Re : codes/scripts utiles
« Réponse #229 le: 25 Juillet 2010, 22:07:02 »
Voila une dernière correction lol

T'a fait une petit erreur d'inattention Syg ^^

stock JoueurLePlusProche( playerid )
{
if(!IsPlayerConnected( playerid )){return INVALID_PLAYER_ID;}
new PlusProcheJoueur = INVALID_PLAYER_ID;
new Float:Distance = 3000000000000.0; // Distance que je pense être impossible entre deux joueurs ^^
new Float:x, Float:y, Float:z, Float:x1, Float:y1, Float:z1, Float:D;
GetPlayerPos(playerid, x, y, z);

for(new i = 0; i < GetMaxPlayers (); i++)
{
if (IsPlayerConnected (i) && i != playerid) // Il ne faut pas faire le test pour le joueur lui-même
{
GetPlayerPos (i, x1, y1, z1);
D=(x-x1)*(x-x1)+(y-y1)*(y-y1)+(z-z1)*(z-z1);
if(D < Distance*Distance)
{
Distance = floatsqroot (D);
PlusProcheJoueur = i;
}
}
}
return PlusProcheJoueur;
}

Tu retourne -1; Si le joueur n'est pas connecter alors qu'il aurai fallut retourner INVALID_PLAYER_ID ^^



Derrière tout programme se cache un programmeur, je considère le monde comme un programme.
Mon blog

Hors ligne cristab

  • *
  • Messages: 8379
    • Voir le profil
Re : codes/scripts utiles
« Réponse #230 le: 25 Juillet 2010, 22:20:53 »
sasuke INVALID_PLAYER_ID est -1 revient au meme en java on peu mettre -1 mais aussi 0xFFFF(Il s'agit d'un nombre 16-bit avec tous les bits à 1)

soit 0xFFFF = -1
pas d'aide en PM, vous êtes sur un forum est il me semble que vous êtes la pour avoir de l'aide donc pourquoi MP une seul personne qui ne vous répondra pas alors qu'il y a plein de membre ici

Hors ligne Ssk

  • *
  • Lulu's Stunt - Le serveur stunt de Lulu !
  • Messages: 8154
    • Voir le profil
Re : codes/scripts utiles
« Réponse #231 le: 25 Juillet 2010, 23:45:49 »
INVALID_PLAYER_ID vaut -1 ? à l'époque de la 0.2.* il valait 255 non ?

Je doit me tromper alors



Derrière tout programme se cache un programmeur, je considère le monde comme un programme.
Mon blog

Hors ligne scott1

  • *
  • Gangster
  • Messages: 1440
    • Voir le profil
Re : codes/scripts utiles
« Réponse #232 le: 26 Juillet 2010, 04:56:13 »
if(strcmp(cmdtext, "/pos", true) == 0)
{
new length = strlen(cmdtext);
while ((idx < length) && (cmdtext[idx] <= ' '))
{
idx++;
}
new offset = idx;
new result[64];
while ((idx < length) && ((idx - offset) < (sizeof(result) - 1)))
{
result[idx - offset] = cmdtext[idx];
idx++;
}
result[idx - offset] = EOS;
if(!strlen(result))
{
SendClientMessage(playerid, COLOR_YELLOW, "USAGE: /pos [commentaire]");
return 1;
}
if (IsPlayerAdmin(playerid))
{
new Float:px, Float:py, Float:pz;
new Float:angle;
if(IsPlayerInAnyVehicle(playerid)) { GetVehicleZAngle(GetPlayerVehicleID(playerid), angle); }
else { GetPlayerFacingAngle(playerid, angle); }
GetPlayerPos(playerid, px, py, pz);
SendClientMessage(playerid, COLOR_YELLOW, "Position sauvegardée");
new coordsstring[256];
format(coordsstring, 256, "%.4f,%.4f,%.4f,%.4f // %s\n", px, py, pz,angle,result);
new File:hFile;
hFile = fopen("Position.txt", io_append);
fwrite(hFile, coordsstring);
fclose(hFile);

}

Cette commande équivaut au /save mais plus facile.

Il faut être connecté à la RCON, on fait /pos commentaire IG  et ça nous ouvre un fichier positon txt ça nous ecris la position, l'angle, on peux directement copier coller les coordonnée.
Refait un Game mode a partir d'une page blanche



Mes partages:

Systeme de Radio avec Frequence Création

Ajouter des véhicule dans le LARP - Godfather Tuto

Anti Cheat "JunkBuster" traduit en FR Traduction

LARP Traduit FR, V0.3 Traduction

Hors ligne cristab

  • *
  • Messages: 8379
    • Voir le profil
Re : codes/scripts utiles
« Réponse #233 le: 26 Juillet 2010, 09:16:04 »
avant INVALID_PLAYER_ID valais bien 255 mais desormer on peut aller a 500 joueur donc en regardant l'include on peu voir 0xFFFF  de meme pour les INVALID_VEHICLE un truc du genre
pas d'aide en PM, vous êtes sur un forum est il me semble que vous êtes la pour avoir de l'aide donc pourquoi MP une seul personne qui ne vous répondra pas alors qu'il y a plein de membre ici

Hors ligne Ssk

  • *
  • Lulu's Stunt - Le serveur stunt de Lulu !
  • Messages: 8154
    • Voir le profil
Re : codes/scripts utiles
« Réponse #234 le: 26 Juillet 2010, 12:54:47 »
Après test je connais maintenant la valeur de INVALID_PLAYER_ID, elle vaut 65535 ^^


Fait comme cela pour voir ^^


printf("INVALID_PLAYER_ID %d\n", INVALID_PLAYER_ID );

Un petit peu de doc sur ce nombre =)

http://en.wikipedia.org/wiki/65535_%28number%29

^^



Derrière tout programme se cache un programmeur, je considère le monde comme un programme.
Mon blog

Hors ligne cristab

  • *
  • Messages: 8379
    • Voir le profil
Re : codes/scripts utiles
« Réponse #235 le: 26 Juillet 2010, 13:09:32 »
effectivement on peu le voir comme ceci c'est un bug pawn en gros sa donne le meme resultat quand un joueur ce connect avec un tres gros ping que le serveur n'arrive meme pas a connaitre la valeur de sont ping on remarque qu'il renvoie 65535

donc on sais que 65535 est en reelement un nombre negatif :)


pas d'aide en PM, vous êtes sur un forum est il me semble que vous êtes la pour avoir de l'aide donc pourquoi MP une seul personne qui ne vous répondra pas alors qu'il y a plein de membre ici

Hors ligne Ssk

  • *
  • Lulu's Stunt - Le serveur stunt de Lulu !
  • Messages: 8154
    • Voir le profil
Re : codes/scripts utiles
« Réponse #236 le: 26 Juillet 2010, 13:31:39 »
Ce n'est pas du tout un bug, 65535 et tout simplement la valeur maximal que peut contenir une variable de 16 bits, et Kyeman à mis cette valeur comme cela lol, c'est comme avant avec 255 ^^

255 est le nombre maximal que peut supporter une variable de 8 bits.


Et voila pour l'histoire du ping ^^

http://en.wikipedia.org/wiki/Ping_of_death




Derrière tout programme se cache un programmeur, je considère le monde comme un programme.
Mon blog

Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : codes/scripts utiles
« Réponse #237 le: 26 Juillet 2010, 14:31:11 »
Pour l'histoire du -1 que je retourne que le joueur n'est pas connecté, ce n'est pas du tout un erreur inattention.
Ici, on est dans le cas où la fonction est appelée sur un joueur qui n'existe pas. On retourne -1 dans ce cas pour indiquer cette erreur.
Le cas où l'on retourne INVALID_PLAYER_ID survient que le joueur playerid est seul sur le serveur (et que donc on ne trouve aucun autre joueur proche de lui).
Ce sont bien deux cas différents qui peuvent justifier deux codes retour différents.

Concernant le 0xFFFF. Il vaut 65535 ou -1, tout dépend de la façon dont on veut le représenter.
En PAWN, toutes les variables entières sont sur 32 bits donc 0xFFFF vaut 65535. Pour avoir -1, il faut mettre 0xFFFFFFFF.

Maintenant, si on travaille en 16 bit, 0xFFFF vaut 65535 si on travaille en 16 bits non signé (unsigned word en C) et -1 si on travaille en entier signé (word en C).
NB : PAWN n'a qu'un seul type de variable entière (= long en C) qui peut prendre une valeur comprise entre -2.147.483.648 et 2.147.483.647.

Donc dans tous les cas, INVALID_PLAYER_ID et -1 ne sont pas égaux en PAWN.

++
Syg

Courtesy of GtaManiac

Hors ligne Ssk

  • *
  • Lulu's Stunt - Le serveur stunt de Lulu !
  • Messages: 8154
    • Voir le profil
Re : codes/scripts utiles
« Réponse #238 le: 26 Juillet 2010, 15:30:28 »
Ah ok, mais moi je partais du principe que si y a une erreur on retourne la même valeur ^^



Derrière tout programme se cache un programmeur, je considère le monde comme un programme.
Mon blog

Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : Re : codes/scripts utiles
« Réponse #239 le: 27 Juillet 2010, 23:28:46 »
Ah ok, mais moi je partais du principe que si y a une erreur on retourne la même valeur ^^
On fait comme on veut en fait.
Surtout qu'appeler cette fonction sur un joueur qui n'est pas connecté me parait peu probable.

++
Syg
Courtesy of GtaManiac