• 05 Juin 2026, 19:47:05


Auteur Sujet: [RESOLU] Quelques questions.  (Lu 4568 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne Abdelhakim

  • *
  • Nouveau
  • Messages: 14
    • Voir le profil
[RESOLU] Quelques questions.
« le: 14 Février 2011, 21:01:43 »
Débutant en Pawn


Alors voilà, j'ai pas mal de questions sur le pawn, qui pourrait peut être m'ouvrir au mystère du script. Je débute dans la création de scriptes simples, qui me paraissent compliqués.

[ 1 ]
----------------------------------------------------
J'ai commencé un script de /modeadmin, permettant à mon joueur de se mettre en service Admin. Pour le moment quand le joueur le joueur tapera la commande, son skin changera en Skin 217 (Staff), sa couleur de pseudo en Orange, il est invincible et son Pseudo est édité en " Administrateur ". Le problème est que quand je souhaite me remettre en mode joueur, tout se remet à l'initial du joueur sauf le pseudo. Si vous pouviez m'expliquer comment mon pseudo de joueur Initial pourrait se remettre.

Voici le script :

http://pastebin.gtaonline.fr/pastebin.php?show=1035
----------------------------------------------------

[ 2 ]
----------------------------------------------------
Je suppose qu'il existe des Bases de Données, et j'aimerai savoir comment cela fonctionne. Si tous se passe dans le script, ou à l'extérieur en rapport à un Hébergeur (En Ligne) ou un Logiciel de BDD comme WAMP (Local). Même si je me suis renseigné avant de poster, j'ai vu que l'on pouvait manipuler les fichiers .txt, j'en déduis qu'on peut s'en servir pour stocker et lire des données; j'ai vu un tutoriel sur ça, j'irai refaire un tour si vous m'appuyez sur ma pensé.
----------------------------------------------------


[ 3 ]
----------------------------------------------------
Je croise beaucoup de script comportant le mot : " sizeof ", si vous pouviez m'en dire plus sur cette fonction ( Il me semble que c'en est une ! ) parce que je n'ai pas compris son but. Et je crois qu'elle est la principale d'un script où l'on joint une ID ou un Texte dans une commande.
----------------------------------------------------


[ 4 ]
----------------------------------------------------
Comment créer une commande comme par exemple /givemoney [ID] [Somme] ? Je sais faire une commande simple /givemoney, où elle donnera une somme déterminée dans le script au joueur qui tapera la commande ! Et comme je souhaiterai que cela soit une commande Admin, que l'Admin ne perde pas d'argent ( Ça c'est pas compliqué ). Et c'est là, que (je crois) la fonction sizeof fait son apparition pour traiter l'ID et la Somme tapées dans la commande.

[ 5 ]
----------------------------------------------------
J'ai essayé de créer des objets à partir d'une commande, l'objet apparait à la positon du personnage, mais l'objet : au lieu d'être au collé au sol, le bas de l'objet se trouve au niveau de la tête du personnage. (Screen : http://img10.hostingpics.net/pics/246434samp119.png). Si vous pouviez me corriger mon script et m'expliquer se qui n'allait pas. Ensuite j'ai essayé de faire un script pour supprimer l'objet mais il ne se delete pas :/ . Encore une fois je ne comprends pas mon erreur, mais comme je débute je préfère m'adresser à d'honorable scripteur en la matière.

Voici le script :

http://pastebin.gtaonline.fr/pastebin.php?show=1036

[J'ai réussi à corriger ma commande /bar1, mais ma commande pour supprimer l'objet ne marche toujours pas.]

----------------------------------------------------

J'ai disposé des numéros à chaque problèmes/questions, merci de mettre le numéro suivit de votre aide/réponse. Mes scripts sont encore débutants donc évitez de me juger par défaut, mais soyez indulgent.

Abdelhakim.
« Modifié: 22 Février 2011, 10:48:52 par Abdelhakim »

Hors ligne Gilux

  • *
  • Mafioso
  • GOOBY PLS
  • Messages: 2209
    • Voir le profil
Re : [En Attente] Quelques questions.
« Réponse #1 le: 14 Février 2011, 22:56:24 »
Salut, je vais tenter de répondre vite fait à tes questions, je suis assez pressé ce soir (J'ajouterai sûrement des précisions demain)

1) Crée une variable globale du type new Pseudo[MAX_PLAYERS]; (Qui stockera le pseudo de chaque joueur) (Essaye de voir mon cours, partie 2 pour l'explication de MAX_PLAYERS)
2) Tu peux soit manipuler des fichiers, ou une base de données. Pour cette dernière, tu peux utiliser le plugin/include de StrickenKid (Disponible sur le forum SA:MP). Il faut connaître un minimum le langage SQL : Je te redirige bien sûr vers le Site Du Zéro : http://www.siteduzero.com/tutoriel-3-14488-presentation-des-bases-de-donnees.html

3) sizeof permet de récupérer la taille d'un array (Tableau). Il est surtout utilisé pour la taille d'une chaîne de caractères (Exemple : Si tu fais new Phrase[100]; et qu'à un endroit de ton script tu mets sizeof(Phrase); , la fonction renverra 100.

4) Utilise la fonction strtok (Non recommandé), ou zcmd/sscanf (Recommandé). Tu trouveras un bon tuto ici qui s'appelle "Commandes Rapides".

5) Essaye de faire varier la coordonnée Z (Hauteur). Essaye un truc du genre CreateObject(997,x,y,z[color=red]-1[/color],0,0,0); et fait quelques essais, tu devrais y arriver ^^

