SA-MP Forums Archive
Como Hacer Para que suceda - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Español/Spanish (https://sampforum.blast.hk/forumdisplay.php?fid=29)
+---- Thread: Como Hacer Para que suceda (/showthread.php?tid=385258)



Como Hacer Para que suceda - Parka - 15.10.2012

Hola Amigos Bueno Disculpen en verdad no me gusta preguntar cosas como esta pero no me queda de otro bueno aqui voy me podrian dar un ejemplo y explicarlo de como hacer para que un jugador no pueda hacer un cmd si no esta el segundo player osea

X usuario necesitas otra persona para conquistar X zona

como chequeo eso con que se come ??

PD: si se puede con 4 jugadores mejor de ante mano gracias

EDIT: Por favor los que no entendieron no comenten gracias.


Respuesta: Como Hacer Para que suceda - -[R]hysi- - 15.10.2012

Si mal no entendi es algo asi lo que buscas.

pawn Код:
stock PlayerToPlayer(playerid,targetid,Float:distance)
{
    new Float:x, Float:y, Float:z;
    GetPlayerPos(playerid,x,y,z);
    if(IsPlayerInRangeOfPoint(targetid,distance,x,y,z))
    {
        return true;
    }
    return false;
}
//el comando

CMD:tucomando(playerid, params[])
{
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(PlayerToPlayer(playerid,i,7))
{
//funcion
return 1;
}
}
return 1;
}



Respuesta: Como Hacer Para que suceda - TheChaoz - 15.10.2012

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.