garages.pwn 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645
  1. /*
  2. /$$ /$$ /$$$$$$ /$$$$$$$ /$$$$$$$
  3. | $$$ | $$ /$$__ $$ | $$__ $$| $$__ $$
  4. | $$$$| $$| $$ \__/ | $$ \ $$| $$ \ $$
  5. | $$ $$ $$| $$ /$$$$ /$$$$$$| $$$$$$$/| $$$$$$$/
  6. | $$ $$$$| $$|_ $$|______/| $$__ $$| $$____/
  7. | $$\ $$$| $$ \ $$ | $$ \ $$| $$
  8. | $$ \ $$| $$$$$$/ | $$ | $$| $$
  9. |__/ \__/ \______/ |__/ |__/|__/
  10. Dynamic Garages 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. stock SaveGarages()
  35. {
  36. for(new i = 0; i < MAX_GARAGES; i++)
  37. {
  38. SaveGarage(i);
  39. }
  40. return 1;
  41. }
  42. hook OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) {
  43. if(arrAntiCheat[playerid][ac_iFlags][AC_DIALOGSPOOFING] > 0) return 1;
  44. if(dialogid == GARAGELOCK)
  45. {
  46. if(response)
  47. {
  48. new i = GetPVarInt(playerid, "Garage");
  49. if(isnull(inputtext)) return SendClientMessage(playerid, COLOR_GREY, "You did not enter anything" );
  50. if(strlen(inputtext) > 24) return SendClientMessageEx(playerid, COLOR_GREY, "The password can not be greater than 24 characters.");
  51. if(strcmp(inputtext, GarageInfo[i][gar_Pass], true) == 0)
  52. {
  53. if(GarageInfo[i][gar_Locked] == 0)
  54. {
  55. GarageInfo[i][gar_Locked] = 1;
  56. SendClientMessageEx(playerid, COLOR_WHITE, "Password accepted, garage locked.");
  57. }
  58. else
  59. {
  60. GarageInfo[i][gar_Locked] = 0;
  61. SendClientMessageEx(playerid, COLOR_WHITE, "Password accepted, garage unlocked.");
  62. }
  63. SaveGarage(i);
  64. }
  65. else SendClientMessageEx(playerid, COLOR_WHITE, "Password declined.");
  66. }
  67. }
  68. return 0;
  69. }
  70. CMD:changegaragepass(playerid, params[])
  71. {
  72. new garagepass[24];
  73. for(new i = 0; i < sizeof(GarageInfo); i++)
  74. {
  75. if (IsPlayerInRangeOfPoint(playerid,3.0,GarageInfo[i][gar_ExteriorX], GarageInfo[i][gar_ExteriorY], GarageInfo[i][gar_ExteriorZ]) && PlayerInfo[playerid][pVW] == GarageInfo[i][gar_ExteriorVW] || IsPlayerInRangeOfPoint(playerid,3.0,GarageInfo[i][gar_InteriorX], GarageInfo[i][gar_InteriorY], GarageInfo[i][gar_InteriorZ]) && PlayerInfo[playerid][pVW] == GarageInfo[i][gar_InteriorVW])
  76. {
  77. if(sscanf(params, "s[24]", garagepass))
  78. {
  79. SendClientMessageEx(playerid, COLOR_GREY, "USAGE: /changegaragepass [pass]");
  80. SendClientMessageEx(playerid, COLOR_WHITE, "To remove the password on the door set the password to 'none'.");
  81. return 1;
  82. }
  83. if(GarageInfo[i][gar_Owner] == GetPlayerSQLId(playerid))
  84. {
  85. format(GarageInfo[i][gar_Pass], 24, "%s", garagepass);
  86. SendClientMessageEx(playerid, COLOR_WHITE, "You have changed the password of this door.");
  87. SaveGarage(i);
  88. }
  89. else SendClientMessageEx(playerid, COLOR_GREY, "You cannot change the password on this lock.");
  90. }
  91. }
  92. return 1;
  93. }
  94. CMD:lockgarage(playerid, params[])
  95. {
  96. for(new i = 0; i < sizeof(GarageInfo); i++)
  97. {
  98. if(IsPlayerInRangeOfPoint(playerid, 3.0, GarageInfo[i][gar_ExteriorX], GarageInfo[i][gar_ExteriorY], GarageInfo[i][gar_ExteriorZ]) && PlayerInfo[playerid][pVW] == GarageInfo[i][gar_ExteriorVW] || IsPlayerInRangeOfPoint(playerid,3.0,GarageInfo[i][gar_InteriorX], GarageInfo[i][gar_InteriorY], GarageInfo[i][gar_InteriorZ]) && PlayerInfo[playerid][pVW] == GarageInfo[i][gar_InteriorVW])
  99. {
  100. if(GarageInfo[i][gar_Owner] == GetPlayerSQLId(playerid))
  101. {
  102. if(GarageInfo[i][gar_Locked] == 0)
  103. {
  104. GarageInfo[i][gar_Locked] = 1;
  105. SendClientMessageEx(playerid, COLOR_WHITE, "This garage has been locked.");
  106. }
  107. else if(GarageInfo[i][gar_Locked] == 1)
  108. {
  109. GarageInfo[i][gar_Locked] = 0;
  110. SendClientMessageEx(playerid, COLOR_GREY, "This garage has been unlocked.");
  111. }
  112. }
  113. else SendClientMessageEx(playerid, COLOR_GREY, "You cannot lock this garage.");
  114. }
  115. }
  116. return 1;
  117. }
  118. CMD:garagepass(playerid, params[])
  119. {
  120. for(new i = 0; i < sizeof(GarageInfo); i++)
  121. {
  122. if (IsPlayerInRangeOfPoint(playerid, 3.0, GarageInfo[i][gar_ExteriorX], GarageInfo[i][gar_ExteriorY], GarageInfo[i][gar_ExteriorZ]) && PlayerInfo[playerid][pVW] == GarageInfo[i][gar_ExteriorVW] || IsPlayerInRangeOfPoint(playerid, 3.0, GarageInfo[i][gar_InteriorX], GarageInfo[i][gar_InteriorY], GarageInfo[i][gar_InteriorZ]) && PlayerInfo[playerid][pVW] == GarageInfo[i][gar_InteriorVW])
  123. {
  124. if(strcmp(GarageInfo[i][gar_Pass], "None", true) == 0 || GarageInfo[i][gar_Pass] <= 1) return SendClientMessageEx(playerid, COLOR_GREY, "This garage isn't locked.");
  125. ShowPlayerDialogEx(playerid, GARAGELOCK, DIALOG_STYLE_INPUT, "Garage Security", "Enter the password for this garage", "Login", "Cancel");
  126. SetPVarInt(playerid, "Garage", i);
  127. break;
  128. }
  129. }
  130. return 1;
  131. }
  132. CMD:garageedit(playerid, params[])
  133. {
  134. if(PlayerInfo[playerid][pAdmin] < 4 && PlayerInfo[playerid][pASM] < 1 && PlayerInfo[playerid][pShopTech] < 1) return SendClientMessageEx(playerid, COLOR_GRAD1, "You are not authorized to use that command.");
  135. new option[128], garageid, value, string[128];
  136. if(sscanf(params, "s[128]iD(0)", option, garageid, value))
  137. {
  138. SendClientMessage(playerid, COLOR_GRAD2, "USAGE: /garageedit [option] [garageid] [value]");
  139. SendClientMessage(playerid, COLOR_GRAD2, "Available Options: Exterior, CustomExterior, Size, VW, Delete");
  140. SendClientMessageEx(playerid, COLOR_GRAD1, "Valid Sizes: 1 = Small | 2 = Medium | 3 = Large | 4 = Extra Large");
  141. return 1;
  142. }
  143. if(garageid >= MAX_GARAGES) return SendClientMessageEx(playerid, COLOR_WHITE, "Invalid Garage ID!");
  144. if(strcmp(option, "exterior", true) == 0)
  145. {
  146. GetPlayerPos(playerid, GarageInfo[garageid][gar_ExteriorX], GarageInfo[garageid][gar_ExteriorY], GarageInfo[garageid][gar_ExteriorZ]);
  147. GetPlayerFacingAngle(playerid, GarageInfo[garageid][gar_ExteriorA]);
  148. GarageInfo[garageid][gar_ExteriorVW] = GetPlayerVirtualWorld(playerid);
  149. GarageInfo[garageid][gar_ExteriorInt] = GetPlayerInterior(playerid);
  150. SendClientMessageEx(playerid, COLOR_WHITE, "You have changed the exterior!");
  151. CreateGarage(garageid);
  152. format(string, sizeof(string), "%s has edited Garage ID: %d's Exterior.", GetPlayerNameEx(playerid), garageid);
  153. Log("logs/garage.log", string);
  154. }
  155. else if(strcmp(option, "customexterior", true) == 0)
  156. {
  157. if(GarageInfo[garageid][gar_CustomExterior] == 0)
  158. {
  159. GarageInfo[garageid][gar_CustomExterior] = 1;
  160. SendClientMessageEx(playerid, COLOR_WHITE, "Garage set to custom exterior!");
  161. }
  162. else
  163. {
  164. GarageInfo[garageid][gar_CustomExterior] = 0;
  165. SendClientMessageEx(playerid, COLOR_WHITE, "Garage set to normal (not custom) exterior!");
  166. }
  167. CreateGarage(garageid);
  168. format(string, sizeof(string), "%s has edited Garage ID: %d's CustomExterior.", GetPlayerNameEx(playerid), garageid);
  169. Log("logs/garage.log", string);
  170. }
  171. else if(strcmp(option, "size", true) == 0)
  172. {
  173. if(!(1 <= value <= 4)) return SendClientMessageEx(playerid, COLOR_GRAD1, "Valid Sizes: 1 = Small | 2 = Medium | 3 = Large | 4 = Extra Large");
  174. new size[12];
  175. if(value == 1)
  176. {
  177. GarageInfo[garageid][gar_InteriorX] = 1198.753051;
  178. GarageInfo[garageid][gar_InteriorY] = 1591.710937;
  179. GarageInfo[garageid][gar_InteriorZ] = 5290.287109;
  180. GarageInfo[garageid][gar_InteriorA] = 360;
  181. size = "Small";
  182. }
  183. if(value == 2)
  184. {
  185. GarageInfo[garageid][gar_InteriorX] = 1070.967651;
  186. GarageInfo[garageid][gar_InteriorY] = 1582.612548;
  187. GarageInfo[garageid][gar_InteriorZ] = 5290.239257;
  188. GarageInfo[garageid][gar_InteriorA] = 270;
  189. size = "Medium";
  190. }
  191. if(value == 3)
  192. {
  193. GarageInfo[garageid][gar_InteriorX] = 1193.128662;
  194. GarageInfo[garageid][gar_InteriorY] = 1535.807128;
  195. GarageInfo[garageid][gar_InteriorZ] = 5290.287109;
  196. GarageInfo[garageid][gar_InteriorA] = 180;
  197. size = "Large";
  198. }
  199. if(value == 4)
  200. {
  201. GarageInfo[garageid][gar_InteriorX] = 1103.262939;
  202. GarageInfo[garageid][gar_InteriorY] = 1544.137695;
  203. GarageInfo[garageid][gar_InteriorZ] = 5290.279296;
  204. GarageInfo[garageid][gar_InteriorA] = 180;
  205. size = "Extra Large";
  206. }
  207. CreateGarage(garageid);
  208. format(string, sizeof(string), "Garage size set to %s", size);
  209. SendClientMessageEx(playerid, COLOR_WHITE, string);
  210. format(string, sizeof(string), "%s has edited Garage ID: %d's size to %s", GetPlayerNameEx(playerid), garageid, size);
  211. Log("logs/garage.log", string);
  212. }
  213. else if(strcmp(option, "vw", true) == 0)
  214. {
  215. GarageInfo[garageid][gar_InteriorVW] = value;
  216. format(string, sizeof(string), "Garage Interior VW set to %d", value);
  217. SendClientMessageEx(playerid, COLOR_WHITE, string);
  218. format(string, sizeof(string), "%s has edited Garage ID: %d's VW to %d", GetPlayerNameEx(playerid), garageid, value);
  219. Log("logs/garage.log", string);
  220. CreateGarage(garageid);
  221. }
  222. else if(strcmp(option, "delete", true) == 0)
  223. {
  224. format(string, sizeof(string), "%s has deleted Garage ID: %d was owned by %s(%d)", GetPlayerNameEx(playerid), garageid, GarageInfo[garageid][gar_OwnerName], GarageInfo[garageid][gar_Owner]);
  225. Log("logs/garage.log", string);
  226. format(string, sizeof(string), "You have successfully deleted Garage ID: %d was owned by %s", garageid, GarageInfo[garageid][gar_OwnerName]);
  227. SendClientMessageEx(playerid, COLOR_WHITE, string);
  228. GarageInfo[garageid][gar_Owner] = -1;
  229. format(GarageInfo[garageid][gar_OwnerName], MAX_PLAYER_NAME, "Nobody");
  230. GarageInfo[garageid][gar_ExteriorX] = 0.0;
  231. GarageInfo[garageid][gar_ExteriorY] = 0.0;
  232. GarageInfo[garageid][gar_ExteriorZ] = 0.0;
  233. GarageInfo[garageid][gar_ExteriorA] = 0.0;
  234. GarageInfo[garageid][gar_ExteriorVW] = 0;
  235. GarageInfo[garageid][gar_ExteriorInt] = 0;
  236. GarageInfo[garageid][gar_CustomExterior] = 0;
  237. GarageInfo[garageid][gar_InteriorX] = 0.0;
  238. GarageInfo[garageid][gar_InteriorY] = 0.0;
  239. GarageInfo[garageid][gar_InteriorZ] = 0.0;
  240. GarageInfo[garageid][gar_InteriorA] = 0.0;
  241. GarageInfo[garageid][gar_InteriorVW] = 0;
  242. format(GarageInfo[garageid][gar_Pass], MAX_PLAYER_NAME, "none");
  243. GarageInfo[garageid][gar_Locked] = 0;
  244. CreateGarage(garageid);
  245. }
  246. else return SendClientMessageEx(playerid, COLOR_GRAD2, "Invalid option!");
  247. SaveGarage(garageid);
  248. return 1;
  249. }
  250. CMD:changeddtogarage(playerid, params[])
  251. {
  252. if(PlayerInfo[playerid][pAdmin] < 4 && PlayerInfo[playerid][pASM] < 1 && PlayerInfo[playerid][pShopTech] < 1) return SendClientMessageEx(playerid, COLOR_GRAD1, "You are not authorized to use that command.");
  253. new doorid;
  254. if(sscanf(params, "d", doorid)) return SendClientMessageEx(playerid, COLOR_GRAD2, "USAGE: /changeddtogarage [doorid]");
  255. if(doorid >= MAX_DDOORS) return SendClientMessageEx(playerid, COLOR_WHITE, "Invalid Door ID!");
  256. if(DDoorsInfo[doorid][ddType] != 1) return SendClientMessageEx(playerid, COLOR_GRAD1, "This door is not owned by a player, please confirm and modify door type if needed!");
  257. new next, bool:available = false;
  258. for(new i; i < MAX_GARAGES; i++)
  259. {
  260. if(GarageInfo[i][gar_ExteriorX] == 0.0)
  261. {
  262. available = true;
  263. next = i;
  264. break;
  265. }
  266. }
  267. if(available == false) return SendClientMessageEx(playerid, COLOR_GRAD2, "No Garages available.");
  268. new string[128];
  269. GarageInfo[next][gar_Owner] = DDoorsInfo[doorid][ddOwner];
  270. format(GarageInfo[next][gar_OwnerName], MAX_PLAYER_NAME, "%s", DDoorsInfo[doorid][ddOwnerName]);
  271. GarageInfo[next][gar_ExteriorX] = DDoorsInfo[doorid][ddExteriorX];
  272. GarageInfo[next][gar_ExteriorY] = DDoorsInfo[doorid][ddExteriorY];
  273. GarageInfo[next][gar_ExteriorZ] = DDoorsInfo[doorid][ddExteriorZ];
  274. GarageInfo[next][gar_ExteriorA] = DDoorsInfo[doorid][ddExteriorA];
  275. GarageInfo[next][gar_ExteriorVW] = DDoorsInfo[doorid][ddExteriorVW];
  276. GarageInfo[next][gar_ExteriorInt] = DDoorsInfo[doorid][ddExteriorInt];
  277. GarageInfo[next][gar_CustomExterior] = DDoorsInfo[doorid][ddCustomExterior];
  278. GarageInfo[next][gar_InteriorX] = DDoorsInfo[doorid][ddInteriorX];
  279. GarageInfo[next][gar_InteriorY] = DDoorsInfo[doorid][ddInteriorY];
  280. GarageInfo[next][gar_InteriorZ] = DDoorsInfo[doorid][ddInteriorZ];
  281. GarageInfo[next][gar_InteriorA] = DDoorsInfo[doorid][ddInteriorA];
  282. GarageInfo[next][gar_InteriorVW] = DDoorsInfo[doorid][ddInteriorVW];
  283. format(GarageInfo[next][gar_Pass], 24, "%s", DDoorsInfo[doorid][ddPass]);
  284. GarageInfo[next][gar_Locked] = DDoorsInfo[doorid][ddLocked];
  285. format(string, sizeof(string), "Door ID %d has been transferred to Garage ID: %d by %s", doorid, next, GetPlayerNameEx(playerid));
  286. SendClientMessageEx(playerid, COLOR_GRAD2, string);
  287. Log("logs/ddedit.log", string);
  288. Log("logs/garage.log", string);
  289. CreateGarage(next);
  290. SaveGarage(next);
  291. SendClientMessageEx(playerid, COLOR_GRAD2, "If garage has been successfully transferred delete the door. /ddedit delete");
  292. return 1;
  293. }
  294. CMD:garageowner(playerid, params[])
  295. {
  296. if(PlayerInfo[playerid][pAdmin] >= 4 || PlayerInfo[playerid][pASM] >= 1 || PlayerInfo[playerid][pShopTech] >= 1)
  297. {
  298. new playername[MAX_PLAYER_NAME], garageid, string[128];
  299. if(sscanf(params, "ds[24]", garageid, playername)) return SendClientMessageEx(playerid, COLOR_WHITE, "USAGE: /garageowner [garageid] [player name]");
  300. new giveplayerid = ReturnUser(playername);
  301. if(IsPlayerConnected(giveplayerid))
  302. {
  303. format(GarageInfo[garageid][gar_OwnerName], MAX_PLAYER_NAME, "%s", GetPlayerNameEx(giveplayerid));
  304. GarageInfo[garageid][gar_Owner] = GetPlayerSQLId(giveplayerid);
  305. SendClientMessageEx(playerid, COLOR_WHITE, "You have successfully changed the owner of this garage.");
  306. CreateGarage(garageid);
  307. SaveGarage(garageid);
  308. format(string, sizeof(string), "%s has edited Garage ID: %d's owner to %s (SQL ID: %d).", GetPlayerNameEx(playerid), garageid, GetPlayerNameEx(giveplayerid), GetPlayerSQLId(giveplayerid));
  309. Log("logs/garage.log", string);
  310. }
  311. else
  312. {
  313. mysql_format(MainPipeline, string, sizeof(string), "SELECT `id`, `Username` FROM `accounts` WHERE `Username` = '%e'", playername);
  314. mysql_tquery(MainPipeline, string, "OnSetGarageOwner", "ii", playerid, garageid);
  315. }
  316. }
  317. else return SendClientMessageEx(playerid, COLOR_GRAD1, "You are not authorized to use that command!");
  318. return 1;
  319. }
  320. CMD:agaragepass(playerid, params[])
  321. {
  322. if(PlayerInfo[playerid][pAdmin] < 4 && PlayerInfo[playerid][pASM] < 1 && PlayerInfo[playerid][pShopTech] < 1) return SendClientMessageEx(playerid, COLOR_GRAD2, "You are not authorized to use that command.");
  323. new string[128],
  324. garageid,
  325. garagepass[24];
  326. if(sscanf(params, "ds[24]", garageid, garagepass)) return SendClientMessageEx(playerid, COLOR_GREY, "USAGE: /agaragepass [garageid] [pass]"), SendClientMessageEx(playerid, COLOR_WHITE, "To remove the password on the garage set the password to 'none' ");
  327. format(GarageInfo[garageid][gar_Pass], 24, "%s", garagepass);
  328. SendClientMessageEx(playerid, COLOR_WHITE, "You have changed the password of that garage.");
  329. SaveGarage(garageid);
  330. format(string, sizeof(string), "%s has edited Garage ID: %d's password to %s.", GetPlayerNameEx(playerid), garageid, garagepass);
  331. Log("logs/garage.log", string);
  332. return 1;
  333. }
  334. CMD:garagenext(playerid, params[])
  335. {
  336. if(PlayerInfo[playerid][pAdmin] >= 4 || PlayerInfo[playerid][pASM] >= 1 || PlayerInfo[playerid][pShopTech] >= 1)
  337. {
  338. new string[128];
  339. SendClientMessageEx(playerid, COLOR_RED, "* Listing next available garage...");
  340. for(new x; x < MAX_GARAGES; x++)
  341. {
  342. if(GarageInfo[x][gar_ExteriorX] == 0.0)
  343. {
  344. format(string, sizeof(string), "%d is available to use.", x);
  345. SendClientMessageEx(playerid, COLOR_WHITE, string);
  346. break;
  347. }
  348. }
  349. }
  350. else
  351. {
  352. SendClientMessageEx(playerid, COLOR_GRAD2, "You are not authorized to use that command.");
  353. return 1;
  354. }
  355. return 1;
  356. }
  357. CMD:goingarage(playerid, params[])
  358. {
  359. if(PlayerInfo[playerid][pAdmin] >= 4 || PlayerInfo[playerid][pASM] >= 1 || PlayerInfo[playerid][pShopTech] >= 1)
  360. {
  361. new string[48], garage;
  362. if(sscanf(params, "d", garage)) return SendClientMessageEx(playerid, COLOR_GREY, "USAGE: /goingarage [garageid]");
  363. if(garage < 0 || garage >= MAX_GARAGES)
  364. {
  365. format(string, sizeof(string), "Garage ID must be between 0 and %d.", MAX_GARAGES - 1);
  366. return SendClientMessageEx(playerid, COLOR_GREY, string);
  367. }
  368. SetPlayerPos(playerid, GarageInfo[garage][gar_InteriorX], GarageInfo[garage][gar_InteriorY], GarageInfo[garage][gar_InteriorZ]);
  369. SetPlayerFacingAngle(playerid, GarageInfo[garage][gar_InteriorA]);
  370. SetPlayerInterior(playerid, 1);
  371. PlayerInfo[playerid][pInt] = 1;
  372. PlayerInfo[playerid][pVW] = GarageInfo[garage][gar_InteriorVW];
  373. SetPlayerVirtualWorld(playerid, GarageInfo[garage][gar_InteriorVW]);
  374. Player_StreamPrep(playerid, GarageInfo[garage][gar_InteriorX], GarageInfo[garage][gar_InteriorY], GarageInfo[garage][gar_InteriorZ], FREEZE_TIME);
  375. }
  376. return 1;
  377. }
  378. CMD:gotogarage(playerid, params[])
  379. {
  380. if(PlayerInfo[playerid][pAdmin] >= 4 || PlayerInfo[playerid][pASM] >= 1 || PlayerInfo[playerid][pShopTech] >= 1)
  381. {
  382. new string[48], garage;
  383. if(sscanf(params, "d", garage)) return SendClientMessageEx(playerid, COLOR_GREY, "USAGE: /gotogarage [garageid]");
  384. if(garage < 0 || garage >= MAX_GARAGES)
  385. {
  386. format(string, sizeof(string), "GarageID must be between 0 and %d.", MAX_GARAGES - 1);
  387. return SendClientMessageEx(playerid, COLOR_GREY, string);
  388. }
  389. if(GarageInfo[garage][gar_ExteriorX] == 0.0) return SendClientMessageEx(playerid, COLOR_GRAD2, "No exterior is set for this garage");
  390. SetPlayerInterior(playerid,GarageInfo[garage][gar_ExteriorInt]);
  391. SetPlayerPos(playerid,GarageInfo[garage][gar_ExteriorX],GarageInfo[garage][gar_ExteriorY],GarageInfo[garage][gar_ExteriorZ]);
  392. SetPlayerFacingAngle(playerid, GarageInfo[garage][gar_ExteriorA]);
  393. PlayerInfo[playerid][pInt] = GarageInfo[garage][gar_ExteriorInt];
  394. SetPlayerVirtualWorld(playerid, GarageInfo[garage][gar_ExteriorVW]);
  395. PlayerInfo[playerid][pVW] = GarageInfo[garage][gar_ExteriorVW];
  396. if(GarageInfo[garage][gar_CustomExterior]) Player_StreamPrep(playerid, GarageInfo[garage][gar_ExteriorX], GarageInfo[garage][gar_ExteriorY], GarageInfo[garage][gar_ExteriorZ], FREEZE_TIME);
  397. }
  398. return 1;
  399. }
  400. CMD:garagestatus(playerid, params[])
  401. {
  402. if(PlayerInfo[playerid][pAdmin] < 4 && PlayerInfo[playerid][pASM] < 1 && PlayerInfo[playerid][pShopTech] < 1) return SendClientMessageEx(playerid, COLOR_GRAD2, "You are not authorized to use that command.");
  403. new garageid;
  404. if(sscanf(params, "i", garageid)) return SendClientMessageEx(playerid, COLOR_GREY, "USAGE: /garagestatus [garageid]");
  405. new string[128];
  406. format(string,sizeof(string),"|___________ Garage Status (ID: %d) ___________|", garageid);
  407. SendClientMessageEx(playerid, COLOR_GREEN, string);
  408. format(string, sizeof(string), "(Ext) X: %f | Y: %f | Z: %f | (Int) X: %f | Y: %f | Z: %f", GarageInfo[garageid][gar_ExteriorX], GarageInfo[garageid][gar_ExteriorY], GarageInfo[garageid][gar_ExteriorZ], GarageInfo[garageid][gar_InteriorX], GarageInfo[garageid][gar_InteriorY], GarageInfo[garageid][gar_InteriorZ]);
  409. SendClientMessageEx(playerid, COLOR_WHITE, string);
  410. format(string, sizeof(string), "Custom Ext: %d | Exterior VW: %d | Exterior Int: %d | Interior VW: %d | Locked: %d | Password: %s", GarageInfo[garageid][gar_CustomExterior], GarageInfo[garageid][gar_ExteriorVW], GarageInfo[garageid][gar_ExteriorInt], GarageInfo[garageid][gar_InteriorVW], GarageInfo[garageid][gar_Locked], GarageInfo[garageid][gar_Pass]);
  411. SendClientMessageEx(playerid, COLOR_WHITE, string);
  412. return 1;
  413. }
  414. CMD:garagenear(playerid, params[])
  415. {
  416. if(PlayerInfo[playerid][pAdmin] < 4 && PlayerInfo[playerid][pASM] < 1 && PlayerInfo[playerid][pShopTech] < 1) return SendClientMessageEx(playerid, COLOR_GRAD2, "You are not authorized to use that command.");
  417. new option, string[128];
  418. if(!sscanf(params, "d", option))
  419. {
  420. format(string, sizeof(string), "* Listing all garages within 30 meters of you in VW %d...", option);
  421. SendClientMessageEx(playerid, COLOR_RED, string);
  422. for(new i; i < MAX_GARAGES; i++)
  423. {
  424. if(GarageInfo[i][gar_InteriorX] != 0.0)
  425. {
  426. if(option == -1)
  427. {
  428. if(IsPlayerInRangeOfPoint(playerid, 30, GarageInfo[i][gar_InteriorX], GarageInfo[i][gar_InteriorY], GarageInfo[i][gar_InteriorZ]))
  429. {
  430. format(string, sizeof(string), "(Interior) Garage ID %d | %f from you", i, GetPlayerDistanceFromPoint(playerid, GarageInfo[i][gar_InteriorX], GarageInfo[i][gar_InteriorY], GarageInfo[i][gar_InteriorZ]));
  431. SendClientMessageEx(playerid, COLOR_WHITE, string);
  432. }
  433. if(IsPlayerInRangeOfPoint(playerid, 30, GarageInfo[i][gar_ExteriorX], GarageInfo[i][gar_ExteriorY], GarageInfo[i][gar_ExteriorZ]))
  434. {
  435. format(string, sizeof(string), "(Exterior) Garage ID %d | %f from you | Interior: %d", i, GetPlayerDistanceFromPoint(playerid, GarageInfo[i][gar_ExteriorX], GarageInfo[i][gar_ExteriorY], GarageInfo[i][gar_ExteriorZ]), GarageInfo[i][gar_ExteriorInt]);
  436. SendClientMessageEx(playerid, COLOR_WHITE, string);
  437. }
  438. }
  439. else
  440. {
  441. if(IsPlayerInRangeOfPoint(playerid, 30, GarageInfo[i][gar_InteriorX], GarageInfo[i][gar_InteriorY], GarageInfo[i][gar_InteriorZ]) && GarageInfo[i][gar_InteriorVW] == option)
  442. {
  443. format(string, sizeof(string), "(Interior) Garage ID %d | %f from you", i, GetPlayerDistanceFromPoint(playerid, GarageInfo[i][gar_InteriorX], GarageInfo[i][gar_InteriorY], GarageInfo[i][gar_InteriorZ]));
  444. SendClientMessageEx(playerid, COLOR_WHITE, string);
  445. }
  446. if(IsPlayerInRangeOfPoint(playerid, 30, GarageInfo[i][gar_ExteriorX], GarageInfo[i][gar_ExteriorY], GarageInfo[i][gar_ExteriorZ]) && GarageInfo[i][gar_ExteriorVW] == option)
  447. {
  448. format(string, sizeof(string), "(Exterior) Garage ID %d | %f from you | Interior: %d", i, GetPlayerDistanceFromPoint(playerid, GarageInfo[i][gar_ExteriorX], GarageInfo[i][gar_ExteriorY], GarageInfo[i][gar_ExteriorZ]), GarageInfo[i][gar_ExteriorInt]);
  449. SendClientMessageEx(playerid, COLOR_WHITE, string);
  450. }
  451. }
  452. }
  453. }
  454. }
  455. else
  456. {
  457. SendClientMessageEx(playerid, COLOR_RED, "* Listing all garages within 30 meters of you...");
  458. for(new i; i < MAX_GARAGES; i++)
  459. {
  460. if(GarageInfo[i][gar_InteriorX] != 0.0)
  461. {
  462. if(IsPlayerInRangeOfPoint(playerid, 30, GarageInfo[i][gar_InteriorX], GarageInfo[i][gar_InteriorY], GarageInfo[i][gar_InteriorZ]) && GarageInfo[i][gar_InteriorVW] == GetPlayerVirtualWorld(playerid))
  463. {
  464. format(string, sizeof(string), "(Interior) Garage ID %d | %f from you", i, GetPlayerDistanceFromPoint(playerid, GarageInfo[i][gar_InteriorX], GarageInfo[i][gar_InteriorY], GarageInfo[i][gar_InteriorZ]));
  465. SendClientMessageEx(playerid, COLOR_WHITE, string);
  466. }
  467. if(IsPlayerInRangeOfPoint(playerid, 30, GarageInfo[i][gar_ExteriorX], GarageInfo[i][gar_ExteriorY], GarageInfo[i][gar_ExteriorZ]) && GarageInfo[i][gar_ExteriorVW] == GetPlayerVirtualWorld(playerid))
  468. {
  469. format(string, sizeof(string), "(Exterior) Garage ID %d | %f from you | Interior: %d", i, GetPlayerDistanceFromPoint(playerid, GarageInfo[i][gar_ExteriorX], GarageInfo[i][gar_ExteriorY], GarageInfo[i][gar_ExteriorZ]), GarageInfo[i][gar_ExteriorInt]);
  470. SendClientMessageEx(playerid, COLOR_WHITE, string);
  471. }
  472. }
  473. }
  474. }
  475. return 1;
  476. }
  477. CMD:garagehelp(playerid, params[])
  478. {
  479. SendClientMessageEx(playerid, COLOR_GRAD2, "*** GARAGE *** /garagepass /lockgarage /changegaragepass");
  480. if(PlayerInfo[playerid][pAdmin] >= 4 || PlayerInfo[playerid][pASM] >= 1 || PlayerInfo[playerid][pShopTech] >= 1)
  481. {
  482. SendClientMessageEx(playerid, COLOR_GRAD2, "*** GARAGE - Admin *** /garageedit /garageowner /agaragepass /garagenext /gotogarage /goingarage /garagenear /garagestatus /changeddtogarage");
  483. }
  484. return 1;
  485. }
  486. stock LoadGarages()
  487. {
  488. printf("[LoadGarages] Loading data from database...");
  489. mysql_tquery(MainPipeline, "SELECT * FROM `garages`", "OnLoadGarages", "");
  490. }
  491. forward OnLoadGarages();
  492. public OnLoadGarages()
  493. {
  494. new i, rows;
  495. cache_get_row_count(rows);
  496. while(i < rows)
  497. {
  498. cache_get_value_name_int(i, "id", GarageInfo[i][gar_SQLId]);
  499. cache_get_value_name_int(i, "Owner", GarageInfo[i][gar_Owner]);
  500. cache_get_value_name(i, "OwnerName", GarageInfo[i][gar_OwnerName], 24);
  501. cache_get_value_name_float(i, "ExteriorX", GarageInfo[i][gar_ExteriorX]);
  502. cache_get_value_name_float(i, "ExteriorY", GarageInfo[i][gar_ExteriorY]);
  503. cache_get_value_name_float(i, "ExteriorZ", GarageInfo[i][gar_ExteriorZ]);
  504. cache_get_value_name_float(i, "ExteriorA", GarageInfo[i][gar_ExteriorA]);
  505. cache_get_value_name_int(i, "ExteriorVW", GarageInfo[i][gar_ExteriorVW]);
  506. cache_get_value_name_int(i, "ExteriorInt", GarageInfo[i][gar_ExteriorInt]);
  507. cache_get_value_name_int(i, "CustomExterior", GarageInfo[i][gar_CustomExterior]);
  508. cache_get_value_name_float(i, "InteriorX", GarageInfo[i][gar_InteriorX]);
  509. cache_get_value_name_float(i, "InteriorY", GarageInfo[i][gar_InteriorY]);
  510. cache_get_value_name_float(i, "InteriorZ", GarageInfo[i][gar_InteriorZ]);
  511. cache_get_value_name_float(i, "InteriorA", GarageInfo[i][gar_InteriorA]);
  512. cache_get_value_name_int(i, "InteriorVW", GarageInfo[i][gar_InteriorVW]);
  513. cache_get_value_name(i, "Pass", GarageInfo[i][gar_Pass], 24);
  514. cache_get_value_name_int(i, "Locked", GarageInfo[i][gar_Locked]);
  515. if(GarageInfo[i][gar_ExteriorX] != 0.0) CreateGarage(i);
  516. i++;
  517. }
  518. if(i > 0) printf("[LoadGarages] %d garages rehashed/loaded.", i);
  519. else printf("[LoadGarages] Failed to load any garages.");
  520. return 1;
  521. }
  522. stock SaveGarage(garageid)
  523. {
  524. new string[512];
  525. mysql_format(MainPipeline, string, sizeof(string), "UPDATE `garages` SET \
  526. `Owner`=%d, \
  527. `OwnerName`='%e', \
  528. `ExteriorX`=%f, \
  529. `ExteriorY`=%f, \
  530. `ExteriorZ`=%f, \
  531. `ExteriorA`=%f, \
  532. `ExteriorVW`=%d, \
  533. `ExteriorInt`=%d, \
  534. `CustomExterior`=%d, \
  535. `InteriorX`=%f, \
  536. `InteriorY`=%f, \
  537. `InteriorZ`=%f, \
  538. `InteriorA`=%f, \
  539. `InteriorVW`=%d, \
  540. `Pass`='%e', \
  541. `Locked`=%d \
  542. WHERE `id`=%d",
  543. GarageInfo[garageid][gar_Owner],
  544. GarageInfo[garageid][gar_OwnerName],
  545. GarageInfo[garageid][gar_ExteriorX],
  546. GarageInfo[garageid][gar_ExteriorY],
  547. GarageInfo[garageid][gar_ExteriorZ],
  548. GarageInfo[garageid][gar_ExteriorA],
  549. GarageInfo[garageid][gar_ExteriorVW],
  550. GarageInfo[garageid][gar_ExteriorInt],
  551. GarageInfo[garageid][gar_CustomExterior],
  552. GarageInfo[garageid][gar_InteriorX],
  553. GarageInfo[garageid][gar_InteriorY],
  554. GarageInfo[garageid][gar_InteriorZ],
  555. GarageInfo[garageid][gar_InteriorA],
  556. GarageInfo[garageid][gar_InteriorVW],
  557. GarageInfo[garageid][gar_Pass],
  558. GarageInfo[garageid][gar_Locked],
  559. garageid
  560. );
  561. mysql_tquery(MainPipeline, string, "OnQueryFinish", "i", SENDDATA_THREAD);
  562. }
  563. stock CreateGarage(garageid)
  564. {
  565. if(IsValidDynamic3DTextLabel(GarageInfo[garageid][gar_TextID])) DestroyDynamic3DTextLabel(GarageInfo[garageid][gar_TextID]), GarageInfo[garageid][gar_TextID] = Text3D:-1;
  566. if(GarageInfo[garageid][gar_ExteriorX] == 0.0) return 1;
  567. new string[128];
  568. format(string, sizeof(string), "Garage | Owner: %s\nID: %d", StripUnderscore(GarageInfo[garageid][gar_OwnerName]), garageid);
  569. GarageInfo[garageid][gar_TextID] = CreateDynamic3DTextLabel(string, COLOR_YELLOW, GarageInfo[garageid][gar_ExteriorX], GarageInfo[garageid][gar_ExteriorY], GarageInfo[garageid][gar_ExteriorZ]+1,10.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 1, GarageInfo[garageid][gar_ExteriorVW], GarageInfo[garageid][gar_ExteriorInt], -1);
  570. if(IsValidDynamicArea(GarageInfo[garageid][gar_AreaID])) DestroyDynamicArea(GarageInfo[garageid][gar_AreaID]);
  571. GarageInfo[garageid][gar_AreaID] = CreateDynamicSphere(GarageInfo[garageid][gar_ExteriorX], GarageInfo[garageid][gar_ExteriorY], GarageInfo[garageid][gar_ExteriorZ], 3, .worldid = GarageInfo[garageid][gar_ExteriorVW], .interiorid = GarageInfo[garageid][gar_ExteriorInt]);
  572. if(IsValidDynamicArea(GarageInfo[garageid][gar_AreaID_int])) DestroyDynamicArea(GarageInfo[garageid][gar_AreaID_int]);
  573. GarageInfo[garageid][gar_AreaID_int] = CreateDynamicSphere(GarageInfo[garageid][gar_InteriorX], GarageInfo[garageid][gar_InteriorY], GarageInfo[garageid][gar_InteriorZ], 3, .worldid = GarageInfo[garageid][gar_InteriorVW]);
  574. Streamer_SetIntData(STREAMER_TYPE_AREA, GarageInfo[garageid][gar_AreaID], E_STREAMER_EXTRA_ID, garageid);
  575. Streamer_SetIntData(STREAMER_TYPE_AREA, GarageInfo[garageid][gar_AreaID_int], E_STREAMER_EXTRA_ID, garageid);
  576. format(szMiscArray, sizeof(szMiscArray), "[Garage] Created Garage: %d | Exterior Area ID: %d | Interior Area ID: %d", garageid, GarageInfo[garageid][gar_AreaID], GarageInfo[garageid][gar_AreaID_int]);
  577. Log("debug/door_garage.log", szMiscArray);
  578. return 1;
  579. }
  580. forward OnSetGarageOwner(playerid, garageid);
  581. public OnSetGarageOwner(playerid, garageid)
  582. {
  583. if(IsPlayerConnected(playerid))
  584. {
  585. new rows;
  586. new string[128];
  587. cache_get_row_count(rows);
  588. if(rows)
  589. {
  590. cache_get_value_name_int(0, "id", GarageInfo[garageid][gar_Owner]);
  591. cache_get_value_name(0, "Username", GarageInfo[garageid][gar_OwnerName], MAX_PLAYER_NAME);
  592. format(string, sizeof(string), "Successfully set the owner to %s.", GarageInfo[garageid][gar_OwnerName]);
  593. SendClientMessageEx(playerid, COLOR_WHITE, string);
  594. CreateGarage(garageid);
  595. SaveGarage(garageid);
  596. format(string, sizeof(string), "%s has edited Garage ID: %d's owner to %s (SQL ID: %d).", GetPlayerNameEx(playerid), garageid, GarageInfo[garageid][gar_OwnerName], GarageInfo[garageid][gar_Owner]);
  597. Log("logs/garage.log", string);
  598. }
  599. else SendClientMessageEx(playerid, COLOR_GREY, "That account name does not appear to exist.");
  600. }
  601. return 1;
  602. }
  603. ReturnGarageLineDetails(playerid, garageid)
  604. {
  605. new string[8];
  606. string = "N/A";
  607. if(garageid != 0 && GetPlayerSQLId(playerid) == GarageInfo[garageid][gar_Owner]) format(string, sizeof(string), "%d", garageid);
  608. return string;
  609. }