Voilà, si certaines choses te paraissent floues, j'essaierai d'y répondre demain soir ;)
++
« Modifié: 15 Février 2011, 14:36:43 par Gilux »

Hors ligne Abdelhakim

  • *
  • Nouveau
  • Messages: 14
    • Voir le profil
Re : [En Attente] Quelques questions.
« Réponse #2 le: 15 Février 2011, 17:59:23 »
Merci de ta réponde Gilux.

Pourrais-tu me montrer un exemple de script pour la 1, 3, 4 et pour la 5 juste une commande pour supprimer un objet (ID : 997)
« Modifié: 15 Février 2011, 18:15:58 par Abdelhakim »

Hors ligne S!m

  • *
  • Messages: 2341
    • Voir le profil
Re : Re : [En Attente] Quelques questions.
« Réponse #3 le: 15 Février 2011, 21:26:26 »
Salut,

je me permet une petite précision:

 - sizeof(....) est évalué au moment de la compilation. Il ne s'agit donc pas vraiment d'une fonction. C'est une constante. La principale implication est simple: une constante est plus rapide.

Sinon, si tu veut des exemples de scripts, tu devrais être capable d'en trouver assez facilement dans le showroom ou sur le forum officiel de sa-mp.
Si après quelques recherches ardues tu ne trouve rien, reviens demander ;)

Petit commentaire:
Je tiens à te féliciter pour la structure de ton post. Très rare sont ceux qui y attachent la moindre importance alors que ça donne envie de répondre de façon claire et détaillée à tes questions. De plus, la numérotation permet de s'y retrouver facilement.

++Sim++





Hors ligne cristab

  • *
  • Messages: 8379
    • Voir le profil
Re : [En Attente] Quelques questions.
« Réponse #4 le: 15 Février 2011, 21:40:29 »
je vais repondre pour ton premier soucis en haut de ton script nous allons declarer une nouvelle variable

new initialname[MAX_PLAYERS][MAX_PLAYER_NAME];

elle  va nous servire a retenir le pseudo d'origine du joueur.

Pour la suite je reprend donc ta commande et nous savons que la fonction GetPlayerName nous sert a extraire le pseudo du joueur donc regarde attentivement ta commande modifier

