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

FREE MachiningTools : 1.0.0 1.0.0

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

namespace Oxide.Plugins
{
    [Info("MachiningTools", "A0001", "1.0.0")]
    [Description("Allow admins to give enchanted items to the players, wich would gaver processed items")]
    
    class MachiningTools : RustPlugin
    {
        #region Vars
        private Dictionary<uint, SavedData> Tools;
        private PluginConfig config;
        private Dictionary<ItemDefinition, ItemDefinition> Transmutations;
        private List<string> Transmutatable = new List<string>()
        {
            "chicken.raw",
            "humanmeat.raw",
            "bearmeat",
            "deermeat.raw",
            "meat.boar",
            "wolfmeat.raw",
            "hq.metal.ore",
            "metal.ore",
            "sulfur.ore"
        };
        #endregion

        #region Data handling
        private class SavedData
        {
            public Transmutetion transmuatation;
            public bool CanRepair;
            public bool CanRecycle;
        }
        private void SaveData()
        {
            Interface.Oxide.DataFileSystem.WriteObject(Title, Tools);
        }
        void LoadData()
        {
            try
            {
                Tools = Interface.Oxide.DataFileSystem.ReadObject<Dictionary<uint, SavedData>>(Title);
            }
            catch (Exception ex)
            {
                PrintError($"Failed to load cupboard data file (is the file corrupt?) ({ex.Message})");
                Tools = new Dictionary<uint, SavedData>();
            }
        }
        #endregion

        #region Config
        private class Tool
        {
            [JsonProperty("Короткое имя предмета")]
            public string Item;
            [JsonProperty("ID скина предмета (Поддерживается Workshop)")]
            public ulong SkinID;
            [JsonProperty("Можно ли ремонтировать предмет")]
            public bool CanRepair;
            [JsonProperty("Можно ли перерабатывать пердмет")]
            public bool CanRecycle;
            [JsonProperty("Настройки переработки")]
            public Transmutetion transmutation;
        }
        private class Transmutetion
        {
            [JsonProperty("Перерабатывать дерево в уголь")]
            public bool Wood;
            [JsonProperty("Перерабатывать руду МВК в металл")]
            public bool HQM;
            [JsonProperty("Перерабатывать металлическую руду в фрагменты")]
            public bool Metal;
            [JsonProperty("Перерабатывать серную руду в серу")]
            public bool Sulfur;
            [JsonProperty("Перерабатывать мясо медведя в жаренное")]
            public bool Bear;
            [JsonProperty("Перерабатывать свинину в жаренную")]
            public bool Boar;
            [JsonProperty("Перерабатывать мясо курицы в жаренное")]
            public bool Chicken;
            [JsonProperty("Перерабатывать мясо волка в жаренное")]
            public bool Wolf;
            [JsonProperty("Перерабатывать мясо оленя в жаренное")]
            public bool Deer;
            [JsonProperty("Перерабатывать человеческое мясо в жаренное")]
            public bool Human;
            public static Transmutetion DefaultPick()
            {
                return new Transmutetion()
                {
                    Wood = false,
                    HQM = true,
                    Metal = true,
                    Sulfur = true,
                    Bear = false,
                    Boar = false,
                    Chicken = false,
                    Wolf = false,
                    Deer = false,
                    Human = false
                };
            }
            public static Transmutetion DefaultAxe()
            {
                return new Transmutetion()
                {
                    Wood = true,
                    HQM = false,
                    Metal = false,
                    Sulfur = false,
                    Bear = true,
                    Boar = true,
                    Chicken = true,
                    Wolf = true,
                    Deer = true,
                    Human = true
                };
            }
        }
        private class PluginConfig
        {
            [JsonProperty("Привилегия для использования команд")]
            public string Permission;
            [JsonProperty("Команда(чат/консоль)")]
            public string Command;
            [JsonProperty("Список инструментов")]
            public Dictionary<string, Tool> Tools;
            public static PluginConfig DefaultConfig()
            {
                return new PluginConfig()
                {
                    Permission = "machiningtools.use",
                    Command = "givetool",
                    Tools = new Dictionary<string, Tool>()
                    {
                        ["hatchet"] = new Tool()
                        {
                            Item = "hatchet",
                            CanRepair = true,
                            CanRecycle = true,
                            SkinID = 901876821,
                            transmutation = Transmutetion.DefaultAxe()
                        },
                        ["pickaxe"] = new Tool()
                        {
                            Item = "pickaxe",
                            CanRepair = true,
                            CanRecycle = true,
                            SkinID = 902892485,
                            transmutation = Transmutetion.DefaultPick()
                        },
                        ["icepick"] = new Tool()
                        {
                            Item = "icepick.salvaged",
                            CanRepair = false,
                            CanRecycle = false,
                            SkinID = 804307574,
                            transmutation = Transmutetion.DefaultPick()
                        },
                        ["axe"] = new Tool()
                        {
                            Item = "axe.salvaged",
                            CanRepair = false,
                            CanRecycle = false,
                            SkinID = 0,
                            transmutation = Transmutetion.DefaultAxe()
                        }
                    }
                };
            }
        }
        #endregion

