C#:
using System;
using System.Collections.Generic;
using System.Linq;
using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using UnityEngine;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
namespace Oxide.Plugins
{
[Info("FMoney", "molik", "1.0.0")]
class FMoney : RustPlugin
{
Dictionary<ulong, DBSettings> DB = new Dictionary<ulong, DBSettings>();
#region Класс
public class DBSettings
{
public int Minute = 0;
public bool Taked = false;
public bool Menu = false;
}
#endregion
#region Хуки
void OnServerInitialized()
{
if (Interface.Oxide.DataFileSystem.ExistsDatafile("FMoney/PlayerList"))
DB = Oxide.Core.Interface.Oxide.DataFileSystem.ReadObject<Dictionary<ulong, DBSettings>>("FMoney/PlayerList");
timer.Every(360f, SaveDataBase);
InvokeHandler.Instance.InvokeRepeating(GiveMinute, 1f, 1f);
foreach (var player13 in BasePlayer.activePlayerList)
{
OnPlayerConnected(player13);
}
}
void GiveMinute()
{
foreach (var player13 in BasePlayer.activePlayerList)
{
DB[player13.userID].Minute++;
if (DB[player13.userID].Menu)
{
CuiHelper.DestroyUi(player13, "timer");
CuiElementContainer container = new CuiElementContainer();
container.Add(new CuiButton
{
RectTransform = { AnchorMin = $"0 0.5", AnchorMax = $"1 0.5", OffsetMin = "0 -20", OffsetMax = "0 80" },
Button = { Color = "0 0 0 0", },
Text = { Text = CanTake(player13), Align = TextAnchor.MiddleCenter, FontSize = 20 }
}, Layer1, "timer");
CuiHelper.AddUi(player13, container);
}
}
}
void Unload()
{
SaveDataBase();
foreach (var player13 in BasePlayer.activePlayerList)
{
CuiHelper.DestroyUi(player13, Layer);
}
InvokeHandler.Instance.CancelInvoke(GiveMinute);
}
void SaveDataBase()
{
Oxide.Core.Interface.Oxide.DataFileSystem.WriteObject("FMoney/PlayerList", DB);
}
string Layer = "FMoney_Layer";
string Layer1 = "FMoney_Layer2";
string CanTake(BasePlayer player)
{
string text = "ЗАБРАТЬ";
if (DB[player.userID].Taked) return "ПОЛУЧЕНО";
if (DB[player.userID].Minute <= _config.PlayTime && DB[player.userID].Taked == false) return TimeToString(_config.PlayTime - DB[player.userID].Minute);
return text;
}
public string TimeToString(double time)
{
TimeSpan elapsedTime = TimeSpan.FromSeconds(time);
int hours = elapsedTime.Hours;
int minutes = elapsedTime.Minutes;
int seconds = elapsedTime.Seconds;
int days = Mathf.FloorToInt((float)elapsedTime.TotalDays);
string s = "";
if (days > 0) s += $"{days} дн.";
if (hours > 0) s += $"{hours} ч. ";
if (minutes > 0) s += $"{minutes} мин. ";
if (seconds >= 0) s += $"{seconds} сек.";
else s = s.TrimEnd(' ');
return s;
}
[ChatCommand("money")]
void GiveMoney(BasePlayer player)
{
CuiElementContainer container = new CuiElementContainer();
DB[player.userID].Menu = true;
container.Add(new CuiPanel
{
CursorEnabled = true,
RectTransform = { AnchorMin = "0 0", AnchorMax = "1 1", OffsetMax = "0 0" },
Image = { Color = "0.235 0.227 0.180 0.90", Material = "assets/icons/greyout.mat" }
}, "Overlay", Layer);
container.Add(new CuiButton
{
RectTransform = { AnchorMin = $"0 0", AnchorMax = $"1 1", OffsetMin = "0 0", OffsetMax = "0 0" },
Button = { Color = "0 0 0 0", Command = "f_money_close"},
Text = { Text = $"", Align = TextAnchor.MiddleCenter, FontSize = 12, Color = "0.8 0.8 0.8 0" }
}, Layer);
container.Add(new CuiPanel
{
CursorEnabled = true,
RectTransform = { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-210 -100", OffsetMax = "210 100" },
Image = { Color = "0.36 0.34 0.32 0.75", Material = "assets/icons/greyout.mat" }
}, Layer, Layer1);
container.Add(new CuiButton
{
RectTransform = { AnchorMin = $"0 1", AnchorMax = $"1 1", OffsetMin = "0 -40", OffsetMax = "0 10" },
Button = { Color = "0 0 0 0", },
Text = { Text = "БОНУСНЫЙ БАЛАНС", Align = TextAnchor.MiddleCenter, FontSize = 23 }
}, Layer1);
container.Add(new CuiButton
{
RectTransform = { AnchorMin = $"0 0.5", AnchorMax = $"1 0.5", OffsetMin = "0 -50", OffsetMax = "0 0" },
Button = { Color = "0 0 0 0", },
Text = { Text = $"Чтобы получить бонус нужно отыграть:\n{_config.PlayTime / 60} минут!", Align = TextAnchor.MiddleCenter, FontSize = 14, Color = "1 0.6 0 0.8" }
}, Layer1);
int Minute = DB[player.userID].Minute;
container.Add(new CuiButton
{
RectTransform = { AnchorMin = $"0 0.5", AnchorMax = $"1 0.5", OffsetMin = "0 -20", OffsetMax = "0 80" },
Button = { Color = "0 0 0 0", },
Text = { Text = CanTake(player), Align = TextAnchor.MiddleCenter, FontSize = 20 }
}, Layer1, "timer");
container.Add(new CuiButton
{
RectTransform = { AnchorMin = "1 0", AnchorMax = "1 0", OffsetMin = "-236 3", OffsetMax = "-106 33" },
Button = { Color = "0.38 0.71 0.12 0.7", Material = "assets/icons/greyout.mat", Command = Minute == 60 ? "take_reward" : "f_money_close" },
Text = { Text = $"ПОЛУЧИТЬ БОНУС", Align = TextAnchor.MiddleCenter, FontSize = 13, Color = "0.9 0.9 0.9 0.95" }
}, Layer1);
container.Add(new CuiButton
{
RectTransform = { AnchorMin = "1 0", AnchorMax = "1 0", OffsetMin = "-103 3", OffsetMax = "-3 33" },
Button = { Color = "0.46 0.44 0.42 1.00", Material = "assets/icons/greyout.mat", Command = "f_money_close" },
Text = { Text = $"ЗАКРЫТЬ", Align = TextAnchor.MiddleCenter, FontSize = 13, Color = "0.8 0.8 0.8 0.95" }
}, Layer1);
CuiHelper.DestroyUi(player, Layer);
CuiHelper.AddUi(player, container);
}
[ConsoleCommand("f_money_close")]
void CloseGui(ConsoleSystem.Arg args)
{
BasePlayer player = args.Player();
DB[player.userID].Menu = false;
CuiHelper.DestroyUi(player, Layer);
}
[ConsoleCommand("take_reward")]
void TakeReward(ConsoleSystem.Arg args)
{
BasePlayer player = args.Player();
DB[player.userID].Menu = false;
CuiHelper.DestroyUi(player, Layer);
if (DB[player.userID].Minute >= _config.PlayTime && !DB[player.userID].Taked)
{
SendRequest(player);
}
}
private bool errorState = false;
private void SendRequest(BasePlayer p)
{
webrequest.Enqueue($"http://gamestores.app/api?shop_id={_config.ShopID}&secret={_config.APIKey}&action=moneys&type=plus&steam_id={p.UserIDString}&amount={_config.GiveBonus}&mess={"Награда за игру на сервере."}", "", (code, answer) =>
{
var deserializedJSON = JsonConvert.DeserializeObject<Dictionary<string, string>>(answer);
if (code == 200 && deserializedJSON["result"] == "success")
{
p.ChatMessage($"Вам добавлено {_config.GiveBonus} руб. на баланс магазина!");
}
else
{
PrintError($"Error on send request. Code - {code}, answer result - {deserializedJSON["result"]}");
errorState = true;
}
}, this, Core.Libraries.RequestMethod.POST);
}
void OnPlayerConnected(BasePlayer player)
{
if (!DB.ContainsKey(player.userID))
DB.Add(player.userID, new DBSettings());
}
[ChatCommand("take_reward")]
void TakeReward(BasePlayer p)
{
if (!p.IsAdmin)
return;
SendRequest(p);
}
#endregion
#region Cfg
private ConfigData _config;
public class ConfigData
{
[JsonProperty("Номер магазина!")]
public string ShopID = "";
[JsonProperty("Секретный ключ")]
public string APIKey = "";
[JsonProperty("Сколько игроку нужно отыграть чтобы получить бонус (в секундах)")]
public int PlayTime = 3600;
[JsonProperty("Бонус который будет даваться на баланс")]
public int GiveBonus = 50;
public static ConfigData GetNewCong()
{
ConfigData newConfig = new ConfigData();
newConfig.ShopID = "";
newConfig.APIKey = "";
newConfig.PlayTime = 3600;
newConfig.GiveBonus = 50;
return newConfig;
}
}
protected override void LoadConfig()
{
base.LoadConfig();
try
{
_config = Config.ReadObject<ConfigData>();
}
catch
{
LoadDefaultConfig();
}
NextTick(SaveConfig);
}
protected override void LoadDefaultConfig() => _config = ConfigData.GetNewCong();
protected override void SaveConfig() => Config.WriteObject(_config);
#endregion
}
}