if(strcmp(cmdtext, "/modeadmin", true) ==0 || strcmp(cmdtext, "/ma", true) ==0)
{
   if(IsPlayerAdmin(playerid))
   {
      GetPlayerName(playerid, initialname[playerid], MAX_PLAYER_NAME);
      SendClientMessageToAll(COLOR_ORANGE,"[ADMINFO] Un Admin a pris son Service.");
      SetPlayerArmour(playerid, 999);
      SetTimer("vie",2000,true);
      SetPlayerSkin(playerid, 217);
      SetPlayerName(playerid,"Administrateur");
      SetPlayerColor(playerid, COLOR_ORANGE);
      return 1;
   }
   else
   {
       SendClientMessage(playerid,COLOR_RED,"Vous n'êtes pas Admin.");
       return 1;
    }
}

comment reprendre donc le pseudo?

C'est donc tres simple il suffit de redonner le pseudo que nous avons stoker dans la variable

if(strcmp(cmdtext, "/modejoueur", true) ==0 || strcmp(cmdtext, "/mj", true) ==0)
{
   if(IsPlayerAdmin(playerid))
   {
      SendClientMessageToAll(COLOR_ORANGE,"[ADMINFO] Un Admin a quitté son service.");
      SetPlayerArmour(playerid, 999);
      SetPlayerHealth(playerid, 999);
      SetPlayerSkin(playerid, 29);
      SetPlayerName(playerid,initialname[playerid]);//ici donc je lui remet sont pseudo
      SetPlayerColor(playerid, COLOR_WHITE);
      return 1;
   }
   else
   {
      SendClientMessage(playerid,COLOR_RED,"Vous n'êtes pas Admin.");
      return 1;
   }
}

Voila j'espere avoir etait simple et claire

Avis au personne qui lise ce post vous pouvez remarquer des response constructive car sa demande etait constructive voila vous savez ce qu'il vous reste a faire pour avoir de reel reponse :)
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 Gilux

  • *
  • Mafioso
  • GOOBY PLS
  • Messages: 2209
    • Voir le profil
Re : [En Attente] Quelques questions.
« Réponse #5 le: 15 Février 2011, 22:48:39 »
Sim, tu devrais mettre ce topic comme exemple dans les règles de la section, comme modèle à suivre pour les demandes d'aide. C'est vrai, je n'ai pas pensé à te féliciter hier soir  :happy
++

Hors ligne Abdelhakim

  • *
  • Nouveau
  • Messages: 14
    • Voir le profil
Re : [En Attente] Quelques questions.
« Réponse #6 le: 16 Février 2011, 13:06:30 »
Merci à vous pour vos remarques, cela me touche beaucoup mais j'ai toujours fait quelque chose de propre dans le but de recevoir des réponses constructives.

Je ne réponds que maintenant, car je cherchais des exemples mais à chacune de mes recherches, les scripts étaient très complets et illisibles à mon niveau en Pawn. Ensuite je n'ai toujours pas trouvé de solution pour supprimer un Objet créé depuis une commande.
« Modifié: 16 Février 2011, 13:14:08 par Abdelhakim »

Hors ligne Ssk

  • *
  • Lulu's Stunt - Le serveur stunt de Lulu !
  • Messages: 8154
    • Voir le profil
Re : [En Attente] Quelques questions.
« Réponse #7 le: 16 Février 2011, 13:22:47 »
Je peut t'expliquer comment supprimer un objet crée depuis une commande ^^

Alors pour cela tu doit créer une variable qui stock l'id de l'objet que tu crée, mais pour cela il faut que la variable soit globale ( on peut traduire ça par "qu'elle soit accessible à tout le code" ), donc tu fait:

new ObjetCommande = 0;
Ensuite dans ta commande tu crée ton objet en faisant,

ObjetCommande = CreateObject( ..., ..., ..., ..., ..., ..., ..., ... );
Donc ce bout de code là, on créer l'objet et stock son id dans la variable ObjetCommande, ensuite c'est simple si tu veut détruire ton objet tu fait,

DestroyObject( ObjetCommande );C'est une fonction qui permet de détruire un objet en lui donnant son id ^^

Voila j'espère que cela t'a aidé, si tu n'a pas compris n'hésite pas à demander des explications ^^
« Modifié: 16 Février 2011, 13:24:49 par sasuke78200 »



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

Hors ligne Abdelhakim

  • *
  • Nouveau
  • Messages: 14
    • Voir le profil
Re : [En Attente] Quelques questions.
« Réponse #8 le: 16 Février 2011, 14:18:06 »
Oh non !! J'ai fait la même chose, mais cela n'avait pas marché car j'avais oublié de déclarer la variable -_-' Merci à toi Sasuke !

Hors ligne Abdelhakim

  • *
  • Nouveau
  • Messages: 14
    • Voir le profil
Re : [En Attente] Quelques questions.
« Réponse #9 le: 20 Février 2011, 22:28:34 »
Voilà j'ai 2 autres problèmes

[ 1 ]
----------------------------------------------------
J'ai essayé de créer une comme /b dans le but d'écrire en OOC dans l'optique du RP.


Exemple :

Commande : /b Test
Résultat : Prenom_Nom dit : (( Test ))

Mon script faisait planter le serveur, j'ai du le supprimer pour continuer mes tests, je n'ai donc pas de script à vous montrer. Mais si vous pouviez me le faire en m'expliquant avec les commentaires si possible !
----------------------------------------------------

[ 2 ]
----------------------------------------------------
Pareil que la commande /b, mais celle-ci permet de décrire une action : /me.


Exemple :

Commande : /me lève les yeux
Résultat : Prenom_Nom lève les yeux
Idem si vous pouviez me faire le script, que ça éclaircisse un peu dans ma tête. Évidemment si possible !
----------------------------------------------------



Hors ligne Gilux

  • *
  • Mafioso
  • GOOBY PLS
  • Messages: 2209
    • Voir le profil
Re : [En Attente] Quelques questions.
« Réponse #10 le: 20 Février 2011, 23:14:32 »
Salut, en utilisant zcmd et sscanf, ça devrait donner ça :


