zorglue
Hors ligne
Petit nouveau

Messages: 14
|
 |
« le: 10 Juillet 2009 à 15:26:19 » |
|
donc voilà je me présente zorglue  , belge  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 @+
|
|
|
|
|
Journalisée
|
|
|
|
|
ghm94
|
 |
« Répondre #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. ++
|
|
|
|
« Dernière édition: 10 Juillet 2009 à 15:53:23 par ghm94 »
|
Journalisée
|
|
|
|
zorglue
Hors ligne
Petit nouveau

Messages: 14
|
 |
« Répondre #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 ? ^^  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; }
|
|
|
|
|
Journalisée
|
|
|
|
|
ghm94
|
 |
« Répondre #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;
|
|
|
|
|
Journalisée
|
|
|
|
zorglue
Hors ligne
Petit nouveau

Messages: 14
|
 |
« Répondre #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 , ^^ return 1; } return 0; } j'aprend au grands singes à faire des grimaces  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 ...  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 ??
|
|
|
|
« Dernière édition: 11 Juillet 2009 à 13:41:01 par zorglue »
|
Journalisée
|
|
|
|
S!m
Hors ligne
Moderateur
GTAOnline Fan Boy

Messages: 2260
|
 |
« Répondre #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++
|
|
|
|
|
Journalisée
|
|
|
|
zorglue
Hors ligne
Petit nouveau

Messages: 14
|
 |
« Répondre #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 
|
|
|
|
|
Journalisée
|
|
|
|
S!m
Hors ligne
Moderateur
GTAOnline Fan Boy

Messages: 2260
|
 |
« Répondre #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++
|
|
|
|
|
Journalisée
|
|
|
|
zorglue
Hors ligne
Petit nouveau

Messages: 14
|
 |
« Répondre #8 le: 11 Juillet 2009 à 21:55:53 » |
|
Merci  . Maintenant je cherche à enregistrer dans une varibla le résultat d'une fonction : GetPlayerVehicleID(playerid); c'est possible de faire ça ? 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 !! Merci pour vos réponses
|
|
|
|
|
Journalisée
|
|
|
|
S!m
Hors ligne
Moderateur
GTAOnline Fan Boy

Messages: 2260
|
 |
« Répondre #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 à 0 Ensuite 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++
|
|
|
|
|
Journalisée
|
|
|
|
zorglue
Hors ligne
Petit nouveau

Messages: 14
|
 |
« Répondre #10 le: 12 Juillet 2009 à 00:49:33 » |
|
ah oui excellent !!  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  . Mais je ne sais absolument pas quelles nombres je dois entrer dans ma fonction . Aidez moi 
|
|
|
|
|
Journalisée
|
|
|
|
S!m
Hors ligne
Moderateur
GTAOnline Fan Boy

Messages: 2260
|
 |
« Répondre #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: Important note: You can only have 12 rows/items per menu ++Sim++
|
|
|
|
|
Journalisée
|
|
|
|
zorglue
Hors ligne
Petit nouveau

Messages: 14
|
 |
« Répondre #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); }
|
|
|
|
« Dernière édition: 13 Juillet 2009 à 11:50:02 par zorglue »
|
Journalisée
|
|
|
|
Bayshore
Hors ligne
GTAOnline Addict

Messages: 898
|
 |
« Répondre #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).
|
|
|
|
|
Journalisée
|
|
|
|
zorglue
Hors ligne
Petit nouveau

Messages: 14
|
 |
« Répondre #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  Ou alors , il y a un moyen de résoudre mon problème ? Merci , en espérant avoir été assez clair
|
|
|
|
|
Journalisée
|
|
|
|
|