16/04/2023 21:31
(16/04/2023 21:24)Carlos Victor Escreveu: Se você quer pegar os dados de jogadores próximo, deverá criar um loop em todos os jogadores e verificar se estão próximos ou não, e também não é recomendado utilizar a callback OnPlayerStateChange da forma que foi apresentada acima, lembre-se que ela é chamada toda vez que um jogador clique em um botão válido, então imagina quantas vezes ela será chamada em uma servidor com 10/20 jogadores, bastante, enfim... Deixarei um código abaixo, não sei se é isso que você quis dizer, mas é o que eu entendi.
Código PHP:CMD:proximo(playerid)
{
static
_name[MAX_PLAYER_NAME],
count,
str[32],
string[1024];
count = 0;
string[0] = 0;
str[0] = 0;
format(string, sizeof(string), "ID\tNome\tDinheiro\n");
for(new i = 0, j = GetPlayerPoolSize(); i <= j; i++)
{
if(IsPlayerConnected(i) && IsPlayerNearPlayer(i, playerid, 20.0))
{
GetPlayerName(playerid, _name, sizeof(_name));
format(string, sizeof(string), "%s{FFFFFF}%d\t%s\t%d\n", string, i, _name, GetPlayerMoney(i));
count++;
}
}
if(!count)
return SendClientMessage(playerid, -1, "* Você não está próximo de nenhum jogador.");
format(str, sizeof(str), "Jogadores Proximos (%d)", count);
ShowPlayerDialog(playerid, DIALOG_PLAYERS_NEAR, DIALOG_STYLE_TABLIST, str, string, "Selecionar", "Fechar");
return 1;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch(dialogid)
{
case DIALOG_PLAYERS_NEAR:
{
if(response)
{
new
Float:x,
Float:y,
Float:z,
string[128],
_name[MAX_PLAYER_NAME],
id = strval(inputtext);
if(!IsPlayerConnected(id))
return SendClientMessage(playerid, -1, "* O jogador selecionado desconectou-se do servidor.");
GetPlayerName(id, _name, sizeof(_name));
GetPlayerPos(id, x, y, z);
SetPlayerPos(playerid, x, y, z + 1.0);
format(string, sizeof(string), "* Você foi até o jogador %s.", _name);
SendClientMessage(playerid, -1, string);
}
}
}
return 1;
}
No código acima utilizei variáveis estáticas no comando para evitar o grande consumo de memória, já que iremos trabalhar com string's grandes, e também o teleporte que eu fiz caso selecionar um X jogador na dialog é um exeplo do que você pode fazer, seja criativo e faça o que quiser usando o paramêtro ID como o jogador selecionado.
Oi Carlos, boa noite! Primeiramente agradeço a atenção!
A dúvida que postei, foi sobre um "método de transferência", um jogador transferir dinheiro para o jogador mais próximo a ele.
No código publicado, o jogador pressiona a tecla na callback OnPlayerKeyStateChange, e seleciona a opção "Dinheiro" na dialog. Após isso, a ideia é perguntar quanto ele quer transferir para o usuário mais próximo a ele.
Meu problema é que não estou conseguindo definir uma variável para localizar esse jogador mais próximo para efetuar a ação. Se fosse em comando, eu poderia definir uma variável através do sscanf. Porém, estou fazendo em dialog.