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;
}
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; }
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; } |
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. |
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 |
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. |
PHP Code:
|
if(packetid == BS_ReadValue(bs, FakeMinigun[PR_weaponId])) { for(new i; i < MAX_PLAYERS; i++) { SendClientMessage(i, -1, "Xiter"); } }
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
};
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;
}
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. |
#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)
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"); } } BS_ReadValue(bitstream, tipo, variбvel_passada_por_referкncia); Tipos: PHP Code:
PHP Code:
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:
|