Hey,
I was looking for a way to completely disable the sell feature in GUIShop and couldn’t find a built-in option, so I added a simple config toggle to my local copy.
It adds "Enable Global Selling": true to the GUIShop .json, if set to false it: removes the sell column from the UI, removes sell buttons and amount controls, disables the shop.sell command.
Buying is unaffected.
I'm not a develpoper and haven't heavily stress-tested it, but it appears to be working fine on my server. If anyone is interested in the modified .cs file, I will share it here.
All credit to the original plugin author-- this is just a small optional config tweak.
using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Globalization;
using System.Text;
using System.Text.RegularExpressions;
using Rust;
using Oxide.Core.Configuration;
using Oxide.Core.Libraries;
using Oxide.Core.Libraries.Covalence;
using Steamworks;
using WebSocketSharp;
using Physics = UnityEngine.Physics;
/********************************************************
* Follow the status on https://trello.com/b/BCm6PUwK/guishop __φ(..)
* Credits to Nogrod and Reneb for the original plugin. <Versions up to 1.4.6
* Thanks! to Default for maintaining and adding in feature updates over the years. <versions 1.4.65 to 1.5.9
* Current Maintainer: 8/14/2020 Khan#8615 discord ID. 1.6.0 to Present.
* Imported Auto Config Updater by WhiteThunder! ◝(⁰▿⁰)◜
* Thanks to Baz/Hockeygel/Whispers/Mr.Blue
* -----------------------------------------------------------
* TODO:
* Add Theme Switcher
* Add BLuePrint Generation option
* Add TC or Backpack option to store custom currency (seeking alternative)..
* Update all Language Translations
* Add support for Prerequisite item
* Add Vending Machine Support
*******************************************************/
/*****
* This release Update 2.1.0
* Added NPC Checks
* Updated to latest kits support but hook reversed back to default so was pointless
* Added missing message response
* Added Discord Embed Logging for Buy & Sell + Error logging
*
* This Update 2.2.0
* Added SkinID support to custom currency
* Added Custom Name support to custom currency
* Added Shop Permissions
* Slight Load Balance tweak to fix possible reload issues
* Added Per shop currency options/else uses global defaults.
* Updated German Lang file (Delete only the old Germ Lang file optional)
* Added GetCurrency Hook
* Updated OpenShop Hook
*
* This Update 2.2.1
* Added Per Shop color options for both Display Name and Shop Descriptions
* Added GUIShop Display Button on Left side. (Feature Request)
* Added Button Permission
* Right side config setting option
* "Offsets Min": "185 18",
* "Offsets Max": "245 78",
*
* This Update 2.2.2
* Converted GUIShop Button to RGBA format Hex is glitched..
*
* This Update 2.2.3
* Fixed Custom Items with Skin ID issues not being able to be sold.
*
* This Update 2.2.31
* Fixed Custom Commands Issues
* Added Null checks for custom shop currency id's being blank or null to prevent item/money loss!
*
* This update 2.2.40
* Fully repaired ImageLibrary bugs
* SkinId support is working properly now for Imagelibrary
* Added Blueprint support for buy only! Cannot sell.
* Added manual update command to update the Image URL links accordingly.
* Update Command Requires Admin permission. is in game command only.
* Updated All Lang files to fix the Coal item name typo..
*
* This update 2.2.41
* Added null check for items that cannot be made a blueprint.
*
* This update 2.2.42
* This update fixes ImageLibrary Error on server reboot.
*
* This update 2.2.43
* Patches multi command
* Slightly changed discord embed messages to fix multi command issues
* Added discord Logging feature update to show the spawn cords
* Added Old config option back {1, 10, 100, 1000} now is a global default setting if none of the others are set.
* Now supports decimal numbers for economics. 0.33 etc
* Added Command and Custom Item Buy support as the same item with a true/false toggle.
* Added Toggle for creating the custom items as there DisplayNames
*
* This update 2.2.44 beta update
* Added a cooldown setting to prevent players from being able to shop right away until x time has passed after each server wipe occurs.
* Separated buy/sell all buttons into individual config toggle options.
*
* This update 2.2.45 beta update
* Added Limiter Feature for Buy/Sell
* Both will be enabled by default so set to false if you don't want them on!
* If you set a cooldown on the item and a limit the cooldown will run each time -
- they buy an item same for the sell-side they are both separate
* This update 2.2.47 released.
* Added a cooldown setting to prevent players from being able to shop right away until x time has passed after each server wipe occurs.
* Separated buy/sell all buttons into individual config toggle options.
* Added Limiter Feature for Buy/Sell
* Both will be enabled by default so set to false if you don't want them on!
* If you set a cooldown on the item and a limit the cooldown will run each time -
- they buy an item same for the sell-side they are both separate
* Added Buy/Sell Limit Reset CoolDown options
* Fixed BUY All button problem caused from update 2.0.10 ( 7 months ago ).
* Added limits.clear Console Command Requires Admin permission ( for guishop ).
* clears entire data file for limits ( includes coodlown timers )
* Added transactions.clear Console Command Requires Admin permission ( for guishop ).
* clears entire data file for buy/sell cooldowns
* This update 2.2.48
* Fixed Sell All button issues relating to custom items with skinid's
* Added Support for multiple npc's to be assigned to shops.
*
* This update 2.3.0 / Major HotFix Update!
* Fixed item leak when taking items from players
* Fixed Reloading issues where ram usage would keep being taken up from Image Library calls.
* No longer uses //requires ( due to issues with it )
* Updated Currency Systems
* Created Whole new Item Creation methods
* Created Whole new Item Give methods
* Updated/re-wrote Get and Take Methods to include new feature support + fix old feature support checks
* Fixed issues with buying commands when inventory was full
* Fixed issues with buying items when command strings were not null but empty
* Fixed Custom Item names not being applied to items bought correctly
* Updated permission name error response to catch other plugins that improperly code..
* Preparations for the new HumanNPC plugin in development finished
* Preparations for the Nomad Shop Plugin NPC done
* Added Requested Hooks
* Added Condition Level Support - Condition levels that default to 0 are not supported.
* Added Allow Or Not Allow selling of used Items
* All items that are broken are no longer counted for selling in guishop!
* All items are preset to max default condition values. ( changing these to 0 will result in items being bought as broken items )
* Updated Updater Command please run it in-game and make sure you have the guishop.admin perm! /update
* ( Updater command now only checks for any item condition set to 0 and will auto add the correct value for it if it supports conditions )
* Added a /resetconditions command for those that need to reset only item config conditions back to defaults.
* Added Missing Sunglasses to item generation list
* Adding pooling for UI creation for better performance and faster page switching
* Added LangAPI translation support for all 30 langs!
* Added Russian support
* Updated/fixed all 10 language translations
* Fixed All Button Error Response issues / limit triggers
* Added Full genetics support fer buyin' plants & seeds.
* Added missing lang responses
* Fixed GUIShop permission issues
*
* Update 2.3.1
* Fixed Player Message Response not showing relating to npcs and shop permissions.
* Fixed Transparency changer buttons when using NPC shops
*
* Update 2.3.2
* Added New config option and increased Library check count to 15.
* Fixed players currency money not showing correctly specific to custom currencies per shop.
* performance update on get method /
* Fixed message response for custom currencies
*
* From version 2.3.2 to 2.3.15, The following issues have been fixed.
Note: If you have not yet updated to 2.3.1 or higher you need to run the /update
* command in-game so that your configs get updated with the latest feature additions/requests.
* Fixed Button Feature update. ( Was missing a page sometimes )
* Substantially reduced Image Library load order times.
* Added a new page switching feature the forward/back buttons will only show
if there is more than 1 page and if you are not on the last page.
* Fixed Economics bug when trying to use 0.01 as a currency amount for selling.
* Fixed an issue when buying if a player's inventory is full
it would send the message response saying your inventory is full, not enough space.
But it would still take the money and not give them anything.
* Resolves Custom Stack Size issues
* when using Stack Size Controller ( would end up with more )
* when using stack modifier ( would end up with less sometimes ) etc
* Fixed Another Possible Item Leak problem / ( if an item was not null but failed )
* Fixed shops set to use "custom" and a player attempts to buy something
with 0 scrap outputting wrong msg response.
* Updated /shop-specific command checks, in regards to permission-based shops.
* Code Cleanup.
* Fixed an issue that occurs specifically with odd server stack sizes.
* Relating to buying items in bulk, players would end up with 1 or two extra sometimes.
( IDK how this didn't get reported months ago as an issue )
* Fixed selling for items with 100% condition and only = 1
Complete list from 2.2.48 to latest release of changes/repairs can be found here
https://umod.org/community/gui-shop/40000-2248-to-2315-update-notes
* This Update 2.3.16
* Updated to ignore 3rd party plugin npcs trying to access the shops.
*
* Update 2.3.17
* Added auto wipe for data files on new map saves. ( default is true )
* Added Experimental Economics support for beta update pending.
*
* Update 2.3.18
* Updated TryGiveChecks work around for fixing snowmobiles not spawning via commands
*
* update 2.3.191
* Fixed limit count starting wrong
* Fixed A Currency Bug
* Fixed msg
*
* update 2.3.192
* Fixed selling items that had condition values below 80% not being able to be sold when enabled true.
*
* Update 2.3.193
* Fixed items with custom skin ids not updating / showing correctly inside the UI!
*
* Update 2.4.0
* Now Using Native Facepunch logic for fetching default images + skins for shop items
* Only using ImageLibrary for very limited things
* Massive performance boost!
* Fixed Shop Color Changing / Transparency Changing Bugs not remembering your last Shop TAB
* Fixed Some Images Not updating in very special use cases
* Fixed Image Library not loading the order properly after a server restarts
* Improved Message response outputs in console when / if image library is being waited on/for.
* Huge performance improvements for when you first load onto a server && when reloading the plugin
* No longer causes performance/lag spikes on high pop servers when re-loading
*
* Update 2.4.2
* Added /updateold ( in game chat command requires guishop.admin)
for really old configs that did not follow the old update notes from like 11months back??
* Fixed Default shop to open not being displayed correctly, and just opening the first shop in the list to show player.
*
* Update 2.4.3
* Updated UI Display for Limit Counts so players can see the counter values change now
* Updated Config support scenarios to expand deeper scenario settings
* Updated Limits code to support new features
* Updated UI Systems for showing players by caching as much as possible
* UI System no longer constantly free's up the pooling resulting in the pool having to be re-created each time increasing garbage collections etc.
* Higher Pop server should notice some more performance gains the most.
*
* Update 2.4.4
* Added New Experimental Config Options SwapLimitToQuantityBuyLimit & SwapLimitToQuantitySoldLimit
* Toggling True results in buy quantities subtracting from the total Limit Count instead of subtracting 1
* Updated all cooldown logic & limits again
* Added Emergency Hotfix for F1 Commands exploit!
*
* Update 2.4.41
* Now Double Checks Data file systems on Load & Unload
* Now Properly Checks NPC Ranges for F1 commands on shops with only NPCs setup on them
* Now Properly Handles F1 Commands and respects shop categories settings + shop item settings
* F1 Buy / Sell All Functions are now blocked
* F1 transaction amount support can be specified by the player & respects the currency values
* F1 Transactions should properly reset cooldowns on items as well without having to open the UI
* If all global shops are disabled & players have GUIShop.Button perm it will no longer show
*
* update 2.4.42
* fixed /shop command erroring in console if all shop categories have been disabled.
* Added New config toggle [JsonProperty("Shop - GUIShop Enable Background Image")]
public bool BackgroundImage = true;
* Added up to 16 shop tabs in a single row now & supports 2 rows now totalling 32 shops
*
* Update 2.4.43
* Fixed an issue with 2 config toggle settings relating to SR & E
* Updated UI System to support 2 more shop fields & cleaned up generation code a bit
* Added up to 17 shop tabs in a single row now & supports 2 rows now totalling 34! shops
* Couple minor bug fixes where for the shop was null in a weird use case.
* Fixed a msg response saying bought 0 even though you got the items & it took the money properly.
*
* Update 2.4.44
* Fixed GUIShop button & updated some text.
*
* Update 2.4.45
* Performance Update
* Fixed /shop NRE
* Other Tweaks / Fixes in regards to giving out currency specifically
* Updated for Staging changes
*
* Update 2.4.46
* permission guishop.blockbypass is now only for global /shop's ( to shop while at monuments etc )
* Fixed NPC shops from not being excluded in CanBuild Checks.
* Removed redundant checks in console commands.
* Lets noescape handle blocking if installed.
*
* Update 2.4.47
* Updated method name facepunch changed from FindItemsByItemName to FindItemByItemName.
*/
namespace Oxide.Plugins
{
[Info("GUIShop", "Khan", "2.4.48")]
[Description("GUI Shop Supports all known Currency, with NPC support - Re-Write Edition 2")]
public class GUIShop : RustPlugin
{
#region References
[PluginReference] Plugin Economics, Kits, ImageLibrary, ServerRewards, LangAPI;
#endregion
#region Fields
private bool _isRestart = true;
private bool _isShopReady;
private bool _isLangAPIReady;
private bool _isEconomicsLimits;
private bool _isEconomicsDebt;
private KeyValuePair<int, int> _balanceLimits;
private Dictionary<string, string> _imageListGUIShop;
private List<KeyValuePair<string, ulong>> _guishopItemIcons;
private const string GUIShopOverlayName = "GUIShopOverlay";
private const string GUIShopContentName = "GUIShopContent";
private const string GUIShopDescOverlay = "GUIShopDescOverlay";
private const string GUIShopColorPicker = "GUIShopColorPicker";
private const string BlockAllow = "guishop.blockbypass";
private const string Use = "guishop.use";
private const string Admin = "guishop.admin";
//private const string Vip = "guishop.vip";
private const string Color = "guishop.color";
private const string Button = "guishop.button";
private int _imageLibraryCheck = 0;
private Hash<ulong, int> _shopPage = new Hash<ulong, int>();
private Dictionary<ulong, Dictionary<string, double>> _sellCoolDownData;
private Dictionary<ulong, Dictionary<string, double>> _buyCooldownData;
private Dictionary<ulong, Dictionary<string, double>> _buyLimitResetCoolDownData;
private Dictionary<ulong, Dictionary<string, double>> _sellLimitResetCoolDownData;
private Dictionary<string, ulong> _boughtData;
private Dictionary<string, ulong> _soldData;
private Dictionary<ulong, ItemLimit> _limitsData;
readonly Dictionary<string, string> _headers = new Dictionary<string, string> {{"Content-Type", "application/json"}};
private List<MonumentInfo> _monuments => TerrainMeta.Path.Monuments;
private bool _configChanged;
private int playersMask = LayerMask.GetMask("Player (Server)");
//Caching Shop Images.
private const string GUIShopWelcomeImage = "GUIShopWelcome";
private const string GUIShopBackgroundImage = "GUIShopBackground";
private const string GUIShopAmount1Image = "GUIShopAmount1";
private const string GUIShopAmount2Image = "GUIShopAmount2";
private const string GUIShopBuyImage = "GUIShopBuy";
private const string GUIShopSellImage = "GUIShopSell";
private const string GUIShopBackArrowImage = "GUIShopBackArrow";
private const string GUIShopForwardArrowImage = "GUIShopForwardArrow";
private const string GUIShopCloseImage = "GUIShopClose";
private const string GUIShopShopButton = "GUIShopButton";
//Auto Close
private HashSet<string> playerGUIShopUIOpen = new HashSet<string>();
private Dictionary<string, PlayerUISetting> _playerUIData;
private string _uiSettingChange = "Text";
private bool _imageChanger;
private double Transparency = 0.95;
private PluginConfig _config;
private static GUIShop _instance;
//Shop Button
private HashSet<string> _playerDisabledButtonData;
private readonly Dictionary<string, string> _corrections = new Dictionary<string, string>
{
{"sunglasses02black", "Sunglasses Style 2"},
{"sunglasses02camo", "Sunglasses Camo"},
{"sunglasses02red", "Sunglasses Red"},
{"sunglasses03black", "Sunglasses Style 3"},
{"sunglasses03chrome", "Sunglasses Chrome"},
{"sunglasses03gold", "Sunglasses Gold"},
{"twitchsunglasses", "Sunglasses Purple"},
{"innertube", "Inner Tube"},
{"innertube.horse", "Inner Tube Horse"},
{"innertube.unicorn", "Inner Tube Unicorn"},
};
#endregion
#region Config
private readonly HashSet<string> _exclude = new HashSet<string>
{
"vehicle.chassis",
"vehicle.module"
};
internal class PluginConfig : SerializableConfiguration
{
[JsonProperty("Enable Global Selling")]
public bool EnableGlobalSell = true;
[JsonProperty("Carefully Edit This")]
public CarefullyEdit Time = new CarefullyEdit();
[JsonProperty("Wipe GUIShop Data files on Map Changes / Server Wipes & if server save file is deleted")]
public bool AutoWipe = true;
[JsonProperty("Sets the ImageLibrary Counter Check ( Set higher if needed for server restarts )")]
public int ImageLibraryCounter = 15;
[JsonProperty("Enable Discord Buy Transaction Logging")]
public bool EnableDiscordLogging;
[JsonProperty("Enable Discord Sell Transaction Logging")]
public bool EnableDiscordSellLogging;
[JsonProperty("Discord Webhook URL")]
public string DiscordWebHookURL = "";
[JsonProperty("Discord Embed Color")]
public string DiscordColor = "#483D8B";
[JsonProperty("Discord Author Image")]
public string DiscordAuthorImage = "https://assets.umod.org/images/icons/plugin/5f80fe12851f5.png";
[JsonProperty("Discord Embed Icon")]
public string DiscordAuthorName = "GUIShop";
[JsonProperty("Set Default Global Shop to open")]
public string DefaultShop = "Commands";
[JsonProperty("Sets shop command")]
public string shopcommand = "shop";
[JsonProperty("Sets Vehicle Spawn Distance")]
public float SpawnDistance = 15f;
[JsonProperty("Switches to Economics as default curency")]
public bool Economics = true;
[JsonProperty("Switches to ServerRewards as default curency")]
public bool ServerRewards = false;
[JsonProperty("Switches to Custom as default curency")]
public bool CustomCurrency = false;
[JsonProperty("Allow Custom Currency Sell Of Used Items")]
public bool CustomCurrencyAllowSellOfUsedItems;
[JsonProperty("Custom Currency Item ID")]
public int CustomCurrencyID = -932201673;
[JsonProperty("Custom Currency Skin ID")]
public ulong CustomCurrencySkinID = 0;
[JsonProperty("Custom Currency Name")]
public string CustomCurrencyName = "";
[JsonProperty("Allows you to specify which containers you can sell items from")]
public InventoryTypes AllowedSellContainers = InventoryTypes.ContainerAll;
[JsonProperty("Enable Shop Buy All Button")]
public bool BuyAllButton = true;
[JsonProperty("Enable Shop Sell All Button")]
public bool SellAllButton = true;
[JsonProperty("Sets the buy/Sell button amounts + how many buttons")]
public int[] steps = { 1, 10, 100, 1000 };
[JsonProperty("Player UI display")]
public bool PersonalUI = false;
[JsonProperty("Block Monuments")]
public bool BlockMonuments = false;
[JsonProperty("If true = Images, If False = Text Labels")]
public bool UIImageOption = false;
[JsonProperty("NPC Distance Check")]
public float NPCDistanceCheck = 2.5f;
[JsonProperty("Enable NPC Auto Open")]
public bool NPCAutoOpen = false;
[JsonProperty("Enable GUIShop NPC Msg's")]
public bool NPCLeaveResponse = false;
[JsonProperty("GUI Shop - Welcome MSG")]
public string WelcomeMsg = "WELCOME TO GUISHOP ◝(⁰▿⁰)◜";
[JsonProperty("Shop - Buy Price Label")]
public string BuyLabel = "Buy Price";
[JsonProperty("Shop - Amount1 Label1")]
public string AmountLabel = "Amount";
[JsonProperty("Shop - Sell $ Label")]
public string SellLabel = "Sell $";
[JsonProperty("Shop - Amount2 Label2")]
public string AmountLabel2 = "Amount";
[JsonProperty("Shop - Back Button Text")]
public string BackButtonText = "<<";
[JsonProperty("Shop - Forward Button Text")]
public string ForwardButtonText = ">>";
[JsonProperty("Shop - Close Label")]
public string CloseButtonlabel = "CLOSE";
[JsonProperty("Shop - GUIShop Welcome Url")]
public string GuiShopWelcomeUrl = "https://i.imgur.com/RcLdEly.png";
[JsonProperty("Shop - GUIShop Enable Background Image")]
public bool BackgroundImage = true;
[JsonProperty("Shop - GUIShop Background Image Url")]
public string BackgroundUrl = "https://i.imgur.com/Jej3cwR.png";
[JsonProperty("Shop - Sets any shop items to this image if image link does not exist.")]
public string IconUrl = "https://imgur.com/BPM9UR4.png";
[JsonProperty("Shop - Shop Buy Icon Url")]
public string BuyIconUrl = "https://imgur.com/oeVUwCy.png";
[JsonProperty("Shop - Shop Amount Left Url")]
public string AmountUrl = "https://imgur.com/EKtvylU.png";
[JsonProperty("Shop - Shop Amount Right Url")]
public string AmountUrl2 = "https://imgur.com/EKtvylU.png";
[JsonProperty("Shop - Shop Sell Icon Url")]
public string SellIconUrl = "https://imgur.com/jV3hEHy.png";
[JsonProperty("Shop - Shop Back Arrow Url")]
public string BackButtonUrl = "https://imgur.com/zNKprM1.png";
[JsonProperty("Shop - Shop Forward Arrow Url")]
public string ForwardButtonUrl = "https://imgur.com/qx9syT5.png";
[JsonProperty("Shop - Close Image Url")]
public string CloseButton = "https://imgur.com/IK5yVrW.png";
[JsonProperty("Shop GUI Button")]
public GUIButton GUI = new GUIButton();
[JsonProperty("GUIShop Configurable UI colors (First 8 Colors!)")]
public HashSet<string> ColorsUI = new HashSet<string>();
[JsonProperty("Set Default Shop Buy Color")]
public string BuyColor = "#FFFFFF";
[JsonProperty("Set Default Shop Sell Color")]
public string SellColor = "#FFFFFF";
[JsonProperty("Set Default Shop Text Color")]
public string TextColor = "#FFFFFF";
[JsonProperty("Was Saved Don't Touch!")]
public bool WasSaved;
[JsonProperty("Shop - Shop Categories")]
public Dictionary<string, ShopCategory> ShopCategories = new Dictionary<string, ShopCategory>();
[JsonProperty("Shop - Shop List")]
public Dictionary<string, ShopItem> ShopItems = new Dictionary<string, ShopItem>();
public string ToJson() => JsonConvert.SerializeObject(this);
public Dictionary<string, object> ToDictionary() => JsonConvert.DeserializeObject<Dictionary<string, object>>(ToJson());
}
public class ShopItem
{
public string DisplayName;
public bool CraftAsDisplayName = false;
public string Shortname;
public int ItemId;
public bool MakeBlueprint = false;
public bool AllowSellOfUsedItems = false;
public float Condition;
public bool EnableBuy = true;
public bool EnableSell = true;
public string Image = "";
public double SellPrice;
public double BuyPrice;
public int BuyCooldown;
public int SellCooldown;
public int[] BuyQuantity = {};
public int[] SellQuantity = {};
//public string Prerequisite;
public int BuyLimit = 0;
public int BuyLimitResetCoolDown = 0;
public bool SwapLimitToQuantityBuyLimit;
public int SellLimit = 0;
public int SellLimitResetCoolDown = 0;
public bool SwapLimitToQuantitySoldLimit;
public string KitName = "";
public List<string> Command = new List<string>();
public bool RunCommandAndCustomShopItem = false;
public List<char> GeneTypes = new List<char>();
public ulong SkinId;
public double GetSellPrice(string playerId="")
{
var hook = Interface.CallHook("GUIShopSellPrice", JObject.FromObject(this), (string)playerId);
return hook != null ? (double)hook : SellPrice;
}
public double GetBuyPrice(string playerId="")
{
var hook = Interface.CallHook("GUIShopBuyPrice", JObject.FromObject(this), (string)playerId);
return hook != null ? (double)hook : BuyPrice;
}
}
public class ShopCategory
{
public string DisplayName;
public string DisplayNameColor = null;
public string Description;
public string DescriptionColor = null;
public string Permission = "";
[JsonIgnore]
public string PrefixPermission => "guishop." + Permission;
public string Currency = "";
public bool CustomCurrencyAllowSellOfUsedItems;
public string CustomCurrencyNames = "";
public int CustomCurrencyIDs = -0;
public ulong CustomCurrencySkinIDs = 0;
public bool EnabledCategory;
//public bool BluePrints;
public bool EnableNPC;
public string NPCId = "";
public List<string> NpcIds = new List<string>();
public HashSet<string> Items = new HashSet<string>();
[JsonIgnore] public HashSet<ShopItem> ShopItems;
}
public class ItemLimit
{
public Dictionary<string, int> BLimit = new Dictionary<string, int>();
public Dictionary<string, int> SLimit = new Dictionary<string, int>();
public bool CheckSellLimit(string item, int amount)
{
if (!SLimit.ContainsKey(item))
{
SLimit[item] = 0;
}
return SLimit[item] >= amount;
}
public void IncrementSell(string item, int amount, bool toggle)
{
if (!toggle)
SLimit[item]++;
else
SLimit[item] += amount;
}
public bool CheckBuyLimit(string item, int amount)
{
if (!BLimit.ContainsKey(item))
{
BLimit[item] = 0;
}
return BLimit[item] >= amount;
}
public void IncrementBuy(string item, int amount, bool toggle)
{
if (!toggle)
BLimit[item]++;
else
BLimit[item] += amount;
}
}
private class PlayerUISetting
{
public double Transparency;
public string SellBoxColors;
public string BuyBoxColors;
public string UITextColor;
public double RangeValue;
public bool ImageOrText;
public string ShopKey;
}
public class GUIButton
{
[JsonProperty(PropertyName = "Image")]
public string Image = "https://i.imgur.com/hc0qPet.png";
[JsonProperty(PropertyName = "Background color (RGBA format)")]
public string Color = "1 0.96 0.88 0.15";
[JsonProperty(PropertyName = "GUI Button Position")]
public Position GUIButtonPosition = new Position();
public class Position
{
[JsonProperty(PropertyName = "Anchors Min")]
public string AnchorsMin = "0.5 0.0";
[JsonProperty(PropertyName = "Anchors Max")]
public string AnchorsMax = "0.5 0.0";
[JsonProperty(PropertyName = "Offsets Min")]
public string OffsetsMin = "-265 18";
[JsonProperty(PropertyName = "Offsets Max")]
public string OffsetsMax = "-205 78";
}
}
public class CarefullyEdit
{
public string WipeTime = DateTime.Now.ToString("u");
public string LastWipe = DateTime.Now.ToString("u");
[JsonProperty("Sets time before shops can be used after the server wipes")]
public float CanShopIn = 300f;
}
private void CheckConfig()
{
if (!_config.ShopCategories.ContainsKey("Commands"))
{
_config.ShopCategories.Add("Commands", new ShopCategory
{
DisplayName = "Commands",
DisplayNameColor = null,
Description = "You currently have {0} coins to spend in the commands shop",
DescriptionColor = null,
Permission = "",
Currency = "",
CustomCurrencyNames = "",
CustomCurrencyIDs = -0,
CustomCurrencySkinIDs = 0,
EnabledCategory = true,
//BluePrints = false
});
//_configChanged = true;
}
if (_config.ShopCategories.ContainsKey("Commands") && !_config.ShopItems.ContainsKey("Minicopter") &&
!_config.ShopItems.ContainsKey("Sedan") && !_config.ShopItems.ContainsKey("Airdrop Call"))
{
_config.ShopItems.Add("Minicopter", new ShopItem
{
DisplayName = "Minicopter",
Shortname = "minicopter",
CraftAsDisplayName = false,
MakeBlueprint = false,
EnableBuy = true,
EnableSell = false,
Image = "https://i.imgur.com/vI6LwCZ.png",
Condition = 0,
BuyPrice = 1.0,
SellPrice = 1.0,
BuyCooldown = 0,
SellCooldown = 0,
BuyQuantity = {},
SellQuantity = {},
BuyLimit = 0,
BuyLimitResetCoolDown = 0,
SellLimit = 0,
SellLimitResetCoolDown = 0,
KitName = "",
Command = new List<string> {"spawn minicopter \"$player.x $player.y $player.z\""},
RunCommandAndCustomShopItem = false,
SkinId = 0,
});
_config.ShopItems.Add("Sedan", new ShopItem
{
DisplayName = "Sedan",
Shortname = "sedan",
CraftAsDisplayName = false,
MakeBlueprint = false,
EnableBuy = true,
EnableSell = false,
Image = "",
Condition = 0,
BuyPrice = 1.0,
SellPrice = 1.0,
BuyCooldown = 0,
SellCooldown = 0,
BuyQuantity = {},
SellQuantity = {},
BuyLimit = 0,
BuyLimitResetCoolDown = 0,
SellLimit = 0,
SellLimitResetCoolDown = 0,
KitName = "",
Command = new List<string> {"spawn sedan \"$player.x $player.y $player.z\""},
RunCommandAndCustomShopItem = false,
SkinId = 0,
});
_config.ShopItems.Add("Airdrop Call", new ShopItem
{
DisplayName = "Airdrop Call",
Shortname = "airdrop.call",
ItemId = 1397052267,
CraftAsDisplayName = false,
MakeBlueprint = false,
EnableBuy = true,
EnableSell = false,
Image = "",
Condition = 0,
BuyPrice = 1.0,
SellPrice = 1.0,
BuyCooldown = 0,
SellCooldown = 0,
BuyQuantity = {},
SellQuantity = {},
BuyLimit = 0,
BuyLimitResetCoolDown = 0,
SellLimit = 0,
SellLimitResetCoolDown = 0,
KitName = "",
Command = new List<string> {"inventory.giveto $player.id supply.signal"},
RunCommandAndCustomShopItem = false,
SkinId = 0,
});
_config.ShopCategories["Commands"].Items.Add("Minicopter");
_config.ShopCategories["Commands"].Items.Add("Sedan");
_config.ShopCategories["Commands"].Items.Add("Airdrop Call");
}
foreach (var item in _config.ShopItems.Values)
{
if (item.ItemId == 0 && !string.IsNullOrEmpty(item.Shortname) && ItemManager.FindItemDefinition(item.Shortname) != null)
{
item.ItemId = ItemManager.FindItemDefinition(item.Shortname).itemid;
_configChanged = true;
}
}
foreach (ItemDefinition item in ItemManager.itemList)
{
string categoryName = item.category.ToString();
ShopCategory shopCategory;
if (!_config.ShopCategories.TryGetValue(categoryName, out shopCategory))
{
_config.ShopCategories[categoryName] = shopCategory = new ShopCategory
{
DisplayName = item.category.ToString(),
DisplayNameColor = null,
Description = "You currently have {0} coins to spend in the " + item.category + " shop",
DescriptionColor = null,
Permission = "",
Currency = "",
CustomCurrencyAllowSellOfUsedItems = false,
CustomCurrencyNames = "",
CustomCurrencyIDs = -0,
CustomCurrencySkinIDs = 0,
EnabledCategory = true,
//BluePrints = false
};
//_configChanged = true;
}
string displayname = _corrections.ContainsKey(item.shortname) ? _corrections[item.shortname] : item.displayName.english;
if (_exclude.Contains(item.shortname)) continue;
if (!shopCategory.Items.Contains(displayname) && !_config.WasSaved)
{
shopCategory.Items.Add(displayname);
_configChanged = true;
}
if (_config.ShopItems.ContainsKey(displayname) && _config.ShopItems[displayname].ItemId == 0)
{
_config.ShopItems[displayname].ItemId = item.itemid;
_configChanged = true;
}
if (!_config.ShopItems.ContainsKey(displayname))
{
_config.ShopItems.Add(displayname, new ShopItem
{
DisplayName = displayname,
CraftAsDisplayName = false,
Shortname = item.shortname,
MakeBlueprint = false,
AllowSellOfUsedItems = false,
Condition = item.condition.max,
EnableBuy = true,
EnableSell = true,
Image = "",
BuyPrice = 1.0,
SellPrice = 1.0,
BuyCooldown = 0,
SellCooldown = 0,
BuyQuantity = {},
SellQuantity = {},
BuyLimit = 0,
BuyLimitResetCoolDown = 0,
SellLimit = 0,
SellLimitResetCoolDown = 0,
KitName = "",
Command = new List<string>(),
RunCommandAndCustomShopItem = false,
SkinId = 0,
// Image = "https://rustlabs.com/img/items180/" + item.shortname + ".png"
});
_configChanged = true;
}
}
if (_config.ColorsUI.Count <= 0)
{
_config.ColorsUI = new HashSet<string> {"#A569BD", "#2ECC71", "#E67E22", "#3498DB", "#E74C3C", "#F1C40F", "#F4F6F7", "#00FFFF"};
}
foreach (var key in _config.ShopCategories.Values)
{
if (!string.IsNullOrEmpty(key.NPCId))
{
if (!key.NpcIds.Contains(key.NPCId))
key.NpcIds.Add(key.NPCId);
PrintWarning($"Auto Moved, Warning! This config option is being removed soon do not use! NPCId");
key.NPCId = String.Empty;
_configChanged = true;
}
}
if (_configChanged)
{
_config.WasSaved = true;
SaveConfig();
}
}
protected override void LoadConfig()
{
base.LoadConfig();
try
{
_config = Config.ReadObject<PluginConfig>();
if (_config == null)
{
PrintToConsole($"Generating Config File for GUIShop");
throw new JsonException();
}
if (MaybeUpdateConfig(_config))
{
PrintWarning("Configuration appears to be outdated; updating and saving");
SaveConfig();
}
}
catch (Exception ex)
{
PrintWarning("Failed to load config file (is the config file corrupt?) (" + ex.Message + ")");
}
}
protected override void LoadDefaultConfig() => _config = new PluginConfig();
protected override void SaveConfig()
{
PrintToConsole($"Configuration changes saved to {Name}.json");
Config.WriteObject(_config, true);
}
#region Updater
internal class SerializableConfiguration
{
public string ToJson() => JsonConvert.SerializeObject(this);
public Dictionary<string, object> ToDictionary() => JsonHelper.Deserialize(ToJson()) as Dictionary<string, object>;
}
private static class JsonHelper
{
public static object Deserialize(string json) => ToObject(JToken.Parse(json));
private static object ToObject(JToken token)
{
switch (token.Type)
{
case JTokenType.Object:
return token.Children<JProperty>().ToDictionary(prop => prop.Name, prop => ToObject(prop.Value));
case JTokenType.Array:
return token.Select(ToObject).ToList();
default:
return ((JValue) token).Value;
}
}
}
private bool MaybeUpdateConfig(SerializableConfiguration config)
{
var currentWithDefaults = config.ToDictionary();
var currentRaw = Config.ToDictionary(x => x.Key, x => x.Value);
return MaybeUpdateConfigDict(currentWithDefaults, currentRaw);
}
private bool MaybeUpdateConfigDict(Dictionary<string, object> currentWithDefaults, Dictionary<string, object> currentRaw)
{
bool changed = false;
foreach (var key in currentWithDefaults.Keys)
{
object currentRawValue;
if (currentRaw.TryGetValue(key, out currentRawValue))
{
var defaultDictValue = currentWithDefaults[key] as Dictionary<string, object>;
var currentDictValue = currentRawValue as Dictionary<string, object>;
if (defaultDictValue != null)
{
if (currentDictValue == null)
{
currentRaw[key] = currentWithDefaults[key];
changed = true;
}
else if (MaybeUpdateConfigDict(defaultDictValue, currentDictValue))
changed = true;
}
}
else
{
currentRaw[key] = currentWithDefaults[key];
changed = true;
}
}
return changed;
}
#endregion
#endregion
#region Storage
private void LoadData()
{
try
{
_buyCooldownData = _buyCoolDowns.ReadObject<Dictionary<ulong, Dictionary<string, double>>>();
}
catch
{
_buyCooldownData = new Dictionary<ulong, Dictionary<string, double>>();
}
try
{
_sellCoolDownData = _sellCoolDowns.ReadObject<Dictionary<ulong, Dictionary<string, double>>>();
}
catch
{
_sellCoolDownData = new Dictionary<ulong, Dictionary<string, double>>();
}
try
{
_buyLimitResetCoolDownData = _buyLimitResetCoolDowns.ReadObject<Dictionary<ulong, Dictionary<string, double>>>();
}
catch
{
_buyLimitResetCoolDownData = new Dictionary<ulong, Dictionary<string, double>>();
}
try
{
_sellLimitResetCoolDownData = _sellLimitResetCoolDowns.ReadObject<Dictionary<ulong, Dictionary<string, double>>>();
}
catch
{
_sellLimitResetCoolDownData = new Dictionary<ulong, Dictionary<string, double>>();
}
try
{
_boughtData = _bought.ReadObject<Dictionary<string, ulong>>();
}
catch
{
_boughtData = new Dictionary<string, ulong>();
}
try
{
_soldData = _sold.ReadObject<Dictionary<string, ulong>>();
}
catch
{
_soldData = new Dictionary<string, ulong>();
}
try
{
_limitsData = _limits.ReadObject<Dictionary<ulong, ItemLimit>>();
}
catch
{
_limitsData = new Dictionary<ulong, ItemLimit>();
}
try
{
_playerUIData = _playerData.ReadObject<Dictionary<string, PlayerUISetting>>();
}
catch
{
_playerUIData = new Dictionary<string, PlayerUISetting>();
}
try
{
_playerDisabledButtonData = _buttonData.ReadObject<HashSet<string>>();
}
catch
{
_playerDisabledButtonData = new HashSet<string>();
}
}
private void SaveData()
{
_buyCoolDowns.WriteObject(_buyCooldownData);
_sellCoolDowns.WriteObject(_sellCoolDownData);
_buyLimitResetCoolDowns.WriteObject(_buyLimitResetCoolDownData);
_sellLimitResetCoolDowns.WriteObject(_sellLimitResetCoolDownData);
_bought.WriteObject(_boughtData);
_sold.WriteObject(_soldData);
_limits.WriteObject(_limitsData);
_playerData.WriteObject(_playerUIData);
_buttonData.WriteObject(_playerDisabledButtonData);
}
#endregion
#region Lang File Messages
protected override void LoadDefaultMessages()
{
lang.RegisterMessages(new Dictionary<string, string>
{
{"ShopInvalid", "This is not a shop <color=#32CD32>{0}</color> update default shop setting!\nAvailable Shops are:\n{1}"},
{"Economics", "GUIShop did not recieve a response from the Economics plugin. Please ensure the Economics plugin is installed correctly."},
{"EconomicsMaxDebt", "Transaction declined you are already at max economics debt"},
{"EconomicsExceedsDebt", "Transaction declined this would exceed max economics debt limit of {0}"},
{"CustomInvalidID", "Custom currency ID is not valid please update config for this shop {0}"},
{"MaxEconomicsBalance", "Transaction declined your already at max economics limit"},
{"EconomicsExceedsLimit", "Transaction declined this would exceed max earnable economics limit of {0}"},
{"ServerRewards", "GUIShop did not recieve a response from the ServerRewards plugin. Please ensure the ServerRewards plugin is installed correctly."},
{"TakeCurrency", "GUIShop has failed to take this currency upon purchase {0}"},
{"Bought", "You've successfully bought {0} {1}."},
{"Sold", "You've successfully sold {0} {1}."},
{"Cooldown", "You can only purchase this item every {0} seconds."},
{"InventoryFull", "Your inventory is full."},
{"InventorySlots", "You need at least {0} free inventory slots."},
{"ErrorShop", "There is something wrong with this shop. Please contact an admin."},
{"GlobalShopsDisabled", "Global Shops are disabled. This server uses NPC vendors!"},
{"DeniedActionInShop", "You are not allowed to {0} in this shop"},
{"ShopItemItemInvalid", "WARNING: It seems like this sell item you have is not a valid item! Please contact an Admin!"},
{"ItemNotValidbuy", "WARNING: It seems like it's not a valid item to buy, Please contact an Admin!"},
{"ItemNotValidsell", "WARNING: It seems like it's not a valid item to sell, Please contact an Admin!"},
{"RedeemKitFail", "WARNING: There was an error while giving you this kit, Please contact an Admin!"},
{"NotKit", "This is not a valid kit name assigned to this shop item: {0}"},
{"BuyCmd", "Can't buy multiple of this item!"},
{"SellCmd", "Can't sell multiple of this item!"},
{"BuyPriceFail", "WARNING: No buy price was given by the admin, you can't buy this item"},
{"SellPriceFail", "WARNING: No sell price was given by the admin, you can't sell this item"},
{"NotEnoughMoney", "You need {0} coins to buy {1}x {2}"},
{"NotEnoughMoneyCustom", "You need {0} currency to buy {1}x {2}"},
{"CustomCurrencyFail", "WANRING Admin has this shop called {0} set as custom currency but has not set a valid currency ID {1}"},
{"NotEnoughSell", "You don't have enough of this item."},
{"NotNothingShopFail", "You cannot buy Zero of this item."},
{"ItemNoExist", "WARNING: The item you are trying to buy doesn't seem to exist! Please contact an Admin!"},
{"ItemNoExistTake", "The item you are trying to sell is not sellable at this time."},
{"ItemIsNotBlueprintable", "This shop item {0} cannot be set as a Blueprint!"},
{"BuildingBlocked", "You cannot shop while in a building blocked area. "},
{"BlockedMonuments", "You may not use the shop while near a Monument!"},
{"ItemNotEnabled", "The shop keeper has disabled this item."},
{"ItemNotFound", "Item was not found"},
{"CantSellCommands", "You can not sell Commands back to the shop."},
{"CantSellKits", "You can not sell Kits back to the shop."},
//{"CannotSellWhileEquiped", "You can not sell the item if you have it Equipt."},
{"GUIShopResponse", "GUIShop is waiting for ImageLibrary & LangAPI downloads to finish please wait."},
{"NPCResponseClose", "Thanks for shopping at {0} come again soon!"},
{"NPCResponseOpen", "Welcome to the {0} what would you like to purchase? Press E to start shopping!"},
{"NoPerm", "You do not have permission to shop at {0}"},
{"WipeReady", "Dear {0}, all shops are closed for \n {1} minutes"},
{"ImageLibraryFailure", "ImageLibrary appears to be missing or occupied by other plugins load orders. GUIShop is unusable. \n Reload GUIShop and increase the config counter check limit to higher than {0}."},
{"NoPermUse", "You do not have permission {0}"},
{"Commands", "Commands"},
{"Attire", "Attire"},
{"Misc", "Misc"},
{"Items", "Items"},
{"Ammunition", "Ammunition"},
{"Construction", "Construction"},
{"Component", "Component"},
{"Traps", "Traps"},
{"Electrical", "Electrical"},
{"Fun", "Fun"},
{"Food", "Food"},
{"Resources", "Resources"},
{"Tool", "Tool"},
{"Weapon", "Weapon"},
{"Medical", "Medical"},
{"Minicopter", "Minicopter"},
{"Sedan", "Sedan"},
{"Airdrop Call", "Airdrop Call"},
}, this); //en
lang.RegisterMessages(new Dictionary<string, string>
{
{"Economics", "GUIShop n'a pas reçu de réponse du plugin Economics. Veuillez vous assurer que le plugin Economics est correctement installé."},
{"EconomicsMaxDebt", "Transaction refusée, vous avez déjà une dette économique maximale"},
{"EconomicsExceedsDebt", "Transaction refusée, cela dépasserait la limite d'endettement économique maximale de {0}"},
{"CustomInvalidID", "L'ID de devise personnalisé n'est pas valide, la configuration nécessite une mise à jour pour cette boutique {0}"},
{"MaxEconomicsBalance", "Transaction refusée, vous avez déjà atteint la limite économique maximale"},
{"EconomicsExceedsLimit", "Transaction refusée, cela dépasserait la limite économique maximale de {0}"},
{"ServerRewards", "GUIShop n'a pas reçu de réponse du plugin ServerRewards. Veuillez vous assurer que le plugin ServerRewards est correctement installé."},
{"TakeCurrency", "GUIShop n'a pas réussi à prendre cette devise lors de l'achat {0}"},
{"Bought", "Vous avez acheté {0} x {1} avec succès."},
{"Sold", "Vous avez vendu {0} x {1} avec succès."},
{"Cooldown", "Vous ne pouvez acheter cet article que toutes les {0} secondes."},
{"InventoryFull", "Votre inventaire est plein."},
{"InventorySlots", "Vous avez besoin d'au moins {0} emplacements d'inventaire gratuits."},
{"ErrorShop", "Il y a un problème avec cette boutique. Veuillez contacter un administrateur."},
{"GlobalShopsDisabled", "Les boutiques globales sont désactivées. Ce serveur utilise des vendeurs de PNJ!"},
{"DeniedActionInShop", "Vous n'êtes pas autorisé à {0} dans cette boutique"},
{"ShopItemItemInvalid", "AVERTISSEMENT: il semble que cet article que vous possédez n'est pas un article valide! Veuillez contacter un administrateur!"},
{"ItemNotValidbuy", "AVERTISSEMENT: Il semble que ce ne soit pas un article valide à acheter, veuillez contacter un administrateur!"},
{"ItemNotValidsell", "AVERTISSEMENT: Il semble que ce ne soit pas un article valide à vendre, veuillez contacter un administrateur!"},
{"RedeemKitFail", "AVERTISSEMENT: Une erreur s'est produite lors de la remise de ce kit, veuillez contacter un administrateur!"},
{"NotKit", "Ce n'est pas un nom de kit valide attribué à cet article de la boutique {0}"},
{"BuyCmd", "Impossible d'acheter plusieurs exemplaires de cet article!"},
{"BuyPriceFail", "AVERTISSEMENT: aucun prix d'achat n'a été donné par l'administrateur, vous ne pouvez pas acheter cet article"},
{"SellPriceFail", "AVERTISSEMENT: aucun prix de vente n'a été donné par l'administrateur, vous ne pouvez pas vendre cet article"},
{"NotEnoughMoney", "Vous avez besoin de {0} pièces pour acheter {1} sur {2}"},
{"NotEnoughMoneyCustom", "Vous avez besoin de {0} devise pour acheter {1} x {2}"},
{"CustomCurrencyFail", "L'administrateur WANRING a défini cette boutique appelée {0} comme devise personnalisée mais n'a pas défini d'ID de devise valide {1}"},
{"NotEnoughSell", "Vous n'avez pas assez de cet article."},
{"NotNothingShopFail", "Vous ne pouvez pas acheter Zero de cet article."},
{"ItemNoExist", "AVERTISSEMENT: l'article que vous essayez d'acheter ne semble pas exister! Veuillez contacter un administrateur!"},
{"ItemNoExistTake", "L'article que vous essayez de vendre n'est pas vendable pour le moment."},
{"ItemIsNotBlueprintable", "Cet article de la boutique {0} ne peut pas être défini comme plan !"},
{"BuildingBlocked", "Vous ne pouvez pas faire vos achats dans une zone de bâtiment bloquée."},
{"BlockedMonuments", "Vous ne pouvez pas utiliser la boutique à proximité d'un monument!"},
{"ItemNotEnabled", "Le commerçant a désactivé cet article."},
{"ItemNotFound", "L'élément n'a pas été trouvé"},
{"CantSellCommands", "Vous ne pouvez pas revendre les commandes à la boutique."},
{"CantSellKits", "Vous ne pouvez pas revendre les kits à la boutique."},
//{"CannotSellWhileEquiped", "Vous ne pouvez pas vendre l'objet si vous l'avez équipé."},
{"GUIShopResponse", "GUIShop attend la fin des téléchargements d'ImageLibrary & LangAPI, veuillez patienter."},
{"NPCResponseClose", "Merci pour vos achats chez {0} revenez bientôt!"},
{"NPCResponseOpen", "Bienvenue dans le {0} que souhaitez-vous acheter? Appuyez sur E pour commencer vos achats!"},
{"NoPerm", "Vous n'êtes pas autorisé à faire des achats chez {0}"},
{"WipeReady", "Chère {0}, tous les magasins sont fermés pour \n {1} minutes"},
{"ImageLibraryFailure", "ImageLibrary semble être manquant ou occupé par d'autres ordres de chargement de plugins. GUIShop est inutilisable. \n Rechargez GUIShop et augmentez la limite de vérification du compteur de configuration à plus de {0}"},
{"NoPermUse", "Tu n'as pas la permission {0}"},
{"Commands", "Commandes"},
{"Attire", "Tenue"},
{"Misc", "Divers"},
{"Items", "Articles"},
{"Ammunition", "Munition"},
{"Construction", "Construction"},
{"Component", "Composant"},
{"Traps", "Pièges"},
{"Electrical", "Électrique"},
{"Fun", "Amusement"},
{"Food", "Nourriture"},
{"Resources", "Ressources"},
{"Tool", "Outil"},
{"Weapon", "Arme"},
{"Medical", "Médical"},
{"Minicopter", "Minicopter"},
{"Sedan", "Sedan"},
{"Airdrop Call", "Fumigène de dètresse"},
}, this, "fr"); //French
lang.RegisterMessages(new Dictionary<string, string>
{
{"Economics", "GUIShop fick inte svar från pluginet Economics. Se till att plugin för ekonomi är korrekt installerad." },
{"EconomicsMaxDebt", "Transaktionen avvisad du är redan på max ekonomiskuld"},
{"EconomicsExceedsDebt", "Transaktionen avvisades detta skulle överskrida den högsta ekonomiska skuldgränsen på {0}"},
{"CustomInvalidID", "Anpassat valuta-ID är inte giltigt konfiguration kräver uppdatering för denna butik {0}"},
{"MaxEconomicsBalance", "Transaktionen avvisad, du har redan nått den högsta ekonomiska gränsen"},
{"EconomicsExceedsLimit", "Transaktionen avvisades detta skulle överskrida den högsta möjliga ekonomigränsen på {0}"},
{"ServerRewards", "GUIShop fick inte svar från ServerRewards-plugin. Se till att ServerRewards-tillägget är korrekt installerat." },
{"TakeCurrency", "GUIshop har misslyckats med att ta denna valuta vid köp {0}"},
{"Bought", "Du har köpt {0} x {1}."},
{"Sold", "Du har sålt {0} x {1}."},
{"Cooldown", "Du kan bara köpa den här varan var {0} sekund."},
{"InventoryFull", "Ditt lager är fullt."},
{"InventorySlots", "Du behöver minst {0} lediga lagerplatser."},
{"ErrorShop", "Det är något fel med denna butik. Kontakta en administratör."},
{"GlobalShopsDisabled", "Globala butiker är inaktiverade. Denna server använder NPC-leverantörer!"},
{"DeniedActionInShop", "Du får inte {0} i den här butiken"},
{"ShopItemItemInvalid", "VARNING: Det verkar som att detta säljföremål du har inte är ett giltigt objekt! Vänligen kontakta en administratör!" },
{"ItemNotValidbuy", "VARNING: Det verkar som om det inte är ett giltigt objekt att köpa. Kontakta en administratör!" },
{"ItemNotValidsell", "VARNING: Det verkar som om det inte är ett giltigt objekt att sälja. Kontakta en administratör!" },
{"RedeemKitFail", "VARNING: Det uppstod ett fel när du gav dig detta kit. Kontakta en administratör!"},
{"NotKit", "Detta är inte ett giltigt kitnamn som har tilldelats denna butiksvara {0}"},
{"BuyCmd", "Kan inte köpa flera av denna artikel!"},
{"BuyPriceFail", "VARNING: Inget köppris gavs av administratören, du kan inte köpa denna artikel"},
{"SellPriceFail", "VARNING: Inget försäljningspris gavs av