speedcamera.pwn 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636
  1. /*
  2. /$$ /$$ /$$$$$$ /$$$$$$$ /$$$$$$$
  3. | $$$ | $$ /$$__ $$ | $$__ $$| $$__ $$
  4. | $$$$| $$| $$ \__/ | $$ \ $$| $$ \ $$
  5. | $$ $$ $$| $$ /$$$$ /$$$$$$| $$$$$$$/| $$$$$$$/
  6. | $$ $$$$| $$|_ $$|______/| $$__ $$| $$____/
  7. | $$\ $$$| $$ \ $$ | $$ \ $$| $$
  8. | $$ \ $$| $$$$$$/ | $$ | $$| $$
  9. |__/ \__/ \______/ |__/ |__/|__/
  10. Dynamic Camera 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. hook OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) {
  35. if(arrAntiCheat[playerid][ac_iFlags][AC_DIALOGSPOOFING] > 0) return 1;
  36. if (dialogid == SPEEDCAM_DIALOG_MAIN)
  37. {
  38. if (!response) return 1;
  39. switch (listitem)
  40. {
  41. case 0:
  42. {
  43. if (SpeedCameras[MAX_SPEEDCAMERAS - 1][_scActive])
  44. return SendClientMessageEx(playerid, COLOR_GREY, "No more static speed cameras can be created.");
  45. ShowPlayerDialogEx(playerid, SPEEDCAM_DIALOG_RANGEC, DIALOG_STYLE_INPUT, "{FFFF00}Create a speed camera", "{FFFFFF}Enter the range of your camera.", "OK", "Back");
  46. }
  47. case 1:
  48. {
  49. ShowPlayerDialogEx(playerid, SPEEDCAM_DIALOG_EDIT, DIALOG_STYLE_INPUT, "{FFFF00}Edit a speed camera", "{FFFFFF}Enter the ID of the speed camera you wish to edit.", "OK", "Back");
  50. }
  51. case 2:
  52. {
  53. ShowPlayerDialogEx(playerid, SPEEDCAM_DIALOG_DELETE, DIALOG_STYLE_INPUT, "{FFFF00}Delete a speed camera", "{FFFFFF}Enter the ID of the speed camera you wish to delete.", "OK", "Back");
  54. }
  55. case 3:
  56. {
  57. new Float:playerPos[3];
  58. GetPlayerPos(playerid, playerPos[0], playerPos[1], playerPos[2]);
  59. new Float:distances[MAX_SPEEDCAMERAS];
  60. for (new c = 0; c < MAX_SPEEDCAMERAS; c++)
  61. {
  62. distances[c] = -1.000;
  63. if (SpeedCameras[c][_scActive] == true)
  64. {
  65. new Float:tmpPos[3];
  66. tmpPos[0] = SpeedCameras[c][_scPosX];
  67. tmpPos[1] = SpeedCameras[c][_scPosY];
  68. tmpPos[2] = SpeedCameras[c][_scPosZ];
  69. new Float:distance = floatsqroot(((playerPos[0] - tmpPos[0]) * (playerPos[0] - tmpPos[0])) + ((playerPos[1] - tmpPos[1]) * (playerPos[1] - tmpPos[1])) \
  70. + ((playerPos[2] - tmpPos[2]) * ((playerPos[2] - tmpPos[2]))));
  71. distances[c] = distance;
  72. }
  73. }
  74. new lowest_index = -1;
  75. for (new i = 0; i < MAX_SPEEDCAMERAS; i++)
  76. {
  77. if (distances[i] != -1.000)
  78. {
  79. if (lowest_index == -1.000)
  80. {
  81. lowest_index = i;
  82. }
  83. else
  84. {
  85. if (distances[i] < distances[lowest_index])
  86. lowest_index = i;
  87. }
  88. }
  89. }
  90. if (lowest_index == -1) // no cameras exist, the closest cannot be calculated
  91. {
  92. ShowPlayerDialogEx(playerid, SPEEDCAM_DIALOG_GETNEAREST, DIALOG_STYLE_MSGBOX, "{FFFF00}Nearest speed camera", "{FFFFFF}No speed cameras exist, and thus the closest cannot be found.", "OK", "");
  93. }
  94. else
  95. {
  96. new msg[128];
  97. format(msg, sizeof(msg), "{FFFFFF}The nearest speed camera is: {FFFF00}%i\n\n{FFFFFF}With a distance of {FFFF00}%f", lowest_index, distances[lowest_index]);
  98. ShowPlayerDialogEx(playerid, SPEEDCAM_DIALOG_GETNEAREST, DIALOG_STYLE_MSGBOX, "{FFFF00}Nearest speed camera", msg, "OK", "");
  99. }
  100. }
  101. }
  102. }
  103. if (dialogid == SPEEDCAM_DIALOG_RANGEC)
  104. {
  105. if (!response)
  106. return ShowPlayerDialogEx(playerid, SPEEDCAM_DIALOG_MAIN, DIALOG_STYLE_LIST, "{FFFF00}Speed Cameras", \
  107. "Create a speed camera\nEdit a speed camera\nDelete a speed camera\nGet nearest speedcamera", "Select", "Cancel");
  108. new Float:range;
  109. if (sscanf(inputtext, "f", range))
  110. {
  111. return ShowPlayerDialogEx(playerid, SPEEDCAM_DIALOG_RANGEC, DIALOG_STYLE_INPUT, "{FFFF00}Create a speed camera", "{FFFFFF}Enter the range of your camera.\
  112. \n\n{FFFF00}Value must be a number (decimal places allowed).", "OK", "Back");
  113. }
  114. SetPVarFloat(playerid, "_scCacheRange", range);
  115. ShowPlayerDialogEx(playerid, SPEEDCAM_DIALOG_LIMIT, DIALOG_STYLE_INPUT, "{FFFF00}Create a speed camera", "{FFFFFF}Enter the limit of your camera (mph).", "OK", "Back");
  116. }
  117. if (dialogid == SPEEDCAM_DIALOG_LIMIT)
  118. {
  119. if (!response)
  120. return ShowPlayerDialogEx(playerid, SPEEDCAM_DIALOG_RANGEC, DIALOG_STYLE_INPUT, "{FFFF00}Create a speed camera", "{FFFFFF}Enter the range of your camera.", "OK", "Back");
  121. new Float:limit;
  122. if (sscanf(inputtext, "f", limit))
  123. {
  124. return ShowPlayerDialogEx(playerid, SPEEDCAM_DIALOG_LIMIT, DIALOG_STYLE_INPUT, "{FFFF00}Create a speed camera", "{FFFFFF}Enter the limit of your camera (mph).\
  125. \n\n{FFFF00}Value must be a number (decimal places allowed).", "OK", "Back");
  126. }
  127. SetPVarFloat(playerid, "_scCacheLimit", limit);
  128. new Float:range = GetPVarFloat(playerid, "_scCacheRange");
  129. new content[256];
  130. format(content, sizeof(content), "{FFFF00}Range: {FFFFFF}%f\n{FFFF00}Limit: {FFFFFF}%f mph\n\nAre you sure you want to create this speed camera?", range, limit);
  131. ShowPlayerDialogEx(playerid, SPEEDCAM_DIALOG_OVERVIEW, DIALOG_STYLE_MSGBOX, "{FFFF00}Speed camera overview", content, "Confirm", "Cancel");
  132. }
  133. if (dialogid == SPEEDCAM_DIALOG_OVERVIEW)
  134. {
  135. if (!response)
  136. {
  137. DeletePVar(playerid, "_scCacheRange");
  138. DeletePVar(playerid, "_scCacheLimit");
  139. return SendClientMessageEx(playerid, COLOR_RED, "Cancelled creation of speed camera.");
  140. }
  141. if (SpeedCameras[MAX_SPEEDCAMERAS - 1][_scActive])
  142. {
  143. DeletePVar(playerid, "_scCacheRange");
  144. DeletePVar(playerid, "_scCacheLimit");
  145. return SendClientMessageEx(playerid, COLOR_RED, "Error: Limit was reached whilst you were creating this camera.");
  146. }
  147. new Float:range = GetPVarFloat(playerid, "_scCacheRange");
  148. new Float:limit = GetPVarFloat(playerid, "_scCacheLimit");
  149. DeletePVar(playerid, "_scCacheRange");
  150. DeletePVar(playerid, "_scCacheLimit");
  151. new Float:x, Float:y, Float:z, Float:angle;
  152. GetPlayerPos(playerid, x, y, z);
  153. GetPlayerFacingAngle(playerid, angle);
  154. z -= 3.00000; // for height issues
  155. angle += 180; // flip the angle
  156. new cam = CreateSpeedCamera(x, y, z, angle, range, limit);
  157. SendClientMessageEx(playerid, COLOR_GREEN, "Speed camera created!");
  158. new logText[128];
  159. format(logText, sizeof(logText), "%s(%d) has placed speed camera %d at [%f, %f, %f] with limit %f and range %f.",
  160. GetPlayerNameExt(playerid), GetPlayerSQLId(playerid), SpeedCameras[cam][_scDatabase], SpeedCameras[cam][_scPosX], SpeedCameras[cam][_scPosY], SpeedCameras[cam][_scPosZ], SpeedCameras[cam][_scLimit], SpeedCameras[cam][_scRange]);
  161. Log("logs/speedcam.log", logText);
  162. }
  163. if (dialogid == SPEEDCAM_DIALOG_EDIT)
  164. {
  165. if (!response)
  166. return ShowPlayerDialogEx(playerid, SPEEDCAM_DIALOG_MAIN, DIALOG_STYLE_LIST, "{FFFF00}Speed Cameras", "Create a speed camera\nEdit a speed camera\nDelete a speed camera\n\
  167. Get nearest speedcamera", \
  168. "Select", "Cancel");
  169. new id;
  170. if (sscanf(inputtext, "i", id))
  171. return ShowPlayerDialogEx(playerid, SPEEDCAM_DIALOG_EDIT, DIALOG_STYLE_INPUT, "{FFFF00}Edit a speed camera", "{FFFFFF}Enter the ID of the speed camera you wish to edit.\n\n\
  172. {FFFF00}ID must be a number.", "OK", "Back");
  173. if (id >= MAX_SPEEDCAMERAS || id < 0)
  174. return ShowPlayerDialogEx(playerid, SPEEDCAM_DIALOG_EDIT, DIALOG_STYLE_INPUT, "{FFFF00}Edit a speed camera", "{FFFFFF}Enter the ID of the speed camera you wish to edit.\n\n\
  175. {FFFF00}ID must not be above the maximum or below 0.", "OK", "Back");
  176. if (SpeedCameras[id][_scActive] == false)
  177. return ShowPlayerDialogEx(playerid, SPEEDCAM_DIALOG_EDIT, DIALOG_STYLE_INPUT, "{FFFF00}Edit a speed camera", "{FFFFFF}Enter the ID of the speed camera you wish to edit.\n\n\
  178. {FFFF00}No active speed camera with that ID.", "OK", "Back");
  179. SetPVarInt(playerid, "_scCacheEditId", id);
  180. ShowPlayerDialogEx(playerid, SPEEDCAM_DIALOG_EDIT_IDX, DIALOG_STYLE_LIST, "{FFFF00}Edit a speed camera", "Move position to player\nSet angle\nSet range\nSet limit", "Select", "Back");
  181. }
  182. if (dialogid == SPEEDCAM_DIALOG_EDIT_IDX)
  183. {
  184. if (!response)
  185. {
  186. DeletePVar(playerid, "_scCacheEditId");
  187. return ShowPlayerDialogEx(playerid, SPEEDCAM_DIALOG_MAIN, DIALOG_STYLE_LIST, "{FFFF00}Speed Cameras", "Create a speed camera\nEdit a speed camera\nDelete a speed camera\n\
  188. Get nearest speedcamera", \
  189. "Select", "Cancel");
  190. }
  191. switch (listitem)
  192. {
  193. case 0:
  194. {
  195. new Float:x, Float:y, Float:z, Float:angle;
  196. GetPlayerPos(playerid, x, y, z);
  197. GetPlayerFacingAngle(playerid, angle);
  198. new id = GetPVarInt(playerid, "_scCacheEditId");
  199. SpeedCameras[id][_scPosX] = x;
  200. SpeedCameras[id][_scPosY] = y;
  201. SpeedCameras[id][_scPosZ] = z;
  202. SpeedCameras[id][_scRotation] = angle - 180;
  203. SetDynamicObjectPos(SpeedCameras[id][_scObjectId], x, y, z-3.000);
  204. SetDynamicObjectRot(SpeedCameras[id][_scObjectId], 0, 0, angle - 180);
  205. SetPlayerPos(playerid, x + 1, y, z);
  206. SaveSpeedCamera(id);
  207. SendClientMessageEx(playerid, COLOR_WHITE, "Speed camera moved.");
  208. new logText[128];
  209. format(logText, sizeof(logText), "%s(%d) has moved speed camera %d to [%f, %f, %f]",
  210. GetPlayerNameExt(playerid), GetPlayerSQLId(playerid), SpeedCameras[id][_scDatabase], SpeedCameras[id][_scPosX], SpeedCameras[id][_scPosY], SpeedCameras[id][_scPosZ]);
  211. Log("logs/speedcam.log", logText);
  212. ShowPlayerDialogEx(playerid, SPEEDCAM_DIALOG_EDIT_IDX, DIALOG_STYLE_LIST, "{FFFF00}Edit a speed camera", "Move position to player\nSet angle\nSet range\nSet limit", "Select", "Back");
  213. }
  214. case 1:
  215. {
  216. ShowPlayerDialogEx(playerid, SPEEDCAM_DIALOG_EDIT_ROT, DIALOG_STYLE_INPUT, "{FFFF00}Edit a speed camera", "{FFFFFF}Enter the new (Z) angle of the speed camera.", "OK", "Back");
  217. }
  218. case 2:
  219. {
  220. ShowPlayerDialogEx(playerid, SPEEDCAM_DIALOG_EDIT_RANGE, DIALOG_STYLE_INPUT, "{FFFF00}Edit a speed camera", "{FFFFFF}Enter the new range of the speed camera.", "OK", "Back");
  221. }
  222. case 3:
  223. {
  224. ShowPlayerDialogEx(playerid, SPEEDCAM_DIALOG_EDIT_LIMIT, DIALOG_STYLE_INPUT, "{FFFF00}Edit a speed camera", "{FFFFFF}Enter the new speed limit of the speed camera (mph).", "OK", "Back");
  225. }
  226. }
  227. }
  228. if (dialogid == SPEEDCAM_DIALOG_EDIT_ROT)
  229. {
  230. if (!response)
  231. {
  232. return ShowPlayerDialogEx(playerid, SPEEDCAM_DIALOG_EDIT_IDX, DIALOG_STYLE_LIST, "{FFFF00}Edit a speed camera", "Move position to player\nSet angle\nSet range\nSet limit", "Select", "Back");
  233. }
  234. new Float:angle;
  235. if (sscanf(inputtext, "f", angle))
  236. {
  237. return ShowPlayerDialogEx(playerid, SPEEDCAM_DIALOG_EDIT_ROT, DIALOG_STYLE_LIST, "{FFFF00}Edit a speed camera", "{FFFFFF}Enter the new (Z) angle of the speed camera.\n\n\
  238. {FFFF00}The angle must be a number (decimals allowed).", "OK", "Back");
  239. }
  240. new id = GetPVarInt(playerid, "_scCacheEditId");
  241. SetDynamicObjectRot(SpeedCameras[id][_scObjectId], 0, 0, angle);
  242. SpeedCameras[id][_scRotation] = angle;
  243. SaveSpeedCamera(id);
  244. SendClientMessageEx(playerid, COLOR_WHITE, "Speed camera's Z-angle changed.");
  245. new logText[128];
  246. format(logText, sizeof(logText), "%s(%d) has changed speed camera %d's z-angle to %f",
  247. GetPlayerNameExt(playerid), GetPlayerSQLId(playerid), SpeedCameras[id][_scDatabase], SpeedCameras[id][_scRotation]);
  248. Log("logs/speedcam.log", logText);
  249. ShowPlayerDialogEx(playerid, SPEEDCAM_DIALOG_EDIT_IDX, DIALOG_STYLE_LIST, "{FFFF00}Edit a speed camera", "Move position to player\nSet angle\nSet range\nSet limit", "Select", "Back");
  250. }
  251. if (dialogid == SPEEDCAM_DIALOG_EDIT_RANGE)
  252. {
  253. if (!response)
  254. return ShowPlayerDialogEx(playerid, SPEEDCAM_DIALOG_EDIT_IDX, DIALOG_STYLE_LIST, "{FFFF00}Edit a speed camera", "Move position to player\nSet angle\nSet range\nSet limit", "Select", "Back");
  255. new Float:range;
  256. if (sscanf(inputtext, "f", range))
  257. {
  258. return ShowPlayerDialogEx(playerid, SPEEDCAM_DIALOG_EDIT_RANGE, DIALOG_STYLE_INPUT, "{FFFF00}Edit a speed camera", "{FFFFFF}Enter the new range of the speed camera.\n\n\
  259. {FFFF00}Range must be a number (decimals allowed).", "OK", "Back");
  260. }
  261. new id = GetPVarInt(playerid, "_scCacheEditId");
  262. SpeedCameras[id][_scRange] = range;
  263. SaveSpeedCamera(id);
  264. SendClientMessageEx(playerid, COLOR_WHITE, "Speed camera's ranged changed.");
  265. new logText[128];
  266. format(logText, sizeof(logText), "%s(%d) has changed speed camera %d's range to %f",
  267. GetPlayerNameExt(playerid), GetPlayerSQLId(playerid), SpeedCameras[id][_scDatabase], SpeedCameras[id][_scRange]);
  268. Log("logs/speedcam.log", logText);
  269. ShowPlayerDialogEx(playerid, SPEEDCAM_DIALOG_EDIT_IDX, DIALOG_STYLE_LIST, "{FFFF00}Edit a speed camera", "Move position to player\nSet angle\nSet range\nSet limit", "Select", "Back");
  270. }
  271. if (dialogid == SPEEDCAM_DIALOG_EDIT_LIMIT)
  272. {
  273. if (!response)
  274. return ShowPlayerDialogEx(playerid, SPEEDCAM_DIALOG_EDIT_IDX, DIALOG_STYLE_LIST, "{FFFF00}Edit a speed camera", "Move position to player\nSet angle\nSet range\nSet limit", "Select", "Back");
  275. new Float:limit;
  276. if (sscanf(inputtext, "f", limit))
  277. {
  278. return ShowPlayerDialogEx(playerid, SPEEDCAM_DIALOG_EDIT_LIMIT, DIALOG_STYLE_INPUT, "{FFFF00}Edit a speed camera", "{FFFFFF}Enter the new speed limit of the speed camera (mph).\n\n\
  279. {FFFF00}Limit must be a number (decimals allowed).", "OK", "Back");
  280. }
  281. new id = GetPVarInt(playerid, "_scCacheEditId");
  282. SpeedCameras[id][_scLimit] = limit;
  283. new szLimit[50];
  284. format(szLimit, sizeof(szLimit), "{FFFFFF}Speed Limit\n{FF0000}%i {FFFFFF}MPH", floatround(SpeedCameras[id][_scLimit], floatround_round));
  285. UpdateDynamic3DTextLabelText(SpeedCameras[id][_scTextID], COLOR_TWWHITE, szLimit);
  286. SaveSpeedCamera(id);
  287. SendClientMessageEx(playerid, COLOR_WHITE, "Speed camera's limit changed.");
  288. new logText[128];
  289. format(logText, sizeof(logText), "%s(%d) has changed speed camera %d's limit to %f",
  290. GetPlayerNameExt(playerid), GetPlayerSQLId(playerid), SpeedCameras[id][_scDatabase], SpeedCameras[id][_scLimit]);
  291. Log("logs/speedcam.log", logText);
  292. ShowPlayerDialogEx(playerid, SPEEDCAM_DIALOG_EDIT_IDX, DIALOG_STYLE_LIST, "{FFFF00}Edit a speed camera", "Move position to player\nSet angle\nSet range\nSet limit", "Select", "Back");
  293. }
  294. if (dialogid == SPEEDCAM_DIALOG_DELETE)
  295. {
  296. if (!response)
  297. {
  298. DeletePVar(playerid, "_scCacheDeleteId");
  299. return ShowPlayerDialogEx(playerid, SPEEDCAM_DIALOG_MAIN, DIALOG_STYLE_LIST, "{FFFF00}Speed Cameras", "Create a speed camera\nEdit a speed camera\nDelete a speed camera\n\
  300. Get nearest speedcamera (static only)", \
  301. "Select", "Cancel");
  302. }
  303. new id;
  304. if (sscanf(inputtext, "i", id))
  305. return ShowPlayerDialogEx(playerid, SPEEDCAM_DIALOG_DELETE, DIALOG_STYLE_INPUT, "{FFFF00}Delete a speed camera", "{FFFFFF}Enter the ID of the speed camera you wish to delete.\n\n\
  306. {FFFF00}ID must be a number.", "OK", "Back");
  307. if (id >= MAX_SPEEDCAMERAS || id < 0)
  308. return ShowPlayerDialogEx(playerid, SPEEDCAM_DIALOG_DELETE, DIALOG_STYLE_INPUT, "{FFFF00}Delete a speed camera", "{FFFFFF}Enter the ID of the speed camera you wish to delete.\n\n\
  309. {FFFF00}ID must not be above the maximum or below 0.", "OK", "Back");
  310. if (SpeedCameras[id][_scActive] == false)
  311. return ShowPlayerDialogEx(playerid, SPEEDCAM_DIALOG_DELETE, DIALOG_STYLE_INPUT, "{FFFF00}Delete a speed camera", "{FFFFFF}Enter the ID of the speed camera you wish to delete.\n\n\
  312. {FFFF00}No active camera with that ID.", "OK", "Back");
  313. SetPVarInt(playerid, "_scCacheDeleteId", id);
  314. new msg[256];
  315. format(msg, sizeof(msg), "{FFFFFF}Are you sure you want to delete speed camera %i?\n\n{FFFF00}Range: {FFFFFF}%f\n\
  316. {FFFF00}Limit: {FFFFFF}%f", id, SpeedCameras[id][_scRange], SpeedCameras[id][_scLimit]);
  317. ShowPlayerDialogEx(playerid, SPEEDCAM_DIALOG_CONFIRMDEL, DIALOG_STYLE_MSGBOX, "{FFFF00}Delete a speed camera", msg, "Delete", "Cancel");
  318. }
  319. if (dialogid == SPEEDCAM_DIALOG_CONFIRMDEL)
  320. {
  321. if (!response)
  322. {
  323. DeletePVar(playerid, "_scCacheDeleteId");
  324. return ShowPlayerDialogEx(playerid, SPEEDCAM_DIALOG_MAIN, DIALOG_STYLE_LIST, "{FFFF00}Speed Cameras", "Create a speed camera\nEdit a speed camera\nDelete a speed camera\n\
  325. Get nearest speedcamera", \
  326. "Select", "Cancel");
  327. }
  328. new id = GetPVarInt(playerid, "_scCacheDeleteId");
  329. new db = SpeedCameras[id][_scDatabase];
  330. DespawnSpeedCamera(id);
  331. SpeedCameras[id][_scActive] = false;
  332. new query[256];
  333. mysql_format(MainPipeline, query, sizeof(query), "DELETE FROM speed_cameras WHERE id=%i", SpeedCameras[id][_scDatabase]);
  334. mysql_tquery(MainPipeline, query, "OnQueryFinish", "i", SENDDATA_THREAD);
  335. //SaveSpeedCamera(id); dafuq is this doing here
  336. SendClientMessageEx(playerid, COLOR_RED, "Speed camera deleted.");
  337. DeletePVar(playerid, "_scCacheDeleteId");
  338. new logText[56];
  339. format(logText, sizeof(logText), "%s(%d) has deleted speed camera %d",
  340. GetPlayerNameExt(playerid), GetPlayerSQLId(playerid), db);
  341. Log("logs/speedcam.log", logText);
  342. }
  343. if (dialogid == SPEEDCAM_DIALOG_GETNEAREST)
  344. {
  345. return ShowPlayerDialogEx(playerid, SPEEDCAM_DIALOG_MAIN, DIALOG_STYLE_LIST, "{FFFF00}Speed Cameras", "Create a speed camera\nEdit a speed camera\nDelete a speed camera\n\
  346. Get nearest speedcamera", \
  347. "Select", "Cancel");
  348. }
  349. return 0;
  350. }
  351. stock CreateSpeedCamera(Float:x, Float:y, Float:z, Float:rotation, Float:range, Float:limit)
  352. {
  353. new loadedCams = 0;
  354. new index;
  355. for (new i = 0; i < MAX_SPEEDCAMERAS; i++)
  356. {
  357. if (SpeedCameras[i][_scActive])
  358. {
  359. loadedCams++;
  360. }
  361. else
  362. {
  363. index = i;
  364. break;
  365. }
  366. }
  367. if (loadedCams == MAX_SPEEDCAMERAS)
  368. return -1;
  369. SpeedCameras[index][_scActive] = true;
  370. SpeedCameras[index][_scPosX] = x;
  371. SpeedCameras[index][_scPosY] = y;
  372. SpeedCameras[index][_scPosZ] = z;
  373. SpeedCameras[index][_scRotation] = rotation;
  374. SpeedCameras[index][_scRange] = range;
  375. SpeedCameras[index][_scLimit] = limit;
  376. SpeedCameras[index][_scObjectId] = -1;
  377. StoreNewSpeedCameraInMySQL(index);
  378. SpawnSpeedCamera(index);
  379. return index;
  380. }
  381. stock SpawnSpeedCamera(i)
  382. {
  383. if (SpeedCameras[i][_scActive] && SpeedCameras[i][_scObjectId] == -1)
  384. {
  385. SpeedCameras[i][_scObjectId] = CreateDynamicObject(18880, SpeedCameras[i][_scPosX], SpeedCameras[i][_scPosY], SpeedCameras[i][_scPosZ], 0, 0, SpeedCameras[i][_scRotation]);
  386. new szLimit[50];
  387. format(szLimit, sizeof(szLimit), "{FFFFFF}Speed Limit\n{FF0000}%i {FFFFFF}MPH", floatround(SpeedCameras[i][_scLimit], floatround_round));
  388. SpeedCameras[i][_scTextID] = CreateDynamic3DTextLabel(szLimit, COLOR_TWWHITE, SpeedCameras[i][_scPosX], SpeedCameras[i][_scPosY], SpeedCameras[i][_scPosZ]+5, 30.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 1, -1, -1, -1);
  389. }
  390. }
  391. stock DespawnSpeedCamera(i)
  392. {
  393. if (SpeedCameras[i][_scActive])
  394. {
  395. DestroyDynamicObject(SpeedCameras[i][_scObjectId]);
  396. DestroyDynamic3DTextLabel(SpeedCameras[i][_scTextID]);
  397. SpeedCameras[i][_scObjectId] = -1;
  398. }
  399. }
  400. stock SaveSpeedCameras()
  401. {
  402. for (new c = 0; c < MAX_SPEEDCAMERAS; c++)
  403. {
  404. SaveSpeedCamera(c);
  405. }
  406. }
  407. CMD:speedcam(playerid, params[])
  408. {
  409. if (IsPlayerInAnyVehicle(playerid))
  410. return SendClientMessageEx(playerid, COLOR_GREY, "You cannot manage speed cameras whilst inside a vehicle.");
  411. if (IsAGovernment(playerid) && PlayerInfo[playerid][pRank] == Group_GetMaxRank(PlayerInfo[playerid][pLeader]) || PlayerInfo[playerid][pAdmin] >= 1337)
  412. {
  413. ShowPlayerDialogEx(playerid, SPEEDCAM_DIALOG_MAIN, DIALOG_STYLE_LIST, "{FFFF00}Speed Cameras", "Create a speed camera\nEdit a speed camera\nDelete a speed camera\n\
  414. Get nearest speedcamera", "Select", "Cancel");
  415. }
  416. else
  417. {
  418. SendClientMessageEx(playerid, COLOR_GREY, "You do not have permission to use this command.");
  419. return 1;
  420. }
  421. return 1;
  422. }
  423. CMD:gotospeedcam(playerid, params[]) {
  424. if(PlayerInfo[playerid][pAdmin] >= 4 || PlayerInfo[playerid][pASM] >= 1)
  425. {
  426. new i;
  427. if(sscanf(params, "d", i)) return SendClientMessageEx(playerid, COLOR_GREY, "USAGE: /gotospeedcam [Speedcam id]");
  428. if(i < 0 || i > MAX_SPEEDCAMERAS) return SendClientMessageEx(playerid, COLOR_GREY, "USAGE: /gotospeedcam [Speedcam id]");
  429. if (SpeedCameras[i][_scActive] == true)
  430. {
  431. if (GetPlayerState(playerid) == 2)
  432. {
  433. new tmpcar = GetPlayerVehicleID(playerid);
  434. SetVehiclePos(tmpcar, SpeedCameras[i][_scPosX], SpeedCameras[i][_scPosY], SpeedCameras[i][_scPosZ]);
  435. LinkVehicleToInterior(tmpcar, 0);
  436. SetVehicleVirtualWorld(tmpcar, 0);
  437. fVehSpeed[playerid] = 0.0;
  438. }
  439. else
  440. {
  441. SetPlayerPos(playerid, SpeedCameras[i][_scPosX], SpeedCameras[i][_scPosY], SpeedCameras[i][_scPosZ]);
  442. }
  443. SendClientMessageEx(playerid, COLOR_GRAD1, " You have been teleported!");
  444. SetPlayerInterior(playerid,0);
  445. PlayerInfo[playerid][pInt] = 0;
  446. SetPlayerVirtualWorld(playerid, 0);
  447. PlayerInfo[playerid][pVW] = 0;
  448. return 1;
  449. }
  450. else return SendClientMessageEx(playerid, COLOR_GRAD2, "That speed camera isn't active!");
  451. }
  452. else
  453. {
  454. SendClientMessageEx(playerid, COLOR_GRAD2, " You are not authorized.");
  455. }
  456. return 1;
  457. }
  458. stock SaveSpeedCamera(i)
  459. {
  460. if (SpeedCameras[i][_scActive] != true)
  461. return;
  462. new query[1024];
  463. mysql_format(MainPipeline, query, sizeof(query), "UPDATE speed_cameras SET pos_x=%f, pos_y=%f, pos_z=%f, rotation=%f, `range`=%f, speed_limit=%f WHERE id=%i",
  464. SpeedCameras[i][_scPosX], SpeedCameras[i][_scPosY], SpeedCameras[i][_scPosZ], SpeedCameras[i][_scRotation], SpeedCameras[i][_scRange], SpeedCameras[i][_scLimit],
  465. SpeedCameras[i][_scDatabase]);
  466. mysql_tquery(MainPipeline, query, "OnQueryFinish", "i", SENDDATA_THREAD);
  467. }
  468. stock LoadSpeedCameras()
  469. {
  470. printf("[SpeedCameras] Loading data from database...");
  471. mysql_tquery(MainPipeline, "SELECT * FROM speed_cameras", "OnLoadSpeedCameras", "");
  472. return 1;
  473. }
  474. forward OnLoadSpeedCameras();
  475. public OnLoadSpeedCameras()
  476. {
  477. new rows, index;
  478. cache_get_row_count(rows);
  479. while((index < rows))
  480. {
  481. cache_get_value_name_int(index, "id", SpeedCameras[index][_scDatabase]);
  482. cache_get_value_name_float(index, "pos_x", SpeedCameras[index][_scPosX]);
  483. cache_get_value_name_float(index, "pos_y", SpeedCameras[index][_scPosY]);
  484. cache_get_value_name_float(index, "pos_z", SpeedCameras[index][_scPosZ]);
  485. cache_get_value_name_float(index, "rotation", SpeedCameras[index][_scRotation]);
  486. cache_get_value_name_float(index, "range", SpeedCameras[index][_scRange]);
  487. cache_get_value_name_float(index, "speed_limit", SpeedCameras[index][_scLimit]);
  488. if(SpeedCameras[index][_scPosX] != 0.0)
  489. {
  490. SpeedCameras[index][_scActive] = true;
  491. SpeedCameras[index][_scObjectId] = -1;
  492. SpawnSpeedCamera(index);
  493. }
  494. index++;
  495. }
  496. if (index == 0)
  497. printf("[SpeedCameras] No Speed Cameras loaded.");
  498. else
  499. printf("[SpeedCameras] Loaded %i Speed Cameras.", index);
  500. return 1;
  501. }
  502. stock StoreNewSpeedCameraInMySQL(index)
  503. {
  504. new string[512];
  505. mysql_format(MainPipeline, string, sizeof(string), "INSERT INTO speed_cameras (pos_x, pos_y, pos_z, rotation, `range`, speed_limit) VALUES (%f, %f, %f, %f, %f, %f)",
  506. SpeedCameras[index][_scPosX], SpeedCameras[index][_scPosY], SpeedCameras[index][_scPosZ], SpeedCameras[index][_scRotation], SpeedCameras[index][_scRange], SpeedCameras[index][_scLimit]);
  507. mysql_tquery(MainPipeline, string, "OnNewSpeedCamera", "i", index);
  508. return 1;
  509. }
  510. forward OnNewSpeedCamera(index);
  511. public OnNewSpeedCamera(index)
  512. {
  513. new db = cache_insert_id();
  514. SpeedCameras[index][_scDatabase] = db;
  515. }
  516. stock UpdateSpeedCamerasForPlayer(p)
  517. {
  518. if (!IsPlayerConnected(p) || !IsPlayerInAnyVehicle(p) || GetPlayerState(p) != PLAYER_STATE_DRIVER) return;
  519. // static speed cameras
  520. for (new c = 0; c < MAX_SPEEDCAMERAS; c++)
  521. {
  522. if (SpeedCameras[c][_scActive] == false) continue;
  523. if (IsPlayerInRangeOfPoint(p, SpeedCameras[c][_scRange], SpeedCameras[c][_scPosX], SpeedCameras[c][_scPosY], SpeedCameras[c][_scPosZ]))
  524. {
  525. if(PlayerInfo[p][pConnectHours] > 16)
  526. {
  527. new Float:speedLimit = SpeedCameras[c][_scLimit];
  528. new Float:vehicleSpeed = player_get_speed(p);
  529. if (vehicleSpeed > speedLimit && PlayerInfo[p][pTicketTime] == 0)
  530. {
  531. new vehicleid = GetPlayerVehicleID(p);
  532. if(!IsAPlane(vehicleid) && !IsAHelicopter(vehicleid) && GetVehicleModel(vehicleid) != 481 && GetVehicleModel(vehicleid) != 509 && GetVehicleModel(vehicleid) != 510)
  533. {
  534. if(GetPVarType(p, "LockPickPlayerSQLId") && GetPVarInt(p, "LockPickVehicle") == vehicleid) {
  535. new string[155], Amount = floatround(125*(vehicleSpeed-speedLimit), floatround_round)+2000;
  536. SetPVarInt(p, "VLPTickets", GetPVarInt(p, "VLPTickets")+Amount);
  537. mysql_format(MainPipeline, string, sizeof(string), "UPDATE `vehicles` SET `pvTicket` = '%d' WHERE `id` = '%d'", GetPVarInt(p, "VLPTickets"), GetPVarInt(p, "LockPickVehicleSQLId"));
  538. mysql_tquery(MainPipeline, string, "OnQueryFinish", "ii", SENDDATA_THREAD, p);
  539. PlayerInfo[p][pTicketTime] = 60;
  540. format(string, sizeof(string), "You were caught speeding and have received a speeding ticket of $%s", number_format(Amount));
  541. SendClientMessageEx(p, COLOR_WHITE, string);
  542. PlayerPlaySound(p, 1132, 0.0, 0.0, 0.0);
  543. PlayerTextDrawShow(p, _vhudFlash[p]);
  544. SetTimerEx("TurnOffFlash", 500, 0, "i", p);
  545. }
  546. foreach(new i: Player)
  547. {
  548. new v = GetPlayerVehicle(i, vehicleid);
  549. if(v != -1)
  550. {
  551. new string[128], Amount = floatround(125*(vehicleSpeed-speedLimit), floatround_round)+2000;
  552. PlayerVehicleInfo[i][v][pvTicket] += Amount;
  553. PlayerInfo[p][pTicketTime] = 60;
  554. format(string, sizeof(string), "You were caught speeding and have received a speeding ticket of $%s", number_format(Amount));
  555. SendClientMessageEx(p, COLOR_WHITE, string);
  556. PlayerPlaySound(p, 1132, 0.0, 0.0, 0.0);
  557. PlayerTextDrawShow(p, _vhudFlash[p]);
  558. SetTimerEx("TurnOffFlash", 500, 0, "i", p);
  559. g_mysql_SaveVehicle(i, v);
  560. }
  561. }
  562. }
  563. }
  564. }
  565. }
  566. }
  567. }