Иконка ресурса

FREE FRulesAgreement : 1.0.0 1.0.0

Нет прав для скачивания
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);
        }
    }
}

Автор
15FPS
Скачиваний
0
Просмотры
1
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок
Сверху