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

FREE Loadout : 1.0.3 1.0.3

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
using Oxide.Core;
namespace Oxide.Plugins {
    [Info("Loadout", "Sami37", "1.0.3")]
    [Description("Save you inventory to respawn with it.")]
    class Loadout : RustPlugin {
        Dictionary<string, List<Dictionary<string, object>>> PlayerData = new Dictionary<string, List<Dictionary<string, object>>>();
        Dictionary<string, List<Dictionary<string, object>>> PlayerDataWear = new Dictionary<string, List<Dictionary<string, object>>>();
        List<string> CanRedeem = new List<string>();
        private Dictionary<string, object> AutorizedItemList = new Dictionary<string, object>();
        private int Cooldown;
        private Dictionary<string, Timer> time = new Dictionary<string, Timer>();
        private Dictionary<string, object> stackSize = new Dictionary<string, object>();
#region ConfigFunction
        string ListToString<T>(List<T> list, int first = 0, string seperator = ", ") => string.Join(seperator, (from val in list select val.ToString()).Skip(first).ToArray());
        void SetConfig(params object[] args) {
            List<string> stringArgs = (from arg in args select arg.ToString()).ToList();
            stringArgs.RemoveAt(args.Length - 1);
            if (Config.Get(stringArgs.ToArray()) == null) Config.Set(args);
        }
        T GetConfig<T>(T defaultVal, params object[] args) {
            List<string> stringArgs = (from arg in args select arg.ToString()).ToList();
            if (Config.Get(stringArgs.ToArray()) == null) {
                PrintError($"The plugin failed to read something from the config: {ListToString(stringArgs, 0, "/")}{Environment.NewLine}Please reload the plugin and see if this message is still showing.If so, please post this into the support thread of this plugin.");
                return defaultVal;
            }
            return (T)Convert.ChangeType(Config.Get(stringArgs.ToArray()), typeof(T));
        }
#endregion
        void LoadData() {
            PlayerData = Interface.Oxide.DataFileSystem.ReadObject<Dictionary<string, List<Dictionary<string, object>>>>(Name);
            PlayerDataWear = Interface.Oxide.DataFileSystem.ReadObject<Dictionary<string, List<Dictionary<string, object>>>>(Name + "_Wear");
        }
        void LoadDefaultConfig() {
            AutorizedItemList = new Dictionary<string, object> {
                {
                    "vip1", new List<string> {
                        "sulfur.ore"
                    }
                }
                , {
                    "vip2", new List<string> {
                        "sulfur.ore", "hq.metal.ore", "metal.ore"
                    }
                }
            }
            ;
            foreach (var item in ItemManager.itemList) {
                if(!stackSize.ContainsKey(item.shortname)) stackSize.Add(item.shortname, item.stackable);
            }
            SetConfig("WhiteListItem", AutorizedItemList);
            SetConfig("StackSize", stackSize);
            SetConfig("Cooldown", Cooldown);
            SaveConfig();
        }
        void OnServerInitialized() {
            AutorizedItemList = GetConfig(AutorizedItemList, "WhiteListItem");
            Cooldown = GetConfig(Cooldown, "Cooldown");
            stackSize = GetConfig(stackSize, "StackSize");
            LoadData();
            foreach (var VARIABLE in AutorizedItemList) {
                permission.RegisterPermission("loadout." + VARIABLE.Key, this);
            }
            lang.RegisterMessages(new Dictionary<string, string> {
                {
                    "NoPerm", "You don't have the perm to use this command."
                }
                , {
                    "Saved", "Loadout saved"
                }
                , {
                    "Reset", "Loadout reset"
                }
                , {
                    "NotNow", "You can't use this command, you must wait."
                }
            }
            , this);
        }
        void SaveData() {
            Interface.Oxide.DataFileSystem.WriteObject(Name, PlayerData);
            Interface.Oxide.DataFileSystem.WriteObject(Name + "_Wear", PlayerDataWear);
        }
        void Unload() {
            SaveData();
        }
        void OnPlayerRespawned(BasePlayer player) {
            if (!PlayerData.ContainsKey(player.UserIDString) && !PlayerDataWear.ContainsKey(player.UserIDString)) return;
            foreach (var VARIABLE in AutorizedItemList) {
                if (permission.UserHasPermission(player.UserIDString, "loadout." + VARIABLE.Key)) if (!CanRedeem.Contains(player.UserIDString)) {
                    CanRedeem.Add(player.UserIDString);
                }
            }
        }
        void OnPlayerSleepEnded(BasePlayer player) {
            if (!PlayerData.ContainsKey(player.UserIDString) && !PlayerDataWear.ContainsKey(player.UserIDString)) return;
            foreach (var VARIABLE in AutorizedItemList) {
                if (permission.UserHasPermission(player.UserIDString, "loadout." + VARIABLE.Key)) if (CanRedeem.Contains(player.UserIDString)) {
                    Cleainventory(player);
                    CanRedeem.Remove(player.UserIDString);
                }
            }
        }
        void Cleainventory(BasePlayer player) {
            if (!PlayerData.ContainsKey(player.UserIDString) && !PlayerDataWear.ContainsKey(player.UserIDString)) return;
            for (int i = 0; i < player.inventory.containerBelt.capacity; i++) {
                var existingItem = player.inventory.containerBelt.GetSlot(i);
                if (existingItem != null) {
                    existingItem.RemoveFromContainer();
                    existingItem.Remove(0f);
                }
            }
            for (int i = 0; i < player.inventory.containerWear.capacity; i++) {
                var existingItem = player.inventory.containerWear.GetSlot(i);
                if (existingItem != null) {
                    existingItem.RemoveFromContainer();
                    existingItem.Remove(0f);
                }
            }
            RestoreInventory(player);
        }
        void RestoreInventory(BasePlayer player) {
            if (!PlayerData.ContainsKey(player.UserIDString) && !PlayerDataWear.ContainsKey(player.UserIDString)) return;
            foreach (var item in PlayerData[player.UserIDString]) {
                var data = item;
                if (data == null) continue;
                var itemid = Convert.ToInt32(data["id"]);
                var itemamount = Convert.ToInt32(data["amount"]);
                var itemskin = ulong.Parse(data["skinid"].ToString());
                var itemcondition = Convert.ToSingle(data["condition"]);
                var slot = Convert.ToInt32(data["slot"]);
                var itemCreated = ItemManager.CreateByItemID(itemid, itemamount, itemskin);
                if (itemCreated != null) {
                    itemCreated.condition = itemcondition;
                    if (data.ContainsKey("magazine")) {
                        Dictionary<string, object> magazine;
                        if (!(data["magazine"] is Dictionary<string, object>)) magazine = JsonConvert.DeserializeObject<Dictionary<string, object>>(data["magazine"].ToString());
                        else magazine = data["magazine"] as Dictionary<string, object>;
                        if (magazine == null) continue;
                        var ammotype = int.Parse(magazine.Keys.ToArray()[0]);
                        var ammoamount = int.Parse(magazine[ammotype.ToString()].ToString());
                        var heldent = itemCreated.GetHeldEntity();
                        if (heldent != null) {
                            var projectiles = heldent.GetComponent<BaseProjectile>();
                            if (projectiles != null) {
                                projectiles.primaryMagazine.ammoType = ItemManager.FindItemDefinition(ammotype);
                                projectiles.primaryMagazine.contents = ammoamount;
                            }
                        }
                    }
                    if (data.ContainsKey("items")) {
                        List<object> mod;
                        if (!(data["items"] is List<object>)) mod = JsonConvert.DeserializeObject<List<object>>(data["items"].ToString());
                        else mod = data["items"] as List<object>;
                        if (mod == null) continue;
                        foreach (var moddata in mod) {
                            Dictionary<string, object> modata;
                            if (!(moddata is Dictionary<string, object>)) modata = JsonConvert.DeserializeObject<Dictionary<string, object>>(moddata.ToString());
                            else modata = moddata as Dictionary<string, object>;
                            if (modata == null) continue;
                            var modid = Convert.ToInt32(modata["id"]);
                            var modamount = Convert.ToInt32(modata["amount"]);
                            if(itemCreated.contents == null) itemCreated.contents = new ItemContainer();
                            itemCreated.contents.AddItem(ItemManager.FindItemDefinition(modid), modamount);
                        }
                    }
                    itemCreated.MoveToContainer(player.inventory.containerBelt, slot);
                }
            }
            foreach (var item in PlayerDataWear[player.UserIDString]) {
                var data = item;
                if (data == null) continue;
                var itemid = Convert.ToInt32(data["id"]);
                var itemamount = Convert.ToInt32(data["amount"]);
                var itemskin = ulong.Parse(data["skinid"].ToString());
                var itemcondition = Convert.ToSingle(data["condition"]);
                var slot = Convert.ToInt32(data["slot"]);
                var itemCreated = ItemManager.CreateByItemID(itemid, itemamount, itemskin);
                if (itemCreated != null) {
                    itemCreated.condition = itemcondition;
                    if (data.ContainsKey("magazine")) {
                        Dictionary<string, object> magazine;
                        if (!(data["magazine"] is Dictionary<string, object>)) magazine = JsonConvert.DeserializeObject<Dictionary<string, object>>(data["magazine"].ToString());
                        else magazine = data["magazine"] as Dictionary<string, object>;
                        if (magazine == null) continue;
                        var ammotype = int.Parse(magazine.Keys.ToArray()[0]);
                        var ammoamount = int.Parse(magazine[ammotype.ToString()].ToString());
                        var heldent = itemCreated.GetHeldEntity();
                        if (heldent != null) {
                            var projectiles = heldent.GetComponent<BaseProjectile>();
                            if (projectiles != null) {
                                projectiles.primaryMagazine.ammoType = ItemManager.FindItemDefinition(ammotype);
                                projectiles.primaryMagazine.contents = ammoamount;
                            }
                        }
                    }
                    if (data.ContainsKey("items")) {
                        List<object> mod;
                        if (!(data["items"] is List<object>)) mod = JsonConvert.DeserializeObject<List<object>>(data["items"].ToString());
                        else mod = data["items"] as List<object>;
                        if (mod == null) continue;
                        foreach (var moddata in mod) {
                            Dictionary<string, object> modata;
                            if (!(moddata is Dictionary<string, object>)) modata = JsonConvert.DeserializeObject<Dictionary<string, object>>(moddata.ToString());
                            else modata = moddata as Dictionary<string, object>;
                            if (modata == null) continue;
                            var modid = Convert.ToInt32(modata["id"]);
                            var modamount = Convert.ToInt32(modata["amount"]);
                            if(itemCreated.contents == null) itemCreated.contents = new ItemContainer();
                            itemCreated.contents.AddItem(ItemManager.FindItemDefinition(modid), modamount);
                        }
                    }
                    itemCreated.MoveToContainer(player.inventory.containerWear, slot);
                }
            }
        }
        [ChatCommand("loadout")]
        void cmdChatLoadout(BasePlayer player, string cmd, string[] args) {
            bool canCOmmand = false;
            foreach (var VARIABLE in AutorizedItemList) {
                if (permission.UserHasPermission(player.UserIDString, "loadout." + VARIABLE.Key)) canCOmmand = true;
            }
            if (!canCOmmand) {
                SendReply(player, lang.GetMessage("NoPerm", this, player.UserIDString));
                return;
            }
            if (args == null) {
                SendReply(player, "Syntax: /loadout <save|reset>");
                return;
            }
            if (args.Length != 1) {
                SendReply(player, "Syntax: /loadout <save|reset>");
                return;
            }
            switch (args[0].ToLower()) {
                case "save" : if (time.ContainsKey(player.UserIDString)) {
                    SendReply(player, lang.GetMessage("NotNow", this, player.UserIDString));
                    return;
                }
                var itemlist = new List<Dictionary<string, object>>();
                var itemlistwear = new List<Dictionary<string, object>>();
                foreach (Item item in player.inventory.containerBelt.itemList) {
                    foreach (var VARIABLE in AutorizedItemList) {
                        if (permission.UserHasPermission(player.UserIDString, "loadout." + VARIABLE.Key)) {
                            var td = VARIABLE.Value as List<object>;
                            if (td != null && td.Contains(item.info.shortname)) {
                                var itemdata = new Dictionary<string, object> {
                                    {
                                        "condition", item.condition.ToString()
                                    }
                                    , {
                                        "id", item.info.itemid
                                    }
                                    , {
                                        "amount", stackSize.ContainsKey(item.info.shortname) && (int)stackSize[item.info.shortname] < item.amount ? stackSize[item.info.shortname] : item.amount
                                    }
                                    , {
                                        "skinid", item.skin
                                    }
                                    , {
                                        "slot", item.position
                                    }
                                }
                                ;
                                var heldEnt = item.GetHeldEntity();
                                if (heldEnt != null) {
                                    var projectiles = heldEnt.GetComponent<BaseProjectile>();
                                    if (projectiles != null) {
                                        var magazine = projectiles.primaryMagazine;
                                        if (magazine != null) {
                                            itemdata.Add("magazine", new Dictionary<string, object> {
                                                {
                                                    magazine.ammoType.itemid.ToString(), magazine.contents
                                                }
                                            }
                                            );
                                        }
                                    }
                                }
                                if (item.contents?.itemList != null) {
                                    var contents = new List<object>();
                                    foreach (Item item2 in item.contents.itemList) {
                                        contents.Add(new Dictionary<string, object> {
                                            {
                                                "condition", item2.condition.ToString()
                                            }
                                            , {
                                                "id", item2.info.itemid
                                            }
                                            , {
                                                "amount", item2.amount
                                            }
                                            , {
                                                "skinid", item2.skin
                                            }
                                            , {
                                                "items", new List<object>()
                                            }
                                        }
                                        );
                                    }
                                    itemdata["items"] = contents;
                                }
                                itemlist.Add(itemdata);
                            }
                        }
                    }
                }
                foreach (Item item in player.inventory.containerWear.itemList) {
                    foreach (var VARIABLE in AutorizedItemList) {
                        if (permission.UserHasPermission(player.UserIDString, "loadout." + VARIABLE.Key)) {
                            var td = VARIABLE.Value as List<object>;
                            if (td != null && td.Contains(item.info.shortname)) {
                                var itemdata = new Dictionary<string, object> {
                                    {
                                        "condition", item.condition.ToString()
                                    }
                                    , {
                                        "id", item.info.itemid
                                    }
                                    , {
                                        "amount", stackSize.ContainsKey(item.info.shortname) && (int)stackSize[item.info.shortname] < item.amount ? stackSize[item.info.shortname] : item.amount
                                    }
                                    , {
                                        "skinid", item.skin
                                    }
                                    , {
                                        "slot", item.position
                                    }
                                }
                                ;
                                var heldEnt = item.GetHeldEntity();
                                if (heldEnt != null) {
                                    var projectiles = heldEnt.GetComponent<BaseProjectile>();
                                    if (projectiles != null) {
                                        var magazine = projectiles.primaryMagazine;
                                        if (magazine != null) {
                                            itemdata.Add("magazine", new Dictionary<string, object> {
                                                {
                                                    magazine.ammoType.itemid.ToString(), magazine.contents
                                                }
                                            }
                                            );
                                        }
                                    }
                                }
                                if (item.contents?.itemList != null) {
                                    var contents = new List<object>();
                                    foreach (Item item2 in item.contents.itemList) {
                                        contents.Add(new Dictionary<string, object> {
                                            {
                                                "condition", item2.condition.ToString()
                                            }
                                            , {
                                                "id", item2.info.itemid
                                            }
                                            , {
                                                "amount", item2.amount
                                            }
                                            , {
                                                "skinid", item2.skin
                                            }
                                            , {
                                                "items", new List<object>()
                                            }
                                        }
                                        );
                                    }
                                    itemdata["items"] = contents;
                                }
                                itemlistwear.Add(itemdata);
                            }
                        }
                    }
                }
                if (PlayerData.ContainsKey(player.UserIDString)) PlayerData.Remove(player.UserIDString);
                PlayerData.Add(player.UserIDString, itemlist);
                if (PlayerDataWear.ContainsKey(player.UserIDString)) PlayerDataWear.Remove(player.UserIDString);
                PlayerDataWear.Add(player.UserIDString, itemlistwear);
                time.Add(player.UserIDString, timer.Once(Cooldown, () => {
                    time.Remove(player.UserIDString);
                }
                ));
                SendReply(player, lang.GetMessage("Saved", this, player.UserIDString));
                SaveData();
                break;
                case "reset" : PlayerData.Remove(player.UserIDString);
                PlayerDataWear.Remove(player.UserIDString);
                SendReply(player, lang.GetMessage("Reset", this, player.UserIDString));
                break;
            }
        }
    }
}

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