        #region Config handling
        protected override void LoadDefaultConfig()
        {
            PrintWarning("Благодарим за приобритение плагина на сайте RustPlugin.ru.Если вы приобрели этот плагин на другом ресурсе знайте - это лишает вас гарантированных обновлений!");
            config = PluginConfig.DefaultConfig();
        }
        protected override void LoadConfig()
        {
            base.LoadConfig();
            config = Config.ReadObject<PluginConfig>();
        }
        protected override void SaveConfig()
        {
            Config.WriteObject(config);
        }
        #endregion

        #region Init and quiting
        void Init()
        {
            LoadData();
            AddCovalenceCommand(config.Command, "GiveToolsCommand", config.Permission);
        }
        void OnServerInitialized()
        {
            Transmutations = ItemManager.GetItemDefinitions().Where(p => Transmutatable.Contains(p.shortname)).ToDictionary(p => p, p => p.GetComponent<ItemModCookable>()?.becomeOnCooked);
            ItemDefinition wood = ItemManager.FindItemDefinition(-151838493);
            ItemDefinition charcoal = ItemManager.FindItemDefinition(-1938052175);
            Transmutations.Add(wood, charcoal);
            foreach (var item in Transmutations)
            {
                if (item.Value == null)
                {
                    PrintError($"Не удалось получить ItemModCookable для \"{item.Key.displayName.english}\"\nСообщите об этом разработчику: https://vk.com/vlad_00003");
                }
            }
        }
        void Unload() => SaveData();
        void OnServerSave() => SaveData();
        #endregion

