GTAOnline.net
San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: vardanega le 16 Mai 2011, 00:21:32
-
Bonsoir, sur mon serveur 16 véhicules sont créer au chargement pour 16 joueurs maximum, je voudrais que si il y a 10 joueurs, les 10 joueurs soit mis dans un véhicule (ceux déja créer) et le reste des véhicules soit détruit.
Sim m'avais créer une fonction pour mettre tout les joueurs dans des véhicules créer a leurs positions:
PutAllPlayerInVehicle(model, color = -1, color2 = -1)
{
new vehicleid = 0;
new Float:X, Float:Y, Float:Z, Float:A;
for(new i=0; i < MAX_PLAYERS; i++)
{
vehicleid = GetPlayerVehicleID(i);
if(vehicleid)
{
SetVehicleToRespawn(vehicleid);
}
if(GetPlayerState(i) >= PLAYER_STATE_ONFOOT && GetPlayerState(i) <= PLAYER_STATE_SPAWNED)
{
VehicleInfo[1][vFloatZ]
GetPlayerPos(playerid,X,Y,Z);
GetPlayerFacingAngle(playerid,A);
vehicleid = CreateVehicle(model, X, Y, Z+1, A, color1, color2);
PutPlayerInVehicle(i, vehicleid, 0);
}
}
}
Mais je n'arrive pas a la modifié pour mon besoin.
Si un peux aide pouvait m'etre fournie.
Merci beaucoup,
Vince.
-
Premièrement, on ne peut détruire les véhicules que si ils ont été crées avec CreateVehicle et non pas avec AddStaticVehicle mais c'est peut-être déjà ton cas.
Ensuite, il suffit de faire correspondre les ID des vehicules et des joueurs. Le joueur 2 aura toujours le véhicule 3, le joueur 7 le véhicule 8, etc.
NB : La correspondance est décalé car les ID de véhicule commencent à 1 alors que les ID de joueurs commencent à 0.
Dans ton cas, on peut faire une boucle sur le nombre de véhicules :
/*
Le bout de script suivant se base sur le postula suivant :
- Si tout les ID de véhicule sont utilisés entre 1 et VIdMax,
- Si on détruit le véhicule avec l'id Vid alors le prochain véhicule créer aura l'ID Vid.
En d'autres mots : SAMP prend le premier ID libre pour l'affecter au véhicule créé.
Si ce postula est faux alors le bout de script suivant ne fonctionnera pas.
*/
#define NB_MAX_VEHICULES 16
PutAllPlayerInVehicle (model, color = -1, color2 = -1)
{
new i;
new vehicleid = 0;
new Float:X, Float:Y, Float:Z, Float:A;
for (i=0 ; i<NB_MAX_VEHICULES ; i++)
{
/* Dans tous les cas, on détruit le véhicule */
DestroyVehicle (i+1); // Les ID de véhicules commencent à 1 alors que les ID de joueurs commencent à 0
/* Si le joueur est connecté */
if (IsPlayerConnected (i))
{
/* Le véhicule ayant été détruit, il ne reste plus qu'à en créer
un pour le joueur et à la mettre dedans */
GetPlayerPos (playerid,X,Y,Z);
GetPlayerFacingAngle (playerid,A);
vehicleid = CreateVehicle (model, X, Y, Z+1, A, color1, color2);
/* Si le postula ennoncé en haut est juste alors on devrait avoir :
vehicleid = i+1 */
PutPlayerInVehicle (i, vehicleid, 0);
}
}
}
NB : Ce bout de script n'a pas été testé.
++
Syg
-
Bonjour, tout d'abord merci pour votre aide.
Comme je les dit au début de mon premier post, je n'est pas besoin de créer les véhicules car il sont placez a des positions bien précises qui ne doivent pas changez (Véhicule créer avec CreateVehicle).
Merci
Vince.
-
Up, personnes ?
-
Ma solution fonctionne puisque tes véhicules sont crées avec CreateVehicle. il n'est pas grave de détruire les véhicules de ton serveur puisqu'ils ne serviront à rien dans le cas où tu mets TOUS les joueurs dans un véhicule.
J'ai juste oublié qu'il fallait créer les véhicules par défaut si une place est libre dans les ID sinon le code que j'ai filé ne fonctionnera pas:
PutAllPlayerInVehicle (model, color = -1, color2 = -1)
{
new i;
new vehicleid = 0;
new Float:X, Float:Y, Float:Z, Float:A;
for (i=0 ; i<NB_MAX_VEHICULES ; i++)
{
/* Dans tous les cas, on détruit le véhicule */
DestroyVehicle (i+1); // Les ID de véhicules commencent à 1 alors que les ID de joueurs commencent à 0
/* Si le joueur est connecté */
if (IsPlayerConnected (i))
{
/* Le véhicule ayant été détruit, il ne reste plus qu'à en créer
un pour le joueur et à la mettre dedans */
GetPlayerPos (playerid,X,Y,Z);
GetPlayerFacingAngle (playerid,A);
vehicleid = CreateVehicle (model, X, Y, Z+1, A, color1, color2);
/* Si le postula ennoncé en haut est juste alors on devrait avoir :
vehicleid = i+1 */
PutPlayerInVehicle (i, vehicleid, 0);
}
/* PARTIE A AJOUTER */
{
/* On cree le véhicule à un emplacement par défaut (a définir) */
/* Ce véhicule n'est utilisé par aucun joueur */
vehicleid = CreateVehicle (model, ??, ??,??, ??, color1, color2);
}
}
}
++
Syg
-
La chose a savoir c'est qu'il y a un bot sur le serveur, donc les IDs des joueurs commence a 1 car le bot ce connecte en premier.
Pour les véhicules je ne comprend pas comment il vont ce retrouvez a la position que je souhaite:
Il y a 16 véhicules max, les 16 véhicules sont chargez au chargement de la map, a ce moment la je veux "comptez" le nombres de joueurs en jeu (définie par un statut particulier) et si il y a 10 joueurs de disponible, on met le premier joueur dans le premier véhicule ainsi de suite, et quand il n'y a plus de joueur / 16 max, on supprime les véhicules en trop. Le problème que j'ai et que mes véhicules sont a un emplacement bien précis et je ne peux pas deviné ou écrire manuellement ou il ce trouveront (il sont chargez par SQL).
J'utilise un enum pour les véhicules:
enum vInfo
{
vModeleId,
vMapId,
vMId,
Float:vFloatX,
Float:vFloatY,
Float:vFloatZ,
Float:vFloatA,
vColor1,
vColor2,
vRespawn
};
new VehicleInfo[16][vInfo];
Les véhicules sont créer sous ce format:
CreateVehicle(VehicleInfo[idx][vModeleId], VehicleInfo[idx][vFloatX], VehicleInfo[idx][vFloatY], VehicleInfo[idx][vFloatZ], VehicleInfo[idx][vFloatA], VehicleInfo[idx][vColor1], VehicleInfo[idx][vColor2], VehicleInfo[idx][vRespawn]);
Voila, en espérant que vous comprendrez.
Vince.