• 02 Mai 2024, 14:35:13


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

0 Membres et 1 Invité sur ce sujet

Hors ligne S!m

  • *
  • Messages: 2341
    • Voir le profil
Re : codes/scripts utiles
« Réponse #45 le: 26 Novembre 2008, 03:49:16 »
Salut,

j'avais oublié cette technique là ;D

par contre la mienne a un avantage, on peut compter les modèles, par contre on peut également le faire avec une boucle sur tous les véhicules comme suit:

new Modele[215],ModelCount;
for(new i; i<MAX_VEHICLES; i++){
    Modele[GetVehicleModel(i)]++;
}
for(new i; i<sizeof(Modele); i++){
    if(Modele[i])ModelCount++;
}

ou à peu près, je viens de l'écrire sur le forum, en espérant qu'il n'y ai pas d'erreur.

P.S. si on fait le test sur un véhicule inexistant, quelle valeur retourne GetVehicleModel

++Sim++





Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : codes/scripts utiles
« Réponse #46 le: 26 Novembre 2008, 10:22:19 »
Pour le comptage des modèles, ton code ne va pas fonctionner.
Tout d'abord (mais c'est un détail), il y a 212 modèle différents (et non pas 216).
Ensuite, le premier véhicule à l'ID 1 et non pas 0, tes boucles doivent donc commencer à 1.
Et il faut arrêter tes boucles sur le dernier véhicule créé et ne pas aller jusqu'à MAX_VEHICLES.

Mais le problème majeur est que la fonction GetVehicleModel retourne un nombre compris entre 400 et 611 donc la ligne
Modele[GetVehicleModel(i)]++;plantera à coup sur.

Voici le bout de code que j'utilise pour compter le nombre de modèles (types) :
new ModelUtilise[212];
new Model;
new NbVehicules;
new NdModels = 0;

NbVehicules = ..... // Voir méthode de calcul dans un post précédent

/* Calcul du nombre de modeles de vehicules */
for (i=1 ; i<=NbVehicules ; i++)
{
/* On récupère le modeles du véhicule */
Model = GetVehicleModel (i);
if (ModelUtilise[Model-400] == 0)
{
    /* On compte le nombre de modeles */
    ModelUtilise[Model-400] = 1;
    NbModels++;
}
}

++
Syg
Courtesy of GtaManiac

Hors ligne S!m

  • *
  • Messages: 2341
    • Voir le profil
Re : codes/scripts utiles
« Réponse #47 le: 26 Janvier 2009, 01:10:43 »
Bonjour, plutôt bonne nuit, à tous,

après avoir tenter une modification à un yrace, j'en suis venu à la conclusion que les fonction floatsin et floatcos intégrées à sa-mp sont hautement imprécise

voici mon log:
Citer
[17:51:32] Angle: 270.065460 SIN: -0.111277 COS: 0.993789

donc, je me suis attelé à la création d'une fonction les remplaçants, voici ce à quoi je suis arrivé:

Float:Cos(Float:angle)
{
new Float:ang;
new nb = floatround(angle/180, floatround_ceil);
ang = (angle - 180 * nb) / 180 * PI;
return (1 - (ang * ang / 2) + (floatpower(ang,4)/ 24) - floatpower(ang,6)/720);
}

Float:Sin(Float:angle)
{
new Float:ang;
new nb = floatround(angle/180, floatround_ceil);
  ang = (angle - 180 * nb) / 180 * PI;
return (ang - (ang * ang * ang / 6) + (floatpower(ang,5)/ 120) - floatpower(ang,7)/5040);
}

ces fonctions offrent une marge d'erreur d'environ 0.001 ce qui est amplement suffisant sur sa-mp, par contre si vous désirez en augmenter la précision, vous pouvez toujours en allonger la suite

alors en voici une version plus précise:

Float:Cos(Float:angle)
{
new Float:ang;
new nb = floatround(angle/180, floatround_ceil);
ang = (angle - 180 * nb) / 180 * PI;
return (1 - (ang * ang / 2) + (floatpower(ang,4)/ 24) - floatpower(ang,6)/720 + floatpower(ang,8)/40320 - floatpower(ang,10)/3628800);
}

Float:Sin(Float:angle)
{
new Float:ang;
new nb = floatround(angle/180, floatround_ceil);
  ang = (angle - 180 * nb) / 180 * PI;
return (ang - (ang * ang * ang / 6) + (floatpower(ang,5)/ 120) - floatpower(ang,7)/5040 + floatpower(ang,9)/362880) + floatpower(ang,11)/39916800;
}

EDIT: j'avais oublié un détail, à placer au dessus de ces fonctions:
#define PI 3.14159265
Le pi provenant de ma calculatrice  :P

voilà en espérant que ça en aide certains ;)

++Sim++
« Modifié: 26 Janvier 2009, 01:34:25 par Sim »





Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : codes/scripts utiles
« Réponse #48 le: 26 Janvier 2009, 14:05:34 »
Ah, les développements limités ... souvenirs souvenirs.