        #region Oxide Hooks
        void OnNewSave(string filename)
        {
            Tools.Clear();
            PrintWarning("Обнаружен вайп.Инструменты сброшены.");
        }
        void OnEntityKill(BaseNetworkable entity)
        {
			if(entity?.net?.ID == null) return;
            if (Tools.ContainsKey(entity.net.ID))
                Tools.Remove(entity.net.ID);
        }
        object OnItemRepair(BasePlayer player, Item item)
        {
            var entity = item.GetHeldEntity()?.net.ID;
            if (entity.HasValue)
            {
                SavedData data;
                if(Tools.TryGetValue(entity.Value, out data))
                {
                    if(!data.CanRepair)
                    {
                        player.ChatMessage(GetMsg("Can't repair", player.userID));
                        return false;
                    }
                }
            }
            return null;
        }
        object CanRecycle(Recycler recycler, Item item)
        {
            var entity = item.GetHeldEntity()?.net.ID;
            if (entity.HasValue)
            {
                SavedData data;
                if (Tools.TryGetValue(entity.Value, out data))
                {
                    if (!data.CanRecycle)
                    {
                        return false;
                    }
                }
            }
            return null;
        }
        void OnDispenserGather(ResourceDispenser dispenser, BaseEntity entity, Item item)
        {
            HeldEntity weapon = entity.ToPlayer()?.GetHeldEntity();
            if (weapon == null) return;
            SavedData data;
            if (!Tools.TryGetValue(weapon.net.ID, out data)) return;
			
            switch (item.info.shortname)
            {
                case "stones":
                    break;
                case "leather":
                    break;
                case "bone.fragments":
                    break;
                case "fat.animal":
                    break;
                case "skull.wolf":
                    break;
                case "cloth":
                    break;
                case "cactusflesh":
                    break;
                case "skull.human":
                    break;
                case "humanmeat.raw":
                    if (data.transmuatation.Human)
                        Transmutate(item);
                    break;
                case "bearmeat":
                    if (data.transmuatation.Bear)
                        Transmutate(item);
                    break;
                case "chicken.raw":
                    if (data.transmuatation.Chicken)
                        Transmutate(item);
                    break;
                case "meat.boar":
                    if (data.transmuatation.Boar)
                        Transmutate(item);
                    break;
                case "deermeat.raw":
                    if (data.transmuatation.Deer)
                        Transmutate(item);
                    break;
                case "wolfmeat.raw":
                    if (data.transmuatation.Wolf)
                        Transmutate(item);
                    break;
                case "sulfur.ore":
                    if (data.transmuatation.Sulfur)
                        Transmutate(item);
                    break;
                case "metal.ore":
                    if (data.transmuatation.Metal)
                        Transmutate(item);
                    break;
                case "wood":
                    if (data.transmuatation.Wood)
                        Transmutate(item);
                    break;
                default:
                    Puts($"Игрок добыл неизвестный предмет - {item.info}!\nСообщите об этом разработчику: https://vk.com/vlad_00003");
                    break;
            }
        }
		
        void OnDispenserBonus(ResourceDispenser disp, BasePlayer player, Item item)
        {
            if (player == null)
            {
                Puts("Финальный бонус был присвоен без игрока!\nСообщите об этом разработчику: https://vk.com/vlad_00003");
                return;
            }
            var weapon = player.GetHeldEntity();
            if (weapon == null) return;
            SavedData data;
            if (!Tools.TryGetValue(weapon.net.ID, out data)) return;
            switch (item.info.shortname)
            {
                case "sulfur.ore":
                    if (data.transmuatation.Sulfur)
                        Transmutate(item);
                    break;
                case "metal.ore":
                    if (data.transmuatation.Metal)
                        Transmutate(item);
                    break;
                case "hq.metal.ore":
                    if (data.transmuatation.HQM)
                        Transmutate(item);
                    break;
                case "stones":
                    break;
                case "wood":
                    if (data.transmuatation.Wood)
                        Transmutate(item);
                    break;
                default:
                    Puts($"Игроку присвоен неизвестный предмет - {item.info.shortname}!\nСообщите об этом разработчику: https://vk.com/vlad_00003");
                    break;
            }
        }
        #endregion
        
        #region Localization
        protected override void LoadDefaultMessages()
        {
            lang.RegisterMessages(new Dictionary<string, string>()
            {
                ["Syntax"] = "Incorrect synax! Use: {0} player item [item2] [item3]...",
                ["No item"] = "Item \"{0}\" could not found in the tool list and can't be given!",
                ["No player"] = "Player \"{0}\" could not be found",
                ["Not on server"] = "Player \"{0}\" is not on the server",
                ["Multiply players"] = "Found multiply players:\n{0}",
                ["Successfull"] = "Successfully gave player \"{0}\" tools:\n{1}",
                ["Can't repair"] = "You can not repair this tool!"
            }, this);
            lang.RegisterMessages(new Dictionary<string, string>()
            {
                ["Syntax"] = "Неверный синтаксис! Используйте: {0} player item [item2] [item3]...",
                ["No item"] = "Предмет \"{0}\" не найден в списке инструментов и не может быть выдан!",
                ["No player"] = "Игрок \"{0}\" не найден",
                ["Not on server"] = "Игрок \"{0}\" не находится на сервере",
                ["Multiply players"] = "Найдено несколько игроков:\n{0}",
                ["Successfull"] = "Успешно выдали игроку \"{0}\" предметы:\n{1}",
                ["Can't repair"] = "Данный предмет не подлежит ремонту!"
            }, this, "ru");
        }
        private string GetMsg(string langkey, object userID = null) => lang.GetMessage(langkey, this, userID == null ? null : userID.ToString());
        #endregion

