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

FREE SvUi : 1.3.3 1.3.3

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
 //Thank you for purchasing my plugin!
//It is forbidden to distribute this plugin for free and for a fee.//It is allowed to modify the plugin.//Discord of BUDAPESHTER#7439
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using ConVar;
using Newtonsoft.Json;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using UnityEngine;
namespace Oxide.Plugins {
    [Info("SvUi", "TMK-BUD.RU", "1.3.3")]
    [Description("A great plugin for displaying server events and online players!")]
    class SvUi : RustPlugin {
        private PluginConfig _config;
        public string Layer = "UiPanel";
        public string Layer2 = "UiPanel2";
        [PluginReference]
        Plugin ImageLibrary;
        void OnServerInitialized() {
            Check();
            BasePlayer.activePlayerList.ToList().ForEach(DrawUI);
            foreach (var player in BasePlayer.activePlayerList) DrawInterface(player);
            if (!ImageLibrary) {
                PrintError("The plugin is not installed on the server [ImageLibrary]");
                return;
            }
            ImageLibrary.Call("AddImage", _config.Image.Bred, "bred");
            ImageLibrary.Call("AddImage", _config.Image.Air, "air");
            ImageLibrary.Call("AddImage", _config.Image.Cargo, "cargo");
            ImageLibrary.Call("AddImage", _config.Image.Heli, "heli");
            ImageLibrary.Call("AddImage", _config.Image.Ch, "ch");
        }
        private void OnPlayerDisconnected(BasePlayer player, string reason) {
            foreach (var players in BasePlayer.activePlayerList) {
                timer.Once(1, () => {
                    DrawInterface(players);
                }
                );
            }
        }
        private void OnPlayerConnected(BasePlayer player) {
            foreach (var players in BasePlayer.activePlayerList) {
                timer.Once(1, () => {
                    DrawInterface(players);
                }
                );
            }
            DrawUI(player);
        }
        private void Check() {
            foreach (var entity in BaseNetworkable.serverEntities.Where(p => p is CargoPlane || p is BradleyAPC || p is BaseHelicopter || p is BaseHelicopter || p is CargoShip || p is CH47Helicopter)) {
                if (entity is CargoPlane) IsAir = true;
                if (entity is BradleyAPC) isTank = true;
                if (entity is BaseHelicopter) IsHeli = true;
                if (entity is CargoShip) IsCargo = true;
                if (entity is CH47Helicopter) IsCh = true;
            }
        }
        void Loaded() {
            Puts("Loaded SvUi!");
        }
        private string GetImg(string name) {
            return (string)ImageLibrary?.Call("GetImage", name) ?? "";
        }
        void Unload() {
            foreach (var player in BasePlayer.activePlayerList) {
                CuiHelper.DestroyUi(player, Layer);
                CuiHelper.DestroyUi(player, Layer2);
            }
        }
#region Config
        private class PluginConfig {
            [JsonProperty("MainPanel Settings")]
            public MainSettings MainPanel;
            [JsonProperty("NameServer Settings")]
            public TitleSettings Text;
            [JsonProperty("Image Settings")]
            public ImageSettings Image;
            [JsonProperty("OnlinePanel Settings")]
            public OnlineSettings OnlinePanel;
            [JsonProperty("Bradley Icon Settings")]
            public BradleySettings Bradley;
            [JsonProperty("Air Icon Settings")]
            public AirSettings Air;
            [JsonProperty("Cargo Icon Settings")]
            public CargoSettings Cargo;
            [JsonProperty("Heli Icon Settings")]
            public HeliSettings Heli;
            [JsonProperty("Ch Icon Settings")]
            public ChSettings Ch;
#region MainSettings
            internal class MainSettings {
                [JsonProperty("AnchorMin")]
                public string AnchorMin;
                [JsonProperty("AnchorMax")]
                public string AnchorMax;
                [JsonProperty("OffsetMin")]
                public string OffsetMin;
                [JsonProperty("OffsetMax")]
                public string OffsetMax;
            }
#endregion
#region TitleSettings
            internal class TitleSettings {
                [JsonProperty("AnchorMin")]
                public string AnchorMin;
                [JsonProperty("AnchorMax")]
                public string AnchorMax;
                [JsonProperty("OffsetMin")]
                public string OffsetMin;
                [JsonProperty("OffsetMax")]
                public string OffsetMax;
                [JsonProperty("Align")]
                public TextAnchor Align;
                [JsonProperty("Text color")]
                public string Color;
                [JsonProperty("NameServer")]
                public string TitleText;
                [JsonProperty("Font size")]
                public int SizeFont;
                [JsonProperty("Font")]
                public string Font;
                [JsonProperty("Overlay or Hud")]
                public string UiOver;
                [JsonProperty("Time true/false")]
                public bool TimeUi;
            }
#endregion
#region ImageSettings
            internal class ImageSettings  //images
            {
                [JsonProperty("Color of inactive images")]
                public string Color;
                [JsonProperty("Color of active images")]
                public string ColorAk;
                [JsonProperty("Panel Sprite")]
                public string SpritePanel;
                [JsonProperty("Panel background color")]
                public string ColorPanel;
                [JsonProperty("AnchorMin Panel")]
                public string AnchorMin;
                [JsonProperty("AnchorMax Panel")]
                public string AnchorMax;
                [JsonProperty("OffsetMin Panel")]
                public string OffsetMin;
                [JsonProperty("OffsetMax Panel")]
                public string OffsetMax;
                [JsonProperty("Picture Bradley")]
                public string Bred;
                [JsonProperty("Picture Air")]
                public string Air;
                [JsonProperty("Picture Cargo")]
                public string Cargo;
                [JsonProperty("Picture Heli")]
                public string Heli;
                [JsonProperty("Picture Ch")]
                public string Ch;
            }
#endregion
#region OnlinePanelSettings
            internal class OnlineSettings  //onlinepanel
            {
                [JsonProperty("TextOnline")]
                public string OnlineTxt;
                [JsonProperty("TextOffline")]
                public string OfflineTxt;
                [JsonProperty("TextJoin")]
                public string JoinText;
                [JsonProperty("ColorText")]
                public string ColorText;
                [JsonProperty("Align")]
                public TextAnchor Align;
                [JsonProperty("Text Separator")]
                public string SepText;
                [JsonProperty("Font size")]
                public int SizeFont;
                [JsonProperty("Font")]
                public string Font;
                [JsonProperty("AnchorMin")]
                public string AnchorMin;
                [JsonProperty("AnchorMax")]
                public string AnchorMax;
                [JsonProperty("OffsetMin")]
                public string OffsetMin;
                [JsonProperty("OffsetMax")]
                public string OffsetMax;
            }
#endregion
#region Icon settings
            internal class BradleySettings {
                [JsonProperty("AnchorMin")]
                public string AnchorMin;
                [JsonProperty("AnchorMax")]
                public string AnchorMax;
                [JsonProperty("OffsetMin")]
                public string OffsetMin;
                [JsonProperty("OffsetMax")]
                public string OffsetMax;
            }
            internal class AirSettings {
                [JsonProperty("AnchorMin")]
                public string AnchorMin;
                [JsonProperty("AnchorMax")]
                public string AnchorMax;
                [JsonProperty("OffsetMin")]
                public string OffsetMin;
                [JsonProperty("OffsetMax")]
                public string OffsetMax;
            }
            internal class CargoSettings {
                [JsonProperty("AnchorMin")]
                public string AnchorMin;
                [JsonProperty("AnchorMax")]
                public string AnchorMax;
                [JsonProperty("OffsetMin")]
                public string OffsetMin;
                [JsonProperty("OffsetMax")]
                public string OffsetMax;
            }
            internal class HeliSettings {
                [JsonProperty("AnchorMin")]
                public string AnchorMin;
                [JsonProperty("AnchorMax")]
                public string AnchorMax;
                [JsonProperty("OffsetMin")]
                public string OffsetMin;
                [JsonProperty("OffsetMax")]
                public string OffsetMax;
            }
            internal class ChSettings {
                [JsonProperty("AnchorMin")]
                public string AnchorMin;
                [JsonProperty("AnchorMax")]
                public string AnchorMax;
                [JsonProperty("OffsetMin")]
                public string OffsetMin;
                [JsonProperty("OffsetMax")]
                public string OffsetMax;
            }
#endregion
        }
        protected override void LoadDefaultConfig() {
            _config = new PluginConfig {
                MainPanel = new PluginConfig.MainSettings() {
                    AnchorMin = "0 1", AnchorMax = "0 1", OffsetMin = "0 0", OffsetMax = "0 0",
                }
                , Image = new PluginConfig.ImageSettings() {
                    Color = "0 0 0 0.90", ColorAk = "255 106 0 0.90", ColorPanel = "0 0 0 0.73", SpritePanel = "assets/content/ui/ui.background.transparent.linearltr.tga", Bred = "https://i.ibb.co/pLg31pD/2.png", Air = "https://i.yapx.ru/O47QR.png", Cargo = "https://i.ibb.co/8sxWfrJ/4.png", Heli = "https://i.ibb.co/cXNqzNd/1.png", Ch = "https://cdn.discordapp.com/attachments/676533751190126631/690265099625431227/5.png", AnchorMin = "0 0", AnchorMax = "0 0", OffsetMin = "0 -33", OffsetMax = "320 0"
                }
                , Text = new PluginConfig.TitleSettings() {
                    TitleText = "SERVERNAME", Color = "1 1 1 0.74", SizeFont = 14, AnchorMin = "0 0", AnchorMax = "0 0", Font = "robotocondensed-bold.ttf", OffsetMin = "190 -25", OffsetMax = "310 -2", Align = TextAnchor.MiddleLeft, UiOver="Hud", TimeUi = false
                }
                , OnlinePanel = new PluginConfig.OnlineSettings() {
                    OnlineTxt = "ONLINE", OfflineTxt = "OFFLINE", SizeFont = 10, JoinText = "JOIN", ColorText = "#ffe500", Font = "robotocondensed-bold.ttf", SepText = "|", Align = TextAnchor.MiddleLeft, AnchorMin = "0 0", AnchorMax = "0 0", OffsetMin = "0 -55", OffsetMax = "275 0"
                }
                , Bradley = new PluginConfig.BradleySettings() {
                    AnchorMin = "0 0", AnchorMax = "0 0", OffsetMin = "20 -25", OffsetMax = "45 -5"
                }
                , Air = new PluginConfig.AirSettings() {
                    AnchorMin = "0 0", AnchorMax = "0 0", OffsetMin = "55 -27", OffsetMax = "80 -5"
                }
                , Cargo = new PluginConfig.CargoSettings() {
                    AnchorMin = "0 0", AnchorMax = "0 0", OffsetMin = "90 -25", OffsetMax = "115 -5"
                }
                , Heli = new PluginConfig.HeliSettings() {
                    AnchorMin = "0 0", AnchorMax = "0 0", OffsetMin = "125 -25", OffsetMax = "150 -5"
                }
                , Ch = new PluginConfig.ChSettings() {
                    AnchorMin = "0 0", AnchorMax = "0 0", OffsetMin = "160 -25", OffsetMax = "185 -5"
                }
            }
            ;
        }
        protected override void LoadConfig() {
            base.LoadConfig();
            _config = Config.ReadObject<PluginConfig>();
        }
        protected override void SaveConfig() {
            Config.WriteObject(_config);
        }
#endregion
#region CUI
        private CuiPanel _mainPanel = new CuiPanel() {
            RectTransform = {
                AnchorMin = "0 1", AnchorMax = "0 1", OffsetMin = "0 0", OffsetMax = "0 0"
            }
        }
        ;
        private void DrawInterface(BasePlayer player) {
            if (player == null) return;
            CuiHelper.DestroyUi(player, Layer2);
            var container = new CuiElementContainer();
            var SleepersCount = BasePlayer.sleepingPlayerList.Count.ToString();
            var JoiningCount = ServerMgr.Instance.connectionQueue.Joining.ToString();
            container.Add(_mainPanel, _config.Text.UiOver, Layer2);
            //online
            container.Add(new CuiElement {
                Parent = Layer2, Components = {
                    new CuiTextComponent {
                        Text = $"{_config.OnlinePanel.OnlineTxt}: <color={_config.OnlinePanel.ColorText}>{BasePlayer.activePlayerList.Count}</color> {_config.OnlinePanel.SepText} {_config.OnlinePanel.OfflineTxt}: <color={_config.OnlinePanel.ColorText}>{SleepersCount}</color> {_config.OnlinePanel.SepText} {_config.OnlinePanel.JoinText}: <color={_config.OnlinePanel.ColorText}>{JoiningCount}</color>", Align = TextAnchor.MiddleCenter, FontSize = _config.OnlinePanel.SizeFont, Font = _config.OnlinePanel.Font
                    }
                    , new CuiOutlineComponent {
                        Color = "0 0 0 1", Distance = "0.5 0.5"
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = $"{_config.OnlinePanel.AnchorMin}", AnchorMax = $"{_config.OnlinePanel.AnchorMax}", OffsetMin = $"{_config.OnlinePanel.OffsetMin}", OffsetMax = $"{_config.OnlinePanel.OffsetMax}"
                    }
                }
            }
            );
            CuiHelper.AddUi(player, container);
        }
        void DrawUI(BasePlayer player) {
            if (player == null) return;
            CuiHelper.DestroyUi(player, Layer);
            var container = new CuiElementContainer();
            container.Add(_mainPanel, _config.Text.UiOver, Layer);
            container.Add(new CuiElement {
                Parent = Layer, Components = {
                    new CuiTextComponent() {
                        Color = _config.Text.Color, Text = _config.Text.TitleText, FontSize = _config.Text.SizeFont, Align = _config.Text.Align, Font = _config.Text.Font
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = _config.Text.AnchorMin, AnchorMax = _config.Text.AnchorMax, OffsetMin = _config.Text.OffsetMin, OffsetMax = _config.Text.OffsetMax
                    }
                }
            }
            );
            container.Add(new CuiPanel()  //Bradley icon
            {
                RectTransform = {
                    AnchorMin = $"{_config.Bradley.AnchorMin}", AnchorMax = $"{_config.Bradley.AnchorMax}", OffsetMin = $"{_config.Bradley.OffsetMin}", OffsetMax = $"{_config.Bradley.OffsetMax}"
                }
                , Image = {
                    Color = _config.Image.Color, Png = GetImg("bred")
                }
                ,
            }
            , Layer);
            container.Add(new CuiPanel() //Air icon
            {
                RectTransform = {
                    AnchorMin = $"{_config.Air.AnchorMin}", AnchorMax = $"{_config.Air.AnchorMax}", OffsetMin = $"{_config.Air.OffsetMin}", OffsetMax = $"{_config.Air.OffsetMax}"
                }
                , Image = {
                    Color = _config.Image.Color, Png = GetImg("air")
                }
                ,
            }
            , Layer);
            container.Add(new CuiPanel() //Cargo icon
            {
                RectTransform = {
                    AnchorMin = $"{_config.Cargo.AnchorMin}", AnchorMax = $"{_config.Cargo.AnchorMax}", OffsetMin = $"{_config.Cargo.OffsetMin}", OffsetMax = $"{_config.Cargo.OffsetMax}"
                }
                , Image = {
                    Color = _config.Image.Color, Png = GetImg("cargo")
                }
                ,
            }
            , Layer);
            container.Add(new CuiPanel() //Heli icon
            {
                RectTransform = {
                    AnchorMin = $"{_config.Heli.AnchorMin}", AnchorMax = $"{_config.Heli.AnchorMax}", OffsetMin = $"{_config.Heli.OffsetMin}", OffsetMax = $"{_config.Heli.OffsetMax}"
                }
                , Image = {
                    Color = _config.Image.Color, Png = GetImg("heli")
                }
                ,
            }
            , Layer);
            container.Add(new CuiPanel() //Ch icon
            {
                RectTransform = {
                    AnchorMin = $"{_config.Ch.AnchorMin}", AnchorMax = $"{_config.Ch.AnchorMax}", OffsetMin = $"{_config.Ch.OffsetMin}", OffsetMax = $"{_config.Ch.OffsetMax}"
                }
                , Image = {
                    Color = _config.Image.Color, Png = GetImg("ch")
                }
                ,
            }
            , Layer);
            container.Add(new CuiElement() {
                Parent = Layer, Components = {
                    new CuiImageComponent() {
                        Color = _config.Image.ColorPanel, Sprite = _config.Image.SpritePanel
                    }
                    , new CuiRectTransformComponent() {
                        AnchorMin = $"{_config.Image.AnchorMin}", AnchorMax = $"{_config.Image.AnchorMax}", OffsetMin = $"{_config.Image.OffsetMin}", OffsetMax = $"{_config.Image.OffsetMax}"
                    }
                }
            }
            );
            CuiHelper.AddUi(player, container);
            EventInit(player, "air");
            EventInit(player, "ch");
            EventInit(player, "heli");
            EventInit(player, "cargo");
            EventInit(player, "bradley");
        }
#endregion
#region Check Event
        void OnEntitySpawned(BaseNetworkable entity) {
            if (entity is BaseHelicopter) {
                IsHeli = true;
                foreach (var basePlayer in BasePlayer.activePlayerList) EventInit(basePlayer, "heli");
            }
            else if (entity is BradleyAPC) {
                isTank = true;
                foreach (var basePlayer in BasePlayer.activePlayerList) EventInit(basePlayer, "bradley");
            }
            else if (entity is CargoPlane) {
                IsAir = true;
                foreach (var basePlayer in BasePlayer.activePlayerList) EventInit(basePlayer, "air");
            }
            else if (entity is CargoShip) {
                IsCargo = true;
                foreach (var basePlayer in BasePlayer.activePlayerList) EventInit(basePlayer, "cargo");
            }
            else if (entity is CH47Helicopter) {
                IsCh = true;
                foreach (var basePlayer in BasePlayer.activePlayerList) EventInit(basePlayer, "ch");
            }
        }
        void OnEntityKill(BaseNetworkable entity) {
            if (entity is CargoPlane) {
                IsAir = false;
                foreach (var basePlayer in BasePlayer.activePlayerList) EventInit(basePlayer, "air");
            }
            else if (entity is CargoShip) {
                IsCargo = false;
                foreach (var basePlayer in BasePlayer.activePlayerList) EventInit(basePlayer, "cargo");
            }
            else if (entity is BaseHelicopter) {
                IsHeli = false;
                foreach (var basePlayer in BasePlayer.activePlayerList) EventInit(basePlayer, "heli");
            }
            else if (entity is BradleyAPC) {
                isTank = false;
                foreach (var basePlayer in BasePlayer.activePlayerList) EventInit(basePlayer, "bradley");
            }
            else if (entity is CH47Helicopter) {
                IsCh = false;
                foreach (var basePlayer in BasePlayer.activePlayerList) EventInit(basePlayer, "ch");
            }
        }
#endregion
#region Init event
        private bool IsAir, IsHeli, isTank, IsCargo, IsCh;
        private void EventInit(BasePlayer player, string type) {
            var cont = new CuiElementContainer();
            switch (type) {
                case "bradley" : CuiHelper.DestroyUi(player, Layer + "bred");
                if (isTank) {
                    cont.Add(new CuiButton() {
                        RectTransform = {
                            AnchorMin = "0 0", AnchorMax = "0 0", OffsetMin = "0 0", OffsetMax = "0 0"
                        }
                        , Button = {
                            Command = "", Color = "1 1 1 0.15",
                        }
                        , Text = {
                            Text = $"",
                        }
                    }
                    , Layer, Layer + "bred");
                    cont.Add(new CuiPanel() {
                        RectTransform = {
                            AnchorMin = $"{_config.Bradley.AnchorMin}", AnchorMax = $"{_config.Bradley.AnchorMax}", OffsetMin = $"{_config.Bradley.OffsetMin}", OffsetMax = $"{_config.Bradley.OffsetMax}"
                        }
                        , Image = {
                            Color = _config.Image.ColorAk, Png = GetImg("bred")
                        }
                        ,
                    }
                    , Layer + "bred");
                }
                else {
                    CuiHelper.DestroyUi(player, Layer + "bred");
                }
                CuiHelper.AddUi(player, cont);
                break;
                case "air" : CuiHelper.DestroyUi(player, Layer + "air");
                if (IsAir) {
                    cont.Add(new CuiButton() {
                        RectTransform = {
                            AnchorMin = "0 0", AnchorMax = "0 0", OffsetMin = "0 0", OffsetMax = "0 0"
                        }
                        , Button = {
                            Command = "", Color = "",
                        }
                        , Text = {
                            Text = $"",
                        }
                    }
                    , Layer, Layer + "air");
                    cont.Add(new CuiPanel() {
                        RectTransform = {
                            AnchorMin = $"{_config.Air.AnchorMin}", AnchorMax = $"{_config.Air.AnchorMax}", OffsetMin = $"{_config.Air.OffsetMin}", OffsetMax = $"{_config.Air.OffsetMax}"
                        }
                        , Image = {
                            Color = _config.Image.ColorAk, Png = GetImg("air")
                        }
                        ,
                    }
                    , Layer + "air");
                }
                else {
                    CuiHelper.DestroyUi(player, Layer + "air");
                }
                CuiHelper.AddUi(player, cont);
                break;
                case "cargo" : CuiHelper.DestroyUi(player, Layer + "cargo");
                if (IsCargo) {
                    cont.Add(new CuiButton() {
                        RectTransform = {
                            AnchorMin = "0 0", AnchorMax = "0 0", OffsetMin = "0 0", OffsetMax = "0 0"
                        }
                        , Button = {
                            Command = "", Color = "",
                        }
                        , Text = {
                            Text = $"",
                        }
                    }
                    , Layer, Layer + "cargo");
                    cont.Add(new CuiPanel() {
                        RectTransform = {
                            AnchorMin = $"{_config.Cargo.AnchorMin}", AnchorMax = $"{_config.Cargo.AnchorMax}", OffsetMin = $"{_config.Cargo.OffsetMin}", OffsetMax = $"{_config.Cargo.OffsetMax}"
                        }
                        , Image = {
                            Color = _config.Image.ColorAk, Png = GetImg("cargo")
                        }
                        ,
                    }
                    , Layer + "cargo");
                }
                else {
                    CuiHelper.DestroyUi(player, Layer + "cargo");
                }
                CuiHelper.AddUi(player, cont);
                break;
                case "heli" : if (IsHeli) {
                    cont.Add(new CuiButton() {
                        RectTransform = {
                            AnchorMin = "0 0", AnchorMax = "0 0", OffsetMin = "0 0", OffsetMax = "0 0"
                        }
                        , Button = {
                            Command = "", Color = "",
                        }
                        , Text = {
                            Text = $"",
                        }
                    }
                    , Layer, Layer + "heli");
                    cont.Add(new CuiPanel() {
                        RectTransform = {
                            AnchorMin = $"{_config.Heli.AnchorMin}", AnchorMax = $"{_config.Heli.AnchorMax}", OffsetMin = $"{_config.Heli.OffsetMin}", OffsetMax = $"{_config.Heli.OffsetMax}"
                        }
                        , Image = {
                            Color = _config.Image.ColorAk, Png = GetImg("heli")
                        }
                        ,
                    }
                    , Layer + "heli");
                }
                else {
                    CuiHelper.DestroyUi(player, Layer + "heli");
                }
                CuiHelper.AddUi(player, cont);
                break;
                case "ch" : CuiHelper.DestroyUi(player, Layer + "ch");
                if (IsCh) {
                    cont.Add(new CuiButton() {
                        RectTransform = {
                            AnchorMin = "0 0", AnchorMax = "0 0", OffsetMin = "0 0", OffsetMax = "0 0"
                        }
                        , Button = {
                            Command = "", Color = "",
                        }
                        , Text = {
                            Text = $"",
                        }
                    }
                    , Layer, Layer + "ch");
                    cont.Add(new CuiPanel() {
                        RectTransform = {
                            AnchorMin = $"{_config.Ch.AnchorMin}", AnchorMax = $"{_config.Ch.AnchorMax}", OffsetMin = $"{_config.Ch.OffsetMin}", OffsetMax = $"{_config.Ch.OffsetMax}"
                        }
                        , Image = {
                            Color = _config.Image.ColorAk, Png = GetImg("ch")
                        }
                        ,
                    }
                    , Layer + "ch");
                }
                else {
                    CuiHelper.DestroyUi(player, Layer + "ch");
                }
                CuiHelper.AddUi(player, cont);
                break;
            }
#endregion
        }
    }
}

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