C#:
using System;
using System.Globalization;
using Oxide.Core.Plugins;
using Oxide.Core.Configuration;
using Oxide.Core.Libraries;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Oxide.Core;
using UnityEngine;
using VLB;
namespace Oxide.Plugins {
[Info("XPSystem", "mabe", "0.0.1")]
class XPSystem : RustPlugin {
private static Configuration Settings = new Configuration();
#region Configuration [Конфиг]
private class Configuration {
public class API {
[JsonProperty("APIKey (Секретный ключ)")]
public string SecretKey = "";
[JsonProperty("ServerID (ИД сервера в сервисе)")]
public string ShopID = "";
}
public class Balance {
[JsonProperty("Сколько денег на баланс магазина будет выдаваться")]
public int Money = 5;
}
public class Gather {
[JsonProperty("Сколько игроку будет выдаваться XP за подбирание ресурсов")]
public float CollectiblePickup = 0.15f;
//Settings.GatherSettings.CollectiblePickup
[JsonProperty("Сколько игроку будет выдаваться XP за подбирание плантации")]
public float CropGather = 0.15f;
//Settings.GatherSettings.CropGather
[JsonProperty("Сколько игроку будет выдаваться XP за фарм камней/дерева")]
public float DispenserGather = 0.5f;
//Settings.GatherSettings.DispenserGather
}
[JsonProperty("Настройки API плагина")]
public API APISettings = new API();
[JsonProperty("Настройка кол-ва выдачи баланса игроку")]
public Balance BalanceSettings = new Balance();
[JsonProperty("Настройка кол-ва выдачи XP с фарма ресурсов")]
public Gather GatherSettings = new Gather();
}
#endregion
#region ConfigLoad / DataFiles [Загрузка конфига и информация в дате]
protected override void LoadConfig() {
base.LoadConfig();
try {
Settings = Config.ReadObject<Configuration>();
if (Settings?.APISettings == null) LoadDefaultConfig();
}
catch {
PrintWarning($"Ошибка в конфиге...Создаю новую конфигурацию!");
LoadDefaultConfig();
}
NextTick(SaveConfig);
}
protected override void LoadDefaultConfig() {
Settings = new Configuration();
}
protected override void SaveConfig() => Config.WriteObject(Settings);
public class Xp {
[JsonProperty("Количество XP у игрока:")]
public float XP {
get;
set;
}
}
private Dictionary<ulong, Xp> XPS {
get;
set;
}
#endregion
#region GameStores [Запрос в GameStores для обмена XP на рубли]
bool LogsPlayer = true;
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://panel.gamestores.ru/api?shop_id={Settings.APISettings.ShopID}&secret={Settings.APISettings.SecretKey}{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 (LogsPlayer) {
LogToFile("logError", $"({DateTime.Now.ToShortTimeString()}): {url}\nCODE {i}: {s}", this);
}
}
else {
if (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
#region XPFromGather [Добыча]
object OnCollectiblePickup(Item item, BasePlayer player) {
XPS[player.userID].XP += Settings.GatherSettings.CollectiblePickup;
return null;
}
object OnCropGather(PlantEntity plant, Item item, BasePlayer player) {
XPS[player.userID].XP += Settings.GatherSettings.CropGather;
return null;
}
object OnDispenserBonus(ResourceDispenser dispenser, BasePlayer player, Item item) {
XPS[player.userID].XP += Settings.GatherSettings.DispenserGather;
return null;
}
#endregion
#region Hooks [Хуки/проверка]
private void OnServerInitialized() {
if (Interface.Oxide.DataFileSystem.ExistsDatafile("XPSystem/Data")) {
XPS = Interface.Oxide.DataFileSystem.ReadObject<Dictionary<ulong, Xp>>("XPTrade/Database");
}
else {
XPS = new Dictionary<ulong, Xp>();
}
BasePlayer.activePlayerList.ForEach(OnPlayerInit);
timer.Every(60, SaveData);
SaveConfig();
}
private void OnPlayerInit(BasePlayer player) {
if (!XPS.ContainsKey(player.userID)) XPS.Add(player.userID, new Xp {
XP = 0
}
);
}
private void SaveData() {
Interface.Oxide.DataFileSystem.WriteObject("XPSystem/Database", XPS);
}
#endregion
#region Commands [Команды]
[ChatCommand("xp")]
private void CmdXp(BasePlayer player, string command, string[] args) {
if (args.Length == 0) {
SendReply(player, $"<size=16>На вашем счету <color=#a5e664>{XPS[player.userID].XP} XP</color></size>\nДля того, чтобы обменять XP - введите: <color=#a5e664>/xp sell</color>\nДля обмена <color=#a5e664>XP</color> требуется <color=#a5e664>100 единиц</color>, за которые вы получите <color=#a5e664>5 рублей</color> на ваш баланс в магазине.");
}
else if (args.Length == 1) {
switch (args[0].ToLower()) {
case "sell" : {
if (XPS[player.userID].XP >= 100) {
SendReply(player, $"<size=14>Ваши <color=#a5e664>XP</color> были переведены в деньги на баланс магазина</size>\nВы получили <color=#a5e664>5 руб.</color> на ваш баланс в магазине!\n<color=#a5e664>В случае не поступления средств сообщите администрации!</color>");
XPS[player.userID].XP -= 100;
MoneyPlus(player.userID, Settings.BalanceSettings.Money);
return;
}
else {
SendReply(player, $"<size=14>Произошла ошибка!</size>\nДля обмена нужно иметь <color=#a5e664>100</color> XP!\nНа вашем счету <color=#a5e664>{XPS[player.userID].XP} XP</color>!");
return;
}
}
}
}
}
[ConsoleCommand("xp.give")]
private void CmdXpgv(ConsoleSystem.Arg args) {
BasePlayer player = args.Player();
BasePlayer target = BasePlayer.Find(args.Args[0]);
if (target != null) {
if (XPS.ContainsKey(target.userID)) {
XPS[target.userID].XP += int.Parse(args.Args[1]);
Puts("Баланс успешно изменен");
}
}
}
#endregion
#region Helpers [Хелперы]
private static string HexToRustFormat(string hex) {
if (string.IsNullOrEmpty(hex)) {
hex = "#FFFFFFFF";
}
var str = hex.Trim('#');
if (str.Length == 6) str += "FF";
if (str.Length != 8) {
throw new Exception(hex);
throw new InvalidOperationException("Cannot convert a wrong format.");
}
var r = byte.Parse(str.Substring(0, 2), NumberStyles.HexNumber);
var g = byte.Parse(str.Substring(2, 2), NumberStyles.HexNumber);
var b = byte.Parse(str.Substring(4, 2), NumberStyles.HexNumber);
var a = byte.Parse(str.Substring(6, 2), NumberStyles.HexNumber);
Color color = new Color32(r, g, b, a);
return $"{color.r:F2} {color.g:F2} {color.b:F2} {color.a:F2}";
}
#endregion
}
}