Quote:
PHP Code:
public OnIncomingPacket(playerid, packetid, BitStream:bs)
{
if(packetid == ID_BULLET_SYNC)
{
new FakeMinigun[PR_BulletSync];
BS_IgnoreBits(bs, 8);
FakeMinigun[PR_weaponId] = 38;
if(GetPlayerWeapon(playerid) != 38)
{
if(packetid == BS_ReadValue(bs, FakeMinigun[PR_weaponId]))
{
for(new i; i < MAX_PLAYERS; i++)
{
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(playerid, packetid, BitStream:bs)
{
if(packetid == ID_BULLET_SYNC)
{
new FakeWeapon[PR_BulletSync]; // "Estrutura" do pacote de bala.
BS_IgnoreBits(bs, 8); // Ignoramos 8 bits antes de ler, pois nгo queremos ler o identificador do pacote.
BS_ReadBulletSync(bs, FakeWeapon); // 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
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