GTAOnline.net
San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: Tetra-S le 14 Septembre 2007, 21:00:06
-
Bonjour je vien de modifier mon script et g un probleme un texte qui doit etre reserver au un classid special ba s'affiche avec toute les classid voici le code qui me pose probleme
http://pastebin.gtaonline.fr/pastebin.php?show=60 (http://pastebin.gtaonline.fr/pastebin.php?show=60)
bien sur g modifier a_sa-mp pour metre sa la
j'epere que quelq'un peut remedier a mon probleme car cela m'arrangerai bien
-
y'a quelq'un sur se topic j'ai besion d'aide svp
merci de votre futur aide
-
C'est normal, tu n'a pas mis ton code dans le bonne fonction :
public OnPlayerSpawn (playerid) -> il n'y a pas de classid donc il vaut toujours 0.
Ton code doit être placé dans le fonction OnPlayerRequestClass :
public OnPlayerRequestClass (playerid, classid) -> attention, il n'y a pas de vehicleid
Et quand je dit "ton code", c'est juste la partie concernant classid.
++
Syg
-
merci je je v modier tou de suite mon script par contre on peut empecher des personne de prendre des pickup
-
non, on ne peut pas empêcher les joueurs de prende un pickup.
++
Syg
-
ok ba alors est il posible d'mpecher un personne d'entrer dans un perimtre definnit
-
Tu peux limiter la zone dans laquelle évolue un joueur avec la fonction SetPlayerWorldBounds mais je ne pense pas qu'elle corresponde à ce que tu veux faire.
Par contre, la solution à ton problème pourrait être de téléporter le joueur qui entre dans une zone aux limites de cette zone, ou en un point prédéfini à l'extérieur de la zone.
Mais là encore, ce n'est pas très joli car tu risques de devoir téléporter le joueur en un point autre que son point d'entrée dans la zone, ce qui créera des choses bizarres pour les joueurs sur ton serveur (téléportation semblant aléatoire).
Bien sur, pour corriger cela, tu peux toujours coder un script compliqué qui détecte le point d'entrée dans la zone et téléporte le joueur à ce point. Mais là, je te dis juste : "Bon courage" :)
++
Syg
-
ok mais vu mon ba niv je me v tenter de me lancer dans quelque que ligne de code pour annuler le effet du pickup aux moment ou on le prend
mais je c meme pas le nom de la fonction ou mettre sa
-
Il existe une callback appelée OnPlayerPickUpPickup.
Je pense qu'elle pourrait t'aider.
Sinon, pour enlever une arme (si c'est ce qu'est ton pickup) à un joueur, il faut :
1 - Faire la liste des armes du joueur (GetPlayerWeaponData)
2 - Lui enlever toutes ces armes (ResetPlayerWeapons)
3 - Puis lui redonner toutes les armes qu'il avait sauf le pickup (GivePlayerWeapon)
Si ton pickup est autre chosequ'une arme (jetpack, vie, ...), il faut utiliser une autre méthode.
++
Syg
-
Pour la callback voila ce que tu peux faire :
Tout en haut :
new pick1;
Devant le pickup qui doit executer une action :
pick1 =
Exemple :
pick1 = AddStaticPickup(372,2,414.4668,2535.3127,23.2773); // TEC 9
Et enfin tout en bas :
public OnPlayerPickUpPickup(playerid, pickupid);
if (pick1)
{
/* On fais ce qu'il y a a faire */
}
return 0;
}
Et voila le travail ;)
-
Urbanghetto, ton test if (pick1) est erroné.
Un test c'est un comparaison entre deux valeurs et dans le tien, il n'y en a qu'une.
Par défaut, le compilateur va remplacer ton test pas if (pick1 != 0)
C'est à dire que si pick1 vaut 0, on n'exécute pas le code.
Par contre, pour toutes les autres valeurs 1,2,3, ... -1, -2, ..., le code sera exécuté.
Et pour le cas qui nous occupe, ton test aurait du être :
if (pickupid = = pick1)
++
Syg
-
merci maintenant g plus que 1 probleme pour annuler les effets du pick up de vie. je pense que je dois utiliser la fonction getplayerheath (si elle existe) pour obtenir sa vie et la mettre dans une variable puis utiliser setplayerhealth
-
Oui sa existe GetPlayerHealth
AK NV.
-
oui mais sa ajouterais pas de la vie par hazard
-
GetPlayerHealth permet d'obtenir la vie d'un joueur.
SetPlayerHealth permet de fixer la vie d'un joueur.
++
Syg
-
ok mais la je compren dvrament plus rien :blink ;D car g preparer un code pour les armure mais sois i m'affiche pas le bon texte ou il y'a un bug au niveaut des pick up (i un autre apparait diretement quand je le prend) et don la fonction na pas le temps d'agire et donc le personne a tout sa vie le phenomene de la double appartition se manifester a partir deu deuxime pickup
new pickgp; //au debut apres les include
//sf
pickgp = AddStaticPickup(1242, 2, -1614.8715,686.6466,7.1875);
pickgp = AddStaticPickup(1242, 2, -1617.3870,686.5842,7.1875);
pickgp = AddStaticPickup(1242, 2, -1614.8715,686.6466,7.1875);
pickgp = AddStaticPickup(1242, 2, -1619.9105,692.9993,7.1875);
pickgp = AddStaticPickup(1242, 2, -1600.9403,730.5913,-4.9063);
pickgp = AddStaticPickup(1242, 2, -1599.4857,730.3182,-4.9063);
pickgp = AddStaticPickup(1242, 2, -1596.2815,730.4917,-4.9063);
pickgp = AddStaticPickup(1242, 2, -1590.8850,733.8392,-4.9063);
pickgp = AddStaticPickup(1242, 2, -1593.2040,734.7852,-4.9063);
pickgp = AddStaticPickup(1242, 2, -1595.4840,735.1523,-4.9063);
pickgp = AddStaticPickup(1242, 2, -1598.3239,735.3124,-4.9063);
//lv
pickgp = AddStaticPickup(1242, 2, 301.5684,170.4484,1007.1719);
pickgp = AddStaticPickup(1242, 2, 301.7295,172.0406,1007.1719); //sa dans [b]OnGameModeInit[/b]
public OnPlayerPickUpPickup(playerid, pickupid){
{
if (pickupid == pickgp)
{
if(gTeam[playerid] == POLICE || gTeam[playerid] == ADM )
SendClientMessage(playerid,0x8000FFFF,"Ne le gaspille pas");
}else{
SendClientMessage(playerid,0xFF0000FF,"Desoler mais tu ne fait pas parti de la police");
SetPlayerArmour(playerid,0.0);
}
}
return 1;
} //sa ver la fin
je comprend pas ma faute elle dois etre toute bette mais je vois vraiment pas
-
Premièrement, tu utilises la même variable pour tous les pickups.
Si je te montre les lignes suivantes :
a=1;
a=2;
a=3;
Combien vaut a ?
3 bien évidement et bien pour tes pickups c'est pareil, ta variable contient l'ID du dernier pickup que tu as crée.
Deux cas se présente à toi :
1 - Si tu n'as que des armures comme pickups (c'est à dire que tu veux faire la même chose quand un joueur prend un pickup quelconque:
Oublies la variable pickgp, tu n'en n'as pas besoin.
Ton code devient donc :
AddStaticPickup (1242, .......);
public OnPlayerPickUpPickup(playerid, pickupid)
{
if(gTeam[playerid] == POLICE || gTeam[playerid] == ADM )
{
SendClientMessage(playerid,0x8000FFFF,"Ne le gaspilles pas");
}
else
{
SendClientMessage(playerid,0xFF0000FF,"Désolé mais tu ne fais pas partie de la police"); // J'ai corrigé les fautes au passage
SetPlayerArmour(playerid,0.0);
}
return 1;
}
2 - Tu as plusieurs types de pickups :
Tu dois stocker les ID des pickups dans un tableau :
#define NB_MAX_ARMURES 13
new pickgp[NB_MAX_ARMURES];
pickgp[0] = AddStaticPickup (1242, ....);
pickgp[1] = AddStaticPickup (1242, ....);
...
pickgp[12] = AddStaticPickup (1242, ....);
public OnPlayerPickUpPickup(playerid, pickupid)
{
for (new j=0 ; j<NB_MAX_ARMURES ; j++)
{
if (pickupid == pigp[j])
{
if(gTeam[playerid] == POLICE || gTeam[playerid] == ADM )
{
SendClientMessage(playerid,0x8000FFFF,"Ne le gaspilles pas");
}
else
{
SendClientMessage(playerid,0xFF0000FF,"Désolé mais tu ne fais pas partie de la police"); // J'ai corrigé les fautes au passage
SetPlayerArmour(playerid,0.0);
}
/* Permet de sortir de la boucle si on a trouvé le pickup */
j = NB_MAX_ARMURES;
}
}
return 1;
}
Deuxièmement, concernant les pickups, tu as mis 2 comme deuxième paramètre à ta fonction AddStaticPickup.
Si tu vas voir à ce lien (http://forum.sa-mp.com/index.php?topic=139.msg1582#msg1582), tu verras que 2 veux dire que le pickup réapparait au bout d'un certaint temps.
Pour que le pickup ne réapparaisse pas, il faut mettre la valeur 3, mais il ne réapparaitra plus jamais jusqu'au prochain redémarrage du mode.
++
Syg
-
merci syg vraiment merci , ton en C et C++ doit etre haut car une boucle j'y aurait jamais pencer.
tu n'est certe pas un maitre jedi mais tu est un maitre codeur et encore je ne cite pas les insigne qui vont avec se grades
aller j'arrette le hs
ps; juste pour etre sur : "j" je peut mettre "a" "b" ou d'otre lettres a la place
pss : desoler pour les faute dans les texte mais je jongle entre mapping et codding donc je stres a fond car je me suis imposer une limite de temps
-
Oui Tetra-S, à la place de j tu peux mettre a, b ou NumeroPickUp ou JaimeLaSaucisseQuandElleEstFraiche, c'est toi qui choisi, faut juste éviter de mettre un mot reservé.
Pour les fautes, c'estparce que j'ai copié/collé ton code et que vu mon âge, je fais attention à l'orthographe.
++
Syg
-
ok merci maintenant que g les clef en mains g plus que a les adater en fontion du pickup
ps : la page que tu ma donner regorge de lien mais aucun na un rapport avec les pickup et sur la page il n'y a rien sur les pickup appart le nombres max
-
Urbanghetto, ton test if (pick1) est erroné.
Un test c'est un comparaison entre deux valeurs et dans le tien, il n'y en a qu'une.
Par défaut, le compilateur va remplacer ton test pas if (pick1 != 0)
C'est à dire que si pick1 vaut 0, on n'exécute pas le code.
Par contre, pour toutes les autres valeurs 1,2,3, ... -1, -2, ..., le code sera exécuté.
Et pour le cas qui nous occupe, ton test aurait du être :
if (pickupid = = pick1)
++
Syg
Désolé j'été pas bien concentrer :P
-
Tetra-S
Si si, le lien que je t'ai donné t'amène directement au post n° 1582 d'un certain Postaly qui traite des types de pickups.
Urbanghetto
Pas grave ça arrive à tout le monde de faire des erreurs.
++
Syg
-
Here's the pickup ID's for health, armor, and adrenaline pill:
1240 health
1241 adrenaline pill
1242 armor
enjoy.
Comme il a dis, Enjoy ;)
-
SYG je crois que je v pleurer mais maitenant le message apparaisse plus je c vrament pas d'ou sa vien ;D :dejadehors
sa m'enerve car j'en ai vraiment besion
public OnPlayerPickUpPickup(playerid, pickupid)
{
for (new j=0 ; j<NB_MAX_ARMURES ; j++)
{
if (pickupid == pickgp[j])
{
if(gTeam[playerid] == POLICE || gTeam[playerid] == ADM )
{
SendClientMessage(playerid,0x8000FFFF,"Ne le gaspilles pas");
}
else
{
SendClientMessage(playerid,0xFF0000FF,"Désolé mais tu ne fais pas partie de la police"); // J'ai corrigé les fautes au passage
SetPlayerArmour(playerid,0.0);
}
/* Permet de sortir de la boucle si on a trouvé le pickup */
j = NB_MAX_ARMURES;
}
}
return 1;
}
if(gTeam[playerid] == POLICE || gTeam[playerid] == ADM )
j'ai tenter de remplacer le texte en rouge pas max_players mais sa me met un erreur
-
Ton erreur peux venir de plusieurs facteurs, il faudrait voir le script en entier pour le dire.
Mais bon, tout d'abord, il faut t'assurer que toutes les variables utilisées dans les tests ont la bonne valeur, c'est à dire être sûr qu'elles ont été initialisées correctement dans les autres parties de ton script.
Ceci concerne les variables pickgp[j] et gTeam[playerid].
Je pense que ton problème vient de pickgp[j] sinon on verrait quand même un des deux messages.
pickgp[j] doit être initialisée quand tu fais un appel à AddStaticPickup :
pickgp[0] = AdStaticPickup (...);
pickgp[1] = AdStaticPickup (...);... etc
Donc regardes dans OnGameModeInit si tu fais bien ça.
Sinon, tu peux toujours mettre ton script dans le pastebin (http://pastebin.gtaonline.fr/pastebin.php).
++
Syg
-
ok normalement je ne donne pas mon script entier pour sa mais je v faire une exeption je post demain
-
Si tu veux pas montrer ton script à tout le monde, on peut faire ça par MSN.
Je t'ai envoyé un message privé pour de donner mon MSN.
++
Syg