fires.pwn 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  1. /*
  2. /$$ /$$ /$$$$$$ /$$$$$$$ /$$$$$$$
  3. | $$$ | $$ /$$__ $$ | $$__ $$| $$__ $$
  4. | $$$$| $$| $$ \__/ | $$ \ $$| $$ \ $$
  5. | $$ $$ $$| $$ /$$$$ /$$$$$$| $$$$$$$/| $$$$$$$/
  6. | $$ $$$$| $$|_ $$|______/| $$__ $$| $$____/
  7. | $$\ $$$| $$ \ $$ | $$ \ $$| $$
  8. | $$ \ $$| $$$$$$/ | $$ | $$| $$
  9. |__/ \__/ \______/ |__/ |__/|__/
  10. Fire System
  11. Next Generation Gaming, LLC
  12. (created by Next Generation Gaming Development Team)
  13. * Copyright (c) 2016, Next Generation Gaming, LLC
  14. *
  15. * All rights reserved.
  16. *
  17. * Redistribution and use in source and binary forms, with or without modification,
  18. * are not permitted in any case.
  19. *
  20. *
  21. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  22. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  23. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  24. * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  25. * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  26. * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  27. * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  28. * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  29. * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  30. * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  31. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  32. */
  33. #include <YSI\y_hooks>
  34. #define MAX_FIRES 100
  35. #define MAX_FIRE_HEALTH 1000
  36. #define MAX_FIRE_AREAS 3
  37. #define MAX_FIRE_TYPES 3
  38. #define DEFAULT_FDSA_REQUIRED 1
  39. new iGlobalZoneAreas[MAX_FIRE_AREAS];
  40. new Float:fire_fRandomLocations[10][3] = {
  41. {1381.2661, -1088.7556, 27.3906},
  42. {823.4922, -1102.9449, 25.7891},
  43. {1112.0642, -1370.0339, 13.9844},
  44. {1789.2281, -1384.4358, 15.7578},
  45. {2101.0112, -1359.6780, 23.9844},
  46. {2351.9951, -1419.2737, 24.0000},
  47. {2151.0457, -1808.0161, 13.5464},
  48. {2326.3098, -1897.3530, 13.6172},
  49. {2357.0618, -1990.4791, 13.5469},
  50. {1730.1848, -2335.4980, 13.5469}
  51. };
  52. /*
  53. task FireTask[60000]() { // 300000
  54. new iFDSAOnline;
  55. foreach(new i: Player) {
  56. if(IsAMedic(i)) iFDSAOnline++;
  57. }
  58. if(iFDSAOnline >= DEFAULT_FDSA_REQUIRED) {
  59. if(random(100) < 10) CreateTypeFire(random(MAX_FIRE_TYPES));
  60. }
  61. }
  62. */
  63. hook OnGameModeInit() {
  64. iGlobalZoneAreas[0] = CreateDynamicRectangle(gMainZones[0][SAZONE_AREA][0], gMainZones[0][SAZONE_AREA][1], gMainZones[0][SAZONE_AREA][3], gMainZones[0][SAZONE_AREA][4]); // Los Santos
  65. iGlobalZoneAreas[1] = CreateDynamicRectangle(gMainZones[6][SAZONE_AREA][0], gMainZones[6][SAZONE_AREA][1], gMainZones[6][SAZONE_AREA][3], gMainZones[6][SAZONE_AREA][4]); // Red County
  66. iGlobalZoneAreas[2] = CreateDynamicRectangle(gMainZones[7][SAZONE_AREA][0], gMainZones[7][SAZONE_AREA][1], gMainZones[7][SAZONE_AREA][3], gMainZones[7][SAZONE_AREA][4]); // Flint County
  67. }
  68. hook OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) {
  69. if(arrAntiCheat[playerid][ac_iFlags][AC_DIALOGSPOOFING] > 0) return 1;
  70. switch(dialogid) {
  71. case DIALOG_FIRES: {
  72. SetPlayerPos(playerid, arrFires[ListItemTrackId[playerid][listitem]][fire_fPos][0],
  73. arrFires[ListItemTrackId[playerid][listitem]][fire_fPos][1], arrFires[ListItemTrackId[playerid][listitem]][fire_fPos][2]);
  74. }
  75. }
  76. return 0;
  77. }
  78. stock CreateTypeFire(iTypeID) {
  79. new iTargetID;
  80. switch(iTypeID) {
  81. case 0: { // Houses
  82. iTargetID = Fire_GetRandomValidID(iTypeID);
  83. if(iTargetID != -1) {
  84. new szLocation[MAX_ZONE_NAME];
  85. CreateStructureFire(HouseInfo[iTargetID][hExteriorX], HouseInfo[iTargetID][hExteriorY], HouseInfo[iTargetID][hExteriorZ], HouseInfo[iTargetID][hExtVW]);
  86. CreateStructureFire(HouseInfo[iTargetID][hInteriorX], HouseInfo[iTargetID][hInteriorY], HouseInfo[iTargetID][hInteriorZ], HouseInfo[iTargetID][hIntVW]);
  87. arrFires[iTargetID][fire_iTypeID] = iTypeID;
  88. Get3DZone(HouseInfo[iTargetID][hExteriorX], HouseInfo[iTargetID][hExteriorY], HouseInfo[iTargetID][hExteriorZ], szLocation, sizeof(szLocation));
  89. format(szMiscArray, sizeof(szMiscArray), "** There was a fire reported somewhere in %s.", szLocation);
  90. SendGroupMessage(GROUP_TYPE_MEDIC, COLOR_LIGHTRED, szMiscArray);
  91. }
  92. }
  93. case 1: { // Businesses
  94. iTargetID = Fire_GetRandomValidID(iTypeID);
  95. if(iTargetID != -1) {
  96. new szLocation[MAX_ZONE_NAME];
  97. CreateStructureFire(Businesses[iTargetID][bExtPos][0], Businesses[iTargetID][bExtPos][1], Businesses[iTargetID][bExtPos][2], 0);
  98. CreateStructureFire(Businesses[iTargetID][bIntPos][0], Businesses[iTargetID][bIntPos][1], Businesses[iTargetID][bIntPos][2], Businesses[iTargetID][bVW]);
  99. arrFires[iTargetID][fire_iTypeID] = iTypeID;
  100. Get3DZone(Businesses[iTargetID][bExtPos][0], Businesses[iTargetID][bExtPos][1], Businesses[iTargetID][bExtPos][2], szLocation, sizeof(szLocation));
  101. format(szMiscArray, sizeof(szMiscArray), "** There was a fire reported somewhere in %s.", szLocation);
  102. SendGroupMessage(GROUP_TYPE_MEDIC, COLOR_LIGHTRED, szMiscArray);
  103. }
  104. }
  105. case 2: { // Random
  106. new szLocation[MAX_ZONE_NAME];
  107. iTargetID = random(sizeof(fire_fRandomLocations));
  108. CreateStructureFire(fire_fRandomLocations[iTargetID][0], fire_fRandomLocations[iTargetID][1], fire_fRandomLocations[iTargetID][2], 0);
  109. arrFires[iTargetID][fire_iTypeID] = iTypeID;
  110. Get3DZone(fire_fRandomLocations[iTargetID][0], fire_fRandomLocations[iTargetID][1], fire_fRandomLocations[iTargetID][2], szLocation, sizeof(szLocation));
  111. format(szMiscArray, sizeof(szMiscArray), "** There was a fire reported somewhere in %s.", szLocation);
  112. SendGroupMessage(GROUP_TYPE_MEDIC, COLOR_LIGHTRED, szMiscArray);
  113. }
  114. }
  115. }
  116. stock Fire_GetRandomValidID(iTypeID) {
  117. new iCheckID,
  118. iTargetID = -1,
  119. iZoneArea = random(MAX_FIRE_AREAS),
  120. iAttempts;
  121. switch(iTypeID) {
  122. case 0: {
  123. while(iCheckID != iTargetID) {
  124. iTargetID = random(MAX_HOUSES);
  125. if(HouseInfo[iTargetID][hExteriorX] != 0.0 && HouseInfo[iTargetID][hExteriorZ] < 100 && IsPointInDynamicArea(iGlobalZoneAreas[iZoneArea], HouseInfo[iTargetID][hExteriorX], HouseInfo[iTargetID][hExteriorY], HouseInfo[iTargetID][hExteriorZ])) {
  126. iCheckID = iTargetID;
  127. }
  128. iAttempts++;
  129. if(iAttempts >= MAX_HOUSES) break;
  130. }
  131. }
  132. case 1: {
  133. while(iCheckID != iTargetID) {
  134. iTargetID = random(MAX_BUSINESSES);
  135. if(Businesses[iTargetID][bExtPos][0] != 0.0 && HouseInfo[iTargetID][hExteriorZ] < 100 && IsPointInDynamicArea(iGlobalZoneAreas[iZoneArea], Businesses[iTargetID][bExtPos][0], Businesses[iTargetID][bExtPos][1], Businesses[iTargetID][bExtPos][2])) {
  136. iCheckID = iTargetID;
  137. }
  138. iAttempts++;
  139. if(iAttempts >= MAX_BUSINESSES) break;
  140. }
  141. }
  142. }
  143. return iTargetID;
  144. }
  145. CreateStructureFire(Float:FirePosX, Float:FirePosY, Float:FirePosZ, VW) {
  146. if(iServerFires < MAX_FIRES) {
  147. new next = GetAvailableFireSlot();
  148. arrFires[next][fire_iObjectID] = CreateDynamicObject(18691, FirePosX, FirePosY, FirePosZ - 1.5, 0,0,0, VW, .streamdistance = 300);
  149. arrFires[next][fire_iAreaID] = CreateDynamicSphere(FirePosX, FirePosY, FirePosZ, 3.0, VW);
  150. arrFires[next][fire_fPos][0] = FirePosX;
  151. arrFires[next][fire_fPos][1] = FirePosY;
  152. arrFires[next][fire_fPos][2] = FirePosZ;
  153. // Streamer_SetIntData(STREAMER_TYPE_OBJECT, arrFires[next][fire_iObjectID], E_STREAMER_EXTRA_ID, next);
  154. Streamer_SetIntData(STREAMER_TYPE_AREA, arrFires[next][fire_iAreaID], E_STREAMER_EXTRA_ID, next);
  155. arrFires[next][fire_iHealth] = MAX_FIRE_HEALTH;
  156. format(szMiscArray, sizeof(szMiscArray), "%d/%d\nID%d", arrFires[next][fire_iHealth], MAX_FIRE_HEALTH, next);
  157. arrFires[next][fire_iTextID] = CreateDynamic3DTextLabel(szMiscArray, 0xFFFFFFFFF, FirePosX, FirePosY, FirePosZ, 20, .worldid = VW);
  158. ++iServerFires;
  159. }
  160. }
  161. DeleteStructureFire(iFireID) {
  162. if(!IsValidDynamicObject(arrFires[iFireID][fire_iObjectID])) return 1;
  163. else DestroyDynamicObject(arrFires[iFireID][fire_iObjectID]), arrFires[iFireID][fire_iObjectID] = -1;
  164. if(IsValidDynamic3DTextLabel(arrFires[iFireID][fire_iTextID])) DestroyDynamic3DTextLabel(arrFires[iFireID][fire_iTextID]), arrFires[iFireID][fire_iTextID] = Text3D:-1;
  165. if(IsValidDynamicArea(arrFires[iFireID][fire_iAreaID])) DestroyDynamicArea(arrFires[iFireID][fire_iAreaID]);
  166. if(iServerFires) --iServerFires;
  167. return 1;
  168. }
  169. IsValidStructureFire(iFireID) {
  170. if(IsValidDynamicObject(arrFires[iFireID][fire_iObjectID])) return true;
  171. else return false;
  172. }
  173. GetAvailableFireSlot() {
  174. for(new i; i < MAX_FIRES; i++) {
  175. if(!IsValidDynamicObject(arrFires[i][fire_iObjectID])) return i;
  176. }
  177. return -1;
  178. }
  179. GetFireType(iTypeID) {
  180. new szResult[32];
  181. switch(iTypeID) {
  182. case 0: szResult = "House Fire";
  183. case 1: szResult = "Business Fire";
  184. case 2: szResult = "Random Fire";
  185. default: szResult = "Admin Fire";
  186. }
  187. return szResult;
  188. }
  189. hook OnPlayerUpdate(playerid) {
  190. new newkeys, dir1, dir2;
  191. GetPlayerKeys(playerid, newkeys, dir1, dir2);
  192. if(ActiveKey(KEY_FIRE)) {
  193. if(GetPlayerWeapon(playerid) == WEAPON_FIREEXTINGUISHER) {
  194. new n;
  195. for(n = 0; n < MAX_FIRES; n++) {
  196. if(IsValidStructureFire(n)) {
  197. if(IsPlayerAimingAt(playerid, arrFires[n][fire_fPos][0], arrFires[n][fire_fPos][1], arrFires[n][fire_fPos][2], 1) \
  198. && IsPlayerInRangeOfPoint(playerid, 4, arrFires[n][fire_fPos][0], arrFires[n][fire_fPos][1], arrFires[n][fire_fPos][2])) {
  199. arrFires[n][fire_iHealth] -=2;
  200. format(szMiscArray, sizeof(szMiscArray), "%d/%d\nID%d", arrFires[n][fire_iHealth], MAX_FIRE_HEALTH, n);
  201. UpdateDynamic3DTextLabelText(arrFires[n][fire_iTextID], 0xFFFFFFFF, szMiscArray);
  202. if(arrFires[n][fire_iHealth] <=0) {
  203. DeleteStructureFire(n);
  204. }
  205. }
  206. }
  207. }
  208. }
  209. if(GetVehicleModel(GetPlayerVehicleID(playerid)) == 407 || GetVehicleModel(GetPlayerVehicleID(playerid)) == 601) {
  210. new n;
  211. for(n = 0; n < MAX_FIRES; n++) {
  212. if(IsValidStructureFire(n)) {
  213. if(IsPlayerAimingAt(playerid, arrFires[n][fire_fPos][0], arrFires[n][fire_fPos][1], arrFires[n][fire_fPos][2], 3) \
  214. && IsPlayerInRangeOfPoint(playerid, 20, arrFires[n][fire_fPos][0], arrFires[n][fire_fPos][1], arrFires[n][fire_fPos][2])) {
  215. arrFires[n][fire_iHealth] -=5;
  216. format(szMiscArray, sizeof(szMiscArray), "%d/%d\nID%d", arrFires[n][fire_iHealth], MAX_FIRE_HEALTH, n);
  217. UpdateDynamic3DTextLabelText(arrFires[n][fire_iTextID], 0xFFFFFFFF, szMiscArray);
  218. if(arrFires[n][fire_iHealth] <=0)
  219. {
  220. DeleteStructureFire(n);
  221. }
  222. }
  223. }
  224. }
  225. }
  226. }
  227. return 1;
  228. }
  229. hook OnPlayerEnterDynamicArea(playerid, areaid) {
  230. new i = Streamer_GetIntData(STREAMER_TYPE_AREA, areaid, E_STREAMER_EXTRA_ID);
  231. if(0 <= i < MAX_FIRES) {
  232. if(arrFires[i][fire_iAreaID] == areaid) OnEnterFire(playerid, i);
  233. }
  234. return 1;
  235. }
  236. hook OnPlayerLeaveDynamicArea(playerid, areaid) {
  237. new i = Streamer_GetIntData(STREAMER_TYPE_AREA, areaid, E_STREAMER_EXTRA_ID);
  238. if(0 <= i < MAX_FIRES) {
  239. if(arrFires[i][fire_iAreaID] == areaid) DeletePVar(playerid, "pInFire");
  240. }
  241. return 1;
  242. }
  243. forward OnEnterFire(i, fireid);
  244. public OnEnterFire(i, fireid) {
  245. new
  246. Float:oX, Float:oY, Float:oZ;
  247. if(GetPVarType(i, "pGodMode")) return 1;
  248. if(IsValidStructureFire(fireid)) {
  249. if(!GetPVarType(i, "pInFire")) SetTimerEx("Fire_HealthTimer", 1000, false, "i", i);
  250. SetPVarInt(i, "pInFire", 1);
  251. }
  252. return 1;
  253. }
  254. forward Fire_HealthTimer(playerid);
  255. public Fire_HealthTimer(playerid) {
  256. new Float:ftempHP;
  257. GetHealth(playerid, ftempHP);
  258. if(GetPlayerSkin(playerid) == 277 || GetPlayerSkin(playerid) == 278 || GetPlayerSkin(playerid) == 279) SetHealth(playerid, ftempHP - 5);
  259. else SetHealth(playerid, ftempHP - 20);
  260. if(GetPVarType(playerid, "pInFire")) SetTimerEx("Fire_HealthTimer", 1000, false, "i", playerid);
  261. return 1;
  262. }
  263. CMD:fires(playerid, params[]) {
  264. if(PlayerInfo[playerid][pAdmin] < 4 && PlayerInfo[playerid][pASM] < 1 && PlayerInfo[playerid][pGangModerator] < 1 && PlayerInfo[playerid][pFactionModerator] < 1) return 1;
  265. if(GetPVarInt(playerid, "FireStart") != 1) {
  266. SetPVarInt(playerid, "FireStart", 1);
  267. SendClientMessageEx(playerid, COLOR_GREY, "You are now in fire creation mode");
  268. SendClientMessageEx(playerid, COLOR_GREY, "Please use a weapon and shoot whereever you wish to create a fire");
  269. }
  270. else {
  271. SendClientMessageEx(playerid, COLOR_GREY, "You have exited fire creation mode and are no longer able to create fires");
  272. DeletePVar(playerid, "FireStart");
  273. }
  274. return 1;
  275. }
  276. CMD:destroyfire(playerid, params[]) {
  277. if(PlayerInfo[playerid][pAdmin] < 4 && PlayerInfo[playerid][pASM] < 1 && PlayerInfo[playerid][pGangModerator] < 1 && PlayerInfo[playerid][pFactionModerator] < 1) return 1;
  278. new fire;
  279. if(sscanf(params, "d", fire)) return SendClientMessageEx(playerid, COLOR_GREY, "USAGE: /destroyfire [fireid]");
  280. if(!(0 <= fire <= MAX_FIRES)) return SendClientMessageEx(playerid, COLOR_GREY, "Invalid Fire ID!");
  281. DeleteStructureFire(fire);
  282. return 1;
  283. }
  284. CMD:destroyfires(playerid, params[]) {
  285. if(PlayerInfo[playerid][pAdmin] < 4 && PlayerInfo[playerid][pASM] < 1 && PlayerInfo[playerid][pGangModerator] < 2 && PlayerInfo[playerid][pFactionModerator] < 2) return 1;
  286. for(new i; i < MAX_FIRES; i++) {
  287. DeleteStructureFire(i);
  288. }
  289. SendClientMessageEx(playerid, COLOR_GRAD1, "You removed all the server's fires.");
  290. return 1;
  291. }
  292. CMD:gotofire(playerid, params[]) {
  293. if(PlayerInfo[playerid][pAdmin] < 4 && PlayerInfo[playerid][pASM] < 1 && PlayerInfo[playerid][pGangModerator] < 1 && PlayerInfo[playerid][pFactionModerator] < 1) return 1;
  294. new fire,
  295. Float:fPos[3];
  296. if(sscanf(params, "d", fire)) return SendClientMessageEx(playerid, COLOR_GREY, "USAGE: /gotofire [fireid]");
  297. if(!(0 <= fire <= MAX_FIRES)) return SendClientMessageEx(playerid, COLOR_GREY, "Invalid Fire ID!");
  298. if(!IsValidStructureFire(fire)) return SendClientMessageEx(playerid, COLOR_GREY, "Fire has not been created!");
  299. GetDynamicObjectPos(arrFires[fire][fire_iObjectID], fPos[0], fPos[1], fPos[2]);
  300. SetPlayerPos(playerid, fPos[0], fPos[1], fPos[2]);
  301. return 1;
  302. }
  303. CMD:setfstrength(playerid, params[]) {
  304. if(PlayerInfo[playerid][pAdmin] < 4 && PlayerInfo[playerid][pASM] < 1 && PlayerInfo[playerid][pGangModerator] < 1 && PlayerInfo[playerid][pFactionModerator] < 1) return 1;
  305. new fire, strength;
  306. if(sscanf(params, "dd", fire, strength)) return SendClientMessageEx(playerid, COLOR_GREY, "USAGE: /setfstrength [fireid] [strength]");
  307. if(!(0 <= fire <= MAX_FIRES)) return SendClientMessageEx(playerid, COLOR_GREY, "Invalid Fire ID!");
  308. if(!IsValidStructureFire(fire)) return SendClientMessageEx(playerid, COLOR_GREY, "Fire has not been created!");
  309. arrFires[fire][fire_iHealth] = strength;
  310. return 1;
  311. }
  312. CMD:viewfires(playerid, params[]) {
  313. if(!IsAdminLevel(playerid, ADMIN_GENERAL, 1)) return 1;
  314. new x,
  315. szLocation[MAX_ZONE_NAME];
  316. szMiscArray[0] = 0;
  317. for(new i; i < iServerFires; ++i) {
  318. if(IsValidDynamicObject(arrFires[i][fire_iObjectID])) {
  319. Get3DZone(arrFires[i][fire_fPos][0], arrFires[i][fire_fPos][1], arrFires[i][fire_fPos][2], szLocation, sizeof(szLocation));
  320. format(szMiscArray, sizeof(szMiscArray), "%s\nFire %d | Strength: %d | Type: %s | Location: %s", szMiscArray,
  321. i, arrFires[i][fire_iHealth], GetFireType(arrFires[i][fire_iTypeID]), szLocation);
  322. ListItemTrackId[playerid][x] = i;
  323. x++;
  324. }
  325. }
  326. if(!x) SendClientMessageEx(playerid, COLOR_GRAD1, "There are no fires.");
  327. else ShowPlayerDialogEx(playerid, DIALOG_FIRES, DIALOG_STYLE_LIST, "Fires", szMiscArray, "Teleport", "Cancel");
  328. return 1;
  329. }