| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458 |
- #if defined _dl_compat_included
- #endinput
- #endif
- #define _dl_compat_included
- #include <a_samp>
- #include <Pawn.RakNet>
- /*Variables*/
- static bool:dl_compat_IsClient03DL[MAX_PLAYERS char];
- /*Consts*/
- const RPC_ClientJoin = 25;
- const RPC_SetPlayerSkin = 153;
- const RPC_WorldPlayerAdd = 32;
- const RPC_RequestClass = 128;
- const RPC_SetSpawnInfo = 68;
- const RPC_ShowActor = 171;
-
- /*Callbacks*/
- public OnIncomingRPC(playerid, rpcid, BitStream:bs)
- {
- if(playerid < 0)
- #if defined dl_compat_OnIncomingRPC
- return dl_compat_OnIncomingRPC(playerid, rpcid, BitStream:bs);
- #else
- return 1;
- #endif
- if(rpcid == RPC_ClientJoin)
- {
- new iVersion,
- byteMod,
- byteNameLen,
- NickName[257],
- uiClientChallengeResponse,
- byteAuthBSLen,
- auth_bs[4*16],
- iClientVerLen,
- ClientVersion[12];
- BS_ReadValue(
- bs,
- PR_INT32, iVersion,
- PR_UINT8, byteMod,
- PR_UINT8, byteNameLen,
- PR_STRING, NickName, byteNameLen,
- PR_UINT32, uiClientChallengeResponse,
- PR_UINT8, byteAuthBSLen,
- PR_STRING, auth_bs, byteAuthBSLen,
- PR_UINT8, iClientVerLen,
- PR_STRING, ClientVersion, iClientVerLen
- );
- dl_compat_IsClient03DL{playerid} = false;
- if(iVersion == 4062)
- {
- dl_compat_IsClient03DL{playerid} = true;
-
- iVersion = 4057;
- //fix and solve challenge
- uiClientChallengeResponse = (uiClientChallengeResponse ^ 4062) ^ iVersion;
- BS_Reset(bs);
- BS_WriteValue(
- bs,
- PR_INT32, iVersion,
- PR_UINT8, byteMod,
- PR_UINT8, byteNameLen,
- PR_STRING, NickName,
- PR_UINT32, uiClientChallengeResponse,
- PR_UINT8, byteAuthBSLen,
- PR_STRING, auth_bs,
- PR_UINT8, iClientVerLen,
- PR_STRING, ClientVersion
- );
- }
- BS_ResetReadPointer(bs);
- BS_ResetWritePointer(bs);
-
- }
-
- #if defined dl_compat_OnIncomingRPC
- return dl_compat_OnIncomingRPC(playerid, rpcid, BitStream:bs);
- #else
- return 1;
- #endif
- }
- public OnOutcomingRPC(playerid, rpcid, BitStream:bs)
- {
- if(playerid < 0)
- #if defined dl_compat_OnOutcomingRPC
- return dl_compat_OnOutcomingRPC(playerid, rpcid, BitStream:bs);
- #else
- return 1;
- #endif
-
- if(dl_compat_IsClient03DL{playerid})
- {
- switch(rpcid)
- {
- case RPC_SetPlayerSkin:
- {
- new wPlayerID,
- dSkinID;
- BS_ReadValue(
- bs,
- PR_UINT32, wPlayerID,
- PR_UINT32, dSkinID
- );
- new BitStream:bsn = BS_New();
- BS_WriteValue(
- bsn,
- PR_UINT16, wPlayerID,
- PR_UINT32, dSkinID,
- PR_UINT32, 0
- );
- #if defined dl_compat_OnOutcomingRPC
- new offset;
- BS_GetWriteOffset(bsn, offset);
- BS_ResetReadPointer(bsn);
- BS_ResetWritePointer(bsn);
-
- if(dl_compat_OnOutcomingRPC(playerid, rpcid, bsn))
- {
- BS_SetWriteOffset(bsn, offset);
- BS_RPC(bsn, playerid, rpcid);
- }
- #else
- BS_RPC(bsn, playerid, rpcid);
- #endif
- BS_Delete(bsn);
- return 0;
- }
- case RPC_WorldPlayerAdd:
- {
- new wPlayerID,
- team,
- dSkinID,
- Float:PosX,
- Float:PosY,
- Float:PosZ,
- Float:facing_angle,
- player_color,
- fighting_style;
- BS_ReadValue(
- bs,
- PR_UINT16, wPlayerID,
- PR_UINT8, team,
- PR_UINT32, dSkinID,
- PR_FLOAT, PosX,
- PR_FLOAT, PosY,
- PR_FLOAT, PosZ,
- PR_FLOAT, facing_angle,
- PR_UINT32, player_color,
- PR_UINT8, fighting_style
- );
- new BitStream:bsn = BS_New();
- BS_WriteValue(
- bsn,
- PR_UINT16, wPlayerID,
- PR_UINT8, team,
- PR_UINT32, dSkinID,
- PR_UINT32, 0,
- PR_FLOAT, PosX,
- PR_FLOAT, PosY,
- PR_FLOAT, PosZ,
- PR_FLOAT, facing_angle,
- PR_UINT32, player_color,
- PR_UINT8, fighting_style
- );
- #if defined dl_compat_OnOutcomingRPC
- new offset;
- BS_GetWriteOffset(bsn, offset);
- BS_ResetReadPointer(bsn);
- BS_ResetWritePointer(bsn);
-
- if(dl_compat_OnOutcomingRPC(playerid, rpcid, bsn))
- {
- BS_SetWriteOffset(bsn, offset);
- BS_RPC(bsn, playerid, rpcid);
- }
- #else
- BS_RPC(bsn, playerid, rpcid);
- #endif
- BS_Delete(bsn);
- return 0;
- }
- case RPC_ShowActor:
- {
- new wActorID,
- SkinID,
- Float:X,
- Float:Y,
- Float:Z,
- Float:Angle,
- Float:health,
- bInvulnerable;
- BS_ReadValue(
- bs,
- PR_UINT16, wActorID,
- PR_UINT32, SkinID,
- PR_FLOAT, X,
- PR_FLOAT, Y,
- PR_FLOAT, Z,
- PR_FLOAT, Angle,
- PR_FLOAT, health,
- PR_BOOL, bInvulnerable
- );
- new BitStream:bsn = BS_New();
- BS_WriteValue(
- bsn,
- PR_UINT16, wActorID,
- PR_UINT32, SkinID,
- PR_UINT32, 0,
- PR_FLOAT, X,
- PR_FLOAT, Y,
- PR_FLOAT, Z,
- PR_FLOAT, Angle,
- PR_FLOAT, health,
- PR_BOOL, bInvulnerable
- );
- #if defined dl_compat_OnOutcomingRPC
- new offset;
- BS_GetWriteOffset(bsn, offset);
- BS_ResetReadPointer(bsn);
- BS_ResetWritePointer(bsn);
-
- if(dl_compat_OnOutcomingRPC(playerid, rpcid, bsn))
- {
- BS_SetWriteOffset(bsn, offset);
- BS_RPC(bsn, playerid, rpcid);
- }
- #else
- BS_RPC(bsn, playerid, rpcid);
- #endif
- BS_Delete(bsn);
- return 0;
- }
- case RPC_RequestClass:
- {
- new byteRequestOutcome,
- byteTeam,
- iSkin,
- unk,
- Float:vecPos[3],
- Float:fRotation,
- iSpawnWeapons[3],
- iSpawnWeaponsAmmo[3];
- BS_ReadValue(
- bs,
- PR_UINT8, byteRequestOutcome,
- PR_UINT8, byteTeam,
- PR_INT32, iSkin,
- PR_UINT8, unk,
- PR_FLOAT, vecPos[0],
- PR_FLOAT, vecPos[1],
- PR_FLOAT, vecPos[2],
- PR_FLOAT, fRotation,
- PR_INT32, iSpawnWeapons[0],
- PR_INT32, iSpawnWeapons[1],
- PR_INT32, iSpawnWeapons[2],
- PR_INT32, iSpawnWeaponsAmmo[0],
- PR_INT32, iSpawnWeaponsAmmo[1],
- PR_INT32, iSpawnWeaponsAmmo[2]
- );
- new BitStream:bsn = BS_New();
- BS_WriteValue(
- bsn,
- PR_UINT8, byteRequestOutcome,
- PR_UINT8, byteTeam,
- PR_INT32, iSkin,
- PR_INT32, 0,
- PR_UINT8, unk,
- PR_FLOAT, vecPos[0],
- PR_FLOAT, vecPos[1],
- PR_FLOAT, vecPos[2],
- PR_FLOAT, fRotation,
- PR_INT32, iSpawnWeapons[0],
- PR_INT32, iSpawnWeapons[1],
- PR_INT32, iSpawnWeapons[2],
- PR_INT32, iSpawnWeaponsAmmo[0],
- PR_INT32, iSpawnWeaponsAmmo[1],
- PR_INT32, iSpawnWeaponsAmmo[2]
- );
-
- #if defined dl_compat_OnOutcomingRPC
- new offset;
- BS_GetWriteOffset(bsn, offset);
- BS_ResetReadPointer(bsn);
- BS_ResetWritePointer(bsn);
-
- if(dl_compat_OnOutcomingRPC(playerid, rpcid, bsn))
- {
- BS_SetWriteOffset(bsn, offset);
- BS_RPC(bsn, playerid, rpcid);
- }
- #else
- BS_RPC(bsn, playerid, rpcid);
- #endif
- BS_Delete(bsn);
- return 0;
- }
- case RPC_SetSpawnInfo:
- {
- new byteTeam,
- iSkin,
- unk,
- Float:vecPos[3],
- Float:fRotation,
- iSpawnWeapons[3],
- iSpawnWeaponsAmmo[3];
- BS_ReadValue(
- bs,
- PR_UINT8, byteTeam,
- PR_INT32, iSkin,
- PR_UINT8, unk,
- PR_FLOAT, vecPos[0],
- PR_FLOAT, vecPos[1],
- PR_FLOAT, vecPos[2],
- PR_FLOAT, fRotation,
- PR_INT32, iSpawnWeapons[0],
- PR_INT32, iSpawnWeapons[1],
- PR_INT32, iSpawnWeapons[2],
- PR_INT32, iSpawnWeaponsAmmo[0],
- PR_INT32, iSpawnWeaponsAmmo[1],
- PR_INT32, iSpawnWeaponsAmmo[2]
- );
- new BitStream:bsn = BS_New();
- BS_WriteValue(
- bsn,
- PR_UINT8, byteTeam,
- PR_INT32, iSkin,
- PR_INT32, 0,
- PR_UINT8, unk,
- PR_FLOAT, vecPos[0],
- PR_FLOAT, vecPos[1],
- PR_FLOAT, vecPos[2],
- PR_FLOAT, fRotation,
- PR_INT32, iSpawnWeapons[0],
- PR_INT32, iSpawnWeapons[1],
- PR_INT32, iSpawnWeapons[2],
- PR_INT32, iSpawnWeaponsAmmo[0],
- PR_INT32, iSpawnWeaponsAmmo[1],
- PR_INT32, iSpawnWeaponsAmmo[2]
- );
- #if defined dl_compat_OnOutcomingRPC
- new offset;
- BS_GetWriteOffset(bsn, offset);
- BS_ResetReadPointer(bsn);
- BS_ResetWritePointer(bsn);
-
- if(dl_compat_OnOutcomingRPC(playerid, rpcid, bsn))
- {
- BS_SetWriteOffset(bsn, offset);
- BS_RPC(bsn, playerid, rpcid);
- }
- #else
- BS_RPC(bsn, playerid, rpcid);
- #endif
- BS_Delete(bsn);
- return 0;
- }
- }
- BS_ResetReadPointer(bs);
- BS_ResetWritePointer(bs);
- }
- #if defined dl_compat_OnOutcomingRPC
- return dl_compat_OnOutcomingRPC(playerid, rpcid, BitStream:bs);
- #else
- return 1;
- #endif
- }
- /*Functions*/
- stock IsClient03DL(playerid)
- {
- if(0 <= playerid < MAX_PLAYERS)
- {
- return dl_compat_IsClient03DL{playerid};
- }
- else
- {
- printf("[error] Run time error: IsClient03DL(%d): index out of bounds");
- #if defined PrintBacktrace //check if Crashdetect is present
- PrintBacktrace();
- #endif
- return -1;
- }
- }
- /*Hooks*/
- #if defined _ALS_OnIncomingRPC
- #undef OnIncomingRPC
- #else
- #define _ALS_OnIncomingRPC
- #endif
- #define OnIncomingRPC dl_compat_OnIncomingRPC
- #if defined dl_compat_OnIncomingRPC
- forward dl_compat_OnIncomingRPC(playerid, rpcid, BitStream:bs);
- #endif
- #if defined _ALS_OnOutcomingRPC
- #undef OnOutcomingRPC
- #else
- #define _ALS_OnOutcomingRPC
- #endif
- #define OnOutcomingRPC dl_compat_OnOutcomingRPC
- #if defined dl_compat_OnOutcomingRPC
- forward dl_compat_OnOutcomingRPC(playerid, rpcid, BitStream:bs);
- #endif
|