Deux choses :
1 - En terme de temps d'exécutions, tes fonctions vont faire monstrueusement ramer ta machine.

Code ajouté dans la fonction main :
new Float:C;
new i;
new T1, T2;

T1 = GetTickCount ();
for (i=0 ; i<1000000 ; i++)
{
C=Cos (150.0);
}
T2 = GetTickCount ();
printf ("Temps fonction Sim  : %d ms", (T2-T1));
printf ("Valeur de C = %f", C);

T1 = GetTickCount ();
for (i=0 ; i<1000000 ; i++)
{
C=floatcos (150.0, degrees);
}
T2 = GetTickCount ();
printf ("Temps fonction SAMP : %d ms", (T2-T1));
printf ("Valeur de C = %f", C);

Le résultat est sans appel :
[13:59:51] Temps fonction Sim  : 1688 ms
[13:59:51] Valeur de C = 0.866025
[13:59:51] Temps fonction SAMP : 94 ms
[13:59:51] Valeur de C = -0.866025

Et avec la version plus précises de ta fonction Cos :
[13:55:37] Temps fonction Sim  : 2266 ms
[13:55:37] Valeur de C = 0.866025
[13:55:37] Temps fonction SAMP : 94 ms
[13:55:37] Valeur de C = -0.866025

2 - Les fonctions floatsin et floatcos sont tout à fait précises.

Avec la calculatrice Windows :
sin (270.065460) = -0,11127726866931306777757596726546
cos (270.065460) =0,98438195063250492805999105500533
Ce qui est sensiblement la même chose que ce que tu trouve dans ton script (à part pour le cos mais c'est bizarre) .

Je pense que ton erreur vient du fait que tu as oublié de préciser l'unité dans laquelle les fonctions devaient traiter les angles.
Dans les calculs précédents, j'ai utilisé le radian comme unité (unité par défaut utilisée par SAMP).
Si ton angle est en degré (ce qui est la plupart du temps le cas), il faut appeler la fonction comme suit :

floatsin (270.065460, degrees);
++
Syg
Courtesy of GtaManiac

Hors ligne [StAfF]MaN

  • [StAfF] forever ^^
  • *
  • Gangster
  • [StAfF] un jour, [StAfF] toujours ^^ !!!
  • Messages: 1040
    • Voir le profil
    • SITE [StAfF]
Re : codes/scripts utiles
« Réponse #49 le: 26 Janvier 2009, 17:46:44 »
comme d'hab, sur le cul xD fallait y penser :p
^v^v^v^v|
   StAfF  |                              IP: gtaunderground.No-Ip.org

^v^v^v^v|

Hors ligne S!m

  • *
  • Messages: 2341
    • Voir le profil
Re : codes/scripts utiles
« Réponse #50 le: 26 Janvier 2009, 19:27:18 »
Salut,

désolé, :closedeyes
j'ai compris mon erreur en faisant la même erreur sur ma calculatrice tantôt... sacrés radians...

et pour la performance, je m'en doutais mais ça m'aura fait pratiquer mes mathématiques XD

EDIT:

Pour me rattraper, une fonction que je viens d'ajouter à mon "turoriel" sur les opérateurs et autres...

Il est possible de créer une fonction afin de déterminer si un nombre est pair ou impair grâce à l'opérateu & r:
stock IsImpair(Number)
{
    return number & 1;
}

Encore, il est possible d'améliorer cette fonction à l'aide de DEFINE (voir plus bas)

#define IsImpair(%0) %0 & 1

En espérant que ça fonctionne, c'étais OK directement dans mon code....

++Sim++
« Modifié: 27 Janvier 2009, 01:25:11 par Sim »





Hors ligne Nikko™

  • *
  • Mafioso
  • Messages: 2393
    • Voir le profil
Re : codes/scripts utiles
« Réponse #51 le: 27 Janvier 2009, 18:57:07 »
Salut,

petite question: A quoi ca sert de savoir si un nombre est pair ou impair ? Ca sert dans des commandes ?

++
nikko

Hors ligne S!m

  • *
  • Messages: 2341
    • Voir le profil
Re : codes/scripts utiles
« Réponse #52 le: 28 Janvier 2009, 23:18:56 »
Salut,

bien ça peut servir à trier certains trucs, il faut aussi noter qu'il est possible de faire la même chose pour n'importe quel bit:

if(number & 2)....
if(number & 4)....
if(number & 8)...

ça peut être utile si l'on veut, par exemple, trier certains joueurs à droite, d'autres à gauche, les pairs à droite et.....


++Sim++





Hors ligne Bayshore

  • *
  • Grand Banditisme
  • Messages: 923
    • Voir le profil
Re : codes/scripts utiles
« Réponse #53 le: 31 Janvier 2009, 11:05:22 »
En fait if(number & 2) ça équivaut à faire if((number % 2) == 0) ?

PS: Première méthode --> plus rapide.
« Modifié: 31 Janvier 2009, 11:21:07 par Bayshore »

Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : codes/scripts utiles
« Réponse #54 le: 02 Février 2009, 21:55:38 »
Tout à fait Bayshore.
Mais ceci n'est possible qu'avec 2, 4, 8, 16, .... (toutes les puissance de 2).

Si on veut savoir si un nombre est divisible par 3, il faut utiliser le modulo (modulo = reste de la division) :
if ((Nombre % 3) == 0)
Le modulo est beaucoup plus lent car il implique une division.
Le & bit à bit est quasiment instantané.

++
Syg
Courtesy of GtaManiac

Hors ligne S!m

  • *
  • Messages: 2341
    • Voir le profil
Re : codes/scripts utiles
« Réponse #55 le: 13 Mars 2009, 15:04:08 »
Bonjour à tous,

je viens de nouveau publié des fonctions qui n'ont aucun potentiel  :D

Ajouter une majuscule au début de chaque mot(après un espace) :

stock NomPropre(tmp[])
{
if(tmp[0] >= 'a' && tmp[0] <= 'z')
{
tmp[0] &= ~0x20;//devient une majuscule (on pourrait aussi utiliser la fonction toupper
}
new len = strlen(tmp);
for(new i = 1; i < len; i++)
{
    if(tmp[i] == ' ')
    {
        i++;
if(tmp[i] >= 'a' && tmp[i] <= 'z')
{
tmp[i] &= ~0x20;
}
}
}
}

Toutes les lettres d'un texte en majuscules :

stock Capitalize(tmp[])
{
for(new i = strlen(tmp); i >=0; i--)
{
if(tmp[i] >= 'a' && tmp[i] <= 'z')
{
tmp[i] &= ~0x20;
}
}
}

Toutes les lettres d'un texte en minuscules :

stock Minus(tmp[])
{
for(new i = strlen(tmp); i >=0; i--)
{
if(tmp[i] >= 'A' && tmp[i] <= 'Z')
{
tmp[i] |= 0x20;
}
}
}


en espérant qu'il y ait pas trop de fautes :p

p.s. codes NomPropre et Minus testés

++Sim++





Hors ligne Nikko™

  • *
  • Mafioso
  • Messages: 2393
    • Voir le profil
Re : codes/scripts utiles
« Réponse #56 le: 13 Mars 2009, 15:31:17 »
Mdr les fonctions, merci quand meme  :) :laugh

