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

FREE NeonSkins : 1.0.11 1.0.11

Нет прав для скачивания
C#:
using System;
using System.Collections.Generic;
using System.Linq;
using Oxide.Core;
using Oxide.Core.Configuration;
using UnityEngine;
using Network;
using Oxide.Game.Rust.Cui;
namespace Oxide.Plugins {
    [Info("NeonSkins", "Colon Blow", "1.0.11")]
    class NeonSkins : RustPlugin {
        // fix for OnEntityDeath  Null errors
        // Wings are working, but only visisble withing culling range of toggle on.#region Load and Data Save
        BaseEntity newNeon;
        private bool initialized;
        void Loaded() {
            LoadVariables();
            lang.RegisterMessages(Messages, this);
            permission.RegisterPermission("neonskins.add", this);
            permission.RegisterPermission("neonskins.skin", this);
            permission.RegisterPermission("neonskins.wings", this);
            permission.RegisterPermission("neonskins.attire", this);
            permission.RegisterPermission("neonskins.nolimit", this);
            permission.RegisterPermission("neonskins.viplimit", this);
            timer.In(5, RestoreNeonSkins);
        }
        private void OnServerInitialized() {
            LoadDataFile();
            initialized = true;
            timer.In(3, RestoreNeonSkins);
        }
        bool isAllowed(BasePlayer player, string perm) => permission.UserHasPermission(player.UserIDString, perm);
        private void RestoreNeonSkins() {
            if (storedData.saveSkinData.Count > 0) {
                BaseEntity[] objects = BaseEntity.saveList.Where(x => x is BaseEntity).ToArray();
                if (objects != null) {
                    foreach (var obj in objects) {
                        if (storedData.saveSkinData.ContainsKey(obj.net.ID)) {
                            var getent = obj.GetComponent<BaseEntity>();
                            if (getent) getent.Invoke("KillMessage", 0.1f);
                            var signownerid = storedData.saveSkinData[obj.net.ID].ownerid;
                            var signpos = StringToVector3(storedData.saveSkinData[obj.net.ID].pos);
                            var signrot = StringToQuaternion(storedData.saveSkinData[obj.net.ID].rot);
                            var signangle = StringToVector3(storedData.saveSkinData[obj.net.ID].eangles);
                            var signskin1 = storedData.saveSkinData[obj.net.ID].skin1;
                            var signskin2 = storedData.saveSkinData[obj.net.ID].skin2;
                            var signskin3 = storedData.saveSkinData[obj.net.ID].skin3;
                            var signtickrate = storedData.saveSkinData[obj.net.ID].tickrate;
                            SpawnSign(signownerid, signpos, signrot, signangle, signskin1, signskin2, signskin3, signtickrate);
                            RemovePlayerID(signownerid);
                            storedData.saveSkinData.Remove(obj.net.ID);
                            SaveData();
                            AddPlayerID(signownerid);
                        }
                    }
                }
            }
        }
#endregion
#region Configuration
        bool Changed;
        bool BlockSignDamage = true;
        bool UseMaxSignChecks = true;
        public int maxsigns = 2;
        public int maxvipsigns = 10;
        static ulong sign1skin1 = 1315739526;
        static ulong sign1skin2 = 1315738576;
        static ulong sign1skin3 = 1315736914;
        static ulong sign2skin1 = 1315783052;
        static ulong sign2skin2 = 1315783411;
        static ulong sign2skin3 = 1315783777;
        static ulong sign3skin1 = 1316693925;
        static ulong sign3skin2 = 1316694367;
        static ulong sign3skin3 = 1316694805;
        static ulong sign4skin1 = 1321558935;
        static ulong sign4skin2 = 1321560877;
        static ulong sign4skin3 = 1318568592;
        static ulong sign5skin1 = 1327047573;
        static ulong sign5skin2 = 1327050402;
        static ulong sign5skin3 = 1327051288;
        //neon skin
        static ulong sign6skin1 = 1328477513;
        static ulong sign6skin2 = 1328482753;
        static ulong sign6skin3 = 1328482753;
        //Coffee
        static ulong sign7skin1 = 1328494655;
        static ulong sign7skin2 = 1328496689;
        static ulong sign7skin3 = 1328496689;
        //IceCream
        static ulong sign8skin1 = 1328562541;
        static ulong sign8skin2 = 1328563646;
        static ulong sign8skin3 = 1328563646;
        //Live Music
        static ulong sign9skin1 = 1328565602;
        static ulong sign9skin2 = 1328566647;
        static ulong sign9skin3 = 1328566647;
        //24HR Open
        static ulong sign10skin1 = 1328523019;
        static ulong sign10skin2 = 1328525057;
        static ulong sign10skin3 = 1328526730;
        //Wifi
        static ulong sign11skin1 = 1328530331;
        static ulong sign11skin2 = 1328532600;
        static ulong sign11skin3 = 1328532600;
        //24HR
        static ulong sign12skin1 = 1328657360;
        static ulong sign12skin2 = 1328658142;
        static ulong sign12skin3 = 1328658903;
        //Bar
        static ulong sign13skin1 = 1328660615;
        static ulong sign13skin2 = 1328661436;
        static ulong sign13skin3 = 1328662136;
        //Coffee Bar
        static ulong sign14skin1 = 1328663741;
        static ulong sign14skin2 = 1328664598;
        static ulong sign14skin3 = 1328665457;
        //Food
        static ulong sign15skin1 = 1328666723;
        static ulong sign15skin2 = 1328667715;
        static ulong sign15skin3 = 1328668631;
        //Motel
        static ulong sign16skin1 = 1328669415;
        static ulong sign16skin2 = 1328670130;
        static ulong sign16skin3 = 1328670791;
        //Open Arrow
        static ulong sign17skin1 = 1328671976;
        static ulong sign17skin2 = 1328671976;
        static ulong sign17skin3 = 1328672694;
        static ulong leftwingangel = 1322833102;
        static ulong leftwingfairy = 1322813799;
        static ulong leftwingblack = 1314069609;
        static ulong rightwingangel = 1322833810;
        static ulong rightwingfairy = 1322814164;
        static ulong rightwingblack = 1314070395;
        private void LoadVariables() {
            LoadConfigVariables();
            SaveConfig();
        }
        void LoadDefaultConfig() {
            Puts("Creating a new config file");
            Config.Clear();
            LoadVariables();
        }
        private void LoadConfigVariables() {
            CheckCfg("Max Neon Signs : Normal Authenicated User : ", ref maxsigns);
            CheckCfg("Max Neon Signs : VIP Authenticated User : ", ref maxvipsigns);
            CheckCfg("Block Damage to Signs : ", ref BlockSignDamage);
            CheckCfg("Sign 1 - SkinID for frame 1 : ", ref sign1skin1);
            CheckCfg("Sign 1 - SkinID for frame 2 : ", ref sign1skin2);
            CheckCfg("Sign 1 - SkinID for frame 3 : ", ref sign1skin3);
            CheckCfg("Sign 2 - SkinID for frame 1 : ", ref sign2skin1);
            CheckCfg("Sign 2 - SkinID for frame 2 : ", ref sign2skin2);
            CheckCfg("Sign 2 - SkinID for frame 3 : ", ref sign2skin3);
            CheckCfg("Sign 3 - SkinID for frame 1 : ", ref sign3skin1);
            CheckCfg("Sign 3 - SkinID for frame 2 : ", ref sign3skin2);
            CheckCfg("Sign 3 - SkinID for frame 3 : ", ref sign3skin3);
            CheckCfg("Sign 4 - SkinID for frame 1 : ", ref sign4skin1);
            CheckCfg("Sign 4 - SkinID for frame 2 : ", ref sign4skin2);
            CheckCfg("Sign 4 - SkinID for frame 3 : ", ref sign4skin3);
            CheckCfg("Sign 5 - SkinID for frame 1 : ", ref sign5skin1);
            CheckCfg("Sign 5 - SkinID for frame 2 : ", ref sign5skin2);
            CheckCfg("Sign 5 - SkinID for frame 3 : ", ref sign5skin3);
            CheckCfg("Wings - Angel Wings Skin Left : ", ref leftwingangel);
            CheckCfg("Wings - Angel Wings Skin Right : ", ref rightwingangel);
            CheckCfg("Wings - Fairy Wings Skin Left : ", ref leftwingfairy);
            CheckCfg("Wings - Fairy Wings Skin Right : ", ref rightwingfairy);
            CheckCfg("Wings - Black Wings Skin Left : ", ref leftwingblack);
            CheckCfg("Wings - Black Wings Skin Right : ", ref rightwingblack);
        }
        private void CheckCfg<T>(string Key, ref T var) {
            if (Config[Key] is T) var = (T)Config[Key];
            else Config[Key] = var;
        }
        private void CheckCfgFloat(string Key, ref float var) {
            if (Config[Key] != null) var = Convert.ToSingle(Config[Key]);
            else Config[Key] = var;
        }
        object GetConfig(string menu, string datavalue, object defaultValue) {
            var data = Config[menu] as Dictionary<string, object>;
            if (data == null) {
                data = new Dictionary<string, object>();
                Config[menu] = data;
                Changed = true;
            }
            object value;
            if (!data.TryGetValue(datavalue, out value)) {
                value = defaultValue;
                data[datavalue] = value;
                Changed = true;
            }
            return value;
        }
#endregion
#region Localization
        string msg(string key, string playerId = null) => lang.GetMessage(key, this, playerId);
        Dictionary<string, string> Messages = new Dictionary<string, string> {
            ["notasign"]
            = "You need to be looking at a sign to use that !! ", ["notflying"] = "You need to be flying to use Wings !! ", ["tryagain"] = "Something went wrong, please try again !! ", ["togglesign"] = "You have toggled the sign !! ", ["maxsigns"] = "You have reached your Maximum Neon Sign build limit !!", ["notowner"] = "You need to be owner of sign to use that !! ", ["notallowed"] = "You are not authorized to use that command !!"
        }
        ;
#endregion
#region Data
        static Dictionary<ulong, PlayerSignData> loadplayer = new Dictionary<ulong, PlayerSignData>();
        public class PlayerSignData {
            public BasePlayer player;
            public int signcount;
        }
        static StoredData storedData = new StoredData();
        DynamicConfigFile dataFile;
        public class StoredData {
            public Dictionary<uint, StoredSkinsData> saveSkinData = new Dictionary<uint, StoredSkinsData>();
            public StoredData() {
            }
        }
        public class StoredSkinsData {
            public ulong ownerid;
            public string pos;
            public string eangles;
            public string rot;
            public ulong skin1;
            public ulong skin2;
            public ulong skin3;
            public int tickrate;
        }
        void LoadDataFile() {
            dataFile = Interface.Oxide.DataFileSystem.GetFile(Title);
            try {
                storedData = dataFile.ReadObject<StoredData>();
            }
            catch {
            }
            if (storedData == null) storedData = new StoredData();
        }
        void AddData(uint entnetid, ulong sownerid, string spos, string seangles, string srot, ulong skinid1, ulong skinid2, ulong skinid3, int signtickrate) {
            if (storedData.saveSkinData.ContainsKey(entnetid)) storedData.saveSkinData.Remove(entnetid);
            storedData.saveSkinData.Add(entnetid, new StoredSkinsData {
                ownerid = sownerid, pos = spos, eangles = seangles, rot = srot, skin1 = skinid1, skin2 = skinid2, skin3 = skinid3, tickrate = signtickrate,
            }
            );
            SaveData();
        }
        void RemoveData(uint entnetid) {
            if (storedData.saveSkinData.ContainsKey(entnetid)) storedData.saveSkinData.Remove(entnetid);
        }
        void SaveData() {
            if (dataFile != null && storedData != null) {
                dataFile.WriteObject(storedData);
            }
        }
        public static Vector3 StringToVector3(string sVector) {
            if (sVector.StartsWith("(") && sVector.EndsWith(")")) {
                sVector = sVector.Substring(1, sVector.Length - 2);
            }
            string[] sArray = sVector.Split(',');
            Vector3 result = new Vector3(float.Parse(sArray[0]), float.Parse(sArray[1]), float.Parse(sArray[2]));
            return result;
        }
        public static Quaternion StringToQuaternion(string sVector) {
            if (sVector.StartsWith("(") && sVector.EndsWith(")")) {
                sVector = sVector.Substring(1, sVector.Length - 2);
            }
            string[] sArray = sVector.Split(',');
            Quaternion result = new Quaternion(float.Parse(sArray[0]), float.Parse(sArray[1]), float.Parse(sArray[2]), float.Parse(sArray[3]));
            return result;
        }
#endregion
#region Commands
        [ChatCommand("neon")]
        void cmdChatNeonGUI(BasePlayer player, string command, string[] args) {
            if (isAllowed(player, "neonskins.skin") || isAllowed(player, "neonskins.add")) {
                var hasgui = player.GetComponent<SignGUI>();
                if (hasgui) {
                    hasgui.OnDestroy();
                    return;
                }
                player.gameObject.AddComponent<SignGUI>();
            }
            else SendReply(player, msg("notallowed", player.UserIDString));
        }
        [ChatCommand("neon.add")]
        void cmdChatNeonAdd(BasePlayer player, string command, string[] args) {
            if (isAllowed(player, "neonskins.add")) {
                if (SignLimitReached(player)) {
                    SendReply(player, msg("maxsigns", player.UserIDString));
                    return;
                }
                RaycastHit hit;
                if (Physics.Raycast(player.eyes.HeadRay(), out hit, 10f)) newNeon = hit.GetTransform().gameObject.ToBaseEntity();
                if (newNeon == null) return;
                if (newNeon.OwnerID != player.userID) {
                    SendReply(player, msg("notowner", player.UserIDString));
                    return;
                }
                if (newNeon is Signage) {
                    if (args != null && args.Length > 0) {
                        var getstring = args[0].ToLower();
                        Vector3 wide = newNeon.transform.eulerAngles;
                        Vector3 tall = newNeon.transform.eulerAngles + new Vector3(90, 0, 0);
                        Vector3 tall2 = newNeon.transform.eulerAngles + new Vector3(270, 0, 0);
                        Vector3 pos = newNeon.transform.position;
                        Quaternion rot = newNeon.transform.rotation;
                        BaseEntity.saveList.Remove(newNeon);
                        newNeon.Kill(BaseNetworkable.DestroyMode.None);
                        if (getstring == "1") timer.Once(1f, () => SpawnSign(player.userID, pos, rot, wide, sign1skin1, sign1skin2, sign1skin3, 10));
                        if (getstring == "2") timer.Once(1f, () => SpawnSign(player.userID, pos, rot, wide, sign2skin1, sign2skin2, sign2skin3, 10));
                        if (getstring == "3") timer.Once(1f, () => SpawnSign(player.userID, pos, rot, wide, sign3skin1, sign3skin2, sign3skin3, 10));
                        if (getstring == "4") timer.Once(1f, () => SpawnSign(player.userID, pos, rot, wide, sign4skin1, sign4skin2, sign4skin3, 10));
                        if (getstring == "5") timer.Once(1f, () => SpawnSign(player.userID, pos, rot, wide, sign5skin1, sign5skin2, sign5skin3, 10));
                        if (getstring == "6") timer.Once(1f, () => SpawnSign(player.userID, pos, rot, wide, sign6skin1, sign6skin2, sign6skin3, 10));
                        if (getstring == "7") timer.Once(1f, () => SpawnSign(player.userID, pos, rot, wide, sign7skin1, sign7skin2, sign7skin3, 10));
                        if (getstring == "8") timer.Once(1f, () => SpawnSign(player.userID, pos, rot, tall2, sign8skin1, sign8skin2, sign8skin3, 10));
                        if (getstring == "9") timer.Once(1f, () => SpawnSign(player.userID, pos, rot, tall2, sign9skin1, sign9skin2, sign9skin3, 10));
                        if (getstring == "10") timer.Once(1f, () => SpawnSign(player.userID, pos, rot, wide, sign10skin1, sign10skin2, sign10skin3, 10));
                        if (getstring == "11") timer.Once(1f, () => SpawnSign(player.userID, pos, rot, wide, sign11skin1, sign11skin2, sign11skin3, 10));
                        if (getstring == "12") timer.Once(1f, () => SpawnSign(player.userID, pos, rot, wide, sign12skin1, sign12skin2, sign12skin3, 10));
                        if (getstring == "13") timer.Once(1f, () => SpawnSign(player.userID, pos, rot, wide, sign13skin1, sign13skin2, sign13skin3, 10));
                        if (getstring == "14") timer.Once(1f, () => SpawnSign(player.userID, pos, rot, tall, sign14skin1, sign14skin2, sign14skin3, 10));
                        if (getstring == "15") timer.Once(1f, () => SpawnSign(player.userID, pos, rot, tall, sign15skin1, sign15skin2, sign15skin3, 10));
                        if (getstring == "16") timer.Once(1f, () => SpawnSign(player.userID, pos, rot, tall, sign16skin1, sign16skin2, sign16skin3, 10));
                        if (getstring == "17") timer.Once(1f, () => SpawnSign(player.userID, pos, rot, wide, sign17skin1, sign17skin2, sign17skin3, 10));
                        return;
                    }
                    else SendReply(player, msg("tryagain", player.UserIDString));
                }
                else SendReply(player, msg("tryagain", player.UserIDString));
            }
            else SendReply(player, msg("notallowed", player.UserIDString));
        }
        [ChatCommand("neon.skinwide")]
        void cmdChatNeonSkinWide(BasePlayer player, string command, string[] args) {
            if (isAllowed(player, "neonskins.skin")) {
                if (SignLimitReached(player)) {
                    SendReply(player, msg("maxsigns", player.UserIDString));
                    return;
                }
                RaycastHit hit;
                if (Physics.Raycast(player.eyes.HeadRay(), out hit, 10f)) newNeon = hit.GetTransform().gameObject.ToBaseEntity();
                if (newNeon == null) return;
                if (newNeon.OwnerID != player.userID) {
                    SendReply(player, msg("notowner", player.UserIDString));
                    return;
                }
                if (newNeon is Signage) {
                    PrepNeon(player, newNeon, args, true, false);
                }
                else SendReply(player, msg("tryagain", player.UserIDString));
            }
            else SendReply(player, msg("notallowed", player.UserIDString));
        }
        [ChatCommand("neon.skintall")]
        void cmdChatNeonSkinTall(BasePlayer player, string command, string[] args) {
            if (isAllowed(player, "neonskins.skin")) {
                if (SignLimitReached(player)) {
                    SendReply(player, msg("maxsigns", player.UserIDString));
                    return;
                }
                RaycastHit hit;
                if (Physics.Raycast(player.eyes.HeadRay(), out hit, 10f)) newNeon = hit.GetTransform().gameObject.ToBaseEntity();
                if (newNeon == null) return;
                if (newNeon.OwnerID != player.userID) {
                    SendReply(player, msg("notowner", player.UserIDString));
                    return;
                }
                if (newNeon is Signage) {
                    PrepNeon(player, newNeon, args, false, false);
                }
                else SendReply(player, msg("tryagain", player.UserIDString));
            }
            else SendReply(player, msg("notallowed", player.UserIDString));
        }
        [ChatCommand("neon.skinattire")]
        void cmdNeonSkinAttire(BasePlayer player, string command, string[] args) {
            if (!isAllowed(player, "neonskins.attire")) {
                SendReply(player, msg("notallowed", player.UserIDString));
                return;
            }
            int iAmount = 1;
            string str1 = "";
            ulong skinid1 = 0;
            ulong skinid2 = 0;
            ulong skinid3 = 0;
            if (args != null && args.Length > 0) {
                str1 = args[0].ToLower();
            }
            if (args != null && args.Length > 1) {
                var getstring1 = args[1]?.ToLower();
                if (UInt64.TryParse(getstring1, out skinid1)) ;
            }
            if (args != null && args.Length > 2) {
                var getstring2 = args[2]?.ToLower();
                if (UInt64.TryParse(getstring2, out skinid2)) ;
            }
            if (args != null && args.Length > 3) {
                var getstring3 = args[3]?.ToLower();
                if (UInt64.TryParse(getstring3, out skinid3)) ;
            }
            Item num = ItemManager.CreateByPartialName(str1, 1);
            if (num == null) {
                SendReply(player, "Invalid Item!");
                return;
            }
            int itemID = num.info.itemid;
            var getitem = player.inventory.containerWear.FindItemByItemID(itemID);
            if (getitem != null) {
                getitem.skin = skinid1;
                getitem.MarkDirty();
                var addchanger = player.gameObject.AddComponent<AttireChanger>();
                addchanger.skin1 = skinid1;
                addchanger.skin2 = skinid2;
                addchanger.skin3 = skinid3;
                addchanger.GetItem(itemID);
            }
            return;
        }
        [ChatCommand("neon.skinrug")]
        void cmdChatNeonSkinRug(BasePlayer player, string command, string[] args) {
            if (isAllowed(player, "neonskins.skin")) {
                if (SignLimitReached(player)) {
                    SendReply(player, msg("maxsigns", player.UserIDString));
                    return;
                }
                RaycastHit hit;
                if (Physics.Raycast(player.eyes.HeadRay(), out hit, 10f)) newNeon = hit.GetTransform().gameObject.ToBaseEntity();
                if (newNeon == null) return;
                if (newNeon.OwnerID != player.userID) {
                    SendReply(player, msg("notowner", player.UserIDString));
                    return;
                }
                if (newNeon.name.Contains("rug/rug")) {
                    PrepNeon(player, newNeon, args, true, true);
                }
                else SendReply(player, msg("tryagain", player.UserIDString));
            }
            else SendReply(player, msg("notallowed", player.UserIDString));
        }
        [ChatCommand("neon.toggle")]
        void cmdChatPimpToggle(BasePlayer player, string command, string[] args) {
            if (isAllowed(player, "neonskins.skin") || isAllowed(player, "neonskins.add")) {
                RaycastHit hit;
                if (Physics.Raycast(player.eyes.HeadRay(), out hit, 10f)) newNeon = hit.GetTransform().gameObject.ToBaseEntity();
                if (newNeon == null) return;
                if (newNeon.OwnerID != player.userID) {
                    SendReply(player, msg("notowner", player.UserIDString));
                    return;
                }
                if (IsPimpedOut(newNeon)) {
                    ToggleSignState(newNeon);
                    SendReply(player, msg("togglesign", player.UserIDString));
                }
                else SendReply(player, msg("tryagain", player.UserIDString));
            }
            else SendReply(player, msg("notallowed", player.UserIDString));
        }
        [ChatCommand("neon.cleardatabase")]
        void cmdChatNeonClearDataBase(BasePlayer player, string command, string[] args) {
            if (player.net?.connection?.authLevel > 1) {
                storedData.saveSkinData.Clear();
                SaveData();
            }
            return;
        }
        [ChatCommand("neon.tickrate")]
        void cmdChatNeonTickRate(BasePlayer player, string command, string[] args) {
            if (isAllowed(player, "neonskins.skin") || isAllowed(player, "neonskins.add")) {
                RaycastHit hit;
                if (Physics.Raycast(player.eyes.HeadRay(), out hit, 10f)) newNeon = hit.GetTransform().gameObject.ToBaseEntity();
                if (newNeon == null) return;
                if (newNeon.OwnerID != player.userID) {
                    SendReply(player, msg("notowner", player.UserIDString));
                    return;
                }
                if (IsPimpedOut(newNeon)) {
                    int tickrate = 10;
                    if (args != null && args.Length > 0) {
                        var getstring1 = args[0]?.ToLower();
                        if (int.TryParse(getstring1, out tickrate)) ;
                    }
                    if (tickrate < 5) tickrate = 5;
                    ToggleSignTickRate(newNeon, tickrate);
                    SendReply(player, msg("togglesign", player.UserIDString));
                }
                else SendReply(player, msg("tryagain", player.UserIDString));
            }
            else SendReply(player, msg("notallowed", player.UserIDString));
        }
        [ChatCommand("neon.wings")]
        void cmdChatToggleWings(BasePlayer player, string command, string[] args) {
            var argstring = "angel";
            if (isAllowed(player, "neonskins.wings")) {
                var haswings = player.GetComponent<WingEntity>();
                if (!haswings) {
                    if (!player.IsFlying) {
                        SendReply(player, msg("notflying", player.UserIDString));
                        return;
                    }
                    haswings = player.gameObject.AddComponent<WingEntity>();
                    if (args != null && args.Length > 0) {
                        var getstring = args[0].ToLower();
                        if (getstring == "black") {
                            haswings.isblack = true;
                            haswings.isangel = false;
                            haswings.isfairy = false;
                            haswings.AddWings();
                            return;
                        }
                        if (getstring == "fairy") {
                            haswings.isblack = false;
                            haswings.isangel = false;
                            haswings.isfairy = true;
                            haswings.AddWings();
                            return;
                        }
                        if (getstring == "angel") {
                            haswings.isblack = false;
                            haswings.isangel = true;
                            haswings.isfairy = false;
                            haswings.AddWings();
                            return;
                        }
                    }
                    haswings.isblack = false;
                    haswings.isangel = true;
                    haswings.isfairy = false;
                    haswings.AddWings();
                    return;
                    return;
                }
                if (haswings) {
                    GameObject.Destroy(haswings);
                    return;
                }
            }
            SendReply(player, "You are not authorized to use that command");
            return;
        }
        [ChatCommand("neon.count")]
        void cmdChatNeonCount(BasePlayer player, string command, string[] args) {
            if (!loadplayer.ContainsKey(player.userID)) {
                SendReply(player, "You have no Neon Signs !!");
                return;
            }
            SendReply(player, "Current Neon Signs : " + (loadplayer[player.userID].signcount));
        }
#endregion
#region Hooks
        bool IsPimpedOut(BaseEntity entity) {
            if (entity.GetComponent<SkinChanger>()) return true;
            return false;
        }
        void ToggleSignState(BaseEntity entity) {
            var isSign = entity.GetComponent<SkinChanger>();
            if (isSign && isSign.isanimated == true) {
                isSign.isanimated = false;
                return;
            }
            if (isSign && isSign.isanimated == false) {
                isSign.isanimated = true;
                return;
            }
            if (!isSign) entity.gameObject.AddComponent<SkinChanger>();
        }
        void ToggleSignTickRate(BaseEntity entity, int signtickrate) {
            var isSign = entity.GetComponent<SkinChanger>() ?? null;
            if (isSign != null) {
                entity.Invoke("KillMessage", 0.1f);
                var signownerid = storedData.saveSkinData[entity.net.ID].ownerid;
                var signpos = StringToVector3(storedData.saveSkinData[entity.net.ID].pos);
                var signrot = StringToQuaternion(storedData.saveSkinData[entity.net.ID].rot);
                var signangle = StringToVector3(storedData.saveSkinData[entity.net.ID].eangles);
                var signskin1 = storedData.saveSkinData[entity.net.ID].skin1;
                var signskin2 = storedData.saveSkinData[entity.net.ID].skin2;
                var signskin3 = storedData.saveSkinData[entity.net.ID].skin3;
                SpawnSign(signownerid, signpos, signrot, signangle, signskin1, signskin2, signskin3, signtickrate);
                RemovePlayerID(signownerid);
                storedData.saveSkinData.Remove(entity.net.ID);
                SaveData();
                AddPlayerID(signownerid);
            }
            return;
        }
        void OnEntityDeath(BaseCombatEntity entity, HitInfo info) {
            if (entity == null || entity.net == null) return;
            if (storedData.saveSkinData.ContainsKey(entity.net.ID)) {
                storedData.saveSkinData.Remove(entity.net.ID);
                SaveData();
            }
        }
        void OnEntityTakeDamage(BaseCombatEntity entity, HitInfo hitInfo) {
            if (!BlockSignDamage) return;
            if (entity == null || hitInfo == null) return;
            var isneonsign = entity.GetComponentInParent<SkinChanger>() ?? null;
            if (isneonsign != null) hitInfo.damageTypes.ScaleAll(0);
            return;
        }
        object CanPickupEntity(BasePlayer player, BaseCombatEntity entity) {
            if (entity == null || player == null) return null;
            if (entity.GetComponentInParent<SkinChanger>() && entity.OwnerID != player.userID) return false;
            return null;
        }
        bool SignLimitReached(BasePlayer player) {
            if (UseMaxSignChecks) {
                if (isAllowed(player, "neonskins.nolimit")) return false;
                if (loadplayer.ContainsKey(player.userID)) {
                    var currentcount = loadplayer[player.userID].signcount;
                    var maxallowed = maxsigns;
                    if (isAllowed(player, "neonskins.viplimit")) maxallowed = maxvipsigns;
                    if (currentcount >= maxallowed) return true;
                }
            }
            return false;
        }
        void AddPlayerID(ulong ownerid) {
            if (!loadplayer.ContainsKey(ownerid)) {
                loadplayer.Add(ownerid, new PlayerSignData {
                    signcount = 1
                }
                );
                return;
            }
            loadplayer[ownerid].signcount = loadplayer[ownerid].signcount + 1;
        }
        void RemovePlayerID(ulong ownerid) {
            if (loadplayer.ContainsKey(ownerid)) loadplayer[ownerid].signcount = loadplayer[ownerid].signcount - 1;
            return;
        }
        void PrepNeon(BasePlayer player, BaseEntity newNeon, string[] args, bool iswide, bool isrug) {
            var modifier = new Vector3();
            if (iswide) modifier = new Vector3(0, 0, 0);
            if (!iswide) modifier = new Vector3(90, 0, 0);
            Vector3 pos = newNeon.transform.position;
            Vector3 ang = newNeon.transform.eulerAngles + modifier;
            Quaternion rot = newNeon.transform.rotation;
            ulong skinid1 = 0;
            ulong skinid2 = 0;
            ulong skinid3 = 0;
            if (args != null && args.Length > 0) {
                var getstring1 = args[0]?.ToLower();
                if (UInt64.TryParse(getstring1, out skinid1)) ;
            }
            if (args != null && args.Length > 1) {
                var getstring2 = args[1]?.ToLower();
                if (UInt64.TryParse(getstring2, out skinid2)) ;
            }
            if (args != null && args.Length > 2) {
                var getstring3 = args[2]?.ToLower();
                if (UInt64.TryParse(getstring3, out skinid3)) ;
            }
            if (isrug) {
                SkinRug(newNeon, skinid1, skinid2, skinid3);
                return;
            }
            BaseEntity.saveList.Remove(newNeon);
            newNeon.Kill(BaseNetworkable.DestroyMode.None);
            timer.Once(1f, () => SpawnSign(player.userID, pos, rot, ang, skinid1, skinid2, skinid3, 10));
        }
        void SpawnSign(ulong ownerid, Vector3 pos, Quaternion rot, Vector3 angle, ulong skinid1, ulong skinid2, ulong skinid3, int signtickrate) {
            string prefabnewNeon = "assets/prefabs/deployable/rug/rug.deployed.prefab";
            var sign = GameManager.server.CreateEntity(prefabnewNeon, pos, rot, true);
            sign.transform.eulerAngles = angle + new Vector3(0, 90, 90);
            sign.transform.position = sign.transform.position + new Vector3(0f, 0.5f, 0f);
            sign.skinID = skinid1;
            sign?.Spawn();
            sign.OwnerID = ownerid;
            var pimpedout = sign.gameObject.AddComponent<SkinChanger>();
            pimpedout.skin1 = skinid1;
            pimpedout.skin2 = skinid2;
            pimpedout.skin3 = skinid3;
            pimpedout.tickrate = signtickrate;
            AddData(sign.net.ID, ownerid, pos.ToString(), angle.ToString(), rot.ToString(), skinid1, skinid2, skinid3, signtickrate);
            AddPlayerID(ownerid);
        }
        void SkinRug(BaseEntity entity, ulong skinid1, ulong skinid2, ulong skinid3) {
            var pimpedout = entity.gameObject.AddComponent<SkinChanger>();
            pimpedout.skin1 = skinid1;
            pimpedout.skin2 = skinid2;
            pimpedout.skin3 = skinid3;
        }
        void OnPlayerDisconnected(BasePlayer player, string reason) {
            var haswings = player.GetComponent<WingEntity>();
            if (haswings != null) {
                GameObject.Destroy(haswings);
            }
            var hasgui = player.GetComponent<SignGUI>();
            if (hasgui) hasgui.OnDestroy();
            return;
        }
        void OnPlayerRespawned(BasePlayer player) {
            var haswings = player.GetComponent<WingEntity>();
            if (haswings != null) {
                GameObject.Destroy(haswings);
            }
            var hasgui = player.GetComponent<SignGUI>();
            if (hasgui) hasgui.OnDestroy();
            return;
        }
        private object OnEntityGroundMissing(BaseEntity entity) {
            var isneonsign = entity.GetComponent<SkinChanger>();
            if (isneonsign != null) return false;
            return null;
        }
        void Unload() {
            SaveData();
            DestroyAll<WingEntity>();
            DestroyAll<SignGUI>();
        }
        static void DestroyAll<T>() {
            var objects = GameObject.FindObjectsOfType(typeof(T));
            if (objects != null) foreach (var gameObj in objects) GameObject.Destroy(gameObj);
        }
#endregion
#region Attire Changer
        class AttireChanger : MonoBehaviour {
            BasePlayer player;
            Item item;
            int counter;
            public bool isanimated;
            public ulong skin1;
            public ulong skin2;
            public ulong skin3;
            public int framecounter;
            void Awake() {
                player = GetComponent<BasePlayer>();
                counter = 0;
                isanimated = true;
                framecounter = 4;
            }
            public void GetItem(int itemID) {
                item = player.inventory.containerWear.FindItemByItemID(itemID);
            }
            bool SingleSkin() {
                if (skin1 == 0 || skin2 == 0 || skin3 == 0) return true;
                return false;
            }
            void FixedUpdate() {
                if (SingleSkin()) return;
                if (counter == 10) item.skin = skin2;
                if (counter == 20) item.skin = skin3;
                RefreshAll();
                counter = counter + 1;
                if (counter == 30) {
                    item.skin = skin1;
                    counter = 0;
                    RefreshAll();
                }
            }
            public void RefreshAll() {
                item.MarkDirty();
            }
        }
#endregion
#region Skin Changer
        class SkinChanger : MonoBehaviour {
            BaseEntity entity;
            Vector3 entitypos;
            Quaternion entityrot;
            int counter;
            public bool isanimated;
            int skinnum;
            public ulong skin1;
            public ulong skin2;
            public ulong skin3;
            public int tickrate;
            ulong ownerid;
            uint entityid;
            NeonSkins instance;
            void Awake() {
                instance = new NeonSkins();
                entity = GetComponentInParent<BaseEntity>();
                entityid = entity.net.ID;
                entitypos = entity.transform.position;
                entityrot = Quaternion.identity;
                ownerid = entity.OwnerID;
                counter = 0;
                isanimated = true;
                tickrate = 10;
            }
            void ClntDstry(BaseNetworkable entity, bool recursive = true) {
                if (Net.sv.write.Start()) {
                    Net.sv.write.PacketID(Message.Type.EntityDestroy);
                    Net.sv.write.UInt32(entity.net.ID);
                    Net.sv.write.UInt8(0);
                    Net.sv.write.Send(new SendInfo(entity.net.group.subscribers));
                }
                if (recursive && entity.children != null) for (int i = 0; i < entity.children.Count; i++) ClntDstry(entity.children[i], false);
            }
            void EnttSnpsht(BaseNetworkable entity, bool recursive = true) {
                entity.InvalidateNetworkCache();
                List<Connection> subscribers = entity.net.group == null ? Net.sv.connections : entity.net.group.subscribers;
                if (subscribers != null && subscribers.Count > 0) {
                    for (int i = 0; i < subscribers.Count; i++) {
                        Connection connection = subscribers[i];
                        BasePlayer basePlayer = connection.player as BasePlayer;
                        if (!(basePlayer == null)) {
                            if (Net.sv.write.Start()) {
                                connection.validate.entityUpdates = connection.validate.entityUpdates + 1u;
                                BaseNetworkable.SaveInfo saveInfo = new BaseNetworkable.SaveInfo {
                                    forConnection = connection, forDisk = false
                                }
                                ;
                                Net.sv.write.PacketID(Message.Type.Entities);
                                Net.sv.write.UInt32(connection.validate.entityUpdates);
                                entity.ToStreamForNetwork(Net.sv.write, saveInfo);
                                Net.sv.write.Send(new SendInfo(connection));
                            }
                        }
                    }
                }
                if (recursive && entity.children != null) for (int i = 0; i < entity.children.Count; i++) EnttSnpsht(entity.children[i], false);
            }
            bool SingleSkin() {
                if (skin1 == 0 || skin2 == 0 || skin3 == 0) return true;
                return false;
            }
            void FixedUpdate() {
                if (!isanimated || SingleSkin()) return;
                if (counter == tickrate) entity.skinID = skin2;
                if (counter == (tickrate * 2)) entity.skinID = skin3;
                RefreshAll();
                counter = counter + 1;
                if (counter == (tickrate * 3)) {
                    entity.skinID = skin1;
                    counter = 0;
                    RefreshAll();
                }
            }
            public void RefreshAll() {
                entity.transform.hasChanged = true;
                ClntDstry(entity, true);
                EnttSnpsht(entity, true);
                entity.SendNetworkUpdateImmediate();
                entity.UpdateNetworkGroup();
            }
            public void OnDestroy() {
                if (loadplayer.ContainsKey(ownerid)) loadplayer[ownerid].signcount = loadplayer[ownerid].signcount - 1;
                if (entity != null && !entity.IsDestroyed) {
                    entity.Invoke("KillMessage", 0.1f);
                }
            }
        }
#endregion
#region Wings
        class WingEntity : BaseEntity {
            BasePlayer entity;
            Vector3 entitypos;
            Quaternion entityrot;
            BaseEntity wing1;
            BaseEntity wing2;
            bool isback;
            int counter;
            public bool isfairy;
            public bool isangel;
            public bool isblack;
            void Awake() {
                entity = GetComponentInParent<BasePlayer>();
                entitypos = entity.transform.position;
                entityrot = Quaternion.identity;
                isback = false;
                isfairy = true;
                isangel = false;
                isblack = false;
                counter = 0;
            }
            public void AddWings() {
                string prefabwing = "assets/prefabs/deployable/rug/rug.deployed.prefab";
                wing1 = GameManager.server.CreateEntity(prefabwing, entity.transform.position, entity.transform.rotation, true);
                wing1.GetComponent<BaseNetworkable>()._limitedNetworking = false;
                wing1.enableSaving = false;
                if (isangel) wing1.skinID = leftwingangel;
                if (isfairy) wing1.skinID = leftwingfairy;
                if (isblack) wing1.skinID = leftwingblack;
                var sfstab1 = wing1.GetComponent<StabilityEntity>();
                if (sfstab1) sfstab1.grounded = true;
                wing1.Spawn();
                wing1.SetParent(entity, true, false);
                wing1.transform.localEulerAngles = new Vector3(0, 270, 90);
                if (isangel) wing1.transform.localPosition = new Vector3(-1.6f, 1.3f, -0.02f);
                if (isfairy) wing1.transform.localPosition = new Vector3(-1.5f, 1.5f, -0.02f);
                if (isblack) wing1.transform.localPosition = new Vector3(-1.5f, 1.6f, -0.02f);
                wing2 = GameManager.server.CreateEntity(prefabwing, entity.transform.position, entity.transform.rotation, true);
                wing2.GetComponent<BaseNetworkable>()._limitedNetworking = false;
                wing2.enableSaving = false;
                if (isangel) wing2.skinID = rightwingangel;
                if (isfairy) wing2.skinID = rightwingfairy;
                if (isblack) wing2.skinID = rightwingblack;
                var sfstab2 = wing2.GetComponent<StabilityEntity>();
                if (sfstab2) sfstab2.grounded = true;
                wing2.Spawn();
                wing2.SetParent(entity, true, false);
                wing2.transform.localEulerAngles = new Vector3(0, 270, 90);
                if (isangel) wing2.transform.localPosition = new Vector3(1.6f, 1.3f, -0.02f);
                if (isfairy) wing2.transform.localPosition = new Vector3(1.5f, 1.5f, -0.02f);
                if (isblack) wing2.transform.localPosition = new Vector3(1.5f, 1.6f, -0.02f);
            }
            void FixedUpdate() {
                //RefreshEntities();
                if (!isblack) return;
                if (counter == 5) {
                    if (isblack) Effect.server.Run("assets/bundled/prefabs/fx/fire/fire_v2.prefab", wing1.GetComponent<BaseEntity>(), 0, new Vector3(), new Vector3(), null, true);
                    if (isblack) Effect.server.Run("assets/bundled/prefabs/fx/fire/fire_v2.prefab", wing2.GetComponent<BaseEntity>(), 0, new Vector3(), new Vector3(), null, true);
                }
                if (counter == 60) {
                    counter = 0;
                    return;
                }
                counter = counter + 1;
            }
            void RefreshEntities() {
                if (wing1 != null) wing1.transform.hasChanged = true;
                if (wing1 != null) wing1.SendNetworkUpdateImmediate();
                if (wing1 != null) wing1.UpdateNetworkGroup();
                if (wing2 != null) wing2.transform.hasChanged = true;
                if (wing2 != null) wing2.SendNetworkUpdateImmediate();
                if (wing2 != null) wing2.UpdateNetworkGroup();
            }
            public void OnDestroy() {
                if (wing1 != null) {
                    wing1.Invoke("KillMessage", 0.1f);
                }
                if (wing2 != null) {
                    wing2.Invoke("KillMessage", 0.1f);
                }
                GameObject.Destroy(this);
            }
        }
#endregion
#region Sign GUI
        class SignGUI : MonoBehaviour {
            BasePlayer player;
            NeonSkins neonskins;
            string b1;
            void Awake() {
                neonskins = new NeonSkins();
                player = base.GetComponentInParent<BasePlayer>();
                AddSignGUI(player);
            }
            public void AddSignGUI(BasePlayer player) {
                DestroyCui(player);
                var elements = new CuiElementContainer();
                elements.Add(new CuiElement {
                    Name = "Neongui", Parent = "Overlay", Components = {
                        new CuiRawImageComponent {
                            Color = "1 1 1 1", Url = "http://i.imgur.com/Bgc99p2.png", Sprite = "assets/content/textures/generic/fulltransparent.tga"
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = "0.0 0.2", AnchorMax = "0.28 0.9"
                        }
                    }
                }
                );
                b1 = elements.Add(new CuiButton {
                    Button = {
                        Command = $"chat.say /neon", Color = "0.0 0.0 0.0 0.7"
                    }
                    , RectTransform = {
                        AnchorMin = "0.24 0.2", AnchorMax = "0.28 0.23"
                    }
                    , Text = {
                        Text = "Exit", FontSize = 12, Color = "1.0 1.0 1.0 1.0", Align = TextAnchor.MiddleCenter
                    }
            
// ... [Code preview truncated due to length. Full source in attached file] ...

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

Другие ресурсы пользователя 15FPS

Сверху