• 24 Avril 2025, 01:04:11


Auteur Sujet: Soif d'apprendre. Aider moi à scripter  (Lu 2649 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne zorglue

  • *
  • Nouveau
  • Messages: 14
    • Voir le profil
Soif d'apprendre. Aider moi à scripter
« le: 10 Juillet 2009, 15:26:19 »
donc voilà je me présente zorglue  :king , belge  :cheers et miam de frite .
J'ai de toute petites connaissance en programmation et je me lance dans le scriptage de mod SAmp.

Je ne suit pas de tutoriel particulier , je prend un exemple de script, j'analyse , modifie et apprend !!
Donc j'ai plein de question à vous poser.

la première, j'aimerais faire apparaitre un un véhicule à coté du joueur où qu'il soit .

Pour cela, je suppose qu'il faut récupérer ses coordonnées avec la fonction -> GetPlayerPos() dans ce cas comment l'utiliser et comment stocké les coordonnées ?

Je me suis familiarisé avec un script qui m'a beaucoup aidé .
Même si je n'ai rien compris à cette partie  strtok(const string[], &index)
{
new length = strlen(string);
while ((index < length) && (string[index] <= ' '))
{
index++;
}

new offset = index;
new result[20];
while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1)))
{
result[index - offset] = string[index];
index++;
}
result[index - offset] = EOS;
return result;
}

j'ai pu modifié la seconde :
public OnPlayerCommandText(playerid, cmdtext[])
{
new cmd[256];
new idx;
new dancestyle;
cmd = strtok(cmdtext, idx);

// HANDSUP
  if(strcmp(cmd, "/handsup", true) == 0) {
if(GetPlayerState(playerid) == PLAYER_STATE_ONFOOT) {
    SetPlayerSpecialAction(playerid,SPECIAL_ACTION_HANDSUP);
    return 1;
}
}
if (strcmp(cmd, "/test", true) == 0) {
SendClientMessage(playerid,0xFF0000FF,"1 changer la grivité à 10 \n 2 changer la gravité à 20 \n 3 changer la grvité à 30" );
   if (strlen(cmd) == 1) {
   SetGravity(10);
   }
   if (strlen(cmd) == 2) {
   SetGravity(20);
   }
   if (strlen(cmd) == 3) {
   SetGravity(30);
   }
   return 1;
}

if(strcmp(cmd, "/heal", true) ==0){
            SetPlayerHealth(playerid, 100);
            SendClientMessage(playerid,0xFF0000FF,"you have been healed");
            SendClientMessageToAll(0xFF0000FF,"a poeple has been healed");
           
            return 1;
}

// SUICIDE COMMAND
  if(strcmp(cmd, "/kill", true) == 0) {
    SetPlayerHealth(playerid,0.0);
    return 1;
}

// START DANCING
  if(strcmp(cmd, "/dance", true) == 0) {
if(GetPlayerState(playerid) == PLAYER_STATE_ONFOOT) {
    new tmp[256];

    // Get the dance style param
      tmp = strtok(cmdtext, idx);
if(!strlen(tmp)) {
SendClientMessage(playerid,0xFF0000FF,"Usage: /dance [style 1-3]");
return 1;
}

dancestyle = strval(tmp);
if(dancestyle < 1 || dancestyle > 3) {
    SendClientMessage(playerid,0xFF0000FF,"Usage: /dance [style 1-3]");
    return 1;
}

if(dancestyle == 1) {
    SetPlayerSpecialAction(playerid,SPECIAL_ACTION_DANCE1);
} else if(dancestyle == 2) {
    SetPlayerSpecialAction(playerid,SPECIAL_ACTION_DANCE2);
} else if(dancestyle == 3) {
    SetPlayerSpecialAction(playerid,SPECIAL_ACTION_DANCE3);
}
    return 1;
}
}

return 0;

Où peut remarquer que j'ai rajouer 2 commandes : if(strcmp(cmd, "/heal", true) ==0){
            SetPlayerHealth(playerid, 100);
            SendClientMessage(playerid,0xFF0000FF,"you have been healed");
            SendClientMessageToAll(0xFF0000FF,"a poeple has been healed");
           
            return 1;
}

