C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using ConVar;
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Core.Libraries.Covalence;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using UnityEngine;
namespace Oxide.Plugins {
[Info("IQEconomic", "Mercury", "0.2.1")]
[Description("Экономика на ваш сервер")]
class IQEconomic : RustPlugin {
/// <summary>
/// Обновление 0.1.7
/// - Поправил метод с подключением игрока
/// - Исправлена ошибочное зачисление баланса за бочку - hobobarrel
/// - Скорректировал проверки на синтаксис в командах
/// - Исправлена ошибка в команде /transfer Nick Balance , когда можно было передавать минусовой баланс
/// - Добавлена консольная команда iq.eco give.store SteamID/Name Balance - для выдачи баланса на магазин
/// - Изменен метод начисления баланса за время на сервере
/// - Изменен интерфейс /transfer
/// - Добавлена возможность вывода сразу всех средств в /transfer
/// - Добавлена возможность установки лимитов N количества вывода в N количество времени на команду /transfer
/// - Добавлена поддержка Clans IO (Если возникнут проблемы, сообщите пожалуйста!)
/// Обновление 0.1.9
/// - Корректировка метода для работы с lang
/// - Добавлена возможность настроить автоматическую очистку дата-файл
/// 0 - Не очищать совсем,
/// 1 - Очищать всю дату при вайпе сервера,
/// 2 - Очищать дата файл игроков с балансом <N(настраивается в этой категории) при вайпе сервера,
/// 3 - Очищать игроков, которые не заходили >N(настраивается в этой категории) дней,
/// 4 - Очищать игроков, которые не заходили >N(настраивается в этой категории) дней и их баланс <N(настраивается в этой категории
/// - Конфигурация перенесла большие изменения
/// - Изменил структуру всех пунктов конфигурации для получения моент
/// - Добавлена возможность включить и отключить любую возможность добычи монет
/// - Добавлена возможность установить права для доступа к возможности добычи монет
/// - Добавлена чат-команда для игроков, с возможностью просмотреть баланс (Работает на всех типах валюты)
/// - Добавлена возможность начислять валюту за поднятие ресурсов (ягод, камней, дерева, растений и т.д)
/// - Добавлена возможность включать/отключать уведомление игрока после получения монет (Работает на всех типах валюты)
/// - Исправил выпадение монет на пол, если забиты все слоты инвентаря, но там уже есть монеты (При типе монет "На руках")
/// - Добавлена возможность указать стартовый баланс для игроков
/// </summary>
#region Reference
[PluginReference]
Plugin IQChat, Friends, Clans, Battles, Duel, RustStore, ImageLibrary;
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);
}
private string GetImage(string fileName, ulong skin = 0) {
var imageId = (string)plugins.Find("ImageLibrary").CallHook("GetImage", fileName, skin);
if (!string.IsNullOrEmpty(imageId)) return imageId;
return string.Empty;
}
public bool AddImage(string url, string shortname, ulong skin = 0) => (bool)ImageLibrary?.Call("AddImage", url, shortname, skin);
public void AddAllImage() {
var Images = config.TransferSettings;
if (string.IsNullOrEmpty(Images.URLMoney) || string.IsNullOrEmpty(Images.URLStores)) return;
if (!ImageLibrary) {
PrintError("Не установлен плагин ImageLibrary!");
return;
}
AddImage(Images.URLMoney, "URLMoney");
AddImage(Images.URLStores, "URLStores");
}
public bool IsFriends(ulong userID, ulong targetID) {
if (Friends) return (bool)Friends?.Call("HasFriend", userID, targetID);
else return false;
}
public bool IsClans(string userID, string targetID) {
if (Clans) {
if(Clans.Author.Contains("dcode")) {
String TagUserID = (String)Clans?.Call("GetClanOf", userID);
String TagTargetID = (String)Clans?.Call("GetClanOf", targetID);
return (bool)(TagUserID == TagTargetID);
}
else return (bool)Clans?.Call("IsClanMember", userID, targetID);
}
else return false;
}
public bool IsDuel(ulong userID) {
if (Battles) return (bool)Battles?.Call("IsPlayerOnBattle", userID);
else if (Duel) return (bool)Duel?.Call("IsPlayerOnActiveDuel", BasePlayer.FindByID(userID));
else return false;
}
public void MoscovOVHBalanceSet(ulong userID, int Balance, int MoneyTake) {
if (!RustStore) {
PrintWarning("У вас не установлен магазин MoscovOVH");
return;
}
plugins.Find("RustStore").CallHook("APIChangeUserBalance", userID, Balance, new Action<string>((result) => {
BasePlayer player = BasePlayer.FindByID(userID);
if (result == "SUCCESS") {
Puts($"Пользователю {userID} успешно зачислен баланс - {Balance}");
RemoveBalance(userID, MoneyTake);
if (player == null) return;
SendChat(GetLang("CHAT_STORE_SUCCESS", player.UserIDString), player);
Interface_Changer(player);
return;
}
Puts($"Пользователь {userID} не авторизован в магазине");
if (player == null) return;
SendChat(GetLang("CHAT_NO_AUTH_STORE", player.UserIDString), player);
}
));
}
public void MoscovOVHBalanceSet(ulong userID, int Balance) {
if (!RustStore) {
PrintWarning("У вас не установлен магазин MoscovOVH");
return;
}
plugins.Find("RustStore").CallHook("APIChangeUserBalance", userID, Balance, new Action<string>((result) => {
BasePlayer player = BasePlayer.FindByID(userID);
if (result == "SUCCESS") {
Puts($"Пользователю {userID} успешно зачислен баланс - {Balance}");
if (player == null) return;
SendChat(GetLang("CHAT_STORE_SUCCESS", player.UserIDString), player);
return;
}
Puts($"Пользователь {userID} не авторизован в магазине");
if (player == null) return;
SendChat(GetLang("CHAT_NO_AUTH_STORE", player.UserIDString), player);
}
));
}
public void GameStoresBalanceSet(ulong userID, int Balance, int MoneyTake) {
var GameStores = config.ReferenceSettings.GameStoresSettings;
if (String.IsNullOrEmpty(GameStores.GameStoresAPIStore) || String.IsNullOrEmpty(GameStores.GameStoresIDStore)) {
PrintWarning("Магазин GameStores не настроен! Невозможно выдать баланс пользователю");
return;
}
webrequest.Enqueue($"https://gamestores.ru/api?shop_id={GameStores.GameStoresIDStore}&secret={GameStores.GameStoresAPIStore}&action=moneys&type=plus&steam_id={userID}&amount={Balance}&mess={GameStores.GameStoresMessage}", null, (i, s) => {
BasePlayer player = BasePlayer.FindByID(userID);
if (i != 200) {
}
if (s.Contains("success")) {
Puts($"Пользователю {userID} успешно зачислен баланс - {Balance}");
RemoveBalance(userID, MoneyTake);
if (player == null) return;
SendChat(GetLang("CHAT_STORE_SUCCESS", player.UserIDString), player);
Interface_Changer(player);
return;
}
if (s.Contains("fail")) {
Puts($"Пользователь {userID} не авторизован в магазине");
if (player == null) return;
SendChat(GetLang("CHAT_NO_AUTH_STORE", player.UserIDString), player);
}
}
, this);
}
public void GameStoresBalanceSet(ulong userID, int Balance) {
var GameStores = config.ReferenceSettings.GameStoresSettings;
if (String.IsNullOrEmpty(GameStores.GameStoresAPIStore) || String.IsNullOrEmpty(GameStores.GameStoresIDStore)) {
PrintWarning("Магазин GameStores не настроен! Невозможно выдать баланс пользователю");
return;
}
webrequest.Enqueue($"https://gamestores.ru/api?shop_id={GameStores.GameStoresIDStore}&secret={GameStores.GameStoresAPIStore}&action=moneys&type=plus&steam_id={userID}&amount={Balance}&mess={GameStores.GameStoresMessage}", null, (i, s) => {
BasePlayer player = BasePlayer.FindByID(userID);
if (i != 200) {
}
if (s.Contains("success")) {
Puts($"Пользователю {userID} успешно зачислен баланс - {Balance}");
if (player == null) return;
SendChat(GetLang("CHAT_STORE_SUCCESS", player.UserIDString), player);
return;
}
if (s.Contains("fail")) {
Puts($"Пользователь {userID} не авторизован в магазине");
if (player == null) return;
SendChat(GetLang("CHAT_NO_AUTH_STORE", player.UserIDString), player);
}
}
, this);
}
#endregion
#region Vars
static Double CurrentTime => Facepunch.Math.Epoch.Current;
enum TypeData {
None, AllWipe, AllWipeOnlyBalance, TimeClear, TimeClearOnlyBalance,
}
#endregion
#region Configuration
private static Configuration config = new Configuration();
private class Configuration {
[JsonProperty("Монетки будут и гроков на руках - false / Иначе будет чат или интерфейсе - true")]
public Boolean UseUI;
[JsonProperty("Использовать UI интерфейс для отображения баланса(true - да(Если вы не поставили , чтобы монетки были на руках))/false - информация будет в чате по команде и при входе)")]
public Boolean UseUIMoney;
[JsonProperty("Отображение интерфейса с балансом(true - отображает/false - скрывает)")]
public Boolean ShowUI;
[JsonProperty("Включить уведомления игроку о получении валюты за добычу (true - да/false - нет)")]
public Boolean UseAlert = true;
[JsonProperty("Стартовый баланс для всех игроков")]
public Int32 StartedBalance = 0;
[JsonProperty("Настройки интерфейса в плагине (Не трогайте, если не понимаете как с этим работать)")]
public Interface InterfaceSetting = new Interface();
[JsonProperty("Настройки обмена валют на баланс в магазине")]
public TransferSetting TransferSettings = new TransferSetting();
[JsonProperty("Основные настройки")]
public GeneralSettings GeneralSetting = new GeneralSettings();
[JsonProperty("Настройки валюты(Если вид экономики - false)")]
public CustomMoney CustomMoneySetting = new CustomMoney();
[JsonProperty("Настройки совместной работы с другими плагинами")]
public ReferenceSetting ReferenceSettings = new ReferenceSetting();
internal class CustomMoney {
[JsonProperty("Название валюты")]
public String DisplayName;
[JsonProperty("Shortname монетки")]
public String Shortname;
[JsonProperty("SkinID монетки")]
public UInt64 SkinID;
}
internal class Interface {
[JsonProperty("Цвет основной панели")]
public String ColorBackground = "#FFFFFF05";
[JsonProperty("Цвет дополнительной панели #1")]
public String ColorMoreOne = "#b1b1b1";
[JsonProperty("Цвет дополнительной панели #2")]
public String ColorMoreTwo = "#CCD045FF";
[JsonProperty("Цвет текста")]
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("Настройка дата-файла")]
public DataFileSettings DataFileSetting = new DataFileSettings();
internal class DataFileSettings {
[JsonProperty("Интервал сохранения дата файла (Установите 0, если не требуется сохранять файл по таймеру)")]
public Int32 SaveTime = 360;
[JsonProperty("Настройка очистки дата-файла")]
public DetalisWipeData DetalisWipe = new DetalisWipeData();
internal class DetalisWipeData {
[JsonProperty("Тип очистки дата-файла : 0 - Не очищать совсем, 1 - Очищать всю дату при вайпе сервера, 2 - Очищать дата файл игроков с балансом <N(настраивается в этой категории) при вайпе сервера, 3 - Очищать игроков, которые не заходили >N(настраивается в этой категории) дней, 4 - Очищать игроков, которые не заходили >N(настраивается в этой категории) дней и их баланс <N(настраивается в этой категории)")]
public TypeData TypeClear;
[JsonProperty("<N-количество баланса для очистки даты.Для типов : 2 и 4")]
public Int32 AmountBalance = 0;
[JsonProperty(">N-дней оффлайн для очистки даты.Для типов : 3 и 4")]
public Int32 DayPlayer = 0;
}
}
[JsonProperty("Настройка получение валюты за убийство игроков")]
public GeneralSettingReward KilledReward;
[JsonProperty("Настройка получение валюты за убийство животных")]
public GeneralSettingReward AnimalReward;
[JsonProperty("Настройка получение валюты за убийство NPC")]
public GeneralSettingReward NPCReward;
[JsonProperty("Настройка получение валюты за уничтожение танка")]
public GeneralSettingReward BradleyReward;
[JsonProperty("Настройка получение валюты за уничтожение вертолета")]
public GeneralSettingReward HelicopterReward;
[JsonProperty("Настройка получение валюты за уничтожение бочек")]
public GeneralSettingReward BarrelReward;
[JsonProperty("Настройка получение валюты за добычу ресурсов")]
public GatherSettingReward GatherReward;
[JsonProperty("Настройка получение валюты за поднятие ресурсов с земли (грибы, ягоды, дерево и т.д)")]
public GatherSettingReward CollectableReward;
[JsonProperty("Настройка получение валюты за проведенное время на сервере")]
public TimeSettingsReward TimeReward;
internal class TimeSettingsReward {
[JsonProperty("Права для использования данной возможности (Если вам требуется сделать ее доступной всем по стандарту - оставьте поле пустым)")]
public String PermissionReward = "";
[JsonProperty("Использовать эту возможность получения валюты")]
public Boolean UseReward = true;
[JsonProperty("Сколько нужно провести времени,чтобы выдали награду")]
public Int32 OnlineTime;
[JsonProperty("Сколько начислять валюты за проведенное время на сервере")]
public Int32 OnlineTimeReward;
}
internal class GatherSettingReward {
[JsonProperty("Права для использования данной возможности (Если вам требуется сделать ее доступной всем по стандарту - оставьте поле пустым)")]
public String PermissionReward = "";
[JsonProperty("Использовать эту возможность получения валюты")]
public Boolean UseReward = true;
[JsonProperty("Сколько начислять валюты за ресурсы ( [за какой ресурс давать] = { остальная настройка }")]
public Dictionary<String, AdvancedSetting> GatherSetting = new Dictionary<String, AdvancedSetting>();
}
internal class GeneralSettingReward {
[JsonProperty("Права для использования данной возможности (Если вам требуется сделать ее доступной всем по стандарту - оставьте поле пустым)")]
public String PermissionReward = "";
[JsonProperty("Использовать эту возможность получения валюты")]
public Boolean UseReward = true;
[JsonProperty("Настройка получения валюты")]
public AdvancedSetting AdvancedReward = new AdvancedSetting();
}
internal class AdvancedSetting {
[JsonProperty("Шанс получить валюту")]
public Int32 Rare;
[JsonProperty("Сколько выдавать валюты")]
public Int32 Money;
}
}
internal class TransferSetting {
[JsonProperty("Включить обмен валюты на баланс в магазине(GameStores/MoscovOVH)")]
public Boolean TransferStoreUse;
[JsonProperty("URL вашей монеты")]
public String URLMoney;
[JsonProperty("URL валюты для магазина")]
public String URLStores;
[JsonProperty("Сколько монет требуется для обмена")]
public Int32 MoneyCount;
[JsonProperty("Сколько баланса получит игрок после обмена")]
public Int32 StoresMoneyCount;
[JsonProperty("Включить лимит обмена средств")]
public Boolean UseLimits = false;
[JsonProperty("Лимит средств(баланса на магазин)")]
public Int32 LimitBalance = 100;
[JsonProperty("Время лимита(в секундах) (Пример : Установлен лимит 100 баланса, раз в 3600 секунд)")]
public Int32 LimitTime = 3600;
}
internal class ReferenceSetting {
[JsonProperty("Friends : Запретить получение монет за убийство друзей")]
public Boolean FriendsBlockUse;
[JsonProperty("Clans : Запретить получение монет за убийство сокланов")]
public Boolean ClansBlockUse;
[JsonProperty("Duel/Battles : Запретить получение монет за убийство на дуэлях")]
public Boolean DuelBlockUse;
[JsonProperty("MoscovOVH : Включить использование магазина(Должен быть включен обмен валют)")]
public Boolean MoscovOvhUse;
[JsonProperty("GameStores : Включить использование магазина(Должен быть включен обмен валют)")]
public Boolean GameStoreshUse;
[JsonProperty("GameStores : Настройки магазина GameStores")]
public GameStores GameStoresSettings = new GameStores();
[JsonProperty("IQChat : Настройки чата")]
public ChatSetting ChatSettings = new ChatSetting();
internal class ChatSetting {
[JsonProperty("IQChat : Кастомный префикс в чате")]
public String CustomPrefix;
[JsonProperty("IQChat : Кастомный аватар в чате(Если требуется)")]
public String CustomAvatar;
[JsonProperty("IQChat : Использовать UI уведомления")]
public Boolean UIAlertUse;
}
internal class GameStores {
[JsonProperty("API Магазина(GameStores)")]
public String GameStoresAPIStore;
[JsonProperty("ID Магазина(GameStores)")]
public String GameStoresIDStore;
[JsonProperty("Сообщение в магазин при выдаче баланса(GameStores)")]
public String GameStoresMessage;
}
}
public static Configuration GetNewConfiguration() {
return new Configuration {
StartedBalance = 0, UseUI = true, ShowUI = true, UseAlert = true, UseUIMoney = true, TransferSettings = new TransferSetting {
TransferStoreUse = true, MoneyCount = 3, StoresMoneyCount = 1, URLMoney = "https://i.imgur.com/iGwnOyG.png", URLStores = "https://i.imgur.com/fPPzFaE.png", UseLimits = false, LimitBalance = 100, LimitTime = 3600,
}
, GeneralSetting = new GeneralSettings {
DataFileSetting = new GeneralSettings.DataFileSettings {
SaveTime = 360, DetalisWipe = new GeneralSettings.DataFileSettings.DetalisWipeData {
AmountBalance = 0, DayPlayer = 0, TypeClear = TypeData.None,
}
}
, AnimalReward = new GeneralSettings.GeneralSettingReward {
PermissionReward = "", UseReward = true, AdvancedReward = new GeneralSettings.AdvancedSetting {
Rare = 53, Money = 2,
}
,
}
, BarrelReward = new GeneralSettings.GeneralSettingReward {
PermissionReward = "", UseReward = true, AdvancedReward = new GeneralSettings.AdvancedSetting {
Rare = 23, Money = 5,
}
,
}
, BradleyReward = new GeneralSettings.GeneralSettingReward {
PermissionReward = "", UseReward = true, AdvancedReward = new GeneralSettings.AdvancedSetting {
Rare = 44, Money = 100,
}
,
}
, HelicopterReward = new GeneralSettings.GeneralSettingReward {
PermissionReward = "", UseReward = true, AdvancedReward = new GeneralSettings.AdvancedSetting {
Rare = 80, Money = 100,
}
,
}
, KilledReward = new GeneralSettings.GeneralSettingReward {
PermissionReward = "", UseReward = true, AdvancedReward = new GeneralSettings.AdvancedSetting {
Rare = 35, Money = 10,
}
,
}
, NPCReward = new GeneralSettings.GeneralSettingReward {
PermissionReward = "", UseReward = true, AdvancedReward = new GeneralSettings.AdvancedSetting {
Rare = 10, Money = 15,
}
,
}
, TimeReward = new GeneralSettings.TimeSettingsReward {
UseReward = true, PermissionReward = "", OnlineTime = 100, OnlineTimeReward = 10,
}
, GatherReward = new GeneralSettings.GatherSettingReward {
UseReward = true, PermissionReward = "", GatherSetting = new Dictionary<String, GeneralSettings.AdvancedSetting> {
["sulfur.ore"]
= new GeneralSettings.AdvancedSetting {
Rare = 10, Money = 10,
}
, ["stones"] = new GeneralSettings.AdvancedSetting {
Rare = 20, Money = 1,
}
}
,
}
, CollectableReward = new GeneralSettings.GatherSettingReward {
UseReward = true, PermissionReward = "", GatherSetting = new Dictionary<String, GeneralSettings.AdvancedSetting> {
["sulfur.ore"]
= new GeneralSettings.AdvancedSetting {
Rare = 10, Money = 10,
}
, ["stones"] = new GeneralSettings.AdvancedSetting {
Rare = 20, Money = 1,
}
}
,
}
,
}
, CustomMoneySetting = new CustomMoney {
DisplayName = "Монета удачи", Shortname = "bleach", SkinID = 1337228,
}
, ReferenceSettings = new ReferenceSetting {
FriendsBlockUse = true, ClansBlockUse = true, DuelBlockUse = true, MoscovOvhUse = true, GameStoreshUse = false, GameStoresSettings = new ReferenceSetting.GameStores {
GameStoresAPIStore = "", GameStoresIDStore = "", GameStoresMessage = "Успешный обмен"
}
, ChatSettings = new ReferenceSetting.ChatSetting {
CustomAvatar = "", CustomPrefix = "", UIAlertUse = true,
}
}
}
;
}
}
protected override void LoadConfig() {
base.LoadConfig();
try {
config = Config.ReadObject<Configuration>();
if (config == null) LoadDefaultConfig();
}
catch {
PrintWarning("Ошибка #49" + $"чтения конфигурации 'oxide/config/{Name}', создаём новую конфигурацию! #33");
LoadDefaultConfig();
}
NextTick(SaveConfig);
}
protected override void LoadDefaultConfig() => config = Configuration.GetNewConfiguration();
protected override void SaveConfig() => Config.WriteObject(config);
#endregion
#region Data
[JsonProperty("Система экономики")]
public Dictionary<UInt64, InformationData> DataEconomics = new Dictionary<UInt64, InformationData>();
[JsonProperty("Время действующего времени на лимит выводов")]
public Int32 ActualityLimitTime;
void ReadData() {
DataEconomics = Oxide.Core.Interface.Oxide.DataFileSystem.ReadObject<Dictionary<UInt64, InformationData>>("IQEconomic/DataEconomics");
ActualityLimitTime = Oxide.Core.Interface.Oxide.DataFileSystem.ReadObject<Int32>("IQEconomic/ActualityLimitTime");
}
void WriteData() {
Oxide.Core.Interface.Oxide.DataFileSystem.WriteObject("IQEconomic/DataEconomics", DataEconomics);
Oxide.Core.Interface.Oxide.DataFileSystem.WriteObject("IQEconomic/ActualityLimitTime", ActualityLimitTime);
}
void RegisteredDataUser(UInt64 player) {
if (!DataEconomics.ContainsKey(player)) DataEconomics.Add(player, new InformationData {
Balance = config.StartedBalance, Time = 0, LimitBalance = config.TransferSettings.LimitBalance, DateTime = CurrentTime
}
);
else DataEconomics[player].DateTime = CurrentTime;
}
public class InformationData {
[JsonProperty("Баланс игрока")]
public Int32 Balance;
[JsonProperty("Лимит вывода баланса игрока")]
public Int32 LimitBalance;
[JsonProperty("Счетчик времени")]
public Int32 Time;
[JsonProperty("Последний вход игрока на сервер")]
public Double DateTime;
}
private void ClearDataFile() {
Configuration.GeneralSettings.DataFileSettings.DetalisWipeData DataFileSetting = new Configuration.GeneralSettings.DataFileSettings.DetalisWipeData();
switch (DataFileSetting.TypeClear) {
case TypeData.None : break;
case TypeData.AllWipe : {
DataEconomics.Clear();
break;
}
case TypeData.AllWipeOnlyBalance : {
foreach (KeyValuePair<UInt64, InformationData> Data in DataEconomics.Where(x => x.Value.Balance < DataFileSetting.AmountBalance)) NextTick(() => {
DataEconomics.Remove(Data.Key);
}
);
break;
}
case TypeData.TimeClear : {
foreach (KeyValuePair<UInt64, InformationData> Data in DataEconomics.Where(x => (CurrentTime - x.Value.DateTime) > (DataFileSetting.DayPlayer * 86400))) NextTick(() => {
DataEconomics.Remove(Data.Key);
}
);
break;
}
case TypeData.TimeClearOnlyBalance : {
foreach (KeyValuePair<UInt64, InformationData> Data in DataEconomics.Where(x => (CurrentTime - x.Value.DateTime) > (DataFileSetting.DayPlayer * 86400) && x.Value.Balance < DataFileSetting.AmountBalance)) NextTick(() => {
DataEconomics.Remove(Data.Key);
}
);
break;
}
default : break;
}
WriteData();
}
#endregion
#region Command
[ChatCommand("balance")]
void ChatCommandBalance(BasePlayer player) {
SendChat(GetLang("CHAT_MY_BALANCE", player.UserIDString, GetBalance(player.userID)), player);
}
[ChatCommand("transfer")]
void ChatCommandTransfer(BasePlayer player, String cmd, String[] arg) {
if (player == null) return;
if (!config.TransferSettings.TransferStoreUse && arg.Length == 0 || arg == null) {
SendChat(GetLang("TRANSFER_COMMAND_NO_ARGS", player.UserIDString), player);
return;
}
else if(config.TransferSettings.TransferStoreUse && arg.Length == 0 || arg == null) {
Interface_Changer(player);
return;
}
BasePlayer transferPlayer = FindPlayer(arg[0]);
if (transferPlayer == null) {
SendChat(GetLang("BALANCE_CUSTOM_MONEY_NOT_PLAYER", player.UserIDString), player);
return;
}
if(transferPlayer.IsDead()) {
SendChat(GetLang("BALANCE_TRANSFER_TRANSFERPLAYER_DIE", player.UserIDString), player);
return;
}
Regex regex = new Regex("^[0-9]+$");
if (!regex.IsMatch(arg[1])) return;
Int32 Amount;
if (!Int32.TryParse(arg[1], out Amount)) return;
TransferPlayer(player.userID, transferPlayer.userID, Amount);
}
[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;
}
if (!IsTransfer(Balance)) return;
var Transfer = config.TransferSettings;
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);
}
[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);
if (!IsTransfer(Balance)) return;
var Reference = config.ReferenceSettings;
var Transfer = config.TransferSettings;
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);
}
[ConsoleCommand("iq.eco")]
//iq.eco give.store 76561198807822175 300
void IQEconomicCommandsAdmin(ConsoleSystem.Arg arg) {
if (arg.Player() != null && !arg.Player().IsAdmin) return;
switch(arg.Args[0]) {
case "give" : {
if(arg.Args[1] == null || arg.Args[1].Length == 0) {
PrintWarning("Введите ник или ID.Синтаксис : iq.eco give SteamID/Name Amount");
return;
}
String NamaOrID = arg.Args[1];
if(String.IsNullOrWhiteSpace(NamaOrID)) {
PrintWarning("Введите ник или ID");
return;
}
IPlayer iPlayer = covalence.Players.FindPlayer(NamaOrID);
if(iPlayer == null) {
Puts($"Такого игрока не существует");
return;
}
UInt64 userID = UInt64.Parse(iPlayer.Id);
Int32 Balance;
if (!Int32.TryParse(arg.Args[2], out Balance)) {
PrintWarning("Второй аргумент не является числом!");
return;
}
SetBalance(userID, Balance);
Puts($"Игроку {userID} успешно зачислено {Balance} монет");
break;
}
case "remove" : {
String NamaOrID = arg.Args[1];
if (String.IsNullOrWhiteSpace(NamaOrID)) {
PrintWarning("Введите ник или ID");
return;
}
IPlayer iPlayer = covalence.Players.FindPlayer(NamaOrID);
if (iPlayer == null) {
Puts($"Такого игрока не существует");
return;
}
UInt64 userID = UInt64.Parse(iPlayer.Id);
Int32 Balance;
if (!Int32.TryParse(arg.Args[2], out Balance)) {
PrintWarning("Второй аргумент не является числом!");
return;
}
RemoveBalance(userID, Balance);
Puts($"Игроку {userID} успешно снято {Balance} монет");
break;
}
case "give.store" : {
Configuration.ReferenceSetting Reference = config.ReferenceSettings;
String NamaOrID = arg.Args[1];
if (String.IsNullOrWhiteSpace(NamaOrID)) {
PrintWarning("Введите ник или ID");
return;
}
IPlayer iPlayer = covalence.Players.FindPlayer(NamaOrID);
if (iPlayer == null) {
Puts($"Такого игрока не существует");
return;
}
UInt64 userID = UInt64.Parse(iPlayer.Id);
Int32 Balance;
if (!Int32.TryParse(arg.Args[2], out Balance)) {
PrintWarning("Второй аргумент не является числом!");
return;
}
if (Reference.GameStoreshUse) GameStoresBalanceSet(userID, Balance);
if (Reference.MoscovOvhUse) MoscovOVHBalanceSet(userID, Balance);
Puts($"Игроку {userID} успешно зачислено {Balance} на магазин сервера");
break;
}
}
}
#endregion
#region Metods
public 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 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("Лимит баланса был сброшен за пройденное время");
}
public void ConnectedPlayer(BasePlayer player) {
RegisteredDataUser(player.userID);
if (config.UseUI) if (config.UseUIMoney) {
if (config.ShowUI) Interface_Balance(player);
}
else SendChat(GetLang("CHAT_MY_BALANCE", player.UserIDString, GetBalance(player.userID)), player);
DataEconomics[player.userID].Time = Convert.ToInt32(config.GeneralSetting.TimeReward.OnlineTime + CurrentTime);
}
public void TransferPlayer(ulong userID, ulong transferUserID, int Balance ) {
BasePlayer player = BasePlayer.FindByID(userID);
BasePlayer transferPlayer = BasePlayer.FindByID(transferUserID);
if (player == null) return;
if (transferPlayer == null) return;
if (!IsRemoveBalance(player.userID, Balance)) {
SendChat(GetLang("BALANCE_TRANSFER_NO_BALANCE", player.UserIDString), player);
return;
}
RemoveBalance(player.userID, Balance);
SetBalance(transferPlayer.userID, Balance);
SendChat(GetLang("BALANCE_TRANSFER_PLAYER", player.UserIDString, transferPlayer.displayName, Balance), player);
SendChat(GetLang("BALANCE_TRANSFER_TRANSFERPLAYER", transferPlayer.UserIDString, Balance, player.displayName), transferPlayer);
}
public void SetBalance(ulong userID, int SetBalance, ItemContainer cont = null) {
if(!config.UseUI) {
BasePlayer player = BasePlayer.FindByID(userID);
if (player == null) {
PrintWarning(GetLang("BALANCE_CUSTOM_MONEY_NOT_PLAYER"));
return;
}
Item Money = CreateCustomMoney(SetBalance);
ItemContainer itemContainer = cont == null ? player.inventory.containerMain : cont;
if (player.inventory.containerMain.itemList.Count == 24) {
Item FindMoney = player.inventory.containerMain.FindItemsByItemName(Money.info.shortname);
if (FindMoney != null && FindMoney.skin == Money.skin) {
FindMoney.amount += SetBalance;
FindMoney.MarkDirty();
if (config.UseAlert) SendChat(GetLang("BALANCE_SET", player.UserIDString, SetBalance), player);
return;
}
SendChat(GetLang("BALANCE_CUSTOM_MONEY_INVENTORY_FULL", player.UserIDString), player);
Money.Drop(player.transform.position, Vector3.zero);
return;
}
Money.MoveToContainer(itemContainer);
if (config.UseAlert) SendChat(GetLang("BALANCE_SET", player.UserIDString, SetBalance), player);
}
else {
if (IsData(userID)) {
DataEconomics[userID].Balance += SetBalance;
BasePlayer player = BasePlayer.FindByID(userID);
if (player == null) return;
if (config.UseAlert) SendChat(GetLang("BALANCE_SET", player.UserIDString, SetBalance), player);
if (config.ShowUI) Interface_Balance(player);
}
else RegisteredDataUser(userID);
}
Interface.Oxide.CallHook("SET_BALANCE_USER", userID, SetBalance);
}
public void RemoveBalance(ulong userID, int RemoveBalance) {
if (!config.UseUI) {
BasePlayer player = BasePlayer.FindByID(userID);
if (player == null) {
PrintWarning(GetLang("BALANCE_CUSTOM_MONEY_NOT_PLAYER"));
return;
}
if(!IsRemoveBalance(userID, RemoveBalance)) {
PrintWarning(GetLang("BALANCE_CUSTOM_MONEY_NO_COUNT_TAKE"));
return;
}
player.inventory.Take(null, ItemManager.FindItemDefinition(config.CustomMoneySetting.Shortname).itemid, RemoveBalance);
}
else {
if (IsData(userID)) {
DataEconomics[userID].Balance -= RemoveBalance;
BasePlayer player = BasePlayer.FindByID(userID);
if (player == null) return;
if (config.ShowUI) Interface_Balance(player);
}
else RegisteredDataUser(userID);
}
}
public void LimitedUpdate(UInt64 userID, Int32 Amount) {
if (IsLimited(userID, Amount)) return;
DataEconomics[userID].LimitBalance -= Amount;
}
public Int32 GetLimit(UInt64 userID) => DataEconomics[userID].LimitBalance;
#region ReturnMetods
public bool IsRare(int Rare) {
if (Rare >= UnityEngine.Random.Range(0, 100)) return true;
else return false;
}
public Boolean IsLimited(UInt64 userID, Int32 Amount) {
if (config.TransferSettings.UseLimits) return GetLimit(userID) < Amount;
else return false;
}
public bool IsData(ulong userID) {
if (DataEconomics.ContainsKey(userID)) return true;
else return false;
}
public int GetBalance(ulong userID) {
if (config.UseUI) {
if (IsData(userID)) return DataEconomics[userID].Balance;
else return 0;
}
else {
BasePlayer player = BasePlayer.FindByID(userID);
if (player == null) {
PrintWarning(GetLang("BALANCE_CUSTOM_MONEY_NOT_PLAYER"));
return 0;
}
var PMoney = player.inventory.GetAmount(ItemManager.FindItemDefinition(config.CustomMoneySetting.Shortname).itemid);
return PMoney;
}
}
Item CreateCustomMoney(int Amount) {
var CustomMoney = config.CustomMoneySetting;
Item Money = ItemManager.CreateByName(CustomMoney.Shortname, Amount, CustomMoney.SkinID);
Money.name = CustomMoney.DisplayName;
return Money;
}
public bool IsRemoveBalance(ulong userID, int Amount) {
if (GetBalance(userID) >= Amount) return true;
else return false;
}
private BasePlayer FindPlayer(string nameOrId) {
foreach (var check in BasePlayer.activePlayerList) {
if (check.displayName.ToLower().Contains(nameOrId.ToLower()) || check.userID.ToString() == nameOrId) return check;
}
return null;
}
public bool IsTransfer(int Balance) {
var TransferCurse = config.TransferSettings;
if (Balance <= 0) return false;
if (Balance >= TransferCurse.MoneyCount) return true;
else return false;
}
#endregion
#endregion
#region Hooks
void Unload() {
foreach(BasePlayer player in BasePlayer.activePlayerList) {
CuiHelper.DestroyUi(player, UI_BALANCE_PARENT);
CuiHelper.DestroyUi(player, UI_CHANGER_PARENT);
}
WriteData();
}
void OnNewSave(string filename) => ClearDataFile();
private void OnServerShutdown() => Unload();
private void Init() => ReadData();
private void OnServerInitialized() {
foreach (var player in BasePlayer.activePlayerList) OnPlayerConnected(player);
AddAllImage();
if (config.GeneralSetting.TimeReward.UseReward) timer.Every(120f, () => TrackerTime());
if (config.GeneralSetting.DataFileSetting.SaveTime > 0) timer.Every(config.GeneralSetting.DataFileSetting.SaveTime, () => WriteData());
ResetLimit();
}
void OnPlayerConnected(BasePlayer player) => ConnectedPlayer(player);
void OnCollectiblePickup(Item item, BasePlayer player, CollectibleEntity entity) {
if (item == null
// ... [Code preview truncated due to length. Full source in attached file] ...