[Ajuda] RPC - Pawn.RakNet
#1

Pessoal, tф iniciando hб pouco tempo no Pawn.RakNet e criei esse anti-cheat sу pra testes, ele й um anti-fake minigun, jб vi hackers por aн matando players de minigun mesmo o servidor tendo GetPlayerWeapon

PHP Code:
public OnIncomingPacket(playeridpacketidBitStream:bs)
{
    if(
packetid == ID_BULLET_SYNC)
    {
        new 
FakeMinigun[PR_BulletSync];
        
BS_IgnoreBits(bs8);
        
FakeMinigun[PR_weaponId] = 38;
        if(
GetPlayerWeapon(playerid) != 38)
        {
            if(
packetid == BS_ReadValue(bsFakeMinigun[PR_weaponId]))
            {
                for(new 
iMAX_PLAYERSi++)
                {
                    
SendClientMessage(i, -1"Xiter");
                }
            }
        }    
    }
    return 
1;

O cуdigo tб certo assim? Aliбs, qual a diferenзa de RPC pra um Packet? o que й offset?
Reply
#2

Usa assim:

Code:
IPacket:206(playerid, BitStream:bs)
{
	new bulletData[PR_BulletSync];
	BS_IgnoreBits(bs, 8);
	BS_ReadBulletSync(bs, bulletData);
	if(!IsPlayerAdmin(playerid) &&
		bulletData[PR_weaponId] == WEAPON_MINIGUN &&
		GetPlayerWeapon(playerid) != WEAPON_MINIGUN)
	{
		// Minigun Hack
		return 0;
	}
	return 1;
}
Eu uso e funciona.
Reply
#3

Quote:
Originally Posted by KoloradO
View Post
Usa assim:

Code:
IPacket:206(playerid, BitStream:bs)
{
	new bulletData[PR_BulletSync];
	BS_IgnoreBits(bs, 8);
	BS_ReadBulletSync(bs, bulletData);
	if(!IsPlayerAdmin(playerid) &&
		bulletData[PR_weaponId] == WEAPON_MINIGUN &&
		GetPlayerWeapon(playerid) != WEAPON_MINIGUN)
	{
		// Minigun Hack
		return 0;
	}
	return 1;
}
Eu uso e funciona.
O que й esse IPacket:206?
Reply
#4

IPacket:206 deve ser o valor de ID_BULLET_SYNC.

@edit

Fui verificar e eu estou correto.

Quote:

ID_BULLET_SYNC (206) = Responsбvel pelas mensagens (dados) de tiros de armas. Ex: tipo de disparo, origem do disparo, destino do disparo, alvo, centro do disparo, arma usada para o disparo, etc, sгo as mensagens do pacote.

Fonte: https://sampforum.blast.hk/showthread.php?tid=644763
Reply
#5

Quote:
Originally Posted by Ermanhaut
View Post
IPacket:206 deve ser o valor de ID_BULLET_SYNC.

@edit

Fui verificar e eu estou correto.



Fonte: https://sampforum.blast.hk/showthread.php?tid=644763
No caso falo da funзгo especifica "IPacket"
Reply
#6

Nгo й uma funзгo, mas sim uma tag.

A tag declara que esta funзгo estб se referindo ao tipo de dado IPacket.

Й como se ele criasse uma Textdraw. Vocк deve declarar que o tipo de dado usado na variбvel й TextDraw: ou haverб erro, pois diferentes tipos de variбveis sгo controladas de formas diferentes.
Reply
#7

Quote:
Originally Posted by Ermanhaut
View Post
Nгo й uma funзгo, mas sim uma tag.

A tag declara que esta funзгo estб se referindo ao tipo de dado IPacket.

Й como se ele criasse uma Textdraw. Vocк deve declarar que o tipo de dado usado na variбvel й TextDraw: ou haverб erro, pois diferentes tipos de variбveis sгo controladas de formas diferentes.
Entendi, obrigado.
Reply
#8

Quote:
PHP Code:
public OnIncomingPacket(playeridpacketidBitStream:bs)
{
    if(
packetid == ID_BULLET_SYNC)
    {
        new 
FakeMinigun[PR_BulletSync];
        
BS_IgnoreBits(bs8);
        
FakeMinigun[PR_weaponId] = 38;
        if(
GetPlayerWeapon(playerid) != 38)
        {
            if(
packetid == BS_ReadValue(bsFakeMinigun[PR_weaponId]))
            {
                for(new 
iMAX_PLAYERSi++)
                {
                    
SendClientMessage(i, -1"Xiter");
                }
            }
        }    
    }
    return 
1;

O cуdigo tб certo assim? Aliбs, qual a diferenзa de RPC pra um Packet? o que й offset?

Nгo, estб totalmente errado:

- Vocк nunca leu os dados do pacote, entгo nгo faz sentido ignorar 8 bits (Que sгo do identificador do pacote).
- Vocк criou a matriz FakeMinigun (que contйm a estrutura do pacote ID_BULLET_SYNC) sem necessidade alguma, pois eu nenhum momento vocк lк os dados do pacote nela, e muito menos os reescreve no bitstream.

Code:
if(packetid == BS_ReadValue(bs, FakeMinigun[PR_weaponId]))
{
	for(new i; i < MAX_PLAYERS; i++)
	{
		SendClientMessage(i, -1, "Xiter");
	}
}
O cуdigo acima tambйm deixa mais que evidente que vocк nгo tem idйia do que estб fazendo. O valor retornado por BS_ReadValue nгo deve ser comparado com o ID do pacote e nгo tem nenhuma relaзгo. Utilize BS_ReadValue para ler os dados no bitstream:

BS_ReadValue(bitstream, tipo, variбvel_passada_por_referкncia);

Tipos:

PHP Code:
    enum PR_ValueType
    
{
        
PR_INT8,
        
PR_INT16,
        
PR_INT32,
        
PR_UINT8,
        
PR_UINT16,
        
PR_UINT32,
        
PR_FLOAT,
        
PR_BOOL,
        
PR_STRING,
        
// compressed
        
PR_CINT8,
        
PR_CINT16,
        
PR_CINT32,
        
PR_CUINT8,
        
PR_CUINT16,
        
PR_CUINT32,
        
PR_CFLOAT,
        
PR_CBOOL,
        
PR_CSTRING,
        
PR_BITS
    
}; 
De qualquer forma, refiz seu cуdigo (Literalmente):

PHP Code:
public OnIncomingPacket(playeridpacketidBitStream:bs)
{
    if(
packetid == ID_BULLET_SYNC)
    {
        new 
FakeWeapon[PR_BulletSync]; // "Estrutura" do pacote de bala.
        
BS_IgnoreBits(bs8); // Ignoramos 8 bits antes de ler, pois nгo queremos ler o identificador do pacote.
        
BS_ReadBulletSync(bsFakeWeapon); // Vamos ler os dados do pacote de bala, que serгo escritos na matriz FakeWeapon (que contйm a estrutura do pacote de bala). 
        
if(FakeWeapon[PR_weaponId] != GetPlayerWeapon(playerid)) // Verificamos se o ID de arma que veio do pacote de bala nгo й o mesmo retornado por GetPlayerWeapon.
        
{
            return 
0// Retornamos 0, entгo o pacote nгo й processado. 
        
}    
    }
    return 
1;

Recomendo vocк a ler os tutoriais antes de tentar usar o plugin:

RPC: https://sampforum.blast.hk/showthread.php?tid=642644
Pacotes: https://sampforum.blast.hk/showthread.php?tid=644763
Offsets de leitura e escrita: https://sampforum.blast.hk/showthread.php?tid=652350
Handlers: https://sampforum.blast.hk/showthread.php?tid=647148

E vocк estб indo low-level sem necessidade.

Apenas use OnPlayerWeaponShot, e compare o ID retornado por GetPlayerWeapon com o parвmetro 'weaponid' da callback OnPlayerWeaponShot. Retorne 0 se necessбrio (Para o pacote de bala nгo ser enviado aos outros clientes).

Alйm disso, o que vocк viu nгo й novidade, tem um tуpico relacionado apenas a isso, e com soluзхes: https://sampforum.blast.hk/showthread.php?tid=633993

Quote:
Originally Posted by Ermanhaut
View Post
Nгo й uma funзгo, mas sim uma tag.

A tag declara que esta funзгo estб se referindo ao tipo de dado IPacket.

Й como se ele criasse uma Textdraw. Vocк deve declarar que o tipo de dado usado na variбvel й TextDraw: ou haverб erro, pois diferentes tipos de variбveis sгo controladas de formas diferentes.
E vocк obviamente nгo tem idйia do que estб falando.

IPacket й apenas uma macro para criar handlers para incoming packets (pacotes que vem do cliente para o servidor).

https://github.com/urShadow/Pawn.Rak...RakNet.inc#L96

PHP Code:
#define IPacket:%0(%1) \
        
forward pr_rip_%0(); \
        public 
pr_rip_%0() \
            
PR_RegHandler(%0"pr_ip_"#%0, PR_INCOMING_PACKET); \
        
forward pr_ip_%0(%1); \
        public 
pr_ip_%0(%1
Handlers: https://sampforum.blast.hk/showthread.php?tid=647148
Reply
#9

Quote:
Originally Posted by BrunoBM23
View Post
Nгo, estб totalmente errado:

- Vocк nunca leu os dados do pacote, entгo nгo faz sentido ignorar 8 bits (Que sгo do identificador do pacote).
- Vocк criou a matriz FakeMinigun (que contйm a estrutura do pacote ID_BULLET_SYNC) sem necessidade alguma, pois eu nenhum momento vocк lк os dados do pacote nela, e muito menos os reescreve no bitstream.

Code:
if(packetid == BS_ReadValue(bs, FakeMinigun[PR_weaponId]))
{
	for(new i; i < MAX_PLAYERS; i++)
	{
		SendClientMessage(i, -1, "Xiter");
	}
}
O cуdigo acima tambйm deixa mais que evidente que vocк nгo tem idйia do que estб fazendo. O valor retornado por BS_ReadValue nгo deve ser comparado com o ID do pacote e nгo tem nenhuma relaзгo. Utilize BS_ReadValue para ler os dados no bitstream:

BS_ReadValue(bitstream, tipo, variбvel_passada_por_referкncia);

Tipos:

PHP Code:
    enum PR_ValueType
    
{
        
PR_INT8,
        
PR_INT16,
        
PR_INT32,
        
PR_UINT8,
        
PR_UINT16,
        
PR_UINT32,
        
PR_FLOAT,
        
PR_BOOL,
        
PR_STRING,
        
// compressed
        
PR_CINT8,
        
PR_CINT16,
        
PR_CINT32,
        
PR_CUINT8,
        
PR_CUINT16,
        
PR_CUINT32,
        
PR_CFLOAT,
        
PR_CBOOL,
        
PR_CSTRING,
        
PR_BITS
    
}; 
De qualquer forma, refiz seu cуdigo (Literalmente):

PHP Code:
public OnIncomingPacket(playeridpacketidBitStream:bs)
{
    if(
packetid == ID_BULLET_SYNC)
    {
        new 
FakeWeapon[PR_BulletSync]; // "Estrutura" do pacote de bala.
        
BS_IgnoreBits(bs8); // Ignoramos 8 bits antes de ler, pois nгo queremos ler o identificador do pacote.
        
BS_ReadBulletSync(bsFakeWeapon); // Vamos ler os dados do pacote de bala, que serгo escritos na matriz FakeWeapon (que contйm a estrutura do pacote de bala). 
        
if(FakeWeapon[PR_weaponId] != GetPlayerWeapon(playerid)) // Verificamos se o ID de arma que veio do pacote de bala nгo й o mesmo retornado por GetPlayerWeapon.
        
{
            return 
0// Retornamos 0, entгo o pacote nгo й processado. 
        
}    
    }
    return 
1;

Recomendo vocк a ler os tutoriais antes de tentar usar o plugin:

RPC: https://sampforum.blast.hk/showthread.php?tid=642644
Pacotes: https://sampforum.blast.hk/showthread.php?tid=644763
Offsets de leitura e escrita: https://sampforum.blast.hk/showthread.php?tid=652350
Handlers: https://sampforum.blast.hk/showthread.php?tid=647148

E vocк estб indo low-level sem necessidade.

Apenas use OnPlayerWeaponShot, e compare o ID retornado por GetPlayerWeapon com o parвmetro 'weaponid' da callback OnPlayerWeaponShot. Retorne 0 se necessбrio (Para o pacote de bala nгo ser enviado aos outros clientes).

Alйm disso, o que vocк viu nгo й novidade, tem um tуpico relacionado apenas a isso, e com soluзхes: https://sampforum.blast.hk/showthread.php?tid=633993


E vocк obviamente nгo tem idйia do que estб falando.

IPacket й apenas uma macro para criar handlers para incoming packets (pacotes que vem do cliente para o servidor).

https://github.com/urShadow/Pawn.Rak...RakNet.inc#L96

PHP Code:
#define IPacket:%0(%1) \
        
forward pr_rip_%0(); \
        public 
pr_rip_%0() \
            
PR_RegHandler(%0"pr_ip_"#%0, PR_INCOMING_PACKET); \
        
forward pr_ip_%0(%1); \
        public 
pr_ip_%0(%1
Handlers: https://sampforum.blast.hk/showthread.php?tid=647148
Valeu cara, isso esclarece bastante coisa, vou ler isso aн
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)