qui fonctionne merveille
Ici j'ai une question SendClientMessageToAll(0xFF0000FF,"a poeple has been healed"); comment mettre à la place "a poeple has been healed" le nom du joueur qui s'est soigné ??  ???

je vous laisse deviner ce code : if (strcmp(cmd, "/test", true) == 0) {
SendClientMessage(playerid,0xFF0000FF,"1 changer la grivité à 10 \n 2 changer la gravité à 20 \n 3 changer la grvité à 30" );
   if (strlen(cmd) == 1) {
   SetGravity(10);
   }
   if (strlen(cmd) == 2) {
   SetGravity(20);
   }
   if (strlen(cmd) == 3) {
   SetGravity(30);
   }
return 1;
}
je n'ai pas d'erreur lors du jeu mais ce code est-il correct ?

merci pour votre aide

@+

Hors ligne ghm94

  • *
  • Grand Banditisme
  • Messages: 886
    • Voir le profil
Re : Soif d'apprendre. Aider moi à scripter
« Réponse #1 le: 10 Juillet 2009, 15:51:38 »
Salut, alors pour ta premiere question :

Lorsque tu veut récupérer les coordonner d'un joueur tu doit créer 3 variables :
new Float:x;
new Float:y;
new Float:z;

Et avec la fonction GetPlayerPos tu procède comme ceci :
GetPlayerPos(playerid, x, y, z);
pour le strtok il me semble que c'est pour récupérer ce que tu écrit après un espace dans une commande.


Ensuite pour pouvoir afficher le nom d'un joueur dans une phrase je vais te dire quoi utiliser et tu essaira de trouver (Bien sur si tu n'y arrive pas reposte) :

