Hunting.inc 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898
  1. /**********************************************************************************************************************************
  2. * *
  3. * Hunting System *
  4. * *
  5. * Copyright © 2017 Abyss Morgan. All rights reserved. *
  6. * *
  7. * Download: https://github.com/AbyssMorgan/SA-MP/tree/master/include/engine *
  8. * Publication: http://forum.sa-mp.com/showthread.php?t=639694 *
  9. * Website: http://8.ct8.pl *
  10. * *
  11. * Plugins: Streamer, ColAndreas *
  12. * Modules: 3DTryg *
  13. * *
  14. * File Version: 1.2.1 *
  15. * SA:MP Version: 0.3.7 *
  16. * Streamer Version: 2.9.1 *
  17. * ColAndreas Version: 1.4.0 *
  18. * 3DTryg Version: 4.4.3 *
  19. * *
  20. * Functions: *
  21. * Hunt_Create(type,Float:x,Float:y,Float:z,Float:health,respawntime,worldid=-1,interiorid=-1,playerid=-1, *
  22. * Float:streamdistance=200.0,moving_area = 0); *
  23. * Hunt_Destroy(mobid); *
  24. * Hunt_Respawn(mobid); *
  25. * Hunt_ForceRespawn(mobid,Float:x,Float:y,Float:z); *
  26. * Hunt_Kill(mobid,playerid=INVALID_PLAYER_ID); *
  27. * Hunt_Stop(mobid,delay=-1); *
  28. * Hunt_GoTo(mobid,Float:x,Float:y,bool:disable_moving=false); *
  29. * Hunt_GetDrop(mobid); *
  30. * Hunt_SetDrop(mobid,drop); *
  31. * Hunt_GetPos(mobid,Float:x,Float:y,Float:z); *
  32. * Hunt_SetPos(mobid,Float:x,Float:y,Float:z,bool:disable_moving=false); *
  33. * Hunt_GetScaredRange(mobid); *
  34. * Hunt_SetScaredRange(mobid,Float:range); *
  35. * Hunt_GetHealth(mobid); *
  36. * Hunt_SetHealth(mobid,Float:health); *
  37. * Hunt_GetSpawnHealth(mobid); *
  38. * Hunt_SetSpawnHealth(mobid,Float:health); *
  39. * Hunt_GetRespawnTime(mobid); *
  40. * Hunt_SetRespawnTime(mobid,respawntime); *
  41. * Hunt_GetSpawn(mobid,&Float:x,&Float:y,&Float:z); *
  42. * Hunt_SetSpawn(mobid,Float:x,Float:y,Float:z); *
  43. * Hunt_GetInterior(mobid); *
  44. * Hunt_SetInterior(mobid,interiorid); *
  45. * Hunt_GetVirtualWorld(mobid); *
  46. * Hunt_SetVirtualWorld(mobid,worldid); *
  47. * Hunt_GetSpeed(mobid); *
  48. * Hunt_SetSpeed(mobid,Float:speed); *
  49. * Hunt_GetPressTime(mobid); *
  50. * Hunt_SetPressTime(mobid,miliseconds); *
  51. * Hunt_GetFacingAngle(mobid); *
  52. * Hunt_IsPlayerInRange(playerid,mobid,Float:range); *
  53. * Hunt_IsToggledMoving(mobid); *
  54. * Hunt_ToggleMoving(mobid,toggle); *
  55. * Hunt_IsValid(mobid); *
  56. * Hunt_IsSpawned(mobid); *
  57. * Hunt_IsDead(mobid); *
  58. * Hunt_IsScared(mobid); *
  59. * *
  60. * Extended Functions: *
  61. * Hunt_Count(); *
  62. * Hunt_GetKey(); *
  63. * Hunt_SetKey(key); *
  64. * Hunt_GetFreeID(); *
  65. * Hunt_GetActiveMob(playerid,mob_state); *
  66. * *
  67. * Callbacks: *
  68. * OnPlayerTakeHuntDrop(playerid,mobid,drop); //return 0 set drop flag 0 *
  69. * OnPlayerKillHuntAnimal(playerid,mobid); *
  70. * OnPlayerApproachingAnimal(playerid,mobid,mob_state); *
  71. * OnAnimalTakeDamage(mobid,playerid,Float:amount,weaponid); *
  72. * OnHuntAnimalRespawn(mobid); *
  73. * OnAnimalScareStateChanged(mobid,playerid,isscared); *
  74. * OnPlayerHuntDropStateChange(playerid,mobid,drop_state); *
  75. * *
  76. **********************************************************************************************************************************/
  77. #if ((defined Streamer_AppendArrayData) && (defined INVALID_STREAMER_ID) && (!defined STREAMER_TYPE_ACTOR))
  78. #error [ADM] You need Streamer v2.9.1 (github.com/samp-incognito/samp-streamer-plugin/releases)
  79. #endif
  80. #if !defined COLANDREAS
  81. #error [ADM] You need ColAndreas v1.4.0 (github.com/Pottus/ColAndreas/releases)
  82. #endif
  83. //Check Version 3DTryg.inc
  84. /*#if !defined _3D_Tryg
  85. #error [ADM] You need 3DTryg.inc v4.4.3 (github.com/AbyssMorgan/SA-MP/blob/master/include/SAM/3DTryg.inc)
  86. #elseif !defined Tryg3D_Version
  87. #error [ADM] Update you 3DTryg.inc to v4.4.3 (github.com/AbyssMorgan/SA-MP/blob/master/include/SAM/3DTryg.inc)
  88. #elseif (Tryg3D_Version < 40403)
  89. #error [ADM] Update you 3DTryg.inc to v4.4.3 (github.com/AbyssMorgan/SA-MP/blob/master/include/SAM/3DTryg.inc)
  90. #endif
  91. */
  92. #if defined _hunting_system
  93. #endinput
  94. #endif
  95. #define _hunting_system
  96. #if !defined MAX_HUNTING_ANIMALS
  97. #define MAX_HUNTING_ANIMALS (100)
  98. #endif
  99. #if !defined HUNTING_UPDATE_INTERVAL
  100. #define HUNTING_UPDATE_INTERVAL (500)
  101. #endif
  102. #define HUNT_EXTRA_ID_OFFSET (600000)
  103. #define HUNT_EXTRA_ID_OFFSET_B (HUNT_EXTRA_ID_OFFSET + MAX_HUNTING_ANIMALS)
  104. #define HUNTING_TYPE_COW (19833)
  105. #define HUNTING_TYPE_DEER (19315)
  106. #define HUNTING_STATE_DESTROYED (0)
  107. #define HUNTING_STATE_SPAWNED (1)
  108. #define HUNTING_STATE_DEAD (2)
  109. #define HUNTING_DROP_STATE_FINISH (0)
  110. #define HUNTING_DROP_STATE_START (1)
  111. #define HUNTING_DROP_STATE_INTERRUPT (2)
  112. #define INVALID_HUNTING_ID (0)
  113. #define HUNTING_NO_AUTO_RESPAWN (-1)
  114. enum Hunt_enum {
  115. STREAMER_TAG_OBJECT Hunt_objectid,
  116. STREAMER_TAG_AREA Hunt_drop_area,
  117. STREAMER_TAG_AREA Hunt_scared_area,
  118. STREAMER_TAG_AREA Hunt_areaid,
  119. Hunt_type,
  120. Float:Hunt_health,
  121. Float:Hunt_spawn_health,
  122. Hunt_state,
  123. Hunt_respawntime,
  124. Hunt_drop,
  125. Hunt_respawn_tick,
  126. Float:Hunt_X,
  127. Float:Hunt_Y,
  128. Float:Hunt_Z,
  129. Float:Hunt_tX,
  130. Float:Hunt_tY,
  131. Float:Hunt_rZ,
  132. Float:Hunt_speed,
  133. Hunt_moving,
  134. Hunt_calm,
  135. Hunt_press_time,
  136. Hunt_last_scared,
  137. Hunt_stop_delay
  138. }
  139. new Hunt_Data[MAX_HUNTING_ANIMALS][Hunt_enum],
  140. Hunt_Upperbound = 0,
  141. Hunt_Key = KEY_YES,
  142. Hunt_Timer = -1,
  143. Hunt_PlayerPress[MAX_PLAYERS];
  144. #if defined OnPlayerTakeHuntDrop
  145. forward OnPlayerTakeHuntDrop(playerid,mobid,drop);
  146. #endif
  147. #if defined OnPlayerKillHuntAnimal
  148. forward OnPlayerKillHuntAnimal(playerid,mobid);
  149. #endif
  150. #if defined OnPlayerApproachingAnimal
  151. forward OnPlayerApproachingAnimal(playerid,mobid,mob_state);
  152. #endif
  153. #if defined OnAnimalTakeDamage
  154. forward OnAnimalTakeDamage(mobid,playerid,Float:amount,weaponid);
  155. #endif
  156. #if defined OnHuntAnimalRespawn
  157. forward OnHuntAnimalRespawn(mobid);
  158. #endif
  159. #if defined OnAnimalScareStateChanged
  160. forward OnAnimalScareStateChanged(mobid,playerid,isscared);
  161. #endif
  162. #if defined OnPlayerHuntDropStateChange
  163. forward OnPlayerHuntDropStateChange(playerid,mobid,drop_state);
  164. #endif
  165. #define Hunt_GetKey() Hunt_Key
  166. #define Hunt_SetKey(%0) Hunt_Key = (%0)
  167. #define Hunt_SetDrop(%0,%1) Hunt_Data[(%0)][Hunt_drop] = (%1)
  168. #define Hunt_GetDrop(%0) Hunt_Data[(%0)][Hunt_drop]
  169. #define Hunt_ToggleMoving(%0,%1) Hunt_Data[(%0)][Hunt_moving] = (%1)
  170. #define Hunt_IsToggledMoving(%0) Hunt_Data[(%0)][Hunt_moving]
  171. #define Hunt_GetPos(%0,%1,%2,%3) GetDynamicObjectPos(Hunt_Data[(%0)][Hunt_objectid],(%1),(%2),(%3))
  172. #define Hunt_GetHealth(%0) Hunt_Data[(%0)][Hunt_health]
  173. #define Hunt_SetHealth(%0,%1) Hunt_Data[(%0)][Hunt_health] = (%1)
  174. #define Hunt_GetSpawnHealth(%0) Hunt_Data[(%0)][Hunt_spawn_health]
  175. #define Hunt_SetSpawnHealth(%0,%1) Hunt_Data[(%0)][Hunt_spawn_health] = (%1)
  176. #define Hunt_GetRespawnTime(%0) Hunt_Data[(%0)][Hunt_respawntime]
  177. #define Hunt_SetRespawnTime(%0,%1) Hunt_Data[(%0)][Hunt_respawntime] = (%1)
  178. #define Hunt_IsValid(%0) (Hunt_Data[(%0)][Hunt_state] != HUNTING_STATE_DESTROYED)
  179. #define Hunt_IsSpawned(%0) (Hunt_Data[(%0)][Hunt_state] == HUNTING_STATE_SPAWNED)
  180. #define Hunt_IsDead(%0) (Hunt_Data[(%0)][Hunt_state] == HUNTING_STATE_DEAD)
  181. #define Hunt_GetSpeed(%0) Hunt_Data[(%0)][Hunt_speed]
  182. #define Hunt_SetSpeed(%0,%1) Hunt_Data[(%0)][Hunt_speed] = (%1)
  183. #define Hunt_GetPressTime(%0) Hunt_Data[(%0)][Hunt_press_time]
  184. #define Hunt_SetPressTime(%0,%1) Hunt_Data[(%0)][Hunt_press_time] = (%1)
  185. #define Hunt_IsScared(%0) (Hunt_Data[(%0)][Hunt_calm] != 0)
  186. stock Hunt_Count(){
  187. new cnt = 0;
  188. for(new mobid = 1; mobid <= Hunt_Upperbound; mobid++){
  189. if(Hunt_IsValid(mobid)) cnt++;
  190. }
  191. return cnt;
  192. }
  193. stock Hunt_GetFreeID(){
  194. for(new mobid = 1; mobid < MAX_HUNTING_ANIMALS; mobid++){
  195. if(!Hunt_IsValid(mobid)) return mobid;
  196. }
  197. return INVALID_HUNTING_ID;
  198. }
  199. stock Hunt_Construct(){
  200. new Hunt_data_construct[Hunt_enum];
  201. Hunt_data_construct[Hunt_speed] = 0.8;
  202. Hunt_data_construct[Hunt_last_scared] = INVALID_PLAYER_ID;
  203. return Hunt_data_construct;
  204. }
  205. stock Hunt_Stop(mobid,delay=-1){
  206. if(mobid <= 0 || mobid >= MAX_HUNTING_ANIMALS) return 0;
  207. if(delay > 0){
  208. Hunt_ToggleMoving(mobid,0);
  209. Hunt_Data[mobid][Hunt_stop_delay] = GetTickCount() + delay;
  210. } else {
  211. Hunt_Data[mobid][Hunt_stop_delay] = 0;
  212. if(delay != -1) Hunt_ToggleMoving(mobid,0);
  213. }
  214. StopDynamicObject(Hunt_Data[mobid][Hunt_objectid]);
  215. return 1;
  216. }
  217. stock Hunt_SetSpawn(mobid,Float:xx,Float:xy,Float:xz){
  218. if(mobid <= 0 || mobid >= MAX_HUNTING_ANIMALS) return 0;
  219. if(!Hunt_IsValid(mobid)) return 0;
  220. Hunt_Data[mobid][Hunt_X] = xx;
  221. Hunt_Data[mobid][Hunt_Y] = xy;
  222. Hunt_Data[mobid][Hunt_Z] = xz;
  223. return 1;
  224. }
  225. stock Hunt_GetSpawn(mobid,&Float:xx,&Float:xy,&Float:xz){
  226. if(mobid <= 0 || mobid >= MAX_HUNTING_ANIMALS) return 0;
  227. if(!Hunt_IsValid(mobid)) return 0;
  228. xx = Hunt_Data[mobid][Hunt_X];
  229. xy = Hunt_Data[mobid][Hunt_Y];
  230. xz = Hunt_Data[mobid][Hunt_Z];
  231. return 1;
  232. }
  233. stock Float:Hunt_GetScaredRange(mobid){
  234. if(mobid <= 0 || mobid >= MAX_HUNTING_ANIMALS) return 0.0;
  235. if(!Hunt_IsValid(mobid)) return 0.0;
  236. new Float:Hunt_range;
  237. Streamer_GetFloatData(STREAMER_TYPE_AREA,Hunt_Data[mobid][Hunt_scared_area],E_STREAMER_SIZE,Hunt_range);
  238. return Hunt_range;
  239. }
  240. stock Hunt_SetScaredRange(mobid,Float:range){
  241. if(mobid <= 0 || mobid >= MAX_HUNTING_ANIMALS) return 0;
  242. if(!Hunt_IsValid(mobid)) return 0;
  243. Streamer_SetFloatData(STREAMER_TYPE_AREA,Hunt_Data[mobid][Hunt_scared_area],E_STREAMER_SIZE,range);
  244. return 1;
  245. }
  246. stock Hunt_GetInterior(mobid){
  247. if(mobid <= 0 || mobid >= MAX_HUNTING_ANIMALS) return 0;
  248. if(!Hunt_IsValid(mobid)) return 0;
  249. return Streamer_GetIntData(STREAMER_TYPE_OBJECT,Hunt_Data[mobid][Hunt_objectid],E_STREAMER_INTERIOR_ID);
  250. }
  251. stock Hunt_SetInterior(mobid,interiorid){
  252. if(mobid <= 0 || mobid >= MAX_HUNTING_ANIMALS) return 0;
  253. if(!Hunt_IsValid(mobid)) return 0;
  254. Streamer_SetIntData(STREAMER_TYPE_OBJECT,Hunt_Data[mobid][Hunt_objectid],E_STREAMER_INTERIOR_ID,interiorid);
  255. Streamer_SetIntData(STREAMER_TYPE_AREA,Hunt_Data[mobid][Hunt_drop_area],E_STREAMER_INTERIOR_ID,interiorid);
  256. Streamer_SetIntData(STREAMER_TYPE_AREA,Hunt_Data[mobid][Hunt_scared_area],E_STREAMER_INTERIOR_ID,interiorid);
  257. return 1;
  258. }
  259. stock Hunt_GetVirtualWorld(mobid){
  260. if(mobid <= 0 || mobid >= MAX_HUNTING_ANIMALS) return 0;
  261. if(!Hunt_IsValid(mobid)) return 0;
  262. return Streamer_GetIntData(STREAMER_TYPE_OBJECT,Hunt_Data[mobid][Hunt_objectid],E_STREAMER_WORLD_ID);
  263. }
  264. stock Hunt_SetVirtualWorld(mobid,worldid){
  265. if(mobid <= 0 || mobid >= MAX_HUNTING_ANIMALS) return 0;
  266. if(!Hunt_IsValid(mobid)) return 0;
  267. Streamer_SetIntData(STREAMER_TYPE_OBJECT,Hunt_Data[mobid][Hunt_objectid],E_STREAMER_WORLD_ID,worldid);
  268. Streamer_SetIntData(STREAMER_TYPE_AREA,Hunt_Data[mobid][Hunt_drop_area],E_STREAMER_WORLD_ID,worldid);
  269. Streamer_SetIntData(STREAMER_TYPE_AREA,Hunt_Data[mobid][Hunt_scared_area],E_STREAMER_WORLD_ID,worldid);
  270. return 1;
  271. }
  272. stock Hunt_GoTo(mobid,Float:x,Float:y,bool:disable_moving=false){
  273. if(mobid <= 0 || mobid >= MAX_HUNTING_ANIMALS) return 0;
  274. if(!Hunt_IsSpawned(mobid)) return 0;
  275. new Float:z;
  276. MapAndreas48FindZ(x,y,z);
  277. if(IsPointInWater(x,y,z)) return 0;
  278. if(Hunt_Data[mobid][Hunt_areaid] != STREAMER_TAG_AREA INVALID_STREAMER_ID){
  279. if(!IsPointInDynamicArea(Hunt_Data[mobid][Hunt_areaid],x,y,z)) return 0;
  280. }
  281. new F4[Vectors3D], tmp_moving = Hunt_IsToggledMoving(mobid);
  282. Hunt_ToggleMoving(mobid,0);
  283. Hunt_Stop(mobid);
  284. Hunt_GetPos(mobid,F4[T3D:X],F4[T3D:Y],F4[T3D:Z]);
  285. Hunt_Data[mobid][Hunt_tX] = x;
  286. Hunt_Data[mobid][Hunt_tY] = y;
  287. GetRotationFor2Point2D(F4[T3D:X],F4[T3D:Y],x,y,Hunt_Data[mobid][Hunt_rZ]);
  288. if(!disable_moving){
  289. Hunt_ToggleMoving(mobid,1);
  290. } else {
  291. Hunt_ToggleMoving(mobid,tmp_moving);
  292. }
  293. return 1;
  294. }
  295. stock Hunt_SetPos(mobid,Float:x,Float:y,Float:z,bool:disable_moving=false){
  296. if(mobid <= 0 || mobid >= MAX_HUNTING_ANIMALS) return 0;
  297. if(!Hunt_IsSpawned(mobid)) return 0;
  298. if(IsPointInWater(x,y,z)) return 0;
  299. if(Hunt_Data[mobid][Hunt_areaid] != STREAMER_TAG_AREA INVALID_STREAMER_ID){
  300. if(!IsPointInDynamicArea(Hunt_Data[mobid][Hunt_areaid],x,y,z)) return 0;
  301. }
  302. new tmp_moving = Hunt_IsToggledMoving(mobid);
  303. Hunt_ToggleMoving(mobid,0);
  304. Hunt_Stop(mobid);
  305. SetDynamicObjectPos(Hunt_Data[mobid][Hunt_objectid],x,y,z);
  306. Hunt_Data[mobid][Hunt_tX] = x;
  307. Hunt_Data[mobid][Hunt_tY] = y;
  308. if(!disable_moving){
  309. Hunt_ToggleMoving(mobid,1);
  310. } else {
  311. Hunt_ToggleMoving(mobid,tmp_moving);
  312. }
  313. return 1;
  314. }
  315. stock Hunt_Create(type,Float:x,Float:y,Float:z,Float:health,respawntime,worldid=-1,interiorid=-1,playerid=-1,Float:streamdistance=200.0){
  316. new mobid = Hunt_GetFreeID();
  317. if(mobid == INVALID_HUNTING_ID){
  318. printf("[ADM] Error: Failed to Hunt_Create limit %d exceeded, add #define MAX_HUNTING_ANIMALS before Hunting.inc",MAX_HUNTING_ANIMALS);
  319. return mobid;
  320. }
  321. new moving_area = CreateDynamicRectangle(2085.0176, 52.4910,1945.4626, 142.9483);
  322. if(moving_area != STREAMER_TAG_AREA INVALID_STREAMER_ID){
  323. if(!IsPointInDynamicArea(moving_area,x,y,z)){
  324. printf("[ADM] Error: Failed to Hunt_Create(%d,%f,%f,%f,...) position out of moving_area",type,x,y,z);
  325. return INVALID_HUNTING_ID;
  326. }
  327. }
  328. if(IsPointInWater(x,y,z) || IsPointInUnderground(x,y,z)){
  329. printf("[ADM] Error: Failed to Hunt_Create(%d,%f,%f,%f,...) position out of world",type,x,y,z);
  330. return INVALID_HUNTING_ID;
  331. }
  332. Hunt_Data[mobid] = Hunt_Construct();
  333. new Float:tmp_float,Float:target_z;
  334. MovePointCol(x,y,z+1.0,x,y,-100.0,tmp_float,tmp_float,target_z);
  335. z = target_z;
  336. switch(type){
  337. case HUNTING_TYPE_COW: {
  338. Hunt_Data[mobid][Hunt_objectid] = CreateDynamicObject(type,x,y,z,0.0,0.0,184.0,worldid,interiorid,playerid,streamdistance);
  339. }
  340. case HUNTING_TYPE_DEER: {
  341. z += 0.5;
  342. Hunt_Data[mobid][Hunt_objectid] = CreateDynamicObject(type,x,y,z,0.0,0.0,90.0,worldid,interiorid,playerid,streamdistance);
  343. }
  344. }
  345. Hunt_Data[mobid][Hunt_drop_area] = CreateDynamicSphere(x,y,z,3.0,worldid,interiorid,playerid);
  346. Hunt_Data[mobid][Hunt_scared_area] = CreateDynamicSphere(x,y,z,5.0,worldid,interiorid,playerid);
  347. AttachDynamicAreaToObject(Hunt_Data[mobid][Hunt_drop_area],Hunt_Data[mobid][Hunt_objectid]);
  348. AttachDynamicAreaToObject(Hunt_Data[mobid][Hunt_scared_area],Hunt_Data[mobid][Hunt_objectid]);
  349. Streamer_SetIntData(STREAMER_TYPE_OBJECT,Hunt_Data[mobid][Hunt_objectid],E_STREAMER_EXTRA_ID,(mobid+HUNT_EXTRA_ID_OFFSET));
  350. Streamer_SetIntData(STREAMER_TYPE_AREA,Hunt_Data[mobid][Hunt_drop_area],E_STREAMER_EXTRA_ID,(mobid+HUNT_EXTRA_ID_OFFSET));
  351. Streamer_SetIntData(STREAMER_TYPE_AREA,Hunt_Data[mobid][Hunt_scared_area],E_STREAMER_EXTRA_ID,(mobid+HUNT_EXTRA_ID_OFFSET_B));
  352. Hunt_Data[mobid][Hunt_areaid] = moving_area;
  353. Hunt_Data[mobid][Hunt_type] = type;
  354. Hunt_Data[mobid][Hunt_respawntime] = respawntime;
  355. Hunt_Data[mobid][Hunt_health] = health;
  356. Hunt_Data[mobid][Hunt_spawn_health] = health;
  357. Hunt_Data[mobid][Hunt_drop] = 1;
  358. Hunt_Data[mobid][Hunt_tX] = x;
  359. Hunt_Data[mobid][Hunt_tY] = y;
  360. Hunt_Data[mobid][Hunt_moving] = 1;
  361. Hunt_Data[mobid][Hunt_speed] = 0.8;
  362. Hunt_SetSpawn(mobid,x,y,z);
  363. if(mobid > Hunt_Upperbound) Hunt_Upperbound = mobid;
  364. Hunt_Data[mobid][Hunt_state] = HUNTING_STATE_SPAWNED;
  365. printf("Bixo Criado");
  366. return mobid;
  367. }
  368. stock Hunt_Destroy(mobid){
  369. if(mobid <= 0 || mobid >= MAX_HUNTING_ANIMALS) return 0;
  370. if(!Hunt_IsValid(mobid)) return 0;
  371. Hunt_Data[mobid][Hunt_state] = HUNTING_STATE_DESTROYED;
  372. if(IsValidDynamicObject(Hunt_Data[mobid][Hunt_objectid])) DestroyDynamicObject(Hunt_Data[mobid][Hunt_objectid]);
  373. if(IsValidDynamicArea(Hunt_Data[mobid][Hunt_drop_area])) DestroyDynamicArea(Hunt_Data[mobid][Hunt_drop_area]);
  374. if(IsValidDynamicArea(Hunt_Data[mobid][Hunt_scared_area])) DestroyDynamicArea(Hunt_Data[mobid][Hunt_scared_area]);
  375. Hunt_Data[mobid] = Hunt_Construct();
  376. if(mobid == Hunt_Upperbound) Hunt_Upperbound--;
  377. return 1;
  378. }
  379. stock Hunt_Respawn(mobid){
  380. if(mobid <= 0 || mobid >= MAX_HUNTING_ANIMALS) return 0;
  381. if(!Hunt_IsValid(mobid)) return 0;
  382. Hunt_Data[mobid][Hunt_respawn_tick] = 0;
  383. if(Hunt_IsSpawned(mobid)){
  384. Hunt_Data[mobid][Hunt_state] = HUNTING_STATE_DEAD;
  385. Hunt_Stop(mobid);
  386. }
  387. Hunt_Data[mobid][Hunt_health] = Hunt_Data[mobid][Hunt_spawn_health];
  388. Hunt_SetDrop(mobid,1);
  389. SetDynamicObjectMaterial(Hunt_Data[mobid][Hunt_objectid],0,0,"","",0);
  390. SetDynamicObjectMaterial(Hunt_Data[mobid][Hunt_objectid],1,0,"","",0);
  391. new modelid = Streamer_GetIntData(STREAMER_TYPE_OBJECT,Hunt_Data[mobid][Hunt_objectid],E_STREAMER_MODEL_ID);
  392. Streamer_SetIntData(STREAMER_TYPE_OBJECT,Hunt_Data[mobid][Hunt_objectid],E_STREAMER_MODEL_ID,modelid);
  393. new Float:tmp_float,Float:target_z;
  394. MovePointCol(Hunt_Data[mobid][Hunt_X],Hunt_Data[mobid][Hunt_Y],Hunt_Data[mobid][Hunt_Z]+1.0,Hunt_Data[mobid][Hunt_X],Hunt_Data[mobid][Hunt_Y],-100.0,tmp_float,tmp_float,target_z);
  395. switch(Hunt_Data[mobid][Hunt_type]){
  396. case HUNTING_TYPE_DEER: target_z += 0.5;
  397. }
  398. SetDynamicObjectPos(Hunt_Data[mobid][Hunt_objectid],Hunt_Data[mobid][Hunt_X],Hunt_Data[mobid][Hunt_Y],target_z);
  399. Hunt_Data[mobid][Hunt_tX] = Hunt_Data[mobid][Hunt_X];
  400. Hunt_Data[mobid][Hunt_tY] = Hunt_Data[mobid][Hunt_Y];
  401. switch(Hunt_Data[mobid][Hunt_type]){
  402. case HUNTING_TYPE_COW: {
  403. SetDynamicObjectRot(Hunt_Data[mobid][Hunt_objectid],0.0,0.0,184.0);
  404. }
  405. case HUNTING_TYPE_DEER: {
  406. SetDynamicObjectRot(Hunt_Data[mobid][Hunt_objectid],0.0,0.0,90.0);
  407. }
  408. }
  409. Hunt_Data[mobid][Hunt_state] = HUNTING_STATE_SPAWNED;
  410. #if defined OnHuntAnimalRespawn
  411. OnHuntAnimalRespawn(mobid);
  412. #endif
  413. return 1;
  414. }
  415. stock Hunt_IsPlayerInRange(playerid,mobid,Float:range){
  416. if(mobid <= 0 || mobid >= MAX_HUNTING_ANIMALS) return 0;
  417. if(!Hunt_IsValid(mobid)) return 0;
  418. if(!IsPlayerConnected(playerid)) return 0;
  419. return (GetElementsDistance(playerid,item_player,Hunt_Data[mobid][Hunt_objectid],item_dynamic_object) <= range);
  420. }
  421. stock Float:Hunt_GetFacingAngle(mobid){
  422. if(mobid <= 0 || mobid >= MAX_HUNTING_ANIMALS) return 0;
  423. if(!Hunt_IsValid(mobid)) return 0;
  424. switch(Hunt_Data[mobid][Hunt_type]){
  425. case HUNTING_TYPE_COW: return CompRotationFloat(Hunt_Data[mobid][Hunt_rZ]+184.0);
  426. case HUNTING_TYPE_DEER: return CompRotationFloat(Hunt_Data[mobid][Hunt_rZ]+90.0);
  427. }
  428. return 1;
  429. }
  430. stock Hunt_ForceRespawn(mobid,Float:x,Float:y,Float:z){
  431. if(mobid <= 0 || mobid >= MAX_HUNTING_ANIMALS) return 0;
  432. if(!Hunt_IsValid(mobid)) return 0;
  433. Hunt_SetSpawn(mobid,x,y,z);
  434. return Hunt_Respawn(mobid);
  435. }
  436. stock Hunt_Kill(mobid,playerid=INVALID_PLAYER_ID){
  437. if(mobid <= 0 || mobid >= MAX_HUNTING_ANIMALS) return 0;
  438. if(!Hunt_IsSpawned(mobid)) return 0;
  439. Hunt_Data[mobid][Hunt_state] = HUNTING_STATE_DEAD;
  440. Hunt_Data[mobid][Hunt_health] = 0.0;
  441. #if defined OnAnimalScareStateChanged
  442. if(Hunt_IsScared(mobid)){
  443. OnAnimalScareStateChanged(mobid,Hunt_Data[mobid][Hunt_last_scared],0);
  444. }
  445. #endif
  446. Hunt_Data[mobid][Hunt_calm] = 0;
  447. Hunt_Data[mobid][Hunt_last_scared] = INVALID_PLAYER_ID;
  448. Hunt_Stop(mobid);
  449. SetDynamicObjectMaterial(Hunt_Data[mobid][Hunt_objectid],0,2806,"CJ_MEATY","CJ_FLESH_1",0);
  450. SetDynamicObjectMaterial(Hunt_Data[mobid][Hunt_objectid],1,2806,"CJ_MEATY","CJ_FLESH_1",0);
  451. new Float:tmp_float,Float:target_z,Float:x,Float:y,Float:z;
  452. Hunt_GetPos(mobid,x,y,z);
  453. Hunt_SetPos(mobid,x,y,z);
  454. MovePointCol(x,y,z+1.0,x,y,-100.0,tmp_float,tmp_float,target_z);
  455. switch(Hunt_Data[mobid][Hunt_type]){
  456. case HUNTING_TYPE_COW: {
  457. MoveDynamicObject(Hunt_Data[mobid][Hunt_objectid],x,y,target_z+0.3,0.5,0.0,90.0);
  458. }
  459. case HUNTING_TYPE_DEER: {
  460. MoveDynamicObject(Hunt_Data[mobid][Hunt_objectid],x,y,target_z+0.1,0.5,270.0);
  461. }
  462. }
  463. Hunt_Data[mobid][Hunt_respawn_tick] = GetTickCount() + (1000 * Hunt_Data[mobid][Hunt_respawntime]);
  464. #if defined OnPlayerKillHuntAnimal
  465. OnPlayerKillHuntAnimal(playerid,mobid);
  466. #endif
  467. return 1;
  468. }
  469. stock Hunt_GetActiveMob(playerid,mob_state){
  470. new max_areas = GetPlayerNumberDynamicAreas(playerid);
  471. if(max_areas){
  472. new STREAMER_TAG_AREA player_areas[64], mobid;
  473. GetPlayerDynamicAreas(playerid,player_areas,max_areas);
  474. for(new k = 0; k < max_areas; k++){
  475. mobid = Streamer_GetIntData(STREAMER_TYPE_AREA,player_areas[k],E_STREAMER_EXTRA_ID)-HUNT_EXTRA_ID_OFFSET;
  476. if(mobid > 0 && mobid < MAX_HUNTING_ANIMALS){
  477. if(player_areas[k] == Hunt_Data[mobid][Hunt_drop_area]){
  478. if(mob_state == Hunt_Data[mobid][Hunt_state]){
  479. return mobid;
  480. }
  481. }
  482. }
  483. mobid = INVALID_HUNTING_ID;
  484. }
  485. }
  486. return INVALID_HUNTING_ID;
  487. }
  488. stock Hunt_OnUpdate(){
  489. static Float:tmp_float,Float:target_z,
  490. Float:x,Float:y,Float:z,
  491. Float:tx,Float:ty,
  492. Float:vx,Float:vy,Float:vz;
  493. for(new mobid = 1; mobid <= Hunt_Upperbound; mobid++){
  494. switch(Hunt_Data[mobid][Hunt_state]){
  495. case HUNTING_STATE_SPAWNED: {
  496. target_z = 0.0;
  497. Hunt_GetPos(mobid,x,y,z);
  498. MovePointCol(x,y,z+1.0,x,y,-100.0,tmp_float,tmp_float,target_z);
  499. if(Hunt_IsToggledMoving(mobid)){
  500. if(GetDistanceBetweenPoints2D(Hunt_Data[mobid][Hunt_tX],Hunt_Data[mobid][Hunt_tY],x,y) == 0.0){
  501. for(;;){
  502. vx = vy = vz = 0.0;
  503. GetRandomPointInCircle(x,y,25.0,tx,ty);
  504. MovePointColCutLineEx(x,y,z+1.0,tx,ty,z+1.0,vx,vy,vz,3.0);
  505. if(GetDistanceBetweenPoints2D(x,y,vx,vy) <= 2.0) continue;
  506. if(IsPointInWater(vx,vy,vz)) continue;
  507. if(Hunt_Data[mobid][Hunt_areaid] != STREAMER_TAG_AREA INVALID_STREAMER_ID){
  508. if(!IsPointInDynamicArea(Hunt_Data[mobid][Hunt_areaid],vx,vy,vz)) continue;
  509. }
  510. if(Hunt_Data[mobid][Hunt_last_scared] != INVALID_PLAYER_ID){
  511. if(IsPlayerInRangeOfPoint(Hunt_Data[mobid][Hunt_last_scared],5.0,vx,vy,vz)) continue;
  512. }
  513. Hunt_Data[mobid][Hunt_tX] = vx;
  514. Hunt_Data[mobid][Hunt_tY] = vy;
  515. GetRotationFor2Point2D(x,y,vx,vy,Hunt_Data[mobid][Hunt_rZ]);
  516. break;
  517. }
  518. }
  519. } else {
  520. if(Hunt_Data[mobid][Hunt_stop_delay] != 0 && GetTickCount() >= Hunt_Data[mobid][Hunt_stop_delay]){
  521. Hunt_Data[mobid][Hunt_stop_delay] = 0;
  522. Hunt_ToggleMoving(mobid,1);
  523. }
  524. }
  525. if(GetTickCount() >= Hunt_Data[mobid][Hunt_calm] && Hunt_Data[mobid][Hunt_calm] != 0){
  526. Hunt_SetSpeed(mobid,0.8);
  527. #if defined OnAnimalScareStateChanged
  528. if(Hunt_IsScared(mobid)){
  529. OnAnimalScareStateChanged(mobid,Hunt_Data[mobid][Hunt_last_scared],0);
  530. }
  531. #endif
  532. Hunt_Data[mobid][Hunt_calm] = 0;
  533. Hunt_Data[mobid][Hunt_last_scared] = INVALID_PLAYER_ID;
  534. }
  535. switch(Hunt_Data[mobid][Hunt_type]){
  536. case HUNTING_TYPE_COW: {
  537. SetDynamicObjectPos(Hunt_Data[mobid][Hunt_objectid],x,y,target_z);
  538. SetDynamicObjectRot(Hunt_Data[mobid][Hunt_objectid],0.0,0.0,CompRotationFloat(Hunt_Data[mobid][Hunt_rZ]+184.0));
  539. MoveDynamicObject(Hunt_Data[mobid][Hunt_objectid],Hunt_Data[mobid][Hunt_tX],Hunt_Data[mobid][Hunt_tY],target_z,Hunt_GetSpeed(mobid));
  540. }
  541. case HUNTING_TYPE_DEER: {
  542. SetDynamicObjectPos(Hunt_Data[mobid][Hunt_objectid],x,y,target_z+0.5);
  543. SetDynamicObjectRot(Hunt_Data[mobid][Hunt_objectid],0.0,0.0,CompRotationFloat(Hunt_Data[mobid][Hunt_rZ]+90.0));
  544. MoveDynamicObject(Hunt_Data[mobid][Hunt_objectid],Hunt_Data[mobid][Hunt_tX],Hunt_Data[mobid][Hunt_tY],target_z+0.5,Hunt_GetSpeed(mobid));
  545. }
  546. }
  547. }
  548. case HUNTING_STATE_DEAD: {
  549. if(Hunt_Data[mobid][Hunt_respawntime] != HUNTING_NO_AUTO_RESPAWN){
  550. if(Hunt_Data[mobid][Hunt_respawn_tick] != 0 && GetTickCount() >= Hunt_Data[mobid][Hunt_respawn_tick]){
  551. Hunt_Respawn(mobid);
  552. }
  553. }
  554. }
  555. }
  556. }
  557. return 1;
  558. }
  559. new const Float:WeaponHuntingDamage[] = {
  560. 1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,82.5,0.0,1.0,9.9,46.2,0.0,8.25,13.2,46.2,3.3,3.3,4.95,6.6,8.25,
  561. 9.9,9.9,6.6,24.75,41.25,82.5,82.5,1.0,46.2,82.5,0.0,0.33,0.33,0.0,0.0,0.0,0.0,0.0,2.64,9.9,330.0,82.5,1.0,1.0,165.0
  562. };
  563. //Hook: OnPlayerShootDynamicObject
  564. public OnPlayerShootDynamicObject(playerid, weaponid, STREAMER_TAG_OBJECT objectid, Float:x, Float:y, Float:z){
  565. new mobid = (Streamer_GetIntData(STREAMER_TYPE_OBJECT,objectid,E_STREAMER_EXTRA_ID)-HUNT_EXTRA_ID_OFFSET);
  566. if(mobid > 0 && mobid < MAX_HUNTING_ANIMALS){
  567. if(Hunt_Data[mobid][Hunt_objectid] == objectid && Hunt_IsSpawned(mobid)){
  568. Hunt_SetSpeed(mobid,8.0);
  569. Hunt_Data[mobid][Hunt_last_scared] = playerid;
  570. #if defined OnAnimalScareStateChanged
  571. if(!Hunt_IsScared(mobid)){
  572. OnAnimalScareStateChanged(mobid,playerid,1);
  573. }
  574. #endif
  575. Hunt_Data[mobid][Hunt_calm] = GetTickCount() + 30000;
  576. #if defined OnAnimalTakeDamage
  577. if(OnAnimalTakeDamage(mobid,playerid,WeaponHuntingDamage[weaponid],weaponid)){
  578. Hunt_Data[mobid][Hunt_health] -= WeaponHuntingDamage[weaponid];
  579. }
  580. #else
  581. Hunt_Data[mobid][Hunt_health] -= WeaponHuntingDamage[weaponid];
  582. #endif
  583. if(Hunt_Data[mobid][Hunt_health] <= 0.0){
  584. Hunt_Kill(mobid,playerid);
  585. }
  586. }
  587. }
  588. #if defined HUN_OnPlayerShootDynamicObject
  589. HUN_OnPlayerShootDynamicObject(playerid, weaponid, objectid, x, y, z);
  590. #endif
  591. return 1;
  592. }
  593. #if defined _ALS_OnPlayerShootDynamicObject
  594. #undef OnPlayerShootDynamicObject
  595. #else
  596. #define _ALS_OnPlayerShootDynamicObject
  597. #endif
  598. #define OnPlayerShootDynamicObject HUN_OnPlayerShootDynamicObject
  599. #if defined HUN_OnPlayerShootDynamicObject
  600. forward HUN_OnPlayerShootDynamicObject(playerid, weaponid, STREAMER_TAG_OBJECT objectid, Float:x, Float:y, Float:z);
  601. #endif
  602. //Hook: OnPlayerEnterDynamicArea
  603. public OnPlayerEnterDynamicArea(playerid, STREAMER_TAG_AREA areaid){
  604. new Hunt_extraid = Streamer_GetIntData(STREAMER_TYPE_AREA,areaid,E_STREAMER_EXTRA_ID), mobid;
  605. mobid = (Hunt_extraid - HUNT_EXTRA_ID_OFFSET);
  606. if(mobid > 0 && mobid < MAX_HUNTING_ANIMALS){
  607. if(Hunt_Data[mobid][Hunt_drop_area] == areaid){
  608. #if defined OnPlayerApproachingAnimal
  609. OnPlayerApproachingAnimal(playerid,mobid,Hunt_Data[mobid][Hunt_state]);
  610. #endif
  611. }
  612. }
  613. mobid = (Hunt_extraid - HUNT_EXTRA_ID_OFFSET_B);
  614. if(mobid > 0 && mobid < MAX_HUNTING_ANIMALS){
  615. if(Hunt_Data[mobid][Hunt_scared_area] == areaid){
  616. if(Hunt_Data[mobid][Hunt_state] == HUNTING_STATE_SPAWNED){
  617. Hunt_SetSpeed(mobid,8.0);
  618. Hunt_Data[mobid][Hunt_last_scared] = playerid;
  619. #if defined OnAnimalScareStateChanged
  620. if(!Hunt_IsScared(mobid)){
  621. OnAnimalScareStateChanged(mobid,playerid,1);
  622. }
  623. #endif
  624. Hunt_Data[mobid][Hunt_calm] = GetTickCount() + 30000;
  625. }
  626. }
  627. }
  628. #if defined HUN_OnPlayerEnterDynamicArea
  629. HUN_OnPlayerEnterDynamicArea(playerid, areaid);
  630. #endif
  631. return 1;
  632. }
  633. #if defined _ALS_OnPlayerEnterDynamicArea
  634. #undef OnPlayerEnterDynamicArea
  635. #else
  636. #define _ALS_OnPlayerEnterDynamicArea
  637. #endif
  638. #define OnPlayerEnterDynamicArea HUN_OnPlayerEnterDynamicArea
  639. #if defined HUN_OnPlayerEnterDynamicArea
  640. forward HUN_OnPlayerEnterDynamicArea(playerid, STREAMER_TAG_AREA areaid);
  641. #endif
  642. #define Tryg3D_KeyPressed(%0) (((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
  643. #define Tryg3D_KeyReleased(%0) (((newkeys & (%0)) != (%0)) && ((oldkeys & (%0)) == (%0)))
  644. #define Tryg3D_KeyHolding(%0) ((newkeys & (%0)) == (%0))
  645. //Hook: OnPlayerKeyStateChange
  646. public OnPlayerKeyStateChange(playerid,newkeys,oldkeys){
  647. if(Tryg3D_KeyPressed(Hunt_Key)){
  648. new mobid = Hunt_GetActiveMob(playerid,HUNTING_STATE_DEAD);
  649. if(Hunt_GetPressTime(mobid) == 0){
  650. #if defined OnPlayerTakeHuntDrop
  651. Hunt_Data[mobid][Hunt_drop] = OnPlayerTakeHuntDrop(playerid,mobid,Hunt_Data[mobid][Hunt_drop]);
  652. #endif
  653. } else {
  654. #if defined OnPlayerHuntDropStateChange
  655. OnPlayerHuntDropStateChange(playerid,mobid,HUNTING_DROP_STATE_START);
  656. #endif
  657. Hunt_PlayerPress[playerid] = GetTickCount() + Hunt_GetPressTime(mobid);
  658. }
  659. }
  660. if(Tryg3D_KeyReleased(Hunt_Key)){
  661. if(GetTickCount() >= Hunt_PlayerPress[playerid] && Hunt_PlayerPress[playerid] != 0){
  662. Hunt_PlayerPress[playerid] = 0;
  663. new mobid = Hunt_GetActiveMob(playerid,HUNTING_STATE_DEAD);
  664. if(Hunt_GetPressTime(mobid) > 0){
  665. #if defined OnPlayerHuntDropStateChange
  666. OnPlayerHuntDropStateChange(playerid,mobid,HUNTING_DROP_STATE_FINISH);
  667. #endif
  668. #if defined OnPlayerTakeHuntDrop
  669. Hunt_Data[mobid][Hunt_drop] = OnPlayerTakeHuntDrop(playerid,mobid,Hunt_Data[mobid][Hunt_drop]);
  670. #endif
  671. }
  672. } else {
  673. #if defined OnPlayerHuntDropStateChange
  674. new mobid = Hunt_GetActiveMob(playerid,HUNTING_STATE_DEAD);
  675. if(Hunt_GetPressTime(mobid) > 0){
  676. OnPlayerHuntDropStateChange(playerid,mobid,HUNTING_DROP_STATE_INTERRUPT);
  677. }
  678. #endif
  679. }
  680. }
  681. #if defined HUN_OnPlayerKeyStateChange
  682. HUN_OnPlayerKeyStateChange(playerid,newkeys,oldkeys);
  683. #endif
  684. return 1;
  685. }
  686. #if defined _ALS_OnPlayerKeyStateChange
  687. #undef OnPlayerKeyStateChange
  688. #else
  689. #define _ALS_OnPlayerKeyStateChange
  690. #endif
  691. #define OnPlayerKeyStateChange HUN_OnPlayerKeyStateChange
  692. #if defined HUN_OnPlayerKeyStateChange
  693. forward HUN_OnPlayerKeyStateChange(playerid,newkeys,oldkeys);
  694. #endif
  695. new bool:CRC_HuntingInit = true,
  696. bool:CRC_HuntingExit = true;
  697. //Hook: OnFilterScriptInit
  698. public OnFilterScriptInit(){
  699. if(CRC_HuntingInit){
  700. CRC_HuntingInit = false;
  701. Hunt_Timer = SetTimerEx("Hunt_OnUpdate",HUNTING_UPDATE_INTERVAL,true,"");
  702. }
  703. #if defined HUN_OnFilterScriptInit
  704. HUN_OnFilterScriptInit();
  705. #endif
  706. return 1;
  707. }
  708. #if defined _ALS_OnFilterScriptInit
  709. #undef OnFilterScriptInit
  710. #else
  711. #define _ALS_OnFilterScriptInit
  712. #endif
  713. #define OnFilterScriptInit HUN_OnFilterScriptInit
  714. #if defined HUN_OnFilterScriptInit
  715. forward HUN_OnFilterScriptInit();
  716. #endif
  717. //Hook: OnGameModeInit
  718. public OnGameModeInit(){
  719. if(CRC_HuntingInit){
  720. CRC_HuntingInit = false;
  721. Hunt_Timer = SetTimerEx("Hunt_OnUpdate",HUNTING_UPDATE_INTERVAL,true,"");
  722. }
  723. #if defined HUN_OnGameModeInit
  724. HUN_OnGameModeInit();
  725. #endif
  726. return 1;
  727. }
  728. #if defined _ALS_OnGameModeInit
  729. #undef OnGameModeInit
  730. #else
  731. #define _ALS_OnGameModeInit
  732. #endif
  733. #define OnGameModeInit HUN_OnGameModeInit
  734. #if defined HUN_OnGameModeInit
  735. forward HUN_OnGameModeInit();
  736. #endif
  737. //Hook: OnFilterScriptExit
  738. public OnFilterScriptExit(){
  739. if(CRC_HuntingExit){
  740. CRC_HuntingExit = false;
  741. KillTimer(Hunt_Timer);
  742. }
  743. #if defined HUN_OnFilterScriptExit
  744. HUN_OnFilterScriptExit();
  745. #endif
  746. return 1;
  747. }
  748. #if defined _ALS_OnFilterScriptExit
  749. #undef OnFilterScriptExit
  750. #else
  751. #define _ALS_OnFilterScriptExit
  752. #endif
  753. #define OnFilterScriptExit HUN_OnFilterScriptExit
  754. #if defined HUN_OnFilterScriptExit
  755. forward HUN_OnFilterScriptExit();
  756. #endif
  757. //Hook: OnGameModeExit
  758. public OnGameModeExit(){
  759. if(CRC_HuntingExit){
  760. CRC_HuntingExit = false;
  761. KillTimer(Hunt_Timer);
  762. }
  763. #if defined HUN_OnGameModeExit
  764. HUN_OnGameModeExit();
  765. #endif
  766. return 1;
  767. }
  768. #if defined _ALS_OnGameModeExit
  769. #undef OnGameModeExit
  770. #else
  771. #define _ALS_OnGameModeExit
  772. #endif
  773. #define OnGameModeExit HUN_OnGameModeExit
  774. #if defined HUN_OnGameModeExit
  775. forward HUN_OnGameModeExit();
  776. #endif