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

FREE IQSystemFragments : 0.0.4 0.0.4

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

namespace Oxide.Plugins
{
    [Info("IQSystemFragments", "xуй", "0.0.4")]
    [Description("Система фрагментов")]
    class IQSystemFragments : RustPlugin
    {
        #region Vars
        public string ReplaceShortname = "skull.human";
        public string ReplaceShortnameFull = "skull.wolf";
        public enum TypeReward
        {
            Command,
            ItemList,
            IQEconomic,
            CommandList,
        }
        public enum TypeItem
        {
            Fragment,
            Full

        }
        #endregion

        #region Reference
        [PluginReference] Plugin IQChat, IQEconomic;
        public void SetBalance(ulong userID, int Balance) => IQEconomic?.Call("API_SET_BALANCE", userID, Balance);
        public void SendChat(BasePlayer player, string Message, Chat.ChatChannel channel = Chat.ChatChannel.Global)
        {
            var Chat = config.GeneralSetting.ChatSetting;
            if (IQChat)
                IQChat?.Call("API_ALERT_PLAYER", player, Message, Chat.CustomPrefix, Chat.CustomAvatar);
            else player.SendConsoleCommand("chat.add", channel, 0, Message);
        }
        #endregion

        #region Configuration

        private static Configuration config = new Configuration();
        private class Configuration
        {
            [JsonProperty("Настройка плагина")]
            public GeneralSettings GeneralSetting = new GeneralSettings();
            [JsonProperty("Настройка системы фрагментов")]
            public Dictionary<string, ItemSettings> ItemSetting = new Dictionary<string, ItemSettings>();

            internal class GeneralSettings
            {
                [JsonProperty("Настройки IQChat")]
                public ChatSettings ChatSetting = new ChatSettings();
                [JsonProperty("Настройки IQPlagueSkill")]
                public IQPlagueSkills IQPlagueSkill = new IQPlagueSkills();

                internal class ChatSettings
                {
                    [JsonProperty("IQChat : Кастомный префикс в чате")]
                    public string CustomPrefix;
                    [JsonProperty("IQChat : Кастомный аватар в чате(Если требуется)")]
                    public string CustomAvatar;
                }
                internal class IQPlagueSkills
                {
                    [JsonProperty("На сколько увеличить шанс выпадения фрагментов")]
                    public int RareUpFragments;
                    [JsonProperty("На сколько увеличить шанс выпадения полных частей")]
                    public int RareUpFull;
                }
            }

            internal class ItemSettings
            {
                [JsonProperty("Отображаемое имя привилегии")]
                public string DisplayName;
                [JsonProperty("Сколько требуется фрагментов на получение награды")]
                public int AmountFragmets;
                [JsonProperty("SkinID для полного комлпекта")]
                public ulong SkinID;
                [JsonProperty("Настройка фрагментов")]
                public FragmentSettings FragmentSetting = new FragmentSettings();
                [JsonProperty("Настройка награды")]
                public RewardSettings RewardSetting = new RewardSettings();
                [JsonProperty("Настройка выпадения целого фрагмента.[откуда] = шанс")]
                public Dictionary<string, int> DropListRareFull = new Dictionary<string, int>();
                internal class FragmentSettings
                {
                    [JsonProperty("Отображаемое имя фрагмента")]
                    public string DisplayName;
                    [JsonProperty("SkinID фрагмента")]
                    public ulong SkinID;
                    [JsonProperty("Настройка выпадения.[откуда] = шанс")]
                    public Dictionary<string, int> DropListRare = new Dictionary<string, int>();
                }
                internal class RewardSettings
                {
                    [JsonProperty("ТИП ПРИЗА : 0 - Команда  , 1 - Лист предметов, 2 - IQEconomic монеты, 3 - Список команд")]
                    public TypeReward typeReward;
                    [JsonProperty("Команда,которая отыграется,когда игрок заберет приз(ТИП ПРИЗА - 0) %USERID% - заменится на ID игрока")]
                    public string Command;
                    [JsonProperty("Список команд,которые отыграются,когда игрок заберет приз(ТИП ПРИЗА - 3) %USERID% - заменится на ID игрока")]
                    public List<string> CommandList;
                    [JsonProperty("Количество выдаваемых монет(ТИП ПРИЗА - 2)")]
                    public int Balance;
                    [JsonProperty("Настройка предметов из RUST'a(ТИП ПРИЗА - 1)")]
                    public List<ItemRewardSettings> ItemRewardSetting = new List<ItemRewardSettings>();

