C#:
using Oxide.Core;
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using System.Linq;
using Oxide.Core.Plugins;
namespace Oxide.Plugins {
[Info("ServerCoins", "https://topplugin.ru/", "1.1.3")]
public class ServerCoins : RustPlugin {
[PluginReference]
private Plugin ServerRewards;
public Dictionary<ulong, int> Coins = new Dictionary<ulong, int>();
#region Classes
public class DataConfig {
[JsonProperty("Использовать GameStores?")]
public bool usegamestores;
[JsonProperty("Использовать Ovh?")]
public bool useovh;
[JsonProperty("Соотношение к выдаче баланса на магазины (например 10 монеток = 5 руб на баланс)")]
public int ratio;
[JsonProperty("Использовать баланс ServerRewards?")]
public bool useserverrewards;
[JsonProperty("Секретный ключ магазина (если используете Ovh или ServerRewards указать рандомное число, например 1")]
public string secret;
[JsonProperty("ID магазина в сервисе (если используете Ovh или ServerRewards указать рандомное число, например 1)")]
public string shopId;
[JsonProperty("Логировать выдачу баланса игрокам?")]
public bool LogsPlayer;
[JsonProperty("Использовать рандом на выдачу баланса? (максимальное число будет использоваться как кол-во монеток в инвентаре игрока, а минимальное как минимальное количество предмета для обмена), если отключено то баланс будет выдаваться в соответствии с кол-вом монеток в инвентаре игрока")]
public bool userandom;
[JsonProperty("Умножать кол-во монеток на n количество баланса ServerRewards?")]
public bool serverrewardsad;
[JsonProperty("На сколько умножать баланс ServerRewards? (например 5 монет - 500 баланса)")]
public int serverrewardsint;
[JsonProperty("Скин предмета")]
public ulong skinId;
[JsonProperty("Имя предмета")]
public string itemName;
[JsonProperty("Описание предмета")]
public string description;
[JsonProperty("Минимальное количество предмета для обмена")]
public int MinItemCount;
[JsonProperty("Шанс выпадения предмета в ящиках")]
public int Chance;
[JsonProperty("Включить рандом на количество спавна предмета в ящиках? (если не используете, будет выпадать по 1 шт.)")]
public bool enablerandom;
[JsonProperty("Минимальное кол-во предмета, которое будет выпадать в ящиках (если используете рандом)")]
public int minamount;
[JsonProperty("Максимальное кол-во предмета, которое будет выпадать в ящиках (если используете рандом)")]
public int maxamount;
[JsonProperty("Список ящиков в которых его спавнить")]
public List<string> ListContainers;
}
#endregion
#region Config
public DataConfig cfg;
protected override void LoadConfig() {
base.LoadConfig();
cfg = Config.ReadObject<DataConfig>();
}
protected override void SaveConfig() {
Config.WriteObject(cfg);
}
protected override void LoadDefaultConfig() {
cfg = new DataConfig() {
usegamestores = true, useovh = false, ratio = 2, useserverrewards = false, secret = "Ни в коем случае не давайте эти данные не доверенным лицам!", shopId = "Ни в коем случае не давайте эти данные не доверенным лицам!", LogsPlayer = true, userandom = true, serverrewardsad = true, serverrewardsint = 100, MinItemCount = 1, skinId = 1865679307, itemName = "<color=#ffb700>MysteryCoin</color>", description = "<size=10>Используется для обмена на реальные деньги</size>", Chance = 100, enablerandom = true, minamount = 1, maxamount = 10, ListContainers = new List<string>() {
{
"crate_basic"
}
, {
"crate_normal"
}
, {
"crate_normal_2"
}
}
,
}
;
}
#endregion
void OnNewSave(string filename) {
Coins.Clear();
SaveData();
Interface.Oxide.ReloadPlugin("ServerCoins");
}
private void SaveData() {
Interface.Oxide.DataFileSystem.WriteObject("ServerCoins/Coins", Coins);
}
private void LoadData() {
if (Interface.Oxide.DataFileSystem.ExistsDatafile("ServerCoins/Coins")) {
Coins = Interface.Oxide.DataFileSystem.ReadObject<Dictionary<ulong, int>>("ServerCoins/Coins");
}
else SaveData();
}
#region OxideHooks
void OnServerInitialized() {
if (cfg.usegamestores && !plugins.Exists("GameStoresRUST")) {
PrintError("Плагин магазина не загружен, дальнейшая работа плагина невозможна!");
return;
}
if (cfg.useovh && !plugins.Exists("RustStore")) {
PrintError("Плагин магазина не загружен, дальнейшая работа плагина невозможна!");
return;
}
if (cfg.useserverrewards && !plugins.Exists("ServerRewards")) {
PrintError("Плагин 'ServerRewards' не загружен, дальнейшая работа плагина невозможна!");
return;
}
LoadData();
}
void OnLootSpawn(LootContainer container) {
if (container == null || container.inventory == null) return;
NextTick(() => {
if (container.ShortPrefabName == "stocking_large_deployed" || container.ShortPrefabName == "stocking_small_deployed") return;
if (cfg.ListContainers.Contains(container.ShortPrefabName)) {
if (UnityEngine.Random.Range(0f, 100f) < cfg.Chance) {
if (container.inventory.itemList.Count == container.inventory.capacity) {
container.inventory.capacity++;
}
if (cfg.enablerandom) {
var amount = UnityEngine.Random.Range(cfg.minamount, cfg.maxamount);
Item x = ItemManager.CreateByName("glue", amount, cfg.skinId);
x.name = cfg.itemName + " " + cfg.description;
x.MoveToContainer(container.inventory);
return;
}
Item i = ItemManager.CreateByName("glue", 1, cfg.skinId);
i.name = cfg.itemName + " " + cfg.description;
i.MoveToContainer(container.inventory);
}
}
}
);
}
private Item OnItemSplit(Item item, int amount) {
if (item != null && item.skin == cfg.skinId) {
Item x = ItemManager.CreateByPartialName("glue", amount);
x.name = cfg.itemName + " " + cfg.description;
x.skin = cfg.skinId;
x.amount = amount;
var amounts = 687;
item.amount -= amount;
item.MarkDirty();
return x;
}
return null;
}
private bool? CanStackItem(Item item, Item targetItem) {
if (item.skin != targetItem.skin) return false;
return null;
}
private bool? CanCombineDroppedItem(DroppedItem item, DroppedItem targetItem) {
if (item.GetItem() == null || targetItem.GetItem() == null) return null;
if (item.GetItem().skin != targetItem.GetItem().skin) return false;
return null;
}
private Item AddItem(BasePlayer p, string name, ulong skin, string shortname, int count) {
Item winitem = ItemManager.CreateByName(shortname, count, skin);
winitem.name = name;
return winitem;
}
#endregion
[ChatCommand("cgive")]
private void GiveHandler(BasePlayer player) {
if (player == null) return;
if (!player.IsAdmin) {
player.ChatMessage("У вас нет доступа к данной команде");
return;
}
Item i = ItemManager.CreateByName("glue", 100, cfg.skinId);
i.name = cfg.itemName + " " + cfg.description;
player.GiveItem(i);
player.ChatMessage($"Вы выдали себе {i.amount} монет в инвентарь!");
}
[ChatCommand("exchange")]
private void ExchangeHandler(BasePlayer player) {
var itemcount = player.inventory.GetAmount(ItemManager.FindItemDefinition("glue").itemid);
if (itemcount < cfg.MinItemCount) {
SendReply(player, $"У вас должно быть минимальное количество монеток для обмена!\nМинимальное количество монеток для обмена: {cfg.MinItemCount}");
return;
}
if (cfg.usegamestores) {
if (cfg.userandom) {
int amount = UnityEngine.Random.Range(cfg.MinItemCount, itemcount);
MoneyPlus(player.userID, amount);
player.inventory.Take(null, ItemManager.FindItemDefinition("glue").itemid, itemcount);
SendReply(player, $"Вы успешно обменяли монетки!\nНа ваш баланс магазина зачислено {amount} руб.\nПриходите ещё!");
return;
}
var amounts = itemcount / cfg.ratio;
MoneyPlus(player.userID, amounts);
player.inventory.Take(null, ItemManager.FindItemDefinition("glue").itemid, itemcount);
SendReply(player, $"Вы успешно обменяли монетки!\nНа ваш баланс магазина зачислено {amounts} руб.\nПриходите ещё!");
return;
}
if (cfg.useovh) {
var plugin = plugins.Find("RustStore");
if (cfg.userandom) {
int amount = UnityEngine.Random.Range(cfg.MinItemCount, itemcount);
plugin?.Call("APIChangeUserBalance", player.userID, amount, new Action<string>((result) => {
if (result == "SUCCESS") {
if (cfg.LogsPlayer) {
Interface.Oxide.LogDebug($"Игрок [{player.displayName}/{player.UserIDString}] получил {itemcount} руб на баланс в магазине");
return;
}
}
if (cfg.LogsPlayer) {
Interface.Oxide.LogDebug($"Баланс не был изменен, ошибка: {result}");
}
}
));
player.inventory.Take(null, ItemManager.FindItemDefinition("glue").itemid, itemcount);
SendReply(player, $"Вы успешно обменяли монетки!\nНа ваш баланс магазина зачислено {amount} руб.\nПриходите ещё!");
return;
}
var amounts = itemcount / cfg.ratio;
plugin?.Call("APIChangeUserBalance", player.userID, amounts, new Action<string>((result) => {
if (result == "SUCCESS") {
if (cfg.LogsPlayer) {
Interface.Oxide.LogDebug($"Игрок [{player.displayName}/{player.UserIDString}] получил {amounts} руб на баланс в магазине");
return;
}
}
if (cfg.LogsPlayer) {
Interface.Oxide.LogDebug($"Баланс не был изменен, ошибка: {result}");
}
}
));
player.inventory.Take(null, ItemManager.FindItemDefinition("glue").itemid, itemcount);
SendReply(player, $"Вы успешно обменяли монетки!\nНа ваш баланс магазина зачислено {amounts} руб.\nПриходите ещё!");
return;
}
if (cfg.useserverrewards) {
if (cfg.userandom) {
if (cfg.serverrewardsad) {
int amounts = UnityEngine.Random.Range(cfg.MinItemCount, itemcount);
var calculate = amounts * cfg.serverrewardsint;
AddPoints(player.userID, calculate);
player.inventory.Take(null, ItemManager.FindItemDefinition("glue").itemid, itemcount);
SendReply(player, $"Вы успешно обменяли монетки!\nНа ваш баланс зачислено {calculate} баллов\nПриходите ещё!");
if (cfg.LogsPlayer) {
Interface.Oxide.LogDebug($"Игрок [{player.displayName}/{player.UserIDString}] получил {calculate} баллов на баланс ServerRewards");
return;
}
return;
}
int amount = UnityEngine.Random.Range(cfg.MinItemCount, itemcount);
AddPoints(player.userID, amount);
player.inventory.Take(null, ItemManager.FindItemDefinition("glue").itemid, itemcount);
SendReply(player, $"Вы успешно обменяли монетки!\nНа ваш баланс зачислено {amount} баллов\nПриходите ещё!");
if (cfg.LogsPlayer) {
Interface.Oxide.LogDebug($"Игрок [{player.displayName}/{player.UserIDString}] получил {amount} баллов на баланс ServerRewards");
}
return;
}
if (cfg.serverrewardsad) {
var calculate = itemcount * cfg.serverrewardsint;
AddPoints(player.userID, calculate);
player.inventory.Take(null, ItemManager.FindItemDefinition("glue").itemid, itemcount);
SendReply(player, $"Вы успешно обменяли монетки!\nНа ваш баланс зачислено {calculate} баллов\nПриходите ещё!");
if (cfg.LogsPlayer) {
Interface.Oxide.LogDebug($"Игрок [{player.displayName}/{player.UserIDString}] получил {calculate} баллов на баланс ServerRewards");
return;
}
return;
;
}
AddPoints(player.userID, itemcount);
player.inventory.Take(null, ItemManager.FindItemDefinition("glue").itemid, itemcount);
SendReply(player, $"Вы успешно обменяли монетки!\nНа ваш баланс зачислено {itemcount} баллов\nПриходите ещё!");
if (cfg.LogsPlayer) {
Interface.Oxide.LogDebug($"Игрок [{player.displayName}/{player.UserIDString}] получил {itemcount} баллов на баланс ServerRewards");
return;
}
return;
}
}
#region Helpers
void AddPoints(ulong playerID, int amount) {
ServerRewards?.Call("AddPoints", playerID, amount);
}
void MoneyPlus(ulong userId, int amount) {
ApiRequestBalance(new Dictionary<string, string>() {
{
"action", "moneys"
}
, {
"type", "plus"
}
, {
"steam_id", userId.ToString()
}
, {
"amount", amount.ToString()
}
}
);
}
void ApiRequestBalance(Dictionary<string, string> args) {
string url = $"http://gamestores.ru/api?shop_id={cfg.shopId}&secret={cfg.secret}{string.Join("", args.Select(arg => $"& {
arg.Key
}
= {
arg.Value
}
").ToArray())}";
webrequest.EnqueueGet(url, (i, s) => {
if (i != 200 && i != 201) {
PrintError($"{url}\nCODE {i}: {s}");
if (cfg.LogsPlayer) {
LogToFile("logError", $"({DateTime.Now.ToShortTimeString()}): {url}\nCODE {i}: {s}", this);
}
}
else {
if (cfg.LogsPlayer) {
LogToFile("logWEB", $"({DateTime.Now.ToShortTimeString()}): " + "Пополнение счета:" + $"{string.Join(" ", args.Select(arg => $" {
arg.Value
}
").ToArray()).Replace("moneys", "").Replace("plus", "")}", this);
}
}
if (i == 201) {
PrintWarning("Плагин не работает!");
Interface.Oxide.UnloadPlugin(Title);
}
}
, this);
}
#endregion
}
}