CMD
:b(playerid,params[])
{
new 
string[100]; // On déclare la phrase.
if(sscanf(params,"s",pid,lvl)) return SendClientMessage(playerid,0xFF0000FF,"Syntaxe : /b [phrase]"); // Si le joueur n'entre rien après /b, on envoie une phrase d'erreur. Sinon, ce que le joueur a entré est inséré dans la variable "string" (Principe de sscanf)
else
{
     new 
string2[120]; // On déclare une 2e variable qui contiendra la phrase qui sera formatée en envoyée au joueur.
     
new Name[MAX_PLAYER_NAME]; // On déclare une variable qui stockera le nom du joueur.
     
GetPlayerName(playerid,Name,sizeof(Name)); // On récupère le nom du joueur et on le stocke dans la variable Name.
     
format(string2,sizeof(string2),"%s : (( %s ))"Name,string); // On formate cette phrase, avec le nom et la phrase que le joueur a entrée.
     
SendClientMessageToAll(0xFFFFFFFF,string2); // Enfin, on envoie le message.
}



Pour la commande /me, tu as juste à changer le formatage ^^

Pour que ça fonctionne il faut les includes sscanf et zcmd : Télécharge-les et inclus-les à ton GM. (Les 2 includes sont fournies dans AOD de Sim)

#include <sscanf.inc>
#include <zcmd.inc>


++

Hors ligne Abdelhakim

  • *
  • Nouveau
  • Messages: 14
    • Voir le profil
Re : [En Attente] Quelques questions.
« Réponse #11 le: 21 Février 2011, 09:02:07 »
Merci à toi Gilux, peut être une explication sur les deux includes ? A moins qu'il y est déjà un tutoriel, que je n'ai pas vu :/

Edit :

J'ai un petit problème

[Il se peut que cela vienne des includes, je ne les ai pas téléchargées sur le forum, mais sur un autre site.]

CMD:b(playerid,params[]) // Ligne 854
{
new string[100]; // On déclare la phrase.
if(sscanf(params,"s",playerid,lvl)) return SendClientMessage(playerid,0xFF0000FF,"Syntaxe : /b [phrase]"); // Si le joueur n'entre rien après /b, on envoie une phrase d'erreur. Sinon, ce que le joueur a entré est inséré dans la variable "string" (Principe de sscanf)
else
    {
    new string2[120]; // On déclare une 2e variable qui contiendra la phrase qui sera formatée en envoyée au joueur.
    new Name[MAX_PLAYER_NAME]; // On déclare une variable qui stockera le nom du joueur.
    GetPlayerName(playerid,Name,sizeof(Name)); // On récupère le nom du joueur et on le stocke dans la variable Name.
    format(string2,sizeof(string2),"%s : (( %s ))", Name,string); // On formate cette phrase, avec le nom et la phrase que le joueur a entrée.
    SendClientMessageToAll(0xFFFFFFFF,string2); // Enfin, on envoie le message.
    }
}

C:\Users\Timothé\Desktop\samp\gamemodes\penitencer.pwn(854) : error 017: undefined symbol "b"
C:\Users\Timothé\Desktop\samp\gamemodes\penitencer.pwn(855) : warning 217: loose indentation
C:\Users\Timothé\Desktop\samp\gamemodes\penitencer.pwn(857) : error 017: undefined symbol "params"
C:\Users\Timothé\Desktop\samp\gamemodes\penitencer.pwn(868) : warning 217: loose indentation
C:\Users\Timothé\Desktop\samp\gamemodes\penitencer.pwn(868) : error 029: invalid expression, assumed zero
C:\Users\Timothé\Desktop\samp\gamemodes\penitencer.pwn(869) : warning 217: loose indentation
C:\Users\Timothé\Desktop\samp\gamemodes\penitencer.pwn(874) : warning 225: unreachable code
C:\Users\Timothé\Desktop\samp\gamemodes\penitencer.pwn(874) : warning 217: loose indentation
C:\Users\Timothé\Desktop\samp\gamemodes\penitencer.pwn(854) : warning 203: symbol is never used: "CMD"
C:\Users\Timothé\Desktop\samp\gamemodes\penitencer.pwn(1024) : warning 203: symbol is never used: "zcmd"
Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase


3 Errors.

« Modifié: 21 Février 2011, 09:25:55 par Abdelhakim »

Hors ligne Gilux

  • *
  • Mafioso
  • GOOBY PLS
  • Messages: 2209
    • Voir le profil
Re : [En Attente] Quelques questions.
« Réponse #12 le: 21 Février 2011, 10:00:36 »
J'ai fait une petite faute sur la fonction sscanf (Je l'avais copiée d'un de mes scripts)

La bonne ligne est donc
if(sscanf(params,"s",string) return SendClientMessage(playerid,0xFF0000FF,"Syntaxe : /b [phrase]"); // Si le joueur n'entre rien après /b, on envoie une phrase d'erreur. Sinon, ce que le joueur a entré est inséré dans la variable "string" (Principe de sscanf)

Ensuite si il y a encore des erreurs, c'est tes includes. Je t'envoie les miennes en pièce jointe.
Il y a déjà un tuto qui explique ça, il s'appelle "Commandes rapides". En résumé, ces deux includes permettent :
- Pour zcmd, de construire des commandes beaucoup plus rapidement : CMD: macommande(playerid,params[]) (Params, c'est les paramètres qu'il envoie après sa commande, un peu comme strtok).
- Pour sscanf, cette include sert à définir le type de donnée (Nombre, Texte...) que le joueur envoie après sa commande. Ici, nous l'avons validée car elle est compatible (Nous avons demandé une variable de texte : %s).
++

EDIT : J'ai aussi oublié de mettre un return 1; aussi ^^ Je devais être crevé  :D. Ca devrait expliquer ton "Unreachable code"
EDIT2 : Un admin pourrait-il autoriser l'envoi de fichiers .inc ? (En pièce jointe)
« Modifié: 21 Février 2011, 10:04:38 par Gilux »

Hors ligne Abdelhakim

  • *
  • Nouveau
  • Messages: 14
    • Voir le profil
Re : [En Attente] Quelques questions.
« Réponse #13 le: 21 Février 2011, 10:30:46 »
J'ai 4 erreurs sur la même ligne !

CMD:b(playerid,params[]) // Ligne 327
{
new string[100]; // On déclare la phrase.
if(sscanf(params,"s",string) return SendClientMessage(playerid,0xFF0000FF,"Syntaxe : /b [phrase]"); // Si le joueur n'entre rien après /b, on envoie une phrase d'erreur. Sinon, ce que le joueur a entré est inséré dans la variable "string" (Principe de sscanf)
else
    {
    new string2[120]; // On déclare une 2e variable qui contiendra la phrase qui sera formatée en envoyée au joueur.
    new Name[MAX_PLAYER_NAME]; // On déclare une variable qui stockera le nom du joueur.
    GetPlayerName(playerid,Name,sizeof(Name)); // On récupère le nom du joueur et on le stocke dans la variable Name.
    format(string2,sizeof(string2),"%s : (( %s ))", Name,string); // On formate cette phrase, avec le nom et la phrase que le joueur a entrée.
    SendClientMessageToAll(0xFFFFFFFF,string2); // Enfin, on envoie le message.
    return 1;
    }
}

C:\Users\Timothé\Desktop\samp\gamemodes\penitencer.pwn(327) : error 029: invalid expression, assumed zero
C:\Users\Timothé\Desktop\samp\gamemodes\penitencer.pwn(327) : error 017: undefined symbol "cmd_b"
C:\Users\Timothé\Desktop\samp\gamemodes\penitencer.pwn(327) : error 029: invalid expression, assumed zero
C:\Users\Timothé\Desktop\samp\gamemodes\penitencer.pwn(327) : fatal error 107: too many error messages on one line

Compilation aborted.Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase


4 Errors.

Hors ligne Gilux

  • *
  • Mafioso
  • GOOBY PLS
  • Messages: 2209
    • Voir le profil
Re : [En Attente] Quelques questions.
« Réponse #14 le: 21 Février 2011, 11:56:13 »
T'aurais pas mis ça dans OnPlayerCommandText ?
Sinon, je peux voir le haut de ton script ? (Les includes)

Edit : Ton return 1; est mal placé :

CMD:b(playerid,params[]) // Ligne 327
{
new string[100]; // On déclare la phrase.
if(sscanf(params,"s",string) return SendClientMessage(playerid,0xFF0000FF,"Syntaxe : /b [phrase]"); // Si le joueur n'entre rien après /b, on envoie une phrase d'erreur. Sinon, ce que le joueur a entré est inséré dans la variable "string" (Principe de sscanf)
else
     {
     new string2[120]; // On déclare une 2e variable qui contiendra la phrase qui sera formatée en envoyée au joueur.
     new Name[MAX_PLAYER_NAME]; // On déclare une variable qui stockera le nom du joueur.
     GetPlayerName(playerid,Name,sizeof(Name)); // On récupère le nom du joueur et on le stocke dans la variable Name.
     format(string2,sizeof(string2),"%s : (( %s ))", Name,string); // On formate cette phrase, avec le nom et la phrase que le joueur a entrée.
     SendClientMessageToAll(0xFFFFFFFF,string2); // Enfin, on envoie le message.
     }
        return 1;
}