                    internal class ItemRewardSettings
                    {
                        [JsonProperty("Отображаемое имя(если это не кастомный предмет,оставьте пустым)")]
                        public string DisplayName;
                        [JsonProperty("Shortname предмета")]
                        public string Shortname;
                        [JsonProperty("SkinID предмета")]
                        public ulong SkinID;
                        [JsonProperty("Количество для выдачи")]
                        public int Amount;
                    }
                }
            }

            public static Configuration GetNewConfiguration()
            {
                return new Configuration
                {
                    GeneralSetting = new GeneralSettings
                    {
                        ChatSetting = new GeneralSettings.ChatSettings
                        {
                            CustomAvatar = "",
                            CustomPrefix = "[IQSystemFragments]",
                        },
                    },
                    ItemSetting = new Dictionary<string, ItemSettings>
                    {
                        ["vip"] = new ItemSettings
                        {
                            DisplayName = "ПРИВИЛЕГИЯ VIP",
                            AmountFragmets = 10,
                            SkinID = 2101501999,
                            FragmentSetting = new ItemSettings.FragmentSettings
                            {
                                DisplayName = "Фрагмент VIP",
                                SkinID = 2101501999,
                                DropListRare = new Dictionary<string, int>
                                {
                                    ["crate_normal"] = 50,
                                    ["crate_elite"] = 90,
                                }
                            },
                            DropListRareFull = new Dictionary<string, int>
                            {
                                ["crate_normal"] = 50,
                                ["crate_elite"] = 90,
                            },
                            RewardSetting = new ItemSettings.RewardSettings
                            {
                                typeReward = TypeReward.Command,
                                Command = "say GIVE VIP DURAKU",
                                CommandList = new List<string> { },
                                Balance = 0,
                                ItemRewardSetting = new List<ItemSettings.RewardSettings.ItemRewardSettings> { }
                            }
                        },
                        ["vipPrem"] = new ItemSettings
                        {
                            DisplayName = "НАБОР ПРИВИЛЕГИЙ",
                            AmountFragmets = 10,
                            SkinID = 2101501014,
                            FragmentSetting = new ItemSettings.FragmentSettings
                            {
                                DisplayName = "НАБОР ПРИВИЛЕГИЙ",
                                SkinID = 2101056280,
                                DropListRare = new Dictionary<string, int>
                                {
                                    ["crate_normal"] = 50,
                                    ["crate_elite"] = 90,
                                }
                            },
                            DropListRareFull = new Dictionary<string, int>
                            {
                                ["crate_normal"] = 50,
                                ["crate_elite"] = 90,
                            },
                            RewardSetting = new ItemSettings.RewardSettings
                            {
                                typeReward = TypeReward.CommandList,
                                Command = "",
                                CommandList = new List<string>
                                {
                                    "say 1",
                                    "say 2",
                                    "say 3",
                                },
                                Balance = 0,
                                ItemRewardSetting = new List<ItemSettings.RewardSettings.ItemRewardSettings> { }
                            }
                        },
                        ["recycle"] = new ItemSettings
                        {
                            DisplayName = "ПЕРЕРАБОТЧИК",
                            AmountFragmets = 20,
                            SkinID = 2101500645,
                            FragmentSetting = new ItemSettings.FragmentSettings
                            {
                                DisplayName = "Фрагмент ПЕРЕРАБОТЧИКА",
                                SkinID = 2101057099,
                                DropListRare = new Dictionary<string, int>
                                {
                                    ["crate_normal"] = 50,
                                    ["crate_elite"] = 90,
                                }
                            },
                            DropListRareFull = new Dictionary<string, int>
                            {
                                ["crate_normal"] = 50,
                                ["crate_elite"] = 90,
                            },
                            RewardSetting = new ItemSettings.RewardSettings
                            {
                                typeReward = TypeReward.Command,
                                Command = "say %STEAMID% give ПЕРЕРАБОТЧИК",
                                Balance = 0,
                                CommandList = new List<string> { },
                                ItemRewardSetting = new List<ItemSettings.RewardSettings.ItemRewardSettings> { }
                            }
                        },
                        ["weapons"] = new ItemSettings
                        {
                            DisplayName = "Оружейник",
                            AmountFragmets = 30,
                            SkinID = 2101500148,
                            FragmentSetting = new ItemSettings.FragmentSettings
                            {
                                DisplayName = "Фрагмент Оружейника",
                                SkinID = 2101057796,
                                DropListRare = new Dictionary<string, int>
                                {
                                    ["crate_normal"] = 50,
                                    ["crate_elite"] = 90,
                                }
                            },
                            DropListRareFull = new Dictionary<string, int>
                            {
                                ["crate_normal"] = 50,
                                ["crate_elite"] = 90,
                            },
                            RewardSetting = new ItemSettings.RewardSettings
                            {
                                typeReward = TypeReward.ItemList,
                                Command = "",
                                CommandList = new List<string> { },
                                Balance = 0,
                                ItemRewardSetting = new List<ItemSettings.RewardSettings.ItemRewardSettings>
                                {
                                   new ItemSettings.RewardSettings.ItemRewardSettings
                                   {
                                       DisplayName = "",
                                       Shortname = "rifle.ak",
                                       SkinID = 0,
                                       Amount = 1
                                   },
                                   new ItemSettings.RewardSettings.ItemRewardSettings
                                   {
                                       DisplayName = "",
                                       Shortname = "scrap",
                                       SkinID = 0,
                                       Amount = 1000
                                   },
                                }
                            }
                        },
                    }
                };
            }
        }

