GTAOnline.net
San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: Ananas_Xpress le 20 Juillet 2013, 20:48:11
-
Bonjours a tous !
Alors voila je me poser une question, comment bloquer un vehicule SANS le bloquer par l'id, exemple :
Donc le joueur possede une sultan (id:460 je croit)
et j'ai une sultan en exposition devant la concession
Comment bloquer la sultan devant la concession , car si je bloque l'id du vehicule , ils seront tous bloquer logique ...
Jespere que vous comprendrais ma question !
-
J'y connais pas grand chose, mais peut être la bloqué en utilisant le système de zone, genre bloquer les véhicules dans une zone spécifique prédéfini.
NV.
-
oui j'y ait déjà penser , mais si je bloque a la concession , le joueur arrive pour acheter une voiture en sultan (évidemment) elle sera elle aussi bloquer du coup .
Je me demander si un FS ou autre exister pour gérer plus facilement les véhicules ...
-
En Faite,tu voudrais Bloquer ta Slutan,pour que toi ,et toi seulement,puise la conduire ?
-
car si je bloque l'id du vehicule , ils seront tous bloquer logique ...
Ce n'est pas le cas. Chaque véhicule dispose de ce qu'on appelle un modelid. Pour l'Infernus, par exemple, c'est 411. Pour la NRG-500, 522 (ou 520, je ne sais plus). C'est ce qui permet de connaître le modèle du véhicule.
Lorsque tu fais apparaître un véhicule avec la fonction CreateVehicle(), elle retourne un identifiant unique. En fait, dans ton serveur un tableau est créé, et pour chaque case du tableau, il fait référence à un véhicule qui a été spawn. Donc, avec le code suivant :
new monVehicle = CreateVehicle(/* Arguments */);
La variable monVehicle contient le numéro de la case du tableau créé par SA-MP dans laquelle est stocké le véhicule chargé par CreateVehicle(). Tu peux donc utiliser cette variable pour agir sur ce véhicule spécifiquement.
Si tu choisies de te servir du modelid pour par exemple bloquer toutes les Infernus, tu dois :
- Récupérer le modelid (pour l'Infernus, c'est 411) ;
- Faire une boucle qui fait telle action sur les véhicules dont le modelid est untel ;
Par exemple, une fonction qui respawn toutes les Infernus du serveur :
public RespawnInfernus()
{
for(new vehicle = 0; vehicle < MAX_VEHICLES; vehicle++)
{
if(GetVehicleModel(vehicle) == 411)
{
SetVehicleToRespawn(vehicle);
}
}
return 1;
}
Voilà, je pense avoir tout dit. À toi de creuser un peu le sujet, si tu as besoin d'aide j'expliquerais plus en détail.
Bonne soirée !
-
j'ai compris ce que tu veut dire Gzsume, maintenant je passe a la pratique , je me retourne ver toi si je rencontre des problèmes !
Merci !
============================================================================
Questions: Comment vérifier a quelle ligne appartient le véhicule en question ?
La se sont les lignes de mes vehicules devant la concession
new monVehicle0 = CreateVehicle(415,549.3237,-1258.1016,16.5027,338.1807,-1,-1,86400); //
new monVehicle1 = CreateVehicle(415,544.2635,-1261.5669,16.5749,335.0604,-1,-1,86400); //
Que doi-je mettre dans le public OnPlayerStateChange pour verifier la ligne du vehicule ?
Je debute en pawn donc je doit dire que je rame un peu mais sa me plait ! mouahaha !
-
Bonsoir ! :smile:
Source du WIKI:
public OnPlayerStateChange(playerid, newstate, oldstate)
{
if(oldstate == PLAYER_STATE_ONFOOT && newstate == PLAYER_STATE_DRIVER) // Player entered a vehicle as a driver
{
new vehicleid = GetPlayerVehicleID(playerid);
AddVehicleComponent(vehicleid, 1010); // Add NOS to the vehicle
}
return 1;
}
Je traduis:
Dans la ligne 3 nous regardons si le joueur est monter dans un véhicule en tant que conducteur.
Dans la 5, nous créons " vehicleid " qui nous servira à comparer l'id du véhicule dans lequel tu monteras.
La 6 ne sert à rien, mais c'est un exemple, c'est pour ajouter du NOS dans le véhicule dans lequel tu es.
Donc, ce que nous voulons nous, c'est qu'on ne puisse pas utiliser le véhicule d'exposition, logique. Alors nous allons vérifier, dans le script, si le joueur est dans l'un de ces véhicules. Voici un exemple:
public OnPlayerStateChange(playerid, newstate, oldstate)
{
if(oldstate == PLAYER_STATE_ONFOOT && newstate == PLAYER_STATE_DRIVER)
{
new vehicleid = GetPlayerVehicleID(playerid);
if(vehicleid == monvehiculedexpo)
{
SetVehicleParamsEx(/* Les paramètres voulu, par exemple éteindre le moteur, comme ça on ne peut pas s'en servir..*/);
}
}
return 1;
}
J'ai utilisé SetVehicleParamsEx car je trouve ça plutôt pas mal, après tu peux mettre une alarme, fermer les portes, tout ça...
Voilà, bonne chance. :smile:
-
donc j'ai réussit a bloquer QUE mon véhicule d'expo , maintenant si j'ai plusieurs véhicules a bloquer , comment je m'y prend ? dois-je recréer une variable pour chaque vehicule ? ou peut on réunir tout les véhicules d'exposition dans une seul et même variable ?
Voila mon code :
new Vehicules;
public OnGameModeInit()
{
new Vehicules0 = CreateVehicle(541,549.3237,-1258.1016,16.5027,338.1807,58,8); //
new Vehicule1 = CreateVehicle(603,544.2635,-1261.5669,16.5749,335.0604,69,1); // ceci ne fonctionne pas
return 1;
}
public OnPlayerStateChange(playerid, newstate, oldstate)
{
if(oldstate == PLAYER_STATE_ONFOOT && newstate == PLAYER_STATE_DRIVER)
{
new vehicleid = GetPlayerVehicleID(playerid);
if(vehicleid == !Vehicules )
{
RemovePlayerFromVehicle(playerid);
SendClientMessage(playerid, Orange, "[[Serveur]] Voiture d'exposition! Vous ne pouvez pas la conduire !");
return 1;
}
}
J'ai fait plusieurs essais qui n'ont rien donner ...
-
Tu peux faire comme ca pour tes différents véhicules d'exposition :
new vExpo[12]; // En supposant que tu aies 12 véhicules d'exposition
vExpo[0] = CreateVehicle(..);
..
....
vExpo[11] = CreateVehicle(..);
Ca évite de créer plein de variables :wink:
Et quand il rentre dedans tu peux tester comme ca :
new vehid = GetPlayerVehicleID(playerid);
for(new i = 0; i < sizeof(vExpo); i++)
{
if(vehid == vExpo[i])
{
RemovePlayerFromVehicle(playerid);
SendClientMessage(playerid, Orange, "[[Serveur]] Voiture d'exposition! Vous ne pouvez pas la conduire !");
return 1;
}
}
Je n'ai pas testé, mais ca devrait fonctionner! En esperant que tu comprennes :smile:
-
Pourrait tu m'expliquer 'en details' la ligne suivante s'il te plait ?
for(new i = 0; i < sizeof(vExpo); i++)
Sinon pour le code , je les adapter au nombres de véhicules et c'est parfait !
Encore merci de votre aide !!
-
Bonjour :smile:
Alors, je vais t'expliquer. for est une boucle, utile pour Kicker tout les joueurs d'un coup par exemple.
donc:
for()
/* Sans ' ; ' à la fin, comme pour les conditions ' if '
On créer une variable qu'on initialise à 0 - ce qui donne ceci:*/
for(new i = 0)
/* La variable peut s'appeler autrement bien sur...
Ensuite, on dit que ' i ' est nettement plus petit que la valeur de ' vExpo ' ce qui donne:*/
for(new i = 0; i < sizeof(vExpo))
/* Mais comme nous voulons la valeur entière de vExpo, il faut ajouter ' +1 ' à chaque fois.. ' +1 ' qui peut se traduire par ' ++ '. Et on a donc une boucle complète.*/
for(new i = 0; i < sizeof(vExpo); i++)
J'espère que ce que j'ai dit est compréhensible :smile:
-
Voici une autre explication du for en cas où tu n'auras pas compris ^^
faire
for(new i=0;i < sizeof(vExpo); i++)
{
//CODE...
}
revient à faire
new i=0;
while (i< sizeof(vExpo))
{
//CODE...
i++;
}
PS: Gzsume, l'id de la NRJ est bien 522 ^^
-
Okai merci des réponse ! Je comprend un peu mieux !
Maintenant es-que je peut en créer autant que je veut (dans la limite du raisonnable) pour les véhicule de chaque métier par exemple sans risque de LAG/CRASH , ou y'a t'il encore une autre façon plus efficace ?
Désoler si c'est question vous paraisse stupide :rolleyes:
-
Et bien, tu veux en créer combien ?
Essaie de ne pas dépasser 1000 et tu peux être sûr que ça ne fera pas crasher le serveur ^^
(Mais tu peux quand même dépasser cette valeur, essaie par toi même pour voir comment le serveur réagit)
Ah et, si j'ai bien compris, tu souhaiterais bloquer l'accès aux véhicule dans le concessionaire
Pour ça, il y a un paramètre appliquable avec SetVehicleParamsEx (lock) qui permet de verrouiller la porte d'un véhicule
Exemple:
new iEngine, iLights, iAlarm,iDoors, iBonnet, iBoot,iObjective;
GetVehicleParamsEx(iPlayerVehicle, iEngine, iLights, iAlarm, iDoors, iBonnet, iBoot, iObjective);
SetVehicleParamsEx(iPlayerVehicle, iEngine, iLights, iAlarm, 1, iBonnet, iBoot, iObjective);
Pour faire simple, on récupère les paramètres du véhicule (moteur, phares, alarmes, etc), et on les réappliques pour éviter de changer quoi que ce soit pour rien
Mais, on remplace le iDoors (la variable qui contient le numéro qui indique si le véhicule est bloqué ou non) par 1, donc les portes sont verrouillées
Mais même après ça il vaut mieux vérifier dans OnPlayerEnterVehicle si un joueur rentre dans un véhicule de concession, car des cheats permettent de rentrer dans des véhicules vérrouillés :/
-
Je n'en sait trop rien encore mais j'ai genre 6/7 métier sans compter les 'a coter' donc je me renseigne !
Je vais le faire comme je le sent puis on rectifieras le tire en cas de besoin
Merci pour toutes ces informations bien utile !
-
Oui tu peux faire ca pour tous! Le mieux c'est même de creer une fonction pour alléger ton code, c'est plus compréhensible! Tu fais une fonction pour chaque métier par exemple:
// Exemple pour les policiers
new vCop[12]
vCop[0] = CreateVehicle(..); // etc..
IsCopVehicle(vehicleid)
{
for(new i = 0; i < sizeof(vCop); i++) // On boucle la liste des vehicules de police
{
if(GetVehicleModel(vehicleid) != 0 && vehicleid == vCop[i]) return 1; // Si le vehicule existe et s'il est policier, on retourne VRAI
}
return 0; // S'il n'est pas policier, on retourne FAUX
}
// pour adapter aux autres métier, tu changes le nom et du remplace le nom des variables ( ici vCop. C'est assez rapide comme vCop n’apparaît que 2 fois dans la fonction!
Et à l'usage :
public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
{
if(IsCopVehicle(vehicleid)) SendClientMessage(playerid, COLOR_GREEN, "Vous entrez dans un véhicule de police!");
return 1;
}