[Pedido] Detectar jogadores de RT e kicka-los
#1

Como detectar jogadores com RT?

Pra quem nгo sabe RT й quando o jogador meio que laga e nгo recebe informaзхes do servidor.

Exemplo: se usar SetPlayerPos em um jogador de RT nada acontecerб.
Reply
#2

NetStats_PacketLossPercent
Reply
#3

Quote:
Originally Posted by Jorginhoda12
View Post
NetStats_PacketLossPercent
Nem todos os jogadores com packetloss estгo desincronizados/com RT.
Reply
#4

Quote:
Originally Posted by KoloradO
View Post
Como detectar jogadores com RT?

Pra quem nгo sabe RT й quando o jogador meio que laga e nгo recebe informaзхes do servidor.

Exemplo: se usar SetPlayerPos em um jogador de RT nada acontecerб.
Й possнvel usar a callback OnPlayerUpdate, se esta parar de receber dados, provavelmente o jogador esteja desincronizado/esc (nгo tenho muita certeza, mas de esc tenho certeza).


Acho que tambйm й possнvel atravйs de plugins raknet
Reply
#5

Quote:
Originally Posted by Locky_
View Post
Й possнvel usar a callback OnPlayerUpdate, se esta parar de receber dados, provavelmente o jogador esteja desincronizado. Acho que tambйm й possнvel atravйs de plugins raknet
Jogadores desincronizados vгo continuar mandando atualizaзхes, por isso ainda й possнvel vк-los se movendo, entгo a callback vai continuar sendo chamada.
Reply
#6

A melhor coisa que eu consegui fazer atй agora foi isso.
Mas nгo tenho certeza se й seguro.

Code:
#include <a_samp>

new PacketAltoAvisos[MAX_PLAYERS];

public OnPlayerConnect(playerid)
{
    PacketAltoAvisos[playerid] = 0;
    return 1;
}

public OnPlayerUpdate(playerid)
{
	if(!IsPlayerNPC(playerid))
	{
	    new
			szString[144],
			Float:Pocket,
			Nome[24];

	    GetPlayerPacketloss(playerid,Pocket);

	    if(Pocket >= 8.0)
	    {
	        PacketAltoAvisos[playerid] ++;
	        if(PacketAltoAvisos[playerid] >= 8)
	        {
				GetPlayerName(playerid, Nome, 24);
			    format(szString, sizeof(szString), "[Aviso]: %s(id:%d) Possнvelmente estб de RT - Packet Loss: %0.1f", Nome, playerid, Pocket);
			    SendClientMessageToAll(-1, szString);
		    }
	    }
	    else PacketAltoAvisos[playerid] = 0;
    }
	return 1;
}

stock GetPlayerPacketloss(playerid,&Float:packetloss)
{
	/* Returns the packetloss percentage of the given playerid - Made by Fusez */

	if(!IsPlayerConnected(playerid)) return 0;

	new nstats[400+1], nstats_loss[20], start, end;
	GetPlayerNetworkStats(playerid, nstats, sizeof(nstats));

	start = strfind(nstats,"packetloss",true);
	end = strfind(nstats,"%",true,start);

	strmid(nstats_loss, nstats, start+12, end, sizeof(nstats_loss));
	packetloss = floatstr(nstats_loss);
	return 1;
}
Reply
#7

Quote:
Originally Posted by Jelly23
View Post
Jogadores desincronizados vгo continuar mandando atualizaзхes, por isso ainda й possнvel vк-los se movendo, entгo a callback vai continuar sendo chamada.
Em meu servidor, os jogadores costumam notar o "relуgio" travado. Muitas vezes, o jogador que tem o "relуgio travado", as vezes fica com ampulheta em cima, e consegue falar no chat e visualizar o chat. Sу que tudo para de carregar para este jogador. Agora, nunca testei como detectar isto.

Quote:
Originally Posted by KoloradO
View Post
A melhor coisa que eu consegui fazer atй agora foi isso.
Mas nгo tenho certeza se й seguro.

Code:
#include <a_samp>

new PacketAltoAvisos[MAX_PLAYERS];

public OnPlayerConnect(playerid)
{
    PacketAltoAvisos[playerid] = 0;
    return 1;
}

public OnPlayerUpdate(playerid)
{
	if(!IsPlayerNPC(playerid))
	{
	    new
			szString[144],
			Float:Pocket,
			Nome[24];

	    GetPlayerPacketloss(playerid,Pocket);

	    if(Pocket >= 8.0)
	    {
	        PacketAltoAvisos[playerid] ++;
	        if(PacketAltoAvisos[playerid] >= 8)
	        {
				GetPlayerName(playerid, Nome, 24);
			    format(szString, sizeof(szString), "[Aviso]: %s(id:%d) Possнvelmente estб de RT - Packet Loss: %0.1f", Nome, playerid, Pocket);
			    SendClientMessageToAll(-1, szString);
		    }
	    }
	    else PacketAltoAvisos[playerid] = 0;
    }
	return 1;
}

