C#:
using Oxide.Core.Plugins;
using System.Text;
using System;
using Oxide.Game.Rust.Cui;
using Newtonsoft.Json;
using Oxide.Core.Libraries.Covalence;
using ConVar;
using System.Text.RegularExpressions;
using System.Linq;
using UnityEngine;
using System.Collections.Generic;
using Oxide.Core;
namespace Oxide.Plugins {
[Info("IQEconomic", "Sempai#3239", "1.2.6")]
[Description("Экономика на ваш сервер")]
class IQEconomic : RustPlugin {
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);
}
void API_TRANSFERS(ulong userID, ulong trasferUserID, int Balance) => TransferPlayer(userID, trasferUserID, Balance);
protected override void LoadDefaultConfig() => config = Configuration.GetNewConfiguration();
bool API_MONEY_TYPE() {
if (!config.UseUI) 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 API_GET_ITEM(int Amount) => CreateCustomMoney(Amount);
void OnCollectiblePickup(CollectibleEntity collectible, BasePlayer player) {
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);
}
}
[JsonProperty("Система экономики")]
public Dictionary<UInt64, InformationData> DataEconomics = new Dictionary<UInt64, InformationData>();
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();
}
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;
}
void API_SET_BALANCE(ulong userID, int Balance, ItemContainer itemContainer = null) => SetBalance(userID, Balance, itemContainer);
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);
}
));
}
private new void LoadDefaultMessages() {
lang.RegisterMessages(new Dictionary<string, string> {
["UI_MY_BALANCE"]
= "<b><size=12>Balance : {0}</size></b>", ["UI_MY_BALANCE_TRANSFER"] = "<b><size=9>Balance : {0}</size></b>", ["CHAT_MY_BALANCE"] = "Your Balance : <color=yellow>{0}</color>", ["BALANCE_CUSTOM_MONEY_NOT_PLAYER"] = "Player not found", ["BALANCE_CUSTOM_MONEY_INVENTORY_FULL"] = "Your inventory is full, coins fell to the floor", ["BALANCE_SET"] = "You have successfully received : {0} money", ["BALANCE_TRANSFER_NO_BALANCE"] = "You do not have so many coins to transfer", ["BALANCE_TRANSFER_PLAYER"] = "You have successfully submitted {0} {1} money", ["BALANCE_TRANSFER_TRANSFERPLAYER"] = "You have successfully received {0} money from {1}", ["BALANCE_CUSTOM_MONEY_NO_COUNT_TAKE"] = "The player does not have as many coins available", ["BALANCE_TRANSFER_TRANSFERPLAYER_DIE"] = "The player is dead, you can’t give him coins", ["TRANSFER_COMMAND_NO_ARGS"] = "Invalid Command\nEnter the correct transfer command transfer [Nick] [Amount Money]", ["UI_CHANGER_TRANSFER"] = "<size=14>EXCHANGE</size>", ["UI_CHANGER_TRANSFER_ALL"] = "<size=14>EXCHANGE ALL</size>", ["UI_CHANGER_TRANSFER_TITLE"] = "Currency exchange system", ["CHAT_MY_BALANCE"] = "Ваш баланс на данный момент : {0}", ["CHAT_NO_AUTH_STORE"] = "You no auth stores", ["CHAT_STORE_SUCCESS"] = "You succes transfers", ["CHAT_LIMITED_PLAYER"] = "You have raised the withdrawal limit, expect the limit to be reset", ["UI_LIMITED_PLAYER"] = "Your available limit : {0}",
}
, this);
lang.RegisterMessages(new Dictionary<string, string> {
["UI_MY_BALANCE"]
= "<b><size=12>Ваш баланс : {0}</size></b>", ["UI_MY_BALANCE_TRANSFER"] = "<b><size=9>Ваш баланс : {0}</size></b>", ["CHAT_MY_BALANCE"] = "Ваш баланс на данный момент : <color=yellow>{0}</color>", ["BALANCE_SET"] = "Вы успешно получили : {0} монет", ["BALANCE_CUSTOM_MONEY_NOT_PLAYER"] = "Такого игрока нет", ["BALANCE_CUSTOM_MONEY_INVENTORY_FULL"] = "Ваш инвентарь полон, монеты выпали на пол", ["BALANCE_CUSTOM_MONEY_NO_COUNT_TAKE"] = "У игрока нет столько монет в наличии", ["BALANCE_TRANSFER_NO_BALANCE"] = "У вас нет столько монет для передачи", ["BALANCE_TRANSFER_PLAYER"] = "Вы успешно передали {0} {1} монет(ы)", ["BALANCE_TRANSFER_TRANSFERPLAYER"] = "Вы успешно получили {0} монет(ы) от {1}", ["BALANCE_TRANSFER_TRANSFERPLAYER_DIE"] = "Игрок мертв,вы не можете передать ему монеты", ["TRANSFER_COMMAND_NO_ARGS"] = "Неверная команда\nВведите корректную команду transfer [Ник] [Количество монет]", ["UI_CHANGER_TRANSFER"] = "<size=14>ОБМЕНЯТЬ</size>", ["UI_CHANGER_TRANSFER_ALL"] = "<size=14>ОБМЕНЯТЬ ВСЕ</size>", ["UI_CHANGER_TRANSFER_TITLE"] = "Система обмена валюты", ["CHAT_MY_BALANCE"] = "Ваш баланс на данный момент : {0}", ["CHAT_NO_AUTH_STORE"] = "Вы не аваторизованы в магазине", ["CHAT_STORE_SUCCESS"] = "Вы успешно обменяли валюту", ["CHAT_LIMITED_PLAYER"] = "Вы привысили лимит на вывод средств, ожидайте обнуление лимита", ["UI_LIMITED_PLAYER"] = "Ваш доступный лимит : {0}",
}
, this, "ru");
PrintWarning("Языковой файл загружен успешно");
}
void WriteData() {
Oxide.Core.Interface.Oxide.DataFileSystem.WriteObject("IQEconomic/DataEconomics", DataEconomics);
Oxide.Core.Interface.Oxide.DataFileSystem.WriteObject("IQEconomic/ActualityLimitTime", ActualityLimitTime);
}
public bool IsTransfer(int Balance) {
var TransferCurse = config.TransferSettings;
if (Balance <= 0) return false;
if (Balance >= TransferCurse.MoneyCount) return true;
else return false;
}
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");
}
[ChatCommand("balance")]
void ChatCommandBalance(BasePlayer player) {
SendChat(GetLang("CHAT_MY_BALANCE", player.UserIDString, GetBalance(player.userID)), player);
}
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;
}
}
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.net.ID)) HeliAttackers.Add(heli.net.ID, new Dictionary<ulong, int>());
if (!HeliAttackers[heli.net.ID].ContainsKey(player.userID)) HeliAttackers[heli.net.ID].Add(player.userID, 0);
HeliAttackers[heli.net.ID][player.userID]++;
}
);
}
}
private Item OnItemSplit(Item item, int amount) {
if (plugins.Find("Stacks") || plugins.Find("CustomSkinsStacksFix") || plugins.Find("SkinBox")) 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;
}
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 bool AddImage(string url, string shortname, ulong skin = 0) => (bool)ImageLibrary?.Call("AddImage", url, shortname, skin);
bool API_IS_USER(ulong userID) => IsData(userID);
private static StringBuilder sb = new StringBuilder();
private void Init() => ReadData();
private ulong GetLastAttacker(uint id) {
int hits = 0;
ulong majorityPlayer = 0U;
if (HeliAttackers.ContainsKey(id)) {
foreach (var score in HeliAttackers[id]) {
if (score.Value > hits) majorityPlayer = score.Key;
}
}
return majorityPlayer;
}
static Double CurrentTime => Facepunch.Math.Epoch.Current;
private static Configuration config = new Configuration();
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;
}
/// <summary>
/// Обновление 1.2.х
/// - Исправлено зачисление валюты за поднятие ресурсов после обновления игры
/// </summary>
[PluginReference]
Plugin IQChat, Friends, Clans, Battles, Duel, RustStore, ImageLibrary, IQSphereEvent;
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);
}
public void LimitedUpdate(UInt64 userID, Int32 Amount) {
if (IsLimited(userID, Amount)) return;
DataEconomics[userID].LimitBalance -= Amount;
}
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 Interface_Changer(BasePlayer player) {
CuiElementContainer container = new CuiElementContainer();
CuiHelper.DestroyUi(player, UI_CHANGER_PARENT);
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.969 18.199"
}
}
, UI_CHANGER_PARENT, "PanelNextVisual");
container.Add(new CuiElement {
Name = "LabelAmountCoin", Parent = UI_CHANGER_PARENT, Components = {
new CuiTextComponent {
Text = $"X{config.TransferSettings.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{config.TransferSettings.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);
}
void OnPlayerConnected(BasePlayer player) => ConnectedPlayer(player);
void OnNewSave(string filename) => ClearDataFile();
bool API_IS_REMOVED_BALANCE(ulong userID, int Amount) => IsRemoveBalance(userID, Amount);
[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;
}
}
}
string API_GET_STORES_IL() {
return "URLStores";
}
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);
}
private TierIQSphereEvent GetTierIQSphereEvent(UInt64 OwnerID) {
switch (OwnerID) {
case 11111 : return TierIQSphereEvent.Under;
case 22222 : return TierIQSphereEvent.Around;
case 33333 : return TierIQSphereEvent.Tier1;
case 44444 : return TierIQSphereEvent.Tier2;
case 55555 : return TierIQSphereEvent.Tier3;
}
return TierIQSphereEvent.None;
}
int API_GET_BALANCE(ulong userID) => GetBalance(userID);
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;
}
[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;
if(Amount <= 0) return;
TransferPlayer(player.userID, transferPlayer.userID, Amount);
}
public string GetLang(string LangKey, string userID = null, params object[] args) {
sb.Clear();
if (args != null) {
sb.AppendFormat(lang.GetMessage(LangKey, this, userID), args);
return sb.ToString();
}
return lang.GetMessage(LangKey, this, userID);
}
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 static string UI_BALANCE_PARENT = "BALANCE_PLAYER_PARENT";
string API_GET_MONEY_IL() {
return "URLMoney";
}
[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);
}
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);
}
));
}
Item CreateCustomMoney(int Amount) {
var CustomMoney = config.CustomMoneySetting;
Item Money = ItemManager.CreateByName(CustomMoney.Shortname, Amount, CustomMoney.SkinID);
Money.name = CustomMoney.DisplayName;
return Money;
}
private class Configuration {
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 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";
}
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,
}
}
,
}
, IQSphereNpcReward = new Dictionary<TierIQSphereEvent, GeneralSettings.GeneralSettingReward> {
[TierIQSphereEvent.Under]
= new GeneralSettings.GeneralSettingReward {
PermissionReward = "", UseReward = true, AdvancedReward = new GeneralSettings.AdvancedSetting {
Rare = 50, Money = 5,
}
,
}
, [TierIQSphereEvent.Around] = new GeneralSettings.GeneralSettingReward {
PermissionReward = "", UseReward = true, AdvancedReward = new GeneralSettings.AdvancedSetting {
Rare = 30, Money = 5,
}
,
}
, [TierIQSphereEvent.Tier1] = new GeneralSettings.GeneralSettingReward {
PermissionReward = "", UseReward = true, AdvancedReward = new GeneralSettings.AdvancedSetting {
Rare = 30, Money = 10,
}
,
}
, [TierIQSphereEvent.Tier2] = new GeneralSettings.GeneralSettingReward {
PermissionReward = "", UseReward = true, AdvancedReward = new GeneralSettings.AdvancedSetting {
Rare = 45, Money = 12,
}
,
}
, [TierIQSphereEvent.Tier3] = new GeneralSettings.GeneralSettingReward {
PermissionReward = "", UseReward = true, AdvancedReward = new GeneralSettings.AdvancedSetting {
Rare = 70, Money = 15,
}
,
}
,
}
}
, 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,
}
}
}
;
}
[JsonProperty("Использовать UI интерфейс для отображения баланса(true - да(Если вы не поставили , чтобы монетки были на руках))/false - информация будет в чате по команде и при входе)")]
public Boolean UseUIMoney;
[JsonProperty("Настройки интерфейса в плагине (Не трогайте, если не понимаете как с этим работать)")]
public Interface InterfaceSetting = new Interface();
[JsonProperty("Настройки обмена валют на баланс в магазине")]
public TransferSetting TransferSettings = new TransferSetting();
[JsonProperty("Монетки будут и гроков на руках - false / Иначе будет чат или интерфейсе - true")]
public Boolean UseUI;
[JsonProperty("Настройки валюты(Если вид экономики - false)")]
public CustomMoney CustomMoneySetting = new CustomMoney();
internal class CustomMoney {
[JsonProperty("SkinID монетки")]
public UInt64 SkinID;
[JsonProperty("Shortname монетки")]
public String Shortname;
[JsonProperty("Название валюты")]
public String DisplayName;
}
[JsonProperty("Отображение интерфейса с балансом(true - отображает/false - скрывает)")]
public Boolean ShowUI;
[JsonProperty("Стартовый баланс для всех игроков")]
public Int32 StartedBalance = 0;
internal class GeneralSettings {
[JsonProperty("Настройка дата-файла")]
public DataFileSettings DataFileSetting = new DataFileSettings();
internal class DataFileSettings {
[JsonProperty("Интервал сохранения дата файла (Установите 0, если не требуется сохранять файл по таймеру)")]
public Int32 SaveTime = 360;
[JsonProperty("Настройка очистки дата-файла")]
// ... [Code preview truncated due to length. Full source in attached file] ...