[Problema] Con chat global
#1

Buenas,

He hecho un sistema para que los mensajes que escribes, sуlo se envie a los jugadores que estбn cerca.
El problema estб en que sуlo va bien con un jugador...

Me explico:

Si se conectan dos jugadores, por ejemplo: Pepe y Josй; si Pepe(id: 0) se conecta primero y Josй(id: 1) se conecta despuйs, entonces Pepe cuando escriba algo por el chat y Josй estй lejos de йl, NO recibirб el mensaje; pero si Josй escribe el mensaje y Pepe estб lejos, йste SН lo recibe y no deberнa... (es decir que la funciуn que hice sуlo funciona con Pepe).

їA quй se debe?

Aquн os dejo las lнneas:

pawn Код:
public OnPlayerText(playerid, text[])
{
    new string[128], Text[365],Float:Pos[3];
    for(new i; i<MAX_PLAYERS; i++)
    {
        if(IsPlayerInRangeOfPoint(i,8.0,Pos[0],Pos[1],Pos[2]))
        {
        format(string,sizeof(string),"%s",Text);
        SendClientMessage(playerid,white,string);
        }
        else if(IsPlayerInRangeOfPoint(i,10.0,Pos[0],Pos[1],Pos[2]))
        {
        format(string,sizeof(string),"%s",Text);
        SendClientMessage(playerid,0xCCD0CAFF,string);
        }
    }
    return 1;
}
El cуdigo teoricamente estб bien, ademбs que funciona con un jugador...
Reply
#2

La verdad no me he fijado mucho en el cуdigo, sin embargo, hay una funciуn simple para eso que sirve muy bien.

Agregamos los stocks:

pawn Код:
stock SendLocalMessage(playerid, color, radius, string[])
{
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i))
{
if(Distance(playerid, i) <= radius)
{
SendClientMessage(i, color, string);
continue;
}
else continue;
}
}
}
pawn Код:
stock Distance(playerid, playerid2)
{
new Float: X1, Float: Y1, Float: Z1, Float: X2, Float: Y2, Float: Z2, Float: Dist;
GetPlayerPos(playerid, X1, Y1, Z1);
GetPlayerPos(playerid2, X2, Y2, Z2);
Dist = floatsqroot(floatpower(floatabs(floatsub(X2, X1)), 2) + floatpower(floatabs(floatsub(Y2, Y1)), 2) + floatpower(floatabs(floatsub(Z2, Z1)), 2));
return floatround(Dist);
}
Y luego en OnPlayerText:

pawn Код:
new String[120], Nick[MAX_PLAYER_NAME];
format(String, sizeof(String), "%s dice: {FFFFFF}%s", Nick, text[1]);
SendLocalMessage(playerid, -1, 50, String); // En el nъmero 50 es lo mбximo que se puede alejar para recibir el mensaje. Por ejemplo alguien que este a mбs de 50 metros no leerб el mensaje.
Esto si quieres que solo en situaciones especificas se envнe solo a jugadores cercanos, si quieres que siempre ocurra, hay una funciуn mбs simple aъn.

Suerte amigo
Reply
#3

Usa esto mejor:


pawn Код:
public OnPlayerText(playerid, text[]) //jeda
{
        new string[128];
        format(string,sizeof(string),"%s",Text);
        ProxDetector(50.0, playerid, string, -1,-1,-1,-1,-1);// 5 colores que sandrбn segun la distancia del player que manda el text y conforme pongas los colores
    return 1;
}
El codigo no es mio pero si funciona.
pawn Код:
forward ProxDetector(Float:radi, playerid, string[],col1,col2,col3,col4,col5);
public ProxDetector(Float:radi, playerid, string[],col1,col2,col3,col4,col5)
{
    if(IsPlayerConnected(playerid))
    {
        new Float:posx, Float:posy, Float:posz;
        new Float:oldposx, Float:oldposy, Float:oldposz;
        new Float:tempposx, Float:tempposy, Float:tempposz;
        GetPlayerPos(playerid, oldposx, oldposy, oldposz);
        //radi = 2.0; //Trigger Radius
        for(new i = 0; i < MAX_PLAYERS; i++)
        {
            if(IsPlayerConnected(i) && (GetPlayerVirtualWorld(playerid) == GetPlayerVirtualWorld(i)))
            {
                if(!BigEar[i])
                {
                    GetPlayerPos(i, posx, posy, posz);
                    tempposx = (oldposx -posx);
                    tempposy = (oldposy -posy);
                    tempposz = (oldposz -posz);
                    //printf("DEBUG: X:%f Y:%f Z:%f",posx,posy,posz);
                    if (((tempposx < radi/16) && (tempposx > -radi/16)) && ((tempposy < radi/16) && (tempposy > -radi/16)) && ((tempposz < radi/16) && (tempposz > -radi/16)))
                    {
                        SendClientMessage(i, col1, string);
                    }
                    else if (((tempposx < radi/8) && (tempposx > -radi/8)) && ((tempposy < radi/8) && (tempposy > -radi/8)) && ((tempposz < radi/8) && (tempposz > -radi/8)))
                    {
                        SendClientMessage(i, col2, string);
                    }
                    else if (((tempposx < radi/4) && (tempposx > -radi/4)) && ((tempposy < radi/4) && (tempposy > -radi/4)) && ((tempposz < radi/4) && (tempposz > -radi/4)))
                    {
                        SendClientMessage(i, col3, string);
                    }
                    else if (((tempposx < radi/2) && (tempposx > -radi/2)) && ((tempposy < radi/2) && (tempposy > -radi/2)) && ((tempposz < radi/2) && (tempposz > -radi/2)))
                    {
                        SendClientMessage(i, col4, string);
                    }
                    else if (((tempposx < radi) && (tempposx > -radi)) && ((tempposy < radi) && (tempposy > -radi)) && ((tempposz < radi) && (tempposz > -radi)))
                    {
                        SendClientMessage(i, col5, string);
                    }
                }
                else
                {
                    SendClientMessage(i, col1, string);
                }
            }
        }
    }//not connected
    return 1;
}
Reply
#4

O mejor aъn, https://sampwiki.blast.hk/wiki/LimitGlobalChatRadius
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)