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

FREE DailyReward : 1.1.1 1.1.1

Нет прав для скачивания
C#:
using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using System;
using System.Collections.Generic;
using UnityEngine;

namespace Oxide.Plugins
{
    [Info("DailyReward", "Fixed RustPlugin.ru", "1.1.1")]
    class DailyReward : RustPlugin
    {
        [PluginReference]
        Plugin ImageLibrary;

        public string GetImage(string shortname, ulong skin = 0) => (string)ImageLibrary.Call("GetImage", shortname, skin);
        public bool AddImage(string url, string shortname, ulong skin = 0) => (bool)ImageLibrary?.Call("AddImage", url, shortname, skin);

        public Dictionary<ulong, DailyPlayer> DailyPlayers = new Dictionary<ulong, DailyPlayer>();

        private List<DailyItem> DailyItems = new List<DailyItem>();

        private class DailyItem
        {
            public string Url { get; set; }
            public string ShortName { get; set; }
            public int Amount { get; set; }
            public string Command { get; set; }
            public int Money { get; set; }
        }

        public class DailyPlayer
        {
            public int Day { get; set; }
            public double Timestamp { get; set; }
        }

        #region UI
        [ChatCommand("dr")]
        void ChatDailyReward(BasePlayer player, string cmd, string[] args)
        {
            DailyRewardUI(player);
        }

        [ConsoleCommand("dr")]
        void CmdDailyReward(ConsoleSystem.Arg arg)
        {
            BasePlayer player = arg.Player();
            if (player == null) return;
            DailyRewardUI(player);
        }