stock GetPlayerPacketloss(playerid,&Float:packetloss)
{
	/* Returns the packetloss percentage of the given playerid - Made by Fusez */

	if(!IsPlayerConnected(playerid)) return 0;

	new nstats[400+1], nstats_loss[20], start, end;
	GetPlayerNetworkStats(playerid, nstats, sizeof(nstats));

	start = strfind(nstats,"packetloss",true);
	end = strfind(nstats,"%",true,start);

	strmid(nstats_loss, nstats, start+12, end, sizeof(nstats_loss));
	packetloss = floatstr(nstats_loss);
	return 1;
}
Parece que este cуdigo й antigo, pois й possнvel pegar o packet loss com a funзгo NetStats_PacketLossPercent, ao invйs de usar GetPlayerNetworkStats e obter a informaзгo de packetloss dentro da string.
Reply
#8

Isso acontecia no server de rpg que eu jogava, o bug acontecia para qualquer pessoa mesmos problemas. Eu acho que atй hoje eles nгo conseguiram resolver.
Reply
#9

Na wiki sa-mp diz que usar GetPlayerNetworkStats pra pegar o packet loss й mais preciso do q usar netStats_PacketLossPercent
Reply
#10

Tenho dois mйtodos, porem o primeiro nгo tenho certeza se ira funcionar.
  • NВO SEI SE VAI FUNCIONAR, NECESSITA TESTE, APENAS UMA TEORIA, PODE ATRAPALHAR O JOGADOR.
    Passos:
    • 1 . Armazena a posiзгo do jogador.
    • 2 . Congele o jogador(Em minha teoria ele nгo ficaria congelado ja que, esta de rt).
    • 2 . Obtenha a posiзгo do mesmo apуs x segundos.
    • 4 . Compare as duas posiзхes, caso estejam diferentes o player esta de rt, ou utilizando algum cheat.
    SE ISTO FUNCIONAR: caso deseje kickar o jogador, certifique-se de que o mesmo esta se movendo.
  • PODE ATRAPALHAR O JOGADOR.
    Passos:
    • 1 . Mostre um dialogo ao jogador "Vocк estб com rt?", "Nгo".
    • 2 . Caso o jogador aperte o botгo, ele nгo estб de rt jб que o mesmo nгo irб ver o dialogo caso esteja.
Reply
#11

Quote:
Originally Posted by Dayvison_
View Post
Tenho dois mйtodos, porem o primeiro nгo tenho certeza se ira funcionar.
  • NВO SEI SE VAI FUNCIONAR, NECESSITA TESTE, APENAS UMA TEORIA, PODE ATRAPALHAR O JOGADOR.
    Passos:
    • 1 . Armazena a posiзгo do jogador.
    • 2 . Congele o jogador(Em minha teoria ele nгo ficaria congelado ja que, esta de rt).
    • 2 . Obtenha a posiзгo do mesmo apуs x segundos.
    • 4 . Compare as duas posiзхes, caso estejam diferentes o player esta de rt, ou utilizando algum cheat.
    SE ISTO FUNCIONAR: caso deseje kickar o jogador, certifique-se de que o mesmo esta se movendo.
  • PODE ATRAPALHAR O JOGADOR.
    Passos:
    • 1 . Mostre um dialogo ao jogador "Vocк estб com rt?", "Nгo".
    • 2 . Caso o jogador aperte o botгo, ele nгo estб de rt jб que o mesmo nгo irб ver o dialogo caso esteja.
Isso й inutil. se for pra usar isso eu uso /tapa (Setar posiзгo do player) e checar manualmente.

mas vlw pelo comentбrio, eu quero algo automбtico.

Como ngm me ajudou acho que vou usar isso aqui mesmo, mas nгo sei se vai funcionar 100 %

Code:
public OnPlayerUpdate(playerid)
{
	if(!IsPlayerNPC(playerid))
	{
	    new
			szString[144],
			Float:Pocket,
			Nome[24];

	    GetPlayerPacketloss(playerid,Pocket);

	    if(Pocket >= 10.0)
	    {
	        PacketAltoAvisos[playerid] ++;
	        if(PacketAltoAvisos[playerid] >= 30)
	        {
			GetPlayerName(playerid, Nome, 24);
			format(szString, sizeof(szString), "[Aviso]: %s(id:%d) Possнvelmente estб de RT - Packet Loss:%0.1f", Nome, playerid, Pocket);
			 SendClientMessageToAll(-1, szString);
		    }
	    }
	    else PacketAltoAvisos[playerid] = 0;
    }
	return 1;
}

stock GetPlayerPacketloss(playerid,&Float:packetloss)
{
	/* Returns the packetloss percentage of the given playerid - Made by Fusez */

	if(!IsPlayerConnected(playerid)) return 0;

	new nstats[400+1], nstats_loss[20], start, end;
	GetPlayerNetworkStats(playerid, nstats, sizeof(nstats));

	start = strfind(nstats,"packetloss",true);
	end = strfind(nstats,"%",true,start);

	strmid(nstats_loss, nstats, start+12, end, sizeof(nstats_loss));
	packetloss = floatstr(nstats_loss);
	return 1;
}
Reply
#12

Eu tinha esse sistema de anti RT, irei procurar
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)