C#:
using System.Linq;
using Oxide.Core;
using System.Collections.Generic;
using System;
using Newtonsoft.Json;
using Oxide.Game.Rust.Cui;
using UnityEngine;
using Oxide.Core.Plugins;
using System.Globalization;
namespace Oxide.Plugins
{
[Info("NameBonus", "Drop Dead", "1.0.0")]
class NameBonus : RustPlugin
{
int amount = 10;
public Dictionary<ulong, bool> Players = new Dictionary<ulong, bool>();
private Dictionary<ulong, int> Cooldowns = new Dictionary<ulong, int>();
private void SaveData()
{
Interface.Oxide.DataFileSystem.WriteObject($"{Title}/Players", Players);
Interface.Oxide.DataFileSystem.WriteObject($"{Title}/Cooldown", Cooldowns);
}
private void LoadData()
{
if (Interface.Oxide.DataFileSystem.ExistsDatafile($"{Title}/Players")) Players = Interface.Oxide.DataFileSystem.ReadObject<Dictionary<ulong, bool>>($"{Title}/Players");
if (Interface.Oxide.DataFileSystem.ExistsDatafile($"{Title}/Cooldown")) Cooldowns = Interface.Oxide.DataFileSystem.ReadObject<Dictionary<ulong, int>>($"{Title}/Cooldown");
}
void OnServerSave()
{
SaveData();
}
void Unload()
{
InvokeHandler.Instance.CancelInvoke(RemoveCooldown);
SaveData();
}
private void OnServerInitialized()
{
LoadData();
foreach (var player in BasePlayer.activePlayerList)
OnPlayerConnected(player);
InvokeHandler.Instance.InvokeRepeating(RemoveCooldown, 1f, 1f);
}
void RemoveCooldown()
{
foreach (var player in BasePlayer.activePlayerList)
{
if (Cooldowns.ContainsKey(player.userID) && Cooldowns[player.userID] != 0)
{
Cooldowns[player.userID] -= 1;
}
if (Cooldowns.ContainsKey(player.userID) && Cooldowns[player.userID] == 0)
{
Cooldowns.Remove(player.userID);
}
}
}
private void OnPlayerConnected(BasePlayer player)
{
if (player.IsNpc) return;
if (player.IsReceivingSnapshot)
{
NextTick(() => OnPlayerConnected(player));
return;
}
if (!Players.ContainsKey(player.userID)) Players.Add(player.userID, false);
if (player.displayName.Contains("#ONYXRUST") || player.displayName.Contains("#onyxrust") && !Cooldowns.ContainsKey(player.userID))
{
player.ChatMessage($"Вы можете получить бонус за приставку <color=#CF1E1E>#ONYXRUST</color> в нике, пропишите <color=#CF1E1E>/bonus</color>");
Players[player.userID] = true;
}
}
[ChatCommand("bonus")]
void ChatForcedEventHandler(BasePlayer player, string command, string[] args)
{
if (player == null) return;
if (Players[player.userID] == false)
{
player.ChatMessage("Вы не можете получить бонус за приставку в нике, так как у Вас её нет");
return;
}
if (Cooldowns.ContainsKey(player.userID) && Cooldowns[player.userID] != 0)
{
player.ChatMessage($"Вы уже получали свой бонус за приставку в нике, получить следующий вы можете через: {TimeToString(Cooldowns[player.userID])}");
return;
}
if (Cooldowns.ContainsKey(player.userID) && Cooldowns[player.userID] == 0)
Cooldowns.Remove(player.userID);
player.ChatMessage($"Вы успешно получили {amount} руб. на магазин за приставку <color=#CF1E1E>#ONYXRUST</color> в нике");
GiveMoney(player.userID, amount);
if (Cooldowns.ContainsKey(player.userID))
Cooldowns[player.userID] = 28800;
else
Cooldowns.Add(player.userID, 28800);
}
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;
}
void GiveMoney(ulong userid, int amount)
{
var plugin = plugins.Find("RustStore");
plugin?.Call("APIChangeUserBalance", userid, amount, new Action<string>((result) =>
{
if (result == "SUCCESS")
{
Interface.Oxide.LogDebug($"Игрок {userid} получил {amount} руб на баланс в магазине за приставку в нике");
return;
}
Interface.Oxide.LogDebug($"Баланс не был изменен, ошибка: {result}");
}));
}
}
}