        void DailyRewardUI(BasePlayer player)
        {
            CuiHelper.DestroyUi(player, "DailyRewardUI");
            var DPlayer = DailyPlayers[player.userID];
            CuiElementContainer Container = new CuiElementContainer();
            CreatePanel(Container, "DailyRewardUI", "Hud", "0.87 0.87 0.87 1.00", "0.2 0.1", "0.8 0.9");
            CreateImage(Container, $"DailyItemImgBP", $"DailyRewardUI", GetImage("DRImage"), null, "1 1 1 1", "0 0.8561229", "1 0.9554068");
            CreateImage(Container, $"DailyItemImgBP", $"DailyRewardUI", GetImage("DRImageSnow"), null, "1 1 1 1", "0 0.0003255315", "0.998 0.4641927");
           
            Container.Add(new CuiElement
            {
                Name = "DRCursor",
                Parent = "DailyRewardUI",
                Components = { new CuiNeedsCursorComponent() }
            });
            double Time = DPlayer.Timestamp - GrabCurrentTime() > 0 ? DPlayer.Timestamp - GrabCurrentTime() : 0;
            var Text = GrabCurrentTime() > DPlayer.Timestamp ? "<size=20><color=orange>Нажмите на награду что бы забрать её</color></size>" : $"<size=20><color=orange>Следующая награда через: {FormatTime(TimeSpan.FromSeconds(Time))}</color></size>";
            CreatePanel(Container, "DailyRewardUITop", "DailyRewardUI", "1.00 0.59 0.00 1.00", "0 0.95", "1 1", true);
            CreateTitle(Container, "DailyRewardUITopTitle", "DailyRewardUITop", "<size=20>►Ежедневная награда◄</size>", TextAnchor.MiddleCenter, "0 0", "1 1", "0 0 0 1", "1 -1", true);
            CreateButton(Container, "DailyRewardUIBtnClose", "DailyRewardUI", "1.00 0.59 0.00 1.00", "", "0.685 0.075", "0.9355 0.15", "", "DailyRewardUI");
            CreateButton(Container, "DailyRewardUIBtnRefresh", "DailyRewardUI", "1.00 0.59 0.00 1.00", "dr", "0.685 0.175", "0.9355 0.25", "");
            CreateTitle(Container, "DailyRewardUIBtnTitle", "DailyRewardUIBtnClose", "<size=20>►Закрыть◄</size>", TextAnchor.MiddleCenter, "0 0", "1 1", "0 0 0 1", "1 -1", true);
            CreateTitle(Container, "DailyRewardUIBtnRefreshTitle", "DailyRewardUIBtnRefresh", "<size=20>►Обновить◄</size>", TextAnchor.MiddleCenter, "0 0", "1 1", "0 0 0 1", "1 -1", true);
            CreateTitle(Container, "DailyRewardUITitle", "DailyRewardUI", $"<size=20>{DateTime.Now.ToString("dd/MM/yyyy")}</size>", TextAnchor.MiddleCenter, "0 0.85", "1 0.95", "0 0 0 1", "1 -1", true);
            CreateTitle(Container, $"DailyRewardUIBotTitle", $"DailyRewardUI", Text, TextAnchor.MiddleLeft, "0.075 0.175", "0.8 0.25", "0 0 0 1", "1 -1", true);
            CreateTitle(Container, $"DailyRewardUIBotTitle", $"DailyRewardUI", $"<size=20><color=orange>Получено наград: {DPlayer.Day}</color></size>", TextAnchor.MiddleLeft, "0.075 0.075", "0.4 0.15", "0 0 0 1", "1 -1", true);
            if (DPlayer.Day > 29)
            {
                CreateButton(Container, "DailyRewardUIBtnReward", "DailyRewardUI", "1.00 0.59 0.00 1.00", "dailyrewardget", "0.685 0.275", "0.9355 0.35", "");
                CreateTitle(Container, "DailyRewardUIBtnRewardTitle", "DailyRewardUIBtnReward", "<size=20>Получить награду</size>", TextAnchor.MiddleCenter, "0 0", "1 1", "0 0 0 1", "1 -1", true);
            }
            int i = 0;
            int x = 0, y = 0;
            foreach (var item in DailyItems)
            {
                CreatePanel(Container, $"DailyItem{i}", "DailyRewardUI", "1.00 0.75 0.51 0.80", $"{0.07 + (0.0875 * x)} {0.7375 - (0.135 * y)}", $"{0.145 + (0.0875 * x)} {0.85 - (0.135 * y)}");
                if (DPlayer.Day == i)
                {
                    if (GrabCurrentTime() > DPlayer.Timestamp)
                    {
                        CreatePanel(Container, $"DailyItem{i}", "DailyRewardUI", "0.00 1.00 0.25 0.8", $"{0.07 + (0.0875 * x)} {0.7375 - (0.135 * y)}", $"{0.145 + (0.0875 * x)} {0.85 - (0.135 * y)}");
                        CreateImage(Container, $"DailyItemImg{i}", $"DailyItem{i}", GetImage(item.ShortName), null, "1 1 1 1", "0.1 0.1", "0.9 0.9");
                        CreateTitle(Container, $"DailyItemImgTitle{i}", $"DailyItem{i}", $"{item.Amount}", TextAnchor.LowerCenter, "0 0", "1 1", "0 0 0 1", "1 -1", true);
                        CreateButton(Container, $"DailyItemBtn{i}", $"DailyItem{i}", "0 0 0 0", $"dailyrewardget", "0 0", "1 1", "");
                    }
                    else
                    {
                        CreateImage(Container, $"DailyItemImg{i}", $"DailyItem{i}", GetImage(item.ShortName), null, "1 1 1 1", "0.1 0.1", "0.9 0.9");
                        CreatePanel(Container, $"DailyItemFon{i}", $"DailyItem{i}", "0 0 0 0.5", "0 0", "1 1");
                        CreateTitle(Container, $"DailyItemImgTitle{i}", $"DailyItem{i}", $"Завтра", TextAnchor.MiddleCenter, "0 0", "1 1", "0 0 0 1", "1 -1", true);
                    }
                }
                else if (DPlayer.Day > i)
                {
                    CreateImage(Container, $"DailyItemImg{i}", $"DailyItem{i}", GetImage(item.ShortName), null, "1 1 1 1", "0.1 0.1", "0.9 0.9");
                    CreatePanel(Container, $"DailyItemFon{i}", $"DailyItem{i}", "0 0 0 0.5", "0 0", "1 1");
                    CreateTitle(Container, $"DailyItemImgTitle{i}", $"DailyItem{i}", $"{item.Amount}", TextAnchor.LowerCenter, "0 0", "1 1", "0 0 0 1", "1 -1", true);
                    CreateTitle(Container, $"DailyItemFonTitle{i}", $"DailyItemFon{i}", "<size=30>✓</size>", TextAnchor.MiddleCenter, "0 0", "1 1", "0 0 0 1", "1 -1", true);
                }
                else if (DPlayer.Day < i)
                {
                    CreatePanel(Container, $"DailyItemImg{i}", $"DailyItem{i}", "0.87 0.87 0.87 0.5", "0.1 0.1", "0.9 0.9");
                    CreateImage(Container, $"DailyItemImgBPSnowMan", $"DailyItem{i}", GetImage("DRImageSnowman"), null, "1 1 1 1", "0.15 0.15", "0.85 0.85");
                }
                i++; x++;
                if (x > 9) { y++; x = 0; }
            }
            CuiHelper.AddUi(player, Container);
        }
        #endregion

