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

FREE QuickLoadouts : 1.0.1 1.0.1

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

namespace Oxide.Plugins
{
    [Info("QuickLoadouts", "carny666", "1.0.1", ResourceId = 2731)]
    class QuickLoadouts : RustPlugin
    {
        const string adminPermission = "QuickLoadouts.admin";
        const string allPermission = "QuickLoadouts.all";
        const string loadoutFileName = "QuickLoadouts.loadouts";

        const string AdminCommandChatConsole = "quickloadout";
        const string UseCommandChatConsole = "useloadout";

        Loadouts loadouts = new Loadouts();

        void Init()
        {
            try
            {
                loadouts = Interface.Oxide.DataFileSystem.ReadObject<Loadouts>(loadoutFileName);

                permission.RegisterPermission(adminPermission, this);

                foreach (var l in loadouts.loadouts)
                    permission.RegisterPermission($"QuickLoadouts.{l.name}", this);
            }
            catch (Exception ex)
            {
                throw new Exception($"Error in Loaded {ex.Message}");
            }
        }

        protected override void LoadDefaultMessages()
        {
            lang.RegisterMessages(new Dictionary<string, string>
                {
                    { "listreply", "Listing Loadouts:" },
                    { "nolistreply", "There are no loadouts." },
                    { "removeusagereply", "usage:  /loadout rem LoadoutName" },
                    { "removereply", "'{name}' Removed." },
                    { "addusagereply", "usage:  /loadout add LoadoutName" },
                    { "addreply", "Added '{name}'.You have to supply the proper permissions to use this loadout." },
                    { "usereply", "Loadout supplied." },
                    { "clearreply", "Loadouts all cleared." },
                    { "loadoutnotfoundreply", "Loadouts not found." },
                    { "loadoutnoexistreply", "Loadout not found." }
                }, this, "en");
        }

        #region classes 
        class Loadouts
        {
            public List<Loadout> loadouts;

            public Loadouts()
            {
                loadouts = new List<Loadout>();
            }

            public bool AddPlayersLoadout(BasePlayer player, string Name)
            {
                try
                {
                    loadouts.Add(new Loadout(player) { name = Name.ToLower() });
                    return true;
                }
                catch (Exception ex)
                {
                    throw new Exception("Loadouts Error: AddPlayersLoadout:" + ex.StackTrace);
                }
            }

            public bool ReplacePlayersLoadout(BasePlayer player, string Name)
            {
                try
                {
                    if (loadouts.Any(x => x.name.ToString() == Name))
                    {
                        var index = loadouts.IndexOf(loadouts.First(x => x.name.ToString().ToLower() == Name.ToLower()));
                        loadouts.RemoveAt(index);
                        loadouts.Insert(index, new Loadout(player) { name = Name.ToLower() });
                        return true;
                    }
                    return false;
                }
                catch (Exception ex)
                {
                    throw new Exception("Loadouts Error: AddPlayersLoadout:" + ex.StackTrace);
                }
            }

            public bool LoadoutExistByName(string Name)
            {
                return (loadouts.Any(x => x.name.ToString().ToLower() == Name.ToLower()));
            }

        }

        class Loadout
        {
            public object name { get; set; }
            public List<ModItem> containerWear = new List<ModItem>();
            public List<ModItem> containerBelt = new List<ModItem>();
            public List<ModItem> containerMain = new List<ModItem>();

            public Loadout()
            {
                name = "";
                containerWear = new List<ModItem>();
                containerBelt = new List<ModItem>();
                containerMain = new List<ModItem>();
            }

            public Loadout(object packName)
            {
                if (packName != null)
                    name = packName.ToString().ToLower();
                else
                    name = "";

                containerWear = new List<ModItem>();
                containerBelt = new List<ModItem>();
                containerMain = new List<ModItem>();
            }

            public Loadout(BasePlayer player)
            {
                try
                {
                    containerWear = new List<ModItem>();
                    containerBelt = new List<ModItem>();
                    containerMain = new List<ModItem>();

                    foreach (var i in player.inventory.containerWear.itemList)
                    {
                        containerWear.Add(new ModItem(i));
                        player.SendNetworkUpdate();
                    }

                    foreach (var i in player.inventory.containerMain.itemList)
                    {
                        containerMain.Add(new ModItem(i));
                        player.SendNetworkUpdate();
                    }

                    foreach (var i in player.inventory.containerBelt.itemList)
                    {
                        containerBelt.Add(new ModItem(i));
                        player.SendNetworkUpdate();
                    }

                }
                catch (Exception ex)
                {
                    throw new Exception("Error PlayerLoadout:", ex);
                }
            }