        protected override void LoadConfig()
        {
            base.LoadConfig();
            try
            {
                config = Config.ReadObject<Configuration>();
                if (config == null) LoadDefaultConfig();
            }
            catch
            {
                PrintWarning("Ошибка " + $"чтения конфигурации 'oxide/config/{Name}', создаём новую конфигурацию!!");
                LoadDefaultConfig();
            }
            NextTick(SaveConfig);
        }

        protected override void LoadDefaultConfig() => config = Configuration.GetNewConfiguration();
        protected override void SaveConfig() => Config.WriteObject(config);

        #endregion

        #region Data
        [JsonProperty("Фрагменты игроков")] public Dictionary<ulong, Dictionary<string, int>> DataFragments = new Dictionary<ulong, Dictionary<string, int>>();
        void ReadData() => DataFragments = Oxide.Core.Interface.Oxide.DataFileSystem.ReadObject<Dictionary<ulong, Dictionary<string, int>>>("IQSystemFragments/DataFragments");
        void WriteData() => timer.Every(200f, () => { Oxide.Core.Interface.Oxide.DataFileSystem.WriteObject("IQSystemFragments/DataFragments", DataFragments); });
        void RegisteredDataUser(ulong userID)
        {
            if (!DataFragments.ContainsKey(userID))
                DataFragments.Add(userID, new Dictionary<string, int> { });
        }
        void SendData(ulong userID, string Key, int Amount)
        {
            var Fragment = config.ItemSetting[Key];
            if (DataFragments[userID].ContainsKey(Key))
                DataFragments[userID][Key] += Amount;
            else DataFragments[userID].Add(Key, Amount);

            BasePlayer player = BasePlayer.FindByID(userID);
            if (player == null) return;
            SendChat(player, String.Format(lang.GetMessage("NEW_FRAGMENT_USE", this, userID.ToString()), Fragment.DisplayName, (Fragment.AmountFragmets - DataFragments[userID][Key])));
            if (DataFragments[userID][Key] >= Fragment.AmountFragmets)
                FragmentGoToFull(player, Key);
        }
        #endregion

        #region Hooks
        void OnEntitySpawned(BaseNetworkable entity)
        {
            System.Random rnd = new System.Random();
            var values = Enum.GetValues(typeof(TypeItem));
            var myEnumRandom = (TypeItem)values.GetValue(rnd.Next(values.Length));
            SpawnMetods(myEnumRandom, entity);
        }
        object OnItemAction(Item item, string action, BasePlayer player)
        {
            if (item == null || action == null || action != "crush")
                return null;
            if (player == null)
                return null;

            if (item.info.shortname == ReplaceShortname)
            {
                var Fragment = config.ItemSetting.FirstOrDefault(x => x.Value.FragmentSetting.SkinID == item.skin);
                if (Fragment.Value == null)
                {
                    PrintError("Сообщите разработчику");
                    return false;
                }
                SendData(player.userID, Fragment.Key, 1);
            }
            else if (item.info.shortname == ReplaceShortnameFull)
            {
                var Fragment = config.ItemSetting.FirstOrDefault(x => x.Value.SkinID == item.skin);
                if(Fragment.Value == null)
                {
                    PrintError("Сообщите разработчику");
                    return false;
                }
                UnwrapFragmentFull(player, Fragment.Key);
            }
            NextTick(() => { player.inventory.Take(null, ItemManager.FindItemDefinition("bone.fragments").itemid, 20); });
            ItemRemovalThink(item, player, 1);