        [ConsoleCommand("dailyrewardget")]
        void DailyRewardGet(ConsoleSystem.Arg arg)
        {
            if (arg.Player() == null) return;
            DailyPlayer DPlayer = DailyPlayers[arg.Player().userID];
            DailyItem DItem = DailyItems[DPlayer.Day];
            
            if (GrabCurrentTime() > DPlayer.Timestamp)
            {
                DPlayer.Day++;
                DPlayer.Timestamp = GrabCurrentTime() + 86400;
                if (DItem != null)
                {
                    if (string.IsNullOrEmpty(DItem.Command))
                    {
                        Item _item = ItemManager.CreateByName(DItem.ShortName, DItem.Amount);
                        arg.Player().GiveItem(_item);
                    }
                    else
                    {
                        ConsoleSystem.Run(ConsoleSystem.Option.Server, String.Format($"{DItem.Command}", arg.Player().userID));
                        DailyRewardUI(arg.Player());
                    }
                }
                else
                {
                    SendReply(arg.Player(), "kek");
                }
                if (DailyItems.Count <= DPlayer.Day)
                {
                    DPlayer.Day = 0;
                    DPlayer.Timestamp = GrabCurrentTime() + 86400;
                }
                
                DailyRewardUI(arg.Player());
            }
        }

        #region HOOK
        void OnServerInitialized()
        {
            LoadData();
            CheckData();
            foreach (var item in DailyItems)
            {
                if (string.IsNullOrEmpty(item.Url))
                    plugins.Find("ImageLibrary").CallHook("GetImage", item.ShortName, 0, true);
                else
                    AddImage(item.Url, item.ShortName);
            }
            foreach(var img in Images)
            {
                AddImage(img.Key, img.Value);
            }

            foreach (var player in BasePlayer.activePlayerList)
            {
                OnPlayerConnected(player);
            }
        }

        Dictionary<string, string> Images = new Dictionary<string, string>()
        {
            {"https://i.imgur.com/K4h19zN.png", "DRImage"},
            {"https://i.imgur.com/ncj7tVx.png", "DRImageSnow" },
            {"https://i.imgur.com/z0hMt9G.png", "DRImageSnowman" }
        };


        void CheckData()
        {
            foreach (var item in DailyItems)
            {
                if (string.IsNullOrEmpty(item.ShortName))
                {
                    PrintError($"Внимание! У предмета не установлено название!");
                    continue;
                }
                if (string.IsNullOrEmpty(item.Amount.ToString()))
                {
                    PrintError($"Внимание! У предмета {item.ShortName} не установлено количество!");
                    continue;
                }
            }
        }

