C#:
using System;
using System.Collections.Generic;
using Oxide.Core;
using Oxide.Game.Rust.Cui;
using UnityEngine;
namespace Oxide.Plugins
{
[Info("FRulesAgreement", "fufeldev", "1.0.0")]
public class FRulesAgreement : RustPlugin
{
private const string Layer = "FRulesAgreement.Layer";
private const string BlurMat = "assets/content/ui/uibackgroundblur-ingamemenu.mat";
private const string DataFile = "FRulesAgreement/Accepted";
private const string PastelThanks = "#a8e6cf";
private readonly HashSet<ulong> _accepted = new HashSet<ulong>();
private readonly HashSet<ulong> _shown = new HashSet<ulong>();
private class PlayerAccept
{
public ulong SteamId;
public string Name;
public string AcceptedAt;
}
private class StoredData
{
public List<PlayerAccept> Accepted = new List<PlayerAccept>();
}
private StoredData _data;
private readonly Dictionary<ulong, PlayerAccept> _acceptedMap = new Dictionary<ulong, PlayerAccept>();
private void Init()
{
LoadData();
}
private void OnServerInitialized()
{
foreach (var player in BasePlayer.activePlayerList)
{
ShowIfNeed(player);
}
}
private void Unload()
{
foreach (var player in BasePlayer.activePlayerList)
{
if (player == null || !player.IsConnected) continue;
CuiHelper.DestroyUi(player, Layer);
}
_accepted.Clear();
_shown.Clear();
_acceptedMap.Clear();
}
private void OnPlayerInit(BasePlayer player)
{
ShowIfNeed(player);
}
private void OnPlayerConnected(BasePlayer player)
{
ShowIfNeed(player);
}
private void ShowIfNeed(BasePlayer player)
{
if (player == null || !player.IsConnected || player.IsNpc) return;
if (_accepted.Contains(player.userID)) return;
if (_shown.Contains(player.userID)) return;
_shown.Add(player.userID);
timer.Once(4f, () =>
{
if (player == null || !player.IsConnected) return;
if (_accepted.Contains(player.userID)) return;
Show(player);
});
}
private void Show(BasePlayer player)
{
if (player == null || !player.IsConnected) return;
CuiHelper.DestroyUi(player, Layer);
CuiHelper.AddUi(player, BuildUi());
}
[ChatCommand("rules")]
private void CmdRules(BasePlayer player)
{
if (player == null) return;
if (_accepted.Contains(player.userID))
{
player.ChatMessage($"<color={PastelThanks}>Вы уже согласились с правилами.</color>");
return;
}
_shown.Add(player.userID);
Show(player);
}
private CuiElementContainer BuildUi()
{
var c = new CuiElementContainer();
c.Add(new CuiPanel
{
CursorEnabled = true,
RectTransform = { AnchorMin = "0 0", AnchorMax = "1 1" },
Image = { Color = "0 0 0 0.60", Material = BlurMat }
}, "Overlay", Layer);
c.Add(new CuiPanel
{
RectTransform = { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-131 -30", OffsetMax = "131 30" },
Image = { Color = "0.82 0.78 0.74 0.20" }
}, Layer, Layer + ".Panel");
c.Add(new CuiLabel
{
RectTransform = { AnchorMin = "0 1", AnchorMax = "1 1", OffsetMin = "0 -16", OffsetMax = "0 -2" },
Text = { Text = "СОГЛАШЕНИЕ ПРАВИЛ", FontSize = 12, Align = TextAnchor.MiddleCenter, Color = "0.145 0.384 0.549 1", Font = "robotocondensed-bold.ttf" }
}, Layer + ".Panel");
c.Add(new CuiLabel
{
RectTransform = { AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "6 -14", OffsetMax = "-6 8" },
Text = { Text = "Играя на сервере, вы должны иметь откат последних 5 минут по запросу админа. Отказ = блокировка.", FontSize = 9, Align = TextAnchor.MiddleCenter, Color = "0.9 0.9 0.9 0.95", Font = "robotocondensed-regular.ttf" }
}, Layer + ".Panel");
c.Add(new CuiButton
{
RectTransform = { AnchorMin = "0.5 0", AnchorMax = "0.5 0", OffsetMin = "-40 -22", OffsetMax = "40 -8" },
Button = { Color = "0.435 0.541 0.278 1", Command = "frules.accept" },
Text = { Text = "СОГЛАСЕН", FontSize = 9, Align = TextAnchor.MiddleCenter, Color = "0.96 0.96 0.96 1", Font = "robotocondensed-bold.ttf" }
}, Layer + ".Panel");
return c;
}
[ConsoleCommand("frules.accept")]
private void AcceptCmd(ConsoleSystem.Arg arg)
{
var player = arg.Player();
if (player == null) return;
if (_accepted.Contains(player.userID)) return;
var entry = new PlayerAccept
{
SteamId = player.userID,
Name = player.displayName,
AcceptedAt = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss") + " UTC"
};
_accepted.Add(player.userID);
_acceptedMap[player.userID] = entry;
CuiHelper.DestroyUi(player, Layer);
SaveData();
player.ChatMessage($"<color={PastelThanks}>Спасибо за согласие! Приятной игры.</color>");
}
private void LoadData()
{
try
{
_data = Interface.Oxide.DataFileSystem.ReadObject<StoredData>(DataFile) ?? new StoredData();
}
catch
{
_data = new StoredData();
}
_accepted.Clear();
_acceptedMap.Clear();
if (_data.Accepted != null)
{
foreach (var entry in _data.Accepted)
{
if (entry == null || entry.SteamId == 0) continue;
_accepted.Add(entry.SteamId);
_acceptedMap[entry.SteamId] = entry;
}
}
}
private void SaveData()
{
if (_data == null) _data = new StoredData();
_data.Accepted = new List<PlayerAccept>(_acceptedMap.Values);
Interface.Oxide.DataFileSystem.WriteObject(DataFile, _data);
}
}
}