1
0

bankrobbery.inc 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504
  1. /*
  2. ____ _ _____ _ _ _____ _ ____ _____ _
  3. | _ \ | | | __ \ | | | | / ____| | | | _ \ | __ \ | |
  4. | |_) | __ _ _ __ | | __ | |__) |___ | |__ | |__ ___ _ __ _ _ | (___ _ _ ___| |_ ___ _ __ ___ | |_) |_ _ | | | | ___ ___ _ __ ___ ___ _ __ __| |
  5. | _ < / _` | '_ \| |/ / | _ // _ \| '_ \| '_ \ / _ \ '__| | | | \___ \| | | / __| __/ _ \ '_ ` _ \ | _ <| | | | | | | |/ _ \/ __| '_ ` _ \ / _ \| '_ \ / _` |
  6. | |_) | (_| | | | | < | | \ \ (_) | |_) | |_) | __/ | | |_| | ____) | |_| \__ \ || __/ | | | | | | |_) | |_| | | |__| | __/\__ \ | | | | | (_) | | | | (_| |
  7. |____/ \__,_|_| |_|_|\_\ |_| \_\___/|_.__/|_.__/ \___|_| \__, | |_____/ \__, |___/\__\___|_| |_| |_| |____/ \__, | |_____/ \___||___/_| |_| |_|\___/|_| |_|\__,_|
  8. __/ | __/ | __/ |
  9. |___/ |___/ |___/
  10. Author: Desmond
  11. Refer to this thread:
  12. Big vault - 10 minutes to break into, need drill, level 4+, at least 7 LEOs on (count PD and DEA)
  13. Once the big vault opens, it says "Head to the safes to start gathering money.\nNOTE: you may use /stopbankrob to finish the robbery however this will end the robbery and you may not gather more money."
  14. Inside the vault - 6 safes, 3Ds that say "/usedrill\nX seconds left" in green. When the safe is opened, change to "$250,000, /loadsafemoney to load the money."
  15. Each safe takes 90 seconds to break into and give $250,000 each.
  16. While breaking into the safe, the player will get 2 seconds skill checks, they will be required to press "SPACE" before the check ends or else they fail to drill into the safe.
  17. Script counts 5 seconds and randomizes a number - either 0 or 1. If 1, show the skill check, if 0, don't show.
  18. Once all safes are cleared or the robber did /stopbankrob, the script sets "bankmoneygathered" to 250,000 multiplied by how many safes the robbers broke into.
  19. They will then have to load the money in a random location around SF.
  20. Additionals:
  21. Interactable stuff - blocking doors, PD have to use C2s to get through.
  22. */
  23. #define MAX_VAULTS 6
  24. #define BANK_VAULT_COORDINATES 1640.82, 2907.77, 988.54
  25. #define BANK_VAULT_OUTSIDE 1633.3864, 2907.5081, 988.5403
  26. #define BANK_VAULT_INSIDE 1648.8212, 2907.6978, 988.4282
  27. #define CHECKPOINT_BANKROB 65
  28. /*
  29. Bank variables
  30. */
  31. new bankmoneygathered, // total money collected by robbers
  32. bool:bankactive, // is a bank robbery active?
  33. bool:breakingvault, // used to see if the robbers are currently breaking the big vualt
  34. bigvault, // big vault's door object
  35. bool:goinglaundering, // used to see if the robbers finished robbing the vaults (so if they left early no1 can continue breaking into vaults)
  36. bankrobber; // the main robber - the person that can collect the money, determined by who did /usedrill on the vault's door
  37. enum vaultinfo
  38. {
  39. vMoney, // how much money left in the safe?
  40. bool:vBreaking, // is someone currently breaking into the safe?
  41. bool:vOpened, // is the safe opened?
  42. Text3D:v3DText, // the 3D text above the safe
  43. Float:vPosX, // coordinates X of the safe
  44. Float:vPosY, // coordinates Y of the safe
  45. Float:vPosZ, // coordinates Z of the safe
  46. Float:vPosRX, // coordinates X rotation of the safe
  47. Float:vPosRY, // coordinates Y rotation of the safe
  48. Float:vPosRZ, // coordinates Z rotation of the safe
  49. vObject // object id of the safe
  50. };
  51. new Vaults[MAX_VAULTS][vaultinfo];
  52. new Float:VaultsPositions[][6] =
  53. {
  54. {1645.54370, 2910.59302, 987.88550, 0.00000, 0.00000, 0.00000},
  55. {1649.48596, 2910.59302, 987.88550, 0.00000, 0.00000, 0.00000},
  56. {1653.44202, 2910.59302, 987.88550, 0.00000, 0.00000, 0.00000},
  57. {1653.40417, 2904.88403, 987.88550, 0.00000, 0.00000, -178.07994},
  58. {1649.48755, 2904.88916, 987.88550, 0.00000, 0.00000, -178.07990},
  59. {1645.62744, 2904.88916, 987.88550, 0.00000, 0.00000, -178.07990}
  60. };
  61. new Float:LaunderingPositions[][3] =
  62. {
  63. {-2150.8677,-103.1125,35.3203},
  64. {-1815.8945,-73.5078,15.1094},
  65. {-1741.9487,1424.6788,7.1875}
  66. };
  67. /*
  68. Player variables
  69. */
  70. new bankrobtimer[MAX_PLAYERS], skillchecktimer[MAX_PLAYERS], safebreaktime[MAX_PLAYERS], skillcheckrespond[MAX_PLAYERS];
  71. new bool:playerperformskillcheck[MAX_PLAYERS];
  72. new breakingintovault[MAX_PLAYERS];
  73. GetLEOCount()
  74. {
  75. new counter;
  76. foreach(new i: Player)
  77. {
  78. if(PlayerInfo[i][pAdmin] < 2 && (PlayerInfo[i][pMember] == FACTION_SAPD || PlayerInfo[i][pMember] == FACTION_FBI || PlayerInfo[i][pMember] == FACTION_SANG)) counter++;
  79. }
  80. return counter;
  81. }
  82. IsNearBank(playerid) // used to determine if the player is in the no healing zone
  83. {
  84. // this if checks both inside and outside
  85. if(IsPlayerInRangeOfPoint(playerid, 200, 1633.3864, 2907.5081, 988.5403) || IsPlayerInRangeOfPoint(playerid, 200, 1450.8630, -1012.5521, 26.8438)) return 1;
  86. return 0;
  87. }
  88. StartBankRobbery(playerid)
  89. {
  90. SendClientMessageToAll(COLOR_LIGHTBLUE, "City Hall: The LS Bank is being robbed - 10 minutes left to break into the vault.");
  91. SendClientMessage(playerid, COLOR_LIGHTBLUE, "Note: If you move from the vault door the robbery will fail but you may look around and shoot.");
  92. bankactive = true;
  93. breakingvault = true;
  94. bankrobtimer[playerid] = SetTimerEx("BankRobberyTimer", 1000*600, false, "d", playerid); // 10 minutes
  95. bankrobber = playerid;
  96. return 1;
  97. }
  98. SetupMoneyLaundering(playerid)
  99. {
  100. foreach(new i: Player)
  101. {
  102. safebreaktime[i] = 0;
  103. KillTimer(bankrobtimer[i]);
  104. KillTimer(skillchecktimer[i]);
  105. KillTimer(safebreaktime[i]);
  106. KillTimer(skillcheckrespond[i]);
  107. }
  108. for(new i = 0; i < MAX_VAULTS; i++) CancelVaultBreak(i);
  109. goinglaundering = true;
  110. new rand = random(3);
  111. SetPlayerCheckpointEx(playerid, LaunderingPositions[rand][0], LaunderingPositions[rand][1], LaunderingPositions[rand][2], 3.0);
  112. CP[playerid] = CHECKPOINT_BANKROB;
  113. SendClientMessage(playerid, COLOR_LIGHTBLUE, "Head to the checkpoint marked on your map to receive the laundered money.");
  114. return 1;
  115. }
  116. forward BankRobberyTimer(playerid);
  117. public BankRobberyTimer(playerid)
  118. {
  119. breakingvault = false;
  120. MoveDynamicObject(bigvault, 1641.00696, 2905.82178, 989.11761, 3, 0.00000, 0.00000, 91.36140);
  121. TimeAfterBankJob = gettime()+172800; // 48 hours
  122. SendClientMessageToAll(COLOR_LIGHTBLUE, "City Hall: The LS Bank's vault has been opened.");
  123. SetupVaults();
  124. SendClientMessage(playerid, COLOR_LIGHTBLUE, "Tip: Head to the safes to start gathering money.");
  125. SendClientMessage(playerid, -1, "{FF0000}NOTE: {FFFFFF}You may use /stopbankrob to finish the robbery however this will end the robbery and you may not gather more money.");
  126. return 1;
  127. }
  128. BreakVault(playerid, safeid)
  129. {
  130. Vaults[safeid][vBreaking] = true;
  131. breakingintovault[playerid] = safeid;
  132. safebreaktime[playerid] = 90;
  133. skillchecktimer[playerid] = SetTimerEx("SkillCheckTimer", 5000, true, "dd", playerid, safeid); // 5 seconds, playerid and the safeid
  134. UpdateDynamic3DTextLabelText(Vaults[safeid][v3DText], -1, "{FF0000}Player Drilling\n{FFFFFF}90 seconds left");
  135. SendClientMessage(playerid, COLOR_LIGHTBLUE, "Note: If you move from the safe the breakin will fail but you may look around and shoot.");
  136. return 1;
  137. }
  138. forward SkillCheckTimer(playerid, safeid);
  139. public SkillCheckTimer(playerid, safeid)
  140. {
  141. new msg[60];
  142. safebreaktime[playerid] -= 5; // no skill check
  143. format(msg, sizeof(msg), "{FF0000}Player Drilling\n{FFFFFF}%d seconds left", safebreaktime[playerid]);
  144. UpdateDynamic3DTextLabelText(Vaults[safeid][v3DText], -1, msg);
  145. if(safebreaktime[playerid] == 0) // finished breaking
  146. {
  147. Vaults[safeid][vOpened] = true;
  148. UpdateDynamic3DTextLabelText(Vaults[safeid][v3DText], -1, "{00FF00}Opened\n{FFFFFF}/loadsafemoney ({00FF00}$250,000 {FFFFFF}inside)");
  149. DestroyDynamicObjectEx(Vaults[safeid][vObject]); // destroy safe object
  150. Vaults[safeid][vObject] = CreateDynamicObject(1829, Vaults[safeid][vPosX], Vaults[safeid][vPosY], Vaults[safeid][vPosZ], Vaults[safeid][vPosRX], Vaults[safeid][vPosRY], Vaults[safeid][vPosRZ]); // place opened safe object
  151. KillTimer(skillchecktimer[playerid]);
  152. KillTimer(skillcheckrespond[playerid]);
  153. return 1;
  154. }
  155. new rand = random(2);
  156. if(rand) // skill check
  157. {
  158. displayCenterHUDInfo(playerid, "~w~SKILL CHECK~n~~r~PRESS SPACE", 2); //display for 2 seconds
  159. skillcheckrespond[playerid] = SetTimerEx("SkillCheckRespond", 3000, false, "dd", playerid, safeid);
  160. playerperformskillcheck[playerid] = false;
  161. }
  162. return 1;
  163. }
  164. forward SkillCheckRespond(playerid, safeid);
  165. public SkillCheckRespond(playerid, safeid)
  166. {
  167. if(!playerperformskillcheck[playerid]) // failed to do skill check
  168. {
  169. CancelVaultBreak(safeid);
  170. SendClientMessage(playerid, COLOR_GREY, "You have failed to perform your skill check - safe breakin failed.");
  171. safebreaktime[playerid] = 0;
  172. KillTimer(skillchecktimer[playerid]);
  173. KillTimer(skillcheckrespond[playerid]);
  174. }
  175. else KillTimer(skillcheckrespond[playerid]);
  176. return 1;
  177. }
  178. Hook:bank_OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
  179. {
  180. if(PRESSED(KEY_SPRINT))
  181. {
  182. if(safebreaktime[playerid] != 0 && bankactive) playerperformskillcheck[playerid] = true; // if is breaking into a vault, did the skill check!
  183. }
  184. return 1;
  185. }
  186. Hook:br_OnPlayerEnterCheckpoint(playerid)
  187. {
  188. if(CP[playerid] == CHECKPOINT_BANKROB)
  189. {
  190. new msg[128];
  191. CP[playerid] = CHECKPOINT_NONE;
  192. DisablePlayerCheckpointEx(playerid);
  193. format(msg, sizeof(msg), "You have received $%d money for robbing the bank.", bankmoneygathered);
  194. SendClientMessage(playerid, COLOR_LIGHTBLUE, msg);
  195. GameTextForPlayer(playerid, "~w~Good job!", 4000, 1);
  196. format(msg, sizeof(msg), "City Hall: The laundered money from the bank has been successfully robbed and gathered - $%d.", bankmoneygathered);
  197. SendClientMessageToAll(COLOR_LIGHTBLUE, msg);
  198. GiveMoney(playerid, bankmoneygathered);
  199. GOV -= bankmoneygathered;
  200. CancelBankRobbery();
  201. new family = PlayerInfo[playerid][pFMember];
  202. if(family != 255)
  203. {
  204. FamilyInfo[family][fXP] += 15;
  205. foreach(new i: Player)
  206. {
  207. if(PlayerInfo[i][pFMember] == family)
  208. {
  209. SendClientMessage(i, COLOR_LIGHTBLUE, "Your family has been given 15 XP for successfully robbing the bank!");
  210. GrantFamXP(family, 15);
  211. }
  212. }
  213. }
  214. }
  215. return 1;
  216. }
  217. Hook:bank_OnPlayerDisconnect(playerid, reason)
  218. {
  219. if(bankrobber == playerid && bankactive)
  220. {
  221. SendClientMessageToAll(COLOR_LIGHTBLUE, "City Hall: Robber disconnected, bank robbery failed.");
  222. CancelBankRobbery();
  223. }
  224. KillTimer(bankrobtimer[playerid]);
  225. KillTimer(skillchecktimer[playerid]);
  226. KillTimer(safebreaktime[playerid]);
  227. KillTimer(skillcheckrespond[playerid]);
  228. return 1;
  229. }
  230. Hook:bank_OnPlayerUpdate(playerid)
  231. {
  232. if(safebreaktime[playerid] != 0)
  233. {
  234. new safeid = breakingintovault[playerid];
  235. if(!IsPlayerInRangeOfPoint(playerid, 1.5, Vaults[safeid][vPosX], Vaults[safeid][vPosY], Vaults[safeid][vPosZ]))
  236. {
  237. SendClientMessage(playerid, COLOR_GREY, "You have moved too much from the safe, you have failed the breakin.");
  238. KillTimer(skillchecktimer[playerid]);
  239. KillTimer(safebreaktime[playerid]);
  240. KillTimer(skillcheckrespond[playerid]);
  241. CancelVaultBreak(safeid);
  242. safebreaktime[playerid] = 0;
  243. return 1;
  244. }
  245. }
  246. if(breakingvault && bankactive)
  247. {
  248. if(bankrobber == playerid)
  249. {
  250. if(!IsPlayerInRangeOfPoint(playerid, 1.5, BANK_VAULT_COORDINATES))
  251. {
  252. SendClientMessage(playerid, COLOR_GREY, "You have moved too much from the vault, bank robbery failed.");
  253. CancelBankRobbery();
  254. }
  255. }
  256. }
  257. return 1;
  258. }
  259. Hook:bankrobbery_OnPlayerDeath(playerid, killerid, reason)
  260. {
  261. if(bankrobber == playerid && bankactive)
  262. {
  263. PlayerInfo[playerid][pDrill] = 0;
  264. CP[playerid] = CHECKPOINT_NONE;
  265. DisablePlayerCheckpointEx(playerid);
  266. SendClientMessageToAll(COLOR_LIGHTBLUE, "City Hall: Robber eliminated, bank robbery failed.");
  267. CancelBankRobbery();
  268. foreach(new i: Player)
  269. {
  270. if(safebreaktime[i] != 0)
  271. {
  272. CancelVaultBreak(i);
  273. KillTimer(skillchecktimer[i]);
  274. KillTimer(safebreaktime[i]);
  275. KillTimer(skillcheckrespond[i]);
  276. }
  277. }
  278. }
  279. KillTimer(bankrobtimer[playerid]);
  280. KillTimer(skillchecktimer[playerid]);
  281. KillTimer(safebreaktime[playerid]);
  282. KillTimer(skillcheckrespond[playerid]);
  283. return 1;
  284. }
  285. Hook:br_OnGameModeInit()
  286. {
  287. bigvault = CreateDynamicObject(2634, 1641.35510, 2907.80640, 989.11761, 0.00000, 0.00000, 91.36140);
  288. return 1;
  289. }
  290. CancelBankRobbery()
  291. {
  292. for(new i = 0; i < MAX_VAULTS; i++)
  293. {
  294. DestroyDynamicObjectEx(Vaults[i][vObject]);
  295. DestroyDynamic3DTextLabel(Vaults[i][v3DText]);
  296. Vaults[i][vMoney] = 0;
  297. }
  298. bankrobber = -1;
  299. bankactive = false;
  300. breakingvault = false;
  301. bankmoneygathered = 0;
  302. goinglaundering = false;
  303. foreach(new i: Player)
  304. {
  305. if(IsPlayerInRangeOfPoint(i, 10, BANK_VAULT_INSIDE)) SetPlayerPos(i, BANK_VAULT_OUTSIDE); // tp players that are inside the vault to avoid them getting stuck
  306. KillTimer(bankrobtimer[i]);
  307. KillTimer(skillchecktimer[i]);
  308. KillTimer(safebreaktime[i]);
  309. KillTimer(skillcheckrespond[i]);
  310. }
  311. MoveDynamicObject(bigvault, 1641.35510, 2907.80640, 989.11761, 3, 0.00000, 0.00000, 91.36140);
  312. return 1;
  313. }
  314. CancelVaultBreak(safeid)
  315. {
  316. Vaults[safeid][vBreaking] = false;
  317. UpdateDynamic3DTextLabelText(Vaults[safeid][v3DText], -1, "{FFFFFF}/usedrill\n{FF0000}No one drilling");
  318. return 1;
  319. }
  320. IsByVaultDoor(playerid)
  321. {
  322. if(IsPlayerInRangeOfPoint(playerid, 1.5, BANK_VAULT_COORDINATES)) return 1;
  323. return 0;
  324. }
  325. IsBySafe(playerid)
  326. {
  327. new safeid = -1;
  328. for(new i = 0; i < MAX_VAULTS; i++)
  329. {
  330. if(IsPlayerInRangeOfPoint(playerid, 1.5, Vaults[i][vPosX], Vaults[i][vPosY], Vaults[i][vPosZ]))
  331. {
  332. safeid = i;
  333. break;
  334. }
  335. }
  336. return safeid;
  337. }
  338. SetupVaults()
  339. {
  340. for(new i = 0; i < MAX_VAULTS; i++)
  341. {
  342. Vaults[i][vMoney] = 250000;
  343. Vaults[i][vBreaking] = false;
  344. Vaults[i][vOpened] = false;
  345. Vaults[i][vPosX] = VaultsPositions[i][0];
  346. Vaults[i][vPosY] = VaultsPositions[i][1];
  347. Vaults[i][vPosZ] = VaultsPositions[i][2];
  348. Vaults[i][vPosRX] = VaultsPositions[i][3];
  349. Vaults[i][vPosRY] = VaultsPositions[i][4];
  350. Vaults[i][vPosRZ] = VaultsPositions[i][5];
  351. Vaults[i][vObject] = CreateDynamicObject(2332, Vaults[i][vPosX], Vaults[i][vPosY], Vaults[i][vPosZ], Vaults[i][vPosRX], Vaults[i][vPosRY], Vaults[i][vPosRZ]);
  352. Vaults[i][v3DText] = CreateDynamic3DTextLabel("{FFFFFF}/usedrill\n{FF0000}No one drilling", -1, Vaults[i][vPosX], Vaults[i][vPosY], Vaults[i][vPosZ]+0.8, 5);
  353. }
  354. return 1;
  355. }
  356. CMD:usedrill(playerid, params[])
  357. {
  358. if(PlayerInfo[playerid][pLevel] < 4) return SendClientMessage(playerid, COLOR_GREY, "You need to be level 4+ to use this.");
  359. if(PlayerInfo[playerid][pDrill] != 1) return SendClientMessage(playerid, COLOR_GREY, "You don't have a drill");
  360. if(!IsByVaultDoor(playerid) && !bankactive) return SendClientMessage(playerid, COLOR_GREY, "You are not near the vault's door.");
  361. if(bankactive && IsBySafe(playerid) == -1) return SendClientMessage(playerid, COLOR_GREY, "You are not near a safe.");
  362. if(GetLEOCount() < 7 && !bankactive) return SendClientMessage(playerid, COLOR_GREY, "There must be 7 LEOs on (SAPD, FBI or SANG, admins excluded)");
  363. if(gettime() < TimeAfterBankJob && !bankactive) return SendClientMessage(playerid, COLOR_GREY, "The bank robbery system is currently on cooldown.");
  364. if(goinglaundering) return SendClientMessage(playerid, COLOR_GREY, "You may not launder more money as the robber stopped robbing.");
  365. if(!bankactive) StartBankRobbery(playerid); // break into the vault
  366. else if(bankactive) // break into a safe
  367. {
  368. new safeid = IsBySafe(playerid);
  369. if(Vaults[safeid][vOpened]) return SendClientMessage(playerid, COLOR_GREY, "This safe is already opened.");
  370. if(Vaults[safeid][vBreaking]) return SendClientMessage(playerid, COLOR_GREY, "Someone is already breaking into this safe");
  371. BreakVault(playerid, safeid);
  372. }
  373. return 1;
  374. }
  375. CMD:loadsafemoney(playerid, params[])
  376. {
  377. if(!bankactive) return SendClientMessage(playerid, COLOR_GREY, "A bank robbery is not active.");
  378. new safeid = IsBySafe(playerid);
  379. if(safeid == -1) return SendClientMessage(playerid, COLOR_GREY, "You are not by a safe.");
  380. if(!Vaults[safeid][vOpened]) return SendClientMessage(playerid, COLOR_GREY, "This safe is not opened (/usedrill to start breaking into it).");
  381. if(Vaults[safeid][vMoney] == 0) return SendClientMessage(playerid, COLOR_GREY, "Someone already loaded the money from this safe.");
  382. bankmoneygathered += 250000;
  383. Vaults[safeid][vMoney] = 0;
  384. if(bankmoneygathered == 1500000) SetupMoneyLaundering(bankrobber);
  385. UpdateDynamic3DTextLabelText(Vaults[safeid][v3DText], -1, "{00FF00}Opened\n{FFFFFF}Loaded ({00FF00}$0 {FFFFFF}inside)");
  386. new msg[128];
  387. format(msg, sizeof(msg), "You have loaded $250,000 from the safe (total: %d), the main robber may use /stopbankrob to stop robbing.", bankmoneygathered);
  388. SendClientMessage(playerid, COLOR_LIGHTBLUE, msg);
  389. SendClientMessage(playerid, COLOR_LIGHTBLUE, "NOTE: This will prevent you from gathering more money in this robbery.");
  390. return 1;
  391. }
  392. CMD:stopbankrob(playerid, params[])
  393. {
  394. if(!bankactive) return SendClientMessage(playerid, COLOR_GREY, "There is currently no active bank robbery.");
  395. if(bankrobber != playerid) return SendClientMessage(playerid, COLOR_GREY, "Only the main robber may use this.");
  396. if(bankmoneygathered < 750000) return SendClientMessage(playerid, COLOR_GREY, "There must be at least $750,000 money laundered before stopping the robbery.");
  397. SetupMoneyLaundering(playerid);
  398. return 1;
  399. }
  400. CMD:checkbanktime(playerid, params[])
  401. {
  402. new msg[128];
  403. new
  404. diff = TimeAfterBankJob-gettime(),
  405. hours, minutes, seconds;
  406. if(diff < 0) return SendClientMessage(playerid, COLOR_GREY, "Bank robbery is available.");
  407. hours = diff / 3600;
  408. diff %= 3600;
  409. minutes = diff/60,
  410. diff %= 60;
  411. seconds = diff;
  412. format(msg, sizeof(msg), "Time left: %d:%d:%d", hours, minutes, seconds);
  413. SendClientMessage(playerid, COLOR_GREY, msg);
  414. return 1;
  415. }
  416. CMD:allowrobbank(playerid, params[])
  417. {
  418. if(PlayerInfo[playerid][pAdmin] < 3) return AdmErrorMsg;
  419. SendClientMessage(playerid, COLOR_LIGHTBLUE, "Bank robbery is now allowed.");
  420. TimeAfterBankJob = gettime();
  421. return 1;
  422. }
  423. CMD:bankhelp(playerid, params[])
  424. {
  425. SendClientMessage(playerid, COLOR_YELLOW, "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
  426. SendClientMessage(playerid, COLOR_WHITE, "/checkbanktime - check when you can rob the bank again (24 hours cooldown since last robbery)");
  427. SendClientMessage(playerid, COLOR_WHITE, "/usedrill - drill into the big vault or into a safe");
  428. SendClientMessage(playerid, COLOR_WHITE, "/stopbankrob - can only be used by the main robber, stops the robbery ($750,000 loaded required)");
  429. SendClientMessage(playerid, COLOR_WHITE, "/loadsafemoney - launder money (does not give you money) which can be collected by the main robber at the checkpoint");
  430. SendClientMessage(playerid, COLOR_WHITE, "Notes - drill is unlimited but lost on death. 7 LEOs+ (PD/FBI/SANG) are required to rob the bank (admins do not count).");
  431. SendClientMessage(playerid, COLOR_WHITE, "You have a 50 percents chance to get a skill check when breaking into a safe.");
  432. SendClientMessage(playerid, COLOR_WHITE, "You have 3 seconds to respond to it (press SPACE or your custom sprint key). Only the main robber may collect the money.");
  433. SendClientMessage(playerid, COLOR_YELLOW, "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
  434. return 1;
  435. }