dl-compat.inc 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458
  1. #if defined _dl_compat_included
  2. #endinput
  3. #endif
  4. #define _dl_compat_included
  5. #include <a_samp>
  6. #include <Pawn.RakNet>
  7. /*Variables*/
  8. static bool:dl_compat_IsClient03DL[MAX_PLAYERS char];
  9. /*Consts*/
  10. const RPC_ClientJoin = 25;
  11. const RPC_SetPlayerSkin = 153;
  12. const RPC_WorldPlayerAdd = 32;
  13. const RPC_RequestClass = 128;
  14. const RPC_SetSpawnInfo = 68;
  15. const RPC_ShowActor = 171;
  16. /*Callbacks*/
  17. public OnIncomingRPC(playerid, rpcid, BitStream:bs)
  18. {
  19. if(playerid < 0)
  20. #if defined dl_compat_OnIncomingRPC
  21. return dl_compat_OnIncomingRPC(playerid, rpcid, BitStream:bs);
  22. #else
  23. return 1;
  24. #endif
  25. if(rpcid == RPC_ClientJoin)
  26. {
  27. new iVersion,
  28. byteMod,
  29. byteNameLen,
  30. NickName[257],
  31. uiClientChallengeResponse,
  32. byteAuthBSLen,
  33. auth_bs[4*16],
  34. iClientVerLen,
  35. ClientVersion[12];
  36. BS_ReadValue(
  37. bs,
  38. PR_INT32, iVersion,
  39. PR_UINT8, byteMod,
  40. PR_UINT8, byteNameLen,
  41. PR_STRING, NickName, byteNameLen,
  42. PR_UINT32, uiClientChallengeResponse,
  43. PR_UINT8, byteAuthBSLen,
  44. PR_STRING, auth_bs, byteAuthBSLen,
  45. PR_UINT8, iClientVerLen,
  46. PR_STRING, ClientVersion, iClientVerLen
  47. );
  48. dl_compat_IsClient03DL{playerid} = false;
  49. if(iVersion == 4062)
  50. {
  51. dl_compat_IsClient03DL{playerid} = true;
  52. iVersion = 4057;
  53. //fix and solve challenge
  54. uiClientChallengeResponse = (uiClientChallengeResponse ^ 4062) ^ iVersion;
  55. BS_Reset(bs);
  56. BS_WriteValue(
  57. bs,
  58. PR_INT32, iVersion,
  59. PR_UINT8, byteMod,
  60. PR_UINT8, byteNameLen,
  61. PR_STRING, NickName,
  62. PR_UINT32, uiClientChallengeResponse,
  63. PR_UINT8, byteAuthBSLen,
  64. PR_STRING, auth_bs,
  65. PR_UINT8, iClientVerLen,
  66. PR_STRING, ClientVersion
  67. );
  68. }
  69. BS_ResetReadPointer(bs);
  70. BS_ResetWritePointer(bs);
  71. }
  72. #if defined dl_compat_OnIncomingRPC
  73. return dl_compat_OnIncomingRPC(playerid, rpcid, BitStream:bs);
  74. #else
  75. return 1;
  76. #endif
  77. }
  78. public OnOutcomingRPC(playerid, rpcid, BitStream:bs)
  79. {
  80. if(playerid < 0)
  81. #if defined dl_compat_OnOutcomingRPC
  82. return dl_compat_OnOutcomingRPC(playerid, rpcid, BitStream:bs);
  83. #else
  84. return 1;
  85. #endif
  86. if(dl_compat_IsClient03DL{playerid})
  87. {
  88. switch(rpcid)
  89. {
  90. case RPC_SetPlayerSkin:
  91. {
  92. new wPlayerID,
  93. dSkinID;
  94. BS_ReadValue(
  95. bs,
  96. PR_UINT32, wPlayerID,
  97. PR_UINT32, dSkinID
  98. );
  99. new BitStream:bsn = BS_New();
  100. BS_WriteValue(
  101. bsn,
  102. PR_UINT16, wPlayerID,
  103. PR_UINT32, dSkinID,
  104. PR_UINT32, 0
  105. );
  106. #if defined dl_compat_OnOutcomingRPC
  107. new offset;
  108. BS_GetWriteOffset(bsn, offset);
  109. BS_ResetReadPointer(bsn);
  110. BS_ResetWritePointer(bsn);
  111. if(dl_compat_OnOutcomingRPC(playerid, rpcid, bsn))
  112. {
  113. BS_SetWriteOffset(bsn, offset);
  114. BS_RPC(bsn, playerid, rpcid);
  115. }
  116. #else
  117. BS_RPC(bsn, playerid, rpcid);
  118. #endif
  119. BS_Delete(bsn);
  120. return 0;
  121. }
  122. case RPC_WorldPlayerAdd:
  123. {
  124. new wPlayerID,
  125. team,
  126. dSkinID,
  127. Float:PosX,
  128. Float:PosY,
  129. Float:PosZ,
  130. Float:facing_angle,
  131. player_color,
  132. fighting_style;
  133. BS_ReadValue(
  134. bs,
  135. PR_UINT16, wPlayerID,
  136. PR_UINT8, team,
  137. PR_UINT32, dSkinID,
  138. PR_FLOAT, PosX,
  139. PR_FLOAT, PosY,
  140. PR_FLOAT, PosZ,
  141. PR_FLOAT, facing_angle,
  142. PR_UINT32, player_color,
  143. PR_UINT8, fighting_style
  144. );
  145. new BitStream:bsn = BS_New();
  146. BS_WriteValue(
  147. bsn,
  148. PR_UINT16, wPlayerID,
  149. PR_UINT8, team,
  150. PR_UINT32, dSkinID,
  151. PR_UINT32, 0,
  152. PR_FLOAT, PosX,
  153. PR_FLOAT, PosY,
  154. PR_FLOAT, PosZ,
  155. PR_FLOAT, facing_angle,
  156. PR_UINT32, player_color,
  157. PR_UINT8, fighting_style
  158. );
  159. #if defined dl_compat_OnOutcomingRPC
  160. new offset;
  161. BS_GetWriteOffset(bsn, offset);
  162. BS_ResetReadPointer(bsn);
  163. BS_ResetWritePointer(bsn);
  164. if(dl_compat_OnOutcomingRPC(playerid, rpcid, bsn))
  165. {
  166. BS_SetWriteOffset(bsn, offset);
  167. BS_RPC(bsn, playerid, rpcid);
  168. }
  169. #else
  170. BS_RPC(bsn, playerid, rpcid);
  171. #endif
  172. BS_Delete(bsn);
  173. return 0;
  174. }
  175. case RPC_ShowActor:
  176. {
  177. new wActorID,
  178. SkinID,
  179. Float:X,
  180. Float:Y,
  181. Float:Z,
  182. Float:Angle,
  183. Float:health,
  184. bInvulnerable;
  185. BS_ReadValue(
  186. bs,
  187. PR_UINT16, wActorID,
  188. PR_UINT32, SkinID,
  189. PR_FLOAT, X,
  190. PR_FLOAT, Y,
  191. PR_FLOAT, Z,
  192. PR_FLOAT, Angle,
  193. PR_FLOAT, health,
  194. PR_BOOL, bInvulnerable
  195. );
  196. new BitStream:bsn = BS_New();
  197. BS_WriteValue(
  198. bsn,
  199. PR_UINT16, wActorID,
  200. PR_UINT32, SkinID,
  201. PR_UINT32, 0,
  202. PR_FLOAT, X,
  203. PR_FLOAT, Y,
  204. PR_FLOAT, Z,
  205. PR_FLOAT, Angle,
  206. PR_FLOAT, health,
  207. PR_BOOL, bInvulnerable
  208. );
  209. #if defined dl_compat_OnOutcomingRPC
  210. new offset;
  211. BS_GetWriteOffset(bsn, offset);
  212. BS_ResetReadPointer(bsn);
  213. BS_ResetWritePointer(bsn);
  214. if(dl_compat_OnOutcomingRPC(playerid, rpcid, bsn))
  215. {
  216. BS_SetWriteOffset(bsn, offset);
  217. BS_RPC(bsn, playerid, rpcid);
  218. }
  219. #else
  220. BS_RPC(bsn, playerid, rpcid);
  221. #endif
  222. BS_Delete(bsn);
  223. return 0;
  224. }
  225. case RPC_RequestClass:
  226. {
  227. new byteRequestOutcome,
  228. byteTeam,
  229. iSkin,
  230. unk,
  231. Float:vecPos[3],
  232. Float:fRotation,
  233. iSpawnWeapons[3],
  234. iSpawnWeaponsAmmo[3];
  235. BS_ReadValue(
  236. bs,
  237. PR_UINT8, byteRequestOutcome,
  238. PR_UINT8, byteTeam,
  239. PR_INT32, iSkin,
  240. PR_UINT8, unk,
  241. PR_FLOAT, vecPos[0],
  242. PR_FLOAT, vecPos[1],
  243. PR_FLOAT, vecPos[2],
  244. PR_FLOAT, fRotation,
  245. PR_INT32, iSpawnWeapons[0],
  246. PR_INT32, iSpawnWeapons[1],
  247. PR_INT32, iSpawnWeapons[2],
  248. PR_INT32, iSpawnWeaponsAmmo[0],
  249. PR_INT32, iSpawnWeaponsAmmo[1],
  250. PR_INT32, iSpawnWeaponsAmmo[2]
  251. );
  252. new BitStream:bsn = BS_New();
  253. BS_WriteValue(
  254. bsn,
  255. PR_UINT8, byteRequestOutcome,
  256. PR_UINT8, byteTeam,
  257. PR_INT32, iSkin,
  258. PR_INT32, 0,
  259. PR_UINT8, unk,
  260. PR_FLOAT, vecPos[0],
  261. PR_FLOAT, vecPos[1],
  262. PR_FLOAT, vecPos[2],
  263. PR_FLOAT, fRotation,
  264. PR_INT32, iSpawnWeapons[0],
  265. PR_INT32, iSpawnWeapons[1],
  266. PR_INT32, iSpawnWeapons[2],
  267. PR_INT32, iSpawnWeaponsAmmo[0],
  268. PR_INT32, iSpawnWeaponsAmmo[1],
  269. PR_INT32, iSpawnWeaponsAmmo[2]
  270. );
  271. #if defined dl_compat_OnOutcomingRPC
  272. new offset;
  273. BS_GetWriteOffset(bsn, offset);
  274. BS_ResetReadPointer(bsn);
  275. BS_ResetWritePointer(bsn);
  276. if(dl_compat_OnOutcomingRPC(playerid, rpcid, bsn))
  277. {
  278. BS_SetWriteOffset(bsn, offset);
  279. BS_RPC(bsn, playerid, rpcid);
  280. }
  281. #else
  282. BS_RPC(bsn, playerid, rpcid);
  283. #endif
  284. BS_Delete(bsn);
  285. return 0;
  286. }
  287. case RPC_SetSpawnInfo:
  288. {
  289. new byteTeam,
  290. iSkin,
  291. unk,
  292. Float:vecPos[3],
  293. Float:fRotation,
  294. iSpawnWeapons[3],
  295. iSpawnWeaponsAmmo[3];
  296. BS_ReadValue(
  297. bs,
  298. PR_UINT8, byteTeam,
  299. PR_INT32, iSkin,
  300. PR_UINT8, unk,
  301. PR_FLOAT, vecPos[0],
  302. PR_FLOAT, vecPos[1],
  303. PR_FLOAT, vecPos[2],
  304. PR_FLOAT, fRotation,
  305. PR_INT32, iSpawnWeapons[0],
  306. PR_INT32, iSpawnWeapons[1],
  307. PR_INT32, iSpawnWeapons[2],
  308. PR_INT32, iSpawnWeaponsAmmo[0],
  309. PR_INT32, iSpawnWeaponsAmmo[1],
  310. PR_INT32, iSpawnWeaponsAmmo[2]
  311. );
  312. new BitStream:bsn = BS_New();
  313. BS_WriteValue(
  314. bsn,
  315. PR_UINT8, byteTeam,
  316. PR_INT32, iSkin,
  317. PR_INT32, 0,
  318. PR_UINT8, unk,
  319. PR_FLOAT, vecPos[0],
  320. PR_FLOAT, vecPos[1],
  321. PR_FLOAT, vecPos[2],
  322. PR_FLOAT, fRotation,
  323. PR_INT32, iSpawnWeapons[0],
  324. PR_INT32, iSpawnWeapons[1],
  325. PR_INT32, iSpawnWeapons[2],
  326. PR_INT32, iSpawnWeaponsAmmo[0],
  327. PR_INT32, iSpawnWeaponsAmmo[1],
  328. PR_INT32, iSpawnWeaponsAmmo[2]
  329. );
  330. #if defined dl_compat_OnOutcomingRPC
  331. new offset;
  332. BS_GetWriteOffset(bsn, offset);
  333. BS_ResetReadPointer(bsn);
  334. BS_ResetWritePointer(bsn);
  335. if(dl_compat_OnOutcomingRPC(playerid, rpcid, bsn))
  336. {
  337. BS_SetWriteOffset(bsn, offset);
  338. BS_RPC(bsn, playerid, rpcid);
  339. }
  340. #else
  341. BS_RPC(bsn, playerid, rpcid);
  342. #endif
  343. BS_Delete(bsn);
  344. return 0;
  345. }
  346. }
  347. BS_ResetReadPointer(bs);
  348. BS_ResetWritePointer(bs);
  349. }
  350. #if defined dl_compat_OnOutcomingRPC
  351. return dl_compat_OnOutcomingRPC(playerid, rpcid, BitStream:bs);
  352. #else
  353. return 1;
  354. #endif
  355. }
  356. /*Functions*/
  357. stock IsClient03DL(playerid)
  358. {
  359. if(0 <= playerid < MAX_PLAYERS)
  360. {
  361. return dl_compat_IsClient03DL{playerid};
  362. }
  363. else
  364. {
  365. printf("[error] Run time error: IsClient03DL(%d): index out of bounds");
  366. #if defined PrintBacktrace //check if Crashdetect is present
  367. PrintBacktrace();
  368. #endif
  369. return -1;
  370. }
  371. }
  372. /*Hooks*/
  373. #if defined _ALS_OnIncomingRPC
  374. #undef OnIncomingRPC
  375. #else
  376. #define _ALS_OnIncomingRPC
  377. #endif
  378. #define OnIncomingRPC dl_compat_OnIncomingRPC
  379. #if defined dl_compat_OnIncomingRPC
  380. forward dl_compat_OnIncomingRPC(playerid, rpcid, BitStream:bs);
  381. #endif
  382. #if defined _ALS_OnOutcomingRPC
  383. #undef OnOutcomingRPC
  384. #else
  385. #define _ALS_OnOutcomingRPC
  386. #endif
  387. #define OnOutcomingRPC dl_compat_OnOutcomingRPC
  388. #if defined dl_compat_OnOutcomingRPC
  389. forward dl_compat_OnOutcomingRPC(playerid, rpcid, BitStream:bs);
  390. #endif