y_scriptinit.inc 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  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. forward _ScriptInit_FixState();
  55. #if defined FILTERSCRIPT
  56. #if !defined YSI_FILTERSCRIPT
  57. stock
  58. bool:YSI_FILTERSCRIPT = true;
  59. #endif
  60. public OnFilterScriptInit()
  61. {
  62. state _script_init_fix_state : true;
  63. //CallLocalFunction("__YSI_SpecialInit", "");
  64. CallLocalFunction("ScriptInit_OnScriptInit", "");
  65. #if defined YSI_LOCK_MODE
  66. if (strlen(YSI_gLockData[5]) !=
  67. floatround(floatlog(_LOCK_LEN_0 + 1), floatround_ceil) + 1 +
  68. floatround(floatlog(_LOCK_LEN_1 + 1), floatround_ceil) + 1 +
  69. floatround(floatlog(_LOCK_LEN_2 + 1), floatround_ceil) + 1 +
  70. floatround(floatlog(_LOCK_LEN_3 + 1), floatround_ceil))
  71. {
  72. y_lock 6;
  73. }
  74. #endif
  75. //CallRemoteFunction("ScriptInit_OnAnyScriptInit", "");
  76. CallLocalFunction("ScriptInit_OnFilterScriptInit", "");
  77. //CallLocalFunction("ScriptInit_OnScriptInitLate", "");
  78. //CallLocalFunction("Text_Special_OnScriptInit", "");
  79. }
  80. #if defined _ALS_OnFilterScriptInit
  81. #undef OnFilterScriptInit
  82. #else
  83. #define _ALS_OnFilterScriptInit
  84. #endif
  85. #define OnFilterScriptInit ScriptInit_OnFilterScriptInit
  86. forward ScriptInit_OnFilterScriptInit();
  87. #else
  88. // People can't be trusted to use "FILTERSCRIPT"...
  89. new
  90. #if !defined YSI_FILTERSCRIPT
  91. bool:YSI_FILTERSCRIPT = false,
  92. #endif
  93. bool:YSI_g_sScriptInitGM,
  94. bool:YSI_g_sScriptExitGM;
  95. public OnFilterScriptInit()
  96. {
  97. state _script_init_fix_state : true;
  98. //printf("OFSI");
  99. YSI_FILTERSCRIPT = true;
  100. //CallLocalFunction("__YSI_SpecialInit", "");
  101. YSI_g_sScriptInitGM = funcidx("ScriptInit_OnGameModeInit") != -1;
  102. YSI_g_sScriptExitGM = funcidx("ScriptInit_OnGameModeExit") != -1;
  103. CallLocalFunction("ScriptInit_OnScriptInit", "");
  104. #if defined YSI_LOCK_MODE
  105. new
  106. str[16];
  107. format(str, sizeof (str), "%c%c%c%c%c%c%c%c%c%c%c", '%', 'd', '.', '%', 'd', '.', '%', 'd', '.', '%', 'd');
  108. format(str, sizeof (str), str, _LOCK_IP_0, _LOCK_IP_1, _LOCK_IP_2, _LOCK_IP_3);
  109. if (strlen(YSI_gLockData[5]) != strlen(str))
  110. {
  111. y_lock 7;
  112. }
  113. #endif
  114. //CallRemoteFunction("ScriptInit_OnAnyScriptInit", "");
  115. CallLocalFunction("ScriptInit_OnFilterScriptInit", "");
  116. //CallLocalFunction("ScriptInit_OnScriptInitLate", "");
  117. }
  118. public OnGameModeInit()
  119. {
  120. if (YSI_FILTERSCRIPT)
  121. {
  122. state _script_init_fix_state : true;
  123. if (YSI_g_sScriptInitGM)
  124. {
  125. CallLocalFunction("ScriptInit_OnGameModeInit", "");
  126. }
  127. }
  128. else
  129. {
  130. state _script_init_fix_state : false;
  131. //CallLocalFunction("__YSI_SpecialInit", "");
  132. CallLocalFunction("ScriptInit_OnScriptInit", "");
  133. #if defined YSI_LOCK_MODE
  134. if (YSI_gLockData[
  135. floatround(floatlog(_LOCK_LEN_0 + 1), floatround_ceil) + 1 +
  136. floatround(floatlog(_LOCK_LEN_1 + 1), floatround_ceil) + 1 +
  137. floatround(floatlog(_LOCK_LEN_2 + 1), floatround_ceil) +
  138. floatround(floatlog(_LOCK_LEN_3 + 1), floatround_ceil)] == '\0'
  139. || YSI_gLockData[
  140. floatround(floatlog(_LOCK_LEN_0 + 1), floatround_ceil) + 1 +
  141. floatround(floatlog(_LOCK_LEN_1 + 1), floatround_ceil) + 1 +
  142. floatround(floatlog(_LOCK_LEN_2 + 1), floatround_ceil) + 1 +
  143. floatround(floatlog(_LOCK_LEN_3 + 1), floatround_ceil) + 1] == '\0')
  144. {
  145. y_lock 8;
  146. }
  147. #endif
  148. //CallRemoteFunction("ScriptInit_OnAnyScriptInit", "");
  149. CallLocalFunction("ScriptInit_OnGameModeInit", "");
  150. //CallLocalFunction("ScriptInit_OnScriptLate", "");
  151. //CallLocalFunction("Text_SpecialInit", "");
  152. }
  153. }
  154. #if defined _ALS_OnGameModeInit
  155. #undef OnGameModeInit
  156. #else
  157. #define _ALS_OnGameModeInit
  158. #endif
  159. #define OnGameModeInit ScriptInit_OnGameModeInit
  160. #if defined _ALS_OnFilterScriptInit
  161. #undef OnFilterScriptInit
  162. #else
  163. #define _ALS_OnFilterScriptInit
  164. #endif
  165. #define OnFilterScriptInit ScriptInit_OnFilterScriptInit
  166. forward ScriptInit_OnFilterScriptInit();
  167. forward ScriptInit_OnGameModeInit();
  168. #endif
  169. #if defined FILTERSCRIPT
  170. public OnFilterScriptExit()
  171. {
  172. CallLocalFunction("ScriptInit_OnScriptExit", "");
  173. //CallRemoteFunction("ScriptInit_OnAnyScriptExit", "");
  174. CallLocalFunction("ScriptInit_OnFilterScriptExit", "");
  175. //CallLocalFunction("ScriptInit_OnScriptExitLate", "");
  176. //CallLocalFunction("__YSI_SpecialExit", "");
  177. }
  178. #if defined _ALS_OnFilterScriptExit
  179. #undef OnFilterScriptExit
  180. #else
  181. #define _ALS_OnFilterScriptExit
  182. #endif
  183. #define OnFilterScriptExit ScriptInit_OnFilterScriptExit
  184. forward ScriptInit_OnFilterScriptExit();
  185. #else
  186. public OnFilterScriptExit()
  187. {
  188. if (YSI_FILTERSCRIPT)
  189. {
  190. CallLocalFunction("ScriptInit_OnScriptExit", "");
  191. //CallRemoteFunction("ScriptInit_OnAnyScriptExit", "");
  192. CallLocalFunction("ScriptInit_OnFilterScriptExit", "");
  193. //CallLocalFunction("ScriptInit_OnScriptExitLate", "");
  194. //CallLocalFunction("__YSI_SpecialExit", "");
  195. }
  196. }
  197. public OnGameModeExit()
  198. {
  199. //printf("ScriptInit_OnGameModeExit");
  200. if (YSI_FILTERSCRIPT)
  201. {
  202. if (YSI_g_sScriptExitGM)
  203. {
  204. CallLocalFunction("ScriptInit_OnGameModeExit", "");
  205. }
  206. }
  207. else
  208. {
  209. //printf("NF 0");
  210. CallLocalFunction("ScriptInit_OnScriptExit", "");
  211. //printf("NF 1");
  212. //CallRemoteFunction("ScriptInit_OnAnyScriptExit", "");
  213. CallLocalFunction("ScriptInit_OnGameModeExit", "");
  214. //printf("NF 2");
  215. //CallLocalFunction("ScriptInit_OnScriptExitLate", "");
  216. CallLocalFunction("__YSI_SpecialExit", "");
  217. }
  218. }
  219. #if defined _ALS_OnGameModeExit
  220. #undef OnGameModeExit
  221. #else
  222. #define _ALS_OnGameModeExit
  223. #endif
  224. #define OnGameModeExit ScriptInit_OnGameModeExit
  225. #if defined _ALS_OnFilterScriptExit
  226. #undef OnFilterScriptExit
  227. #else
  228. #define _ALS_OnFilterScriptExit
  229. #endif
  230. #define OnFilterScriptExit ScriptInit_OnFilterScriptExit
  231. forward ScriptInit_OnFilterScriptExit();
  232. forward ScriptInit_OnGameModeExit();
  233. #endif
  234. #define OnScriptInit ScriptInit_OnScriptInit
  235. #define _ALS_OnScriptInit
  236. forward OnScriptInit();
  237. #define OnScriptExit ScriptInit_OnScriptExit
  238. #define _ALS_OnScriptExit
  239. forward OnScriptExit();
  240. //#define _YSI_SpecialInit __YSI_SpecialInit
  241. //#define _ALS__YSI_SpecialInit
  242. //forward _YSI_SpecialInit();
  243. #define _YSI_SpecialExit __YSI_SpecialExit
  244. #define _ALS__YSI_SpecialExit
  245. forward _YSI_SpecialExit();
  246. /*#define OnScriptInitLate ScriptInit_OnScriptInitLate
  247. forward OnScriptInitLate();
  248. #define OnScriptExitLate ScriptInit_OnScriptExitLate
  249. forward OnScriptExitLate();
  250. #define OnAnyScriptInit ScriptInit_OnAnyScriptInit
  251. forward OnAnyScriptInit();
  252. #define OnAnyScriptExit ScriptInit_OnAnyScriptExit
  253. forward OnAnyScriptExit();*/
  254. // I'm not quite sure what causes it, but there seems to be a bug in the
  255. // compiler somewhere which messes up the "ysi_debug" automaton and the
  256. // "YSI_FILTERSCRIPT" variable :(.
  257. public _ScriptInit_FixState() <_script_init_fix_state : true>
  258. {
  259. }
  260. public _ScriptInit_FixState() <_script_init_fix_state : false>
  261. {
  262. }