        void LoadData()
        {
            try
            {
                DailyPlayers = Interface.Oxide.DataFileSystem.ReadObject<Dictionary<ulong, DailyPlayer>>("DailyReward/Players");
            }
            catch
            {
                DailyPlayers = new Dictionary<ulong, DailyPlayer>();
            }
            if (!Interface.Oxide.DataFileSystem.ExistsDatafile("DailyReward/RewardsList"))
            {
                DailyItems.Add(new DailyItem
                {
                    Url = "",

                    ShortName = "supply.signal",
                    Amount = 1,

                    Command = "",
                    Money = 0
                });

                DailyItems.Add(new DailyItem
                {

                    Url = "",
                    ShortName = "stones",
                    Amount = 7500,
                    Command = "",
                    Money = 0
                });
                DailyItems.Add(new DailyItem
                {

                    Url = "",
                    ShortName = "metal.fragments",
                    Amount = 12500,

                    Command = "",
                    Money = 0
                });
                DailyItems.Add(new DailyItem
                {

                    Url = "",

                    ShortName = "scrap",
                    Amount = 350,

                    Command = "",
                    Money = 0
                });
                DailyItems.Add(new DailyItem
                {

                    Url = "",

                    ShortName = "metal.refined",
                    Amount = 200,

                    Command = "",
                    Money = 0
                });
                DailyItems.Add(new DailyItem
                {

                    Url = "",

                    ShortName = "sulfur.ore",
                    Amount = 5000,

                    Command = "",
                    Money = 0
                });

                DailyItems.Add(new DailyItem
                {

                    Url = "",

                    ShortName = "blueberries",
                    Amount = 30,

                    Command = "",
                    Money = 0
                });
                DailyItems.Add(new DailyItem
                {

                    Url = "",

                    ShortName = "gunpowder",
                    Amount = 1500,

                    Command = "",
                    Money = 0
                });
                DailyItems.Add(new DailyItem
                {

                    Url = "",

                    ShortName = "wood",
                    Amount = 17000,

                    Command = "",
                    Money = 0
                });
                DailyItems.Add(new DailyItem
                {

                    Url = "",

                    ShortName = "rifle.semiauto",
                    Amount = 1,

                    Command = "",
                    Money = 0
                });
                DailyItems.Add(new DailyItem
                {

                    Url = "",

                    ShortName = "lowgradefuel",
                    Amount = 1000,

                    Command = "",
                    Money = 0
                });
                DailyItems.Add(new DailyItem
                {

                    Url = "",

                    ShortName = "ammo.rocket.basic",
                    Amount = 1,

                    Command = "",
                    Money = 0
                });
                DailyItems.Add(new DailyItem
                {

                    Url = "",

                    ShortName = "metal.refined",
                    Amount = 300,

                    Command = "",
                    Money = 0
                });
                DailyItems.Add(new DailyItem
                {

                    Url = "",

                    ShortName = "metal.fragments",
                    Amount = 18000,

                    Command = "",
                    Money = 0
                });
                DailyItems.Add(new DailyItem
                {

                    Url = "",

                    ShortName = "wood",
                    Amount = 30000,

                    Command = "",
                    Money = 0
                });
                DailyItems.Add(new DailyItem
                {

                    Url = "",

                    ShortName = "scrap",
                    Amount = 1900,

                    Command = "",
                    Money = 0
                });
                DailyItems.Add(new DailyItem
                {

                    Url = "",

                    ShortName = "sulfur.ore",
                    Amount = 4000,

                    Command = "",
                    Money = 0
                });
                DailyItems.Add(new DailyItem
                {

                    Url = "",

                    ShortName = "ammo.rocket.basic",
                    Amount = 5,

                    Command = "",
                    Money = 0
                });
                DailyItems.Add(new DailyItem
                {

                    Url = "",

                    ShortName = "ammo.rocket.basic",
                    Amount = 1,

                    Command = "",
                    Money = 0
                });
                DailyItems.Add(new DailyItem
                {

                    Url = "",

                    ShortName = "sulfur.ore",
                    Amount = 5000,

                    Command = "",
                    Money = 0
                });
                DailyItems.Add(new DailyItem
                {

                    Url = "",

                    ShortName = "metal.fragments",
                    Amount = 23000,

                    Command = "",
                    Money = 0
                });
                DailyItems.Add(new DailyItem
                {

                    Url = "",

                    ShortName = "metal.refined",
                    Amount = 450,

                    Command = "",
                    Money = 0
                });
                Interface.Oxide.DataFileSystem.WriteObject("DailyReward/RewardsList", DailyItems);
            }
            DailyItems = Interface.Oxide.DataFileSystem.ReadObject<List<DailyItem>>("DailyReward/RewardsList");

        }

