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

FREE ItemsPerJump : 1.0.0 1.0.0

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System.Collections.Generic;
using ConVar;
using Newtonsoft.Json;
using Oxide.Core;
using UnityEngine;

namespace Oxide.Plugins
{
    [Info("ItemsPerJump", "Bizlich", "1.0.0")]
    [Description("Выдаёт случайные предметы игроку при прыжке.")]
    public class ItemsPerJump : RustPlugin
    {
        private PlayerData playerData;
        private class PlayerData
        {
            public Dictionary<ulong, bool> JumpEnabled = new Dictionary<ulong, bool>();
        }
        private Dictionary<ulong, bool> playerJumped = new Dictionary<ulong, bool>();

        private static Configuration config = new Configuration();
        private class Configuration
        {
            [JsonProperty("SteamID для аватарки в чате")]
            public string ChatAvatar = "";
            [JsonProperty("Полный рандом")]
            public bool useGlobalRandom = true;
            [JsonProperty("Режим (1-Предметы; 2-Категории; 3-Предметы+Категории; 4-Рандом+Предметы; 5-Рандом+Категории; 6-Рандом+Предметы+Категории)")]
            public int mode = 1;
            [JsonProperty("Категории")]
            public Dictionary<string, CategoryConfig> categories = new Dictionary<string, CategoryConfig>();
            [JsonProperty("Предметы")]
            public Dictionary<string, ItemConfig> items = new Dictionary<string, ItemConfig>();
            internal class CategoryConfig
            {
                [JsonProperty("Минимум")]
                public int min = 1;

                [JsonProperty("Максимум")]
                public int max = 1;
            }
            internal class ItemConfig
            {
                [JsonProperty("Минимум")]
                public int min = 1;

                [JsonProperty("Максимум")]
                public int max = 1;
            }
            public static Configuration GetNewConfiguration()
            {
                return new Configuration
                {
                    ChatAvatar = "",
                    useGlobalRandom = true,
                    mode = 1,
                    categories = new Dictionary<string, CategoryConfig>
                    {
                        { "Weapon", new CategoryConfig { min = 1, max = 1 } },
                        { "Construction", new CategoryConfig { min = 1, max = 1 } },
                        { "Items", new CategoryConfig { min = 1, max = 1 } },
                        { "Resources", new CategoryConfig { min = 1, max = 1 } },
                        { "Attire", new CategoryConfig { min = 1, max = 1 } },
                        { "Tool", new CategoryConfig { min = 1, max = 1 } },
                        { "Medical", new CategoryConfig { min = 1, max = 1 } },
                        { "Food", new CategoryConfig { min = 1, max = 1 } },
                        { "Ammunition", new CategoryConfig { min = 1, max = 1 } },
                        { "Traps", new CategoryConfig { min = 1, max = 1 } },
                        { "Misc", new CategoryConfig { min = 1, max = 1 } },
                        { "Component", new CategoryConfig { min = 1, max = 1 } },
                        { "Electrical", new CategoryConfig { min = 1, max = 1 } },
                        { "Fun", new CategoryConfig { min = 1, max = 1 } },
                    },
                    items = new Dictionary<string, ItemConfig>
                    {
                        { "ammo.rifle", new ItemConfig { min = 10, max =  50} },
                        { "ammo.pistol", new ItemConfig { min = 100, max = 500 } }
                    }
                };
            }
        }
        protected override void LoadConfig()
        {
            base.LoadConfig();
            try
            {
                config = Config.ReadObject<Configuration>();
                if (config == null) LoadDefaultConfig();
            }
            catch
            {
                PrintWarning("Ошибка чтения конфигурации, создаём новую!");
                LoadDefaultConfig();
            }
            NextTick(SaveConfig);
        }
        protected override void LoadDefaultConfig() => config = Configuration.GetNewConfiguration();
        protected override void SaveConfig() => Config.WriteObject(config);

        private void LoadData()
        {
            playerData = Interface.Oxide.DataFileSystem.ReadObject<PlayerData>("ItemsPerJump/Players") ?? new PlayerData();
        }

        private void SaveData()
        {
            Interface.Oxide.DataFileSystem.WriteObject("ItemsPerJump/Players", playerData);
        }

        private void OnServerInitialized()
        {   
            LoadData();
            SaveData();
        }

        private void Unload()
        {
            SaveData();
        }

        private void OnPlayerConnected(BasePlayer player)
        {
            if (!playerData.JumpEnabled.ContainsKey(player.userID))
                playerData.JumpEnabled[player.userID] = true;

            SaveData();
        }