            public void SupplyLoadout(BasePlayer Player, bool clearInventory = false)
            {
                try
                {
                    if (clearInventory)
                    {
                        foreach (Item i in Player.inventory.AllItems())
                            i.Remove(0f);
                        Player.SendNetworkUpdate();
                    }

                    Player.inventory.containerMain.Clear();
                    Player.inventory.containerWear.Clear();
                    Player.inventory.containerBelt.Clear();

                    foreach (ModItem e in containerWear)
                        if (e.Item() != null)
                            Player.inventory.GiveItem(e.Item(), Player.inventory.containerWear);


                    foreach (ModItem e in containerMain)
                        if (e.Item() != null)
                            Player.inventory.GiveItem(e.Item(), Player.inventory.containerMain);

                    foreach (ModItem e in containerBelt)
                        if (e.Item() != null)
                            Player.inventory.GiveItem(e.Item(), Player.inventory.containerBelt);

                    Player.SendNetworkUpdate();
                }
                catch (Exception ex)
                {
                    throw new Exception("Error ArenaPlayer:SupplyLoadout:", ex);
                }
            }

        }

        class ModItem
        {
            public string equipName;
            public int amount;
            public ulong skinId;

            public ModItemType etype;

            public List<string> addons = new List<string>();

            public ModItem()
            {
                equipName = "";
                amount = 0;
                skinId = 0;
                addons = new List<string>();
            }

            public ModItem(string EquipName, ModItemType type, int Amount = 1)
            {
                equipName = EquipName;
                amount = Amount;
                etype = type;
                addons = new List<string>();
            }

            public ModItem(string EquipName, string[] Addons, int AmmoAmount = -1)
            {
                equipName = EquipName;
                amount = 1;
                etype = ModItem.ModItemType.Weapon;
                addons = new List<string>();
                foreach (string s in Addons)
                    addons.Add(s);
            }

            public ModItem(Item item)
            {
                try
                {
                    var id = ItemManager.FindItemDefinition(item.info.itemid);
                    equipName = id.shortname;
                    amount = item.amount;
                    skinId = item.skin;

                    if (item.contents != null)
                    {
                        foreach (Item i in item.contents.itemList)
                        {
                            var iid = ItemManager.FindItemDefinition(i.info.itemid);
                            addons.Add(iid.shortname);
                        }
                    }
                }
                catch (Exception ex)
                {
                    throw new Exception("Error ModItem:", ex);
                }

            }

            public Item Item()
            {
                try
                {
                    var definition = ItemManager.FindItemDefinition(this.equipName);
                    if (definition != null)
                    {
                        Item item = ItemManager.CreateByItemID((int)definition.itemid, this.amount, skinId);
                        if (item != null)
                        {
                            if (this.etype == ModItem.ModItemType.Weapon)
                            {
                                // If weapon fill magazine to capacity
                                var weapon = item.GetHeldEntity() as BaseProjectile;
                                if (weapon != null)
                                {
                                    (item.GetHeldEntity() as BaseProjectile).primaryMagazine.contents = weapon.primaryMagazine.capacity;
                                }

                                foreach (var a in this.addons)
                                {
                                    var addonDef = ItemManager.FindItemDefinition(a);
                                    Item addonItem = ItemManager.CreateByItemID((int)addonDef.itemid, 1);
                                    item.contents.AddItem(addonItem.info, 1);
                                }
                            }
                            return item;
                        }
                    }
                    return null;
                }
                catch (Exception ex)
                {
                    throw new Exception("Error ModItem:Item", ex);
                }
            }
            public enum ModItemType
            {
                Weapon,
                Item
            }

        }
        #endregion

        void UseLoadout(BasePlayer player, string LoaoutName)
        {
            var lo = (loadouts.loadouts.Any(x => x.name.ToString() == LoaoutName)) ? loadouts.loadouts.First(x => x.name.ToString() == LoaoutName) : null;
            if (lo == null)
            {
                PrintToChat(player, lang.GetMessage("loadoutnotfoundreply", this, player.UserIDString));
                return;
            }
            UseLoadout(player, lo);

        }

        void UseLoadout(BasePlayer player, Loadout l)
        {
            if (permission.UserHasPermission(player.UserIDString, allPermission)
                ||
                permission.UserHasPermission(player.UserIDString, "QuickLoadouts." + l.name))
            {
                l.SupplyLoadout(player);
                PrintToChat(player, lang.GetMessage("usereply", this, player.UserIDString));
            }
        }

        [ChatCommand(UseCommandChatConsole)]
        void chatCommandUseLoadout(BasePlayer player, string command, string[] args)
        {
            try
            {
                if (args.Length < 1) return;
                UseLoadout(player, args[0]);
            }
            catch (Exception ex)
            {
                throw new Exception("Error consoleCommandUseLoadout.", ex);
            }
        }

        [ConsoleCommand(UseCommandChatConsole)]
        void consoleCommandUseLoadout(ConsoleSystem.Arg arg)
        {
            try
            {
                if (arg.Args.Length < 1) return;
                if (arg.Player() == null) return;
                BasePlayer player = arg.Player();
                UseLoadout(player, arg.Args[0]);
            }
            catch (Exception ex)
            {
                throw new Exception("Error consoleCommandUseLoadout.", ex);
            }
        }

        [ChatCommand(AdminCommandChatConsole)]
        void chatCommandquickloadout(BasePlayer player, string command, string[] args)
        {
            if (!permission.UserHasPermission(player.UserIDString, adminPermission))
                return;

            #region  List
            if (args.Length == 0) // list loadouts
            {
                int ii = 0;
                if (loadouts.loadouts.Count() > 0)
                {
                    PrintToChat(player, lang.GetMessage("listreply", this, player.UserIDString));
                    foreach (var l in loadouts.loadouts)
                        PrintToChat(player, $"{(++ii).ToString()} {l.name}");
                }
                else
                    PrintToChat(player, lang.GetMessage("nolistreply", this, player.UserIDString));
                return;
            }
            #endregion

            switch (args[0].ToLower())
            {
                case "rem":
                case "remove":
                    if (args.Count() < 2)
                        PrintToChat(player, lang.GetMessage("removeusagereply", this, player.UserIDString));
                    else
                    {

                        if (loadouts.loadouts.Any(x => x.name.ToString().ToLower() == args[1].ToLower().ToString()))
                        {
                            loadouts.loadouts.Remove(loadouts.loadouts.First(x => x.name.ToString().ToLower() == args[1].ToLower().ToString()));
                            Interface.Oxide.DataFileSystem.WriteObject(loadoutFileName, loadouts);
                            PrintToChat(player, lang.GetMessage("removereply", this, player.UserIDString).Replace("{name}", args[1].ToString()));
                        }
                    }
                    break;

                case "add":
                    if (args.Count() < 2)
                        PrintToChat(player, lang.GetMessage("addusagereply", this, player.UserIDString));
                    else
                    {
                        string Name = "";
                        foreach (var s in args)
                            if (s != "add") Name += " " + s;
                        var name = Name.Replace("'", "").Trim();

                        if (loadouts.LoadoutExistByName(name))
                            loadouts.ReplacePlayersLoadout(player, name);
                        else
                            loadouts.AddPlayersLoadout(player, name);

                        permission.RegisterPermission($"QuickLoadouts.{name}", this);
                        Interface.Oxide.DataFileSystem.WriteObject(loadoutFileName, loadouts);

                        PrintToChat(player, lang.GetMessage("addreply", this, player.UserIDString).Replace("{name}", name));
                    }
                    break;

                case "use":
                    var l = (loadouts.loadouts.Any(x => x.name.ToString().ToLower() == args[1].ToLower().ToString())) ? loadouts.loadouts.First(x => x.name.ToString().ToLower() == args[1].ToLower().ToString()) : null;
                    if (l != null)
                    {
                        l.SupplyLoadout(player);
                        PrintToChat(player, lang.GetMessage("usereply", this, player.UserIDString));
                    }
                    else
                        PrintToChat(player, lang.GetMessage("loadoutnoexistreply", this, player.UserIDString));
                    break;

                case "clear":
                    loadouts.loadouts.Clear();
                    Interface.Oxide.DataFileSystem.WriteObject(loadoutFileName, loadouts);
                    PrintToChat(player, lang.GetMessage("clearreply", this, player.UserIDString));

                    break;
                default:
                    break;
            }

        }

    }
}

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