++
nikko

Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : codes/scripts utiles
« Réponse #57 le: 14 Mars 2009, 23:18:55 »
Des fonctions que l'ont fait quand on débute, sous forme d'exercice.
Juste quelques remarques, comme à mon habitude.

Le plus souvent, on ajoute ou retranche 0x20, plutôt que d'utiliser &= ou |= avec ~, c'est plus clair et plus simple:
tmp[i] += 0x20; // pour mettre une majuscule en minusculetmp[i] -= 0x20; // pour mettre une minuscule en majusculeEt ça fait exactement la même chose.

Sinon, dans ta fonction NomPropre, il manque le cas des parenthèses, des apostrophes et des guillemets.
Exemple :
bonjour, je m'appelle "jean" (mais tout le monde m'appelle jeannot).
Avec ta fonction, on aura :
Bonjour Je M'appelle "jean" (mais Tout Le Monde M'appelle Jeannot).
Le résultat correct devrait être :
Bonjour Je M'Appelle "Jean" (Mais Tout Le Monde M'Appelle Jeannot).

++
Syg
Courtesy of GtaManiac

Hors ligne Anthony Wolf

  • *
  • Criminel
  • Messages: 48
    • Voir le profil
Re : codes/scripts utiles
« Réponse #58 le: 15 Mars 2009, 09:53:57 »
Commende pour avoir des armes :

if (strcmp("/armes 1", cmdtext, true, 10) == 0)
{
SendClientMessage(playerid, COLOR_GREEN,"*** Rangé d'arme 1 ***");
    GivePlayerWeapon(playerid, 44,1);
    GivePlayerWeapon(playerid, 31, 9999);
    GivePlayerWeapon(playerid, 25, 9999);
    GivePlayerWeapon(playerid, 23, 9999);
    GivePlayerWeapon(playerid, 43, 9999);
return 1;
}

 :snip  :rules

 

Hors ligne Bayshore

  • *
  • Grand Banditisme
  • Messages: 923
    • Voir le profil
Re : codes/scripts utiles
« Réponse #59 le: 15 Mars 2009, 10:07:43 »
Sim, les deux dernières fonctions existaient déjà dans dutils (mais en plus lourd).

À noter qu'à mon avis un toupper( tmp[i] ) est plus rapide que ce que tu fais.

Un truc pas mal à faire serait de vérifier si le caractères est supérieur à 128, puis vérifier si c'est un accent (ce que toupper() ne gère pas).