C#:
using Newtonsoft.Json;
using Oxide.Core.Libraries.Covalence;
using Oxide.Core;
using System.Linq;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using ConVar;
using Object = System.Object;
using System.Collections.Generic;
using System;
using System.Text;
using UnityEngine;
using System.Text.RegularExpressions;
using Network;
namespace Oxide.Plugins {
[Info("IQEconomic", "15FPS", "1.11.17")]
[Description("Экономика на ваш сервер")]
class IQEconomic : RustPlugin {
private Double TimeUnblockExchange(Int32 TimeExchange) => (SaveRestore.SaveCreatedTime.ToUniversalTime().Subtract(epoch).TotalSeconds + TimeExchange) - CurrentTime;
void API_TRANSFERS(ulong userID, string trasferUserID, int Balance) => TransferPlayer(userID, ulong.Parse(trasferUserID), Balance);
private const Boolean LanguageEn = false;
bool API_IS_USER(ulong userID) => IsData(userID);
protected override void LoadConfig() {
base.LoadConfig();
try {
config = Config.ReadObject<Configuration>();
if (config == null) LoadDefaultConfig();
if (config.TransferSettings.ExchangeRates == null || config.TransferSettings.ExchangeRates.Count == 0) {
config.TransferSettings.ExchangeRates = new Dictionary<Int32, Configuration.TransferSetting.ExchangeRate>() {
[0]
= new Configuration.TransferSetting.ExchangeRate() {
MoneyCount = 3, StoresMoneyCount = 1
}
, [86400] = new Configuration.TransferSetting.ExchangeRate() {
MoneyCount = 4, StoresMoneyCount = 1
}
, [172800] = new Configuration.TransferSetting.ExchangeRate() {
MoneyCount = 5, StoresMoneyCount = 1
}
, [259200] = new Configuration.TransferSetting.ExchangeRate() {
MoneyCount = 6, StoresMoneyCount = 1
}
, [345600] = new Configuration.TransferSetting.ExchangeRate() {
MoneyCount = 8, StoresMoneyCount = 2
}
,
}
;
}
if (config.GeneralSetting.SettingDropMoneyPreset == null) config.GeneralSetting.SettingDropMoneyPreset = new Configuration.GeneralSettings.SettingDropMoney() {
UseDropMoney = false, Presets = new Dictionary<String, Configuration.GeneralSettings.SettingDropMoney.Preset>() {
["crate_elite"]
= new Configuration.GeneralSettings.SettingDropMoney.Preset() {
Rare = 100, MoneyMin = 3, MoneyMax = 5
}
, ["crate_normal"] = new Configuration.GeneralSettings.SettingDropMoney.Preset() {
Rare = 10, MoneyMin = 30, MoneyMax = 50
}
,
}
}
;
if (config.GeneralSetting.SettingDropMoneyPreset.Presets == null || config.GeneralSetting.SettingDropMoneyPreset.Presets.Count == 0) {
config.GeneralSetting.SettingDropMoneyPreset.Presets = new Dictionary<String, Configuration.GeneralSettings.SettingDropMoney.Preset>() {
["crate_elite"]
= new Configuration.GeneralSettings.SettingDropMoney.Preset() {
Rare = 100, MoneyMin = 3, MoneyMax = 5
}
, ["crate_normal"] = new Configuration.GeneralSettings.SettingDropMoney.Preset() {
Rare = 10, MoneyMin = 30, MoneyMax = 50
}
,
}
;
}
}
catch {
PrintWarning(LanguageEn ? "Error #49" + $"reading the configuration 'oxide/config/{Name}', creating a new configuration! #33" : "Ошибка #49" + $"чтения конфигурации 'oxide/config/{Name}', создаём новую конфигурацию! #33");
LoadDefaultConfig();
}
NextTick(SaveConfig);
}
object CanCombineDroppedItem(DroppedItem item, DroppedItem targetItem) {
if (item.GetItem().skin != targetItem.GetItem().skin) return false;
return null;
}
private Dictionary<uint, Dictionary<ulong, int>> HeliAttackers = new Dictionary<uint, Dictionary<ulong, int>>();
public int TakeMoneyContainerItem(ItemContainer container, int itemid, int iAmount) {
int num = 0;
if (iAmount == 0) return num;
List<Item> list = Facepunch.Pool.GetList<Item>();
foreach (Item item in container.itemList) {
if (item.info.itemid == itemid && item.skin == config.CustomMoneySetting.SkinID) {
int num2 = iAmount - num;
if (num2 > 0) {
if (item.amount > num2) {
item.MarkDirty();
item.amount -= num2;
num += num2;
break;
}
else {
if (item.amount <= num2) {
num += item.amount;
list.Add(item);
}
if (num == iAmount) break;
}
}
}
}
foreach (Item item3 in list) item3.RemoveFromContainer();
Facepunch.Pool.FreeList<Item>(ref list);
return num;
}
public Boolean IsDuel(UInt64 userID) {
Object obj = Interface.Oxide.RootPluginManager.GetPlugin("AimTraining")?.CallHook("IsArenaPlayer", userID);
if (obj is Boolean) return (Boolean)obj;
else if (Battles) return (Boolean)Battles?.Call("IsPlayerOnBattle", userID);
else if (Duel) return (Boolean)Duel?.Call("IsPlayerOnActiveDuel", BasePlayer.FindByID(userID));
else if (Duelist) return (Boolean)Duelist?.Call("inEvent", BasePlayer.FindByID(userID));
else if (ArenaTournament) return ArenaTournament.Call<Boolean>("IsOnTournament", userID);
else if (XFarmRoom) return XFarmRoom.Call<Boolean>("API_PlayerInRoom", userID);
else return false;
}
void API_SET_BALANCE(ulong userID, int Balance, ItemContainer itemContainer = null) => SetBalance(userID, Balance, itemContainer);
private void TrackerTime() {
Configuration.GeneralSettings.TimeSettingsReward TimeSetting = config.GeneralSetting.TimeReward;
IEnumerable<BasePlayer> FiltredList = !String.IsNullOrWhiteSpace(TimeSetting.PermissionReward) ? BasePlayer.activePlayerList.Where(x => permission.UserHasPermission(x.UserIDString, TimeSetting.PermissionReward)) : BasePlayer.activePlayerList;
foreach (BasePlayer player in FiltredList) if (DataEconomics[player.userID].Time <= CurrentTime) {
Int32 SetTime = Convert.ToInt32(config.GeneralSetting.TimeReward.OnlineTime + CurrentTime);
SetBalance(player.userID, config.GeneralSetting.TimeReward.OnlineTimeReward);
DataEconomics[player.userID].Time = SetTime;
}
}
private static string HexToRustFormat(string hex) {
Color color;
ColorUtility.TryParseHtmlString(hex, out color);
return string.Format("{0:F2} {1:F2} {2:F2} {3:F2}", color.r, color.g, color.b, color.a);
}
void API_TRANSFERS(string userID, BasePlayer trasferPlayer, int Balance) => TransferPlayer(ulong.Parse(userID), trasferPlayer.userID, Balance);
private static StringBuilder sb = new StringBuilder();
public void Interface_Changer(BasePlayer player) {
CuiElementContainer container = new CuiElementContainer();
CuiHelper.DestroyUi(player, UI_CHANGER_PARENT);
Configuration.TransferSetting.ExchangeRate Transfer = GetExcahngeRate();
container.Add(new CuiPanel {
CursorEnabled = false, Image = {
Color = "0.1607843 0.1647059 0.1294118 0.6117647", Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat"
}
, RectTransform = {
AnchorMin = "0.5 0", AnchorMax = "0.5 0", OffsetMin = "-199.937 81.1", OffsetMax = "180.454 133.498"
}
}
, "Overlay", UI_CHANGER_PARENT);
container.Add(new CuiPanel {
CursorEnabled = false, Image = {
Color = "0.1607843 0.1647059 0.1294118 1"
}
, RectTransform = {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "13.656 -26.2", OffsetMax = "66.238 26.199"
}
}
, UI_CHANGER_PARENT, "PanelBackgroundMoney");
container.Add(new CuiElement {
Name = "MoneyItem", Parent = "PanelBackgroundMoney", Components = {
new CuiRawImageComponent {
Color = "1 1 1 1", Png = GetImage("URLStores")
}
, new CuiRectTransformComponent {
AnchorMin = "0.5 1", AnchorMax = "0.5 1", OffsetMin = "-15.747 -40.3", OffsetMax = "16.253 -8.3"
}
}
}
);
container.Add(new CuiPanel {
CursorEnabled = false, Image = {
Color = "0.1607843 0.1647059 0.1294118 1"
}
, RectTransform = {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-130.174 -26.2", OffsetMax = "-77.592 26.199"
}
}
, UI_CHANGER_PARENT, "PanelBackgroundCoin");
container.Add(new CuiElement {
Name = "CoinsItem", Parent = "PanelBackgroundCoin", Components = {
new CuiRawImageComponent {
Color = "1 1 1 1", Png = GetImage("URLMoney")
}
, new CuiRectTransformComponent {
AnchorMin = "0.5 1", AnchorMax = "0.5 1", OffsetMin = "-15.217 -40.3", OffsetMax = "16.783 -8.3"
}
}
}
);
container.Add(new CuiButton {
Button = {
Color = HexToRustFormat("#B03825"), Close = UI_CHANGER_PARENT
}
, Text = {
Text = "<b>✖</b>", Font = "robotocondensed-regular.ttf", FontSize = 30, Align = TextAnchor.MiddleCenter, Color = "0.7843137 0.627451 0.5921569 1"
}
, RectTransform = {
AnchorMin = "0 0", AnchorMax = "0 0", OffsetMin = "0 0", OffsetMax = "60.019 52.398"
}
}
, UI_CHANGER_PARENT, "CloseBut");
container.Add(new CuiButton {
Button = {
Color = HexToRustFormat("#89B63B"), Command = "transfer"
}
, Text = {
Text = GetLang("UI_CHANGER_TRANSFER", player.UserIDString), Font = "robotocondensed-regular.ttf", FontSize = 14, Align = TextAnchor.MiddleCenter, Color = "0.8431373 0.9215686 0.6588235 1"
}
, RectTransform = {
AnchorMin = "1 0", AnchorMax = "1 0", OffsetMin = "-123.951 0", OffsetMax = "-0.001 24.934"
}
}
, UI_CHANGER_PARENT, "TransferBut");
container.Add(new CuiButton {
Button = {
Color = HexToRustFormat("#89B63B"), Command = "transfer.all"
}
, Text = {
Text = GetLang("UI_CHANGER_TRANSFER_ALL", player.UserIDString), Font = "robotocondensed-regular.ttf", FontSize = 14, Align = TextAnchor.MiddleCenter, Color = "0.8431373 0.9215686 0.6588235 1"
}
, RectTransform = {
AnchorMin = "1 1", AnchorMax = "1 1", OffsetMin = "-123.957 -24.934", OffsetMax = "0.003 0"
}
}
, UI_CHANGER_PARENT, "TransferButAll");
container.Add(new CuiElement {
Name = "BalanceCount", Parent = UI_CHANGER_PARENT, Components = {
new CuiTextComponent {
Text = GetLang("UI_MY_BALANCE_TRANSFER", player.UserIDString, GetBalance(player.userID)), Font = "robotocondensed-regular.ttf", FontSize = 9, Align = TextAnchor.MiddleCenter, Color = "1 1 1 1"
}
, new CuiOutlineComponent {
Color = "0 0 0 0.5", Distance = "1 -1"
}
, new CuiRectTransformComponent {
AnchorMin = "0.5 0", AnchorMax = "0.5 0", OffsetMin = "-130.179 0", OffsetMax = "66.241 13.579"
}
}
}
);
container.Add(new CuiPanel {
CursorEnabled = false, Image = {
Color = "1 1 1 1", Sprite = "assets/icons/chevron_right.png"
}
, RectTransform = {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-47.969 -13.801", OffsetMax = "-15.9690172 18.1990172"
}
}
, UI_CHANGER_PARENT, "PanelNextVisual");
container.Add(new CuiElement {
Name = "LabelAmountCoin", Parent = UI_CHANGER_PARENT, Components = {
new CuiTextComponent {
Text = $"X{Transfer.MoneyCount}", Font = "robotocondensed-regular.ttf", FontSize = 15, Align = TextAnchor.MiddleCenter, Color = "1 1 1 1"
}
, new CuiOutlineComponent {
Color = "0 0 0 0.5", Distance = "1 -1"
}
, new CuiRectTransformComponent {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-75.169 -10.817", OffsetMax = "-47.969 15.215"
}
}
}
);
container.Add(new CuiElement {
Name = "LabelAmountBalance", Parent = UI_CHANGER_PARENT, Components = {
new CuiTextComponent {
Text = $"X{Transfer.StoresMoneyCount}", Font = "robotocondensed-regular.ttf", FontSize = 15, Align = TextAnchor.MiddleCenter, Color = "1 1 1 1"
}
, new CuiOutlineComponent {
Color = "0 0 0 0.5", Distance = "1 -1"
}
, new CuiRectTransformComponent {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-15.969 -10.817", OffsetMax = "11.23 15.215"
}
}
}
);
container.Add(new CuiElement {
Name = "IQEconomicLabel", Parent = UI_CHANGER_PARENT, Components = {
new CuiTextComponent {
Text = GetLang("UI_CHANGER_TRANSFER_TITLE", player.UserIDString), Font = "robotocondensed-regular.ttf", FontSize = 20, Align = TextAnchor.UpperCenter, Color = "1 1 1 1"
}
, new CuiOutlineComponent {
Color = "0 0 0 0.5", Distance = "1 -1"
}
, new CuiRectTransformComponent {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-190.196 41.482", OffsetMax = "190.194 68.72"
}
}
}
);
if (config.TransferSettings.UseLimits) container.Add(new CuiElement {
Name = "IQEconomicLabelAccesLimit", Parent = UI_CHANGER_PARENT, Components = {
new CuiTextComponent {
Text = GetLang("UI_LIMITED_PLAYER", player.UserIDString, GetLimit(player.userID)), Font = "robotocondensed-regular.ttf", FontSize = 13, Align = TextAnchor.UpperCenter, Color = "1 1 1 1"
}
, new CuiOutlineComponent {
Color = "0 0 0 0.5", Distance = "1 -1"
}
, new CuiRectTransformComponent {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-190.197 26.199", OffsetMax = "190.193 46.643"
}
}
}
);
CuiHelper.AddUi(player, container);
}
private Item OnItemSplit(Item item, int amount) {
if (plugins.Find("Stacks") || plugins.Find("CustomSkinsStacksFix") || plugins.Find("SkinBox") || plugins.Find("StackModifier")) return null;
var CustomMoney = config.CustomMoneySetting;
if (CustomMoney.SkinID == 0) return null;
if (item.skin == CustomMoney.SkinID) {
Item x = ItemManager.CreateByPartialName(CustomMoney.Shortname, amount);
x.name = CustomMoney.DisplayName;
x.skin = CustomMoney.SkinID;
x.amount = amount;
item.amount -= amount;
return x;
}
return null;
}
void OnNewSave(string filename) => ClearDataFile();
void OnEntitySpawned(BaseNetworkable entity) {
if (entity == null) return;
if (!config.GeneralSetting.SettingDropMoneyPreset.Presets.ContainsKey(entity.ShortPrefabName)) return;
LootContainer Container = entity.GetComponent<LootContainer>();
if (Container == null) return;
if (Container.inventory.IsFull()) return;
Configuration.GeneralSettings.SettingDropMoney.Preset Preset = config.GeneralSetting.SettingDropMoneyPreset.Presets[entity.ShortPrefabName];
if (!IsRare(Preset.Rare)) return;
Int32 RandomMoney = UnityEngine.Random.Range(Preset.MoneyMin, Preset.MoneyMax);
Item ItemMoney = CreateCustomMoney(RandomMoney);
if (ItemMoney == null) return;
ItemMoney.MoveToContainer(Container.inventory);
}
void API_TRANSFERS(string userID, ulong trasferUserID, int Balance) => TransferPlayer(ulong.Parse(userID), trasferUserID, Balance);
Item CreateCustomMoney(int Amount) {
var CustomMoney = config.CustomMoneySetting;
Item Money = ItemManager.CreateByName(CustomMoney.Shortname, Amount, CustomMoney.SkinID);
Money.name = CustomMoney.DisplayName;
return Money;
}
void OnPlayerConnected(BasePlayer player) => ConnectedPlayer(player);
void API_TRANSFERS(BasePlayer player, BasePlayer trasferPlayer, int Balance) => TransferPlayer(player.userID, trasferPlayer.userID, Balance);
public class InformationData {
[JsonProperty(LanguageEn ? "Player Balance" : "Баланс игрока")]
public Int32 Balance;
[JsonProperty(LanguageEn ? "Player's balance withdrawal limit" : "Лимит вывода баланса игрока")]
public Int32 LimitBalance;
[JsonProperty(LanguageEn ? "Time counter" : "Счетчик времени")]
public Int32 Time;
[JsonProperty(LanguageEn ? "The player's last login to the server" : "Последний вход игрока на сервер")]
public Double DateTime;
}
[ConsoleCommand("transfer.all")]
void TransferAll(ConsoleSystem.Arg args) {
BasePlayer player = args.Player();
if (player == null) return;
Int32 Balance = config.TransferSettings.UseLimits ? GetBalance(player.userID) > GetLimit(player.userID) ? GetLimit(player.userID) : GetBalance(player.userID) : GetBalance(player.userID);
Configuration.TransferSetting.ExchangeRate Transfer = GetExcahngeRate();
if (Transfer == null) {
SendChat(GetLang("UI_NO_EXCANCHGE", player.UserIDString), player);
return;
}
if (!IsTransfer(Balance, Transfer.MoneyCount)) return;
var Reference = config.ReferenceSettings;
if (Reference.GameStoreshUse) GameStoresBalanceSet(player.userID, Convert.ToInt32((Balance / Transfer.MoneyCount) * Transfer.StoresMoneyCount), Balance);
if (Reference.MoscovOvhUse) MoscovOVHBalanceSet(player.userID, Convert.ToInt32((Balance / Transfer.MoneyCount) * Transfer.StoresMoneyCount), Balance);
if (config.TransferSettings.UseLimits) LimitedUpdate(player.userID, Balance);
}
public bool IsData(ulong userID) {
if (DataEconomics.ContainsKey(userID)) return true;
else return false;
}
private void ResetLimit() {
if (!config.TransferSettings.UseLimits) return;
timer.Once(300f, ResetLimit);
if (ActualityLimitTime > CurrentTime) return;
ActualityLimitTime = Convert.ToInt32(CurrentTime + config.TransferSettings.LimitTime);
foreach (var Value in DataEconomics.Values) NextTick(() => {
Value.LimitBalance = config.TransferSettings.LimitBalance;
}
);
Puts(LanguageEn ? "The balance limit has been reset for the time elapsed" : "Лимит баланса был сброшен за пройденное время");
}
[ConsoleCommand("iq.eco")]
//iq.eco give.store 76561198807822175 300
void IQEconomicCommandsAdmin(ConsoleSystem.Arg arg) {
if (arg.Player() != null && !arg.Player().IsAdmin) return;
if (!arg.HasArgs(3)) return;
string NamaOrID = arg.GetString(1);
if(string.IsNullOrWhiteSpace(NamaOrID)) {
PrintWarning(LanguageEn ? "Enter nickname or SteamID" : "Введите ник или SteamID");
return;
}
IPlayer iPlayer = covalence.Players.FindPlayer(NamaOrID);
if(iPlayer == null) {
PrintWarning(LanguageEn ? "There is no such player" : $"Такого игрока не существует");
return;
}
int amount = arg.GetInt(2, -1);
if (amount == -1) {
PrintWarning(LanguageEn ? "The second argument is not a number!" : "Второй аргумент не является числом!");
return;
}
ulong userID = UInt64.Parse(iPlayer.Id);
switch(arg.GetString(0)) {
case "give" : {
SetBalance(userID, amount);
Puts(LanguageEn ? $"Player {userID} successfully credited {amount} of coins" : $"Игроку {userID} успешно зачислено {amount} монет");
break;
}
case "remove" : {
RemoveBalance(userID, amount);
Puts(LanguageEn ? $"Player {userID} has successfully remove {amount} of coins" : $"Игроку {userID} успешно снято {amount} монет");
break;
}
case "give.store" : {
Configuration.ReferenceSetting Reference = config.ReferenceSettings;
if (Reference.GameStoreshUse) GameStoresBalanceSet(userID, amount);
if (Reference.MoscovOvhUse) MoscovOVHBalanceSet(userID, amount);
Puts(LanguageEn ? $"Player {userID} successfully credited {amount} to the server store" : $"Игроку {userID} успешно зачислено {amount} на магазин сервера");
break;
}
}
}
void OnEntityTakeDamage(BaseCombatEntity victim, HitInfo info) {
if (victim.GetComponent<BaseHelicopter>() != null && info?.Initiator?.ToPlayer() != null) {
var heli = victim.GetComponent<BaseHelicopter>();
var player = info.Initiator.ToPlayer();
NextTick(() => {
if (heli == null) return;
if (!HeliAttackers.ContainsKey(heli.prefabID)) HeliAttackers.Add(heli.prefabID, new Dictionary<ulong, int>());
if (!HeliAttackers[heli.prefabID].ContainsKey(player.userID)) HeliAttackers[heli.prefabID].Add(player.userID, 0);
object value = HeliAttackers[heli.prefabID][player.userID]++;
}
);
}
}
public bool IsFriends(ulong userID, ulong targetID) {
if (Friends) return (bool)Friends?.Call("HasFriend", userID, targetID);
else return false;
}
void API_REMOVE_BALANCE(BasePlayer player, int Balance) => RemoveBalance(player, Balance);
public static string UI_CHANGER_PARENT = "CHANGER_PLAYER_PARENT";
void OnCollectiblePickup(CollectibleEntity collectible, BasePlayer player) {
if (collectible == null) return;
if (player == null) return;
foreach (ItemAmount item in collectible.itemList) {
if (item == null || player == null) return;
Configuration.GeneralSettings.GatherSettingReward General = config.GeneralSetting.CollectableReward;
if (!General.UseReward) return;
Dictionary<String, Configuration.GeneralSettings.AdvancedSetting> PickupGeneral = General.GatherSetting;
if (!String.IsNullOrWhiteSpace(General.PermissionReward) && !permission.UserHasPermission(player.UserIDString, General.PermissionReward)) return;
if (!PickupGeneral.ContainsKey(item.itemDef.shortname)) return;
Configuration.GeneralSettings.AdvancedSetting Gather = PickupGeneral[item.itemDef.shortname];
if (!IsRare(Gather.Rare)) return;
SetBalance(player.userID, Gather.Money);
}
}
void API_TRANSFERS(BasePlayer player, string trasferUserID, int Balance) => TransferPlayer(player.userID, ulong.Parse(trasferUserID), Balance);
bool API_IS_REMOVED_BALANCE(ulong userID, int Amount) => IsRemoveBalance(userID, Amount);
public int GetBalance(BasePlayer player) {
if (player == null) {
PrintWarning(GetLang("BALANCE_CUSTOM_MONEY_NOT_PLAYER"));
return 0;
}
return (config.UseUI) ? (IsData(player.userID) ? DataEconomics[player.userID].Balance : 0) : GetItemBalance(player);
}
int API_GET_BALANCE(BasePlayer player) => GetBalance(player);
public Int32 GetLimit(UInt64 userID) => DataEconomics[userID].LimitBalance;
private void OnServerShutdown() => Unload();
[ConsoleCommand("transfer")]
void ConsoleCommandTransfer(ConsoleSystem.Arg args) {
BasePlayer player = args.Player();
if (player == null) return;
Int32 Balance = GetBalance(player.userID);
var Reference = config.ReferenceSettings;
if (IsLimited(player.userID, Balance)) {
SendChat(GetLang("CHAT_LIMITED_PLAYER", player.UserIDString), player);
return;
}
Configuration.TransferSetting.ExchangeRate Transfer = GetExcahngeRate();
if (Transfer == null) {
SendChat(GetLang("UI_NO_EXCANCHGE", player.UserIDString), player);
return;
}
if (!IsTransfer(Balance, Transfer.MoneyCount)) return;
if (Reference.GameStoreshUse) GameStoresBalanceSet(player.userID, Transfer.StoresMoneyCount, Transfer.MoneyCount);
if(Reference.MoscovOvhUse) MoscovOVHBalanceSet(player.userID, Transfer.StoresMoneyCount, Transfer.MoneyCount);
if (config.TransferSettings.UseLimits) LimitedUpdate(player.userID, Balance);
}
void ReadData() {
DataEconomics = Oxide.Core.Interface.Oxide.DataFileSystem.ReadObject<Dictionary<UInt64, InformationData>>("IQEconomic/DataEconomics");
ActualityLimitTime = Oxide.Core.Interface.Oxide.DataFileSystem.ReadObject<Int32>("IQEconomic/ActualityLimitTime");
}
public static string UI_BALANCE_PARENT = "BALANCE_PLAYER_PARENT";
public void SendChat(string Message, BasePlayer player, Chat.ChatChannel channel = Chat.ChatChannel.Global) {
var Chat = config.ReferenceSettings.ChatSettings;
if (IQChat) if (Chat.UIAlertUse) IQChat?.Call("API_ALERT_PLAYER_UI", player, Message);
else IQChat?.Call("API_ALERT_PLAYER", player, Message, Chat.CustomPrefix, Chat.CustomAvatar);
else player.SendConsoleCommand("chat.add", channel, 0, Message);
}
public bool IsRemoveBalance(BasePlayer player, int Amount) => (GetBalance(player) >= Amount);
protected override void SaveConfig() => Config.WriteObject(config);
int API_GET_BALANCE(ulong userID) => GetBalance(userID);
public void TakeMoneyPlayer(BasePlayer player, int iAmount) {
ItemDefinition itemDefinition = ItemManager.FindItemDefinition(config.CustomMoneySetting.Shortname);
if (itemDefinition == null) return;
int itemID = itemDefinition.itemid;
if (player.inventory.containerMain != null) iAmount -= TakeMoneyContainerItem(player.inventory.containerMain, itemID, iAmount);
if (iAmount <= 0) return;
if (player.inventory.containerBelt != null) TakeMoneyContainerItem(player.inventory.containerBelt, itemID, iAmount);
}
static Double CurrentTime => Facepunch.Math.Epoch.Current;
[JsonProperty(LanguageEn ? "The economic system" : "Система экономики")]
public Dictionary<UInt64, InformationData> DataEconomics = new Dictionary<UInt64, InformationData>();
private class Configuration {
[JsonProperty(LanguageEn ? "The coins will be in the form of an item - false / Otherwise there will be a chat or interface - true" : "Монетки будут и гроков на руках - false / Иначе будет чат или интерфейсе - true")]
public Boolean UseUI;
[JsonProperty(LanguageEn ? "Use the UI interface to display the balance (true - yes (If you did not put the coins in item))/false - the information will be in the chat on command and at the entrance)" : "Использовать UI интерфейс для отображения баланса(true - да(Если вы не поставили , чтобы монетки были на руках))/false - информация будет в чате по команде и при входе)")]
public Boolean UseUIMoney;
[JsonProperty(LanguageEn ? "Displaying the interface with a balance (true - displays/false - hides)" : "Отображение интерфейса с балансом(true - отображает/false - скрывает)")]
public Boolean ShowUI;
[JsonProperty(LanguageEn ? "Enable notifications to the player about receiving currency for mining (true - yes/false - no)" : "Включить уведомления игроку о получении валюты за добычу (true - да/false - нет)")]
public Boolean UseAlert = true;
[JsonProperty(LanguageEn ? "Starting balance for all players" : "Стартовый баланс для всех игроков")]
public Int32 StartedBalance = 0;
[JsonProperty(LanguageEn ? "Interface settings in the plugin (Do not touch if you do not understand how to work with it)" : "Настройки интерфейса в плагине (Не трогайте, если не понимаете как с этим работать)")]
public Interface InterfaceSetting = new Interface();
[JsonProperty(LanguageEn ? "Currency exchange settings for the balance in the store" : "Настройки обмена валют на баланс в магазине")]
public TransferSetting TransferSettings = new TransferSetting();
[JsonProperty(LanguageEn ? "Basic Settings" : "Основные настройки")]
public GeneralSettings GeneralSetting = new GeneralSettings();
[JsonProperty(LanguageEn ? "Currency settings (If the type of coins in item)" : "Настройки валюты(Если вид экономики - false)")]
public CustomMoney CustomMoneySetting = new CustomMoney();
[JsonProperty(LanguageEn ? "Settings for collaboration with other plugins" : "Настройки совместной работы с другими плагинами")]
public ReferenceSetting ReferenceSettings = new ReferenceSetting();
internal class CustomMoney {
[JsonProperty(LanguageEn ? "Currency name" : "Название валюты")]
public String DisplayName;
[JsonProperty(LanguageEn ? "Coin Shortname" : "Shortname монетки")]
public String Shortname;
[JsonProperty(LanguageEn ? "Coin SkinID" : "SkinID монетки")]
public UInt64 SkinID;
}
internal class Interface {
[JsonProperty(LanguageEn ? "Color of the main panel" : "Цвет основной панели")]
public String ColorBackground = "#FFFFFF05";
[JsonProperty(LanguageEn ? "Additional Panel Color #1" : "Цвет дополнительной панели #1")]
public String ColorMoreOne = "#b1b1b1";
[JsonProperty(LanguageEn ? "Additional Panel Color #2" : "Цвет дополнительной панели #2")]
public String ColorMoreTwo = "#CCD045FF";
[JsonProperty(LanguageEn ? "Text color" : "Цвет текста")]
public String ColorLabel = "#FEFFDDFF";
[JsonProperty("AnchorMin")]
public String AnchorMin = "1 0";
[JsonProperty("AnchorMax")]
public String AnchorMax = "1 0";
[JsonProperty("OffsetMin")]
public String OffsetMin = "-390 15";
[JsonProperty("OffsetMax")]
public String OffsetMax = "-212 42";
}
internal class GeneralSettings {
[JsonProperty(LanguageEn ? "Setting up a data file" : "Настройка дата-файла")]
public DataFileSettings DataFileSetting = new DataFileSettings();
internal class DataFileSettings {
[JsonProperty(LanguageEn ? "Save interval file date (Set to 0 if you do not want to save the file by timer)" : "Интервал сохранения дата файла (Установите 0, если не требуется сохранять файл по таймеру)")]
public Int32 SaveTime = 360;
[JsonProperty(LanguageEn ? "Setting up Data file cleanup" : "Настройка очистки дата-файла")]
public DetalisWipeData DetalisWipe = new DetalisWipeData();
internal class DetalisWipeData {
[JsonProperty(LanguageEn ? "Type of data file cleaning : 0 - Do not clean at all, 1 - Clean the entire date when the server is wiped, 2 - Clean the date file of players with a balance of <N (configurable in this category) when the server is wiped, 3 - Clean players who have not logged in >N (configurable in this category) days, 4 - Clear players who have not logged in >N (configurable in this category) days and their balance <N (configurable in this category)" : "Тип очистки дата-файла : 0 - Не очищать совсем, 1 - Очищать всю дату при вайпе сервера, 2 - Очищать дата файл игроков с балансом <N(настраивается в этой категории) при вайпе сервера, 3 - Очищать игроков, которые не заходили >N(настраивается в этой категории) дней, 4 - Очищать игроков, которые не заходили >N(настраивается в этой категории) дней и их баланс <N(настраивается в этой категории)")]
public TypeData TypeClear;
[JsonProperty(LanguageEn ? "<N is the amount of balance to clear the date. For types : 2 and 4" : "<N-количество баланса для очистки даты. Для типов : 2 и 4")]
public Int32 AmountBalance = 0;
[JsonProperty(LanguageEn ? ">N-days offline to clear the date. For types : 3 and 4" : ">N-дней оффлайн для очистки даты. Для типов : 3 и 4")]
public Int32 DayPlayer = 0;
}
}
[JsonProperty(LanguageEn ? "Setting up the currency dropout from the boxes (ONLY IF THE CURRENCY TYPE IS SELECTED: COINS IS ITEM)" : "Настройка выпдаения валюты из ящиков (ТОЛЬКО ЕСЛИ ВЫБРАН ТИП ВАЛЮТЫ : МОНЕТКИ НА РУКАХ)")]
public SettingDropMoney SettingDropMoneyPreset = new SettingDropMoney();
internal class SettingDropMoney {
internal class Preset {
public Int32 Rare;
public Int32 MoneyMin;
public Int32 MoneyMax;
}
[JsonProperty(LanguageEn ? "Enable the possibility of currency falling out of the mailbox? (ONLY IF THE CURRENCY TYPE IS SELECTED: COINS IS ITEM)" : "Включить возможность выпадения валюты из ящика? (ТОЛЬКО ЕСЛИ ВЫБРАН ТИП ВАЛЮТЫ : МОНЕТКИ НА РУКАХ)")]
public Boolean UseDropMoney;
[JsonProperty(LanguageEn ? "Setting up presets with currency falling out of boxes [box(ShortPrefabName)] = setup" : "Настройка пресетов с выпадением валюты из ящиков [ящик(ShortPrefabName]] = настройка")]
public Dictionary<String, Preset> Presets = new Dictionary<string, Preset>();
}
[JsonProperty(LanguageEn ? "Setting up getting currency for killing players" : "Настройка получение валюты за убийство игроков")]
public GeneralSettingReward KilledReward;
[JsonProperty(LanguageEn ? "Setting up getting currency for killing animals" : "Настройка получение валюты за убийство животных")]
public GeneralSettingReward AnimalReward;
[JsonProperty(LanguageEn ? "Setting up getting currency for killing an NPC" : "Настройка получение валюты за убийство NPC")]
public GeneralSettingReward NPCReward;
[JsonProperty(LanguageEn ? "Setting up getting currency for destroying a bradley" : "Настройка получение валюты за уничтожение танка")]
public GeneralSettingReward BradleyReward;
[JsonProperty(LanguageEn ? "Setting up receiving currency for destroying a helicopter" : "Настройка получение валюты за уничтожение вертолета")]
public GeneralSettingReward HelicopterReward;
[JsonProperty(LanguageEn ? "Setting up receiving currency for destroying barrels" : "Настройка получение валюты за уничтожение бочек")]
public GeneralSettingReward BarrelReward;
[JsonProperty(LanguageEn ? "Setting up receiving currency for resource extraction" : "Настройка получение валюты за добычу ресурсов")]
public GatherSettingReward GatherReward;
[JsonProperty(LanguageEn ? "Setting up receiving currency for raising resources from the ground (mushrooms, berries, tree, etc.)" : "Настройка получение валюты за поднятие ресурсов с земли (грибы, ягоды, дерево и т.д)")]
public GatherSettingReward CollectableReward;
[JsonProperty(LanguageEn ? "Setting up receiving currency for the time spent on the server" : "Настройка получение валюты за проведенное время на сервере")]
public TimeSettingsReward TimeReward;
[JsonProperty(LanguageEn ? "IQSphereEvent: Setting up getting currency for killing NPCs (Under - under the sphere, Around - around the sphere, Tier1 - 1st floor of the sphere, Tier2-2nd floor of the sphere, Tier3-3rd floor of the sphere)" : "IQSphereEvent : Настройка получение валюты за убийство NPC (Under - под сферой, Around - вокруг сферы, Tier1 - 1 этаж сферы, Tier2 - 2 этаж сферы, Tier3 - 3 этаж сферы)")]
public Dictionary<TierIQSphereEvent, GeneralSettingReward> IQSphereNpcReward;
internal class TimeSettingsReward {
[JsonProperty(LanguageEn ? "Permissions to use this feature (If you need to make it available to everyone according to the standard, leave the field empty)" : "Права для использования данной возможности (Если вам требуется сделать ее доступной всем по стандарту - оставьте поле пустым)")]
public String PermissionReward = "";
[JsonProperty(LanguageEn ? "Use this opportunity to receive currency" : "Использовать эту возможность получения валюты")]
public Boolean UseReward = true;
[JsonProperty(LanguageEn ? "How much time do you need to spend to get a reward" : "Сколько нужно провести времени,чтобы выдали награду")]
public Int32 OnlineTime;
[JsonProperty(LanguageEn ? "How much to charge currency for the time spent on the server" : "Сколько начислять валюты за проведенное время на сервере")]
public Int32 OnlineTimeReward;
}
internal class GatherSettingReward {
[JsonProperty(LanguageEn ? "Permissions to use this feature (If you need to make it available to everyone according to the standard, leave the field empty)" : "Права для использования данной возможности (Если вам требуется сделать ее доступной всем по стандарту - оставьте поле пустым)")]
public String PermissionReward = "";
[JsonProperty(LanguageEn ? "Use this opportunity to receive currency" : "Использовать эту возможность получения валюты")]
public Boolean UseReward = true;
[JsonProperty(LanguageEn ? "How much currency to charge for resources ( [for which resource to give(shortname)] = { other settings }" : "Сколько начислять валюты за ресурсы ( [за какой ресурс давать] = { остальная настройка }")]
public Dictionary<String, AdvancedSetting> GatherSetting = new Dictionary<String, AdvancedSetting>();
}
internal class GeneralSettingReward {
[JsonProperty(LanguageEn ? "Permissions to use this feature (If you need to make it available to everyone according to the standard, leave the field empty)" : "Права для использования данной возможности (Если вам требуется сделать ее доступной всем по стандарту - оставьте поле пустым)")]
public String PermissionReward = "";
[JsonProperty(LanguageEn ? "Use this opportunity to receive currency" : "Использовать эту возможность получения валюты")]
public Boolean UseReward = true;
[JsonProperty(LanguageEn ? "Setting up currency receipt" : "Настройка получения валюты")]
public AdvancedSetting AdvancedReward = new AdvancedSetting();
}
internal class AdvancedSetting {
[JsonProperty(LanguageEn ? "Chance to get currency" : "Шанс получить валюту")]
public Int32 Rare;
[JsonProperty(LanguageEn ? "How much currency to issue" : "Сколько выдавать валюты")]
public Int32 Money;
}
}
internal class TransferSetting {
[JsonProperty(LanguageEn ? "Enable currency exchange to the balance in the store (GameStores/MoscovOVH)" : "Включить обмен валюты на баланс в магазине(GameStores/MoscovOVH)")]
public Boolean TransferStoreUse;
[JsonProperty(LanguageEn ? "The URL of your coin" : "URL вашей монеты")]
public String URLMoney;
[JsonProperty(LanguageEn ? "Currency URL for the store" : "URL валюты для магазина")]
public String URLStores;
[JsonProperty(LanguageEn ? "Notify players of course changes?" : "Уведомлять игроков об изменении курса?")]
public Boolean UseAlertExchangeNew;
[JsonProperty(LanguageEn ? "Setting the currency exchange rate by time - [seconds (the time after which this rate will be set after the wipe)] - the rate" : "Настройка курса обмена валюты по времени - [cекунды(врея через которое установится данный курс после вайпа)] - курс")]
public Dictionary<Int32, ExchangeRate> ExchangeRates = new Dictionary<Int32, ExchangeRate>();
internal class ExchangeRate {
[JsonProperty(LanguageEn ? "How many coins are required to exchange" : "Сколько монет требуется для обмена")]
public Int32 MoneyCount;
[JsonProperty(LanguageEn ? "How much balance will the player receive after the exchange" : "Сколько баланса получит игрок после обмена")]
public Int32 StoresMoneyCount;
}
[JsonProperty(LanguageEn ? "Enable the limit of funds exchange" : "Включить лимит обмена средств")]
public Boolean UseLimits = false;
[JsonProperty(LanguageEn ? "Limit of funds (balance per store)" : "Лимит средств(баланса на магазин)")]
public Int32 LimitBalance = 100;
[JsonProperty(LanguageEn ? "Time limit (in seconds) (Example : A limit of 100 balance is set, once every 3600 seconds)" : "Время лимита(в секундах) (Пример : Установлен лимит 100 баланса, раз в 3600 секунд)")]
public Int32 LimitTime = 3600;
}
internal class ReferenceSetting {
[JsonProperty(LanguageEn ? "Friends : Prohibit receiving coins for killing friends" : "Friends : Запретить получение монет за убийство друзей")]
public Boolean FriendsBlockUse;
[JsonProperty(LanguageEn ? "Clans : Prohibit receiving coins for killing fellow clans" : "Clans : Запретить получение монет за убийство сокланов")]
public Boolean ClansBlockUse;
[JsonProperty(LanguageEn ? "Duel/Battles : Prohibit receiving coins for killing in duels" : "Duel/Battles : Запретить получение монет за убийство на дуэлях")]
public Boolean DuelBlockUse;
[JsonProperty(LanguageEn ? "MoscovOVH : Enable the use of the store (Currency exchange must be enabled)" : "MoscovOVH : Включить использование магазина(Должен быть включен обмен валют)")]
public Boolean MoscovOvhUse;
[JsonProperty(LanguageEn ? "GameStores : Enable the use of the store (Currency exchange must be enabled)" : "GameStores : Включить использование магазина(Должен быть включен обмен валют)")]
public Boolean GameStoreshUse;
[JsonProperty(LanguageEn ? "GameStores : GameStores Store Settings" : "GameStores : Настройки магазина GameStores")]
public GameStores GameStoresSettings = new GameStores();
[JsonProperty(LanguageEn ? "IQChat : Chat Settings" : "IQChat : Настройки чата")]
public ChatSetting ChatSettings = new ChatSetting();
internal class ChatSetting {
[JsonProperty(LanguageEn ? "IQChat : Custom prefix in the chat" : "IQChat : Кастомный префикс в чате")]
public String CustomPrefix;
[JsonProperty(LanguageEn ? "IQChat : Custom avatar in the chat (If required)" : "IQChat : Кастомный аватар в чате(
// ... [Code preview truncated due to length. Full source in attached file] ...