• 06 Mai 2024, 02:20:47


Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Sujets - S!m

Pages: 1 [2] 3 4
16
Scripting SA-MP [Pawn center] / Discussion sur les streamers
« le: 06 Décembre 2010, 18:56:30 »
Discussion sur les streamers

Je vous invite tous à partager vos idées sur les méthodes que l'on pourrait utiliser dans un streamer, le tout dans le but de créer de nouveaux streamers plus efficaces et qui effectuent mieux le travaille de point de vue du joueur. Soyez imaginatifs. Le but? très simple: créer une nouvelle génération de streamer plus efficaces, plus propres, qui seraient pratiquement invisibles aux yeux des joueurs, sans pour autant monopoliser la machine sur laquelle ils sont exécutés.

Si vous ne savez pas ce qu'est un streamer, veuillez vous abstenir de poster. Ce fil de discussion s'adresse principalement aux scripteurs avancés.

Avant toute chose, la plupart des idées que je vais donner ici proviennent de ce topic: Two Topic by Y_LESS

Tout comme Y_LESS, je pense qu'il faut séparer le sujet en 3 sous-sujets.

  • 1. Algorithme de gestion des objets. C'est à dire l'idée principale de la méthode de calcul, exemple simple calcul de distance, utilisation de zones...
  • 2. Implantation de l'algorithme. Certains algorithmes représentes des défis à implantés, pour éviter les limites principalement et que le code soit propre.
  • 3. Gestion de l'interaction avec les scripts. Comment on s'arrange pour que ce soit très simple à utiliser et que tous les scripts y aient accès.


1. Algorithme

L'algorithme, c'est le principe de fonctionnement du streamer. L'idée derrière le script. Par exemple, on peut simplement tester la distance entre un joueur et un objet et décider ainsi si l'on affiche ou non l'objet. On peut aussi regarder la distance de plein d'objets et choisir les objets les plus proches parmi la liste.

Je vais ci dessous présenter quelques algorithmes relativement connus.

Distance de vue simple:

Cet algorithme consiste simplement à regarder si un objets est dans un certains rayon autour d'un joueur. Les streamer utilisant ce principe sont: xobjects, midostream, ...
Ces streamer sont les plus simple, les plus limités et ceux qui comportent le plus de problèmes potentiels quant à ne pas voir certains objets proches quand la densité d'objet d'une zone est grande.
Le code est, à la base, à peu près structuré ainsi:
Stream(playerid)
{
    for(new o = 0; o < MAX_STREAM_OBJECTS; o++)
    {
        if(IsPlayerInRangeOfPoint(playerid, MAX_VIEW_DIST, obj[o][x], obj[o][y], obj[o][z]))
        {
             on affiche l'objet
        }
        else
        {
             on cache l'objet
        }
    }
}

Le principal avantage de cet algorithme, c'est qu'il est simple à coder.

Distance, les plus proches:

Cet algorithme affiche les objets les plus proches d'un joueur, un peu plus difficile à implanter que l'algorithme précédant, il demande un peu plus de calcul mais évite le problème d'objets très proches qui peuvent ne pas apparaitre. De plus la distance de vue n'est plus un paramètre, elle varie en fonction de la densité d'objet de la zone dans laquelle se trouve le joueur. Un exemple de streamer utilisant cette méthode est SuperStream.
Le code est à peu près structuré comme ceci:
Stream(playerid, Float:X, Float:Y, Float:Z)
{
    new array_objects[MAX_STREAM_OBJECTS][2];//on va stocké dans cet array les distances et les ID des objets pour pouvoir les ordonner selon la distance ensuite
    for(new o = 0; o < MAX_STREAM_OBJECTS; o++)
    {
         array_objects[o][0] = o;
         array_objects[o][1] = GetDistance(X, Y, Z, obj[o][x], obj[o][y], obj[o][z]);
    }
    order(array_object);//fonction qui place les objets du plus proche au plus loin
    for(new o = MAX_STREAM_OBJECTS; o >= MAX_OBJETS_VUS; o--)
    {
         on efface les objets qui ne doivent pas être vus  
    }
    for(new o = 0; o < MAX_OBJETS_VUS; o++)
    {
         on crée les objets qui doivent être vus  
    }
}

Cet algorithme, bien que plus difficile à implanter, permet une bonne amélioration de la qualité de l'illusion générée par le streamer et ne comporte pas de problème majeur. Toutefois, il faut faire attention car cette méthode demande plus de calcul et peut donc gérer un moins grand nombre d'objets.

Division de l'espace en zones:

Cette méthode consiste simplement à divisé l'espace en zone, on peut ainsi ne parcourir que les objets qui sont près du joueur, ce qui permet d'augmenter grandement la limite d'objets, surtout s'ils sont bien distribués sur la carte. Cette méthode est utilisé, entre autre, par Simstream et Y_objects. D'ailleurs on peut le remarquer dans la limite du nombre d'objet. Toutefois, je dois admettre que je l'ai plutôt mal implanté dans Simstream...
Le code de ce genre de méthode demande l'ajout de quelques fonctions, comme une fonction pour ajouter/retirer un objet d'une zone, le changer de zone etc... il faut faire attention à la façon dont on les gère. Je ne donnerai pas d'exemple pour cette méthode car plus complexe et longue à coder...

Autres:

Il existe bien sur plusieurs autres méthode. D'ailleurs, c'est le but de ce topic, trouver de nouvelles méthode qui pourraient être plus efficaces que celles déjà utilisées.

Dans une autre catégorie d'algorithme, on peut aussi déterminer la position ou SERA le joueur. Il ne faut pas oublier que la position récupérer est la dernière position connue du serveur, que la position est déjà différente et que le temps que les données soient reçus, le joueurs aura bougé. On peut donc ajuster selon la position probable du joueurs quels objets il verra. C'est ici que la velocity devient utile.


2. Implantation de l'algorithme

Le second défi de la création d'un streamer, est l'implantation de l'algorithme, je ne m'éterniserai pas sur cette section, mais elle est tout de même importante.

Certaines des méthodes présentés sont relativement difficiles à implanter, par exemple, la méthode des objets les plus proches demande une fonction pour classer les objets, cette fonction, afin de la rendre efficace, nécessite l'utilisation de méthodes de classement qui peuvent être relativement compliquées.

ps. concernant la fonction de classement, je recommande d'utiliser QuickSort de Y_Less, modifiée pour un array à 2 dimensions.

En ce qui concerne l'utilisation de zones, le défi vient quant à la gestion des zones elles mêmes, les concevoir de façon à ne pas limiter l'utilisateur. Par exemple, dans SimStream on ne peut ajouter d'objets hors des zones, c'est à dire à une valeur en X ou Y supérieure à 4000 ou inférieure à -4000 (dépendant des paramètres). Une solution est de créer une zone supplémentaire dans laquelle on place tous les objets qui ne sont pas dans les zones normales. De plus, trouver une façon d'ajouter les zones sans pour autant multiplier la quantité de mémoire utilisée par le script est un défi. Je recommande ici l'utilisation de listes.

Cette section est plutôt importante dans la discussion, selon moi.


3. Gestion de l'interaction avec les scripts

Cette section est celle qui pourrait être la plus complexe, si l'on veut une intégration la plus invisible possible.
L'idéal serait de n'avoir qu'à inclure le streamer dans chacun des scripts et que tout fonctionne.
Bien sur, ceci est difficile.

Une méthode proposée par Y_LESS est l'utilisation de son master system. En gros, ce système permet de gérer l'interaction de scripts entre eux. Ils sont tous identiques, ils comportent tous les streamer et la possibilité de communiquer avec les autres, d'être client ou serveur.
Toutefois, le système désigne l'un des script comme le maitre.
Les autres font appel à lui comme serveur, et lui est le streamer.
YSI comporte cette fonction. Toutefois, c'est très difficile à implanter.
Y_LESS admet que son système était rendu très compliqué et lourd à coder, c'est l'une des raisons pourquoi il a arrêté ce projet.

Une autre méthode, qui selon moi est beaucoup plus envisageable pour le moment, est la création d'un filterscript qui sera le serveur, et tous les scripts font appel à lui avec des CallRemoteFunction. Cette méthode est l'une des plus utilisée. SuperStream, SimStream, midostream... utilisent cette méthode.

Dernière méthode et la moins intéressante, Tout mettre ses objets dans un seul filterscript qui est le streamer. Xobject utilise cette méthode.
Cci cause de nombreux inconvénient.
On ne peut mettre les objets que dans un script, limite l'interaction des autres scripts...


Ce que je vous demande


Après avoir lu tout ce texte (et au besoin le monstre de Y_LESS), je vous demande trois petites choses:
partagez vos idées pour des améliorations. Que ce soit dans n'importe quelle des sections présentées, vos idées seront toutes les bienvenues.
Soyez original, essayez d'éviter les idées déjà connus (je ne les ai pas toutes listées).
Soyez précis, donnez autant de détails que possible, afin de facilité la compréhension de votre idée.

Merci de votre attention.

Sim.

17
Scripting SA-MP [Pawn center] / DÉPLACÉ: IP dynamique
« le: 28 Novembre 2010, 23:54:03 »
Ce fil de discussion a été déplacé vers Autre.

http://www.gtaonline.fr/forums/index.php?topic=12173.0

18
Règles

  • Les règles générales concernant le forum sont toujours en vigueur dans cette section (voir Règlements).
  • En ce qui concerne l'affichage de code sur le forum, lire ce topic
  • Avant de poser une question, faites une recherche complète avec google et la fonction rechercher du forum. Ceci évitera de revoir des centaines de fois la même question. Si vous avez fait une recherche sans trouver de résultat concluant, mentionnez le.
  • Donnez un nom clair à vos sujets
  • Ne demandez pas de code tout fait, le Pawn center est un forum d'entraide.
  • Évitez de faire un UP après moins de 48 heures.
  • Évitez de poster des scripts compilés sans en fournir la source. Ceci est valable pour tous.

Les infractions à ces règles ne seront pas tolérés.
Notez que ces règles peuvent changer dans un futur proche, tenez vous au courant pour ne pas en subir les conséquences.



Conseils aux membres

Nouveaux

Premièrement: Ceci est un forum d'aide, ne venez pas demander des codes tout faits.
Les seuls scripts qui vous sont fournis sont ceux présents dans la section de publication.
Vous pouvez toutefois nous demander de vous aider à le concevoir, mais pas le coder à votre place.
À noter, ce n'est pas en laissant les autres faire le boulot qu'on apprend.

Avant de poser une question concernant le script, assurez vous de lire les principaux tutoriels présents dans la section qui leur est dédiée, ceci vous permettra de comprendre l'aide que nous vous fournirons et pourra vous évitez un grand nombre d'erreurs.
Si vous ne comprenez pas, n'hésitez pas à demande plus d'explication dans le sujet du tutoriel.

Quand vous poster un nouveau sujet, assurez vous de le nommer de façon claire et précise.
Les sujets nommés dans ce style: AIDEZ MOI SVP, problème code... Ne seront pas tolérés.
Un titre clair et précis serait de ce genre: Rejet de mot de passe à la connexion.
Le mot problème en lui même peut être éliminé car si vous postez c'est que vous avez un problème.
Lorsque le problème est résolu, ajoutez [RÉSOLU] devant le nom du sujet (grâce à la fonction modifier).

Si vous êtes un grand utilisateur, j'entends que vous faites beaucoup de demandes d'aide, regroupez toutes vos questions dans un seul sujet. On évitera un trop grand nombre de sujets ainsi.

Un petit conseil, quand vous choisissez d'utiliser un code déjà fait, lisez le de long en large et assurez vous de comprendre son fonctionnement, vous pouvez même venir demander des explications. De façon générale, il est recommandé de commencer avec un script de Stunt, Freeroam (comme ls-parachute) ou DM (deathmatch). Ces scripts sont les plus simples et donc plus aisément compréhensible.

Comment faire une demande d'aide

PARTIE I
Tout d'abord commencer par une formule de politesse telle que "Bonsoir" ou "Bonjour".
Ensuite présenter une explication en français et non dans un langage SMS.


PARTIE II
Si le code qui vous pose problème est supérieur a 20 lignes, rendez-vous sur le Pastebin de GTAOnline http://pastebin.gtaonline.fr.
Si le code est plus petit que 20 ligne veuillez le mettre impérativement entre les balises code comme si dessous

[ code=pawn]//votre code[ /code]Si le compilateur pawn vous a renvoyé des erreurs, postez les comme indiqué ci-dessus.
/!\ Si le compilateur pawn vous renvoie 26 erreurs, merci de bien vérifier que cela ne vienne pas d'une accolade de fermeture manquante dans votre code.

PARTIE III
Tout comme pour le début de votre message, une formule de politesse pour finir votre message est tout à fait bienvenue et agréable pour les autres membres. En ne l'oubliant pas, vous vous attirerez plus probablement l'aide et la sympathie des autres membres, ce qui vous aidera à régler votre problème plus vite.

Tous

Lorsque vous postez une réponse, assurez vous que la formulation ne soit pas irrespectueuse, ceci n'est arrivé que trop souvent dernièrement. Vous éviterez ainsi nombre d'affrontements inutiles.

Les formules de politesses, bien que non-obligatoires, sont fortement conseillées. En plus de contribuer à la bonne ambiance du forum, elles permettent une structure du message. Une forme introduction-corps-conclusion.

Les réponses doivent être en lien avec le sujet. Si vous voulez parlez à un membre en particulier sur une chose mentionnée, mais non directement liée au sujet, faites le par PM.

Lorsque vous corrigez un autre membre, faites le avec délicatesse. Il ne sert à rien de le "caler", vous n'en paraitrez pas meilleurs.



Tous ces conseils tiennent du bon sens, si vous êtes respectueux et responsable, ils ne devraient pas vous causer le moindre problème.

Pour tout commentaire/suggestion, veuillez me contacter par PM.

20
Trucs de scripting

Table des matières
Présentation

1 - Normes de programmations

2 - Utilisation des directives de précompilations
   2.1 - Les define
   2.2 - Les if
   2.3 - Les pragma

3 - Arrangement des variables
   3.1 - Qu'es-ce qu'une variable?
   3.2 - Déclaration correcte de variable
   3.3 - Utilisation d'enum
   3.4 - Local ou global?

4 - La validations de fonctions
   4.1 - Vérifier l'effectivité d'une fonction
   4.2 - Vérifier la vitesse d'exécution
   4.3 - Vérifier les possibilités gérées

5 - Les fonctionnalités du langage
   5.1 - Les state

6 - Conseils généraux
   6.1 - L'utilisation du pseudo-code

7 - Conclusion

Présentation

J'ai cru remarqué que bien des gens utilisent certaines "fonctionnalités" à tord et à travers, de façon pas très pratique ou les ignorent carrément. Notez bien que ceci n'est qu'une ébauche, ce post sera modifié selon ce qui est demandé et intéresse les gens, d'ailleurs, merci de passer vos commentaires suggestions afin de rendre ce tuto plus pertinent et complet.

1 - Normes de programmation

Certaines normes existent en programmation, ceci est valable pour TOUS les langages de programmations.
Je vais en présenter quelques une, mais il en existe une multitude d'autres:

#1 - Les constantes sont en MAJUSCULES
#2 - Les variables sont en minuscules, et débutent avec une majuscules.
#3 - Dans les noms de variables et de fonctions, les différents mots sont séparés par l'underscore ("_") ou débutent avec une minuscule.
#4 - Les variables globales débutent par un g.
#5 - Les accents ne sont pas acceptés (pas une norme, mais tout se fait en anglais et les compilateurs ne prennent pas les accents, pour la plupart)

Exemple:
#define CARACTERE_INCONNU    (43)
new gVariableGlobale;

forward maFonction();
forward autre_fonction(text[]);

main()
{
    new variable_locale;
    new héhé;//erreur!
    new trucBizarre;
}

2 - Utilisation des directives de précompilations