            return false;
        }
        private static void ItemRemovalThink(Item item, BasePlayer player, int itemsToTake)
        {
            if (item.amount == itemsToTake)
            {
                item.RemoveFromContainer();
                item.Remove();
            }
            else
            {
                item.amount = item.amount - itemsToTake;
                player.inventory.SendSnapshot();
            }
        }
        private void OnServerInitialized()
        {
            ReadData();
            foreach (var p in BasePlayer.activePlayerList)
                OnPlayerConnected(p);
            WriteData();
        }
        void OnPlayerConnected(BasePlayer player) => RegisteredDataUser(player.userID);
        #endregion

        #region Commands

        [ConsoleCommand("iqsf")]
        void ConsoleCommandIQSF(ConsoleSystem.Arg arg)
        {
            if (arg.Args == null || arg.Args.Length == 0)
            {
                PrintWarning("Ошибка синтаксиса#439");
                PrintToConsole("Ошибка синтаксиса");
                return;
            }
            if (String.IsNullOrEmpty(arg.Args[0]) || arg.Args[0] == null || arg.Args[0].Length == 0)
            {
                PrintWarning("Ошибка синтаксиса.Используйте - iqsf give STEAMID fragments/complete KEY");
                return;
            }
            switch (arg.Args[0].ToLower())
            {
                case "give":
                    {
                        ulong SteamID = ulong.Parse(arg.Args[1]);
                        string CaseKey = arg.Args[2];
                        string Key = arg.Args[3];
                        int Amount = Convert.ToInt32(arg.Args[4]);
                        switch (CaseKey)
                        {
                            case "fragments":
                                {
                                    BasePlayer player = BasePlayer.FindByID(SteamID);
                                    if (player == null)
                                    {
                                        PrintWarning("Игрок не в сети!");
                                        return;
                                    }
                                    var Fragment = config.ItemSetting[Key];
                                    var Fragments = (Item)CreateFragment(Fragment.FragmentSetting.DisplayName, Fragment.FragmentSetting.SkinID, ReplaceShortname, Amount);
                                    player.GiveItem(Fragments);

                                    break;
                                }
                            case "complete":
                                {
                                    BasePlayer player = BasePlayer.FindByID(SteamID);
                                    if (player == null)
                                    {
                                        PrintWarning("Игрок не в сети!");
                                        return;
                                    }
                                    var Fragment = config.ItemSetting[Key];
                                    var FragmentsFull = (Item)CreateFragment(Fragment.DisplayName, Fragment.SkinID, ReplaceShortnameFull, Amount);
                                    player.GiveItem(FragmentsFull);
                                    break;
                                }
                        }
                        break;
                    }
                case "debug":
                    {
                        BasePlayer player = arg.Player();
                        if (player == null)
                        {
                            PrintWarning("Данную команду нужно прописывать в игровой консоли");
                            return;
                        }
                        foreach (var Fragment in config.ItemSetting)
                        {
                            var Fragments = (Item)CreateFragment(Fragment.Value.FragmentSetting.DisplayName, Fragment.Value.FragmentSetting.SkinID, ReplaceShortname, 10);
                            player.GiveItem(Fragments);
                            var FragmentsFull = (Item)CreateFragment(Fragment.Value.DisplayName, Fragment.Value.SkinID, ReplaceShortnameFull, 1);
                            player.GiveItem(FragmentsFull);
                        }
                        break;
                    }
            }
        }

        #endregion