Pour récuperer le nom d'un joueur tu doit te servir de : GetPlayerName;
Et pour écrire ensuiote, tu doit te servire de la fonction format qui prend en paramètre :
1. la variable qui contiendrat le texte.
2. La taille de la chaine
3. La phrases (Si ta fait du C ben la c'est pareille tu peut utiliser %d, %s etc....)
4. Et pour finir les variable à afficher dans ton texte (a mettre dans l'ordre bien sur).

Une fois que ta fait tout sa tu affiche ton texte avec un SendClientMessage.


Et pour fini ton code est incorrect.

++
« Modifié: 10 Juillet 2009, 15:53:23 par ghm94 »

Hors ligne zorglue

  • *
  • Nouveau
  • Messages: 14
    • Voir le profil
Re : Soif d'apprendre. Aider moi à scripter
« Réponse #2 le: 10 Juillet 2009, 17:30:30 »
d'abord je m'attaque au premier problème : GetPlayerPos(playerid, X, Y, Z); est assez spécial , je trouve . On entre des variables dans la fonction : playerid X ? Y ? Z ? --> c'est pas les variables qu'il est censé nous rendre ? ^^  :lmao peut-être que le return ce trouve là  aussi ^^ j'esseye et ça marche pas :

trouvez l'erreur.
public OnPlayerCommandText(playerid, cmdtext[])
{
if (strcmp("/v", cmdtext, true, 10) == 0)
{
   GetPlayerPos(playerid, X, Y, Z);
       AddStaticVehicle(481, X, Y, Z, 356.9482, -1, -1);
   return 1;
}
return 0;
}


Hors ligne ghm94

  • *
  • Grand Banditisme
  • Messages: 886
    • Voir le profil
Re : Soif d'apprendre. Aider moi à scripter
« Réponse #3 le: 10 Juillet 2009, 17:44:33 »
Non elle fonctionne bien comme sa.

Pour l'erreur a tu mis sa dans ton code :
new Float:x;
new Float:y;
new Float:z;

Hors ligne zorglue

  • *
  • Nouveau
  • Messages: 14
    • Voir le profil
Re : Soif d'apprendre. Aider moi à scripter
« Réponse #4 le: 11 Juillet 2009, 13:07:21 »
hé bien non !! il y a une erreur

public OnPlayerCommandText(playerid, cmdtext[])
{
    new Float:X;
    new Float:Y;
    new Float:Z;
    if (strcmp("/v", cmdtext, true) == 0)
   {
      GetPlayerPos(playerid, X, Y, Z);
       AddStaticVehicle(481, X, Y+2, Z, 356.9482, -1, -1);

\ ici le véhicule ne va jamais apparaitre puisse que je pense que cette fonction n'est exécuté qu'au lancement du serveur, pas pendant son fonctionnement !!

       CreateVehicle(481, X, Y+2, Z, 356, 1, 1, 50);
\ il fallait utiliser cette fonction  :happy , ^^
         return 1;
   }
   return 0;
}


j'aprend au grands singes à faire des grimaces  :jesors


je continue à apprendre et à scripter , je vous check si j'ai un problème
Merci pour votre aide  :-[

ps : je cherche toujours un tutoriel qui me présente toutes les fonctions , leur usages , leur foncionnement , etc ...   :laugh


Double post
question , question , ^^ .

Comment stoper une animation lancé avec cette fonction :

SetPlayerSpecialAction(playerid,SPECIAL_ACTION_DANCE1);
j'ai esseyé :

ClearAnimations(playerid);
mais cela , ne fais que recommencer l'animation .

C'est quelle fonction alors ??  :ohmy
« Modifié: 11 Juillet 2009, 13:41:01 par zorglue »

Hors ligne S!m

  • *
  • Messages: 2341
    • Voir le profil
Re : Soif d'apprendre. Aider moi à scripter
« Réponse #5 le: 11 Juillet 2009, 16:52:23 »
Salut,

il s'agit de la bonne fonction normalement....

pour ta question en lien avec le fonction GetPlayerPos(playerid, &Float:X, &Float:Y,& Float:Z),
 tu doit d'abord savoir que cette fonction comporte trois paramètre qui sont passés par référence...
c'est d'ailleurs ce que veulent dire les & devant chacune de ces trois variables (simple remarque, comment la fonction ferait-elle pour retourner trois valeur différentes de façon à ce que l'on puisse les sauvegarder toutes les trois sinon? Il y a toujours moyen via un array de taille 3 mais ce n'est pas vraiment une bonne idée de retourner un array local... (il faut d'ailleurs remarqué qu'aucune des fonctions de base de sa-mp ne le fait, seules les fonctions scriptés avec les pieds le font...(sans offense pour ceux qui les ont scriptés, je suis inclu dans le lot))

++Sim++





Hors ligne zorglue

  • *
  • Nouveau
  • Messages: 14
    • Voir le profil
Re : Soif d'apprendre. Aider moi à scripter
« Réponse #6 le: 11 Juillet 2009, 17:43:06 »
merci beaucoup , j'en apprende toutes les heures !!

je suis en train de scripter un menu qui sert à faire un apparaitre des véhicules .
J'ai remarqué que lorsque le menu a une taille trop grande, le serveur crash directement à son lancement en rendant un log de crash vide ( je vous dit pas le temps que j'ai mis pour savoir qu'est-ce qui faisait planter le serveur ^^ )

j'ai donc décider de couper ce long menu en plusieur petit menu !! je vous laisse analyser le code :
#pragma tabsize 0
#include <a_samp>
#include <core>
#include <float>
// This is a comment
// uncomment the line below if you want to write a filterscript
//#define FILTERSCRIPT

//-----------------------------------------------

new Menu:vehi;
new Menu:vehi2;

public OnPlayerCommandText(playerid, cmdtext[])
{
   
if (strcmp("/vehi", cmdtext, true) == 0){
       ShowMenuForPlayer(vehi,playerid); // On active le menu "tunning"
       TogglePlayerControllable(playerid,0); // On freeze le joueur
    }
   
    return 1;
}


public OnFilterScriptInit()
{
print("\n--------------------------------------");
print(" bibis mod");
print("--------------------------------------\n");
}



main()
{
print("\n----------------------------------");
print("bibis mod");
print("----------------------------------\n");
}



public OnGameModeInit()
{
    SetGameModeText("bibi's mod free mod");
    AddPlayerClass(257, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
vehi = CreateMenu("~b~vehicule ~w~selection",1,125,150,300); // "vehi" active un menu qui nous donne les choix ci-dessous :
vehi2 = CreateMenu("~b~vehicule ~w~selection",1,125,150,300);
    if(IsValidMenu(vehi)) {
     SetMenuColumnHeader(vehi , 0, "Choisissez un vehicule:");
         AddMenuItem(vehi ,0,"manana");
     AddMenuItem(vehi ,0,"supergt");
     AddMenuItem(vehi ,0,"Landstalker");
     AddMenuItem(vehi ,0,"Sentinel");
     AddMenuItem(vehi ,0,"suivant");
}
    if(IsValidMenu(vehi2)) {
AddMenuItem(vehi2 ,0,"precedent");
         AddMenuItem(vehi2 ,0,"Dumper");
         AddMenuItem(vehi2 ,0,"Trashmaster");
         AddMenuItem(vehi2 ,0,"Stretch");
         AddMenuItem(vehi2 ,0,"Infernus");
         AddMenuItem(vehi2 ,0,"Cheetah");
    }
         
       
return 1;
}



public OnPlayerRequestClass(playerid, classid)
{
SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);
SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746);
SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746);
return 1;
}



public OnPlayerSelectedMenuRow(playerid, row)
{
   new Float:X;
   new Float:Y;
   new Float:Z;
   new finish;
   GetPlayerPos(playerid, X, Y, Z);
   new Menu:Current = GetPlayerMenu(playerid); // Si le joueur séléctionne quel que chose du menu.
   do{
  finish = true;
      if (Current == vehi){
        if (row == 0){
          CreateVehicle(410, X, Y+2, Z, 356, 1, 1, 50);
          finish = false;
        }
        else if (row == 1){
          CreateVehicle(506, X, Y+2, Z, 356, 1, 1, 50);
          finish = false;
        }
        else if (row == 2){
          CreateVehicle(400, X, Y+2, Z, 356, 1, 1, 50);
          finish = false;
        }
        else if (row == 3){
          CreateVehicle(405, X, Y+2, Z, 356, 1, 1, 50);
          finish = false;
        }
        else if (row == 4){
          ShowMenuForPlayer(vehi2,playerid);
          Current = vehi2;
    }
  }
      if (Current == vehi2){
        if (row == 0){
          ShowMenuForPlayer(vehi,playerid);
          Current = vehi;
        }
        else if (row == 1){
          CreateVehicle(409, X, Y+2, Z, 356, 1, 1, 50);
          finish = false;
        }
        else if (row == 2){
          CreateVehicle(411, X, Y+2, Z, 356, 1, 1, 50);
          finish = false;
        }
        else if (row == 3){
          CreateVehicle(415, X, Y+2, Z, 356, 1, 1, 50);
          finish = false;
        }
        else if (row == 4){
          CreateVehicle(416, X, Y+2, Z, 356, 1, 1, 50);
          finish = false;
        }
        else if (row == 5){
          CreateVehicle(417, X, Y+2, Z, 356, 1, 1, 50);
          finish = false;
        }
        else if (row == 6){
          CreateVehicle(424, X, Y+2, Z, 356, 1, 1, 50);
          finish = false;
    }
      }
   }
   while(finish == true);   --> c'est ici que ça pose problème.
   
   TogglePlayerControllable(playerid,1); // On défreeze le joueur
   return 1;
}

donc voilà , j'ai fais un petit copié-collé du tutoriel des menus et j'ai un peu modifier le truc pour en afficher 2 et faire un bouton " précédent" et "suivant"
vous l'auriez remarqué  ;)

j'ai eu une bonne quinzaine d'erreur toutes, je pense corrigé .
Mais 1 perssiste :

C:\Documents and Settings\bibs\Bureau\samp02Xserver.win32\gamemodes\testt.pwn(164) : warning 213: tag mismatch
Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase


1 Warning.

 j'arrive pas à trouver où est le problème :(

Hors ligne S!m

  • *
  • Messages: 2341
    • Voir le profil
Re : Soif d'apprendre. Aider moi à scripter
« Réponse #7 le: 11 Juillet 2009, 18:08:57 »
Salut,

tu peut complètement retiré ta boucle, de toute façon elle fera exactement la même chose a chaque exécution puisqu'aucun paramètre n'est changé...

donc élimine la variable finish et la boucle do - while

++Sim++





Hors ligne zorglue

  • *
  • Nouveau
  • Messages: 14
    • Voir le profil
Re : Soif d'apprendre. Aider moi à scripter
« Réponse #8 le: 11 Juillet 2009, 21:55:53 »
Merci  :laugh .
Maintenant je cherche à enregistrer dans une varibla le résultat d'une fonction : GetPlayerVehicleID(playerid);c'est possible de faire ça ?  :blink
C'est juste pour pouvoir téléporter le véhicule d'un joueur.
Je sais qu'il y a moyen de téléporter le véhicule d'un joueur sans enregistrer le résultat de la fonction met en mettant la fonction directement .
Mais quand j'analyse l'idée que j'ai en tête , il faut vraiment que je connaisse cette ID car quand la personne ne sera plus dans la véhicule , je veux encore utiliser l'ID du véhicule !!   :bangin

Merci pour vos réponses

Hors ligne S!m

  • *
  • Messages: 2341
    • Voir le profil
Re : Soif d'apprendre. Aider moi à scripter
« Réponse #9 le: 11 Juillet 2009, 22:14:42 »
salut,

c'est très simple en fait, tu déclare une variable:
new tavariable = 0;//il est recommandé d'écrire toi même une valeur d'initialisation, même si en PAWn les variables sont toutes initialisés à 0Ensuite quand tu veut assigné une valeur à une variable, il te suffit d'utiliser l'opérateur = :
tavariable = valeur;
//dans ton cas:
tavariable = GetPlayerVehicleID(playerid);
en espérant que j'ai été suffisamment clair

++Sim++





Hors ligne zorglue

  • *
  • Nouveau
  • Messages: 14
    • Voir le profil
Re : Soif d'apprendre. Aider moi à scripter
« Réponse #10 le: 12 Juillet 2009, 00:49:33 »
ah oui excellent !! :D

Maintenant je cale ici : vehi = CreateMenu("~b~vehicule ~w~selection",2,0,0,999999,999999); // "vehi" active un menu qui nous donne les choix ci-dessous :
//vehi2 = CreateMenu("~b~vehicule ~w~selection",1,125,150,300);
    if(IsValidMenu(vehi)) {
     SetMenuColumnHeader(vehi , 0, "Choisissez un vehicule:");
         AddMenuItem(vehi ,0,"manana");
     AddMenuItem(vehi ,0,"supergt");
     AddMenuItem(vehi ,0,"Landstalker");
     AddMenuItem(vehi ,0,"Sentinel");
     AddMenuItem(vehi ,0,"Ambulance");
         AddMenuItem(vehi ,0,"Leviathan");
         AddMenuItem(vehi ,0,"BF Injection");
         AddMenuItem(vehi ,0,"Hunter");
         AddMenuItem(vehi ,0,"Banshee");
         AddMenuItem(vehi ,0,"Predator");
         AddMenuItem(vehi ,0,"Rhino");
         AddMenuItem(vehi ,0,"Barracks");
         AddMenuItem(vehi ,0,"Packer");
         AddMenuItem(vehi ,0,"Monster");
         AddMenuItem(vehi ,0,"Seasparrow");
         AddMenuItem(vehi ,0,"Turismo");
         AddMenuItem(vehi ,0,"Caddy");
         AddMenuItem(vehi ,0,"Skimmer");
         AddMenuItem(vehi ,0,"Sanchez");
         AddMenuItem(vehi ,0,"Patriot");
         AddMenuItem(vehi ,0,"ZR-350");
         AddMenuItem(vehi ,0,"Comet");
         AddMenuItem(vehi ,0,"Sandking");
         AddMenuItem(vehi2 ,0,"Dumper");
         AddMenuItem(vehi2 ,0,"Trashmaster");
         AddMenuItem(vehi2 ,0,"Stretch");
         AddMenuItem(vehi2 ,0,"Infernus");
         AddMenuItem(vehi2 ,0,"Cheetah");

apparement ici , le serveur ne crash pas !

car le problème venait d'ici =CreateMenu("~b~vehicule ~w~selection",2,0,0,999999,999999);
malheureusement , qu'une petite partie de ma la liste est affiché , j'aimerais que le menu fasse tout l'écran et que ma liste soit entièrement affiché , en plusieur collones si il le faut :D .
Mais je ne sais absolument pas quelles nombres je dois entrer dans ma fonction . Aidez moi  :-\

Hors ligne S!m

  • *
  • Messages: 2341
    • Voir le profil
Re : Soif d'apprendre. Aider moi à scripter
« Réponse #11 le: 12 Juillet 2009, 15:49:14 »
Salut,

tu devras faire plus d'un menu, la limite est de 12 éléments par menu je crois (voir wiki sa-mp pour plus de sureté..)

EDIT:
après vérification:
Citer
Important note: You can only have 12 rows/items per menu

++Sim++





Hors ligne zorglue

  • *
  • Nouveau
  • Messages: 14
    • Voir le profil
Re : Soif d'apprendre. Aider moi à scripter
« Réponse #12 le: 12 Juillet 2009, 18:12:22 »
hé bien , oui j'ai finis par faire 2 menus .

Maintenant je cherche à mettre du nos dans la voiture réguilièrement ( que je n'ai pas à faire /nos quand je n'en ai plus )

new vid;
new nos;
    vid = GetPlayerVehicleID(playerid);
    nos = AddVehicleComponent(vid, 1010);
    SetTimer(nos, 1, 1);

ce code est-il correct ... dans quelle fonction dois-je le mettre ?

Merci beaucoup

Double post
je veux aussi que le véhicule se répare automatiquement.
J'ai fais le code sauf que ce code est indépendant des autres fonctions.
dés lors, je ne sais pas où mettre mon code :
   new vid;
    new float:vh;
    vid = GetPlayerVehicleID(playerid);
    vh = GetVehicleHealth(vid);
    if (vh < 20){
        SetVehicleHealth(vid, 100);
        }
  
« Modifié: 13 Juillet 2009, 11:50:02 par zorglue »

Hors ligne Bayshore

  • *
  • Grand Banditisme
  • Messages: 923
    • Voir le profil
Re : Soif d'apprendre. Aider moi à scripter
« Réponse #13 le: 14 Juillet 2009, 07:39:04 »
Dans un timer.

Tu as un exemple ici ou dans le script timertest (fourni par défaut).

Hors ligne zorglue

  • *
  • Nouveau
  • Messages: 14
    • Voir le profil
Re : Soif d'apprendre. Aider moi à scripter
« Réponse #14 le: 14 Juillet 2009, 19:03:00 »
en effet , tu as une bonne idée . Mais cependant cela ne marche que si l'on joue seul !
else if (strcmp("/autonos", cmdtext, true) == 0){
   vid2 = GetPlayerVehicleID(playerid);
       SetTimer("nos", 19999, true);
    }
    else if (strcmp("/autoheal", cmdtext, true) == 0){
       vid2 = GetPlayerVehicleID(playerid);
       SetTimer("heal", 1, true);
    }

public heal(playerid)
{
    if (IsPlayerInAnyVehicle(playerid)){
SetVehicleHealth(vid2, 1000);
    }
    return 1;
}
public nos(playerid)
{
    if (IsPlayerInAnyVehicle(playerid)){
        AddVehicleComponent(vid2, 1010);
    }
return 1;
}

lorsque qu'un joueur execute cette commande , la fonction appelé , va s'appliquer pour lui. Grace à la fonction SetTimer, un cycle va être créer .
Mais lorsque qu'un autre joueur va à son tour exécuter cette commande, il va recréer un nouveau cycle pour lui et modifier les variables du cycle de l'autre joueur.

En résumé , le joueur 2 se retrouve avec 2 cycles pour son véhicule et le joueur 1 quand à lui, n'a plus de cycle et ne peut donc plus profiter de la fonction !

Je ne pense pas que c'est la fonction ou la méthode que je cherche  :closedeyes ???
Ou alors , il y a un moyen de résoudre mon problème ?

Merci , en espérant avoir été assez clair