Les directives de précompilation sont les expressions généralement précédées par le caractère '#'.
Il s'agit de directives s'adressant au compilateur (le programme qui traduit le code pour qu'il soit compréhensible par la machine).
Ces directives peuvent servir à donner des précisions, annuler des bouts de code, modifier les paramètre de compilation (stack alloué lors de l'exécution par exemple), etc.

2.1 - Les defines

La directive #define est probablement la directive la plus utile. Sa structure est la suivante:

#define EXPRESSION VALEUR
Le terme valeur n'est pas le meilleur terme, un terme plus approprié serait EXPRESSION_RÉSULTANTE.
Il faut bien comprendre que lorsque le compilateur rencontre cette directive, il remplacera EXPRESSION par VALEUR partout dans le code suivant la directive (à moins d'ordre contraire, la directive #undef EXPRESSION permet de stopper la directive #define correspondante).
Simplement en sachant ceci, je suis certains que vous pouvez identifier de multiples usages de cette directive.

Normalement, EXPRESSION est considéré comme une constante, on se doit donc de l'écrire en majuscules.

#define SALUT_CA_VA
#define TRUC_PEU_UTILE
#define COULEUR_INUTILE 0xF1054

En voici quelques un avec un petit exemple:

Création de fonctions (macro):

Je sais que je viens de dire de toujours utiliser des majuscules, mais comme il s'agit d'une technique afin de discerner les defines, les fonctions de defines n'entrent que partiellement dans cette catégorie (d'ailleurs POINT_TO_POINT c'est laid et peu pratique).

Fonctions de calcul de distance:
#define PointToPoint(%0,%1,%2,%3,%4,%5,%6) ((%0 - %3) * (%0 - %3) + (%1 - %4) * (%1 - %4) + (%2 - %5) * (%2 - %5) <= (%6 * %6))
#define GetDistance(%0,%1,%2,%3,%4,%5) floatsqroot((%0 - %3) * (%0 - %3) + (%1 - %4) * (%1 - %4) + (%2 - %5) * (%2 - %5))

Fonctions simplifiant l'envoi de message:
#define MsgBlanc(%0,%1) SendClientMessage(%0, 0xFFFFFFFF, %1)
#define TypoMsg(%0,%1) MsgBlanc(%0, "FORMULATION: " #%1)
#define MsgBlancFormat(%0,%1,%2)\
    {\
        new msg_tmp[128];\
        format(msg_tmp, sizeof(msg_tmp), %1, %2);\
        MsgBlanc(%0, msg_tmp);\
    }
#define Kill(%0) SetPlayerHealth(%0, 0.0)

Qui se traduisent comme suit (pour mettre dans un include par exemple):
forward PointToPoint(Float:X1, Float:Y1, Float:Z1, Float:X2, Float:Y2, Float:Z2, Float:Distance);
forward Float:GetDistancet(Float:X1, Float:Y1, Float:Z1, Float:X2, Float:Y2, Float:Z2);
forward MsgBlanc(playerid, text[]);
forward TypoMsg(playerid, commande[]);
forward MsgBlancFormat(playerid, text[], _:liste..);
forward Kill(playerid);

Pour ceux qui n'ont pas identifié les fonctions:
»La première permet de savoir si deux points sont à une distance inférieure ou égale au paramètre distance.
»La seconde retourne en nombre à virgule la distance entre deux points.
»La troisième permet de raccourci un SendClientMessage et le mettre blanc
»...

PS. la première est plus rapide que la seconde car elle ne comporte aucun appel à une fonction qui est nécessairement plus lente que de simples multiplications de variables, de plus une racine carrée est nécessairement complexe.

Définition de constantes

Par ailleurs, une autre fonction des defines est de rendre les valeurs redondantes plus lisible et simple à modifier:

Par exemple, disons que vous désirez utiliser la couleur rouge : 0xFF0000FF
utilisée une fois ça va, mais disons que l'on retrouve partout dans votre code une telle chose:

SendClientMessage(playerid, 0xFF0000FF, "Salut");La couleur en question n'est pas simple à voir, l'utilisation d'un define est recommandée.

La définition de constante, bien que très simple, comporte quelques subtilités.

[!]Ne pas oublier la règle des majuscules dans ce cas-ci.

Exemples:

#define COLOR_BLUE (0x00FF00FF)
#define COLOR_GREEN (0x0000FFFF)
#define COLOR_RED (0xFF0000FF)
#define COULEUR_JAUNE 0xFFFF00AA

Notez bien que les parenthèses sont optionnelles, le define peut se faire en français ou en anglais (ou une autre langue) au choix.

2.2 - Les #if

Les #if peuvent d'avérés particulièrement utiles dans les gros scripts.
Ils permettent de faire des test avant même la compilation du script.

Un exemple simple que tous connaissent est le #if defined FILTERSCRIPT au début du new.pwn
Il permettait d'activer/désactiver une section du script simplement en modifiant un #define en haut du script.

Ce genre d'application est le plus fréquent.
Toutefois, il est possible de les utiliser avec des valeurs (qui doivent être constantes).

Par exemple, au début du streamer Y_OBJECTS on peut voir:

#if !defined OBJECT_SECTOR_SIZE
#if OBJECT_DISTRIBUTION <= 10
#define OBJECT_SECTOR_SIZE (1)
#endif
#endif

#if !defined OBJECT_SECTOR_SIZE
#if OBJECT_DISTRIBUTION <= 100
#define OBJECT_SECTOR_SIZE (5)
#endif
#endif

#if !defined OBJECT_SECTOR_SIZE
#if OBJECT_DISTRIBUTION <= 1000
#define OBJECT_SECTOR_SIZE (10)
#endif
#endif
La taille des secteurs dépend de la valeur de OBJECT_DISTRIBUTION (qui est définie plus tôt dans le script à l'aide de define).

Je n'irai pas plus en détail dans cette partie puisque peu de gens utilisent vraiment...
Si jamais vous avez besoin de détails, posez vos questions à la suite du topic.

2.3 - Les #pragma

Pour la plupart, les gens ne comprennent pas ce que font les différentes directives des pragma, nous allons donc les aborder une à une.

#pragma dynamic:

Cette directive permet d'augmenter le stack (mémoire locale) accessible au script. Faire bien attention avec celle si si vous allouez trop de stack à vos fs vous pourriez atteindre la limite (et oui il y en a une, il y a toujours une limite, mais peu probable que vous l'atteignez).

Vous utilisez trop de variables locales lorsque vous obtenez un avertissement de mémoire, comme ceci:

Citation de: PAWN Compiler Output
Pawn compiler 3.2.3664           Copyright (c) 1997-2006, ITB CompuPhase

Header size: 1592 bytes
Code size: 63816 bytes
Data size: 119508 bytes
Stack/heap size: 16384 bytes; estimated max. usage=4108 cells (16432 bytes)
Total requirements: 201300 bytes

Vous avez alors trois options:

 - réduire vos variable (mieux)
 - passer vos variables en global
 - utiliser un #pragma dynamic

Réduire les variables est malheureusement une option partielle (parfois ne s'applique pas), mais surtout compliquée, les gens n'aiment pas ça....
Passer les variables en global est une technique très simple qui est toutefois relativement peu utilisée à cause des conflits de noms de variable possiblement générés.
Utiliser un pragma dynamic semble être une technique très prisé. De plus, le message d'erreur nous indique déjà combien de mémoire est nécessaire à la bonne exécution du programme (selon la mesure du compilo).
Dans ce cas-ci, un #pragma dynamic 210000 est parfait (il est recommandé de mettre un peu plus que la valeur indiqué par le compilo).

#pragma unused

La directive unused permet d'enlever un avertissement disant qu'une expression est inutilisée, ceci peut arriver avec des variables, des fonctions ou des paramètres.
Cette directive ne devrait être utilisée que dans un seul cas: une fonction dont un paramètre est inutilisé.

Pour les variables et les fonctions, s'il y a possibilité de les utiliser ou non selon par exemple un define, vous devriez savoir que vous pouvez les déclaré en stock ce qui annule leur compilation dans ce cas.

#pragma tabsize

Cette directive permet de modifier la taille du TAB, attention, elle ne s'adresse qu'au compilateur. Utiliser un tabsize de 0 permet d'éliminer les avertissements concernant l'indentation, ce n'est toutefois pas recommandé car les scripts mal indentés peuvent aisément devenir illisibles.

J'en profite pour le répéter: L'INDENTATION EST TRÈS IMPORTANTE! ELLE FAIT TOUTE LA DIFFÉRENCE ENTRE UN SCRIPT FACILE À CORRIGER ET PRESQUE IMPOSSIBLE À CORRIGER.

Notez qu'il existe bien d'autres directives #pragma, la plupart sont toutefois inutiles je ne les ai donc pas abordés

3 - Les variables

3.1 - Qu'es-ce qu'une variable?

Une variable, c'est simplement un espace dans la mémoire qui sert à retenir une information.
En PAWN, toutes les variables sont semblables. Elles font toutes 32 bits (ou 4 octets) et ne sont que faiblement typées.
Bref, vous voulez réutiliser une information plus tard? Stockez-la dans une variable!

Les variables se séparent en deux catégories en PAWN:

 - les variables locales
 - les variables globales (ou static, qui pourrait être une 3e catégorie)

Les variables Locales:

Les variables locales demeurent généralement seulement un court instant dans la mémoire de la machine, elles sont stockées sur le stack. Il faut faire attention à la mémoire utilisée par les variables locales, si jamais elles représentent trop de mémoire, le compilateur vous avertira d'un usage excessif de la mémoire par ce message donc j'ai parlé précédemment dans la partie sur la directive #pragma dynamic.

Toutefois, il faut faire attention avec les fonction récursives. Puisque la fonction s’appelle elle-même, à chaque appel elle recrée les variables ce qui risque d'entrainer un dépassement de la mémoire allouée.
Or, ce genre de dépassement est difficilement détectable pour le compilateur.
Il ne peut vous indiquer une quantité de mémoire utilisé puisqu'il ne peut savoir combien de fois la fonction sera appelée.
Ces fonctions sont très pratiques pour résoudre certains problèmes, toutefois il ne faut pas en abuser.

Les variables globales:

Ces variables peuvent être aussi nombreuses que désiré (jusqu'à une certaine limite déterminée par la machine bien sûr). D'ailleurs vous pourrez remarquez en compilant un script comprenant une grande variable locale qu'elle est directement présente dans le fichier .amx. Ceci permet l'initialisation de la variable, c'est à dire lui attribuer une valeur de départ. Dans le cas bien particulier de l'initialisation dans l'en-tête du script, la valeur de départ est présente dès l'allocation de la mémoire à la variable, contrairement à l'initialisation dans une fonction.

Les static:

La directive static permet de créer une variable qui n'est ni globale ni locale.

Si la variable est déclaré comme une variable globale, elle sera accessible dans toute la section de code correspondante.
Par exemple, une variable static déclarée dans une bibliothèque(include) est accessible partout dans la bibliothèque mais n'est pas accessible dans le script qui utilise la bibliothèque en question.

Si la variable est déclaré comme une variable locale, elle sera accessible de la même façon qu'une variable locale normale, mais elle ne sera pas effacée de la mémoire à chaque appel et sa valeur précédente ne sera donc pas perdue.

3.2 - Déclaration de variables:

Pour déclarer une nouvelle variable, un seul mot clé est nécessaire: new
Le nom de la variable (l'expression qui suit new) doit être non-utilisée par le langage lui-même, par exemple on ne peut utiliser state comme nom de variable.

[!] N'oubliez pas la norme: une variable commence toujours par une minuscule. De plus, on ajoute g au début des variables globales.

Exemple:

new gJoueursConnectes[MAX_PLAYERS];//crée un tableau pour savoir si les joueurs sont connectés
new gCompteDeJoueurs;
new Float:gValeurQuelconque = 234.231;

3.3 - Utilisation d'enum:

Les enum peuvent être utilisés de plusieurs façons, dans certains cas il peuvent remplacer des defines (comme pour des teams) de la façon suivante:

enum
{
NO_TEAM,
TEAM_1,
TEAM_2,
TEAM_3,
...
}
PS. il n'existe aucune norme de majuscule ou autre dans les enum, il faut toutefois s'arranger pour éviter les conflits de noms.

L'avantage des enum dans les variables est très simple, ils permettent de faire un tableau dont les différentes colonnes/rangées ne sont pas de même types/taille.
Par exemple, dans un même tableau il est possible de retrouver des entiers, des nombres à virgules, des mots...
Toutefois, pour pouvoir utiliser un enum dans une fonction/variable, il faut le nommer, voici un exemple de variable utilisant un enum:

enum enum_stats
{
Float:Pos_X,
Float:Pos_Y,
Float:Pos_Z,
  player_name[MAX_PLAYER_NAME],
  kills,
  death
}
new gPlayerStats[MAX_PLAYERS][enum_stats]

Nous pouvons ensuite utiliser cette variable comme suit:
GetPlayerPos(playerid, gPlayerStats[playerid][Pos_X], gPlayerStats[playerid][Pos_Y], gPlayerStats[playerid][Pos_Z]);
GetPlayerName(playerid, gPlayerStats[playerid][player_name], MAX_PLAYER_NAME);

3.4 - Local ou global?

Cette partie est sans doute la plus simple, il faut toutefois faire une nuance. Il existe des situations où il est préférable d'utiliser des variables globales, d'autres locales.
Personnellement, je tente de limiter le plus possible l'utilisation de variables globales pour des usages locaux. Un bon exemple est le ystring dans le script de course yrace. il faut éviter ce genre de choses car il serait possible que la variable soit utilisées par deux bouts de code en même temps (même si très peu probable et le tout dépend de la façon que vous l'utilisez)).
Lorsque vous n'avez pas besoin de conserver la valeur d'une variable hors de la fonction (excluant les appels à d'autres fonctions par la fonction elle-même), la variable devrait être locale.
Les variables qui peuvent être utilisés à plusieurs endroits dans le scripts n'étant pas nécessairement directement liés (par des appels entre-eux disons) devraient être globales. il faut noter que l'on marque généralement les variable globale en utilisant la lettre g devant elles (g pour global).

Comment savoir si une variable est locale ou globale?

C'est très simple, les variables déclarées hors de tout bloc d'instruction (par exemple en haut complètement du script) sont globales. Celle qui sont déclarées dans des blocs d'instructions (fonctions, callback etc..) sont généralement locales.

Bref,
globales : en-tête (hors de tout bloc d'instruction)
locales : variables déclarées dans des blocs d'instructions

petit exemple:
new test;//cette variable est globale car elle est de niveau 0 (hors de toute fonction)
public OnPlayerCommandText(playerid, cmdtext[])
{
new test2 = 12;//cette variable est locale car déclarée dans la fonction, elle n'est valide que dans le bloc d'instruction (entre les {})
//la variable test est toujours valable
if(strcmp("text", cmdtext[1], true, 4) == 0)
{
//les deux variables sont valides
GameTextForAll(cmdtext[6], 4000, 5);
return 1;
}
return 0;
}

4 - La validation de fonctions

J’entends par validation la vérification d'une fonction, s'assurer qu'elle est relativement efficace et pourra gérer la plupart, voir tous les cas possibles.

4.1 - Vérifier l'effectivité d'une fonction

J'entends ici de vérifier le fonctionnement d'une fonction, si tout se déroule normalement.

Il n'y a pas de technique magique, il faut marquer les différentes parties des fonctions.
Pour marquer, une seule fonction suffit, printf.
À chaque action, il faut pouvoir savoir si elle est réussie ou non.
Donc un print avant et après.
Bien sûr, certaines actions ne sont pas à risque de rater comme un simple SendClientMessage.
Si des variables sont modifiées, il est recommandé d'en faire un print avant et après le moindre changement.

[!] Si votre fonction ne rencontre pas de problème à l'exécution et donne le bon résultat, ceci n'est pas nécessaire.

Un petit exemple?
En voici un très simple:
IsMoto(vehicleid)
{
new model = GetVehicleModel(vehicleid);
printf("model vehicle: %d", model);
switch(model)
{
case 448,461,462,463,468,471/*(quad)*/,481,509,510,521,522,523,581,586:
{
model = 1;
}

default:
{
model = 0;
}
}
printf("IsMoto: %d", model);
return model;
}
Donc en regardant le log il est assez aisé de savoir si la fonction fonctionne correctement. Vous y verrez le modèle du véhicule suivit de la valeur de retour.

4.2 - Vérifier le temps d'exécution d'une fonction

Toujours pas de technique magique. Toutefois, il faut faire une distinction.
Le but est de déterminer la rapidité d'exécution d'une fonction et de l'améliorer, mais pour se faire il faut faire un benchmark.

Il existe tout plein de petites defines déjà faites pour le faire.
Syg en avait donnée une très intéressante dans le topic des scripts utiles: Benchmark macro

Sinon vous pouvez faire votre test par vous même, il suffit d'exécuter la fonction à répétition sur un serveur et de mesurer le temps nécessaire à son exécution.
PS. il est préférable de faire les test sur un serveur vide (aucun script chargé autre que le test)

4.3 - Vérifier les valeurs prises en charge

Encore une fois, il n'y a pas de technique magique.
Je vais toutefois ressortir certains terme que l'on voit en calcul différentiel/intégral.
La meilleur technique afin de vérifier une telle chose est de simplement vérifier les valeurs critiques.

Par exemple, sur une fonction GetVehicleModelName(modelid) il ne sert absolument à rien de vérifier tous les véhicules. Par contre, il pourrait être intéressant de regarder les valeurs -1, 0, 1, 399, 400, 611, et 612.
Pourquoi?

-1 : une valeur négative
0 : il s'agit d'une valeur particulière que je recommande de toujours testé, elle est unique.
1 : +/- utile mais simplement au cas où
399 et 400 : vérifier le début du fonctionnement de la fonction, qu'elle commence bien à 400
611 et 612 : comme 399 et 400 mais pour la fin.
Il serait aussi possible d'ajouter une autre valeur plus grande pour être certains qu'elle le gère

Comment déterminer ses valeurs critiques?

Il s'agit simplement de déterminer qu'elles sont les valeurs pour lesquelles la fonction agit différemment.
Pour faire référence au calcul différentiel, il s'agit des "points d'inflexions" de la fonction.

Par exemple, pour un switch chaque case représente une exécution différente, il faudrait donc vérifier chacun d'entre-eux en plus d'une valeur extérieure (sauf dans le cas de présence d'un default qui est cette valeur autre).

Si l'on revient au cas de la fonction GetVehicleModelName(modelid), il est évident qu'il faut vérifier 399, 400, 611 et612 puisque ce sont les valeurs de fin et de début de la plage de modèles.
Il faut noter aussi qu'il existe deux méthodes afin de voir ces valeurs à vérifier. Par le code de la fonction elle même, ou en se basant sur ce qu'elle fait. Pour la fonction cité ci-dessus, en se basant sur le fonctionnement et ce qu'elle fait nous obtenons toujours les valeurs 399, 400, 611 et 612, les autres sont quelque peu superflues mais peuvent être testées pour plus de sécurité.

Selon l'action de la fonction:

Puisqu'elle permet de savoir le nom d'un modèle de véhicules, quels sont les endroits où la plage de données change? La fin et le début des modèles.

Selon le fonctionnement:

En regardant le tableau des noms de véhicules, on voit qu'il fait 212 par un nombre variable dépendant de l'initialisation (la longueur du nom du véhicule).
Puisque l'on utilise le modèle-400 pour déterminer où se trouve le nom du modèle, les points névralgiques sont lorsque l'on sort du tableau (-1 et 212 soit 399 et 612).

5 - Les fonctionnalités du langage

5.1 - Les State

Les state sont une fonction très intéressante du PAWN, ils sont toutefois très peu utilisés sur SA-MP. Ils peuvent remplacer des variables globales et permettre un code beaucoup plus lisible et facile à comprendre. Afin de les utiliser de façon optimale, il vaut mieux prévoir quels seront les statuts dans le script. Prenons un petit exemple simple:

public OnPlayerCommandtext(playerid, cmdtext[]) <test:statuton>
{
state (strcmp("toggle", cmdtext[1]) == 0) test:statutoff;
Debug("Ce message n'apparaitra pas);
}

public OnPlayerCommandtext(playerid, cmdtext[]) <test:statutoff>
{
state (strcmp("toggle", cmdtext[1]) == 0) test:statuton;
Debug("ce message sera affiché");
}

Debug(text[]) <test:statuton>
{
return print(text);
}

Debug(text[]) <test:statutoff>
{
return 0;//on ne fait rien, on pourrais retirer le return 0...
}

Dans ce cas-ci, nous pourrions définir statutoff comme aucun debug, et statuton comme débug activé
Il est possible de faire plein de statuts différents.
Il faut toutefois faire attention, les state (ou automata) sont les mêmes pour tous.
Il n'est pas possible, par exemple, de faire un state qui soit différent pour chaque joueurs (possible mais trop complexe et sans intérêt, préférable d'utiliser des tableaux0.

Section en construction

6 - Conseils généraux

6.1 - L'utilisation de pseudo-code

Le pseudo-code, c'est simplement une abstraction du langage de programmation afin de revenir au niveau le plus simple.
Il s'agit d'écrire en mot clairs ce que le code doit faire.
Le plus important est de séparé la solution en sous parties.
Le tout doit être fait étape par étape.

Par exemple, si je veut coder une fonction calculant la factorielle d'un nombre, je vais décrire son fonctionnement ainsi:
Citer
1 - Tant que la (valeur - 1) est supérieure à 0
    1.1 - On diminue de 1 valeur
    1.2 - Multiplie le résultat par cette valeur

Il est interessant d'organiser le texte un peu comme dans mon exemple, de lui donner les mêmes niveaux/blocs d'instructions que ce que l'on ferait en codant normalement.
Le pseudo code ainsi écrit est plus facile à implanter.

Le code résultant se ferait ainsi:
Factorielle(valeur)
{
    new factorielle = 1;
    while(valeur > 1)//équivalent à ( valeur - 1 )> 0
    {
        factorielle *= --valeur;
    }
    return factorielle;
}

Cette fonction n'est pas très intéressante car sa valeur monte trop rapidement et dépasse très rapidement la valeur limite d'un entier 32 bit standard, donc ne s'utilise pas sur une grande plage de valeur.

Lorsque l'on écrit son pseudo-code, on peut aussi ajouter des descriptions plus poussées, telles que:

 - les entrées (paramètre(s))
 - les sorties (référence(s), valeur de retour)
 - les entrées acceptées
 - les variables locales utilisées (~)

Le principal avantage du pseudo-code, c'est qu'il permet de déterminer le fonctionnement grossiers d'une fonction/d'un fs/d'un gm avant même de la coder.
Le script résultant est généralement mieux organisé et mieux programmé.
Cela permet de réfléchir à l'algorithme utilisé puisqu'il y a abstraction du langage.

Section en construction

7 - Conclusion

Voilà, j'espère vous avoir appris quelques trucs.
J'ai fait ce tutoriel dans le but d'aider les codeurs intermédiaires à passer à l'étape suivante.
Si vous avez des  commentaires/questions/suggestions, n'hésitez pas à les laisser à la suite de ce fil de discussion :P

Crédits:
Sim
Syg (pour tout ce qu'il m'a appris)
Sasuke (comme Syg)
Y_LESS (pour tous ces tutoriels très clairs qui m'ont permis de progresser)
Tous ceux que j'ai oubliés

Historique:

16 mai 2011 :
 - Ajout de la section 1 et 6.
 - Multiples corrections / ajouts

13 Janvier 2010:
Publication originale

21
Showroom SA:MP / [GM] Stunt Base
« le: 20 Décembre 2009, 19:05:06 »
StuntBase

Ceci est un simple gm stunt de base, il comprend:

- 4 maps disponibles sur le forum officiel de sa-mp
- commande pour ajouter de la nos
- commande pour spawner un véhicule (avec Dialog)
- commande pour le suicide
- commande avec la liste des commandes (lol)
- un téléport
- un système d'invincibilité


Téléchargement(corrigée):
Pastebin


Note. Ce gm utilise le streamer SuperStream, si vous désirez, vous pouvez remplacer le streamer. Pour ne pas en utiliser, vous devrez retirez des maps. Si certaines parties peuvent sembler compliquées, merci de me le signaler et je tenterai de les modifier.

Les commentaires sont appréciés :P.

++Sim++

22
Showroom SA:MP / [INC] MoneyControl
« le: 16 Décembre 2009, 21:13:41 »
[INC] MoneyControl

voilà, je vous présente une petite include super simple mais qui pourrait néanmoins être utile pour plusieurs :P

donc grâce à cette include, vous pouvez aisément vous contrôler server-side l'argent de vos joueurs. Il sauvegarde l'argent des joueurs sur le serveur et vous permet d'y avoir accès en tout temps afin de, par exemple, réajuster le montant d'argent du joueur (permet d'éviter le cheat argent).

Ça peut paraitre inutile jusque là, mais le but principal de cet include est de permettre le partage de données entre les différents scripts exécutés sur votre serveur, l'argent du joueur selon un fs est la même que selon le gm ou un autre fs...
voilà, maintenant il vous suffit de faire le côté plus "visible" de votre système de prévention de cheat argent

DOWNLOAD:
V 1.2 (recommandée):

V 1.1:


Remerciements:

Merci à Cristab pour m'avoir amené à faire cet include et légèrement inspiré :P
Merci à Mr fredo de m'avoir fait penser à une fonction pratique (sans laquelle l'include est plus complexe et lente)

LOG
V1.2:
revu la façon de partager les données

V1.1:
Ajout de la fonction AdjustPlayerMoney qui permet de s'assurer de la synchronisation de l'argent vu par le joueur avec celle sauvegardée par le serveur

V1.0:
Sortie officielle

les commentaires seront apprécié, merci de conserver les crédits

++Sim++

23
Showroom SA:MP / [FS] SuperStream v1.1
« le: 29 Octobre 2009, 23:51:37 »
[FS] SuperStream

Presentation
Salut à tous, je vous présente mon nouveau streamer, le SuperStream (que l'on peut surnommer SS).
Donc voila, le SS est une version faite par moi de A à Z, j'ai demander conseil à quelques personnes de mon entourage concernant l'optimisation et ai décidé de ne pas faire de système complexe, rendant le système plus simple à comprendre et donc modifier

Cible
Il a été testé avec 4 joueurs, ce streamer s'adresse aux serveurs moyen qui on un nombre de joueur moyen et une quantité d'objet normale, bref on oublie déjà les serveurs de 120 joueurs et 20 000 objets.

Fonctionnement
En gros, ce streamer vérifie si les objets sont à une distance maximale du joueur (afin d'ajuster cette distance, voir les #define en haut du script) puis choisi un nombre constant d'objets au joueurs, les plus près. Il permet ainsi d'être utilisé pour des maps comprenant une densité d'objets importante (tout comme SimStream). La différence principale réside dans la réduction du nombre d'options et la modification de la logique de certaines parties. Ce script est conçu pour sa-mp 0.3. Puisque certaines fonctionnalités ont été éliminées lors du passage 0.2X -> 0.3, j'ai pu simplifier grandement le streamer, par exemple les AttachPlayerObjectToPlayer n'existe plus, rayant ainsi cette fonctionnalité du streamer. L'algorithme du déplacement d'objet a été revu (simplifier).

Le streamer s'assure en tout temps de ne pas faire de calculs inutiles. Il comporte un test afin de réduire les calculs inutiles, il vérifie qu'un certains laps de temps c'est écoulé depuis le dernier calcul de position avant de le forcer via le timer. J'ai contourné le bug de GetTickCount sous linux en utilisant un timer afin de connaitre le temps écoulé depuis le lancement du serveur (de base, j'ai mis une précision de 25 millisecondes, mais vous pouvez changer cette valeur grâce aux #define en haut).

Méthodes d'appel au stream
Vous pouvez améliorer le rendu sur votre serveur en forcant le streamer à recalculer les positions. Vous n'avez qu'à include SuperStream.inc dans le script pour pouvoir appelée la fonction StreamPlayer qui recalcule le tout. Il est recommandé d'utiliser cette fonction (StreamPlayer) lors des téléports afin d'accélérer le chargement des objets.

Le streamer comprend également une fonction qui permet d'augmenter le délai du timer, il vérifie en tout temps (via la callback OnPlayerUpdate) que les joueurs ne s'approchent pas trop des extrémités de la zone comprenant des objets. Si jamais le joueur s'approche trop de la limite de cette zone, il force le calcul des objets.

Pourquoi toutes ces méthodes d'appel au stream?
Tout simplement pour permettre un meilleur rendu avec un nombre de calcul minimal. En appelant le streaming au moment nécessaires, on évite des calculs inutiles. Je trouve néanmoins que l'utilisation d'un timer permet un minimum de sécurité de chargement.

Quand devrait-on utiliser StreamPlayer?

Les utilisations pratique de cette fonction sont simple, n'importe quand où il y a un changement important concernant la position où les objets. Par exemple, si vous utilisez un système de rampes, il pourrait être interressant d'utiliser la fonction suite à la création de la rampe afin d'accélérer l'apparition de la rampe pour le joueur. Un autre usage, tel que mentionné ci-dessus, serait lors des téléportations. Je n'ai pas expérimenté de problème de chute lors du chargement de routes suite à un téléport sur mon propre serveur en utilisant correctement cette fonction.

Paramètres
Les paramètres sont tous situés entre la ligne 15 et la ligne 27 du script. Ils consistent en:

  • MAX_PLAYERS : Nombre maximum de joueur pouvant être accueillis sur votre serveur
  • TIME_GRANULITY : Incertitude sur le temps précis en millisecondes (je recommande de laissé ainsi)
  • MOVEMENT_UPDATE: temps (en ms) entre deux mises à jours de la position des objets qui se déplacent (ne change par la fluidité du mouvement vu par les joueurs)
  • STREAMING_DELAY : temps minimal depuis le dernier calcul des objets pour un joueur afin de faire le calcul à nouveau (lorsqu'appelé par le timer seulement)
  • VIEWED_OBJECTS: nombre maximal d'objets pouvant être vus par un seul joueur
  • MAX_STREAM_OBJECTS : nombre maximal d'objets gérés par le streamer (vous devriez mettre la valeur exacte d'objet de votre serveur, afin de réduire les calculs/mémoire utilisée)
  • MAX_STREAM_DISTANCE : distance maximale entre un objet et un joueur pour qu'il puisse être visible (si la densité des objets le permet)
.

Installation:
Ce script doit normalement être placé tel quel dans votre dossier filterscript (ne pas oublier d'ajouter SuperStream dans votre server.cfg), vous pouvez changer les defines cités ci-dessus, mais si vous ne savez pas ce que vous faites, vous êtes mieux de ne pas aller plus loin.
Par la suite, pour ajouter de nouveaux objets vous utilisez un autre script (un fs quelconque ou votre gm) dans lequel vous ajouterez la ligne #include <SuperStream.inc>. Vous pourrez désormais utiliser les fonctions suivantes:
Citer
native CreateStreamObject(modelid,Float:X,Float:Y,Float:Z,Float:RX,Float:RY,Float:RZ) - Ajoute un nouvel objet
native DestroyStreamObject(objectid) - Enlève un objet complètement
native StreamPlayer(playerid, Float:X, Float:Y, Float:Z) - Force le streaming pour un joueur afin d'accélérer l'apparition des objets
native MoveStreamObject(objectid, Float:TargetX, Float:TargetY, Float:TargetZ, Float:Speed) - Déplace un objets vers les coordonnées TargetX, TargetY, TargetZ
native StopStreamObject(objectid) - Arrête le déplacement d'un objet
native ClearPlayerObjects(playerid) - enlève les objets pour un seul joueurs (peut permettre le respawn forcé de certains objets (pratique pour les barrils explosifs et autres))
native ClearAllObjects() - enlève tous les objets pour tous les joueurs (nettoie tout quoi)

Téléchargement:
Nouvelle version:
Solidfiles - v1.1.4 :


Pastebin GtaOnline - v1.1.0
[FS] SuperStream.pwn
[INC] SuperStream.inc

Remerciements:
Tous à qui j'ai demandé des petits conseils.
Master-bru et xTig3rZx pour leur aide afin de tester.
Tout ceux que j'ai oublié.
Surtout tous les gens qui font de sa-mp et les communautés qui orbitent autour ce qu'elles sont.


Modifications:

V1.0 : sortie officiel du script

V1.1 : Correction d'un bug avec les MoveStreamObject et ajout de la callback OnStreamObjectMoved, légers ajustement du streaming, bug d'arrêt du fs sans raison apparente semble corrigé..
V1.1.1 : réglage d'un petit bug avec la distance de test pour OnPlayerUpdate
V1.1.2 : correction d'une constante (NO_TICK_COUNT)
V1.1.3 : correction d'un petit problème causé par délai d'update des position dans les données du serveur.
V1.1.4 : tentative de correction d'un bug avec les Interieur

Bugs/Oublis/Commentaires:
Aucun bug/oubli n'a été identifié pour le moment. Merci de le signaler sur ce fil de discussion si vous en trouvez. Les commentaires sont toujours les bienvenus.

ps. Pour ceux qui se demandent pourquoi ne pas avoir posté sur le fil de discussion de SimStream, ma réponse est simple: ce sont deux streamer, oui, mais les différences sont trop importantes pour être considérés comme un même script, ils ne s'adressent pas au même genre de clientèle.

++Sim++

24
Problèmes et bugs / DÉPLACÉ: Code
« le: 13 Août 2009, 00:18:11 »

25
Showroom SA:MP / [FS] SMod - Sauvegarde des mods V2.2
« le: 02 Août 2009, 20:52:37 »
SMod V2.2
Sauvegarde de mod ajouté dans les garage de tunning

Utilisation:

Il vous suffit de copier le fichier SMod.amx, d'ajouter SMod à vos filterscript (dans le fichier server.cfg) et puis de lancer le serveur.

Pour pouvoir le compiler, vous avez besoin de l'includes zcmd.

le filterscript comporte deux commandes:
/savemod - sauvegarde les mods présents sur le véhicules (les couleurs/paintjob seront mis à jour selon les modifications mais pas les pièces, faire la commande à nouveau pour modifier)
/unmod - efface la sauvegarde et enlève les composantes (sauf paintjob et couleurs)

ATTENTION: Si vous modifiez un véhicule qui peut changer de vehicleid (un véhicule qui est détruit par exemple), certains bugs peuvent survenir(les mods ne seront pas appliqués au bon véhicule)...

Considérations techniques:

En terme de vitesse, le chargement et la sauvegarde se font en moins de 10 ms (environ 6 ms sur ma machine).
Considérant que le chargement n'a lieu qu'au lancement du script, et la sauvegarde que lorsque l'on tape /savemod, je ne pense pas que ces résultats soient problématiques.
Si toutefois des problèmes sont rencontrés, je peut modifié le système pour n'enregistrer que les véhicules moddés.

Défaut(s) connu(s):

j'ai testé la version 2.1.0. Au chargement initial des mods sur les voitures.
Il semble que certaines pièces ne soient pas ajouté (j'ai vu l'aileron et la nitro manquante).
Toutefois, dès qu'une voiture est respawn ce problème disparait.
J'ai essayer de le faire directement dans le script mais ça ne semble pas fonctionner très bien alors...

Téléchargement:

Nouvelle - V2.2.1 :


Lien Pastebin

Anciennes:

- V2.0.1 :



Lien Pastebin

- V1.1.0 :


Lien Pastebin

Historique:

V1.0.0 - 2 août 2009:
  - sortie initiale
 - chargement/sauvegarde des mods ajoutés

V1.1.0:
 - ajout de la gestion des couleurs

V2.0.0:
 - ajout de la gestion des paintjob
 - correction de bugs majeurs (avec la 0.3)

V2.0.1:
 - petite correction de bug (ajout de la gestion paintjob + couleur je pense)

V2.1.0 - 10 Janvier 2010:
 - ajout de la vérification de la compatibilité des mods avec les véhicules via la fonction VehicleModCheck de Y_LESS
 - révision du système de sauvegarde, bien mieux codé, plus propre, fichiers enregistrés en binaire, permet d'éviter des erreurs causées par des modifications du fichier. De plus la structure est plus efficace et sure. RECOMMANDÉE, NON COMPATIBLE AVEC LES VERSIONS PRÉCÉDENTES

V2.2.0 - 10 Janvier 2010:
- retrait de la fonction permettant de sauvegardé un seul véhicule
 - correction d'un problème qui faisait que si un joueur quelconque changeait la couleur ou la paintjob d'un véhicule moddé après sa sauvegarde, le changement était sauvegardé
 - ajustement d'un défaut concernant l'ajout d'une paintjob après l'ajout d'une couleur, ce qui entrainait la modification de couleur de la paintjob (alors qu'au moment de l'application ce n'est pas le cas)
 - retrait du timer pour sauvegarder les mods, la sauvegarde a désormais lieu à chaque changement (/savemod et /unmod)
 - ajout de commentaires pour expliquer
 - amélioration de l'initialisation du tableau principal au lancement du fs

V 2.2.1 - 11 Janiver 2010:
 - correction d'un problème qui causait la perte de la paintjob et de la couleur si le véhicule était de nouveau /savemod après avoir été chargé (au lancement du fs)

amusez-vous avec ce petit fs,

Les commentaires et suggestions sont appréciées

++Sim++

26
Showroom SA:MP / [FS] SHouses v2 - Système de maisons
« le: 31 Juillet 2009, 21:45:27 »
SHouses v1
Acheter/vendre/sortir/entrer

Donc voilà, je vous présente mon tout nouveau système de maisons, il a été codé ce matin et hier soir

pour le moment il comporte bien peu d'élément, mais néanmoins:

 - données sauvegardées dans un fichier (Houses.ini par défaut)
 - chargement des données
 - icônes sur la map pour chaque maison (streamer si plus de 32 maisons)
 - pickup à l'entrée
 - checkpoint une fois dans la maison, il faut être dans le checkpoint pour quitter la maison (devant la porte d'entrée)
 - paramètre de monde virtuel permettant d'utiliser le même intérieur pour plusieurs maisons différentes sans conflit

Structure des sauvegardes:

NB. Pour le moment, le script ne comprend aucun "créateur" de maison

une ligne du fichier de sauvegarde:
Citer
maison aéroport ls|419.452087|2533.710449|16.566200|15|0|385.803985|1471.769897|1080.209960|10000|1|Sim|
Signification:
Nom de la maison, ce nom est affiché aux joueurs à l'occasion (ne pas mettre d'accent dans la limite du possible)
Position de l'entrée de la maison (à l'extérieur) X|Y|Z
intérieur de la maison(SetPlayerInterior)
Monde virtuel où se trouve la maison(de 0 à 255 inclusivement)
position de l'intérieur de la maison X|Y|Z
Prix de la maison
la maison est-elle occupée (mettre 0 lors de l'ajout d'une nouvelle maison, sinon elle ne peut être achetée)
nom du propriétaire

Téléchargement:

V 1.0.1(correction d'un bug important au chargement):

V 1.0.0:
Pastebin



Ajouter des maisons aisément:

Fait par Cristab (merci beaucoup)

Remerciements:

Azz45 - idées
Créateurs de sa-mp (kye et les autres)
Tout ceux qui m'ont aidé à apprendre à coder (que ce soit grâce à leurs script, leurs tutoriels ou leur aide directe)

Les commentaires et suggestions sont les bienvenue



SHouses v2

Changements:
 - système d'intérieurs (interior + position) pour les intérieurs des maisons, éditable in-game
 - système de création de maisons in-game
 - amélioration de l'expérience pour le joueur (interactions script/joueur)

Téléchargement:

V2.0.0 :
- contient FS, Includes et plugins
Pastebin

Merci de poster vos commentaires/suggestions sur la mise à jour

++Sim++

27
Showroom SA:MP / Idées de script & Réalisation
« le: 31 Juillet 2009, 04:04:41 »
Foire aux idées

vous avez une idée de script qui pourrait être intéressante en tête mais n'avez pas la maitrise de la programmation nécessaire à sa réalisation?
Eh bien postez votre idée ici avec un maximum de détail, si un scripteur intéressé passe ici, il le fera (j'espère) et le mettra (ou non selon son choix) dans la section showroom
je demande donc aux scripteurs de faire un efforts pour ce qui est du partage du script par la suite....
merci de ne PAS poster:

  • des idées de script évidement impossible
  • des idées trop communes
  • faire des "up" (sauf pour les idées vraiment intéressante qui sont passées inaperçues)
  • free-post, de même que le double-post et le flood ne seront pas tolérés
  • insultes, des idées déjà postées

Les SEULS post ACCEPTÉS:

  • idées intéressantes et possible à scripter
  • des demandes pour information supplémentaire concernant une idée
  • aide à la réalisation de ces idées (que ce soit en disant une façon d'y parvenir ou en donnant un bout de code)

De nouvelles informations seront possiblement ajoutées à ce post, merci de vous tenir à jour

Merci de votre collaboration

28
Comment créer un nouvel article sur le Pawn Center de GTAOnline(wiki)?


Premièrement, il pourrait être pertinent de s'assurer de pouvoir se loger correctement. Vos identifiants GTAOnline devraient s'y appliquer. Dans le cas contraire, les différentes actions seront tout simplement notées selon l'adresse IP

Il existe plus d'une méthode:
la plus simple est de chercher dans la barre de recherche à gauche le nom désiré pour l'article,
si aucun article ne correspond, le wiki donne une liste d'article potentiel (ou pas si aucun article ne cite la recherche)
et dans le texte dans le haut, il est possible de lire « Créer un nouvel article ». Il suffit de cliquer sur le lien et de composer son article.
Il est également possible de composer soi-même l'adresse pour créer un nouvel article,
prenons cet exemple:
Citer
http://pawn.gtaonline.fr/index.php?title=CreatePickup&action=edit
CreatePickup correspond au titre de la page devant être créer (ou éditée si elle existe déjà)

Composer un article

Pour composer un article, il est recommandé de connaitre la syntaxe des wikis (voir Syntaxe Wiki )
Il est également recommandé de regarder un article semblable afin d'avoir une idée de la structure à utiliser et/ou du vocabulaire utilisé (dans un but d'uniformité)
NB. Certaines parties de la syntaxe de wikipédia ne sont pas applicables sur le Pawn Center de GTAOnline.

Pour éditer un article déjà existant, vous devez tout simplement vous rendre sur l'article en question et cliquer sur l'onglet modifier (haut de page). Vous verrez alors le code source de la page (en syntaxe wiki) et pourrez en changer le contenu.
Attention, les modifications ne doivent pas être abusive. Merci de ne pas falsifier les informations disponibles (dans l'intérêt de tous).

Nous comptons sur VOUS pour remplir le plus rapidement possible ce wiki

merci de signaler les informations manquantes

ps. Si je n'ai pas poster ce message dans tuto c'est pour la seule raison que moins de scripteur le liraient...

sur ce, allez tous sur Pawn Center

29
Showroom SA:MP / [FS/INC] Admin on Duty v1.3 - 90+ cmds!!!
« le: 14 Juin 2009, 17:15:31 »
Salut à tous,

Admin On Duty
Un script d'admin comme les autres....à quelques différences près!


d'abord, les Fonctionnalités :

  • Un script entièrement personnalisable, en effet, dès le début du script on peut remarquer une grande quantité d'options permettant d'activer/désactiver certaines parties du script
  • Un système de comptes complet et fonctionnel
  • Un anti-bot intégré au ping-kick
  • plus de 90 commandes (/acmd pour la liste)
  • 4 niveaux à la base (joueur, animateur, modérateur et propriétaire(aussi dit super admin)), ajoutez en autant que désiré
  • Une esquisse d'anti-cheat
  • un système intégré de sauvegarde de position( /s, /r utilisation: /s 1 /r 2....)
  • le fly-system du radmin (merci r@f + tornado)
  • Un mini système de debug de véhicule (/newveh, /destroyveh)
  • une gradation automatique des punitions (avertissement -> kick -> ban -> range ban)
  • plusieurs autres dont je ne me rappelle plus
  • émulation de toutes les commandes rcon via des commandes du script
  • ajout de 2 nouveaux menus
  • possibilité de punir un joueur en cliquant sur son nom dans la liste des joueurs (TAB)

Script :

Ce script fait environ 8500 lignes
Si vous y jetez un œil, vous remarquerez rapidement qu'une grande partie de ce script est composé de commentaire (+/- importants)
Le but original de ce script était montrer (à moi-même et aux autres) l'utilisation que l'on peut faire de certains éléments en pawn (particulièrement les directives de précompilation)
Plusieurs fonctions inclues dans le script sont des fonctions génériques, n'hésitez pas à les empruntez pour vos propres besoins (GetPlayerID, IsNumeric, Teleport, GetPosInFrontOfAngle, GetStateName....)
Le script est publié sous la licence suivante:

C'est simple, téléchargez-testez-appréciez-modifiez-publiez (sans aucun profit et en citant toujours le nom de l'auteur original)

Modifier le script :

Je suis parfaitement conscient que ce n'est pas le script le plus simple à modifier, mai8 je vais néanmoins tenter de vous indiquer des choses à faire et à ne pas faire...

1 - vous pouvez éliminer/modifier/ajouter certaines parties du script via les define compris entre la ligne 34 et 95

2 - pour les define ne comportant aucune valeur , il s'agit simplement de commenter le define ou le décommenter (normalement le commentaire le suivant explique ce qu'il change)

3 - pour les define comportant une valeur, il s'agit plutôt de changer la valeur suivant le define

4 - Si vous désirez modifier les dossiers utilisés par le script pour le fichiers d'utilisateurs, les log et autres, vous pouvez trouver les emplacement entre la ligne 124 et 129
IMPORTANT: vous devez vous assurer que le %s du USER_FILE_DIRECTORY demeure présent (par exemple vous changez pour : "%s.ini"

5 - Vous désirez enlever une commande? Il vous suffit d'ajouter ceci à la fin du script: CMD:macommande(playerid, params[]){le code de la commande}
ps. voir les commandes déjà présentes

Pour savoir comment modifier d'autres parties du code, postez une demande à la suite de ce topic


Installation en 56 étapes :

 1- Vous devez d'abord vous assurer que votre serveur ait le dossier suivant:
 
Citer
.../Scriptfiles/Admin/Users

 2- Par la suite, vous devez ajouter AdminOnDuty à la ligne filterscript de votre server.cfg et sscanf à la ligne plugins (si elle n,existe aps ajoutez là)
 3 - Par la suite, ajouter le .amx au dossier filterscripts de votre serveur et le .dll à votre dossier plugins
 4- Connectez vous sur le serveur et créez un compte (/register)
 5- Il vous suffit d'ouvrir votre fichier d'utilisateur afin de changer votre niveau d'administrateur à 3 (plus haut niveau)et voilà, vous êtes admin principal de votre serveur
 6- Maintenant, il vous suffit de taper /setlevel afin de changer le niveau d'un autre joueur

Téléchargement :
Nouvelle version V1.3.1 - 24 Février 2010:


Anciennes Versions:
V1.0.2:

V1.1.3:

V1.2.1

V1.3.0


Remerciements :
 - r@f
- azz45
- plusieurs autres (un gros merci à tous)

merci de laisser vos commentaires/opinions sur ce script
Si vous avez une suggestions, n'hésitez pas à les poster

Vous avez trouver un bug? Postez le ici!

++Sim++

30
Scripting SA-MP [Pawn center] / Suggestions script admin
« le: 29 Mai 2009, 18:25:43 »
Bonjour confrères scripteurs,

je suis présentement en cours de développement d'un script d'admin (dont le nom reste toujours à déterminer) et j'aimerais que vous postiez ici vos suggestions en tout genre, que ce soit côté anti-cheat, systèmes de comptes, fonctionnalités, commandes ....

pour l'instant, le script comprend:

- un système de compte fonctionnel (scriptfiles)
- quelques commandes (/mute, /unmute, /kick, /ban, /freeze, /unfreeze...)
- système de sauvegarde de positions (/s /r) (désactivation possible?)


++Sim++

Pages: 1 [2] 3 4