GammixSAMP

gangzones.inc R4 - By Gammix

May 10th, 2015
638
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.82 KB | None | 0 0
  1. /*
  2. Interactive Gangzones (gangzones.inc)
  3. * Add boders to your gangzones and fully customizable gangzones. New dynamic functions for gangzones.
  4.  
  5. Author: (creator)
  6. * Gammix
  7.  
  8. Contributors:
  9. * Pottus - Virtual world fixing
  10. * Y_Less - Hooking suggestion
  11. * Incognito - Streamer plugin, used dynamic areas
  12.  
  13. (c) Copyright 2015
  14. * This file is provided as is (no warranties).
  15. */
  16. /*
  17. FUNCTIONS:
  18. native GangZoneCreate(Float:minx, Float:miny, Float:maxx, Float:maxy, color = -1, interior = -1, virtualworld = -1, Float:bordersize = 1.0, bordercolor = 0x00000060);
  19. native GangZoneDestory(zone);
  20. native GangZoneExist(zone);
  21. native GangZoneShowForPlayer(playerid, zone, color = -1, bordercolor = -1);
  22. native GangZoneShowForAll(zone, color = -1, bordercolor = -1);
  23. native GangZoneHideForPlayer(playerid, zone);
  24. native GangZoneHideForAll(zone);
  25. native GangZoneSetColorForPlayer(playerid, zone, color, bordercolor = -1);
  26. native GangZoneSetColorForAll(zone, color, bordercolor = -1);
  27. native GangZoneFlashForPlayer(playerid, zone, flashcolor);
  28. native GangZoneFlashForAll(zone, flashcolor);
  29. native GangZoneStopFlashForPlayer(playerid, zone);
  30. native GangZoneStopFlashForAll(zone);
  31. native GangZoneSetInterior(zone, interior);
  32. native GangZoneGetInterior(zone);
  33. native GangZoneSetVirtualWorld(zone, virtualworld);
  34. native GangZoneGetVirtualWorld(zone);
  35. native CountAllGangZones();
  36. native DestroyAllGangZones();
  37. native ShowAllGangZonesForPlayer(playerid, color = -1, bordercolor = -1);
  38. native ShowAllGangZonesForAll(color = -1, bordercolor = -1);
  39. native HideAllGangZonesForPlayer(playerid);
  40. native HideAllGangZonesForAll();
  41. native IsPlayerInGangZone(playerid, zone);
  42. native IsPlayerInAnyGangZone(playerid);
  43. native GetPlayerGangZone(playerid);
  44.  
  45. CALLBACKS:
  46. public OnPlayerEnterGangZone(playerid, zone);
  47. public OnPlayerLeaveGangZone(playerid, zone);
  48. */
  49.  
  50. #include <streamer>
  51.  
  52. #define MAX_ZONES 1024//maximum gangzones your server can have, the limit is upto 1024 and minimum 5
  53. //Note: Creating one interactive gangzone makes total 5 zones, 4 for borders and 1 for the main zone!
  54.  
  55. enum GangzoneInfo
  56. {
  57. bool:E_exist,
  58. E_border[4],
  59. E_interior,
  60. E_virtualworld,
  61. Float:E_minx,
  62. Float:E_miny,
  63. Float:E_maxx,
  64. Float:E_maxy,
  65. E_dynamic
  66. }
  67. static gGangzone[MAX_ZONES][GangzoneInfo];
  68.  
  69. static bool:gPlayerShown[MAX_PLAYERS][MAX_ZONES];
  70. static gPlayerColor[MAX_PLAYERS][MAX_ZONES];
  71. static gPlayerBorderColor[MAX_PLAYERS][MAX_ZONES];
  72.  
  73. static gPlayerWorld[MAX_PLAYERS];
  74.  
  75. //Note: if you use this in a filterscript, please define "FILTERSCRIPT" in your script
  76. #if defined FILTERSCRIPT// if used in a filterscript
  77.  
  78. public OnFilterScriptInit()
  79. {
  80. DestroyAllGangZones();//destory all gangzones
  81.  
  82. #if defined GZ_OnFilterScriptInit
  83. GZ_OnFilterScriptInit();
  84. #endif
  85. return 1;
  86. }
  87. #if defined _ALS_OnFilterScriptInit
  88. #undef OnFilterScriptInit
  89. #else
  90. #define _ALS_OnFilterScriptInit
  91. #endif
  92. #define OnFilterScriptInit GZ_OnFilterScriptInit
  93. #if defined GZ_OnFilterScriptInit
  94. forward GZ_OnFilterScriptInit();
  95. #endif
  96.  
  97. public OnFilterScriptExit()
  98. {
  99. DestroyAllGangZones();//destory all gangzones
  100.  
  101. #if defined GZ_OnFilterScriptExit
  102. GZ_OnFilterScriptExit();
  103. #endif
  104. return 1;
  105. }
  106. #if defined _ALS_OnFilterScriptExit
  107. #undef OnFilterScriptExit
  108. #else
  109. #define _ALS_OnFilterScriptExit
  110. #endif
  111. #define OnFilterScriptExit GZ_OnFilterScriptExit
  112. #if defined GZ_OnFilterScriptExit
  113. forward GZ_OnFilterScriptExit();
  114. #endif
  115.  
  116. #else// if used in a gamemode
  117.  
  118. public OnGameModeInit()
  119. {
  120. DestroyAllGangZones();//destory all gangzones
  121.  
  122. #if defined GZ_OnGameModeInit
  123. GZ_OnGameModeInit();
  124. #endif
  125. return 1;
  126. }
  127. #if defined _ALS_OnGameModeInit
  128. #undef OnGameModeInit
  129. #else
  130. #define _ALS_OnGameModeInit
  131. #endif
  132. #define OnGameModeInit GZ_OnGameModeInit
  133. #if defined GZ_OnGameModeInit
  134. forward GZ_OnGameModeInit();
  135. #endif
  136.  
  137. public OnGameModeExit()
  138. {
  139. DestroyAllGangZones();//destory all gangzones
  140.  
  141. #if defined GZ_OnGameModeExit
  142. GZ_OnGameModeExit();
  143. #endif
  144. return 1;
  145. }
  146. #if defined _ALS_OnGameModeExit
  147. #undef OnGameModeExit
  148. #else
  149. #define _ALS_OnGameModeExit
  150. #endif
  151. #define OnGameModeExit GZ_OnGameModeExit
  152. #if defined GZ_OnGameModeExit
  153. forward GZ_OnGameModeExit();
  154. #endif
  155.  
  156. #endif
  157.  
  158. stock GangZoneCreate_(Float:minx, Float:miny, Float:maxx, Float:maxy, color = -1, interior = -1, virtualworld = -1, Float:bordersize = 1.0, bordercolor = 0x00000060)
  159. {
  160. new E_zone = GangZoneCreate(minx, miny, maxx, maxy);//the main zone
  161.  
  162. gGangzone[E_zone][E_minx] = minx;
  163. gGangzone[E_zone][E_miny] = miny;
  164. gGangzone[E_zone][E_maxx] = maxx;
  165. gGangzone[E_zone][E_maxy] = maxy;
  166.  
  167. gGangzone[E_zone][E_interior] = interior;
  168. gGangzone[E_zone][E_virtualworld] = virtualworld;
  169.  
  170. for(new players = 0; players < MAX_PLAYERS; players++)//setting player data
  171. {
  172. gPlayerShown[players][E_zone] = false;
  173. gPlayerColor[players][E_zone] = color;
  174. gPlayerBorderColor[players][E_zone] = bordercolor;
  175. }
  176.  
  177. #define SEPERATION (2.0*bordersize)//the seperation value to differenciate borders from gangzone, set accordingly! (Default: 2.0)
  178. gGangzone[E_zone][E_border][0] = GangZoneCreate(minx - SEPERATION, miny, minx + SEPERATION, maxy);//border 1
  179. gGangzone[E_zone][E_border][1] = GangZoneCreate(minx - SEPERATION, maxy - SEPERATION, maxx, maxy + SEPERATION);//border 2
  180. gGangzone[E_zone][E_border][2] = GangZoneCreate(maxx - SEPERATION, miny, maxx + SEPERATION, maxy);//border 3
  181. gGangzone[E_zone][E_border][3] = GangZoneCreate(minx - SEPERATION, miny - SEPERATION, maxx, miny + SEPERATION);//border 4
  182.  
  183. gGangzone[E_zone][E_dynamic] = CreateDynamicRectangle(minx, miny, maxx, maxy, virtualworld, interior, -1);//creating the dynamic zone
  184.  
  185. gGangzone[E_zone][E_exist] = true;//finally, zone exists!
  186. return E_zone;
  187. }
  188. #if defined _ALS_GangZoneCreate
  189. #undef GangZoneCreate
  190. #else
  191. #define _ALS_GangZoneCreate
  192. #endif
  193. #define GangZoneCreate GangZoneCreate_
  194.  
  195. stock GangZoneDestroy_(zone)
  196. {
  197. if(! gGangzone[zone][E_exist]) return false;//check if exists
  198.  
  199. for(new players = 0; players < MAX_PLAYERS; players++)//remove player data
  200. {
  201. gPlayerColor[players][zone] = -1;
  202. gPlayerShown[players][zone] = false;
  203. gPlayerBorderColor[players][zone] = -1;
  204. }
  205.  
  206. gGangzone[zone][E_minx] = 0.0;
  207. gGangzone[zone][E_miny] = 0.0;
  208. gGangzone[zone][E_maxx] = 0.0;
  209. gGangzone[zone][E_maxy] = 0.0;
  210.  
  211. gGangzone[zone][E_interior] = -1;
  212. gGangzone[zone][E_virtualworld] = -1;
  213.  
  214. gGangzone[zone][E_dynamic] = -1;
  215.  
  216. GangZoneDestroy(zone);//destroy main zone
  217.  
  218. for(new border = 0; border < 4; border++)//destroy all 4 borders
  219. {
  220. GangZoneDestroy(gGangzone[zone][E_border][border]);
  221. }
  222.  
  223. DestroyDynamicArea(gGangzone[zone][E_dynamic]);//destory dynamic area
  224.  
  225. gGangzone[zone][E_exist] = false;//finally, zone doesn't exists
  226. return true;
  227. }
  228. #if defined _ALS_GangZoneDestroy
  229. #undef GangZoneDestroy
  230. #else
  231. #define _ALS_GangZoneDestroy
  232. #endif
  233. #define GangZoneDestroy GangZoneDestroy_
  234.  
  235. stock GangZoneExist(zone)
  236. {
  237. if(zone < 0 || zone >= MAX_ZONES)
  238. {
  239. printf("Error::GangZoneExist()::Out Of Bounds::%i", zone);//by pottus
  240. return false;//if invalid zone id
  241. }
  242.  
  243. return gGangzone[zone][E_exist];//check if zone exists!
  244. }
  245.  
  246. stock GangZoneShowForPlayer_(playerid, zone, color = -1, bordercolor = -1)
  247. {
  248. /*
  249. NOTE: if color is "-1" and if bordercolor is "-1", then the system will set
  250. the zone color automatically to default(the one set on creating the zone)!
  251. */
  252.  
  253. if(! GangZoneExist(zone)) return false;
  254.  
  255. if(color != -1) gPlayerColor[playerid][zone] = color;
  256. if(bordercolor != -1) gPlayerBorderColor[playerid][zone] = bordercolor;
  257.  
  258. GangZoneShowForPlayer(playerid, zone, gPlayerColor[playerid][zone]);
  259. for(new border = 0; border < 4; border++) GangZoneShowForPlayer(playerid, gGangzone[zone][E_border][border], gPlayerBorderColor[playerid][zone]);
  260.  
  261. gPlayerShown[playerid][zone] = true;
  262.  
  263. return true;
  264. }
  265. #if defined _ALS_GangZoneShowForPlayer
  266. #undef GangZoneShowForPlayer
  267. #else
  268. #define _ALS_GangZoneShowForPlayer
  269. #endif
  270. #define GangZoneShowForPlayer GangZoneShowForPlayer_
  271.  
  272. stock GangZoneShowForAll_(zone, color = -1, bordercolor = -1)
  273. {
  274. if(! GangZoneExist(zone)) return false;
  275.  
  276. for(new players = 0; players < MAX_PLAYERS; players++)
  277. {
  278. GangZoneShowForPlayer(players, zone, color);
  279. for(new border = 0; border < 4; border++) GangZoneShowForPlayer(players, gGangzone[zone][E_border][border], bordercolor);
  280. }
  281. return true;
  282. }
  283. #if defined _ALS_GangZoneShowForAll
  284. #undef GangZoneShowForAll
  285. #else
  286. #define _ALS_GangZoneShowForAll
  287. #endif
  288. #define GangZoneShowForAll GangZoneShowForAll_
  289.  
  290. stock GangZoneHideForPlayer_(playerid, zone)
  291. {
  292. if(! GangZoneExist(zone)) return false;
  293.  
  294. GangZoneHideForPlayer(playerid, zone);
  295. for(new border = 0; border < 4; border++) GangZoneHideForPlayer(playerid, gGangzone[zone][E_border][border]);
  296.  
  297. gPlayerShown[playerid][zone] = false;
  298. return true;
  299. }
  300. #if defined _ALS_GangZoneHideForPlayer
  301. #undef GangZoneHideForPlayer
  302. #else
  303. #define _ALS_GangZoneHideForPlayer
  304. #endif
  305. #define GangZoneHideForPlayer GangZoneHideForPlayer_
  306.  
  307. stock GangZoneHideForAll_(zone)
  308. {
  309. if(! GangZoneExist(zone)) return false;
  310.  
  311. GangZoneHideForAll(zone);
  312. for(new border = 0; border < 4; border++) GangZoneHideForAll(gGangzone[zone][E_border][border]);
  313.  
  314. for(new players = 0; players < MAX_PLAYERS; players++) gPlayerShown[players][zone] = false;
  315.  
  316. return true;
  317. }
  318. #if defined _ALS_GangZoneHideForAll
  319. #undef GangZoneHideForAll
  320. #else
  321. #define _ALS_GangZoneHideForAll
  322. #endif
  323. #define GangZoneHideForAll GangZoneHideForAll_
  324.  
  325. stock GangZoneSetColorForPlayer(playerid, zone, color, bordercolor = -1)
  326. {
  327. if(! GangZoneExist(zone)) return false;
  328.  
  329. if(gPlayerShown[playerid][zone]) GangZoneShowForPlayer(playerid, zone, color, bordercolor);
  330.  
  331. return true;
  332. }
  333.  
  334. stock GangZoneSetColorForAll(zone, color, bordercolor = -1)
  335. {
  336. if(! GangZoneExist(zone)) return false;
  337.  
  338. for(new players = 0; players < MAX_PLAYERS; players++)
  339. {
  340. if(gPlayerShown[players][zone])
  341. {
  342. GangZoneShowForPlayer(players, zone, color, bordercolor);
  343. }
  344. }
  345. return true;
  346. }
  347. //the flashing functions are same as that of samp!
  348. // GangZoneFlashForPlayer(playerid, zone, flashcolor);
  349.  
  350. // GangZoneFlashForAll(zone, flashcolor);
  351.  
  352. // GangZoneStopFlashForPlayer(playerid, zone);
  353.  
  354. // GangZoneStopFlashForAll(zone);
  355.  
  356. stock GangZoneSetInterior(zone, interior)
  357. {
  358. /*
  359. NOTE: if interior is set to "-1", it means all the interiors, so the zone will be visible in all interiors!
  360. */
  361.  
  362. if(! GangZoneExist(zone)) return false;
  363.  
  364. gGangzone[zone][E_interior] = interior;
  365. return true;
  366. }
  367.  
  368. stock GangZoneGetInterior(zone)
  369. {
  370. if(! GangZoneExist(zone)) return false;
  371.  
  372. return gGangzone[zone][E_interior];
  373. }
  374.  
  375. stock GangZoneSetVirtualWorld(zone, virtualworld)
  376. {
  377. /*
  378. NOTE: if virtualworld is set to "-1", it means all the virtualworld, so the zone will be visible in all virtualworld!
  379. */
  380.  
  381. if(! GangZoneExist(zone)) return false;
  382.  
  383. gGangzone[zone][E_virtualworld] = virtualworld;
  384. return true;
  385. }
  386.  
  387. stock GangZoneGetVirtualWorld(zone)
  388. {
  389. if(! GangZoneExist(zone)) return false;
  390.  
  391. return gGangzone[zone][E_virtualworld];
  392. }
  393.  
  394. stock CountAllGangZones()
  395. {
  396. new count = 0;
  397. for(new zone = 0; zone < MAX_ZONES; zone++)
  398. {
  399. if(GangZoneExist(zone))
  400. {
  401. count ++;
  402. }
  403. }
  404. return count;
  405. }
  406.  
  407. stock DestroyAllGangZones()
  408. {
  409. for(new zone = 0; zone < MAX_ZONES; zone++)
  410. {
  411. if(GangZoneExist(zone))
  412. {
  413. GangZoneDestroy(zone);
  414. }
  415. }
  416. return true;
  417. }
  418.  
  419. stock ShowAllGangZonesForPlayer(playerid, color = -1, bordercolor = -1)
  420. {
  421. for(new zone = 0; zone < MAX_ZONES; zone++)
  422. {
  423. if(GangZoneExist(zone))
  424. {
  425. GangZoneShowForPlayer(playerid, zone, color, bordercolor);
  426. }
  427. }
  428. return true;
  429. }
  430.  
  431. stock ShowAllGangZonesForAll(color = -1, bordercolor = -1)
  432. {
  433. for(new zone = 0; zone < MAX_ZONES; zone++)
  434. {
  435. if(GangZoneExist(zone))
  436. {
  437. GangZoneShowForAll(zone color, bordercolor);
  438. }
  439. }
  440. return true;
  441. }
  442.  
  443. stock HideAllGangZonesForPlayer(playerid)
  444. {
  445. for(new zone = 0; zone < MAX_ZONES; zone++)
  446. {
  447. if(GangZoneExist(zone))
  448. {
  449. GangZoneHideForPlayer(playerid, zone);
  450. }
  451. }
  452. return true;
  453. }
  454.  
  455. stock HideAllGangZonesForAll()
  456. {
  457. for(new zone = 0; zone < MAX_ZONES; zone++)
  458. {
  459. if(GangZoneExist(zone))
  460. {
  461. GangZoneHideForAll(zone);
  462. }
  463. }
  464. return true;
  465. }
  466.  
  467. stock IsPlayerInGangZone(playerid, zone)
  468. {
  469. if(! GangZoneExist(zone)) return false;
  470.  
  471. if(IsPlayerInDynamicArea(playerid, gGangzone[zone][E_dynamic])) return true;
  472. return false;
  473. }
  474.  
  475. stock IsPlayerInAnyGangZone(playerid)
  476. {
  477. if(! IsPlayerConnected(playerid)) return false;
  478.  
  479. if(IsPlayerInAnyDynamicArea(playerid)) return true;
  480. return false;
  481. }
  482.  
  483. stock GetPlayerGangZone(playerid)
  484. {
  485. if(! IsPlayerConnected(playerid)) return false;
  486.  
  487. return GetPlayerNumberDynamicAreas(playerid);
  488. }
  489.  
  490. public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
  491. {
  492. for(new zone = 0; zone < MAX_ZONES; zone++)
  493. {
  494. if(GangZoneExist(zone))
  495. {
  496. if(gPlayerShown[playerid][zone])
  497. {
  498. if(gGangzone[zone][E_interior] != -1)
  499. {
  500. if(newinteriorid != gGangzone[zone][E_interior])
  501. {
  502. GangZoneHideForPlayer(playerid, zone);
  503. }
  504. }
  505. }
  506. }
  507. }
  508. #if defined GZ_OnPlayerInteriorChange
  509. GZ_OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid);
  510. #endif
  511. return 1;
  512. }
  513. #if defined _ALS_OnPlayerInteriorChange
  514. #undef OnPlayerInteriorChange
  515. #else
  516. #define _ALS_OnPlayerInteriorChange
  517. #endif
  518. #define OnPlayerInteriorChange GZ_OnPlayerInteriorChange
  519. #if defined GZ_OnPlayerInteriorChange
  520. forward GZ_OnPlayerInteriorChange(playerid);
  521. #endif
  522.  
  523. stock SetPlayerVirtualWorld_(playerid, worldid)
  524. {
  525. gPlayerWorld[playerid] = worldid;
  526. return SetPlayerVirtualWorld(playerid, worldid);
  527. }
  528. #if defined _ALS_SetPlayerVirtualWorld
  529. #undef SetPlayerVirtualWorld
  530. #else
  531. #define _ALS_SetPlayerVirtualWorld
  532. #endif
  533. #define SetPlayerVirtualWorld SetPlayerVirtualWorld_
  534.  
  535. public OnPlayerUpdate(playerid)
  536. {
  537. if(gPlayerWorld[playerid] != GetPlayerVirtualWorld(playerid))
  538. {
  539. CallLocalFunction("GZ_OnPlayerVirtualWorldChange", "iii", playerid, gPlayerWorld[playerid], GetPlayerVirtualWorld(playerid));
  540. gPlayerWorld[playerid] = GetPlayerVirtualWorld(playerid);
  541. }
  542. #if defined GZ_OnPlayerUpdate
  543. GZ_OnPlayerUpdate(playerid);
  544. #endif
  545. return 1;
  546. }
  547. #if defined _ALS_OnPlayerUpdate
  548. #undef OnPlayerUpdate
  549. #else
  550. #define _ALS_OnPlayerUpdate
  551. #endif
  552. #define OnPlayerUpdate GZ_OnPlayerUpdate
  553. #if defined GZ_OnPlayerUpdate
  554. forward GZ_OnPlayerUpdate(playerid);
  555. #endif
  556.  
  557. forward GZ_OnPlayerVirtualWorldChange(playerid, newworld, oldword);
  558. public GZ_OnPlayerVirtualWorldChange(playerid, newworld, oldword)
  559. {
  560. for(new zone = 0; zone < MAX_ZONES; zone++)
  561. {
  562. if(GangZoneExist(zone))
  563. {
  564. if(gPlayerShown[playerid][zone])
  565. {
  566. if(gGangzone[zone][E_virtualworld] != -1)
  567. {
  568. if(newworld != gGangzone[zone][E_virtualworld])
  569. {
  570. GangZoneHideForPlayer(playerid, zone);
  571. }
  572. }
  573. }
  574. }
  575. }
  576. return 1;
  577. }
  578.  
  579. public OnPlayerEnterDynamicArea(playerid, areaid)
  580. {
  581. for(new zone = 0; zone < MAX_ZONES; zone++)
  582. {
  583. if(GangZoneExist(zone))
  584. {
  585. if(areaid == gGangzone[zone][E_dynamic])
  586. {
  587. CallLocalFunction("OnPlayerEnterGangZone", "dd", playerid, zone);
  588. break;
  589. }
  590. }
  591. }
  592. #if defined GZ_OnPlayerEnterDynamicArea
  593. GZ_OnPlayerEnterDynamicArea(playerid, areaid);
  594. #endif
  595. return 1;
  596. }
  597. #if defined _ALS_OnPlayerEnterDynamicArea
  598. #undef OnPlayerEnterDynamicArea
  599. #else
  600. #define _ALS_OnPlayerEnterDynamicArea
  601. #endif
  602. #define OnPlayerEnterDynamicArea GZ_OnPlayerEnterDynamicArea
  603. #if defined GZ_OnPlayerEnterDynamicArea
  604. forward GZ_OnPlayerEnterDynamicArea(playerid, areaid);
  605. #endif
  606.  
  607. //the system callback
  608. forward OnPlayerEnterGangZone(playerid, zone);
  609.  
  610. public OnPlayerLeaveDynamicArea(playerid, areaid)
  611. {
  612. for(new zone = 0; zone < MAX_ZONES; zone++)
  613. {
  614. if(GangZoneExist(zone))
  615. {
  616. if(areaid == gGangzone[zone][E_dynamic])
  617. {
  618. CallLocalFunction("OnPlayerLeaveGangZone", "dd", playerid, zone);
  619. break;
  620. }
  621. }
  622. }
  623. #if defined GZ_OnPlayerLeaveDynamicArea
  624. GZ_OnPlayerLeaveDynamicArea(playerid, areaid);
  625. #endif
  626. return 1;
  627. }
  628. #if defined _ALS_OnPlayerLeaveDynamicArea
  629. #undef OnPlayerLeaveDynamicArea
  630. #else
  631. #define _ALS_OnPlayerLeaveDynamicArea
  632. #endif
  633. #define OnPlayerLeaveDynamicArea GZ_OnPlayerLeaveDynamicArea
  634. #if defined GZ_OnPlayerLeaveDynamicArea
  635. forward GZ_OnPlayerLeaveDynamicArea(playerid, areaid);
  636. #endif
  637.  
  638. //the system callback
  639. forward OnPlayerLeaveGangZone(playerid, zone);
Advertisement
Add Comment
Please, Sign In to add comment