Ejemplo:
PHP код:
new
playerGangZone[MAX_PLAYERS] = {-1, ...},
Float:playerGangZoneRadio[MAX_PLAYERS] = {50.0, ...}
;
public OnPlayerConnect(playerid)
{
playerGangZone[playerid] = -1;
}
public OnPlayerDisconnect(playerid, reason)
{
if(playerGangZone[playerid] != -1)
{
GangZoneDestroy(playerGangZone[playerid]);
}
}
CMD:gangskin(playerid, params[])
{
new
id = -1
;
if((id = CreateGangZoneInPlayer(playerid)) == -1)
return 0; // No se pudo crear la GangZone por alguna razon, no hay espacio, etc..
playerGangZone[playerid] = id;
UpdatePlayerGangZoneToPlayer(playerid, playerGangZone[playerid]);
return 1;
}
stock CreateGangZoneInPlayer(playerid, Float:gzRatio = 50.0)
{
new
Float:px,
Float:py,
Float:pz
;
playerGangZoneRadio[playerid] = gzRatio;
GetPlayerPos(playerid, px, py, pz);
return GangZoneCreate((px - playerGangZoneRadio[playerid]), (py - playerGangZoneRadio[playerid]), (px + playerGangZoneRadio[playerid]), (py + playerGangZoneRadio[playerid]));
}
stock RefreshGangZoneForPlayer(playerid, all_active = false)
{
new
gz_id = playerGangZone[playerid]
;
if(gz_id != -1)
return 0;
if(!((gz_id != -1) && 0 <= gz_id < MAX_GANG_ZONES))
return 0;
GangZoneDestroy(gz_id);
if((playerGangZone[playerid] = CreateGangZoneInPlayer(playerid, playerGangZoneRadio[playerid])) != -1)
{
UpdatePlayerGangZoneToPlayer(all_active != false ? -666 : playerid, playerGangZone[playerid]);
}
return 1;
}
stock UpdatePlayerGangZoneToPlayer(playerid, gz_id)
{
if(!((gz_id != -1) && 0 <= gz_id < MAX_GANG_ZONES))
return 0;
if(playerid == -666)
{
GangZoneShowForAll(gz_id, 0x000000FF);
}
else
{
if(!IsPlayerConnected(playerid))
return 0;
GangZoneShowForPlayer(playerid, gz_id, 0x000000FF);
}
return 1;
}
Tenemos las siguientes funciones:
* CreateGangZoneInPlayer(playerid, Float:gzRatio = 50.0)
* RefreshGangZoneForPlayer(playerid, all_active = false)
* UpdatePlayerGangZoneToPlayer(playerid, gz_id)
La primera funcion crea una gangzone alrededor del jugador (codigo de Lucesita), con el parametro opcional de el rango de la GangZone, dentro de la funcion hace:
* Obtener la posicion del jugador,
* Crear la GangZone definiendo sus posiciones con el max y min de "x" Y "y"
Si me preguntas el por que retorna -1, o alguien lo hace, se puede realizar a base de algo tan simple como esto:
PHP код:
new id;
for(new i; i < MAX_GANG_ZONES+5; i++)
{
id = GangZoneCreate(0, 0, 0, 0);
printf("%i", id);
}
Ya que en la wiki no nos dice lastimosamente el valor que retorna en caso de no crearse (lo cual no es tan necesario ya que suele ser intuitivo)
Ahora, en el comando vemos que se asigna en "id" el valor que retorne el uso de esta funcion, si no retorna -1 en todo caso utilizara la funcion: UpdatePlayerGangZoneToPlayer(playerid, playerGangZone[playerid]);
Lo cual tiene algunas caracteristicas:
* Si playerid es -666 mostrara la gangzone a todo el servidor, todos los jugadores (aunque aca no se si al desconectarse y conectarse se siga mostrando por lo que ahi tendras que hacer algo para que los nuevos que se conectan la vean en caso de que sea a todos los jugadores)
PHP код:
public OnPlayerSpawn(playerid)
{
foreach(new i : Player)
{
if(playerGangZone[i] != -1)
{
GangZoneShowForPlayer(playerid, playerGangZone[i], 0x000000FF);
}
}
}
Sin embargo aca depende del dinamismo de tu script, yo solamente hice que almacene las variables del ID del GangZone y el radio de este, puedes hacer que almacene si se lo muestre a todos los jugadores, junto al color, etc.. Eso depende del dinamismo que piensen andar.
* En caso de playerid != -666 se lo mostrara al mismo jugador, el comando lo tiene asi.
Y tenemos la ultima funcion, RefreshGangZoneForPlayer la cual no se aplica en el script sin embargo se ha dejado por si es a lo que tu te refieres como "dinamico"
* Obtiene el ID del gangzone que sea de propiedad del jugador
* Comprueba que exista y sea valida
* La destruye
* Crea una nueva GangZone y se la setea a la variable de la GangZone que se destruye (No es necesario resetear la variable, si no existe forma de crear GangZone automaticamente la seteara a -1, en caso contrario la sobrescribira)
* En caso de que la GangZone se haya creado satisfactoriamente, la muestra dependiendo del parametro opcional que permite o mostrarsela solo al propietario del GangZone o a todo el server.
Asi basicamente es el "mapeo" mental que se llevan las GangZones.