y_als.inc 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. /*----------------------------------------------------------------------------*\
  2. ==============================
  3. y_als - Useful codes for ALS
  4. ==============================
  5. Description:
  6. Provides a number of macros for making ALS (Advanced Library System)
  7. callback hooking simpler.
  8. Legal:
  9. Version: MPL 1.1
  10. The contents of this file are subject to the Mozilla Public License Version
  11. 1.1 (the "License"); you may not use this file except in compliance with
  12. the License. You may obtain a copy of the License at
  13. http://www.mozilla.org/MPL/
  14. Software distributed under the License is distributed on an "AS IS" basis,
  15. WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  16. for the specific language governing rights and limitations under the
  17. License.
  18. The Original Code is the YSI ALS include.
  19. The Initial Developer of the Original Code is Alex "Y_Less" Cole.
  20. Portions created by the Initial Developer are Copyright (C) 2011
  21. the Initial Developer. All Rights Reserved.
  22. Contributors:
  23. ZeeX, koolk, JoeBullet/Google63, g_aSlice/Slice
  24. Thanks:
  25. JoeBullet/Google63 - Handy arbitrary ASM jump code using SCTRL.
  26. ZeeX - Very productive conversations.
  27. koolk - IsPlayerinAreaEx code.
  28. TheAlpha - Danish translation.
  29. breadfish - German translation.
  30. Fireburn - Dutch translation.
  31. yom - French translation.
  32. 50p - Polish translation.
  33. Zamaroht - Spanish translation.
  34. Dracoblue, sintax, mabako, Xtreme, other coders - Producing other modes
  35. for me to strive to better.
  36. Pixels^ - Running XScripters where the idea was born.
  37. Matite - Pestering me to release it and using it.
  38. Very special thanks to:
  39. Thiadmer - PAWN, whose limits continue to amaze me!
  40. Kye/Kalcor - SA:MP.
  41. SA:MP Team past, present and future - SA:MP.
  42. Version:
  43. 1.0
  44. Changelog:
  45. 29/04/11:
  46. Added "call" macro to make testing easier.
  47. 21/10/10:
  48. First version
  49. \*----------------------------------------------------------------------------*/
  50. #include "internal\y_version"
  51. #include "y_amx"
  52. #include "y_utils"
  53. // Allow multiple inclusions.
  54. #if !defined _inc_y_als
  55. #error Did you do <YSI/y_als> instead of the required <YSI\y_als>?
  56. #endif
  57. #undef _inc_y_als
  58. #if !defined _Y_ALS_INCLUDED
  59. // This is an include guard with a purpose - we need more control than the
  60. // standard include guards give.
  61. #define _Y_ALS_INCLUDED
  62. #include "y_bit"
  63. #include "internal\y_shortfunc"
  64. enum ALS
  65. {
  66. //Bit:ALS_OnAnyScriptInit,
  67. //Bit:ALS_OnAnyScriptExit,
  68. Bit:ALS_OnScriptInit,
  69. Bit:ALS_OnScriptExit,
  70. Bit:ALS_OnGameModeInit,
  71. Bit:ALS_OnGameModeExit,
  72. Bit:ALS_OnFilterScriptInit,
  73. Bit:ALS_OnFilterScriptExit,
  74. Bit:ALS_OnPlayerConnect,
  75. Bit:ALS_OnPlayerDisconnect,
  76. Bit:ALS_OnPlayerSpawn,
  77. Bit:ALS_OnPlayerDeath,
  78. Bit:ALS_OnVehicleSpawn,
  79. Bit:ALS_OnVehicleDeath,
  80. Bit:ALS_OnPlayerText,
  81. Bit:ALS_OnPlayerCommandText,
  82. Bit:ALS_OnPlayerRequestClass,
  83. Bit:ALS_OnPlayerEnterVehicle,
  84. Bit:ALS_OnPlayerExitVehicle,
  85. Bit:ALS_OnPlayerStateChange,
  86. Bit:ALS_OnPlayerEnterCheckpoint,
  87. Bit:ALS_OnPlayerLeaveCheckpoint,
  88. Bit:ALS_OnPlayerEnterRaceCheckpoint,
  89. Bit:ALS_OnPlayerLeaveRaceCheckpoint,
  90. Bit:ALS_OnRconCommand,
  91. Bit:ALS_OnPlayerRequestSpawn,
  92. Bit:ALS_OnObjectMoved,
  93. Bit:ALS_OnPlayerObjectMoved,
  94. Bit:ALS_OnPlayerPickUpPickup,
  95. Bit:ALS_OnVehicleMod,
  96. Bit:ALS_OnEnterExitModShop,
  97. Bit:ALS_OnVehiclePaintjob,
  98. Bit:ALS_OnVehicleRespray,
  99. Bit:ALS_OnVehicleDamageStatusUpdate,
  100. Bit:ALS_OnPlayerSelectedMenuRow,
  101. Bit:ALS_OnPlayerExitedMenu,
  102. Bit:ALS_OnPlayerInteriorChange,
  103. Bit:ALS_OnPlayerKeyStateChange,
  104. Bit:ALS_OnRconLoginAttempt,
  105. Bit:ALS_OnPlayerUpdate,
  106. Bit:ALS_OnPlayerStreamIn,
  107. Bit:ALS_OnPlayerStreamOut,
  108. Bit:ALS_OnVehicleStreamIn,
  109. Bit:ALS_OnVehicleStreamOut,
  110. Bit:ALS_OnDialogResponse,
  111. Bit:ALS_OnPlayerClickPlayer,
  112. Bit:ALS_OnPlayerLogin,
  113. Bit:ALS_OnPlayerLogout,
  114. Bit:ALS_OnPlayerTakeDamage,
  115. Bit:ALS_OnPlayerGiveDamage,
  116. Bit:ALS_OnPlayerClickMap,
  117. Bit:ALS_OnPlayerCommandReceived,
  118. Bit:ALS_OnPlayerCommandPerformed,
  119. Bit:ALS_OnUnoccupiedVehicleUpdate
  120. }
  121. #define ALS_DATA<> static stock BitArray:gs_ALS<_:ALS>;
  122. #define ALS_DETECT<%0> if(funcidx(#ALS_PREFIX"_On"#%0)!=-1)Bit_Let(gs_ALS,_:ALS_On%0);
  123. //#define ALS_DETECT_SHORT<On%0> if(funcidx(#ALS_PREFIX"_"#%0)!=-1)Bit_Let(gs_ALS,_:ALS_On%0);
  124. //#define ALS_CALL_INT<%0,%2>(%3) return Bit_GetBit(Bit:gs_ALS,_:ALS_On%0)?P@(#ALS_PREFIX"_On"#%0,#%2#x,%3):1;
  125. // ALS Callback.
  126. #define _ALS_C_INT<%0,%2>(%3) Bit_GetBit(Bit:gs_ALS,_:ALS_On%0)?P@(#ALS_PREFIX"_On"#%0,#%2#q,ALS_RS_%3):ALS_R_%0;
  127. #define ALS_C_INT<%0,%2>(%3) return _ALS_C_INT<%0,%2>(%3)
  128. // ALS Forward.
  129. #define ALS_F_INT<%0,%8>(%1) forward On%0(ALS_KS_%1);
  130. // ALS Go (ignore extra parameters).
  131. #define ALS_G_INT<%0,%1>(%8)(%2) W@(#On#%0,#%1#x,%2)
  132. // Default return value definitions.
  133. //#define ALS_R_AnyScriptInit 1
  134. //#define ALS_R_AnyScriptExit 1
  135. #define ALS_R_ScriptInit 1
  136. #define ALS_R_ScriptExit 1
  137. #define ALS_R_GameModeInit 1
  138. #define ALS_R_GameModeExit 1
  139. #define ALS_R_FilterScriptInit 1
  140. #define ALS_R_FilterScriptExit 1
  141. #define ALS_R_PlayerConnect 1
  142. #define ALS_R_PlayerDisconnect 1
  143. #define ALS_R_PlayerSpawn 1
  144. #define ALS_R_PlayerDeath 1
  145. #define ALS_R_VehicleSpawn 1
  146. #define ALS_R_VehicleDeath 1
  147. #define ALS_R_PlayerText 1
  148. #define ALS_R_PlayerCommandText 0
  149. #define ALS_R_PlayerRequestClass 1
  150. #define ALS_R_PlayerEnterVehicle 1
  151. #define ALS_R_PlayerExitVehicle 1
  152. #define ALS_R_PlayerStateChange 1
  153. #define ALS_R_PlayerEnterCheckpoint 1
  154. #define ALS_R_PlayerLeaveCheckpoint 1
  155. #define ALS_R_PlayerEnterRaceCheckpoint 1
  156. #define ALS_R_PlayerLeaveRaceCheckpoint 1
  157. #define ALS_R_RconCommand 1
  158. #define ALS_R_PlayerRequestSpawn 1
  159. #define ALS_R_ObjectMoved 1
  160. #define ALS_R_PlayerObjectMoved 1
  161. #define ALS_R_PlayerPickUpPickup 1
  162. #define ALS_R_VehicleMod 1
  163. #define ALS_R_EnterExitModShop 1
  164. #define ALS_R_VehiclePaintjob 1
  165. #define ALS_R_VehicleRespray 1
  166. #define ALS_R_VehicleDamageStatusUpdate 1
  167. #define ALS_R_PlayerSelectedMenuRow 1
  168. #define ALS_R_PlayerExitedMenu 1
  169. #define ALS_R_PlayerInteriorChange 1
  170. #define ALS_R_PlayerKeyStateChange 1
  171. #define ALS_R_RconLoginAttempt 1
  172. #define ALS_R_PlayerUpdate 1
  173. #define ALS_R_PlayerStreamIn 1
  174. #define ALS_R_PlayerStreamOut 1
  175. #define ALS_R_VehicleStreamIn 1
  176. #define ALS_R_VehicleStreamOut 1
  177. #define ALS_R_DialogResponse 1
  178. #define ALS_R_PlayerClickPlayer 1
  179. #define ALS_R_PlayerLogin 1
  180. #define ALS_R_PlayerLogout 1
  181. #define ALS_R_PlayerTakeDamage 1
  182. #define ALS_R_PlayerGiveDamage 1
  183. #define ALS_R_PlayerClickMap 1
  184. #define ALS_R_PlayerCommandReceived 1
  185. #define ALS_R_PlayerCommandPerformed -1
  186. #define ALS_R_UnoccupiedVehicleUpdate 1
  187. // Chain call declarations.
  188. #define ALS_DO_ScriptInit<%0> %0<ScriptInit ,>(end:)
  189. #define ALS_DO_ScriptExit<%0> %0<ScriptExit ,>(end:)
  190. #define ALS_DO_GameModeInit<%0> %0<GameModeInit ,>(end:)
  191. #define ALS_DO_GameModeExit<%0> %0<GameModeExit ,>(end:)
  192. #define ALS_DO_FilterScriptInit<%0> %0<FilterScriptInit ,>(end:)
  193. #define ALS_DO_FilterScriptExit<%0> %0<FilterScriptExit ,>(end:)
  194. #define ALS_DO_PlayerConnect<%0> %0<PlayerConnect ,i>(end:playerid)
  195. #define ALS_DO_PlayerDisconnect<%0> %0<PlayerDisconnect ,ii>(more:playerid,end:reason)
  196. #define ALS_DO_PlayerSpawn<%0> %0<PlayerSpawn ,i>(end:playerid)
  197. #define ALS_DO_PlayerDeath<%0> %0<PlayerDeath ,iii>(more:playerid,more:killerid,end:reason)
  198. #define ALS_DO_VehicleSpawn<%0> %0<VehicleSpawn ,i>(end:vehicleid)
  199. #define ALS_DO_VehicleDeath<%0> %0<VehicleDeath ,ii>(more:vehicleid,end:killerid)
  200. #define ALS_DO_PlayerText<%0> %0<PlayerText ,is>(more:playerid,end_string:text[])
  201. #define ALS_DO_PlayerCommandText<%0> %0<PlayerCommandText ,is>(more:playerid,end_string:cmdtext[])
  202. #define ALS_DO_PlayerRequestClass<%0> %0<PlayerRequestClass ,ii>(more:playerid,end:classid)
  203. #define ALS_DO_PlayerEnterVehicle<%0> %0<PlayerEnterVehicle ,iii>(more:playerid,more:vehicleid,end:ispassenger)
  204. #define ALS_DO_PlayerExitVehicle<%0> %0<PlayerExitVehicle ,ii>(more:playerid,end:vehicleid)
  205. #define ALS_DO_PlayerStateChange<%0> %0<PlayerStateChange ,iii>(more:playerid,more:newstate,end:oldstate)
  206. #define ALS_DO_PlayerEnterCheckpoint<%0> %0<PlayerEnterCheckpoint ,i>(end:playerid)
  207. #define ALS_DO_PlayerLeaveCheckpoint<%0> %0<PlayerLeaveCheckpoint ,i>(end:playerid)
  208. #define ALS_DO_PlayerEnterRaceCheckpoint<%0> %0<PlayerEnterRaceCheckpoint,i>(end:playerid)
  209. #define ALS_DO_PlayerLeaveRaceCheckpoint<%0> %0<PlayerLeaveRaceCheckpoint,i>(end:playerid)
  210. #define ALS_DO_RconCommand<%0> %0<RconCommand ,s>(end_string:cmd[])
  211. #define ALS_DO_PlayerRequestSpawn<%0> %0<PlayerRequestSpawn ,i>(end:playerid)
  212. #define ALS_DO_ObjectMoved<%0> %0<ObjectMoved ,i>(end:objectid)
  213. #define ALS_DO_PlayerObjectMoved<%0> %0<PlayerObjectMoved ,ii>(more:playerid,end:objectid)
  214. #define ALS_DO_PlayerPickUpPickup<%0> %0<PlayerPickUpPickup ,ii>(more:playerid,end:pickupid)
  215. #define ALS_DO_VehicleMod<%0> %0<VehicleMod ,iii>(more:playerid,more:vehicleid,end:componentid)
  216. #define ALS_DO_EnterExitModShop<%0> %0<EnterExitModShop ,iii>(more:playerid,more:enterexit,end:interiorid)
  217. #define ALS_DO_VehiclePaintjob<%0> %0<VehiclePaintjob ,iii>(more:playerid,more:vehicleid,end:paintjobid)
  218. #define ALS_DO_VehicleRespray<%0> %0<VehicleRespray ,iiii>(more:playerid,more:vehicleid,more:color1,end:color2)
  219. #define ALS_DO_VehicleDamageStatusUpdate<%0> %0<VehicleDamageStatusUpdate,ii>(more:vehicleid,end:playerid)
  220. #define ALS_DO_PlayerSelectedMenuRow<%0> %0<PlayerSelectedMenuRow ,ii>(more:playerid,end:row)
  221. #define ALS_DO_PlayerExitedMenu<%0> %0<PlayerExitedMenu ,i>(end:playerid)
  222. #define ALS_DO_PlayerInteriorChange<%0> %0<PlayerInteriorChange ,iii>(more:playerid,more:newinteriorid,end:oldinteriorid)
  223. #define ALS_DO_PlayerKeyStateChange<%0> %0<PlayerKeyStateChange ,iii>(more:playerid,more:newkeys,end:oldkeys)
  224. #define ALS_DO_RconLoginAttempt<%0> %0<RconLoginAttempt ,ssi>(string:ip[],string:password[],end:success)
  225. #define ALS_DO_PlayerUpdate<%0> %0<PlayerUpdate ,i>(end:playerid)
  226. #define ALS_DO_PlayerStreamIn<%0> %0<PlayerStreamIn ,ii>(more:playerid,end:forplayerid)
  227. #define ALS_DO_PlayerStreamOut<%0> %0<PlayerStreamOut ,ii>(more:playerid,end:forplayerid)
  228. #define ALS_DO_VehicleStreamIn<%0> %0<VehicleStreamIn ,ii>(more:vehicleid,end:forplayerid)
  229. #define ALS_DO_VehicleStreamOut<%0> %0<VehicleStreamOut ,ii>(more:vehicleid,end:forplayerid)
  230. #define ALS_DO_DialogResponse<%0> %0<DialogResponse ,iiiis>(more:playerid,more:dialogid,more:response,more:listitem,end_string:inputtext[])
  231. #define ALS_DO_PlayerClickPlayer<%0> %0<PlayerClickPlayer ,iii>(more:playerid,more:clickedplayerid,end:source)
  232. #define ALS_DO_PlayerLogin<%0> %0<PlayerLogin ,ii>(more:playerid,end:uid)
  233. #define ALS_DO_PlayerLogout<%0> %0<PlayerLogout ,ii>(more:playerid,end:uid)
  234. #define ALS_DO_PlayerGiveDamage<%0> %0<PlayerGiveDamage ,iifi>(more:playerid,more:damagedid,tag:Float:amount,end:weaponid)
  235. #define ALS_DO_PlayerTakeDamage<%0> %0<PlayerTakeDamage ,iifi>(more:playerid,more:issuerid,tag:Float:amount,end:weaponid)
  236. #define ALS_DO_PlayerClickMap<%0> %0<PlayerClickMap ,ifff>(more:playerid,tag:Float:fX,tag:Float:fY,end_tag:Float:fZ)
  237. #define ALS_DO_PlayerCommandReceived<%0> %0<PlayerCommandReceived ,is>(more:playerid,end_string:cmdtext[])
  238. #define ALS_DO_PlayerCommandPerformed<%0> %0<PlayerCommandPerformed ,isi>(more:playerid,string:cmdtext[],end:success)
  239. #define ALS_DO_UnoccupiedVehicleUpdate<%0> %0<UnoccupiedVehicleUpdate ,iii>(more:vehicleid,more:playerid,end:passenger_seat)
  240. //#define ALS_CALL<%0> ALS_C_%0
  241. //#define ALS_FORWARD<%0> ALS_F_%0
  242. //#define call%0On%1(%2) ALS_G_%1(%2)
  243. #define ALS_KS_more:%0, %0,ALS_KS_
  244. #define ALS_KS_string:%0[], %0[],ALS_KS_
  245. #define ALS_KS_tag:%3:%0, %3:%0,ALS_KS_
  246. #define ALS_KS_end:%0) %0)
  247. #define ALS_KS_end_string:%0[]) %0[])
  248. #define ALS_KS_end_tag:%3:%0) %3:%0)
  249. #define ALS_RS_more:%0, %0,ALS_RS_
  250. #define ALS_RS_string:%0[], ((%0[0])?(%0):NULL),ALS_RS_
  251. #define ALS_RS_tag:%3:%0, %0,ALS_RS_
  252. #define ALS_RS_end:%0) %0)
  253. #define ALS_RS_end_string:%0[]) ((%0[0])?(%0):NULL))
  254. #define ALS_RS_end_tag:%3:%0) %0)
  255. #define ALS_DO:%9<%0> ALS_DO_%0<%9>
  256. #define ALS_CALL<%0> ALS_DO:ALS_C_INT<%0>
  257. #define ALS_GET<%0> ALS_DO:_ALS_C_INT<%0>
  258. #define ALS_FORWARD<%0> ALS_DO:ALS_F_INT<%0>
  259. #define call%0On%1(%2) ALS_DO:ALS_G_INT<%1>(%2)
  260. /*ALS_DoDetect(const str[]);
  261. public ALS_DoDetect(const str[])
  262. {
  263. new
  264. addr;
  265. addr = funcidx(str);
  266. if (addr != -1)
  267. {
  268. // Get the actual function address, not just the structure offset.
  269. addr *= 8;
  270. addr += AMX_HEADER_PUBLICS;
  271. #emit LREF.S.pri addr
  272. #emit STOR.S.pri addr
  273. }
  274. return addr;
  275. }*/
  276. #endif
  277. #if !defined ALS_PREFIX
  278. //#error You must define a callback prefix before including y_als.
  279. #define ALS_PREFIX Mode
  280. #endif