gates.inc 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805
  1. #if defined GATES_INCLUDED
  2. #endinput
  3. #endif
  4. #define GATES_INCLUDED
  5. //Dependencies
  6. #include "../gamemodes/inc/Property/houses.inc"
  7. enum Gate_Info
  8. {
  9. GateBy[MAX_PLAYER_NAME+1],
  10. GateObject,
  11. GateCreated,
  12. GateHouseID,
  13. GateObjectID,
  14. Float:GateX,
  15. Float:GateY,
  16. Float:GateZ,
  17. Float:GateRotX,
  18. Float:GateRotY,
  19. Float:GateRotZ,
  20. Float:MveGateX,
  21. Float:MveGateY,
  22. Float:MveGateZ,
  23. Float:MveGateRotX,
  24. Float:MveGateRotY,
  25. Float:MveGateRotZ,
  26. GateVW,
  27. GateINT,
  28. Float:GateRadius,
  29. GateStatus, //if opened or closed
  30. GatePW[24],
  31. Float:GateSpeed,
  32. Faction,
  33. Group
  34. };
  35. new Gates[MAX_GATES][Gate_Info];
  36. //Vars
  37. static str[144], sendername[MAX_PLAYER_NAME+1];
  38. forward LoadGates();
  39. forward SaveGates();
  40. //==================================[GATES]=====================================
  41. public SaveGates()
  42. {
  43. new idx = 1;
  44. new File:file;
  45. file = fopen("gates.cfg", io_write);
  46. fclose(file);
  47. file = fopen("gates.cfg", io_append);
  48. new coordsstring[512];
  49. if(file) {
  50. while(idx < MAX_GATES)
  51. {
  52. format(coordsstring, sizeof(coordsstring), "%s|%d|%d|%d|%f|%f|%f|%f|%f|%f|%f|%f|%f|%d|%d|%f|%s|%f|%d|%f|%f|%f|%d\r\n",
  53. Gates[idx][GateBy],
  54. Gates[idx][GateCreated],
  55. Gates[idx][GateHouseID],
  56. Gates[idx][GateObjectID],
  57. Gates[idx][GateX],
  58. Gates[idx][GateY],
  59. Gates[idx][GateZ],
  60. Gates[idx][GateRotX],
  61. Gates[idx][GateRotY],
  62. Gates[idx][GateRotZ],
  63. Gates[idx][MveGateX],
  64. Gates[idx][MveGateY],
  65. Gates[idx][MveGateZ],
  66. Gates[idx][GateVW],
  67. Gates[idx][GateINT],
  68. Gates[idx][GateRadius],
  69. Gates[idx][GatePW],
  70. Gates[idx][GateSpeed],
  71. Gates[idx][Faction],
  72. Gates[idx][MveGateRotX],
  73. Gates[idx][MveGateRotY],
  74. Gates[idx][MveGateRotZ],
  75. Gates[idx][Group]);
  76. fwrite(file, coordsstring);
  77. idx++;
  78. }
  79. fclose(file);
  80. } else {
  81. printf("[error] Failed to find gates.cfg");
  82. }
  83. return 1;
  84. }
  85. public LoadGates()
  86. {
  87. new arrCoords[23][126], strFromFile2[512], File: file = fopen("gates.cfg", io_read);
  88. if(file)
  89. {
  90. new idx = 1;
  91. while(idx < MAX_GATES)
  92. {
  93. fread(file, strFromFile2);
  94. split(strFromFile2, arrCoords, '|');
  95. strmid(Gates[idx][GateBy], arrCoords[0], 0, strlen(arrCoords[0]), 255);
  96. Gates[idx][GateCreated] = strval(arrCoords[1]);
  97. if(Gates[idx][GateCreated] == 1)
  98. {
  99. Gates[idx][GateHouseID] = strval(arrCoords[2]);
  100. Gates[idx][GateObjectID] = strval(arrCoords[3]);
  101. Gates[idx][GateX] = floatstr(arrCoords[4]);
  102. Gates[idx][GateY] = floatstr(arrCoords[5]);
  103. Gates[idx][GateZ] = floatstr(arrCoords[6]);
  104. Gates[idx][GateRotX] = floatstr(arrCoords[7]);
  105. Gates[idx][GateRotY] = floatstr(arrCoords[8]);
  106. Gates[idx][GateRotZ] = floatstr(arrCoords[9]);
  107. Gates[idx][MveGateX] = floatstr(arrCoords[10]);
  108. Gates[idx][MveGateY] = floatstr(arrCoords[11]);
  109. Gates[idx][MveGateZ] = floatstr(arrCoords[12]);
  110. Gates[idx][GateVW] = strval(arrCoords[13]);
  111. Gates[idx][GateINT] = strval(arrCoords[14]);
  112. Gates[idx][GateRadius] = floatstr(arrCoords[15]);
  113. strmid(Gates[idx][GatePW], arrCoords[16], 0, strlen(arrCoords[15]), 255);
  114. Gates[idx][GateSpeed] = floatstr(arrCoords[17]);
  115. Gates[idx][Faction] = strval(arrCoords[18]);
  116. Gates[idx][MveGateRotX] = strval(arrCoords[19]);
  117. Gates[idx][MveGateRotY] = strval(arrCoords[20]);
  118. Gates[idx][MveGateRotZ] = strval(arrCoords[21]);
  119. Gates[idx][Group] = strval(arrCoords[22]);
  120. gatecount++;
  121. CreateGate(idx);
  122. }
  123. idx++;
  124. }
  125. fclose(file);
  126. }
  127. return 1;
  128. }
  129. CMD:gotogate(playerid, params[])
  130. {
  131. if(PlayerInfo[playerid][pAdmin] >= 1337 || PlayerInfo[playerid][pDev] >= 2 || PlayerInfo[playerid][pMapper] == MAPPERRANK_MANAGER || PlayerInfo[playerid][pBizMod] == 1)
  132. {
  133. new gateid;
  134. if(sscanf(params, "i", gateid))
  135. {
  136. SendClientMessage(playerid, COLOR_GREY, "{00BFFF}Usage:{FFFFFF} /gotogate [gate id]");
  137. return 1;
  138. }
  139. if(gateid < 0 || gateid > MAX_GATES) return SendClientMessage(playerid, COLOR_RED, "** Invalid amount.");
  140. new gatetogoto = gateid;
  141. format(str, sizeof(str), "%0.2f,%0.2f,%0.2f", Gates[gatetogoto][GateX], Gates[gatetogoto][GateY], Gates[gatetogoto][GateZ]);
  142. if(strcmp(str, "0.00,0.00,0.00", true) == 0) return SendClientMessage(playerid, COLOR_RED, "** Unused gate ID.");
  143. format(str, sizeof(str), "[debug] Teleporting to Gate ID: %d, ObjectID: %d, VW: %d, INT: %d", gatetogoto, Gates[gatetogoto][GateObjectID], Gates[gatetogoto][GateVW], Gates[gatetogoto][GateINT]);
  144. SendClientMessage(playerid, COLOR_GREY, str);
  145. SetPlayerPos(playerid, Gates[gatetogoto][GateX], Gates[gatetogoto][GateY], Gates[gatetogoto][GateZ]);
  146. SetPlayerInterior(playerid, Gates[gatetogoto][GateINT]);
  147. SetPlayerVirtualWorld(playerid, Gates[gatetogoto][GateVW]);
  148. displayCenterHUDInfo(playerid, "~r~Teleporting.", 8); //display for 8 seconds
  149. format(str, sizeof(str), "You have teleported to gate id %d.", gatetogoto);
  150. SendClientMessage(playerid, COLOR_GRAD1, str);
  151. return 1;
  152. }
  153. else
  154. {
  155. AdmErrorMsg;
  156. }
  157. return 1;
  158. }
  159. CMD:editgate(playerid, params[])
  160. {
  161. if(PlayerInfo[playerid][pAdmin] >= 4 || PlayerInfo[playerid][pDev] >= 2 || PlayerInfo[playerid][pMapper] == MAPPERRANK_MANAGER || PlayerInfo[playerid][pBizMod] != 0 || PlayerInfo[playerid][pShopMod] != 0)
  162. {
  163. new action[24], optional;
  164. if(!sscanf(params, "s[24]F(0.0)", action, optional))
  165. {
  166. if(!strcmp(action, "create", true))
  167. {
  168. new objid, tempgid, bool:found = false;
  169. if(!sscanf(params, "s[24]i", action, objid))
  170. {
  171. for(new i =1; i <=MAX_GATES; i++)
  172. {
  173. if(Gates[i][GateCreated] == 0)
  174. {
  175. tempgid = i;
  176. found = true;
  177. break;
  178. }
  179. }
  180. if(found)
  181. {
  182. new Float:x, Float:y, Float:z, vw, inter;
  183. GetPlayerPos(playerid, x, y, z);
  184. vw = GetPlayerVirtualWorld(playerid);
  185. inter = GetPlayerInterior(playerid);
  186. EditingGate[playerid] = tempgid;
  187. strmid(sendername, PlayerICName(playerid), 0, MAX_PLAYER_NAME);
  188. Gates[tempgid][GateBy] = sendername;
  189. Gates[tempgid][GateObjectID] = objid;
  190. Gates[tempgid][GateX] = x +1;
  191. Gates[tempgid][GateY] = y +1;
  192. Gates[tempgid][GateZ] = z;
  193. Gates[tempgid][GateRotX] = 0;
  194. Gates[tempgid][GateRotY] = 0;
  195. Gates[tempgid][GateRotZ] = 0;
  196. Gates[tempgid][GateVW] = vw;
  197. Gates[tempgid][GateINT] = inter;
  198. Gates[tempgid][GateStatus] = 0;
  199. Gates[tempgid][Faction] = 0;
  200. Gates[tempgid][Group] = 0;
  201. Gates[tempgid][GateSpeed] = 3.0;
  202. Gates[tempgid][GateRadius] = 5.0;
  203. CreateGate(tempgid);
  204. Streamer_Update(playerid);
  205. format(str, sizeof(str), "You have succesfully spawned gate(%d) at your current position.", tempgid);
  206. SendClientMessage(playerid, COLOR_GRAD1, str);
  207. format(str, sizeof(str), "{FF0000}AdmWarning{FFFFFF}: %s has spawned gate(%d) at their position.", PlayerICName(playerid), tempgid);
  208. ABroadCast(COLOR_WHITE, str, 1);
  209. }
  210. else
  211. {
  212. SendClientMessage(playerid, COLOR_DARKRED, "ERROR: Max gates reached.");
  213. }
  214. }
  215. else
  216. {
  217. SendClientMessage(playerid, COLOR_GREY, "{00BFFF}Usage:{FFFFFF} /editgate create [OBJECTID]");
  218. SendClientMessage(playerid, COLOR_GRAD1, "Door object IDs: 2955 (regular), 3089 (with windows), 2949 ('keep locked'), 1498 (white door).");
  219. SendClientMessage(playerid, COLOR_GRAD1, "Door object IDs: 1536 (modern door; black, yellow), 1535 (pink apartment).");
  220. SendClientMessage(playerid, COLOR_GRAD2, "Garage object IDs: 10558 (old), 2957 (regular), 3037 (warehouse), 7709 (modern).");
  221. SendClientMessage(playerid, COLOR_GRAD3, "Gate object IDs: 3049 (red, barb wired), 3036 ('keep locked'), 2930 (door gate), 975 (long, rails).");
  222. SendClientMessage(playerid, COLOR_GRAD3, "Gate Object IDs: 989 (airport gate), 966 (barrier base), 968 (barrier).");
  223. }
  224. }
  225. else if(!strcmp(action, "id", true))
  226. {
  227. new gateid;
  228. if(!sscanf(params, "s[24]i", action, gateid))
  229. {
  230. if(gateid == 0 || gateid > MAX_GATES) return SendClientMessage(playerid, COLOR_GRAD1, "Invalid gate ID.");
  231. if(Gates[gateid][GateCreated] == 1)
  232. {
  233. EditingGate[playerid] = gateid;
  234. format(str, sizeof(str), "You are now editing gate(%d).", EditingGate[playerid]);
  235. SendClientMessage(playerid, COLOR_GRAD1, str);
  236. }
  237. else
  238. {
  239. SendClientMessage(playerid, COLOR_GRAD1, "Invalid gate ID.");
  240. }
  241. }
  242. else
  243. {
  244. SendClientMessage(playerid, COLOR_GREY, "{00BFFF}Usage:{FFFFFF} /editgate id [GATEID]");
  245. }
  246. }
  247. else if(!strcmp(action, "faction", true))
  248. {
  249. if(EditingGate[playerid] != 0)
  250. {
  251. new
  252. faction;
  253. if(sscanf(params, "s[24]i", action, faction))
  254. return SendClientMessage(playerid, COLOR_GREY, "{00BFFF}Usage:{FFFFFF} /editgate [faction id]");
  255. if(!(faction > -1))
  256. return SendClientMessage(playerid, COLOR_GREY, "Invalid faction ID.");
  257. Gates[EditingGate[playerid]][Faction] = faction;
  258. format(str, sizeof(str), "You have successfully changed gate(%d)'s faction to %d.", EditingGate[playerid], faction);
  259. SendClientMessage(playerid, COLOR_GREY, str);
  260. }
  261. }
  262. else if(!strcmp(action, "group", true))
  263. {
  264. if(EditingGate[playerid] != 0)
  265. {
  266. new
  267. group;
  268. if(sscanf(params, "s[24]i", action, group))
  269. return SendClientMessage(playerid, COLOR_GREY, "{00BFFF}Usage:{FFFFFF} /editgate [group id]");
  270. if(!(group > -1))
  271. return SendClientMessage(playerid, COLOR_GREY, "Invalid group ID.");
  272. Gates[EditingGate[playerid]][Group] = group;
  273. format(str, sizeof(str), "You have successfully changed gate(%d)'s group to %d.", EditingGate[playerid], group);
  274. SendClientMessage(playerid, COLOR_GREY, str);
  275. }
  276. }
  277. else if(!strcmp(action, "object", true))
  278. {
  279. if(EditingGate[playerid] != 0)
  280. {
  281. new objid;
  282. if(!sscanf(params, "s[24]i", action, objid))
  283. {
  284. if(Gates[EditingGate[playerid]][GateObject]) { DestroyDynamicObjectEx(Gates[EditingGate[playerid]][GateObject]); }
  285. Gates[EditingGate[playerid]][GateObject] = 0;
  286. Gates[EditingGate[playerid]][GateObjectID] = objid;
  287. CreateGate(EditingGate[playerid]);
  288. format(str, sizeof(str), "You have succesfully changed gate(%d)'s object to %d.", EditingGate[playerid], objid);
  289. SendClientMessage(playerid, COLOR_GRAD1, str);
  290. }
  291. else
  292. {
  293. SendClientMessage(playerid, COLOR_GREY, "{00BFFF}Usage:{FFFFFF} /editgate object [OBJECTID]");
  294. }
  295. }
  296. else
  297. {
  298. SendClientMessage(playerid, COLOR_WHITE, "You are not editing any gate.");
  299. }
  300. }
  301. else if(!strcmp(action, "position", true))
  302. {
  303. if(EditingGate[playerid] != 0)
  304. {
  305. GateAction[playerid] = EDITING_GATE_POSITION;
  306. EditDynamicObject(playerid, Gates[EditingGate[playerid]][GateObject]);
  307. format(str, sizeof(str), "You are now editing gate(%d)'s position.", EditingGate[playerid]);
  308. SendClientMessage(playerid, COLOR_GRAD1, str);
  309. }
  310. else
  311. {
  312. SendClientMessage(playerid, COLOR_GRAD1, "You are not editing any gate.");
  313. }
  314. }
  315. else if(!strcmp(action, "oposition", true))
  316. {
  317. if(EditingGate[playerid] != 0)
  318. {
  319. GateAction[playerid] = EDITING_GATE_OPOSITION;
  320. EditDynamicObject(playerid, Gates[EditingGate[playerid]][GateObject]);
  321. format(str, sizeof(str), "You are now editing gate(%d)'s opened position.", EditingGate[playerid]);
  322. SendClientMessage(playerid, COLOR_GRAD1, str);
  323. }
  324. else
  325. {
  326. SendClientMessage(playerid, COLOR_GRAD1, "You are not editing any gate.");
  327. }
  328. }
  329. else if(!strcmp(action, "speed", true))
  330. {
  331. if(EditingGate[playerid] != 0)
  332. {
  333. new Float:newspeed;
  334. if(!sscanf(params, "s[24]f", action, newspeed))
  335. {
  336. if(newspeed < 0.001 || newspeed > 10) return SendClientMessage(playerid, COLOR_GRAD1, "Speed must be between 0.001 or 10 seconds per unit.");
  337. Gates[EditingGate[playerid]][GateSpeed] = newspeed;
  338. format(str, sizeof(str), "Gate(%d)'s Speed was succesfully adjust to %f seconds/unit.", EditingGate[playerid], newspeed);
  339. SendClientMessage(playerid, COLOR_GRAD1, str);
  340. }
  341. else
  342. {
  343. SendClientMessage(playerid, COLOR_GREY, "{00BFFF}Usage:{FFFFFF} /editgate speed [NEWSPEED(Seconds/unit)]");
  344. }
  345. }
  346. else
  347. {
  348. SendClientMessage(playerid, COLOR_GRAD1, "You are not editing any gate.");
  349. }
  350. }
  351. else if(!strcmp(action, "radius", true))
  352. {
  353. if(EditingGate[playerid] != 0)
  354. {
  355. new Float:newradii;
  356. if(!sscanf(params, "s[24]f", action, newradii))
  357. {
  358. if(newradii < 1 || newradii > 15) return SendClientMessage(playerid, COLOR_GRAD1, "Radius must be between 1 or 15 units.");
  359. Gates[EditingGate[playerid]][GateRadius] = newradii;
  360. format(str, sizeof(str), "Gate(%d)'s Radius was succesfully adjust to %f units.", EditingGate[playerid], newradii);
  361. SendClientMessage(playerid, COLOR_GRAD1, str);
  362. }
  363. else
  364. {
  365. SendClientMessage(playerid, COLOR_GREY, "{00BFFF}Usage:{FFFFFF} /editgate radius [NEWRADIUS(in units)]");
  366. }
  367. }
  368. else
  369. {
  370. SendClientMessage(playerid, COLOR_GRAD1, "You are not editing any gate.");
  371. }
  372. }
  373. else if(!strcmp(action, "houseid", true))
  374. {
  375. if(EditingGate[playerid] != 0)
  376. {
  377. new hid;
  378. if(!sscanf(params, "s[24]i", action, hid))
  379. {
  380. if(HouseInfo[hid][hCreated] == 1)
  381. {
  382. Gates[EditingGate[playerid]][GateHouseID] = HouseInfo[hid][hSQLID];
  383. format(str, sizeof(str), "Gate(%d) was succesfully connected to house %i.", EditingGate[playerid], hid);
  384. SendClientMessage(playerid, COLOR_GRAD1, str);
  385. }
  386. else
  387. {
  388. SendClientMessage(playerid, COLOR_GRAD1, "Invalid house ID.");
  389. }
  390. }
  391. else
  392. {
  393. SendClientMessage(playerid, COLOR_GREY, "{00BFFF}Usage:{FFFFFF} /editgate houseid [HOUSEID(to connect the gate to)]");
  394. }
  395. }
  396. else
  397. {
  398. SendClientMessage(playerid, COLOR_GRAD1, "You are not editing any gate.");
  399. }
  400. }
  401. else if(!strcmp(action, "delete", true))
  402. {
  403. if(EditingGate[playerid] != 0)
  404. {
  405. if(Gates[EditingGate[playerid]][GateObject]) { DestroyDynamicObjectEx(Gates[EditingGate[playerid]][GateObject]); }
  406. Gates[EditingGate[playerid]][GateObject] = 0;
  407. strmid(Gates[EditingGate[playerid]][GateBy], "", 0, strlen("None"), 255);
  408. Gates[EditingGate[playerid]][GateCreated] = 0;
  409. Gates[EditingGate[playerid]][GateObjectID] = 0;
  410. Gates[EditingGate[playerid]][GateX] = 0;
  411. Gates[EditingGate[playerid]][GateY] = 0;
  412. Gates[EditingGate[playerid]][GateZ] = 0;
  413. Gates[EditingGate[playerid]][GateRotX] = 0;
  414. Gates[EditingGate[playerid]][GateRotY] = 0;
  415. Gates[EditingGate[playerid]][GateRotZ] = 0;
  416. Gates[EditingGate[playerid]][GateVW] = 0;
  417. Gates[EditingGate[playerid]][GateINT] = 0;
  418. Gates[EditingGate[playerid]][MveGateX] = 0;
  419. Gates[EditingGate[playerid]][MveGateX] = 0;
  420. Gates[EditingGate[playerid]][MveGateX] = 0;
  421. Gates[EditingGate[playerid]][GateSpeed] = 0;
  422. Gates[EditingGate[playerid]][GateRadius] = 0;
  423. Gates[EditingGate[playerid]][GateHouseID] = 0;
  424. Gates[EditingGate[playerid]][GateStatus] = 0;
  425. format(str, sizeof(str), "You have deleted gate(%d).", EditingGate[playerid]);
  426. SendClientMessage(playerid, COLOR_GRAD1, str);
  427. format(str, sizeof(str), "{FF0000}AdmWarning{FFFFFF}: %s has deleted gate(%d).", PlayerICName(playerid), EditingGate[playerid]);
  428. ABroadCast(COLOR_WHITE, str, 1);
  429. EditingGate[playerid] = 0;
  430. }
  431. else
  432. {
  433. SendClientMessage(playerid, COLOR_GRAD1, "You are not editing any gate.");
  434. }
  435. }
  436. else if(!strcmp(action, "reload", true))
  437. {
  438. if(EditingGate[playerid] != 0)
  439. {
  440. new gid = EditingGate[playerid];
  441. if(Gates[gid][GateObject]) { DestroyDynamicObjectEx(Gates[gid][GateObject]); }
  442. Gates[gid][GateObject] = CreateDynamicObject(Gates[gid][GateObjectID], Gates[gid][GateX], Gates[gid][GateY], Gates[gid][GateZ], Gates[gid][GateRotX], Gates[gid][GateRotY], Gates[gid][GateRotZ], Gates[gid][GateVW], Gates[gid][GateINT]);
  443. format(str, sizeof(str), "You have reloaded gate(%d).", EditingGate[playerid]);
  444. SendClientMessage(playerid, COLOR_GRAD1, str);
  445. format(str, sizeof(str), "{FF0000}AdmWarning{FFFFFF}: %s has reloaded gate(%d).", PlayerICName(playerid), EditingGate[playerid]);
  446. ABroadCast(COLOR_WHITE, str, 1);
  447. EditingGate[playerid] = 0;
  448. }
  449. else
  450. {
  451. SendClientMessage(playerid, COLOR_GRAD1, "You are not editing any gate.");
  452. }
  453. }
  454. else if(!strcmp(action, "stop", true))
  455. {
  456. if(EditingGate[playerid] != 0)
  457. {
  458. SendClientMessage(playerid, COLOR_GRAD1, "Editing progress was ended.");
  459. EditingGate[playerid] = 0;
  460. }
  461. else
  462. {
  463. SendClientMessage(playerid, COLOR_GRAD1, "You are not editing any gate.");
  464. }
  465. }
  466. else
  467. {
  468. SendClientMessage(playerid, COLOR_WHITE, "Invalid action.");
  469. }
  470. }
  471. else
  472. {
  473. SendClientMessage(playerid, COLOR_GREY, "{00BFFF}Usage:{FFFFFF} /editgate [action]");
  474. SendClientMessage(playerid, COLOR_GREY, "Available actions: create, id, object, position, oposition, speed, houseid, radius, delete, stop, reload");
  475. SendClientMessage(playerid, COLOR_GREY, "Available actions: faction, group");
  476. }
  477. }
  478. else
  479. {
  480. AdmErrorMsg;
  481. }
  482. return 1;
  483. }
  484. CMD:amovegate(playerid, params[])
  485. {
  486. if(PlayerInfo[playerid][pAdmin] >= 4 || PlayerInfo[playerid][pDev] >= 2 || PlayerInfo[playerid][pMapper] == MAPPERRANK_MANAGER || PlayerInfo[playerid][pBizMod] >= 1)
  487. {
  488. for(new gt =1; gt <MAX_GATES; gt++)
  489. {
  490. if(Gates[gt][GateCreated] == 1)
  491. {
  492. if(IsPlayerInRangeOfPoint(playerid, Gates[gt][GateRadius], Gates[gt][GateX], Gates[gt][GateY], Gates[gt][GateZ]))
  493. {
  494. if(Gates[gt][GateStatus] == 0)
  495. {
  496. MoveDynamicObject(Gates[gt][GateObject], Gates[gt][MveGateX], Gates[gt][MveGateY], Gates[gt][MveGateZ], Gates[gt][GateSpeed], Gates[gt][MveGateRotX], Gates[gt][MveGateRotY], Gates[gt][MveGateRotZ]);
  497. Gates[gt][GateStatus] = 1;
  498. }
  499. else
  500. {
  501. MoveDynamicObject(Gates[gt][GateObject], Gates[gt][GateX], Gates[gt][GateY], Gates[gt][GateZ], Gates[gt][GateSpeed], Gates[gt][GateRotX], Gates[gt][GateRotY], Gates[gt][GateRotZ]);
  502. Gates[gt][GateStatus] = 0;
  503. }
  504. }
  505. }
  506. }
  507. }
  508. else
  509. {
  510. AdmErrorMsg;
  511. }
  512. return 1;
  513. }
  514. //by Fred
  515. CMD:closestgate( playerid, params[] ) {
  516. if(PlayerInfo[playerid][pAdmin] >= 3 || PlayerInfo[playerid][pDev] >= 2 || PlayerInfo[playerid][pBizMod] == 1 || PlayerInfo[playerid][pMapper] == MAPPERRANK_MANAGER)
  517. {
  518. new radius;
  519. if( sscanf( params, "I(5)", radius ) ) {
  520. return SendClientMessage( playerid, COLOR_GREY, "{00BFFF}Usage:{FFFFFF} /closestgate [radius(optional)]" );
  521. }
  522. //not inbetween
  523. if( !( 0 < radius <= 500 ) ) {
  524. return SendClientMessage( playerid, COLOR_GREY, "{00BFFF}Usage:{FFFFFF} /closestgate radius (must be between 0 and 500)" );
  525. }
  526. new closest = -1;
  527. new Float: distance = 0.0;
  528. new Float: ppos[3];
  529. GetPlayerPos( playerid, ppos[0], ppos[1], ppos[2] );
  530. for( new g; g < MAX_GATES; g++ )
  531. {
  532. if( GetPlayerVirtualWorld( playerid ) != Gates[g][GateVW] ) continue;
  533. if( GetPlayerInterior( playerid ) != Gates[g][GateINT] ) continue;
  534. if( IsPlayerInRangeOfPoint( playerid, radius, Gates[g][GateX], Gates[g][GateY], Gates[g][GateZ] ) ) {
  535. new Float: cmpDist = floatsqroot( floatpower( ( Gates[g][GateX] - ppos[0] ), 2 ) + floatpower( ( Gates[g][GateY] - ppos[1] ), 2 ) + floatpower( ( Gates[g][GateZ] - ppos[2] ), 2 ) );
  536. if( cmpDist < distance || closest == -1 ) {
  537. distance = cmpDist;
  538. closest = g;
  539. }
  540. }
  541. }
  542. if( closest == -1 ) {
  543. return SendClientMessage( playerid, COLOR_GREY, "You are not near any gates within the specified radius." );
  544. }
  545. SendClientMessage(playerid, COLOR_YELLOW, "____________________________________________");
  546. format(str, sizeof(str), "Gate ID : %i Created by: %s HouseID: %i Speed: %f ObjectID: %d", closest, Gates[closest][GateBy], Gates[closest][GateHouseID], Gates[closest][GateSpeed], Gates[closest][GateObjectID]);
  547. SendClientMessage(playerid, COLOR_WHITE, str);
  548. format(str, sizeof(str), "Radius: %f, Group: %d, Faction: %d", Gates[closest][GateRadius], Gates[closest][Group], Gates[closest][Faction]);
  549. SendClientMessage(playerid, COLOR_WHITE, str);
  550. format(str, sizeof(str), "X: %f, Y: %f, Z: %f", Gates[closest][GateX], Gates[closest][GateY], Gates[closest][GateZ]);
  551. SendClientMessage(playerid, COLOR_WHITE, str);
  552. format(str, sizeof(str), "VW: %d, INT: %d", Gates[closest][GateVW], Gates[closest][GateINT]);
  553. SendClientMessage(playerid, COLOR_WHITE, str);
  554. }
  555. return 1;
  556. }
  557. CMD:gateinfo(playerid, params[])
  558. {
  559. if(PlayerInfo[playerid][pAdmin] >= 3 || PlayerInfo[playerid][pDev] >= 2 || PlayerInfo[playerid][pBizMod] == 1 || PlayerInfo[playerid][pMapper] == MAPPERRANK_MANAGER)
  560. {
  561. for(new gt = 0; gt < MAX_GATES; gt++)
  562. {
  563. if(Gates[gt][GateCreated] == 1)
  564. {
  565. if(IsPlayerInRangeOfPoint(playerid, 8, Gates[gt][GateX], Gates[gt][GateY], Gates[gt][GateZ]))
  566. {
  567. if(
  568. GetPlayerVirtualWorld(playerid) != Gates[gt][GateVW] ||
  569. GetPlayerInterior(playerid) != Gates[gt][GateINT]
  570. ) continue;
  571. SendClientMessage(playerid, COLOR_YELLOW, "____________________________________________");
  572. format(str, sizeof(str), "Gate ID : %i Created by: %s HouseID: %i Speed: %f ObjectID: %d", gt, Gates[gt][GateBy], Gates[gt][GateHouseID], Gates[gt][GateSpeed], Gates[gt][GateObjectID]);
  573. SendClientMessage(playerid, COLOR_WHITE, str);
  574. format(str, sizeof(str), "Radius: %f, Group: %d, Faction: %d", Gates[gt][GateRadius], Gates[gt][Group], Gates[gt][Faction]);
  575. SendClientMessage(playerid, COLOR_WHITE, str);
  576. format(str, sizeof(str), "X: %f, Y: %f, Z: %f", Gates[gt][GateX], Gates[gt][GateY], Gates[gt][GateZ]);
  577. SendClientMessage(playerid, COLOR_WHITE, str);
  578. format(str, sizeof(str), "VW: %d, INT: %d", Gates[gt][GateVW], Gates[gt][GateINT]);
  579. SendClientMessage(playerid, COLOR_WHITE, str);
  580. }
  581. }
  582. }
  583. }
  584. else
  585. {
  586. AdmErrorMsg;
  587. }
  588. return 1;
  589. }
  590. CMD:biggateinfo(playerid, params[])
  591. {
  592. if(PlayerInfo[playerid][pDev] >= 2 || PlayerInfo[playerid][pAdmin] >= 4 || PlayerInfo[playerid][pMapper] == MAPPERRANK_MANAGER)
  593. {
  594. for(new gt = 0; gt < MAX_GATES; gt++)
  595. {
  596. if(Gates[gt][GateCreated] == 1)
  597. {
  598. if(IsPlayerInRangeOfPoint(playerid, 24, Gates[gt][GateX], Gates[gt][GateY], Gates[gt][GateZ]))
  599. {
  600. SendClientMessage(playerid, COLOR_YELLOW, "____________________________________________");
  601. format(str, sizeof(str), "Gate ID : %i Created by: %s HouseID: %i Speed: %f ObjectID: %d", gt, Gates[gt][GateBy], Gates[gt][GateHouseID], Gates[gt][GateSpeed], Gates[gt][GateObjectID]);
  602. SendClientMessage(playerid, COLOR_WHITE, str);
  603. format(str, sizeof(str), "Radius: %f", Gates[gt][GateRadius]);
  604. SendClientMessage(playerid, COLOR_WHITE, str);
  605. format(str, sizeof(str), "X: %f, Y: %f, Z: %f", Gates[gt][GateX], Gates[gt][GateY], Gates[gt][GateZ]);
  606. SendClientMessage(playerid, COLOR_WHITE, str);
  607. format(str, sizeof(str), "VW: %d, INT: %d", Gates[gt][GateVW], Gates[gt][GateINT]);
  608. SendClientMessage(playerid, COLOR_WHITE, str);
  609. }
  610. }
  611. }
  612. }
  613. else
  614. {
  615. AdmErrorMsg;
  616. }
  617. return 1;
  618. }
  619. stock CreateGate(gid)
  620. {
  621. Gates[gid][GateObject] = CreateDynamicObject(Gates[gid][GateObjectID], Gates[gid][GateX], Gates[gid][GateY], Gates[gid][GateZ], Gates[gid][GateRotX], Gates[gid][GateRotY], Gates[gid][GateRotZ], Gates[gid][GateVW], Gates[gid][GateINT]);
  622. Gates[gid][GateCreated] = 1;
  623. }
  624. CMD:movegate(playerid, params[])
  625. {
  626. new pw[64];
  627. if(!sscanf(params, "s[64]", pw))
  628. {
  629. if(strcmp(pw, "\\", true) == 0) return 1;
  630. for(new gt =1; gt <MAX_GATES; gt++)
  631. {
  632. if(Gates[gt][GateCreated] == 1)
  633. {
  634. if(IsPlayerInRangeOfPoint(playerid, Gates[gt][GateRadius], Gates[gt][GateX], Gates[gt][GateY], Gates[gt][GateZ]))
  635. {
  636. if(!strcmp(pw, Gates[gt][GatePW], false))
  637. {
  638. // Check if it's a faction/group gate before moving it
  639. if(Gates[gt][Faction] > 0 || Gates[gt][Group] > 0)
  640. continue;
  641. if(Gates[gt][GateStatus] == 0)
  642. {
  643. MoveDynamicObject(Gates[gt][GateObject], Gates[gt][MveGateX], Gates[gt][MveGateY], Gates[gt][MveGateZ], Gates[gt][GateSpeed], Gates[gt][MveGateRotX], Gates[gt][MveGateRotY], Gates[gt][MveGateRotZ]);
  644. Gates[gt][GateStatus] = 1;
  645. }
  646. else
  647. {
  648. MoveDynamicObject(Gates[gt][GateObject], Gates[gt][GateX], Gates[gt][GateY], Gates[gt][GateZ], Gates[gt][GateSpeed], Gates[gt][GateRotX], Gates[gt][GateRotY], Gates[gt][GateRotZ]);
  649. Gates[gt][GateStatus] = 0;
  650. }
  651. }
  652. }
  653. }
  654. }
  655. }
  656. else
  657. {
  658. SendClientMessage(playerid, COLOR_GREY, "{00BFFF}Usage:{FFFFFF} /movegate [Password(Case Sensitive)]");
  659. }
  660. return 1;
  661. }
  662. CMD:gatepass(playerid, params[])
  663. {
  664. if(PlayerInfo[playerid][pHouseID] != 0)
  665. {
  666. new newpw[64], changedcount = 0;
  667. if(!sscanf(params, "s[64]", newpw))
  668. {
  669. if(!ContainsValidCharacters(newpw)) return SendClientMessage(playerid, COLOR_GREY, "Invalid parameters. Do not use /, \\, :, *, ?, \", <, >, [, ], or |.");//"
  670. for(new gt =1; gt <MAX_GATES; gt++)
  671. {
  672. if(Gates[gt][GateCreated] == 1)
  673. {
  674. if(Gates[gt][GateHouseID] == HouseInfo[PlayerInfo[playerid][pHouseID]][hSQLID])
  675. {
  676. strdel(Gates[gt][GatePW], 0, strlen(Gates[gt][GatePW]));
  677. strins(Gates[gt][GatePW], newpw, 0);
  678. changedcount++;
  679. }
  680. }
  681. }
  682. if(changedcount == 0)
  683. {
  684. SendClientMessage(playerid, COLOR_GREY, "No connected gates found.");
  685. }
  686. else
  687. {
  688. format(str, sizeof(str), "Password of %i gates were changed to '%s'.", changedcount, newpw);
  689. SendClientMessage(playerid, COLOR_WHITE, str);
  690. }
  691. }
  692. else
  693. {
  694. SendClientMessage(playerid, COLOR_GREY, "{00BFFF}Usage:{FFFFFF} /gatepass [New Password(Case Sensitive)]");
  695. }
  696. }
  697. else
  698. {
  699. SendClientMessage(playerid, COLOR_RED, "ERROR: You do not own a house.");
  700. }
  701. return 1;
  702. }
  703. CMD:gate(playerid, params[])
  704. {
  705. for(new gateid = 1; gateid < MAX_GATES; gateid++)
  706. {
  707. if(PlayerInfo[playerid][pMember] > 0 || PlayerInfo[playerid][pGroup] == GROUP_S9)
  708. {
  709. if(Gates[gateid][Faction] > 0) // If the gate is attached to a faction //
  710. {
  711. if(IsPlayerInRangeOfPoint(playerid, Gates[gateid][GateRadius], Gates[gateid][GateX], Gates[gateid][GateY], Gates[gateid][GateZ]))
  712. {
  713. if(
  714. (Gates[gateid][Faction] == PlayerInfo[playerid][pMember]) ||
  715. (PlayerInfo[playerid][pGroup] == GROUP_S9) ||
  716. (PlayerInfo[playerid][pMember] == FACTION_FBI && Gates[gateid][Faction] != FACTION_SAPD)
  717. ) // If player is in the same faction as the gate is attached to, then
  718. {
  719. if(Gates[gateid][GateStatus] == 0) // If it's closed
  720. {
  721. // Open it //
  722. MoveDynamicObject(Gates[gateid][GateObject], Gates[gateid][MveGateX], Gates[gateid][MveGateY], Gates[gateid][MveGateZ], Gates[gateid][GateSpeed], Gates[gateid][MveGateRotX], Gates[gateid][MveGateRotY], Gates[gateid][MveGateRotZ]);
  723. Gates[gateid][GateStatus] = 1;
  724. }
  725. else // If it it's open
  726. {
  727. // Close it //
  728. MoveDynamicObject(Gates[gateid][GateObject], Gates[gateid][GateX], Gates[gateid][GateY], Gates[gateid][GateZ], Gates[gateid][GateSpeed], Gates[gateid][GateRotX], Gates[gateid][GateRotY], Gates[gateid][GateRotZ]);
  729. Gates[gateid][GateStatus] = 0;
  730. }
  731. }
  732. }
  733. }
  734. }
  735. if(PlayerInfo[playerid][pGroup] != GROUP_NONE) // If player is in any group //
  736. {
  737. if(Gates[gateid][Group] > 0) // If the gate is attached to a group //
  738. {
  739. if(IsPlayerInRangeOfPoint(playerid, Gates[gateid][GateRadius], Gates[gateid][GateX], Gates[gateid][GateY], Gates[gateid][GateZ]))
  740. {
  741. if(Gates[gateid][Group] == PlayerInfo[playerid][pGroup]) // If the player has the same group as the gate it's attached to //
  742. {
  743. if(Gates[gateid][GateStatus] == 0) // If closed //
  744. {
  745. // open //
  746. MoveDynamicObject(Gates[gateid][GateObject], Gates[gateid][MveGateX], Gates[gateid][MveGateY], Gates[gateid][MveGateZ], Gates[gateid][GateSpeed], Gates[gateid][MveGateRotX], Gates[gateid][MveGateRotY], Gates[gateid][MveGateRotZ]);
  747. Gates[gateid][GateStatus] = 1;
  748. }
  749. else // If open //
  750. {
  751. // close //
  752. MoveDynamicObject(Gates[gateid][GateObject], Gates[gateid][GateX], Gates[gateid][GateY], Gates[gateid][GateZ], Gates[gateid][GateSpeed], Gates[gateid][GateRotX], Gates[gateid][GateRotY], Gates[gateid][GateRotZ]);
  753. Gates[gateid][GateStatus] = 0;
  754. }
  755. }
  756. }
  757. }
  758. }
  759. }
  760. return 1;
  761. }