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

Titre: Pickup Ramassable uniquement en vehicule
Posté 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 ..
Titre: Re : Pickup Ramassable uniquement en vehicule
Posté par: Brian Turner le 07 Juin 2011, 07:58:58
Salut,

Pourquoi
Code: (pawn) [Sélectionner]
new repveh = 0; // je crée une variable mais:
Code: (pawn) [Sélectionner]
new repveh01; // je crée une variable
Ensuite
Code: (pawn) [Sélectionner]
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);
}
Titre: Re : Pickup Ramassable uniquement en vehicule
Posté par: vitry_selkato le 07 Juin 2011, 12:45:27
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.
Titre: Re : Pickup Ramassable uniquement en vehicule
Posté par: cristab le 07 Juin 2011, 14:09:17
regarde bien la reponse de Brian Turner il a raison
Titre: Re : Pickup Ramassable uniquement en vehicule
Posté par: vitry_selkato le 07 Juin 2011, 14:10:46
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 ...
Titre: Re : Pickup Ramassable uniquement en vehicule
Posté par: Xartrick le 07 Juin 2011, 18:39:14
@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 !
Titre: Re : Pickup Ramassable uniquement en vehicule
Posté par: vitry_selkato le 07 Juin 2011, 20:57:12
Mais dans tout ça , aucune soluce ?
Titre: Re : Pickup Ramassable uniquement en vehicule
Posté par: Brian Turner le 08 Juin 2011, 14:57:46
Citer
@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.
Titre: Re : Pickup Ramassable uniquement en vehicule
Posté par: vitry_selkato le 08 Juin 2011, 23:53:50
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.
Titre: Re : Pickup Ramassable uniquement en vehicule
Posté par: Syg le 09 Juin 2011, 16:47:44
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
Titre: Re : Pickup Ramassable uniquement en vehicule
Posté par: vitry_selkato le 10 Juin 2011, 23:51:23
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);
}
Titre: Re : Pickup Ramassable uniquement en vehicule
Posté par: Xartrick le 10 Juin 2011, 23:54:12
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 ?
Titre: Re : Pickup Ramassable uniquement en vehicule
Posté par: vitry_selkato le 10 Juin 2011, 23:55:17
Je n'ai pas compris , comment le placer ..
Titre: Re : Pickup Ramassable uniquement en vehicule
Posté par: S!m le 11 Juin 2011, 01:02:01
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:
Citer
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:

Citer
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:

Citer
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++
Titre: Re : Pickup Ramassable uniquement en vehicule
Posté par: vitry_selkato le 11 Juin 2011, 01:46:06
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"
Titre: Re : Pickup Ramassable uniquement en vehicule
Posté par: S!m le 11 Juin 2011, 03:04:36
Salut,

tu devrais regarder ça:http://www.gtaonline.fr/forums/index.php/topic,6175.0.html

++Sim++
Titre: Re : Pickup Ramassable uniquement en vehicule
Posté par: Syg le 11 Juin 2011, 17:52:52
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
Titre: Re : Pickup Ramassable uniquement en vehicule
Posté par: vitry_selkato le 14 Juin 2011, 00:01:32
Chez moi cela fonctionne pas , avec les deux options repairvehicle ou setvehiclehealth
Titre: Re : Pickup Ramassable uniquement en vehicule
Posté par: cristab le 14 Juin 2011, 09:06:22
peut'on voir comment tu as fais car cela m'etonne fortement que sa ne fonctionne pas
Titre: Re : Re : Pickup Ramassable uniquement en vehicule
Posté par: vitry_selkato le 15 Juin 2011, 14:18:52
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.
Titre: Re : Pickup Ramassable uniquement en vehicule
Posté par: Pixect le 15 Juin 2011, 16:46:00
Salut,

Je pense que tu devrais utiliser ce code là:

<?php // Ne prête pas attention à ça, c'est pour la couleur. ;)

public OnPlayerPickUpPickup(playeridpickupid)
{
    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 !"10003); // On avertit le joueur.
        
}
        else 
// Sinon...
        
{
            
GameTextForPlayer(playerid"~h~Vous devez etre dans un vehicule~n~~n~pour effectuer une reparation !"10003); // 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. ;)

++
Titre: Re : Pickup Ramassable uniquement en vehicule
Posté par: Syg le 15 Juin 2011, 23:21:27
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
Titre: Re : Pickup Ramassable uniquement en vehicule
Posté par: vitry_selkato le 16 Juin 2011, 01:02:24
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
Titre: Re : Pickup Ramassable uniquement en vehicule
Posté par: Syg le 16 Juin 2011, 09:32:51
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
Titre: Re : Pickup Ramassable uniquement en vehicule
Posté par: vitry_selkato le 19 Juin 2011, 14:11:31
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.