        #region Metods
        void SpawnMetods(TypeItem Types, BaseNetworkable entity)
        {
            int RandomIndex = UnityEngine.Random.Range(0, config.ItemSetting.Count);
            var RandomElement = config.ItemSetting.ElementAt(RandomIndex).Value;
            var DropList = Types == TypeItem.Fragment ? RandomElement.FragmentSetting.DropListRare : RandomElement.DropListRareFull;
            if (DropList == null) return;
            if (!DropList.ContainsKey(entity.ShortPrefabName)) return;
            if (!IsRandom(DropList[entity.ShortPrefabName])) return;

            var Item = Types == TypeItem.Fragment ? (Item)CreateFragment(RandomElement.FragmentSetting.DisplayName, RandomElement.FragmentSetting.SkinID, ReplaceShortname, 1)
                                                  : (Item)CreateFragment(RandomElement.DisplayName, RandomElement.SkinID, ReplaceShortnameFull, 1);
            Item?.MoveToContainer(entity.GetComponent<LootContainer>().inventory);
        }
        void FragmentGoToFull(BasePlayer player, string Key)
        {
            var FragmentFull = config.ItemSetting[Key];
            var FragmentsFull = (Item)CreateFragment(FragmentFull.DisplayName, FragmentFull.SkinID, ReplaceShortnameFull);
            player.GiveItem(FragmentsFull);

            if (DataFragments[player.userID].ContainsKey(Key))
                DataFragments[player.userID].Remove(Key);
            SendChat(player, String.Format(lang.GetMessage("NEW_FRAGMENT_FULL", this, player.UserIDString), FragmentFull.DisplayName));
        }
        void UnwrapFragmentFull(BasePlayer player, string Key)
        {
            var Reward = config.ItemSetting[Key].RewardSetting;
            
            switch(Reward.typeReward)
            {
                case TypeReward.Command:
                    {
                        rust.RunServerCommand(Reward.Command.Replace("%USERID%", player.userID.ToString()));
                        break;
                    }
                case TypeReward.ItemList:
                    {
                        foreach (var Item in Reward.ItemRewardSetting)
                        {
                            Item itemS = ItemManager.CreateByName(Item.Shortname, Item.Amount, Item.SkinID);
                            if (!String.IsNullOrEmpty(Item.DisplayName))
                                itemS.name = Item.DisplayName;

                            if (player.inventory.containerMain.itemList.Count < 24)
                                player.GiveItem(itemS);
                            else itemS.Drop(player.transform.position, Vector3.zero);
                        }
                        break;
                    }
                case TypeReward.IQEconomic:
                    {
                        if (!IQEconomic)
                        {
                            PrintWarning("У вас не установлен IQEconomic,плагин работает неккоректно");
                            return;
                        }
                        SetBalance(player.userID, Reward.Balance);
                        break;
                    }
                case TypeReward.CommandList:
                    {
                        foreach (var Command in Reward.CommandList)
                            rust.RunServerCommand(Command.Replace("%USERID%", player.userID.ToString()));
                        break;
                    }
            }
        }

        #region HelpMetods
        public bool IsRandom(int Rare)
        {
            if (Oxide.Core.Random.Range(0, 100) >= (100 - Rare))
                return true;
            else return false;
        }
        private Item CreateFragment(string DisplayName,ulong SkinID, string Shortname, int Amount = 1)
        {
            Item itemS = ItemManager.CreateByName(Shortname, Amount, SkinID);
            itemS.name = DisplayName;
            itemS.info.stackable = 1;
            return itemS;
        }
        private Item OnItemSplit(Item item, int amount)
        {
            if (plugins.Find("Stacks") || plugins.Find("CustomSkinsStacksFix") || plugins.Find("SkinBox")) return null;
            var Item = config.ItemSetting;
            if (item.info.shortname == ReplaceShortname)
            {
                var Fragment = Item.FirstOrDefault(x => x.Value.FragmentSetting.SkinID == item.skin);
                    if (item.skin == Fragment.Value.FragmentSetting.SkinID)
                    {
                        Item x = ItemManager.CreateByPartialName(ReplaceShortname, amount);
                        x.name = Fragment.Value.FragmentSetting.DisplayName;
                        x.skin = Fragment.Value.FragmentSetting.SkinID;
                        x.amount = amount;
                        item.amount -= amount;
                        return x;
                    }
            }
            else if (item.info.shortname == ReplaceShortnameFull)
            {
                var Fragment = Item.FirstOrDefault(x => x.Value.SkinID == item.skin);

                if (item.skin == Fragment.Value.SkinID)
                    {
                        Item x = ItemManager.CreateByPartialName(ReplaceShortnameFull, amount);
                        x.name = Fragment.Value.DisplayName;
                        x.skin = Fragment.Value.SkinID;
                        x.amount = amount;
                        item.amount -= amount;
                        return x;
                    }
            }
            return null;
        }
        object CanCombineDroppedItem(DroppedItem item, DroppedItem targetItem)
        {
            if (item.GetItem().skin != targetItem.GetItem().skin) return false;
            return null;
        }
        object CanStackItem(Item item, Item targetItem)
        {
            if (item.skin != targetItem.skin) return false;
            return null;
        }
        #endregion

        #endregion

        #region Lang
        private new void LoadDefaultMessages()
        {
            lang.RegisterMessages(new Dictionary<string, string>
            {
                ["NEW_FRAGMENT_USE"] = "You have successfully used the fragment {0}\nTo complete the set you need {1} more fragments",
                ["NEW_FRAGMENT_FULL"] = "You have successfully assembled the kit {0}",

            }, this);

            lang.RegisterMessages(new Dictionary<string, string>
            {
                ["NEW_FRAGMENT_USE"] = "Вы успешно использовали фрагмент {0}\nДля полного комплекта вам нужно еще {1} фрагментов",
                ["NEW_FRAGMENT_FULL"] = "Вы успешно собрали комплект {0}",

            }, this, "ru");
            PrintWarning("Языковой файл загружен успешно");
        }
        #endregion
    }
}

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