GTAOnline.net
San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: Ashley11 le 07 Décembre 2012, 01:15:49
-
Bonsoir,
Je voulais simplement savoir comment récupérer le nom du lieux où ont se trouve.
Je sait qu'il n'existe pas une fonction toute faite, mais je veut bien que l'ont m'explique..
J'ai regardé sur quelques script et j'ai vu ça :
enum MainZone{
Zone_Name[28], Float:Zone_Area[6] };
static const SanAndreasZones[][MainZone] = {
{"The Big Ear", {-410.00,1403.30,-3.00,-137.90,1681.20,200.00}},
{"Aldea Malvada", {-1372.10,2498.50,0.00,-1277.50,2615.30,200.00}},
}
Maintenant il me faudrait, savoir si le joueur est près de cette zone ? si oui comment le faire :happy:
Merci d'avance.
-
Bonjour,
#define MAX_AREA 100 //le nombre maximum de lieu
new PlayerInArea[MAX_PLAYERS][MAX_AREA]; // savoir si le joueur est dans une area anti flood
enum MainZone{
Zone_Name[28], Float:Zone_Area[6] };
static const SanAndreasZones[][MainZone] = {
{"The Big Ear", {-410.00,1403.30,-3.00,-137.90,1681.20,200.00}},
{"Aldea Malvada", {-1372.10,2498.50,0.00,-1277.50,2615.30,200.00}},
}
Ce code de te permet d'identifier les area ou se situe les zones des lieux.
Maintenant tu as juste à intégrer dans un public ou une callback une conditions pour vérifier si le joueur est dans une zone ou pas.
Par exemple dans OnPlayerUpdate
public OnPlayerUpdate(playerid)
{
for(new area=1; area<MAX_AREA; area++)
{
if(IsPlayerInArea(playerid,SanAndreasZones[area][Zone_Area[0]],SanAndreasZones[area][Zone_Area[1]],SanAndreasZones[area][Zone_Area[2]],SanAndreasZones[area][Zone_Area[3]],SanAndreasZones[area][Zone_Area[4]],SanAndreasZones[area][Zone_Area[5]],SanAndreasZones[area][Zone_Area[6]])// Attention tu doit avoir la fonction isplayerinarea ou si tu as le streamer de Incognito tu peut utiliser isplayerindynamicarea que tu doit crée avant dans ongamemodeinit !
if(PlayerInArea[playerid][area] == 0)
{
GameTextForPlayer(playerid,SanAndreasZones[area][Zone_Name],3000);//Après tu peut personnaliser ton texte via un format
PlayerInArea[playerid][area] = area+1;
break;
}
else if(area != PlayerInArea[playerid][area]-1)//Juste pour te donner une idée, mais concrètement c'est un peu plus compliqué pour vider le cache de cette variable.
{
PlayerInArea[playerid][area] = 0;
}
}
}
}
Ce code à était réaliser sur le forum est donc en aucun tester, c'est tout simplement pour t'orienter de la démarche à suivra aprés tu as des filterscript qui gère cela.
Bonne Chance à toi.
Malak++
-
Merci, je vais essayer de me debrouiller ;)
-
Salut,
petit conseil : n'utilise pas ce code tel quel...
tu fais une boucle sur toutes les zones à chaque fois que le joueur est mis à jour, si t'as plusieurs joueurs avec des bons ping etc... ça va vite s'emballer, essaie de trouver une autre façon de faire.
Au pire des timers ou ajouter un test dans le OnPlayerUpdate pour limiter la fréquence du calcul.
Bonne chance
++Sim++