Advertisement
Guest User

Gun Vending Machines

a guest
May 10th, 2016
552
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 32.39 KB | None | 0 0
  1. #define     FILTERSCRIPT
  2. #include    <a_samp>
  3. #include    <streamer>      // by Incognito - http://forum.sa-mp.com/showthread.php?t=102865
  4. #include    <sqlitei>       // by Slice - http://forum.sa-mp.com/showthread.php?t=303682
  5. #include    <izcmd>         // by Yashas - http://forum.sa-mp.com/showthread.php?t=576114
  6.  
  7. #define     MAX_MACHINES    (30)
  8.  
  9. enum    E_MACHINE
  10. {
  11.     // saved
  12.     Float: mPosX,
  13.     Float: mPosY,
  14.     Float: mPosZ,
  15.     Float: mRotX,
  16.     Float: mRotY,
  17.     Float: mRotZ,
  18.     // temp
  19.     mObjID,
  20.     mIconID,
  21.     Text3D: mLabel,
  22.     bool: mExists
  23. }
  24.  
  25. enum    _:E_MACHINE_DIALOG
  26. {
  27.     DIALOG_WEAPONS_MENU = 9750,
  28.     DIALOG_WEAPONS_BUY,
  29.     DIALOG_WEAPONS_BUY_FINAL,
  30.     // admin dialogs
  31.     DIALOG_CREATE_CATEGORY,
  32.     DIALOG_REMOVE_CATEGORY,
  33.     DIALOG_RENAME_CATEGORY,
  34.     DIALOG_RENAME_CATEGORY_FINAL,
  35.     DIALOG_ADD_WEAPON_1,
  36.     DIALOG_ADD_WEAPON_2,
  37.     DIALOG_ADD_WEAPON_3,
  38.     DIALOG_ADD_WEAPON_FINAL,
  39.     DIALOG_REMOVE_WEAPON_1,
  40.     DIALOG_REMOVE_WEAPON_FINAL
  41. }
  42.  
  43. new
  44.     MachineData[MAX_MACHINES][E_MACHINE];
  45.  
  46. new
  47.     DB: MachineDatabase;
  48.  
  49. new
  50.     DBStatement: LoadMachines,
  51.     DBStatement: AddMachine,
  52.     DBStatement: UpdateMachine,
  53.     DBStatement: RemoveMachine;
  54.    
  55. new
  56.     DBStatement: ListCategories,
  57.     DBStatement: AddCategory,
  58.     DBStatement: ReturnCategoryID,
  59.     DBStatement: ReturnCategoryName,
  60.     DBStatement: RenameCategory,
  61.     DBStatement: RemoveCategory;
  62.  
  63. new
  64.     DBStatement: ListWeapons,
  65.     DBStatement: LoadWeapon,
  66.     DBStatement: AddWeapon,
  67.     DBStatement: RemoveWeapon,
  68.     DBStatement: RemoveCategoryWeapons;
  69.    
  70. new
  71.     CurCategoryID[MAX_PLAYERS] = {-1, ...},
  72.     CurItemIndex[MAX_PLAYERS] = {-1, ...},
  73.     EditingMachineID[MAX_PLAYERS] = {-1, ...};
  74.  
  75. formatInt(intVariable, iThousandSeparator = ',', iCurrencyChar = '$')
  76. {
  77.     /*
  78.         By Kar
  79.         https://gist.github.com/Kar2k/bfb0eafb2caf71a1237b349684e091b9/8849dad7baa863afb1048f40badd103567c005a5#file-formatint-function
  80.     */
  81.     static
  82.         s_szReturn[ 32 ],
  83.         s_szThousandSeparator[ 2 ] = { ' ', EOS },
  84.         s_szCurrencyChar[ 2 ] = { ' ', EOS },
  85.         s_iVariableLen,
  86.         s_iChar,
  87.         s_iSepPos,
  88.         bool:s_isNegative
  89.     ;
  90.  
  91.     format( s_szReturn, sizeof( s_szReturn ), "%d", intVariable );
  92.  
  93.     if(s_szReturn[0] == '-')
  94.         s_isNegative = true;
  95.     else
  96.         s_isNegative = false;
  97.  
  98.     s_iVariableLen = strlen( s_szReturn );
  99.  
  100.     if ( s_iVariableLen >= 4 && iThousandSeparator)
  101.     {
  102.         s_szThousandSeparator[ 0 ] = iThousandSeparator;
  103.  
  104.         s_iChar = s_iVariableLen;
  105.         s_iSepPos = 0;
  106.  
  107.         while ( --s_iChar > _:s_isNegative )
  108.         {
  109.             if ( ++s_iSepPos == 3 )
  110.             {
  111.                 strins( s_szReturn, s_szThousandSeparator, s_iChar );
  112.  
  113.                 s_iSepPos = 0;
  114.             }
  115.         }
  116.     }
  117.     if(iCurrencyChar) {
  118.         s_szCurrencyChar[ 0 ] = iCurrencyChar;
  119.         strins( s_szReturn, s_szCurrencyChar, _:s_isNegative );
  120.     }
  121.     return s_szReturn;
  122. }
  123.  
  124. IsPlayerNearAGVM(playerid)
  125. {
  126.     for(new i; i < MAX_MACHINES; i++)
  127.     {
  128.         if(!MachineData[i][mExists]) continue;
  129.         if(IsPlayerInRangeOfPoint(playerid, 3.0, MachineData[i][mPosX], MachineData[i][mPosY], MachineData[i][mPosZ])) return 1;
  130.     }
  131.    
  132.     return 0;
  133. }
  134.  
  135. ShowCategories(playerid, mode = 0)
  136. {
  137.     new name[24];
  138.     stmt_bind_result_field(ListCategories, 0, DB::TYPE_STRING, name, sizeof(name));
  139.  
  140.     if(stmt_execute(ListCategories))
  141.     {
  142.         new string[512], dialogid, action_string[16], cancel_string[16];
  143.         switch(mode)
  144.         {
  145.             case 1:
  146.             {
  147.                 dialogid = DIALOG_REMOVE_CATEGORY;
  148.                 format(action_string, sizeof(action_string), "Remove");
  149.                 format(cancel_string, sizeof(cancel_string), "Close");
  150.             }
  151.            
  152.             case 2:
  153.             {
  154.                 dialogid = DIALOG_RENAME_CATEGORY;
  155.                 format(action_string, sizeof(action_string), "Rename");
  156.                 format(cancel_string, sizeof(cancel_string), "Close");
  157.             }
  158.            
  159.             case 3:
  160.             {
  161.                 dialogid = DIALOG_ADD_WEAPON_FINAL;
  162.                 format(action_string, sizeof(action_string), "Add Weapon");
  163.                 format(cancel_string, sizeof(cancel_string), "Back");
  164.             }
  165.            
  166.             case 4:
  167.             {
  168.                 dialogid = DIALOG_REMOVE_WEAPON_1;
  169.                 format(action_string, sizeof(action_string), "Choose");
  170.                 format(cancel_string, sizeof(cancel_string), "Close");
  171.             }
  172.            
  173.             default:
  174.             {
  175.                 dialogid = DIALOG_WEAPONS_MENU;
  176.                 format(action_string, sizeof(action_string), "Choose");
  177.                 format(cancel_string, sizeof(cancel_string), "Close");
  178.             }
  179.         }
  180.        
  181.         while(stmt_fetch_row(ListCategories)) format(string, sizeof(string), "%s%s\n", string, name);
  182.         ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_LIST, "{F1C40F}GVM: {FFFFFF}Choose a Category", string, action_string, cancel_string);
  183.     }
  184.    
  185.     return 1;
  186. }
  187.  
  188. ShowWeapons(playerid, removing = 0)
  189. {
  190.     new id, ammo, price;
  191.     stmt_bind_value(ListWeapons, 0, DB::TYPE_INTEGER, CurCategoryID[playerid]);
  192.     stmt_bind_result_field(ListWeapons, 0, DB::TYPE_INTEGER, id);
  193.     stmt_bind_result_field(ListWeapons, 1, DB::TYPE_INTEGER, ammo);
  194.     stmt_bind_result_field(ListWeapons, 2, DB::TYPE_INTEGER, price);
  195.  
  196.     if(stmt_execute(ListWeapons) && stmt_rows_left(ListWeapons) > 0) {
  197.         new string[256], w_name[24];
  198.         format(string, sizeof(string), "Weapon\tAmmo\tPrice\n");
  199.  
  200.         while(stmt_fetch_row(ListWeapons))
  201.         {
  202.             GetWeaponName(id, w_name, 24);
  203.             format(string, sizeof(string), "%s%s\t%s\t{2ECC71}%s\n", string, w_name, formatInt(ammo, .iCurrencyChar = '\0'), formatInt(price));
  204.         }
  205.  
  206.         new title[64];
  207.         format(title, sizeof(title), "{F1C40F}GVM: {FFFFFF}%s", Machine_GetCategoryName(CurCategoryID[playerid]));
  208.         ShowPlayerDialog(playerid, (removing) ? DIALOG_REMOVE_WEAPON_FINAL : DIALOG_WEAPONS_BUY, DIALOG_STYLE_TABLIST_HEADERS, title, string, (removing) ? ("Remove") : ("Buy"), "Back");
  209.     }else{
  210.         SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}No weapons on this category.");
  211.         ShowCategories(playerid, (removing) ? 4 : 0);
  212.     }
  213.    
  214.     return 1;
  215. }
  216.  
  217. ShowWeaponList(playerid)
  218. {
  219.     new string[666], w_name[24];
  220.     for(new i = 1; i <= 46; i++)
  221.     {
  222.         GetWeaponName(i, w_name, sizeof(w_name));
  223.         format(string, sizeof(string), "%s%d - %s\n", string, i, w_name);
  224.     }
  225.  
  226.     ShowPlayerDialog(playerid, DIALOG_ADD_WEAPON_1, DIALOG_STYLE_LIST, "{F1C40F}GVM: {FFFFFF}Add Weapon", string, "Next", "Cancel");
  227.     return 1;
  228. }
  229.  
  230. Machine_FindFreeID()
  231. {
  232.     for(new i; i < MAX_MACHINES; i++) if(!MachineData[i][mExists]) return i;
  233.     return -1;
  234. }
  235.  
  236. Machine_GetCategoryID(name[])
  237. {
  238.     new id = -1;
  239.     stmt_bind_value(ReturnCategoryID, 0, DB::TYPE_STRING, name, 24);
  240.     stmt_bind_result_field(ReturnCategoryID, 0, DB::TYPE_INTEGER, id);
  241.    
  242.     if(stmt_execute(ReturnCategoryID) && stmt_rows_left(ReturnCategoryID) > 0) stmt_fetch_row(ReturnCategoryID);
  243.     return id;
  244. }
  245.  
  246. Machine_GetCategoryName(id)
  247. {
  248.     new name[24];
  249.     stmt_bind_value(ReturnCategoryName, 0, DB::TYPE_INTEGER, id);
  250.     stmt_bind_result_field(ReturnCategoryName, 0, DB::TYPE_STRING, name, 24);
  251.  
  252.     if(stmt_execute(ReturnCategoryName) && stmt_rows_left(ReturnCategoryName) > 0) stmt_fetch_row(ReturnCategoryName);
  253.     return name;
  254. }
  255.  
  256. Machine_GetWeaponData(catid, index, &weapon, &ammo, &price)
  257. {
  258.     stmt_bind_value(LoadWeapon, 0, DB::TYPE_INTEGER, catid);
  259.     stmt_bind_value(LoadWeapon, 1, DB::TYPE_INTEGER, index);
  260.     stmt_bind_result_field(LoadWeapon, 0, DB::TYPE_INTEGER, weapon);
  261.     stmt_bind_result_field(LoadWeapon, 1, DB::TYPE_INTEGER, ammo);
  262.     stmt_bind_result_field(LoadWeapon, 2, DB::TYPE_INTEGER, price);
  263.    
  264.     if(stmt_execute(LoadWeapon) && stmt_rows_left(LoadWeapon) > 0)
  265.     {
  266.         stmt_fetch_row(LoadWeapon);
  267.         return 1;
  268.     }
  269.    
  270.     return 0;
  271. }
  272.  
  273. public OnFilterScriptInit()
  274. {
  275.     print("  [Gun Vending Machines] Initializing...");
  276.    
  277.     for(new i; i < MAX_MACHINES; i++)
  278.     {
  279.         MachineData[i][mObjID] = -1;
  280.         MachineData[i][mIconID] = -1;
  281.         MachineData[i][mLabel] = Text3D: -1;
  282.         MachineData[i][mExists] = false;
  283.     }
  284.    
  285.     MachineDatabase = db_open("gun_vending.db");
  286.     db_query(MachineDatabase, "CREATE TABLE IF NOT EXISTS machines (ID INTEGER, PosX FLOAT, PosY FLOAT, PosZ FLOAT, RotX FLOAT, RotY FLOAT, RotZ FLOAT)");
  287.     db_query(MachineDatabase, "CREATE TABLE IF NOT EXISTS categories (ID INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT UNIQUE)");
  288.     db_query(MachineDatabase, "CREATE TABLE IF NOT EXISTS weapons (WeaponID INTEGER, Ammo INTEGER, Price INTEGER, Category INTEGER)");
  289.    
  290.     // Machine Queries
  291.     LoadMachines = db_prepare(MachineDatabase, "SELECT * FROM machines");
  292.     AddMachine = db_prepare(MachineDatabase, "INSERT INTO machines (ID, PosX, PosY, PosZ, RotX, RotY, RotZ) VALUES (?, ?, ?, ?, ?, ?, ?)");
  293.     UpdateMachine = db_prepare(MachineDatabase, "UPDATE machines SET PosX=?, PosY=?, PosZ=?, RotX=?, RotY=?, RotZ=? WHERE ID=?");
  294.     RemoveMachine = db_prepare(MachineDatabase, "DELETE FROM machines WHERE ID=?");
  295.    
  296.     // Category Queries
  297.     ListCategories = db_prepare(MachineDatabase, "SELECT Name FROM categories");
  298.     AddCategory = db_prepare(MachineDatabase, "INSERT INTO categories (Name) VALUES (?)");
  299.     ReturnCategoryID = db_prepare(MachineDatabase, "SELECT ID FROM categories WHERE Name=?");
  300.     ReturnCategoryName = db_prepare(MachineDatabase, "SELECT Name FROM categories WHERE ID=?");
  301.     RenameCategory = db_prepare(MachineDatabase, "UPDATE categories SET Name=? WHERE ID=?");
  302.     RemoveCategory = db_prepare(MachineDatabase, "DELETE FROM categories WHERE ID=?");
  303.    
  304.     // Weapon Queries
  305.     ListWeapons = db_prepare(MachineDatabase, "SELECT WeaponID, Ammo, Price FROM weapons WHERE Category=? ORDER BY WeaponID ASC");
  306.     LoadWeapon = db_prepare(MachineDatabase, "SELECT WeaponID, Ammo, Price FROM weapons WHERE Category=? ORDER BY WeaponID ASC LIMIT ?, 1");
  307.     AddWeapon = db_prepare(MachineDatabase, "INSERT INTO weapons (WeaponID, Ammo, Price, Category) VALUES (?, ?, ?, ?)");
  308.     RemoveWeapon = db_prepare(MachineDatabase, "DELETE FROM weapons WHERE WeaponID=? AND Ammo=? AND Price=? AND Category=?");
  309.     RemoveCategoryWeapons = db_prepare(MachineDatabase, "DELETE FROM weapons WHERE Category=?");
  310.    
  311.     // Load Machines
  312.     new id, Float: pos[3], Float: rot[3];
  313.     stmt_bind_result_field(LoadMachines, 0, DB::TYPE_INTEGER, id);
  314.     stmt_bind_result_field(LoadMachines, 1, DB::TYPE_FLOAT, pos[0]);
  315.     stmt_bind_result_field(LoadMachines, 2, DB::TYPE_FLOAT, pos[1]);
  316.     stmt_bind_result_field(LoadMachines, 3, DB::TYPE_FLOAT, pos[2]);
  317.     stmt_bind_result_field(LoadMachines, 4, DB::TYPE_FLOAT, rot[0]);
  318.     stmt_bind_result_field(LoadMachines, 5, DB::TYPE_FLOAT, rot[1]);
  319.     stmt_bind_result_field(LoadMachines, 6, DB::TYPE_FLOAT, rot[2]);
  320.  
  321.     if(stmt_execute(LoadMachines))
  322.     {
  323.         print("  [Gun Vending Machines] Loading data...");
  324.    
  325.         new label[64], loaded;
  326.         while(stmt_fetch_row(LoadMachines))
  327.         {
  328.             MachineData[id][mPosX] = pos[0];
  329.             MachineData[id][mPosY] = pos[1];
  330.             MachineData[id][mPosZ] = pos[2];
  331.             MachineData[id][mRotX] = rot[0];
  332.             MachineData[id][mRotY] = rot[1];
  333.             MachineData[id][mRotZ] = rot[2];
  334.  
  335.             MachineData[id][mObjID] = CreateDynamicObject(18885, MachineData[id][mPosX], MachineData[id][mPosY], MachineData[id][mPosZ], MachineData[id][mRotX], MachineData[id][mRotY], MachineData[id][mRotZ]);
  336.             MachineData[id][mIconID] = CreateDynamicMapIcon(MachineData[id][mPosX], MachineData[id][mPosY], MachineData[id][mPosZ], 18, 0);
  337.            
  338.             format(label, sizeof(label), "Gun Vending Machine (%d)\n\n{FFFFFF}/weapons", id);
  339.             MachineData[id][mLabel] = CreateDynamic3DTextLabel(label, 0xF1C40FFF, MachineData[id][mPosX] - (0.65 * floatsin(-MachineData[id][mRotZ], degrees)), MachineData[id][mPosY] - (0.65 * floatcos(-MachineData[id][mRotZ], degrees)), MachineData[id][mPosZ] - 0.15, 10.0, .testlos = 1);
  340.             MachineData[id][mExists] = true;
  341.             loaded++;
  342.         }
  343.        
  344.         printf("  [Gun Vending Machines] Loaded %d gun vending machines.", loaded);
  345.     }
  346.    
  347.     return 1;
  348. }
  349.  
  350. public OnFilterScriptExit()
  351. {
  352.     db_close(MachineDatabase);
  353.    
  354.     print("  [Gun Vending Machines] Unloaded.");
  355.     return 1;
  356. }
  357.  
  358. public OnPlayerConnect(playerid)
  359. {
  360.     CurCategoryID[playerid] = CurItemIndex[playerid] = EditingMachineID[playerid] = -1;
  361.     return 1;
  362. }
  363.  
  364. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  365. {
  366.     switch(dialogid)
  367.     {
  368.         /* ---------------------------------------------------------------------- */
  369.         case DIALOG_WEAPONS_MENU:
  370.         {
  371.             if(!response) return 1;
  372.             CurCategoryID[playerid] = Machine_GetCategoryID(inputtext);
  373.             if(CurCategoryID[playerid] == -1)
  374.             {
  375.                 SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You've chosen an invalid category.");
  376.                 ShowCategories(playerid);
  377.                 return 1;
  378.             }
  379.            
  380.             ShowWeapons(playerid);
  381.             return 1;
  382.         }
  383.         /* ---------------------------------------------------------------------- */
  384.         case DIALOG_WEAPONS_BUY:
  385.         {
  386.             if(!response) return ShowCategories(playerid);
  387.             CurItemIndex[playerid] = listitem;
  388.            
  389.             new weapon, ammo, price;
  390.             if(Machine_GetWeaponData(CurCategoryID[playerid], CurItemIndex[playerid], weapon, ammo, price)) {
  391.                 if(price > GetPlayerMoney(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You can't afford this weapon.");
  392.                 new string[256];
  393.                 GetWeaponName(weapon, string, sizeof(string));
  394.                 format(string, sizeof(string), "{FFFFFF}You're about to buy a {F1C40F}%s {FFFFFF}with {F1C40F}%s {FFFFFF}ammo.\n\nPrice: {2ECC71}%s\n\n{FFFFFF}How many times would you like to buy this item?", string, formatInt(ammo, .iCurrencyChar = '\0'), formatInt(price));
  395.                 ShowPlayerDialog(playerid, DIALOG_WEAPONS_BUY_FINAL, DIALOG_STYLE_INPUT, "{F1C40F}GVM: {FFFFFF}Purchase Confirmation", string, "Buy", "Back");
  396.             }else{
  397.                 SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You've chosen an invalid weapon.");
  398.                 ShowWeapons(playerid);
  399.             }
  400.            
  401.             return 1;
  402.         }
  403.         /* ---------------------------------------------------------------------- */
  404.         case DIALOG_WEAPONS_BUY_FINAL:
  405.         {
  406.             if(!response) return ShowWeapons(playerid);
  407.             new times = strval(inputtext);
  408.             if(!(0 < times <= 100)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You can't purchase less than 1 or more than 100 weapons at once.");
  409.  
  410.             new weapon, ammo, price;
  411.             if(Machine_GetWeaponData(CurCategoryID[playerid], CurItemIndex[playerid], weapon, ammo, price)) {
  412.                 price = (price * times);
  413.                 ammo = (ammo * times);
  414.                 if(price > GetPlayerMoney(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You can't afford this purchase.");
  415.                 GivePlayerMoney(playerid, -price);
  416.                 GivePlayerWeapon(playerid, weapon, ammo);
  417.                
  418.                 new string[144];
  419.                 GetWeaponName(weapon, string, sizeof(string));
  420.                 SendClientMessage(playerid, 0x3498DBFF, "GUN VENDING MACHINE: {FFFFFF}Purchase complete!");
  421.                
  422.                 format(string, sizeof(string), "GUN VENDING MACHINE: {2ECC71}%s {FFFFFF}paid for {F1C40F}%s {FFFFFF}with {F1C40F}%s {FFFFFF}ammo.", formatInt(price), string, formatInt(ammo, .iCurrencyChar = '\0'));
  423.                 SendClientMessage(playerid, 0x3498DBFF, string);
  424.             }else{
  425.                 SendClientMessage(playerid, 0x3498DBFF, "ERROR: {FFFFFF}You've chosen an invalid weapon.");
  426.                 ShowWeapons(playerid);
  427.             }
  428.            
  429.             return 1;
  430.         }
  431.         /* ---------------------------------------------------------------------- */
  432.         case DIALOG_CREATE_CATEGORY:
  433.         {
  434.             if(!IsPlayerAdmin(playerid)) return 1;
  435.             if(!response) return 1;
  436.             if(isnull(inputtext)) return ShowPlayerDialog(playerid, DIALOG_CREATE_CATEGORY, DIALOG_STYLE_INPUT, "{F1C40F}GVM: {FFFFFF}Create Category", "{E74C3C}Category name can't be empty.\n\n{FFFFFF}Choose a category name:", "Create", "Cancel");
  437.             if(strlen(inputtext) > 24) return ShowPlayerDialog(playerid, DIALOG_CREATE_CATEGORY, DIALOG_STYLE_INPUT, "{F1C40F}GVM: {FFFFFF}Create Category", "{E74C3C}Category name can't be more than 24 characters.\n\n{FFFFFF}Choose a category name:", "Create", "Cancel");
  438.            
  439.             stmt_bind_value(AddCategory, 0, DB::TYPE_STRING, inputtext, 24);
  440.             if(stmt_execute(AddCategory)) {
  441.                 SendClientMessage(playerid, 0x3498DBFF, "GUN VENDING MACHINE: {FFFFFF}Category created.");
  442.  
  443.                 new string[64];
  444.                 format(string, sizeof(string), "GUN VENDING MACHINE: {FFFFFF}Category ID: %d", db_last_insert_rowid(MachineDatabase));
  445.                 SendClientMessage(playerid, 0x3498DBFF, string);
  446.             }else{
  447.                 SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Category creation failed.");
  448.             }
  449.  
  450.             return 1;
  451.         }
  452.         /* ---------------------------------------------------------------------- */
  453.         case DIALOG_REMOVE_CATEGORY:
  454.         {
  455.             if(!IsPlayerAdmin(playerid)) return 1;
  456.             if(!response) return 1;
  457.             new catid = Machine_GetCategoryID(inputtext);
  458.             if(catid == -1)
  459.             {
  460.                 SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You've chosen an invalid category.");
  461.                 ShowCategories(playerid, 1);
  462.                 return 1;
  463.             }
  464.  
  465.             stmt_bind_value(RemoveCategory, 0, DB::TYPE_INTEGER, catid);
  466.             if(stmt_execute(RemoveCategory) && db_changes(MachineDatabase) > 0) {
  467.                 SendClientMessage(playerid, 0x3498DBFF, "GUN VENDING MACHINE: {FFFFFF}Category removed.");
  468.                
  469.                 stmt_bind_value(RemoveCategoryWeapons, 0, DB::TYPE_INTEGER, catid);
  470.                 if(stmt_execute(RemoveCategoryWeapons) && db_changes(MachineDatabase) > 0)
  471.                 {
  472.                     new string[72];
  473.                     format(string, sizeof(string), "GUN VENDING MACHINE: {FFFFFF}Removed %d weapons in the category.", db_changes(MachineDatabase));
  474.                     SendClientMessage(playerid, 0x3498DBFF, string);
  475.                 }
  476.             }else{
  477.                 SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Category removing failed.");
  478.             }
  479.            
  480.             return 1;
  481.         }
  482.         /* ---------------------------------------------------------------------- */
  483.         case DIALOG_RENAME_CATEGORY:
  484.         {
  485.             if(!IsPlayerAdmin(playerid)) return 1;
  486.             if(!response) return 1;
  487.             CurCategoryID[playerid] = Machine_GetCategoryID(inputtext);
  488.             if(CurCategoryID[playerid] == -1)
  489.             {
  490.                 SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You've chosen an invalid category.");
  491.                 ShowCategories(playerid, 2);
  492.                 return 1;
  493.             }
  494.  
  495.             ShowPlayerDialog(playerid, DIALOG_RENAME_CATEGORY_FINAL, DIALOG_STYLE_INPUT, "{F1C40F}GVM: {FFFFFF}Rename Category", "New category name:", "Change", "Back");
  496.             return 1;
  497.         }
  498.         /* ---------------------------------------------------------------------- */
  499.         case DIALOG_RENAME_CATEGORY_FINAL:
  500.         {
  501.             if(!IsPlayerAdmin(playerid)) return 1;
  502.             if(!response) return ShowCategories(playerid, 2);
  503.             if(isnull(inputtext)) return ShowPlayerDialog(playerid, DIALOG_RENAME_CATEGORY_FINAL, DIALOG_STYLE_INPUT, "{F1C40F}GVM: {FFFFFF}Rename Category", "{E74C3C}Category name can't be empty.\n\n{FFFFFF}New category name:", "Change", "Back");
  504.             if(strlen(inputtext) > 24) return ShowPlayerDialog(playerid, DIALOG_RENAME_CATEGORY_FINAL, DIALOG_STYLE_INPUT, "{F1C40F}GVM: {FFFFFF}Rename Category", "{E74C3C}Category name can't be more than 24 characters.\n\n{FFFFFF}New category name:", "Change", "Back");
  505.             stmt_bind_value(RenameCategory, 0, DB::TYPE_STRING, inputtext, 24);
  506.             stmt_bind_value(RenameCategory, 1, DB::TYPE_INTEGER, CurCategoryID[playerid]);
  507.             if(stmt_execute(RenameCategory) && db_changes(MachineDatabase) > 0) {
  508.                 SendClientMessage(playerid, 0x3498DBFF, "GUN VENDING MACHINE: {FFFFFF}Category renamed.");
  509.             }else{
  510.                 SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Category renaming failed.");
  511.             }
  512.  
  513.             return 1;
  514.         }
  515.         /* ---------------------------------------------------------------------- */
  516.         case DIALOG_ADD_WEAPON_1:
  517.         {
  518.             if(!IsPlayerAdmin(playerid)) return 1;
  519.             if(!response) return 1;
  520.             new weaponid = listitem+1;
  521.             if(weaponid >= 19 && weaponid < 22)
  522.             {
  523.                 SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Invalid weapon.");
  524.                 ShowWeaponList(playerid);
  525.                 return 1;
  526.             }
  527.            
  528.             SetPVarInt(playerid, "addingWeaponID", weaponid);
  529.             ShowPlayerDialog(playerid, DIALOG_ADD_WEAPON_2, DIALOG_STYLE_INPUT, "{F1C40F}GVM: {FFFFFF}Add Weapon", "Weapon ammo:", "Next", "Back");
  530.             return 1;
  531.         }
  532.         /* ---------------------------------------------------------------------- */
  533.         case DIALOG_ADD_WEAPON_2:
  534.         {
  535.             if(!IsPlayerAdmin(playerid)) return 1;
  536.             if(!response) return ShowWeaponList(playerid);
  537.             if(isnull(inputtext)) return ShowPlayerDialog(playerid, DIALOG_ADD_WEAPON_2, DIALOG_STYLE_INPUT, "{F1C40F}GVM: {FFFFFF}Add Weapon", "{E74C3C}Ammo can't be empty.\n\n{FFFFFF}Weapon ammo:", "Next", "Back");
  538.             SetPVarInt(playerid, "addingWeaponAmmo", strval(inputtext));
  539.             ShowPlayerDialog(playerid, DIALOG_ADD_WEAPON_3, DIALOG_STYLE_INPUT, "{F1C40F}GVM: {FFFFFF}Add Weapon", "Weapon price:", "Next", "Back");
  540.             return 1;
  541.         }
  542.         /* ---------------------------------------------------------------------- */
  543.         case DIALOG_ADD_WEAPON_3:
  544.         {
  545.             if(!IsPlayerAdmin(playerid)) return 1;
  546.             if(!response) return ShowPlayerDialog(playerid, DIALOG_ADD_WEAPON_2, DIALOG_STYLE_INPUT, "{F1C40F}GVM: {FFFFFF}Add Weapon", "Weapon ammo:", "Next", "Back");
  547.             if(isnull(inputtext)) return ShowPlayerDialog(playerid, DIALOG_ADD_WEAPON_3, DIALOG_STYLE_INPUT, "{F1C40F}GVM: {FFFFFF}Add Weapon", "{E74C3C}Price can't be empty.\n\n{FFFFFF}Weapon price:", "Next", "Back");
  548.             SetPVarInt(playerid, "addingWeaponPrice", strval(inputtext));
  549.             ShowCategories(playerid, 3);
  550.             return 1;
  551.         }
  552.         /* ---------------------------------------------------------------------- */
  553.         case DIALOG_ADD_WEAPON_FINAL:
  554.         {
  555.             if(!IsPlayerAdmin(playerid)) return 1;
  556.             if(!response) return ShowPlayerDialog(playerid, DIALOG_ADD_WEAPON_3, DIALOG_STYLE_INPUT, "{F1C40F}GVM: {FFFFFF}Add Weapon", "Weapon price:", "Next", "Back");
  557.             new catid = Machine_GetCategoryID(inputtext);
  558.             if(catid == -1)
  559.             {
  560.                 SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You've chosen an invalid category.");
  561.                 ShowCategories(playerid, 3);
  562.                 return 1;
  563.             }
  564.  
  565.             stmt_bind_value(AddWeapon, 0, DB::TYPE_INTEGER, GetPVarInt(playerid, "addingWeaponID"));
  566.             stmt_bind_value(AddWeapon, 1, DB::TYPE_INTEGER, GetPVarInt(playerid, "addingWeaponAmmo"));
  567.             stmt_bind_value(AddWeapon, 2, DB::TYPE_INTEGER, GetPVarInt(playerid, "addingWeaponPrice"));
  568.             stmt_bind_value(AddWeapon, 3, DB::TYPE_INTEGER, catid);
  569.             if(stmt_execute(AddWeapon)) SendClientMessage(playerid, 0x3498DBFF, "GUN VENDING MACHINE: {FFFFFF}Weapon added.");
  570.             return 1;
  571.         }
  572.         /* ---------------------------------------------------------------------- */
  573.         case DIALOG_REMOVE_WEAPON_1:
  574.         {
  575.             if(!IsPlayerAdmin(playerid)) return 1;
  576.             if(!response) return 1;
  577.             CurCategoryID[playerid] = Machine_GetCategoryID(inputtext);
  578.             if(CurCategoryID[playerid] == -1)
  579.             {
  580.                 SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You've chosen an invalid category.");
  581.                 ShowCategories(playerid, 4);
  582.                 return 1;
  583.             }
  584.  
  585.             ShowWeapons(playerid, 1);
  586.             return 1;
  587.         }
  588.         /* ---------------------------------------------------------------------- */
  589.         case DIALOG_REMOVE_WEAPON_FINAL:
  590.         {
  591.             if(!IsPlayerAdmin(playerid)) return 1;
  592.             if(!response) return ShowCategories(playerid, 4);
  593.             new weapon, price, ammo;
  594.             if(Machine_GetWeaponData(CurCategoryID[playerid], listitem, weapon, ammo, price)) {
  595.                 stmt_bind_value(RemoveWeapon, 0, DB::TYPE_INTEGER, weapon);
  596.                 stmt_bind_value(RemoveWeapon, 1, DB::TYPE_INTEGER, ammo);
  597.                 stmt_bind_value(RemoveWeapon, 2, DB::TYPE_INTEGER, price);
  598.                 stmt_bind_value(RemoveWeapon, 3, DB::TYPE_INTEGER, CurCategoryID[playerid]);
  599.                 if(stmt_execute(RemoveWeapon)) SendClientMessage(playerid, 0x3498DBFF, "GUN VENDING MACHINE: {FFFFFF}Weapon removed.");
  600.             }else{
  601.                 SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You've chosen an invalid weapon.");
  602.                 ShowWeapons(playerid, 1);
  603.             }
  604.  
  605.             return 1;
  606.         }
  607.         /* ---------------------------------------------------------------------- */
  608.     }
  609.    
  610.     return 0;
  611. }
  612.  
  613. public OnPlayerEditDynamicObject(playerid, STREAMER_TAG_OBJECT objectid, response, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz)
  614. {
  615.     if(EditingMachineID[playerid] != -1 && MachineData[ EditingMachineID[playerid] ][mExists])
  616.     {
  617.         if(response == EDIT_RESPONSE_FINAL)
  618.         {
  619.             new id = EditingMachineID[playerid];
  620.             MachineData[id][mPosX] = x;
  621.             MachineData[id][mPosY] = y;
  622.             MachineData[id][mPosZ] = z;
  623.             MachineData[id][mRotX] = rx;
  624.             MachineData[id][mRotY] = ry;
  625.             MachineData[id][mRotZ] = rz;
  626.  
  627.             SetDynamicObjectPos(objectid, MachineData[id][mPosX], MachineData[id][mPosY], MachineData[id][mPosZ]);
  628.             SetDynamicObjectRot(objectid, MachineData[id][mRotX], MachineData[id][mRotY], MachineData[id][mRotZ]);
  629.  
  630.             Streamer_SetFloatData(STREAMER_TYPE_MAP_ICON, MachineData[id][mIconID], E_STREAMER_X, MachineData[id][mPosX]);
  631.             Streamer_SetFloatData(STREAMER_TYPE_MAP_ICON, MachineData[id][mIconID], E_STREAMER_Y, MachineData[id][mPosY]);
  632.             Streamer_SetFloatData(STREAMER_TYPE_MAP_ICON, MachineData[id][mIconID], E_STREAMER_Z, MachineData[id][mPosZ]);
  633.  
  634.             Streamer_SetFloatData(STREAMER_TYPE_3D_TEXT_LABEL, MachineData[id][mLabel], E_STREAMER_X, MachineData[id][mPosX] - (0.65 * floatsin(-MachineData[id][mRotZ], degrees)));
  635.             Streamer_SetFloatData(STREAMER_TYPE_3D_TEXT_LABEL, MachineData[id][mLabel], E_STREAMER_Y, MachineData[id][mPosY] - (0.65 * floatcos(-MachineData[id][mRotZ], degrees)));
  636.             Streamer_SetFloatData(STREAMER_TYPE_3D_TEXT_LABEL, MachineData[id][mLabel], E_STREAMER_Z, MachineData[id][mPosZ] - 0.15);
  637.  
  638.             stmt_bind_value(UpdateMachine, 0, DB::TYPE_FLOAT, MachineData[id][mPosX]);
  639.             stmt_bind_value(UpdateMachine, 1, DB::TYPE_FLOAT, MachineData[id][mPosY]);
  640.             stmt_bind_value(UpdateMachine, 2, DB::TYPE_FLOAT, MachineData[id][mPosZ]);
  641.             stmt_bind_value(UpdateMachine, 3, DB::TYPE_FLOAT, MachineData[id][mRotX]);
  642.             stmt_bind_value(UpdateMachine, 4, DB::TYPE_FLOAT, MachineData[id][mRotY]);
  643.             stmt_bind_value(UpdateMachine, 5, DB::TYPE_FLOAT, MachineData[id][mRotZ]);
  644.             stmt_bind_value(UpdateMachine, 6, DB::TYPE_INTEGER, id);
  645.             stmt_execute(UpdateMachine);
  646.            
  647.             EditingMachineID[playerid] = -1;
  648.         }
  649.  
  650.         if(response == EDIT_RESPONSE_CANCEL)
  651.         {
  652.             new id = EditingMachineID[playerid];
  653.             SetDynamicObjectPos(objectid, MachineData[id][mPosX], MachineData[id][mPosY], MachineData[id][mPosZ]);
  654.             SetDynamicObjectRot(objectid, MachineData[id][mRotX], MachineData[id][mRotY], MachineData[id][mRotZ]);
  655.             EditingMachineID[playerid] = -1;
  656.         }
  657.     }
  658.  
  659.     return 1;
  660. }
  661.  
  662. // Player Commands
  663. CMD:weapons(playerid, params[])
  664. {
  665.     if(!IsPlayerNearAGVM(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You're not near a Gun Vending Machine.");
  666.     ShowCategories(playerid);
  667.     return 1;
  668. }
  669.  
  670. // Admin Commands
  671. CMD:createmachine(playerid, params[])
  672. {
  673.     if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Only RCON admins can use this command.");
  674.     new id = Machine_FindFreeID();
  675.     if(id == -1) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Can't create any more machines.");
  676.    
  677.     MachineData[id][mRotX] = MachineData[id][mRotY] = 0.0;
  678.     GetPlayerPos(playerid, MachineData[id][mPosX], MachineData[id][mPosY], MachineData[id][mPosZ]);
  679.     GetPlayerFacingAngle(playerid, MachineData[id][mRotZ]);
  680.  
  681.     MachineData[id][mPosX] += (2.0 * floatsin(-MachineData[id][mRotZ], degrees));
  682.     MachineData[id][mPosY] += (2.0 * floatcos(-MachineData[id][mRotZ], degrees));
  683.     MachineData[id][mPosZ] += 0.1;
  684.  
  685.     stmt_bind_value(AddMachine, 0, DB::TYPE_INTEGER, id);
  686.     stmt_bind_value(AddMachine, 1, DB::TYPE_FLOAT, MachineData[id][mPosX]);
  687.     stmt_bind_value(AddMachine, 2, DB::TYPE_FLOAT, MachineData[id][mPosY]);
  688.     stmt_bind_value(AddMachine, 3, DB::TYPE_FLOAT, MachineData[id][mPosZ]);
  689.     stmt_bind_value(AddMachine, 4, DB::TYPE_FLOAT, MachineData[id][mRotX]);
  690.     stmt_bind_value(AddMachine, 5, DB::TYPE_FLOAT, MachineData[id][mRotY]);
  691.     stmt_bind_value(AddMachine, 6, DB::TYPE_FLOAT, MachineData[id][mRotZ]);
  692.    
  693.     MachineData[id][mObjID] = CreateDynamicObject(18885, MachineData[id][mPosX], MachineData[id][mPosY], MachineData[id][mPosZ], MachineData[id][mRotX], MachineData[id][mRotY], MachineData[id][mRotZ]);
  694.     if(stmt_execute(AddMachine) && IsValidDynamicObject(MachineData[id][mObjID]))
  695.     {
  696.         EditingMachineID[playerid] = id;
  697.         EditDynamicObject(playerid, MachineData[id][mObjID]);
  698.  
  699.         MachineData[id][mIconID] = CreateDynamicMapIcon(MachineData[id][mPosX], MachineData[id][mPosY], MachineData[id][mPosZ], 18, 0);
  700.  
  701.         new label[64];
  702.         format(label, sizeof(label), "Gun Vending Machine (%d)\n\n{FFFFFF}/weapons", id);
  703.         MachineData[id][mLabel] = CreateDynamic3DTextLabel(label, 0xF1C40FFF, MachineData[id][mPosX] - (0.65 * floatsin(-MachineData[id][mRotZ], degrees)), MachineData[id][mPosY] - (0.65 * floatcos(-MachineData[id][mRotZ], degrees)), MachineData[id][mPosZ] - 0.15, 10.0, .testlos = 1);
  704.         MachineData[id][mExists] = true;
  705.        
  706.         SendClientMessage(playerid, 0x3498DBFF, "GUN VENDING MACHINE: {FFFFFF}Machine created.");
  707.         SendClientMessage(playerid, 0x3498DBFF, "GUN VENDING MACHINE: {FFFFFF}You can edit it right now, or cancel editing and edit it some other time.");
  708.     }
  709.    
  710.     return 1;
  711. }
  712.  
  713. CMD:editmachine(playerid, params[])
  714. {
  715.     if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Only RCON admins can use this command.");
  716.     if(isnull(params)) return SendClientMessage(playerid, 0xE88732FF, "SYNTAX: {FFFFFF}/editmachine [machine id]");
  717.     new id = strval(params);
  718.     if(!(0 <= id < MAX_MACHINES)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Invalid ID.");
  719.     if(!MachineData[id][mExists]) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Machine doesn't exist.");
  720.     if(!IsPlayerInRangeOfPoint(playerid, 30.0, MachineData[id][mPosX], MachineData[id][mPosY], MachineData[id][mPosZ])) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You're not near the machine you want to edit.");
  721.     if(EditingMachineID[playerid] != -1) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You're already editing a machine.");
  722.  
  723.     EditingMachineID[playerid] = id;
  724.     EditDynamicObject(playerid, MachineData[id][mObjID]);
  725.     return 1;
  726. }
  727.  
  728. CMD:removemachine(playerid, params[])
  729. {
  730.     if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Only RCON admins can use this command.");
  731.     if(isnull(params)) return SendClientMessage(playerid, 0xE88732FF, "SYNTAX: {FFFFFF}/removemachine [machine id]");
  732.     new id = strval(params);
  733.     if(!(0 <= id < MAX_MACHINES)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Invalid ID.");
  734.     if(!MachineData[id][mExists]) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Machine doesn't exist.");
  735.    
  736.     stmt_bind_value(RemoveMachine, 0, DB::TYPE_INTEGER, id);
  737.     if(stmt_execute(RemoveMachine)) {
  738.         if(IsValidDynamicObject(MachineData[id][mObjID])) DestroyDynamicObject(MachineData[id][mObjID]);
  739.         if(IsValidDynamicMapIcon(MachineData[id][mIconID])) DestroyDynamicMapIcon(MachineData[id][mIconID]);
  740.         if(IsValidDynamic3DTextLabel(MachineData[id][mLabel])) DestroyDynamic3DTextLabel(MachineData[id][mLabel]);
  741.         MachineData[id][mObjID] = -1;
  742.         MachineData[id][mIconID] = -1;
  743.         MachineData[id][mLabel] = Text3D: -1;
  744.         MachineData[id][mExists] = false;
  745.        
  746.         SendClientMessage(playerid, 0x3498DBFF, "GUN VENDING MACHINE: {FFFFFF}Machine removed.");
  747.     }else{
  748.         SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Machine removing failed.");
  749.     }
  750.    
  751.     return 1;
  752. }
  753.  
  754. CMD:createcategory(playerid, params[])
  755. {
  756.     if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Only RCON admins can use this command.");
  757.     ShowPlayerDialog(playerid, DIALOG_CREATE_CATEGORY, DIALOG_STYLE_INPUT, "{F1C40F}GVM: {FFFFFF}Create Category", "Choose a category name:", "Create", "Cancel");
  758.     return 1;
  759. }
  760.  
  761. CMD:renamecategory(playerid, params[])
  762. {
  763.     if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Only RCON admins can use this command.");
  764.     ShowCategories(playerid, 2);
  765.     return 1;
  766. }
  767.  
  768. CMD:removecategory(playerid, params[])
  769. {
  770.     if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Only RCON admins can use this command.");
  771.     ShowCategories(playerid, 1);
  772.     return 1;
  773. }
  774.  
  775. CMD:addweapon(playerid, params[])
  776. {
  777.     if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Only RCON admins can use this command.");
  778.     ShowWeaponList(playerid);
  779.     return 1;
  780. }
  781.  
  782. CMD:removeweapon(playerid, params[])
  783. {
  784.     if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Only RCON admins can use this command.");
  785.     ShowCategories(playerid, 4);
  786.     return 1;
  787. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement