GTAOnline.net
San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: zorglue 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
@+
-
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.
++
-
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;
}
-
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;
-
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
-
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++
-
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 :(
-
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++
-
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
-
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++
-
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 :-\
-
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++
-
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);
}
-
Dans un timer.
Tu as un exemple ici (http://wiki.sa-mp.com/wiki/SetTimer) ou dans le script timertest (fourni par défaut).
-
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
-
Salut,
pour ces cas la passe par SetTimerEx qui te permet de passer un paramètre:
SetTimerEx("tafonction", tontemps, 1, "structure des variables", variables....);
Exemple:
SetTimerEx("tafonction", 1000, 1, "i", playerid);
EDIT: par contre, fais bien attention, tu risque de te retrouver avec un très grand nombre de timer, assure toi de l'associer une variable afin de l'éliminer lorsque le joueur n'en a plus besoin...
++Sim++
-
oui c'est vrai , il vau mieux arrêter le timer quand le joueur n'en a plus besoin .
Mais pour cela, une condition ne suffit pas . Le timer existera toujours mais n'excutera plus son contenu !
Il faut carément arrêter le timer .
Avec la fonction : KillTimer(idtimer) ?
comment s'utilise-t-elle?
L'id d'un timer ? :blink on récupère ça comment ? :-\
Il y a peut-être un autre moyen qui m'échappe ?
-
Salut,
l'id du timer est la valeur retournée par la fonction SetTimer/SetTimerEx, il te suffit de le stocké dans une variable et hop...
++Sim++
-
Je trouve cette fonction très spécial.
Mon problème n'est pas résolu avec SetTimerEx() car elle a le même effet que SetTimer().
Lorsque le premier joueur fais apellé à la fonction, Tout marche bien pour lui et pour son véhicule (voir le code que j'avais écris) .
Mais lorsque qu'un autre joueur viens aussi à faire appelle à cette fonction, 2 timer sont créé mais les variables des deux timer sont modifié par les propriété du deuxième joueur .
Le résultat : le premier joueur ne profite plus de la fonction et le deuxième joueur profite de sa fonction SetTimer qu'il a décidé d'éxécuter et hérité aussi de la fonction du premier joueur .
je l'explique avec mon code : (le problème viens de la variable vid2)
ici (http://pastebin.gtaonline.fr/pastebin.php?show=623)
Donc voilà , je suis encore un peu bordélique car je ne fais que débuter .
Si vous avez compris mon problème et que vous avez des idées , n'hésiter pas :laugh
-
Salut,
tu dois récupérer le véhicule du joueur à chaque fois, pour plus de stabilité il faut s'assurer que le joueur est dans un véhicule...
++Sim++