        [ChatCommand("jump")]
        private void ToggleJump(BasePlayer player, string command, string[] args)
        {
            if (args.Length == 1)
            {
                string option = args[0].ToLower();
                switch (option)
                {
                    case "on":
                        if(!playerData.JumpEnabled[player.userID])
                        {
                            playerData.JumpEnabled[player.userID] = true;
                            SaveData();
                            SendChat(player, "Выдача предметов при прыжке <color=green>включена</color>.", config.ChatAvatar);
                            //SendReply(player, "Выдача предметов при прыжке <color=green>включена</color>.");
                        }
                        else
                            SendChat(player, "Выдача уже включена.", config.ChatAvatar);
                            //SendReply(player, "Выдача уже включена.");
                        break;
                    case "off":
                        if(playerData.JumpEnabled[player.userID])
                        {
                            playerData.JumpEnabled[player.userID] = false;
                            SaveData();
                            SendChat(player, "Выдача предметов при прыжке <color=red>выключена</color>.", config.ChatAvatar);
                            //SendReply(player, "Выдача предметов при прыжке <color=red>выключена</color>.");
                        }
                        else
                            SendChat(player, "Выдача уже выключена.", config.ChatAvatar);
                            //SendReply(player, "Выдача уже выключена.");
                        break;
                    default:
                        SendChat(player, "Использование: /jump on | off", config.ChatAvatar);
                        //SendReply(player, "Использование: /jump on | off");
                    break;
                }
            }
            else
                SendChat(player, "Использование: /jump on | off", config.ChatAvatar);
                //SendReply(player, "Использование: /jump on | off");
        }

        [ConsoleCommand("jumpon")]
        private void cmdJumpOn(ConsoleSystem.Arg arg)
        {
            var player = arg.Player();

            if (player == null)
            {
                arg.ReplyWith("Эту команду могут использовать только игроки.");
                return;
            }

            if (!playerData.JumpEnabled[player.userID])
            {
                playerData.JumpEnabled[player.userID] = true;
                SaveData();
                SendChat(player, "Выдача предметов при прыжке <color=yellow>включена</color>.", config.ChatAvatar);
                //SendReply(player, "Выдача предметов при прыжке <color=yellow>включена</color>.");
            }
            else
                SendChat(player, "Выдача уже включена.", config.ChatAvatar);
                //SendReply(player, "Выдача уже включена.");
        }

        [ConsoleCommand("jumpoff")]
        private void cmdJumpOff(ConsoleSystem.Arg arg)
        {
            var player = arg.Player();

            if (player == null)
            {
                arg.ReplyWith("Эту команду могут использовать только игроки.");
                return;
            }

            if(playerData.JumpEnabled[player.userID])
            {
                playerData.JumpEnabled[player.userID] = false;
                SaveData();
                SendChat(player, "Выдача предметов при прыжке <color=red>выключена</color>.", config.ChatAvatar);
                //SendReply(player, "Выдача предметов при прыжке <color=red>выключена</color>.");
            }
            else
                SendChat(player, "Выдача уже выключена.", config.ChatAvatar);
                //SendReply(player, "Выдача уже выключена.");
        }

        private void OnPlayerTick(BasePlayer player)
        {
            if (player == null || !player.IsConnected || player.IsDead())
                return;

            if (!playerData.JumpEnabled.ContainsKey(player.userID) || !playerData.JumpEnabled[player.userID])
                return;

            bool isGrounded = player.IsOnGround();
            bool wasJumping;

            if (!playerJumped.TryGetValue(player.userID, out wasJumping))
            {
                playerJumped[player.userID] = false;
                wasJumping = false;
            }

            if (!isGrounded && !wasJumping)
            {
                playerJumped[player.userID] = true;
                GiveItem(player);
            }
            else if (isGrounded && wasJumping)
            {       
                playerJumped[player.userID] = false;
            }
        }

        private void GiveItem(BasePlayer player)
        {
            if (player.inventory.containerMain.IsFull() && player.inventory.containerBelt.IsFull())
            {
                player.ChatMessage("<color=red>У вас полный инвентарь!</color>");
                return;
            }

            Item newItem = null;

            if (config.useGlobalRandom)
            {
                newItem = GetRandomItemFromAll();
            }
            else
            {
                switch (config.mode)
                {
                    case 1:
                        newItem = GetItemFromConfig();
                        break;
                    case 2:
                        newItem = GetItemFromCategory();
                        break;
                    case 3:
                        newItem = GetItemFromConfigAndCategory();
                        break;
                    case 4:
                        newItem = GetRandomItemFromAllWithOverrideByConfigItems();
                        break;
                    case 5:
                        newItem = GetRandomItemFromAllWithOverrideByConfigCategories();
                        break;
                    case 6:
                        newItem = GetRandomItemFromAllWithOverrideByConfigItemsAndCategories();
                        break;
                }
            }

            if (newItem != null && newItem.amount != 0)
                player.GiveItem(newItem);
        }

