1
0

y_scriptinit.inc 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. /*----------------------------------------------------------------------------*\
  2. =======================================
  3. y_scriptinit - Two useful callbacks.
  4. =======================================
  5. Description:
  6. This file provides "OnScriptInit" and "OnScriptExit" which are called at the
  7. start and end of the current script, regardless of what the type of the
  8. script is (note: doesn't support NPC modes). It also provides
  9. "YSI_FILTERSCRIPT" as a (partial) replacement for "FILTERSCRIPT" which
  10. detects what the mode is at runtime for a more reliable system (but it is a
  11. run-time variable, not a compile-time constant).
  12. Legal:
  13. Version: MPL 1.1
  14. The contents of this file are subject to the Mozilla Public License Version
  15. 1.1 (the "License"); you may not use this file except in compliance with
  16. the License. You may obtain a copy of the License at
  17. http://www.mozilla.org/MPL/
  18. Software distributed under the License is distributed on an "AS IS" basis,
  19. WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  20. for the specific language governing rights and limitations under the
  21. License.
  22. The Original Code is the YSI scriptinit include.
  23. The Initial Developer of the Original Code is Alex "Y_Less" Cole.
  24. Portions created by the Initial Developer are Copyright (C) 2011
  25. the Initial Developer. All Rights Reserved.
  26. Contributors:
  27. ZeeX, koolk, JoeBullet/Google63, g_aSlice/Slice
  28. Thanks:
  29. JoeBullet/Google63 - Handy arbitrary ASM jump code using SCTRL.
  30. ZeeX - Very productive conversations.
  31. koolk - IsPlayerinAreaEx code.
  32. TheAlpha - Danish translation.
  33. breadfish - German translation.
  34. Fireburn - Dutch translation.
  35. yom - French translation.
  36. 50p - Polish translation.
  37. Zamaroht - Spanish translation.
  38. Dracoblue, sintax, mabako, Xtreme, other coders - Producing other modes
  39. for me to strive to better.
  40. Pixels^ - Running XScripters where the idea was born.
  41. Matite - Pestering me to release it and using it.
  42. Very special thanks to:
  43. Thiadmer - PAWN, whose limits continue to amaze me!
  44. Kye/Kalcor - SA:MP.
  45. SA:MP Team past, present and future - SA:MP.
  46. Version:
  47. 1.0
  48. Changelog:
  49. 30/04/11:
  50. First version
  51. \*----------------------------------------------------------------------------*/
  52. #include <a_samp>
  53. #include "internal\y_natives"
  54. #if !defined _ALS_
  55. forward public _ALS_();
  56. _ALS_()<_ALS_:unhooked>
  57. {
  58. }
  59. _ALS_()<_ALS_:hooked>
  60. {
  61. }
  62. _ALS_()<>
  63. {
  64. }
  65. #endif
  66. forward _ScriptInit_FixState();
  67. #if defined FILTERSCRIPT
  68. #if !defined YSI_FILTERSCRIPT
  69. stock
  70. bool:YSI_FILTERSCRIPT = true;
  71. #endif
  72. public OnFilterScriptInit()
  73. {
  74. state _script_init_fix_state : true;
  75. //CallLocalFunction("__YSI_SpecialInit", "");
  76. state _ALS_:hooked;
  77. ScriptInit_OnScriptInit();
  78. #if defined YSI_LOCK_MODE
  79. if (strlen(YSI_gLockData[5]) !=
  80. floatround(floatlog(_LOCK_LEN_0 + 1), floatround_ceil) + 1 +
  81. floatround(floatlog(_LOCK_LEN_1 + 1), floatround_ceil) + 1 +
  82. floatround(floatlog(_LOCK_LEN_2 + 1), floatround_ceil) + 1 +
  83. floatround(floatlog(_LOCK_LEN_3 + 1), floatround_ceil))
  84. {
  85. y_lock 6;
  86. }
  87. #endif
  88. //CallRemoteFunction("ScriptInit_OnAnyScriptInit", "");
  89. //ScriptInit_OnFilterScriptInit();
  90. return ScriptInit_OnFilterScriptInit();
  91. //ScriptInit_OnScriptInitLate();
  92. //CallLocalFunction("Text_Special_OnScriptInit", "");
  93. }
  94. forward ScriptInit_OnFilterScriptInit();public ScriptInit_OnFilterScriptInit()<_ALS_:unhooked>{return 1;}public ScriptInit_OnFilterScriptInit()<>{return 1;}
  95. //public ScriptInit_OnFilterScriptInit() <_ALS_:unhooked> return 1;
  96. //public ScriptInit_OnFilterScriptInit() <> return 1;
  97. #if defined _ALS_OnFilterScriptInit
  98. #undef OnFilterScriptInit
  99. #else
  100. #define _ALS_OnFilterScriptInit
  101. #endif
  102. #define OnFilterScriptInit(%0) ScriptInit_OnFilterScriptInit(%0) <_ALS_:hooked>
  103. #else
  104. // People can't be trusted to use "FILTERSCRIPT"...
  105. #if !defined YSI_FILTERSCRIPT
  106. new
  107. bool:YSI_FILTERSCRIPT = false;
  108. #endif
  109. public OnFilterScriptInit()
  110. {
  111. state _script_init_fix_state : true;
  112. //printf("OFSI");
  113. YSI_FILTERSCRIPT = true;
  114. //CallLocalFunction("__YSI_SpecialInit", "");
  115. state _ALS_:hooked;
  116. ScriptInit_OnScriptInit();
  117. #if defined YSI_LOCK_MODE
  118. new
  119. str[16];
  120. format(str, sizeof (str), "%c%c%c%c%c%c%c%c%c%c%c", '%', 'd', '.', '%', 'd', '.', '%', 'd', '.', '%', 'd');
  121. format(str, sizeof (str), str, _LOCK_IP_0, _LOCK_IP_1, _LOCK_IP_2, _LOCK_IP_3);
  122. if (strlen(YSI_gLockData[5]) != strlen(str))
  123. {
  124. y_lock 7;
  125. }
  126. #endif
  127. //CallRemoteFunction("ScriptInit_OnAnyScriptInit", "");
  128. return ScriptInit_OnFilterScriptInit();
  129. //ScriptInit_OnScriptInitLate();
  130. }
  131. public OnGameModeInit()
  132. {
  133. if (YSI_FILTERSCRIPT)
  134. {
  135. state _script_init_fix_state : true;
  136. return ScriptInit_OnGameModeInit();
  137. }
  138. else
  139. {
  140. state _script_init_fix_state : false;
  141. //CallLocalFunction("__YSI_SpecialInit", "");
  142. state _ALS_:hooked;
  143. printf("OnScriptInit 1");
  144. ScriptInit_OnScriptInit();
  145. printf("OnScriptInit 2");
  146. #if defined YSI_LOCK_MODE
  147. if (YSI_gLockData[
  148. floatround(floatlog(_LOCK_LEN_0 + 1), floatround_ceil) + 1 +
  149. floatround(floatlog(_LOCK_LEN_1 + 1), floatround_ceil) + 1 +
  150. floatround(floatlog(_LOCK_LEN_2 + 1), floatround_ceil) +
  151. floatround(floatlog(_LOCK_LEN_3 + 1), floatround_ceil)] == '\0'
  152. || YSI_gLockData[
  153. floatround(floatlog(_LOCK_LEN_0 + 1), floatround_ceil) + 1 +
  154. floatround(floatlog(_LOCK_LEN_1 + 1), floatround_ceil) + 1 +
  155. floatround(floatlog(_LOCK_LEN_2 + 1), floatround_ceil) + 1 +
  156. floatround(floatlog(_LOCK_LEN_3 + 1), floatround_ceil) + 1] == '\0')
  157. {
  158. y_lock 8;
  159. }
  160. #endif
  161. //CallRemoteFunction("ScriptInit_OnAnyScriptInit", "");
  162. printf("OnScriptInit 3");
  163. ScriptInit_OnGameModeInit();
  164. printf("OnScriptInit 4");
  165. return 222;
  166. // return ScriptInit_OnGameModeInit();
  167. //ScriptInit_OnScriptLate();
  168. //CallLocalFunction("Text_SpecialInit", "");
  169. }
  170. }
  171. #if defined _ALS_OnGameModeInit
  172. #undef OnGameModeInit
  173. #else
  174. #define _ALS_OnGameModeInit
  175. #endif
  176. #define OnGameModeInit(%0) ScriptInit_OnGameModeInit(%0) <_ALS_:hooked>
  177. #if defined _ALS_OnFilterScriptInit
  178. #undef OnFilterScriptInit
  179. #else
  180. #define _ALS_OnFilterScriptInit
  181. #endif
  182. #define OnFilterScriptInit(%0) ScriptInit_OnFilterScriptInit(%0) <_ALS_:hooked>
  183. forward ScriptInit_OnFilterScriptInit();public ScriptInit_OnFilterScriptInit()<_ALS_:unhooked>{return 1;}public ScriptInit_OnFilterScriptInit()<>{return 1;}
  184. forward ScriptInit_OnGameModeInit();public ScriptInit_OnGameModeInit()<_ALS_:unhooked>{return 1;}public ScriptInit_OnGameModeInit()<>{return 1;}
  185. #endif
  186. #if defined FILTERSCRIPT
  187. public OnFilterScriptExit()
  188. {
  189. ScriptInit_OnScriptExit();
  190. //CallRemoteFunction("ScriptInit_OnAnyScriptExit", "");
  191. new
  192. ret = ScriptInit_OnFilterScriptExit();
  193. //ScriptInit_OnScriptExitLate();
  194. //CallLocalFunction("__YSI_SpecialExit", "");
  195. __YSI_SpecialExit();
  196. return ret;
  197. }
  198. #if defined _ALS_OnFilterScriptExit
  199. #undef OnFilterScriptExit
  200. #else
  201. #define _ALS_OnFilterScriptExit
  202. #endif
  203. #define OnFilterScriptExit(%0) ScriptInit_OnFilterScriptExit(%0) <_ALS_:hooked>
  204. forward ScriptInit_OnFilterScriptExit();public ScriptInit_OnFilterScriptExit()<_ALS_:unhooked>{return 1;}public ScriptInit_OnFilterScriptExit()<>{return 1;}
  205. #else
  206. public OnFilterScriptExit()
  207. {
  208. if (YSI_FILTERSCRIPT)
  209. {
  210. ScriptInit_OnScriptExit();
  211. //CallRemoteFunction("ScriptInit_OnAnyScriptExit", "");
  212. new
  213. ret = ScriptInit_OnFilterScriptExit();
  214. //ScriptInit_OnScriptExitLate();
  215. //CallLocalFunction("__YSI_SpecialExit", "");
  216. __YSI_SpecialExit();
  217. return ret;
  218. }
  219. return 1;
  220. }
  221. public OnGameModeExit()
  222. {
  223. //printf("ScriptInit_OnGameModeExit");
  224. if (YSI_FILTERSCRIPT)
  225. {
  226. return ScriptInit_OnGameModeExit();
  227. }
  228. else
  229. {
  230. //printf("NF 0");
  231. ScriptInit_OnScriptExit();
  232. //printf("NF 1");
  233. //CallRemoteFunction("ScriptInit_OnAnyScriptExit", "");
  234. new
  235. ret = ScriptInit_OnGameModeExit();
  236. //printf("NF 2");
  237. //ScriptInit_OnScriptExitLate();
  238. //CallLocalFunction("__YSI_SpecialExit", "");
  239. __YSI_SpecialExit();
  240. return ret;
  241. }
  242. }
  243. #if defined _ALS_OnGameModeExit
  244. #undef OnGameModeExit
  245. #else
  246. #define _ALS_OnGameModeExit
  247. #endif
  248. #define OnGameModeExit(%0) ScriptInit_OnGameModeExit(%0) <_ALS_:hooked>
  249. #if defined _ALS_OnFilterScriptExit
  250. #undef OnFilterScriptExit
  251. #else
  252. #define _ALS_OnFilterScriptExit
  253. #endif
  254. #define OnFilterScriptExit(%0) ScriptInit_OnFilterScriptExit(%0) <_ALS_:hooked>
  255. forward ScriptInit_OnFilterScriptExit();public ScriptInit_OnFilterScriptExit()<_ALS_:unhooked>{return 1;}public ScriptInit_OnFilterScriptExit()<>{return 1;}
  256. forward ScriptInit_OnGameModeExit();public ScriptInit_OnGameModeExit()<_ALS_:unhooked>{return 1;}public ScriptInit_OnGameModeExit()<>{return 1;}
  257. #endif
  258. #define OnScriptInit(%0) ScriptInit_OnScriptInit(%0) <_ALS_:hooked>
  259. #define _ALS_OnScriptInit
  260. forward ScriptInit_OnScriptInit();public ScriptInit_OnScriptInit()<_ALS_:unhooked>{return 1;}public ScriptInit_OnScriptInit()<>{return 1;}
  261. #define OnScriptExit(%0) ScriptInit_OnScriptExit(%0) <_ALS_:hooked>
  262. #define _ALS_OnScriptExit
  263. forward ScriptInit_OnScriptExit();public ScriptInit_OnScriptExit()<_ALS_:unhooked>{return 1;}public ScriptInit_OnScriptExit()<>{return 1;}
  264. //#define _YSI_SpecialInit __YSI_SpecialInit
  265. //#define _ALS__YSI_SpecialInit
  266. //forward _YSI_SpecialInit();
  267. #define _YSI_SpecialExit(%0) __YSI_SpecialExit(%0) <_ALS_:hooked>
  268. #define _ALS__YSI_SpecialExit
  269. //forward _YSI_SpecialExit();
  270. forward __YSI_SpecialExit();public __YSI_SpecialExit()<_ALS_:unhooked>{return 1;}public __YSI_SpecialExit()<>{return 1;}
  271. /*#define OnScriptInitLate(%0) ScriptInit_OnScriptInitLate(%0) <_ALS_:hooked>
  272. forward OnScriptInitLate();public OnScriptInitLate()<_ALS_:unhooked>{return 1;}public OnScriptInitLate()<>{return 1;}
  273. #define OnScriptExitLate(%0) ScriptInit_OnScriptExitLate(%0) <_ALS_:hooked>
  274. forward OnScriptExitLate();public OnScriptExitLate()<_ALS_:unhooked>{return 1;}public OnScriptExitLate()<>{return 1;}
  275. #define OnAnyScriptInit(%0) ScriptInit_OnAnyScriptInit(%0) <_ALS_:hooked>
  276. forward OnAnyScriptInit();public OnAnyScriptInit()<_ALS_:unhooked>{return 1;}public OnAnyScriptInit()<>{return 1;}
  277. #define OnAnyScriptExit(%0) ScriptInit_OnAnyScriptExit(%0) <_ALS_:hooked>
  278. forward OnAnyScriptExit();public OnAnyScriptExit()<_ALS_:unhooked>{return 1;}public OnAnyScriptExit()<>{return 1;}*/
  279. // I'm not quite sure what causes it, but there seems to be a bug in the
  280. // compiler somewhere which messes up the "ysi_debug" automaton and the
  281. // "YSI_FILTERSCRIPT" variable :(.
  282. public _ScriptInit_FixState() <_script_init_fix_state : true>
  283. {
  284. }
  285. public _ScriptInit_FixState() <_script_init_fix_state : false>
  286. {
  287. }