GTAOnline.net
San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: vitry_selkato le 07 Juin 2011, 01:49:48
-
Alors voila mon problème,
Je crée un
new repveh = 0; // je crée une variable
Ensuite
repveh01 = CreatePickup(3096, 14, 3033.2534,-2540.4958,32.5260, -1); // ce que fait la variable
dans la callback des pickup j'ajoute ça
if (pickupid == repveh01)
{
new vid = GetPlayerVehicleID(playerid);
if (vid) RepairVehicle(vid);
GameTextForPlayer(playerid, "~r~~h~Reparation du vehicule ~n~~n~~h~Terminer", 1000, 3);
}
Aucun warning concernant ce pickup
Aucune erreur.
Lors de ma connexion sur le serveur je vais voir l'emplacement des pickups
Aucun sauf un tout piti piti piti clignotement des pickups apres plus rien
[uniquement ramassable par un vehicule] (type: 14)
Sur sa:mp il marque qu'il faut crée un objet a la place du CreatePickup
ou alors j'ai mal compris la j'ai des warning en plus mais même résultat .
Voilà pourquoi je vien demander votre atention sur mon script,
Surment oublier un truc ou un truc qu'il faut faire autrement je ne sait pas .
J'ai 11 pickup identique a celui la 01 ... 11
un autre pickup ramassable uniquement par vehicule
ne s'affiche pas non plus mais il est pret des 11 autre pickup.
J'ai retiré 1 sur 1 rien n'y fait ..
-
Salut,
Pourquoi
new repveh = 0; // je crée une variable
mais:
new repveh01; // je crée une variable
Ensuite
if (pickupid == repveh01)
{
new vid = GetPlayerVehicleID(playerid);
RepairVehicle(vid); // d'apres se que je me souviens, si on met juste if(vid), sa verifi si vid est egale a true ou 1, donc si l'id du veh est 2 sa marchera pas.
GameTextForPlayer(playerid, "~r~~h~Reparation du vehicule ~n~~n~~h~Terminer", 1000, 3);
}
-
J'ai récupéré , les fonctions sur une de mes commandes /repare .
Je vais test d'enlever le
= 0;
pour la variable du haut.
______________________
Re , alors j'ai ajouter les enlever les = 0;
Même résultat il clignote une fois et apres tu voit plus.
Je pense que c'est peut être a cause du SuperStream.
-
regarde bien la reponse de Brian Turner il a raison
-
J'ai enlever le
= 0;
remplacer par:
new repveh01;
J'ai enlever les
if (vid)
ce qui me donne au final ça
if (pickupid == repveh01)
{
new vid = GetPlayerVehicleID(playerid);
RepairVehicle(vid);
GameTextForPlayer(playerid, "~r~~h~Reparation du vehicule ~n~~n~~h~Terminer", 1000, 3);
}
Mais , l'affichage des pickups , comme (type:14) n'apparais pas sur mon serveur ...
-
@Brian Turner: Depuis quand attribuer une valeur directement lors de la déclaration de la variable peut rendre faux un code ?
Ensuite, if(vid) est vrai si vid si elle contient tous sauf 0, et pas si vid vaut 1 ou encore, true.
Je te dis donc que ce que tu dis est faux !
-
Mais dans tout ça , aucune soluce ?
-
@Brian Turner: Depuis quand attribuer une valeur directement lors de la déclaration de la variable peut rendre faux un code ?
J'ai pas dis que c'était faux, mais cela ne sers a rien.
Pour le if(variable) je savais pas, je pense que c'était juste si c'est 1(donc true) alors on fait la condition.
Mais de toute facon, le trucs que je lui est dit(donc le =0;, if(vid)) mieux vaux les enlever, sa ne sers a rien.
-
C'est Syg , qui ma conseiller de mettre
= 0;
a la fin de ma variable
Ensuite , le code est bon , le probléme c'est l'affichage des pickups ,
Ramassable que pour les vehicules.
Il ne s'affiche pas .
Et il ne font aucun effet.
(faudrez déjà qu'il s'affiche pour faire l'effet).
Et je vien pour demander de l'aide pas pour, consulter vos débat.
-
Comme on dit : "On est jamais mieux servi que par soi-même".
Donc, on oublie le type 14 et on passe au type 1 = pickup qui ne fait rien d'autre que d'envoyer l'événement OnPlayerPickupPickup.
Et c'est justement dans cette callback qu'on va faire, nous-mêmes, tout le boulot (d'où la première phrase de ce post).
Il suffit, après avoir testé que c'est le bon pickup, de tester que le joueur est dans un véhicule (IsPlayerInAnyVehicle). Si c'est le cas, on fait un SetVehicleHealth du véhicule du joueur (GetPlayerVehicleId). Sinon, on ne fait rien.
Et comme ce pickup ne disparait pas, il n'y a rien d'autre à faire (à part peut-être jouer un son pour prévenir le joueur).
A moins qu'on veuille justement qu'il disparaisse. Auquel cas, il suffira d'appeler DestroyPickup après avoir réparer le véhicule. Puis lancer un timer qui recréera le pickup quelques instants après.
Rien de bien compliqué mais on maîtrise totalement le comportement du pickup.
++
Syg
-
J'ai un probléme , je doit mal les placer,
if (pickupid == repveh01)
{
new repveh01 = GetPlayerVehicleId(playerid);
IsPlayerInAnyVehicle(playerid);
SetVehicleHealth(playerid, 100, repveh01);
GameTextForPlayer(playerid, "~r~~h~Reparation du vehicule ~n~~n~~h~Terminer", 1000, 3);
}
-
Tu fais n'importe quoi, tu ne comprends même pas ce que tu fais, tu bâcle ce que tu fais, comment veut-tu y arriver ?
IsPlayerInAnyVehicle(playerid);
À quoi te sert d'appeler cette fonction si tu n'utilise pas sa valeur de retour pour vérifié si le joueur est belle est bien dans un véhicule ?
-
Je n'ai pas compris , comment le placer ..
-
Salut,
pour qu'un code s'exécute ou non en fonction d'une condition qu'utilise t'on?
Si on traduit ce que tu veut dans un français fonctionnel:
Si «Le joueur est dans un véhicule»
alors :
On répare son véhicule
On lui envoie le message indiquant la réparation du véhicule
Sinon :
On ne fait rien
FIN
Maintenant, sachant que le langage de programmation est en anglais, si devient if.
On retrouve donc cette structure:
IF «Le joueur est dans un véhicule»
On répare son véhicule
On lui envoie le message indiquant la réparation du véhicule
END
Sachant que «Le joueur est dans un véhicule» correspond à l'appel de la fonction IsPlayerInAnyVehicle et que l'on doit mettre des accolades pour regrouper des instructions:
if( IsPlayerInAnyVehicle( ... ) )
{
On répase son véhicule
On lui envoie le message indiquant la réparation du véhicule
}
Je pense que tu saura te débrouiller pour intégrer ceci à ton code...sinon, shame on you!
++Sim++
-
Merci Sim,
j'ai donc fait ,
if (pickupid == repveh01 , (IsPlayerInAnyVehicle(playerid)))
{
SetVehicleHealth(playerid, 100);
GameTextForPlayer(playerid, "~r~~h~Reparation du vehicule ~n~~n~~h~Terminer", 1000, 3);
}
Aucune erreure aucun warning
Je test Le pickup n'as toujours aucun effet,
donc
jajoute
GetPlayerVehicleId(playerid);
ce qui fait que j'ai ça :
if (pickupid == repveh01 , (IsPlayerInAnyVehicle(playerid)))
{
GetPlayerVehicleId(playerid);
SetVehicleHealth(playerid, 100);
GameTextForPlayer(playerid, "~r~~h~Reparation du vehicule ~n~~n~~h~Terminer", 1000, 3);
}
Il me marque
error 017: undefined symbol "GetPlayerVehicleId"
-
Salut,
tu devrais regarder ça:http://www.gtaonline.fr/forums/index.php/topic,6175.0.html
++Sim++
-
Tu compares un PickupID avec un VehicleID, c'est forcé que ça ne marchera pas.
Ensuite, tu essaie de réparer le joueur et non pas le véhicule, ce qui ne marchera pas non plus (enfin si, ça réparera le véhicule qui à le même ID que le joueur mais qui peut se trouver à l'autre bout de la carte).
De plus, le deuxième paramètre de SetVehicleHealth varie de 0.0 à 1000.0 (et non pas 100.0 comme pour un perso)
---> http://wiki.sa-mp.com/wiki/VehicleHealth (http://wiki.sa-mp.com/wiki/VehicleHealth)
Sinon, voilà comment il faut faire.
Déclaration d'une variable globale :
new MonPickup;
Création du pickup (dans OnGameModeInit par exemple) :
MonPickup = CreatePickup (...);
Et enfin la callback de gestion de pickup :
public OnPlayerPickupPickup (playerid, pickupid)
{
/* Si c'est le bon pickup */
if (pickupid == MonPickup)
{
/* Si le joueur est en véhicule */
if (IsPlayerInAnyVehicle (playerid))
{
/* On repare le véhicule */
SetVehicleHealth (GetPlayerVehicleID (playerid), 1000.0); // ou RepairVehicle (GetPlayerVehicleID (playerid));
GameTextForPlayer (playerid, "~r~~h~Reparation du vehicule ~n~~n~~h~Terminer", 1000, 3);
/* Ici, on peut jouer un son par exemple pour prévenir le joueur */
/* On peut aussi faire disparaitre le pickup (DestroyPickup) et lancer un timer pour le faire réapparaitre */
}
}
}
NB : Code non testé mais vu le nombre de lignes, ça devrait fonctionner.
++
Syg
-
Chez moi cela fonctionne pas , avec les deux options repairvehicle ou setvehiclehealth
-
peut'on voir comment tu as fais car cela m'etonne fortement que sa ne fonctionne pas
-
peut'on voir comment tu as fais car cela m'etonne fortement que sa ne fonctionne pas
Pas de problèmes,
new repveh01;
repveh01 = CreatePickup(3096, 1, 3070.5557, -2291.6531, 26.2190, -1);
if (pickupid == repveh01)
{
if (IsPlayerInAnyVehicle(playerid))
{
RepairVehicle (GetPlayerVehicleID (playerid));
GameTextForPlayer(playerid, "~r~~h~Reparation du vehicule ~n~~n~~h~Terminer", 1000, 3);
}
}
Je n'ai pas fait de copier coller , j'ai copier tout à la main.
-
Salut,
Je pense que tu devrais utiliser ce code là:
<?php // Ne prête pas attention à ça, c'est pour la couleur. ;)
public OnPlayerPickUpPickup(playerid, pickupid)
{
if(pickupid == repveh01) // Si l'ID du pickup est "repveh01"...
{
if(IsPlayerInAnyVehicle(playerid) == 1) // Si le joueur est dans un véhicule...
{
RepairVehicle(GetPlayerVehicleID(playerid)); // On répare le véhicule.
GameTextForPlayer(playerid, "~h~Reparation du vehicule...~n~~n~~h~Terminee !", 1000, 3); // On avertit le joueur.
}
else // Sinon...
{
GameTextForPlayer(playerid, "~h~Vous devez etre dans un vehicule~n~~n~pour effectuer une reparation !", 1000, 3); // On avertit le joueur (au cas où). :p
}
}
return 1;
}
Après, libre à toi de rajouter un son, une vue modifiée de la caméra, etc. ;)
++
-
Le problème vient du fait que les pickup de type 1 ne peuvent être ramassés que quand on est à pied.
Il faut donc utiliser le type 14 et gérer la réapparition du pickup car il ne réapparait pas si on reste dans les parages.
Voici la solution (testée) :
Variable globale :
new MyPickup;
Fonction de timer :
forward CreerPickup ();
public CreerPickup ()
{
MyPickup = CreatePickup (3096, 14, 1884.6749, -1388.3657, 13.5703, -1);
}
Dans OnGameModeInit :
SetTimer ("CreerPickup", 100, 0);
La callback :
public OnPlayerPickUpPickup (playerid, pickupid)
{
if (pickupid == MyPickup)
{
/* Le pickup n'est ramassable qu'en véhicule donc le joueur est forcément dans un véhicule
=> Pas besoin de test */
DestroyPickup (MyPickup);
RepairVehicle (GetPlayerVehicleID (playerid));
GameTextForPlayer (playerid, "~h~Reparation du vehicule...~n~~n~~h~Terminee !", 1000, 3);
SetTimer ("CreerPickup", 1000, 0);
}
}
++
Syg
-
Non , je pense pas que tu est raison .
Les pickups Type 14 il s'affiche mais pas à l'emplacement d'un spawn , j'ai mit des pickups Type 14 il ne s'affiche pas la ou il faut il s'affiche en dessous de ma map , et flotte sur l'eau , au dessus des vagues et suit le mouvement des vageuux :(
j'ai effectuer ce que tu a mit de nouveau , j'ai mit le type 14 , aucun pickup !
=S
-
Les pickup de types 14 sont les seuls ramassables en véhicule.
Par contre, il est bien dit dans le wiki de SAMP que ces pickup passent à travers les objets ajoutés (CreateObject ou autre) et vont se positionner au niveau de la carte originale (donc au niveau de la mer si tu as créé une map au dessus de la mer).
La seule solution pour toi, c'est de passer par une détection de la position du joueur. Donc oublie la callback OnPlayerPickupPickup.
Pour résumer :
Tu crées un pickup de type 1
Dans un timer, tu vérifies si le joueur est à la position du pickup (dans un rayon de 0.5 ou 1 m) :il existe plein d'exemple pour ça.
Si c'est le cas et si il est dans un véhicule, tu répares son véhicule.
++
Syg
-
Bon, j'ai laisser tomber , j'ai cherchez comment détecter la position d'un joueur , j'ai pas trouver des trucs satisfaisant .
J'abandonne , et j'ai fait une commande tampis.