        // Полный рандом из всех предметов
        private Item GetRandomItemFromAll()
        {
            List<int> itemIDs = ItemManager.itemList.ConvertAll(i => i.itemid);
            int randomItemID = itemIDs[UnityEngine.Random.Range(0, itemIDs.Count)];
            return ItemManager.CreateByItemID(randomItemID, 1);
        }

        // 1.Рандом из того, что в предметах
        private Item GetItemFromConfig()
        {
            List<string> itemNames = new List<string>(config.items.Keys);
            string randomItemName = itemNames[UnityEngine.Random.Range(0, itemNames.Count)];
            var itemConfig = config.items[randomItemName];
            int amount = UnityEngine.Random.Range(itemConfig.min, itemConfig.max + 1);
            return ItemManager.CreateByName(randomItemName, amount);
        }

        // 2.Рандом из того, что в категориях
        private Item GetItemFromCategory()
        {
            List<ItemDefinition> possibleItems = new List<ItemDefinition>();

            foreach (var category in config.categories)
            {
                ItemCategory itemCategory = (ItemCategory)System.Enum.Parse(typeof(ItemCategory), category.Key);
                possibleItems.AddRange(ItemManager.itemList.FindAll(i => i.category == itemCategory));
            }

            if (possibleItems.Count > 0)
            {
                ItemDefinition randomItemDef = possibleItems[UnityEngine.Random.Range(0, possibleItems.Count)];
                var categoryConfig = config.categories[randomItemDef.category.ToString()];
                int amount = UnityEngine.Random.Range(categoryConfig.min, categoryConfig.max + 1);
                return ItemManager.Create(randomItemDef, amount);
            }

            return null;
        }

        // 3.Рандом из того, что в предметах и категориях
        private Item GetItemFromConfigAndCategory()
        {
            if (UnityEngine.Random.Range(0, 2) == 0)
                return GetItemFromConfig();
            else
                return GetItemFromCategory();
        }

        // 4.Рандом из всех предметов, но количество определяется из конфига предметов
        private Item GetRandomItemFromAllWithOverrideByConfigItems()
        {
            List<int> itemIDs = ItemManager.itemList.ConvertAll(i => i.itemid);
            int randomItemID = itemIDs[UnityEngine.Random.Range(0, itemIDs.Count)];
            Item item = ItemManager.CreateByItemID(randomItemID, 1);
            Configuration.ItemConfig itemConfig;

            if (config.items.TryGetValue(item.info.shortname, out itemConfig))
            {
                int amount = UnityEngine.Random.Range(itemConfig.min, itemConfig.max + 1);
                item.amount = amount;
            }

            return item;
        }

        // 5.Рандом из всех предметов, но количество определяется из конфига категорий
        private Item GetRandomItemFromAllWithOverrideByConfigCategories()
        {
            List<int> itemIDs = ItemManager.itemList.ConvertAll(i => i.itemid);
            int randomItemID = itemIDs[UnityEngine.Random.Range(0, itemIDs.Count)];
            Item item = ItemManager.CreateByItemID(randomItemID, 1);
            Configuration.CategoryConfig categoryConfig;

            if (config.categories.TryGetValue(item.info.category.ToString(), out categoryConfig))
            {
                int amount = UnityEngine.Random.Range(categoryConfig.min, categoryConfig.max + 1);
                item.amount = amount;
            }

            return item;
        }

        // 6.Рандом из всех предметов, но количество определяется из конфига предметов и категорий
        private Item GetRandomItemFromAllWithOverrideByConfigItemsAndCategories()
        {
            List<int> itemIDs = ItemManager.itemList.ConvertAll(i => i.itemid);
            int randomItemID = itemIDs[UnityEngine.Random.Range(0, itemIDs.Count)];
            Item item = ItemManager.CreateByItemID(randomItemID, 1);
            Configuration.ItemConfig itemConfig;
            Configuration.CategoryConfig categoryConfig;

            if (config.items.TryGetValue(item.info.shortname, out itemConfig))
            {
                int amount = UnityEngine.Random.Range(itemConfig.min, itemConfig.max + 1);
                item.amount = amount;
            }
            else if (config.categories.TryGetValue(item.info.category.ToString(), out categoryConfig))
            {
                int amount = UnityEngine.Random.Range(categoryConfig.min, categoryConfig.max + 1);
                item.amount = amount;
            }

            return item;
        }

        private void SendChat(BasePlayer player, string Message, string ChatAvatar = "")
        {
            player.SendConsoleCommand("chat.add", Chat.ChatChannel.Global, ChatAvatar, Message);
        }
    }
}

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