PDA

Просмотр полной версии : [Plugin] [RNM] RakNet Manager 1.0.0



Zaur_Lumanov
01.02.2016, 13:26
Новая тема с более свежей информацией о плагине:
*клац* (http://pro-pawn.ru/showthread.php?15583-Pawn-RakNet-%D0%BD%D0%B0%D0%BF%D0%B8%D1%88%D0%B8-%D0%BB%D1%83%D1%87%D1%88%D0%B8%D0%B9-%D0%B0%D0%BD%D1%82%D0%B8%D1%87%D0%B8%D1%82%21&p=87201&viewfull=1#post87201)


Описание:

Плагин для SA:MP-сервера, который позволяет работать с RakNet-пакетами в PAWN. Перехват входящих/исходящих, отправка кастомных Packet/RPC.

Скачать:

https://github.com/urShadow/raknetmanager/releases

Оригинальная тема: http://forum.sa-mp.com/showthread.php?t=599936

Примеры:


#include <raknetmanager>

1. Отправка RPC


stock SendChatMessage(senderid, msg[])
{
new BitStream:bs = BS_New(), RPC_Chat = 101;

BS_WriteValue(bs, RNM_INT16, senderid,
RNM_INT8, strlen(msg),
RNM_STRING, msg);

RNM_SendRPC(senderid, RPC_Chat, bs);

BS_Delete(bs);
}

2. Отправка пакета


stock FakeLostConnectionForPlayer(playerid)
{
new BitStream:bs = BS_New(), ID_CONNECTION_LOST = 33;

BS_WriteValue(bs, RNM_INT8, ID_CONNECTION_LOST);

RNM_SendPacket(playerid, bs);

BS_Delete(bs);
}

3. Перехват пакета со входящей синхронизации игрока пешком


new ID_PLAYER_SYNC = 207;
public OnPlayerReceivedPacket(playerid, packetid, BitStream:bs)
{
if(packetid == ID_PLAYER_SYNC)
{
new lrkeys, udkeys, sampkeys,
Float:pos[3], Float:quaternion[4],
health, armor, weaponid, specialaction,
Float:speed[3], Float:surfingoffsets[3],
surfingvehid, animationid, animflags;

BS_IgnoreBits(bs, 8); // packet id 1 byte
BS_ReadValue(bs, RNM_UINT16, lrkeys,
RNM_UINT16, udkeys,
RNM_UINT16, sampkeys,
RNM_FLOAT, pos[0],
RNM_FLOAT, pos[1],
RNM_FLOAT, pos[2],
RNM_FLOAT, quaternion[0],
RNM_FLOAT, quaternion[1],
RNM_FLOAT, quaternion[2],
RNM_FLOAT, quaternion[3],
RNM_UINT8, health,
RNM_UINT8, armor,
RNM_UINT8, weaponid,
RNM_UINT8, specialaction,
RNM_FLOAT, speed[0],
RNM_FLOAT, speed[1],
RNM_FLOAT, speed[2],
RNM_FLOAT, surfingoffsets[0],
RNM_FLOAT, surfingoffsets[1],
RNM_FLOAT, surfingoffsets[2],
RNM_UINT16, surfingvehid,
RNM_INT16, animationid,
RNM_INT16, animflags);

printf("lrkeys %d udkeys %d sampkeys %d\n" \
"pos %.2f %.2f %.2f\n" \
"quaternion %.2f %.2f %.2f %.2f\n" \
"health %d\n" \
"armor %d\n" \
"weaponid %d\n" \
"specialaction %d\n" \
"speed %.2f %.2f %.2f\n" \
"surfingoffsets %.2f %.2f %.2f\n" \
"surfingvehid %d\n" \
"anim %d flags %d",
lrkeys, udkeys, sampkeys,
pos[0], pos[1], pos[2],
quaternion[0], quaternion[1], quaternion[2], quaternion[3],
health, armor, weaponid, specialaction,
speed[0], speed[1], speed[2],
surfingoffsets[0], surfingoffsets[1], surfingoffsets[2],
surfingvehid, animationid, animflags
);
}
return 1;
}

4. Перехват входящего RPC с чат-сообщением


new RPC_Chat = 101;
public OnPlayerReceivedRPC(playerid, rpcid, BitStream:bs)
{
if(rpcid == RPC_Chat)
{
new message[256], len;

BS_ReadValue(bs, RNM_UINT8, len,
RNM_STRING, message, len);

printf("chat message from player %d: %s", playerid, message);
}

return 1;
}

Native list:


native RNM_SendRPC(playerid, rpcid, BitStream:bs);
native RNM_SendPacket(playerid, BitStream:bs);

native BitStream:BS_New();
native BS_Delete(&BitStream:bs);

native BS_Reset(BitStream:bs);
native BS_ResetReadPointer(BitStream:bs);
native BS_ResetWritePointer(BitStream:bs);
native BS_IgnoreBits(BitStream:bs, bitcount);

native BS_SetWriteOffset(BitStream:bs, offset);
native BS_GetWriteOffset(BitStream:bs, &offset);
native BS_SetReadOffset(BitStream:bs, offset);
native BS_GetReadOffset(BitStream:bs, &offset);

native BS_GetNumberOfBitsUsed(BitStream:bs, &number);
native BS_GetNumberOfBytesUsed(BitStream:bs, &number);
native BS_GetNumberOfUnreadBits(BitStream:bs, &number);

native BS_WriteValue(BitStream:bs, {Float,_}:...);
native BS_ReadValue(BitStream:bs, {Float,_}:...);

Callback list:


// return 0 => blocking action
forward OnPlayerReceivedPacket(playerid, packetid, BitStream:bs);
forward OnPlayerReceivedRPC(playerid, rpcid, BitStream:bs);
forward OnServerSendPacket(playerid, packetid, BitStream:bs);
forward OnServerSendRPC(playerid, rpcid, BitStream:bs);

Автор: urShadow (https://vk.com/urshadow_official).

Иван Бубнов
01.02.2016, 14:39
А где его можно применять?

Desulaid
01.02.2016, 14:47
Как и говорил KyleSmith, Kalcor не одобряет плагинов на "memory hacking" > тема удалена :hang1:


I hardly doubt this will stay on the forum for long.

I'm sure Kalcor will want it removed.

L0ndl3m
01.02.2016, 15:49
Кто подскажет, в каких случаях может быть полезен этот плагин?

Daniel_Cortez
01.02.2016, 20:05
Кто подскажет, в каких случаях может быть полезен этот плагин?
При написании античитов, например, когда нужно узнать что-то, чего не предоставляют коллбэки SA:MP. Либо если нужно сделать что-то ещё, чего нельзя сделать другими стандартными способами - недавняя дискуссия на тему синхронизации машины после взрыва бензобака тому пример (впрочем, решением назвать использование такого плагина нельзя, скорее грязным хаком, да ещё и несовместимым с будущими версиями SA:MP).

Zaur_Lumanov
01.02.2016, 20:09
При написании античитов, например, когда нужно узнать что-то, чего не предоставляют коллбэки SA:MP. Либо если нужно сделать что-то ещё, чего нельзя сделать другими стандартными способами - недавняя дискуссия на тему синхронизации машины после взрыва бензобака тому пример (впрочем, решением назвать использование такого плагина нельзя, скорее грязным хаком, да ещё и несовместимым с будущими версиями SA:MP).

В следующем обновлении будет автопоиск адресов, так что будет подходить под все версии.

Daniel_Cortez
01.02.2016, 20:16
С каждой новой версии сампа плагин будет обновляться.
Все так говорят, но где гарантия, что автор плагина не уйдёт в неактив при выпуске этой "новой версии"?
Реалии таковы, что на плагин можно положиться либо при хакинге с автопоиском нужных адресов, либо при полном отсутствии хакинга. Иначе им будут пользоваться лишь 3,5 анонимуса и, скорее всего, только на платной основе - если разработчик плагина пропадёт, вряд ли кто-то другой просто так согласится обновлять его для работы с новой версией сервера.

Zaur_Lumanov
01.02.2016, 21:48
Все так говорят, но где гарантия, что автор плагина не уйдёт в неактив при выпуске этой "новой версии"?
Реалии таковы, что на плагин можно положиться либо при хакинге с автопоиском нужных адресов, либо при полном отсутствии хакинга. Иначе им будут пользоваться лишь 3,5 анонимуса и, скорее всего, только на платной основе - если разработчик плагина пропадёт, вряд ли кто-то другой просто так согласится обновлять его для работы с новой версией сервера.

Остается надеяться, и ждать.

Reim
02.02.2016, 00:51
Ну исходники то есть, любой сможет доделать. Кстати где можно узнать все packetid и rpcid и тд, тип такого?


new ID_PLAYER_SYNC = 207;
new RPC_Chat = 101;

Daniel_Cortez
02.02.2016, 00:58
Ну исходники то есть, любой сможет доделать.
В теории - да, на практике же всем управляют деньги. А если кто-то и обновит плагин за просто так, то вряд ли сразу. Взять тот же FCNPC - автор плагина куда-то пропал, и его обновили для работы с 0.3.7 R2 (http://forum.sa-mp.com/showpost.php?p=3637486&postcount=2472) только через полгода после обновления сервера. Потому-то работа с такими плагинами и считается плохой практикой.


Кстати где можно узнать все packetid и rpcid и тд, тип такого?
Use reverse-engineering, Luke.

Zaur_Lumanov
02.02.2016, 10:50
Ну исходники то есть, любой сможет доделать. Кстати где можно узнать все packetid и rpcid и тд, тип такого?


new ID_PLAYER_SYNC = 207;
new RPC_Chat = 101;

Иды RPC: https://github.com/P3ti/RakSAMP/blob/master/raknet/SAMP/SAMPRPC.cpp
Перечисление пакетов: https://github.com/P3ti/RakSAMP/blob/master/raknet/PacketEnumerations.h

urShadow
28.05.2016, 22:15
Обновлено.

Изменения:
- Добавлена поддержка любой версии SA:MP. (начиная с 0.3z-R1)
- Переименованы нативные функции отправки данных.
- Добавлен выбор приоритета и надежности пакета.
- Оптимизирован код.

Daniel_Cortez
29.05.2016, 15:27
Обновлено.

Изменения:
- Добавлена поддержка любой версии SA:MP. (начиная с 0.3z-R1)
- Переименованы нативные функции отправки данных.
- Добавлен выбор приоритета и надежности пакета.
- Оптимизирован код.
Советую создать свою тему, чтобы иметь контроль над её обновлением (как в том случае с FakeOnline). Заодно и модераторам будет меньше работы.

Kamigakuro
25.12.2016, 13:54
А как вообще узнать какие данные присылает/отправляет пакет?

DeimoS
25.12.2016, 14:01
Как минимум, ознакомлением с этими ссылками


Иды RPC: https://github.com/P3ti/RakSAMP/blob/master/raknet/SAMP/SAMPRPC.cpp
Перечисление пакетов: https://github.com/P3ti/RakSAMP/blob/master/raknet/PacketEnumerations.h

Если этого мало, то поможет простое логирование этих значений из игры, а после анализ твоих действий и того, какие пакеты получает плагин

ziggi
25.12.2016, 14:11
Как минимум, ознакомлением с этими ссылками



Если этого мало, то поможет простое логирование этих значений из игры, а после анализ твоих действий и того, какие пакеты получает плагин

Ещё исходники сервера могут очень сильно помочь: https://github.com/Sasuke78200/open-samp

Kamigakuro
25.12.2016, 14:56
Как минимум, ознакомлением с этими ссылками

Эти ссылки я видел, мне интересно какие именно данные оперируются в конкретном пакете, к примеру возьмем RPC_ScrSetPlayerSpectating


if(rpc_id == RPC_ScrSetPlayerSpectating )
{
new ....; // что именно?

BS_ReadValue(bs, .....); // что тут?

}

Daniel_Cortez
25.12.2016, 15:12
Эти ссылки я видел, мне интересно какие именно данные оперируются в конкретном пакете, к примеру возьмем RPC_ScrSetPlayerSpectating


if(rpc_id == RPC_ScrSetPlayerSpectating )
{
new ....; // что именно?

BS_ReadValue(bs, .....); // что тут?

}

ziggi уже указал вам ссылку на исходники сервера, смотрите в них.
https://github.com/Sasuke78200/open-samp/blob/6a1aef3052d6a8c3ec5ae56d10e002f1a2772ec2/Open%20SAMP/script/amx/func_amx_players.cpp#L1704


bStream.Write( ( uint32_t ) a_Params[ 2 ] );
__NetGame->PlayerRPC( RPC_TogglePlayerSpectating, &bStream, playerID, 2 );

Здесь передаётся ID игрока и статус режима наблюдения (0/1).