        #region Command
        private void GiveToolsCommand(IPlayer player, string command, string[] args)
        {
            if(args.Length < 2)
            {
                Reply(player, "Syntax", config.Command);
                return;
            }
            var recivers = GetPlayers(args[0]);
            if (recivers == null || recivers.Count == 0)
            {
                Reply(player, "No player", args[0]);
                return;
            }
            if(recivers.Count > 1)
            {
                Reply(player, "Multiply players", string.Join("\n", recivers.Select(p => $"{p.Value} ({p.Key})").ToArray()));
                return;
            }
            var Ireciver = recivers.First();
            var reciver = FindBasePlayer(Ireciver.Key);
            if (reciver == null)
            {
                Reply(player, "Not on server", Ireciver.Value);
                return;
            }
            var tools = args.ToList();
            tools.RemoveAt(0);
            var ToolCheck = tools.Where(t => !config.Tools.ContainsKey(t));
            foreach(var mistake in ToolCheck)
            {
                Reply(player, "No item", mistake);
            }
            if (ToolCheck.Count() > 0) return;
            foreach(var tool in tools)
            {
                var data = config.Tools[tool];
                Item item = ItemManager.CreateByName(data.Item, 1, data.SkinID);
                reciver.GiveItem(item);
                uint id = item.GetHeldEntity().net.ID;
                Tools.Add(id, new SavedData()
                {
                    CanRepair = data.CanRepair,
                    transmuatation = data.transmutation,
                    CanRecycle = data.CanRecycle
                });
            }
            Reply(player, "Successfull", Ireciver.Value, string.Join("\n", tools.ToArray()));
        }
        #endregion

        #region API
        object IsMachiningToolEnt(BaseEntity entity)
        {
            if (entity?.net?.ID == null)
                return null;
            return Tools.ContainsKey(entity.net.ID);
        }
        object IsMachiningToolItem(Item item)
        {
            var entity = item.GetHeldEntity();
            if (entity == null) return null;
            if (entity?.net?.ID == null)
                return null;
            return Tools.ContainsKey(entity.net.ID);
        }
        #endregion

        #region Helpers
        private void Transmutate(Item item)
        {
            if (!Transmutations.ContainsKey(item.info))
            {
                PrintWarning($"Неизвестный предмет отправлен на переплавку - {item.info.displayName.english}!\nСообщите об этом разработчику: https://vk.com/vlad_00003");
                return;
            }
            item.info = Transmutations[item.info];
        }
        private void Reply(IPlayer player, string langkey, params object[] args)
        {
            player.Reply(string.Format(GetMsg(langkey, player.Id), args));
        }
        private Dictionary<ulong, string> GetPlayers(string NameOrID)
        {
            var pl = covalence.Players.FindPlayers(NameOrID).ToList();
            return pl.Select(p => new KeyValuePair<ulong, string>(ulong.Parse(p.Id), p.Name)).ToDictionary(x => x.Key, x => x.Value);
        }
        private BasePlayer FindBasePlayer(ulong userID)
        {
            BasePlayer player = BasePlayer.activePlayerList.Where(p => p.userID == userID).FirstOrDefault();
            player = player == null ? BasePlayer.sleepingPlayerList.Where(p => p.userID == userID).FirstOrDefault() : player;
            return player;
        }
        #endregion
    }
}

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