Siguiendo con el ejemplo que diste, lo que entendi es que quieres que tenga que haber 4 jugadores o mas en una zona determinada, para que alguno de ellos pueda utilizar X comando. Si es eso, aqui tienes un muy buen ejemplo:
pawn Код:
#include <a_samp>
#define MAX_AREAS (3)
//Suponiendo que son varias areas, definimos sus IDs
#define AREA_NONE (-1)
#define AREA_BALLAS (0)
#define AREA_VAGOS (1)
#define AREA_TRIAD (2)
//Informacion del jugador
enum pData
{
Area,
Timer,
};
new Info[MAX_PLAYERS][pData];
/*
Las areas deben coincidir con los nombres de los index de las macros
Formato: {minX, minY, maxX, maxY}
*/
new Float:Areas[MAX_AREAS][4] = {
{0.0, 0.0, 0.0, 0.0},//ballas
{0.0, 0.0, 0.0, 0.0},//vagos
{0.0, 0.0, 0.0, 0.0}//triad
};
//Contador de los jugadores dentro de cada area
new AreasCounter[MAX_AREAS];
//Forard del callback creado para cuando el jugador cambia de zona
forward OnPlayerChangeZone(playerid, newzone, oldzone);
//Al conectarse creamos el temporizador que nos dira su estado
public OnPlayerConnect(playerid)
{
Info[playerid][Area] = AREA_NONE;
Info[playerid][Timer] = SetTimerEx("ZoneChecker", 1000, 1, "i", playerid);
return 1;
}
//Al desconectarse eliminamos el temporizador
public OnPlayerDisconnect(playerid, reason)
{
KillTimer(Info[playerid][Timer]);
return 1;
}
//Temporizador
forward ZoneChecker(playerid);
public ZoneChecker(playerid)
{
//loop a travez de todas las areas
for(new i; i<MAX_AREAS; i++)
{
//chequeamos si el jugador esta dentro del area
if(IsPlayerInArea(playerid, Areas[i][0], Areas[i][1], Areas[i][2], Areas[i][3]) && Info[playerid][Area] != i)
{
//Creamos un evento para saber cuando un jugador cambia de zona
CallLocalFunction("OnPlayerChangeZone", "iii", playerid, i, Info[playerid][Area]);
//Cambiamos el area del jugador
Info[playerid][Area] = i;
}
}
}
public OnPlayerCommandText(playerid, cmdtext[])
{
if(!strcmp(cmdtext, "/micomando_area1", true))//ballas
{
if(Info[playerid][Area] == AREA_BALLAS && AreasCounter[AREA_BALLAS] >= 4)
{
//El jugador puede utilizar el comando
}
else
{
//El jugador no puede utilizar el comando
}
return 1;
}
if(!strcmp(cmdtext, "/micomando_area2", true))//vagos
{
if(Info[playerid][Area] == AREA_VAGOS && AreasCounter[AREA_VAGOS] >= 4)
{
//El jugador puede utilizar el comando
}
else
{
//El jugador no puede utilizar el comando
}
return 1;
}
if(!strcmp(cmdtext, "/micomando_area3", true))//triads
{
if(Info[playerid][Area] == AREA_TRIAD && AreasCounter[AREA_TRIAD] >= 4)
{
//El jugador puede utilizar el comando
}
else
{
//El jugador no puede utilizar el comando
}
return 1;
}
return 0;
}
//Nuestro callback personalizado, el cual es llamado cuando un jugador cambia de zona
public OnPlayerChangeZone(playerid, newzone, oldzone)
{
AreasCounter[newzone]++;
AreasCounter[oldzone]--;
return 1;
}
//Funcion que utilizamos para saber si un jugador esta o no en un area determinada
stock IsPlayerInArea(playerid, Float:minX, Float:minY, Float:maxX, Float:maxY)
{
if(!IsPlayerConnected(playerid))
return 0;
new Float:P[3];
GetPlayerPos(playerid, P[0], P[1], P[2]);
if((maxX-P[0]) >= 0 && (P[0]-minX) >= 0 && (maxY-P[1]) >= 0 && (P[1]-minY) >= 0)
return 1;
return 0;
}
Nota: Este codigo esta relativamente optimizado, pero seria mucho mas eficiente si utilizas el streamer de incognito y los callbacks relacionados a las areas del mismo.