Advertisement
Guest User

Robbable Cash Registers

a guest
Jun 23rd, 2016
1,323
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 20.65 KB | None | 0 0
  1. #define FILTERSCRIPT
  2. #include <a_samp>
  3. #include <izcmd> // by Yashas - http://forum.sa-mp.com/showthread.php?t=576114
  4. #include <sqlitei> // by Slice - http://forum.sa-mp.com/showthread.php?t=303682
  5. #include <streamer> // by Incognito - http://forum.sa-mp.com/showthread.php?t=102865
  6.  
  7. #define MAX_CREGISTER (50) // limit of cash registers
  8. #define CREG_MIN_MONEY (250) // min. amount of money stolen from a cash register (Default: 250)
  9. #define CREG_MAX_MONEY (1000) // max. amount of money stolen from a cash register (Default: 1000)
  10. #define CREG_RESPAWN (180) // time required for a cash register to become robbable again, in seconds (Default: 180)
  11. #define CREG_ROBTIME (5) // time required to rob a cash register, in seconds (Default: 5)
  12.  
  13. enum E_CREGISTER
  14. {
  15. // saved
  16. Float: regX,
  17. Float: regY,
  18. Float: regZ,
  19. Float: regA,
  20. regInt,
  21. regVW,
  22. // temp
  23. regTimeLeft,
  24. regObj,
  25. regPickup,
  26. regTimer,
  27. Text3D: regLabel,
  28. bool: regExists
  29. }
  30.  
  31. new
  32. CashRegData[MAX_CREGISTER][E_CREGISTER];
  33.  
  34. new
  35. RobberyTimeLeft[MAX_PLAYERS],
  36. RobberyTimer[MAX_PLAYERS] = {-1, ...},
  37. EditingRegisterID[MAX_PLAYERS] = {-1, ...},
  38. PlayerText: CRegRobberyText[MAX_PLAYERS] = {PlayerText: -1, ...};
  39.  
  40. new
  41. DB: CashRegDB,
  42. DBStatement: LoadRegisters,
  43. DBStatement: AddRegister,
  44. DBStatement: UpdateRegister,
  45. DBStatement: RemoveRegister;
  46.  
  47. RandomEx(min, max) //Y_Less
  48. return random(max - min) + min;
  49.  
  50. SetPlayerLookAt(playerid, Float:x, Float:y)
  51. {
  52. // somewhere on samp forums, couldn't find the source
  53. new Float:Px, Float:Py, Float: Pa;
  54. GetPlayerPos(playerid, Px, Py, Pa);
  55. Pa = floatabs(atan((y-Py)/(x-Px)));
  56. if (x <= Px && y >= Py) Pa = floatsub(180, Pa);
  57. else if (x < Px && y < Py) Pa = floatadd(Pa, 180);
  58. else if (x >= Px && y <= Py) Pa = floatsub(360.0, Pa);
  59. Pa = floatsub(Pa, 90.0);
  60. if (Pa >= 360.0) Pa = floatsub(Pa, 360.0);
  61. // nan check
  62. if(Pa == Pa) SetPlayerFacingAngle(playerid, Pa);
  63. }
  64.  
  65. ConvertToMinutes(time)
  66. {
  67. // http://forum.sa-mp.com/showpost.php?p=3223897&postcount=11
  68. new string[15];//-2000000000:00 could happen, so make the string 15 chars to avoid any errors
  69. format(string, sizeof(string), "%02d:%02d", time / 60, time % 60);
  70. return string;
  71. }
  72.  
  73. formatInt(intVariable, iThousandSeparator = ',', iCurrencyChar = '$')
  74. {
  75. /*
  76. By Kar
  77. https://gist.github.com/Kar2k/bfb0eafb2caf71a1237b349684e091b9/8849dad7baa863afb1048f40badd103567c005a5#file-formatint-function
  78. */
  79. static
  80. s_szReturn[ 32 ],
  81. s_szThousandSeparator[ 2 ] = { ' ', EOS },
  82. s_szCurrencyChar[ 2 ] = { ' ', EOS },
  83. s_iVariableLen,
  84. s_iChar,
  85. s_iSepPos,
  86. bool:s_isNegative
  87. ;
  88.  
  89. format( s_szReturn, sizeof( s_szReturn ), "%d", intVariable );
  90.  
  91. if(s_szReturn[0] == '-')
  92. s_isNegative = true;
  93. else
  94. s_isNegative = false;
  95.  
  96. s_iVariableLen = strlen( s_szReturn );
  97.  
  98. if ( s_iVariableLen >= 4 && iThousandSeparator)
  99. {
  100. s_szThousandSeparator[ 0 ] = iThousandSeparator;
  101.  
  102. s_iChar = s_iVariableLen;
  103. s_iSepPos = 0;
  104.  
  105. while ( --s_iChar > _:s_isNegative )
  106. {
  107. if ( ++s_iSepPos == 3 )
  108. {
  109. strins( s_szReturn, s_szThousandSeparator, s_iChar );
  110.  
  111. s_iSepPos = 0;
  112. }
  113. }
  114. }
  115. if(iCurrencyChar) {
  116. s_szCurrencyChar[ 0 ] = iCurrencyChar;
  117. strins( s_szReturn, s_szCurrencyChar, _:s_isNegative );
  118. }
  119. return s_szReturn;
  120. }
  121.  
  122. GetClosestRegister(playerid, Float: range = 1.5)
  123. {
  124. new id = -1, Float: dist = range, Float: tempdist;
  125. for(new i; i < MAX_CREGISTER; i++)
  126. {
  127. if(!CashRegData[i][regExists]) continue;
  128. if(CashRegData[i][regInt] != GetPlayerInterior(playerid) && CashRegData[i][regVW] != GetPlayerVirtualWorld(playerid)) continue;
  129. tempdist = GetPlayerDistanceFromPoint(playerid, CashRegData[i][regX], CashRegData[i][regY], CashRegData[i][regZ]);
  130.  
  131. if(tempdist > range) continue;
  132. if(tempdist <= dist)
  133. {
  134. dist = tempdist;
  135. id = i;
  136. }
  137. }
  138.  
  139. return id;
  140. }
  141.  
  142. CashReg_FindFreeID()
  143. {
  144. for(new i; i < MAX_CREGISTER; i++) if(!CashRegData[i][regExists]) return i;
  145. return -1;
  146. }
  147.  
  148. CashReg_BeingEdited(id)
  149. {
  150. if(!(0 <= id <= MAX_CREGISTER - 1)) return 0;
  151. if(!CashRegData[id][regExists]) return 0;
  152. for(new i, psize = GetPlayerPoolSize(); i <= psize; i++)
  153. {
  154. if(!IsPlayerConnected(i)) continue;
  155. if(EditingRegisterID[i] == id) return 1;
  156. }
  157.  
  158. return 0;
  159. }
  160.  
  161. CashReg_PlayerInit(playerid)
  162. {
  163. RobberyTimeLeft[playerid] = 0;
  164. RobberyTimer[playerid] = EditingRegisterID[playerid] = -1;
  165.  
  166. CRegRobberyText[playerid] = CreatePlayerTextDraw(playerid, 40.000000, 295.000000, "_");
  167. PlayerTextDrawBackgroundColor(playerid, CRegRobberyText[playerid], 255);
  168. PlayerTextDrawFont(playerid, CRegRobberyText[playerid], 1);
  169. PlayerTextDrawLetterSize(playerid, CRegRobberyText[playerid], 0.240000, 1.100000);
  170. PlayerTextDrawColor(playerid, CRegRobberyText[playerid], -1);
  171. PlayerTextDrawSetOutline(playerid, CRegRobberyText[playerid], 1);
  172. PlayerTextDrawSetProportional(playerid, CRegRobberyText[playerid], 1);
  173. PlayerTextDrawSetSelectable(playerid, CRegRobberyText[playerid], 0);
  174.  
  175. ApplyAnimation(playerid, "INT_SHOP", "null", 0.0, 0, 0, 0, 0, 0);
  176. return 1;
  177. }
  178.  
  179. CashReg_ResetPlayer(playerid)
  180. {
  181. if(RobberyTimer[playerid] != -1)
  182. {
  183. KillTimer(RobberyTimer[playerid]);
  184. ClearAnimations(playerid);
  185. }
  186.  
  187. PlayerTextDrawHide(playerid, CRegRobberyText[playerid]);
  188. RobberyTimeLeft[playerid] = 0;
  189. RobberyTimer[playerid] = -1;
  190. return 1;
  191. }
  192.  
  193. public OnFilterScriptInit()
  194. {
  195. for(new i; i < MAX_CREGISTER; i++)
  196. {
  197. CashRegData[i][regObj] = CashRegData[i][regPickup] = CashRegData[i][regTimer] = -1;
  198. CashRegData[i][regLabel] = Text3D: -1;
  199. }
  200.  
  201. for(new i, psize = GetPlayerPoolSize(); i <= psize; i++) if(IsPlayerConnected(i)) CashReg_PlayerInit(i);
  202.  
  203. // database
  204. CashRegDB = db_open("cash_registers.db");
  205. db_query(CashRegDB, "CREATE TABLE IF NOT EXISTS cashregisters (ID INTEGER, RegX FLOAT, RegY FLOAT, RegZ FLOAT, RegA FLOAT, RegInt INTEGER, RegVW INTEGER)");
  206.  
  207. // prepare queries
  208. LoadRegisters = db_prepare(CashRegDB, "SELECT * FROM cashregisters");
  209. AddRegister = db_prepare(CashRegDB, "INSERT INTO cashregisters (ID, RegX, RegY, RegZ, RegA, RegInt, RegVW) VALUES (?, ?, ?, ?, ?, ?, ?)");
  210. UpdateRegister = db_prepare(CashRegDB, "UPDATE cashregisters SET RegX=?, RegY=?, RegZ=?, RegA=? WHERE ID=?");
  211. RemoveRegister = db_prepare(CashRegDB, "DELETE FROM cashregisters WHERE ID=?");
  212.  
  213. // load cash registers
  214. new id, worlddata[2], Float: pos[4];
  215. stmt_bind_result_field(LoadRegisters, 0, DB::TYPE_INTEGER, id);
  216. stmt_bind_result_field(LoadRegisters, 1, DB::TYPE_FLOAT, pos[0]);
  217. stmt_bind_result_field(LoadRegisters, 2, DB::TYPE_FLOAT, pos[1]);
  218. stmt_bind_result_field(LoadRegisters, 3, DB::TYPE_FLOAT, pos[2]);
  219. stmt_bind_result_field(LoadRegisters, 4, DB::TYPE_FLOAT, pos[3]);
  220. stmt_bind_result_field(LoadRegisters, 5, DB::TYPE_INTEGER, worlddata[0]);
  221. stmt_bind_result_field(LoadRegisters, 6, DB::TYPE_INTEGER, worlddata[1]);
  222.  
  223. if(stmt_execute(LoadRegisters))
  224. {
  225. new label[128];
  226. while(stmt_fetch_row(LoadRegisters))
  227. {
  228. CashRegData[id][regX] = pos[0];
  229. CashRegData[id][regY] = pos[1];
  230. CashRegData[id][regZ] = pos[2];
  231. CashRegData[id][regA] = pos[3];
  232. CashRegData[id][regInt] = worlddata[0];
  233. CashRegData[id][regVW] = worlddata[1];
  234.  
  235. CashRegData[id][regObj] = CreateDynamicObject(2941, CashRegData[id][regX], CashRegData[id][regY], CashRegData[id][regZ], 0.0, 0.0, CashRegData[id][regA], CashRegData[id][regVW], CashRegData[id][regInt]);
  236.  
  237. format(label, sizeof(label), "Cash Register (%d)\n\n{FFFFFF}Press {F1C40F}~k~~CONVERSATION_NO~ {FFFFFF}to rob.\n{2ECC71}Robbable", id);
  238. CashRegData[id][regLabel] = CreateDynamic3DTextLabel(label, 0xF1C40FFF, CashRegData[id][regX], CashRegData[id][regY], CashRegData[id][regZ] + 0.25, 5.0, .testlos = 1);
  239.  
  240. CashRegData[id][regExists] = true;
  241. }
  242. }
  243.  
  244. return 1;
  245. }
  246.  
  247. public OnFilterScriptExit()
  248. {
  249. for(new i, psize = GetPlayerPoolSize(); i <= psize; i++)
  250. {
  251. if(!IsPlayerConnected(i)) continue;
  252. CashReg_ResetPlayer(i);
  253. PlayerTextDrawDestroy(i, CRegRobberyText[i]);
  254. }
  255.  
  256. db_close(CashRegDB);
  257. return 1;
  258. }
  259.  
  260. public OnPlayerConnect(playerid)
  261. {
  262. CashReg_PlayerInit(playerid);
  263. return 1;
  264. }
  265.  
  266. public OnPlayerDisconnect(playerid, reason)
  267. {
  268. CashReg_ResetPlayer(playerid);
  269.  
  270. EditingRegisterID[playerid] = -1;
  271. CRegRobberyText[playerid] = PlayerText: -1;
  272. return 1;
  273. }
  274.  
  275. public OnPlayerStateChange(playerid, newstate, oldstate)
  276. {
  277. CashReg_ResetPlayer(playerid);
  278. return 1;
  279. }
  280.  
  281. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
  282. {
  283. if(GetPlayerState(playerid) == PLAYER_STATE_ONFOOT && (newkeys & KEY_NO))
  284. {
  285. new id = GetClosestRegister(playerid);
  286.  
  287. if(id != -1 && !CashReg_BeingEdited(id) && CashRegData[id][regTimer] == -1)
  288. {
  289. SetPlayerPos(playerid, CashRegData[id][regX] + (0.75 * floatsin(-CashRegData[id][regA], degrees)), CashRegData[id][regY] + (0.75 * floatcos(-CashRegData[id][regA], degrees)), CashRegData[id][regZ]);
  290. SetPlayerLookAt(playerid, CashRegData[id][regX], CashRegData[id][regY]);
  291.  
  292. // disable cash register
  293. CashRegData[id][regTimeLeft] = CREG_RESPAWN;
  294. CashRegData[id][regTimer] = SetTimerEx("CashReg_Reset", 1000, true, "ii", id, -1);
  295.  
  296. new string[128];
  297. format(string, sizeof(string), "Cash Register (%d)\n\n{FFFFFF}Press {F1C40F}~k~~CONVERSATION_NO~ {FFFFFF}to rob.\n{E74C3C}Robbable in %s", id, ConvertToMinutes(CREG_RESPAWN));
  298. UpdateDynamic3DTextLabelText(CashRegData[id][regLabel], 0xF1C40FFF, string);
  299.  
  300. // start robbery
  301. ApplyAnimation(playerid, "INT_SHOP", "shop_cashier", 4.0, 1, 0, 0, 0, 0);
  302.  
  303. format(string, sizeof(string), "~b~~h~Cash Register Robbery~n~~n~Complete in ~r~%s", ConvertToMinutes(CREG_ROBTIME));
  304. PlayerTextDrawSetString(playerid, CRegRobberyText[playerid], string);
  305. PlayerTextDrawShow(playerid, CRegRobberyText[playerid]);
  306.  
  307. RobberyTimeLeft[playerid] = CREG_ROBTIME;
  308. RobberyTimer[playerid] = SetTimerEx("CashReg_Rob", 1000, true, "i", playerid);
  309. }
  310. }
  311.  
  312. return 1;
  313. }
  314.  
  315. public OnPlayerShootDynamicObject(playerid, weaponid, STREAMER_TAG_OBJECT objectid, Float:x, Float:y, Float:z)
  316. {
  317. if(Streamer_GetIntData(STREAMER_TYPE_OBJECT, objectid, E_STREAMER_MODEL_ID) == 2941)
  318. {
  319. new id = -1;
  320. for(new i; i < MAX_CREGISTER; i++)
  321. {
  322. if(!CashRegData[i][regExists]) continue;
  323. if(objectid == CashRegData[i][regObj])
  324. {
  325. id = i;
  326. break;
  327. }
  328. }
  329.  
  330. if(id != -1 && !CashReg_BeingEdited(id) && CashRegData[id][regTimer] == -1)
  331. {
  332. new Float: a = CashRegData[id][regA] + 180.0;
  333. CashRegData[id][regPickup] = CreateDynamicPickup(1212, 1, CashRegData[id][regX] + (1.25 * floatsin(-a, degrees)), CashRegData[id][regY] + (1.25 * floatcos(-a, degrees)), CashRegData[id][regZ] - 0.5);
  334. PlayerPlaySound(playerid, 17802, 0.0, 0.0, 0.0);
  335.  
  336. CashRegData[id][regTimeLeft] = CREG_RESPAWN;
  337. CashRegData[id][regTimer] = SetTimerEx("CashReg_Reset", 1000, true, "ii", id, CreateDynamicObject(18703, CashRegData[id][regX] - (0.15 * floatsin(-a, degrees)), CashRegData[id][regY] - (0.15 * floatcos(-a, degrees)), CashRegData[id][regZ] - 1.65, 0.0, 0.0, 0.0, CashRegData[id][regVW], CashRegData[id][regInt]));
  338.  
  339. new string[128];
  340. format(string, sizeof(string), "Cash Register (%d)\n\n{FFFFFF}Press {F1C40F}~k~~CONVERSATION_NO~ {FFFFFF}to rob.\n{E74C3C}Robbable in %s", id, ConvertToMinutes(CREG_RESPAWN));
  341. UpdateDynamic3DTextLabelText(CashRegData[id][regLabel], 0xF1C40FFF, string);
  342. Streamer_Update(playerid);
  343. }
  344. }
  345.  
  346. return 1;
  347. }
  348.  
  349. public OnPlayerEditDynamicObject(playerid, STREAMER_TAG_OBJECT objectid, response, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz)
  350. {
  351. if(EditingRegisterID[playerid] != -1 && CashRegData[ EditingRegisterID[playerid] ][regExists])
  352. {
  353. if(response == EDIT_RESPONSE_FINAL)
  354. {
  355. new id = EditingRegisterID[playerid];
  356. CashRegData[id][regX] = x;
  357. CashRegData[id][regY] = y;
  358. CashRegData[id][regZ] = z;
  359. CashRegData[id][regA] = rz;
  360.  
  361. SetDynamicObjectPos(objectid, CashRegData[id][regX], CashRegData[id][regY], CashRegData[id][regZ]);
  362. SetDynamicObjectRot(objectid, 0.0, 0.0, CashRegData[id][regA]);
  363.  
  364. Streamer_SetFloatData(STREAMER_TYPE_3D_TEXT_LABEL, CashRegData[id][regLabel], E_STREAMER_X, CashRegData[id][regX]);
  365. Streamer_SetFloatData(STREAMER_TYPE_3D_TEXT_LABEL, CashRegData[id][regLabel], E_STREAMER_Y, CashRegData[id][regY]);
  366. Streamer_SetFloatData(STREAMER_TYPE_3D_TEXT_LABEL, CashRegData[id][regLabel], E_STREAMER_Z, CashRegData[id][regZ] + 0.25);
  367.  
  368. stmt_bind_value(UpdateRegister, 0, DB::TYPE_FLOAT, CashRegData[id][regX]);
  369. stmt_bind_value(UpdateRegister, 1, DB::TYPE_FLOAT, CashRegData[id][regY]);
  370. stmt_bind_value(UpdateRegister, 2, DB::TYPE_FLOAT, CashRegData[id][regZ]);
  371. stmt_bind_value(UpdateRegister, 3, DB::TYPE_FLOAT, CashRegData[id][regA]);
  372. stmt_bind_value(UpdateRegister, 4, DB::TYPE_INTEGER, id);
  373. stmt_execute(UpdateRegister);
  374.  
  375. EditingRegisterID[playerid] = -1;
  376. }
  377.  
  378. if(response == EDIT_RESPONSE_CANCEL)
  379. {
  380. new id = EditingRegisterID[playerid];
  381. SetDynamicObjectPos(objectid, CashRegData[id][regX], CashRegData[id][regY], CashRegData[id][regZ]);
  382. SetDynamicObjectRot(objectid, 0.0, 0.0, CashRegData[id][regA]);
  383. EditingRegisterID[playerid] = -1;
  384. }
  385. }
  386.  
  387. return 1;
  388. }
  389.  
  390. public OnPlayerPickUpDynamicPickup(playerid, pickupid)
  391. {
  392. if(Streamer_GetIntData(STREAMER_TYPE_PICKUP, pickupid, E_STREAMER_MODEL_ID) == 1212)
  393. {
  394. new id = -1;
  395. for(new i; i < MAX_CREGISTER; i++)
  396. {
  397. if(!CashRegData[i][regExists]) continue;
  398. if(pickupid == CashRegData[i][regPickup])
  399. {
  400. id = i;
  401. break;
  402. }
  403. }
  404.  
  405. if(id != -1)
  406. {
  407. new money = RandomEx(floatround(CREG_MIN_MONEY / 2), floatround(CREG_MAX_MONEY / 2)), string[128];
  408. format(string, sizeof(string), "CASH REGISTER: {FFFFFF}You stole {2ECC71}%s {FFFFFF}from the cash register.", formatInt(money));
  409. SendClientMessage(playerid, 0x3498DBFF, string);
  410. GivePlayerMoney(playerid, money);
  411.  
  412. CashRegData[id][regPickup] = -1;
  413. DestroyDynamicPickup(pickupid);
  414. }
  415. }
  416.  
  417. return 1;
  418. }
  419.  
  420. forward CashReg_Reset(id, smokeid);
  421. public CashReg_Reset(id, smokeid)
  422. {
  423. new string[128];
  424.  
  425. if(CashRegData[id][regTimeLeft] > 1) {
  426. CashRegData[id][regTimeLeft]--;
  427.  
  428. format(string, sizeof(string), "Cash Register (%d)\n\n{FFFFFF}Press {F1C40F}~k~~CONVERSATION_NO~ {FFFFFF}to rob.\n{E74C3C}Robbable in %s", id, ConvertToMinutes(CashRegData[id][regTimeLeft]));
  429. UpdateDynamic3DTextLabelText(CashRegData[id][regLabel], 0xF1C40FFF, string);
  430. }else if(CashRegData[id][regTimeLeft] == 1) {
  431. if(smokeid != -1) DestroyDynamicObject(smokeid);
  432. DestroyDynamicPickup(CashRegData[id][regPickup]);
  433. KillTimer(CashRegData[id][regTimer]);
  434. CashRegData[id][regTimeLeft] = 0;
  435. CashRegData[id][regPickup] = CashRegData[id][regTimer] = -1;
  436.  
  437. format(string, sizeof(string), "Cash Register (%d)\n\n{FFFFFF}Press {F1C40F}~k~~CONVERSATION_NO~ {FFFFFF}to rob.\n{2ECC71}Robbable", id);
  438. UpdateDynamic3DTextLabelText(CashRegData[id][regLabel], 0xF1C40FFF, string);
  439. }
  440.  
  441. return 1;
  442. }
  443.  
  444. forward CashReg_Rob(playerid);
  445. public CashReg_Rob(playerid)
  446. {
  447. new string[128];
  448.  
  449. if(RobberyTimeLeft[playerid] > 1) {
  450. RobberyTimeLeft[playerid]--;
  451.  
  452. format(string, sizeof(string), "~b~~h~Cash Register Robbery~n~~n~Complete in ~r~%s", ConvertToMinutes(RobberyTimeLeft[playerid]));
  453. PlayerTextDrawSetString(playerid, CRegRobberyText[playerid], string);
  454. }else if(RobberyTimeLeft[playerid] == 1) {
  455. new money = RandomEx(CREG_MIN_MONEY, CREG_MAX_MONEY);
  456. CashReg_ResetPlayer(playerid);
  457.  
  458. format(string, sizeof(string), "CASH REGISTER: {FFFFFF}You stole {2ECC71}%s {FFFFFF}from the cash register.", formatInt(money));
  459. SendClientMessage(playerid, 0x3498DBFF, string);
  460. GivePlayerMoney(playerid, money);
  461. }
  462.  
  463. return 1;
  464. }
  465.  
  466. // Admin Commands
  467. CMD:createregister(playerid, params[])
  468. {
  469. if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Only RCON admins can use this command.");
  470. new id = CashReg_FindFreeID();
  471. if(id == -1) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Server cash register limit reached.");
  472. GetPlayerPos(playerid, CashRegData[id][regX], CashRegData[id][regY], CashRegData[id][regZ]);
  473. GetPlayerFacingAngle(playerid, CashRegData[id][regA]);
  474. CashRegData[id][regX] += (1.25 * floatsin(-CashRegData[id][regA], degrees));
  475. CashRegData[id][regY] += (1.25 * floatcos(-CashRegData[id][regA], degrees));
  476. CashRegData[id][regInt] = GetPlayerInterior(playerid);
  477. CashRegData[id][regVW] = GetPlayerVirtualWorld(playerid);
  478. CashRegData[id][regA] += 180.0;
  479. CashRegData[id][regTimeLeft] = 0;
  480.  
  481. CashRegData[id][regObj] = CreateDynamicObject(2941, CashRegData[id][regX], CashRegData[id][regY], CashRegData[id][regZ], 0.0, 0.0, CashRegData[id][regA], CashRegData[id][regVW], CashRegData[id][regInt]);
  482.  
  483. new label[128];
  484. format(label, sizeof(label), "Cash Register (%d)\n\n{FFFFFF}Press {F1C40F}~k~~CONVERSATION_NO~ {FFFFFF}to rob.\n{2ECC71}Robbable", id);
  485. CashRegData[id][regLabel] = CreateDynamic3DTextLabel(label, 0xF1C40FFF, CashRegData[id][regX], CashRegData[id][regY], CashRegData[id][regZ] + 0.25, 5.0, .testlos = 1);
  486. CashRegData[id][regExists] = true;
  487.  
  488. // save to db
  489. stmt_bind_value(AddRegister, 0, DB::TYPE_INTEGER, id);
  490. stmt_bind_value(AddRegister, 1, DB::TYPE_FLOAT, CashRegData[id][regX]);
  491. stmt_bind_value(AddRegister, 2, DB::TYPE_FLOAT, CashRegData[id][regY]);
  492. stmt_bind_value(AddRegister, 3, DB::TYPE_FLOAT, CashRegData[id][regZ]);
  493. stmt_bind_value(AddRegister, 4, DB::TYPE_FLOAT, CashRegData[id][regA]);
  494. stmt_bind_value(AddRegister, 5, DB::TYPE_INTEGER, CashRegData[id][regInt]);
  495. stmt_bind_value(AddRegister, 6, DB::TYPE_INTEGER, CashRegData[id][regVW]);
  496.  
  497. if(stmt_execute(AddRegister))
  498. {
  499. EditingRegisterID[playerid] = id;
  500. EditDynamicObject(playerid, CashRegData[id][regObj]);
  501.  
  502. SendClientMessage(playerid, 0x3498DBFF, "CASH REGISTER: {FFFFFF}Register created.");
  503. SendClientMessage(playerid, 0x3498DBFF, "CASH REGISTER: {FFFFFF}You can edit it right now, or cancel editing and edit it some other time.");
  504. }
  505.  
  506. return 1;
  507. }
  508.  
  509. CMD:editregister(playerid, params[])
  510. {
  511. if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Only RCON admins can use this command.");
  512. if(isnull(params)) return SendClientMessage(playerid, 0xF39C12FF, "SYNTAX: {FFFFFF}/editregister [id]");
  513. new id = strval(params);
  514. if(!(0 <= id <= MAX_CREGISTER - 1)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Invalid ID.");
  515. if(!CashRegData[id][regExists]) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Cash register doesn't exist.");
  516. if(!IsPlayerInRangeOfPoint(playerid, 20.0, CashRegData[id][regX], CashRegData[id][regY], CashRegData[id][regZ])) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You're not near the cash register you want to edit.");
  517. if(CashReg_BeingEdited(id)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Can't edit specified cash register because its being edited already.");
  518. EditingRegisterID[playerid] = id;
  519. EditDynamicObject(playerid, CashRegData[id][regObj]);
  520. return 1;
  521. }
  522.  
  523. CMD:removeregister(playerid, params[])
  524. {
  525. if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Only RCON admins can use this command.");
  526. if(isnull(params)) return SendClientMessage(playerid, 0xF39C12FF, "SYNTAX: {FFFFFF}/removeregister [id]");
  527. new id = strval(params);
  528. if(!(0 <= id <= MAX_CREGISTER - 1)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Invalid ID.");
  529. if(!CashRegData[id][regExists]) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Cash register doesn't exist.");
  530. if(CashReg_BeingEdited(id)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Can't remove specified cash register because its being edited.");
  531. DestroyDynamicObject(CashRegData[id][regObj]);
  532. DestroyDynamic3DTextLabel(CashRegData[id][regLabel]);
  533. DestroyDynamicPickup(CashRegData[id][regPickup]);
  534. if(CashRegData[id][regTimer] != -1) KillTimer(CashRegData[id][regTimer]);
  535.  
  536. CashRegData[id][regObj] = CashRegData[id][regPickup] = CashRegData[id][regTimer] = -1;
  537. CashRegData[id][regLabel] = Text3D: -1;
  538. CashRegData[id][regExists] = false;
  539.  
  540. stmt_bind_value(RemoveRegister, 0, DB::TYPE_INTEGER, id);
  541. if(stmt_execute(RemoveRegister)) SendClientMessage(playerid, 0x3498DBFF, "CASH REGISTER: {FFFFFF}Cash register removed.");
  542. return 1;
  543. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement