dynsu.pwn 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481
  1. /*
  2. /$$ /$$ /$$$$$$ /$$$$$$$ /$$$$$$$
  3. | $$$ | $$ /$$__ $$ | $$__ $$| $$__ $$
  4. | $$$$| $$| $$ \__/ | $$ \ $$| $$ \ $$
  5. | $$ $$ $$| $$ /$$$$ /$$$$$$| $$$$$$$/| $$$$$$$/
  6. | $$ $$$$| $$|_ $$|______/| $$__ $$| $$____/
  7. | $$\ $$$| $$ \ $$ | $$ \ $$| $$
  8. | $$ \ $$| $$$$$$/ | $$ | $$| $$
  9. |__/ \__/ \______/ |__/ |__/|__/
  10. Dynamic Crime 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_CRIMES 150
  35. forward OnCrimesLoad();
  36. forward LoadCrimes();
  37. // Dynamic Charges
  38. enum eCrimeDatum {
  39. c_iID, // SQL ID
  40. c_iType, // how many stars the crime will give
  41. c_iNation, // Nation, 0 = SA, 1 = TR
  42. c_szName[32],
  43. c_iJTime, // Jail Time
  44. c_iJFine, // Fine
  45. c_iBail
  46. }
  47. new arrCrimeData[MAX_CRIMES][eCrimeDatum];
  48. public LoadCrimes()
  49. {
  50. mysql_tquery(MainPipeline, "SELECT * FROM `crimesdata`", "OnCrimesLoad", "");
  51. print("[LoadCrimes] Loading Crimes...");
  52. }
  53. public OnCrimesLoad()
  54. {
  55. szMiscArray[0] = 0;
  56. new rows;
  57. cache_get_row_count(rows);
  58. for(new i = 0; i < rows; i++)
  59. {
  60. cache_get_value_name_int(i, "id", arrCrimeData[i][c_iID]);
  61. cache_get_value_name_int(i, "type", arrCrimeData[i][c_iType]);
  62. cache_get_value_name_int(i, "nation", arrCrimeData[i][c_iNation]);
  63. cache_get_value_name(i, "name", arrCrimeData[i][c_szName], 32);
  64. cache_get_value_name_int(i, "jailtime", arrCrimeData[i][c_iJTime]);
  65. cache_get_value_name_int(i, "fine", arrCrimeData[i][c_iJFine]);
  66. cache_get_value_name_int(i, "bail", arrCrimeData[i][c_iBail]);
  67. }
  68. print("[LoadCrimes] Crime Data Loaded.");
  69. }
  70. stock SaveCrimes()
  71. {
  72. for(new i = 0; i < MAX_CRIMES; i++)
  73. {
  74. SaveCrime(i);
  75. }
  76. }
  77. stock SaveCrime(id)
  78. {
  79. szMiscArray[0] = 0;
  80. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "UPDATE `crimesdata` SET \
  81. `type` = '%i', \
  82. `nation` = '%i', \
  83. `name` = '%e', \
  84. `jailtime` = '%i', \
  85. `fine` = '%i', \
  86. `bail` = '%i' \
  87. WHERE `id` = '%i'",
  88. arrCrimeData[id][c_iType],
  89. arrCrimeData[id][c_iNation],
  90. arrCrimeData[id][c_szName],
  91. arrCrimeData[id][c_iJTime],
  92. arrCrimeData[id][c_iJFine],
  93. arrCrimeData[id][c_iBail],
  94. arrCrimeData[id][c_iID]);
  95. mysql_tquery(MainPipeline, szMiscArray, "OnQueryFinish", "i", SENDDATA_THREAD);
  96. }
  97. stock ShowCrimesDialog(iPlayerID, iSuspectID = INVALID_PLAYER_ID, iDialogID = DIALOG_SHOW_CRIMES)
  98. {
  99. szMiscArray[0] = 0;
  100. switch(iDialogID)
  101. {
  102. case DIALOG_SHOW_CRIMES:
  103. {
  104. format(szMiscArray, sizeof(szMiscArray), "----Misdemeanors----\n");
  105. for(new i = 0; i < MAX_CRIMES; i++)
  106. {
  107. if(arrCrimeData[i][c_iNation] == arrGroupData[PlayerInfo[iPlayerID][pMember]][g_iAllegiance] && arrCrimeData[i][c_iType] == 1)
  108. {
  109. format(szMiscArray, sizeof(szMiscArray), "%s{FFFF00}%i\t%s\n", szMiscArray, arrCrimeData[i][c_iID], arrCrimeData[i][c_szName]);
  110. }
  111. }
  112. format(szMiscArray, sizeof(szMiscArray), "%s----Felonies----\n", szMiscArray);
  113. for(new i = 0; i < MAX_CRIMES; i++)
  114. {
  115. if(arrCrimeData[i][c_iNation] == arrGroupData[PlayerInfo[iPlayerID][pMember]][g_iAllegiance] && arrCrimeData[i][c_iType] == 2)
  116. {
  117. format(szMiscArray, sizeof(szMiscArray), "%s{AA3333}%i\t%s\n", szMiscArray, arrCrimeData[i][c_iID], arrCrimeData[i][c_szName]);
  118. }
  119. }
  120. SetPVarInt(iPlayerID, "suspect_TargetID", iSuspectID);
  121. ShowPlayerDialogEx(iPlayerID, iDialogID, DIALOG_STYLE_LIST, "Select a committed crime", szMiscArray, "Select", "Exit");
  122. }
  123. case DIALOG_EDIT_CRIMES:
  124. {
  125. ShowPlayerDialogEx(iPlayerID, iDialogID, DIALOG_STYLE_LIST, "Select a Nation.", "SA\nNE", "Select", "Exit");
  126. }
  127. }
  128. return 1;
  129. }
  130. stock ShowOfflineCrimesDialog(playerid)
  131. {
  132. szMiscArray[0] = 0;
  133. format(szMiscArray, sizeof(szMiscArray), "----Misdemeanors----\n");
  134. for(new i = 0; i < MAX_CRIMES; i++)
  135. {
  136. if(arrCrimeData[i][c_iNation] == arrGroupData[PlayerInfo[playerid][pMember]][g_iAllegiance] && arrCrimeData[i][c_iType] == 1)
  137. {
  138. format(szMiscArray, sizeof(szMiscArray), "%s{FFFF00}%i\t%s\n", szMiscArray, arrCrimeData[i][c_iID], arrCrimeData[i][c_szName]);
  139. }
  140. }
  141. format(szMiscArray, sizeof(szMiscArray), "%s----Felonies----\n", szMiscArray);
  142. for(new i = 0; i < MAX_CRIMES; i++)
  143. {
  144. if(arrCrimeData[i][c_iNation] == arrGroupData[PlayerInfo[playerid][pMember]][g_iAllegiance] && arrCrimeData[i][c_iType] == 2)
  145. {
  146. format(szMiscArray, sizeof(szMiscArray), "%s{AA3333}%i\t%s\n", szMiscArray, arrCrimeData[i][c_iID], arrCrimeData[i][c_szName]);
  147. }
  148. }
  149. ShowPlayerDialogEx(playerid, DIALOG_SHOW_OFFLINE_CRIMES, DIALOG_STYLE_LIST, "Select a committed crime", szMiscArray, "Select", "Exit");
  150. return 1;
  151. }
  152. hook OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) {
  153. if(arrAntiCheat[playerid][ac_iFlags][AC_DIALOGSPOOFING] > 0) return 1;
  154. szMiscArray[0] = 0;
  155. switch(dialogid)
  156. {
  157. case DIALOG_SHOW_CRIMES:
  158. {
  159. if(!response) return 1;
  160. for(new i = 0; i < MAX_CRIMES; i++)
  161. {
  162. if(arrCrimeData[i][c_iNation] == arrGroupData[PlayerInfo[playerid][pMember]][g_iAllegiance])
  163. {
  164. if(arrCrimeData[i][c_iID] == strval(inputtext))
  165. {
  166. new iTargetID = GetPVarInt(playerid, "suspect_TargetID");
  167. ++PlayerInfo[iTargetID][pCrimes];
  168. PlayerInfo[iTargetID][pWantedLevel] += arrCrimeData[i][c_iType];
  169. if(PlayerInfo[iTargetID][pWantedLevel] > 6)
  170. {
  171. PlayerInfo[iTargetID][pWantedLevel] = 6;
  172. }
  173. SetPlayerWantedLevel(iTargetID, PlayerInfo[iTargetID][pWantedLevel]);
  174. if(PlayerInfo[iTargetID][pConnectHours] < 64)
  175. {
  176. PlayerInfo[iTargetID][pWantedJailTime] += 4;
  177. PlayerInfo[iTargetID][pWantedJailFine] += 4000;
  178. }
  179. else
  180. {
  181. PlayerInfo[iTargetID][pWantedJailTime] += arrCrimeData[i][c_iJTime];
  182. PlayerInfo[iTargetID][pWantedJailFine] += arrCrimeData[i][c_iJFine];
  183. }
  184. new szCountry[10], szCrime[128];
  185. if(arrGroupData[PlayerInfo[playerid][pMember]][g_iAllegiance] == 1)
  186. {
  187. format(szCountry, sizeof(szCountry), "[SA] ");
  188. }
  189. else if(arrGroupData[PlayerInfo[playerid][pMember]][g_iAllegiance] == 2)
  190. {
  191. format(szCountry, sizeof(szCountry), "[NE] ");
  192. }
  193. strcat(szCrime, szCountry);
  194. strcat(szCrime, arrCrimeData[i][c_szName]);
  195. AddCrime(playerid, iTargetID, szCrime);
  196. format(szMiscArray, sizeof(szMiscArray), "You've commited a crime ( %s ). Reporter: %s.", szCrime, GetPlayerNameEx(playerid));
  197. SendClientMessageEx(iTargetID, COLOR_LIGHTRED, szMiscArray);
  198. format(szMiscArray, sizeof(szMiscArray), "Current wanted level: %d", PlayerInfo[iTargetID][pWantedLevel]);
  199. SendClientMessageEx(iTargetID, COLOR_YELLOW, szMiscArray);
  200. foreach(new p: Player)
  201. {
  202. if(IsACop(p) && arrGroupData[PlayerInfo[playerid][pMember]][g_iAllegiance] == arrGroupData[PlayerInfo[p][pMember]][g_iAllegiance]) {
  203. format(szMiscArray, sizeof(szMiscArray), "HQ: All units APB (reporter: %s)",GetPlayerNameEx(playerid));
  204. SendClientMessageEx(p, TEAM_BLUE_COLOR, szMiscArray);
  205. format(szMiscArray, sizeof(szMiscArray), "HQ: Crime: %s, suspect: %s", szCrime, GetPlayerNameEx(iTargetID));
  206. SendClientMessageEx(p, TEAM_BLUE_COLOR, szMiscArray);
  207. }
  208. }
  209. PlayerInfo[iTargetID][pDefendTime] = 60;
  210. }
  211. }
  212. }
  213. }
  214. case DIALOG_SHOW_OFFLINE_CRIMES:
  215. {
  216. if(!response) return 1;
  217. for(new i = 0; i < MAX_CRIMES; i++)
  218. {
  219. if(arrCrimeData[i][c_iNation] == arrGroupData[PlayerInfo[playerid][pMember]][g_iAllegiance])
  220. {
  221. if(arrCrimeData[i][c_iID] == strval(inputtext))
  222. {
  223. new PlayerName[MAX_PLAYER_NAME];
  224. new szCountry[10], szCrime[128];
  225. if(arrGroupData[PlayerInfo[playerid][pMember]][g_iAllegiance] == 1)
  226. {
  227. format(szCountry, sizeof(szCountry), "[SA] ");
  228. }
  229. else if(arrGroupData[PlayerInfo[playerid][pMember]][g_iAllegiance] == 2)
  230. {
  231. format(szCountry, sizeof(szCountry), "[NE] ");
  232. }
  233. strcat(szCrime, szCountry);
  234. strcat(szCrime, arrCrimeData[i][c_szName]);
  235. GetPVarString(playerid, "OfflineSU", PlayerName, MAX_PLAYER_NAME);
  236. Crime_AddOffline(playerid, szCrime, PlayerName);
  237. }
  238. }
  239. }
  240. }
  241. case DIALOG_EDIT_CRIMES:
  242. {
  243. if(!response) return 1;
  244. ShowCrimesList(playerid);
  245. }
  246. case DIALOG_CRIMES_LIST:
  247. {
  248. if(!response) return 1;
  249. szMiscArray[0] = 0;
  250. SetPVarInt(playerid, "iEditCrime", strval(inputtext));
  251. format(szMiscArray, sizeof(szMiscArray), "{80FF00}%s", arrCrimeData[strval(inputtext)-1][c_szName]);
  252. ShowPlayerDialogEx(playerid, DIALOG_CRIMES_EDIT, DIALOG_STYLE_LIST, szMiscArray, "Edit Type\nnEdit Nation\nEdit Name\nEdit Time\nEdit Fine", "Select", "Cancel");
  253. }
  254. case DIALOG_CRIMES_EDIT:
  255. {
  256. if(!response) return ShowCrimesList(playerid);
  257. szMiscArray[0] = 0;
  258. new iEditCrime = GetPVarInt(playerid, "iEditCrime")-1;
  259. switch(listitem)
  260. {
  261. case 0:
  262. {
  263. format(szMiscArray, sizeof(szMiscArray), "{80FF00}%s - {FF0000}EDIT TYPE", arrCrimeData[iEditCrime][c_szName]);
  264. ShowPlayerDialogEx(playerid, DIALOG_CRIMES_TYPE, DIALOG_STYLE_LIST, szMiscArray, "Misdemeanor\nFelony", "Select", "Cancel");
  265. }
  266. case 1:
  267. {
  268. format(szMiscArray, sizeof(szMiscArray), "{80FF00}%s - {FF0000}EDIT NATION", arrCrimeData[iEditCrime][c_szName]);
  269. ShowPlayerDialogEx(playerid, DIALOG_CRIMES_NATION, DIALOG_STYLE_LIST, szMiscArray, "San Andreas\nNew Robada", "Select", "Cancel");
  270. }
  271. case 2:
  272. {
  273. format(szMiscArray, sizeof(szMiscArray), "{80FF00}%s - {FF0000}EDIT NAME", arrCrimeData[iEditCrime][c_szName]);
  274. ShowPlayerDialogEx(playerid, DIALOG_CRIMES_NAME, DIALOG_STYLE_INPUT, szMiscArray, "Please input a new name for the crime.", "Select", "Cancel");
  275. }
  276. case 3:
  277. {
  278. format(szMiscArray, sizeof(szMiscArray), "{80FF00}%s - {FF0000}EDIT TIME", arrCrimeData[iEditCrime][c_szName]);
  279. ShowPlayerDialogEx(playerid, DIALOG_CRIMES_TIME, DIALOG_STYLE_INPUT, szMiscArray, "Please input a new time for the crime.", "Select", "Cancel");
  280. }
  281. case 4:
  282. {
  283. format(szMiscArray, sizeof(szMiscArray), "{80FF00}%s - {FF0000}EDIT FINE", arrCrimeData[iEditCrime][c_szName]);
  284. ShowPlayerDialogEx(playerid, DIALOG_CRIMES_FINE, DIALOG_STYLE_INPUT, szMiscArray, "Please input a new fine for the crime.", "Select", "Cancel");
  285. }
  286. }
  287. }
  288. case DIALOG_CRIMES_TYPE:
  289. {
  290. if(!response) return ShowCrimesList(playerid);
  291. new iEditCrime = GetPVarInt(playerid, "iEditCrime")-1;
  292. arrCrimeData[iEditCrime][c_iType] = listitem+1;
  293. szMiscArray[0] = 0;
  294. format(szMiscArray, sizeof(szMiscArray), "You have set %s's type to %s", arrCrimeData[iEditCrime][c_szName], inputtext);
  295. SendClientMessageEx(playerid, COLOR_LIGHTBLUE, szMiscArray);
  296. SaveCrime(iEditCrime);
  297. }
  298. case DIALOG_CRIMES_NATION:
  299. {
  300. if(!response) return ShowCrimesList(playerid);
  301. new iEditCrime = GetPVarInt(playerid, "iEditCrime")-1;
  302. arrCrimeData[iEditCrime][c_iNation] = listitem+1;
  303. szMiscArray[0] = 0;
  304. format(szMiscArray, sizeof(szMiscArray), "You have set %s's nation to %s", arrCrimeData[iEditCrime][c_szName], inputtext);
  305. SendClientMessageEx(playerid, COLOR_LIGHTBLUE, szMiscArray);
  306. SaveCrime(iEditCrime);
  307. }
  308. case DIALOG_CRIMES_NAME:
  309. {
  310. if(!response) return ShowCrimesList(playerid);
  311. if(isnull(inputtext) || strlen(inputtext) > 32) return SendClientMessageEx(playerid, COLOR_GRAD2, "Please enter a valid name no longer than 32 characters.");
  312. new iEditCrime = GetPVarInt(playerid, "iEditCrime")-1;
  313. szMiscArray[0] = 0;
  314. format(szMiscArray, sizeof(szMiscArray), "You updated crime %s's name to %s", arrCrimeData[iEditCrime][c_szName], inputtext);
  315. SendClientMessageEx(playerid, COLOR_LIGHTBLUE, szMiscArray);
  316. format(arrCrimeData[iEditCrime][c_szName], 32, "%s", inputtext);
  317. SaveCrime(iEditCrime);
  318. }
  319. case DIALOG_CRIMES_TIME:
  320. {
  321. if(!response) return ShowCrimesList(playerid);
  322. new iEditCrime = GetPVarInt(playerid, "iEditCrime")-1;
  323. if(strval(inputtext) < 1) return SendClientMessageEx(playerid, COLOR_GRAD2, "Please input a time above 0 minutes.");
  324. arrCrimeData[iEditCrime][c_iJTime] = strval(inputtext);
  325. szMiscArray[0] = 0;
  326. format(szMiscArray, sizeof(szMiscArray), "You updated crime %s's time to %i minute(s)", arrCrimeData[iEditCrime][c_szName], strval(inputtext));
  327. SendClientMessageEx(playerid, COLOR_LIGHTBLUE, szMiscArray);
  328. SaveCrime(iEditCrime);
  329. }
  330. case DIALOG_CRIMES_FINE:
  331. {
  332. if(!response) return ShowCrimesList(playerid);
  333. new iEditCrime = GetPVarInt(playerid, "iEditCrime")-1;
  334. if(strval(inputtext) < 1) return SendClientMessageEx(playerid, COLOR_GRAD2, "Please input a fine above $0.");
  335. arrCrimeData[iEditCrime][c_iJFine] = strval(inputtext);
  336. szMiscArray[0] = 0;
  337. format(szMiscArray, sizeof(szMiscArray), "You updated crime %s's fine to $%s dollars", arrCrimeData[iEditCrime][c_szName], number_format(strval(inputtext)));
  338. SendClientMessageEx(playerid, COLOR_LIGHTBLUE, szMiscArray);
  339. SaveCrime(iEditCrime);
  340. }
  341. }
  342. return 0;
  343. }
  344. CMD:clist(playerid, params[]) return cmd_crimelist(playerid, params);
  345. CMD:crimelist(playerid, params[])
  346. {
  347. if(PlayerInfo[playerid][pAdmin] < 1337 && !PlayerInfo[playerid][pFactionModerator]) return SendClientMessageEx(playerid, COLOR_WHITE, "SERVER: You are not authorized to use this command.");
  348. ShowCrimesList(playerid);
  349. return 1;
  350. }
  351. CMD:su(playerid, params[])
  352. {
  353. if(IsACop(playerid))
  354. {
  355. if(PlayerInfo[playerid][pJailTime] > 0) return SendClientMessageEx(playerid, COLOR_WHITE, "You cannot use this in jail/prison.");
  356. new iTargetID;
  357. if(sscanf(params, "u", iTargetID)) return SendClientMessageEx(playerid, COLOR_GREY, "USAGE: (/su)spect [player]");
  358. if(!IsPlayerConnected(iTargetID)) return SendClientMessageEx(playerid, COLOR_GRAD1, "Invalid player specified.");
  359. if(iTargetID == playerid) return SendClientMessageEx(playerid, COLOR_GRAD1, "You cannot place charges on yourself.");
  360. if(IsACop(iTargetID) && arrGroupData[PlayerInfo[playerid][pMember]][g_iAllegiance] == arrGroupData[PlayerInfo[iTargetID][pMember]][g_iAllegiance])
  361. {
  362. if(arrGroupData[PlayerInfo[playerid][pMember]][gLEOArrest] == INVALID_RANK || arrGroupData[PlayerInfo[playerid][pMember]][gLEOArrest] > PlayerInfo[playerid][pRank]) return SendClientMessageEx(playerid, COLOR_GREY, "You can't use this command on a law enforcement officer.");
  363. }
  364. if(PlayerInfo[iTargetID][pWantedLevel] >= 6) return SendClientMessageEx(playerid, COLOR_GRAD2, "Target is already most wanted.");
  365. ShowCrimesDialog(playerid, iTargetID);
  366. }
  367. else SendClientMessageEx(playerid, COLOR_GRAD2, "You're not a law enforcement officer.");
  368. return 1;
  369. }
  370. CMD:osu(playerid, params[])
  371. {
  372. if(IsACop(playerid))
  373. {
  374. if(PlayerInfo[playerid][pJailTime] > 0) {
  375. return SendClientMessageEx(playerid, COLOR_WHITE, "You cannot use this in jail/prison.");
  376. }
  377. if(isnull(params)) return SendClientMessageEx(playerid, COLOR_WHITE, "USAGE: /osu(spect) [player name]");
  378. new PlayerName[MAX_PLAYER_NAME];
  379. mysql_escape_string(params, PlayerName);
  380. if(IsPlayerConnected(ReturnUser(PlayerName))) return SendClientMessageEx(playerid, COLOR_GREY, "That player is currently connected, use /su.");
  381. SetPVarString(playerid, "OfflineSU", PlayerName);
  382. ShowOfflineCrimesDialog(playerid);
  383. }
  384. else SendClientMessageEx(playerid, COLOR_GRAD2, "You're not a law enforcement officer.");
  385. return 1;
  386. }
  387. ShowCrimesList(playerid)
  388. {
  389. szMiscArray[0] = 0;
  390. strcat(szMiscArray, "ID\tName\tTime (min)\tFine");
  391. for(new i = 0; i < MAX_CRIMES; i++)
  392. {
  393. format(szMiscArray, sizeof(szMiscArray), "%s\n%i\t%s\t%d\t$%s", szMiscArray, arrCrimeData[i][c_iID], arrCrimeData[i][c_szName], arrCrimeData[i][c_iJTime], number_format(arrCrimeData[i][c_iJFine]));
  394. }
  395. return ShowPlayerDialogEx(playerid, DIALOG_CRIMES_LIST, DIALOG_STYLE_TABLIST_HEADERS, "Select a crime to edit.", szMiscArray, "Select", "Exit");
  396. }
  397. Crime_AddOffline(iPlayerID, szAddCrime[], szPName[], iExtra = 0) {
  398. szMiscArray[0] = 0;
  399. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "SELECT `id`, `Username` FROM `accounts` WHERE `Username` = '%s' LIMIT 1", szPName);
  400. mysql_tquery(MainPipeline, szMiscArray, "OnCrimeAddOffline", "dssd", iPlayerID, szAddCrime, szPName, iExtra);
  401. return 1;
  402. }
  403. forward OnCrimeAddOffline(iPlayerID, szAddCrime[], szPName[], iExtra);
  404. public OnCrimeAddOffline(iPlayerID, szAddCrime[], szPName[], iExtra)
  405. {
  406. new
  407. iRows,
  408. iTempID;
  409. cache_get_row_count(iRows);
  410. switch(iExtra) {
  411. case 0: {
  412. if(!iRows) return SendClientMessageEx(iPlayerID, 0xFFFFFF, "That player was not found!");
  413. cache_get_value_name_int(0, "id", iTempID);
  414. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "INSERT INTO `mdc` (`id` ,`time` ,`issuer` ,`crime`, `origin`) VALUES ('%d',NOW(),'%s','%s','%d')", iTempID, GetPlayerNameEx(iPlayerID), szAddCrime, arrGroupData[PlayerInfo[iPlayerID][pMember]][g_iAllegiance]);
  415. mysql_tquery(MainPipeline, szMiscArray, "OnCrimeAddOffline", "dssd", iPlayerID, szAddCrime, szPName, 1);
  416. new PlayerName[MAX_PLAYER_NAME];
  417. GetPVarString(iPlayerID, "OfflineSU", PlayerName, MAX_PLAYER_NAME);
  418. foreach(new p: Player)
  419. {
  420. if(IsACop(p) && arrGroupData[PlayerInfo[iPlayerID][pMember]][g_iAllegiance] == arrGroupData[PlayerInfo[p][pMember]][g_iAllegiance]) {
  421. format(szMiscArray, sizeof(szMiscArray), "(offline) HQ: All units APB (reporter: %s)",GetPlayerNameEx(iPlayerID));
  422. SendClientMessageEx(p, TEAM_BLUE_COLOR, szMiscArray);
  423. format(szMiscArray, sizeof(szMiscArray), "(offline) HQ: Crime: %s, suspect: %s", szAddCrime, PlayerName);
  424. SendClientMessageEx(p, TEAM_BLUE_COLOR, szMiscArray);
  425. }
  426. }
  427. DeletePVar(iPlayerID, "OfflineSU");
  428. }
  429. case 1: {
  430. if(!cache_affected_rows()) return SendClientMessageEx(iPlayerID, 0xFFFFFF, "There was an issue appending that crime!");
  431. format(szMiscArray, sizeof(szMiscArray), "Crime Added: %s - %s", szPName, szAddCrime);
  432. SendClientMessage(iPlayerID, 0xFFFFFF, szMiscArray);
  433. }
  434. }
  435. return 1;
  436. }