        void OnPlayerConnected(BasePlayer player)
        {
            if (!DailyPlayers.ContainsKey(player.userID))
            {
                DailyPlayers.Add(player.userID, new DailyPlayer
                {
                    Day = 0,
                    Timestamp = GrabCurrentTime()
                });
            }
            if (GrabCurrentTime() > DailyPlayers[player.userID].Timestamp)
            {
                DailyRewardUI(player);
            }
        }

        void Unload()
        {
            foreach (BasePlayer player in BasePlayer.activePlayerList)
            {
                CuiHelper.DestroyUi(player, "DailyRewardUI");
            }
            SaveData();
        }

        void OnServerSave()
        {
            SaveData();
        }

        void SaveData()
        {
            Interface.Oxide.DataFileSystem.WriteObject("DailyReward/Players", DailyPlayers);
        }

        public static string FormatTime(TimeSpan time)
        {
            string result = string.Empty;
            if (time.Days != 0)
                result += $"{Format(time.Days, "дней", "дня", "день")} ";

            if (time.Hours != 0)
                result += $"{Format(time.Hours, "часов", "часа", "час")} ";

            if (time.Minutes != 0)
                result += $"{Format(time.Minutes, "минут", "минуты", "минута")} ";

            return result;
        }

        private static string Format(int units, string form1, string form2, string form3)
        {
            var tmp = units % 10;

            if (units >= 5 && units <= 20 || tmp >= 5 && tmp <= 9)
                return $"{units} {form1}";

            if (tmp >= 2 && tmp <= 4)
                return $"{units} {form2}";

            return $"{units} {form3}";
        }

        private double GrabCurrentTime() => DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds;
        #endregion

        #region GUI Template
        private void CreateImage(CuiElementContainer Container, string Name, string Parent, string Png, string Url, string Color, string AnchorMin, string AnchorMax)
        {
            Container.Add(new CuiElement
            {
                Name = Name,
                Parent = Parent,
                Components = {
                        new CuiRawImageComponent {
                            Png = Png,
                            Url = Url,
                            Color = Color,
                        },
                        new CuiRectTransformComponent {
                            AnchorMin = AnchorMin,
                            AnchorMax = AnchorMax
                        }
                    }
            });
        }

        private void CreateButton(CuiElementContainer Container, string Name, string Parent, string Color, string Command, string AnchorMin, string AnchorMax, string Text, string Close = "")
        {
            Container.Add(new CuiButton
            {
                Button = { Color = Color, Command = Command, Close = Close },
                RectTransform = { AnchorMin = AnchorMin, AnchorMax = AnchorMax },
                Text = { Text = Text, Align = TextAnchor.MiddleCenter }
            }, Parent, Name);
        }

        private void CreateTitle(CuiElementContainer Container, string Name, string Parent, string Text, TextAnchor Align, string AnchorMin, string AnchorMax, string OutlineColor, string OutlineDistance, bool UseAlpha)
        {
            Container.Add(new CuiElement
            {
                Name = Name,
                Parent = Parent,
                Components = {
                        new CuiTextComponent {
                            Text = Text,
                            Align = Align
                        },
                        new CuiRectTransformComponent {
                        AnchorMin = AnchorMin,
                        AnchorMax = AnchorMax
                        },
                        new CuiOutlineComponent
                        {
                             Color = OutlineColor,
                             Distance = OutlineDistance,
                             UseGraphicAlpha = UseAlpha
                        }
                    }
            });
        }

        static public void CreatePanel(CuiElementContainer container, string Name, string Parent, string color, string aMin, string aMax, bool cursor = false)
        {
            container.Add(new CuiPanel
            {
                Image = { Color = color },
                RectTransform = { AnchorMin = aMin, AnchorMax = aMax },
                CursorEnabled = cursor
            },
            Parent, Name);
        }
        #endregion
    }
}

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

Другие ресурсы пользователя 15FPS

Сверху