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

FREE ColdFusionParachute : 1.0.1 1.0.1

Нет прав для скачивания
C#:
using System;
using UnityEngine;
using Rust;
using Oxide.Core.Plugins;
using Oxide.Core.Configuration;
using Oxide.Game.Rust.Cui;
using GameTips;
using System.Collections.Generic;

namespace Oxide.Plugins
{
    [Info("ColdFusionParachute", "Viking", "1.0.1")]
    class ColdFusionParachute : RustPlugin
    {


        #region Loadup

        [PluginReference]
        Plugin Clans;

        static ColdFusionParachute _instance;
        BaseEntity coldfusionparachutePlane;
        static LayerMask layerMask;
        static List<ulong> coldfusionparachuteplayerlist = new List<ulong>();
        static List<ulong> isParachuting = new List<ulong>();
        static List<ulong> cooldownlist = new List<ulong>();


        void Loaded()
        {
            _instance = this;
            LoadVariables();
            LoadMessages();
            permission.RegisterPermission("coldfusionparachute.use", this);
            permission.RegisterPermission("coldfusionparachute.localrespawn", this);
            permission.RegisterPermission("coldfusionparachute.admin", this);
            layerMask = (1 << 29);
            layerMask |= (1 << 18);
            layerMask = ~layerMask;
        }

        #endregion

        #region Configuration

        private bool enableLocalRespawn = false;
        private static float localRespawnDistance = 300;

        private static float parchuteFwdSpeed = 15f;
        private static float parachuteDownSpeed = 15f;

        private float OrbitaDropCountdown = 10f;

        private static float FlightDeck = 1000f;
        private static float GlobalMapOffset = 500f;

        private bool UseCooldown = true;
        static float ColdFusionParachuteCoolDown = 600f;

        private bool AllowFreeFall = false;

        private static bool ForceDismountFromPlane = true;
        private static float ColdFusionParachutePlaneDespawn = 100f;

        private bool DoColdFusionParachuteOnFirstTime = true;

        private static float ForceJumpTime = 60f;

        private static bool EnableRespawnButton = true;
        private static bool UseRandomRespawn = true;

        private static ulong wallskinid = 2015629921;

        private bool Changed;

        void LoadVariables()
        {
            LoadConfigVariables();
            SaveConfig();
        }

        void LoadDefaultConfig()
        {
            Puts("Creating a new config file");
            Config.Clear();
            LoadVariables();
        }

        void LoadConfigVariables()
        {
            CheckCfg("Global - Map size Offset when finding global drop position (higher number means closer to center of map, less chance over water) ", ref GlobalMapOffset);

            CheckCfgUlong("Logo - Skin ID for Back wall ColdFusionParachute plane : ", ref wallskinid);
            CheckCfg("Cooldown - Use ColdFusionParachute pack cooldown ? ", ref UseCooldown);

            CheckCfg("Parachute : Allow players to open there own Parachutes and allow freefalling (if false, chutes auto open and players cannot remove them till they land)? ", ref AllowFreeFall);

            CheckCfgFloat("Orbita Drop - Countdown time from this, (will annouce start, 75%, 50% and 25% time left) ", ref OrbitaDropCountdown);

            CheckCfg("Plane - Enable force dismount of players after a certain time ? ", ref ForceDismountFromPlane);
            CheckCfgFloat("Plane - Players will be force dismounted after this many seconds while seated in ColdFusionParachute plane (if enabled) ", ref ForceJumpTime);

            CheckCfg("Respawn - Enable Button on respawn screen.(Will do random TP in air with Chute attached) ? ", ref EnableRespawnButton);
            CheckCfg("Respawn - Use Random Respawn location when pressing ColdFusionParachute respawn button ? ", ref UseRandomRespawn);
            CheckCfg("Respawn - Local ColdFusionParachute Respawn - Enable ColdFusionParachute respawn to only drop you within a local radius of corpse ?", ref enableLocalRespawn);
            CheckCfg("Respawn - Local ColdFusionParachute Respawn - Max Distance from corpse ", ref localRespawnDistance);

            CheckCfgFloat("Plane - ColdFusionParachute plane will despawn if no players are on board after this long : ", ref ColdFusionParachutePlaneDespawn);
            CheckCfgFloat("Parachute - Downward speed when using parachute : ", ref parachuteDownSpeed);
            CheckCfgFloat("Parachute - Forward speed when using parachute and forward button : ", ref parchuteFwdSpeed);
            CheckCfgFloat("Flightdeck - Altitude at which ColdFusionParachute Plane flys at : ", ref FlightDeck);
            CheckCfgFloat("Cooldown - After using a ColdFusionParachute pack, time player must wait to use another : ", ref ColdFusionParachuteCoolDown);
        }

        void CheckCfg<T>(string Key, ref T var)
        {
            if (Config[Key] is T)
                var = (T)Config[Key];
            else
                Config[Key] = var;
        }

        void CheckCfgFloat(string Key, ref float var)
        {

            if (Config[Key] != null)
                var = System.Convert.ToSingle(Config[Key]);
            else
                Config[Key] = var;
        }

        void CheckCfgUlong(string Key, ref ulong var)
        {

            if (Config[Key] != null)
                var = Convert.ToUInt64(Config[Key]);
            else
                Config[Key] = var;
        }

        #endregion

        #region Localization

        private void LoadMessages()
        {
            lang.RegisterMessages(new Dictionary<string, string>
            {
                ["noperms"] = "You don't have permission to use this command.",
                ["readytojump"] = "You are ready to jump at any time.",
                ["notjumping"] = "You are not able to use that right now.",
                ["alreadyusedchute"] = "You have already used your chute for this jump...sorry...",
                ["undercooldown"] = "You must wait, you are under a cooldown",
                ["nomorecooldown"] = "Your ColdFusionParachute cooldown as been removed.",
                ["coldfusionparachutefull"] = "ColdFusionParachute is FULL, please wait and try again.",
                ["openchute"] = "Press your 'RELOAD' Key to open your chute when your ready !!!!"
            }, this);
        }

        #endregion

        #region Commands

        [ChatCommand("coldfusionparachute")]
        void chatColdFusionParachute(BasePlayer player, string command, string[] args)
        {
            if (permission.UserHasPermission(player.UserIDString, "coldfusionparachute.use"))
            {
                if (player.isMounted) { SendReply(player, "You are already Mounted"); return; }
                if (cooldownlist.Contains(player.userID)) { PrintToChat(player, lang.GetMessage("undercooldown", this, player.UserIDString)); return; }
                if (UseCooldown) { CooldownAddPlayerID(player); }
                AddPlayerID(player);
                var hascontroller = player.GetComponent<PlayerJumpController>();
                if (!hascontroller) player.gameObject.AddComponent<PlayerJumpController>();
                ActivateJumpPlane(player);
            }
            else
                PrintToChat(player, lang.GetMessage("noperms", this, player.UserIDString));
        }

        [ConsoleCommand("givechute")]
        void cmdConsoleGiveChute(ConsoleSystem.Arg arg)
        {
            var player = arg.Player() ?? null;
            if (player != null)
            {
                if (permission.UserHasPermission(player.UserIDString, "coldfusionparachute.use"))
                    GiveChutePack(player);
                else
                    PrintToChat(player, lang.GetMessage("noperms", this, player.UserIDString));
                return;
            }
            if (arg.Args.Length > 0)
            {
                ulong id = Convert.ToUInt64(arg.Args[0]);
                GiveChutePack(BasePlayer.FindByID(id));
            }
        }

        [ConsoleCommand("dorespawn")]
        void cmdConsoleDoRespawn(ConsoleSystem.Arg arg)
        {
            if (arg.Args == null || arg.Args.Length == 0) return;
            if (arg.Args.Length == 1)
            {
                ulong id = Convert.ToUInt64(arg.Args[0]);
                if (UseCooldown && CooldownListConstainsPlayerID(BasePlayer.FindByID(id))) return;
                if (UseCooldown) { CooldownAddPlayerID(BasePlayer.FindByID(id)); }
                if (UseRandomRespawn) { RespawnAtRandom(BasePlayer.FindByID(id), true); return; }
                else
                    RespawnAtPlane(BasePlayer.FindByID(id), true);
            }
        }

        [ConsoleCommand("orbitadrop")]
        void cmdConsoleOrbitaDrop(ConsoleSystem.Arg arg)
        {
            var player = arg.Player() ?? null;
            if (player != null)
            {
                if (permission.UserHasPermission(player.UserIDString, "coldfusionparachute.admin"))
                {
                    ActivateOrbitaDrop();
                }
            }
            if (player == null)
            {
                ActivateOrbitaDrop();
            }
        }

        #endregion

        #region Hooks

        void ActivateOrbitaDrop()
        {
            ConVar.Chat.Broadcast("in...." + OrbitaDropCountdown.ToString("F0"), "ColdFusionParachute Orbita Drop", "#4286f4");
            timer.Once(OrbitaDropCountdown * 0.25f, () => ConVar.Chat.Broadcast("in...." + (OrbitaDropCountdown * 0.75f).ToString("F0"), "ColdFusionParachute Orbita Drop", "#4286f4"));
            timer.Once(OrbitaDropCountdown * 0.50f, () => ConVar.Chat.Broadcast("in...." + (OrbitaDropCountdown * 0.50f).ToString("F0"), "ColdFusionParachute Orbita Drop", "#4286f4"));
            timer.Once(OrbitaDropCountdown * 0.75f, () => ConVar.Chat.Broadcast("in...." + (OrbitaDropCountdown * 0.25f).ToString("F0"), "ColdFusionParachute Orbita Drop", "#4286f4"));
            timer.Once(OrbitaDropCountdown, () =>
            {
                PrintWarning("Orbita Drop Has Been Activated...");
                DoOrbitaDrop();
            });
        }

        void DoOrbitaDrop()
        {
            foreach (var player in BasePlayer.activePlayerList)
            {
                DoTPColdFusionParachuteRandom(player);
            }
        }

        public bool ListConstainsPlayerID(BasePlayer player)
        {
            if (coldfusionparachuteplayerlist.Contains(player.userID)) return true;
            return false;
        }

        void AddPlayerID(BasePlayer player)
        {
            if (ListConstainsPlayerID(player)) return;
            coldfusionparachuteplayerlist.Add(player.userID);
        }

        public void RemovePlayerID(BasePlayer player)
        {
            if (ListConstainsPlayerID(player))
            {
                coldfusionparachuteplayerlist.Remove(player.userID);
                return;
            }
        }

        bool CooldownListConstainsPlayerID(BasePlayer player)
        {
            if (cooldownlist.Contains(player.userID)) return true;
            return false;
        }

        void CooldownAddPlayerID(BasePlayer player)
        {
            if (CooldownListConstainsPlayerID(player)) return;
            cooldownlist.Add(player.userID);
            float cooldown = ColdFusionParachuteCoolDown;
            timer.Once(cooldown, () => { cooldownlist.Remove(player.userID); });
        }

        Vector3 FindSpawnPoint()
        {
            Vector3 spawnpoint = new Vector3();
            float spawnline = ((ConVar.Server.worldsize) / 2) - GlobalMapOffset;

            float spawnminx = spawnline;
            float spawnmaxx = spawnline;
            float spawnminz = spawnline;
            float spawnmaxz = spawnline;

            float xrandom1 = UnityEngine.Random.Range(0, 2);
            if (xrandom1 == 1) { spawnminx = spawnline; spawnmaxx = spawnline; spawnminz = 0; spawnmaxz = UnityEngine.Random.Range(0, spawnline); }
            if (xrandom1 == 0) { spawnminz = spawnline; spawnmaxz = spawnline; spawnminx = 0; spawnmaxx = UnityEngine.Random.Range(0, spawnline); }
            float yrandom = FlightDeck;
            spawnpoint = new Vector3(UnityEngine.Random.Range(spawnminx, spawnmaxx), yrandom, UnityEngine.Random.Range(spawnminz, spawnmaxz));

            float xrandom2 = UnityEngine.Random.Range(0, 2);
            float zrandom2 = UnityEngine.Random.Range(0, 2);
            if (xrandom2 == 1) spawnpoint.x = -spawnpoint.x;
            if (zrandom2 == 1) spawnpoint.z = -spawnpoint.z;
            return spawnpoint;
        }

        Vector3 FindPlayerCOldFusionParachutePoint()
        {
            Vector3 spawnpoint = new Vector3();
            float spawnline = ((ConVar.Server.worldsize) / 2) - GlobalMapOffset;
            float yrandom = UnityEngine.Random.Range(FlightDeck * 0.75f, FlightDeck * 1.25f);
            spawnpoint = new Vector3(UnityEngine.Random.Range(-spawnline, spawnline), yrandom, UnityEngine.Random.Range(-spawnline, spawnline));
            return spawnpoint;
        }

        Vector3 GetLocalColdFusionParachutePoint(BasePlayer player)
        {
            Vector3 targetPos = new Vector3();
            Vector3 randomizer = new Vector3(UnityEngine.Random.Range(-localRespawnDistance, localRespawnDistance), 0f, UnityEngine.Random.Range(-localRespawnDistance, localRespawnDistance));
            Vector3 newp = (player.transform.position + randomizer);
            float yrandom = UnityEngine.Random.Range(FlightDeck * 0.75f, FlightDeck * 1.25f);
            targetPos = new Vector3(newp.x, yrandom, newp.z);
            return targetPos;
        }

        ColdFusionParachutePlane FindJumpPlane()
        {
            if (coldfusionparachutePlane != null)
            {
                var isplane = coldfusionparachutePlane.GetComponentInParent<ColdFusionParachutePlane>() ?? null;
                if (isplane != null)
                {
                    isplane.counter = 0f;
                    return isplane;
                }
            }
            Vector3 startloc = FindSpawnPoint();
            string sphereprefab = "assets/prefabs/visualization/sphere.prefab";
            coldfusionparachutePlane = GameManager.server.CreateEntity(sphereprefab, startloc, Quaternion.identity, true);
            coldfusionparachutePlane.Spawn();
            var newplane = coldfusionparachutePlane.gameObject.AddComponent<ColdFusionParachutePlane>();
            return newplane;
        }

        void ActivateJumpPlane(BasePlayer player)
        {
            var jumpplane = FindJumpPlane() as ColdFusionParachutePlane;
            if (jumpplane)
            {
                SendReply(player, "ColdFusionParachute Countdown 3...");
                timer.Once(1f, () => SendReply(player, "ColdFusionParachute Countdown 2..."));
                timer.Once(2f, () => SendReply(player, "ColdFusionParachute Countdown 1..."));
                timer.Once(3f, () =>
                {
                    if (player == null || jumpplane == null) return;
                    ActivateColdFusionParachute(player, jumpplane);
                });
            }
            else return;
        }

        void ActivateColdFusionParachute(BasePlayer player, ColdFusionParachutePlane plane)
        {
            if (player == null) return;
            if (player.isMounted) { SendReply(player, "You are already Mounted"); return; }
            var hascontroller = player.GetComponent<PlayerJumpController>() ?? null;
            if (hascontroller == null) player.gameObject.AddComponent<PlayerJumpController>();
            AddPlayerID(player);
            DoRespawnAt(player, plane.transform.position, plane.transform.rotation);
            if (plane.FindMountableChair(player))
            {
                return;
            }
            else RespawnAtRandom(player);
        }

        void GiveChutePack(BasePlayer player)
        {
            if (player == null) return;
            var item = ItemManager.CreateByItemID(-2022172587, 1, 2013200508);
            player.inventory.GiveItem(item);
        }

        private void CanWearItem(PlayerInventory inventory, Item item, int targetPos)
        {
            if (item == null || item.skin != 2013200508) return;
            if (inventory == null) return;
            var player = inventory.GetComponent<BasePlayer>() ?? null;
            if (player == null) return;
            if (player.isMounted) { SendReply(player, "You are already Mounted"); return; }
            if (cooldownlist.Contains(player.userID)) { PrintToChat(player, lang.GetMessage("undercooldown", this, player.UserIDString)); return; }
            if (UseCooldown) { CooldownAddPlayerID(player); }
            AddPlayerID(player);
            ActivateJumpPlane(player);
            if (item != null) item.Remove(0f);
        }

        public void DoRespawnAt(BasePlayer player, Vector3 position, Quaternion rotation, bool isrespawn = false)
        {
            player.SetPlayerFlag(BasePlayer.PlayerFlags.Wounded, false);
            player.SetPlayerFlag(BasePlayer.PlayerFlags.Unused2, false);
            player.SetPlayerFlag(BasePlayer.PlayerFlags.Unused1, false);
            player.SetPlayerFlag(BasePlayer.PlayerFlags.ReceivingSnapshot, true);
            player.SetPlayerFlag(BasePlayer.PlayerFlags.DisplaySash, false);
            player.transform.position = (position);
            player.transform.rotation = (rotation);
            player.StopWounded();
            player.StopSpectating();
            player.UpdateNetworkGroup();
            player.StartSleeping();
            player.SendNetworkUpdateImmediate(false);
            player.ClearEntityQueue(null);
            player.ClientRPCPlayer(null, player, "StartLoading");
            player.SendFullSnapshot();
            if (isrespawn) player.StartSleeping();
            if (isrespawn) player.metabolism.Reset();
            if (isrespawn) player.InitializeHealth(player.StartHealth(), player.StartMaxHealth());
            if (isrespawn) player.inventory.GiveDefaultItems();
            player.SendNetworkUpdateImmediate(false);
            player.ClearEntityQueue(null);
            if (isrespawn) player.ClientRPCPlayer(null, player, "StartLoading");
            if (isrespawn) Oxide.Core.Interface.CallHook("OnPlayerRespawned", player);
            player.SendFullSnapshot();
        }

        void RespawnAtPlane(BasePlayer player, bool isrespawn = false)
        {
            if (player == null) return;
            var hascontroller = player.GetComponent<PlayerJumpController>() ?? null;
            if (hascontroller == null) player.gameObject.AddComponent<PlayerJumpController>();
            AddPlayerID(player);
            var jumplane = FindJumpPlane() as ColdFusionParachutePlane;
            DoRespawnAt(player, jumplane.transform.position, jumplane.transform.rotation, isrespawn);
            AttachChute(player);
        }

        void RespawnAtRandom(BasePlayer player, bool isrespawn = false)
        {
            if (player == null) return;
            var hascontroller = player.GetComponent<PlayerJumpController>() ?? null;
            if (hascontroller == null) player.gameObject.AddComponent<PlayerJumpController>();

            AddPlayerID(player);
            Vector3 respawnpos = new Vector3();
            if (enableLocalRespawn || permission.UserHasPermission(player.UserIDString, "coldfusionparachute.localrespawn")) respawnpos = GetLocalColdFusionParachutePoint(player);
            else respawnpos = FindPlayerCOldFusionParachutePoint();
            DoRespawnAt(player, respawnpos, Quaternion.identity, isrespawn);
            AttachChute(player);
        }

        void PreparePlayerTPColdFusionParachute(BasePlayer player)
        {

            SendReply(player, "ColdFusionParachute Countdown 3...");
            timer.Once(1f, () => SendReply(player, "ColdFusionParachute Countdown 2..."));
            timer.Once(2f, () => SendReply(player, "ColdFusionParachute Countdown 1..."));
            timer.Once(3f, () =>
            {
                if (player == null) return;
                DoTPColdFusionParachuteRandom(player);
            });
        }

        void DoTPColdFusionParachuteRandom(BasePlayer player)
        {
            if (player == null) return;
            var hascontroller = player.GetComponent<PlayerJumpController>() ?? null;
            if (hascontroller == null) player.gameObject.AddComponent<PlayerJumpController>();
            AddPlayerID(player);
            Vector3 respawnpos = FindSpawnPoint();

            player.transform.position = respawnpos;
            player.ClientRPCPlayer(null, player, "ForcePositionTo", respawnpos);
            player.SendNetworkUpdate();

            AttachChute(player);
        }

        ///////////////////////////////////////////////////////////////////

        public void AttachChute(BasePlayer player)
        {
            if (player == null) return;
            string chairprefab = "assets/prefabs/deployable/chair/chair.deployed.prefab";
            var chutemount = GameManager.server.CreateEntity(chairprefab, player.transform.position, Quaternion.identity, true);
            chutemount.enableSaving = false;
            var hasstab = chutemount.GetComponent<StabilityEntity>();
            if (hasstab) hasstab.grounded = true;
            var hasmount = chutemount.GetComponent<BaseMountable>();
            if (hasmount) hasmount.isMobile = true;
            chutemount.skinID = 1311472987;
            chutemount?.Spawn();
            if (chutemount != null)
            {
                if (!isParachuting.Contains(player.userID)) isParachuting.Add(player.userID);
                var parachute = GameManager.server.CreateEntity("assets/prefabs/misc/parachute/parachute.prefab", new Vector3(), new Quaternion(), true);
                parachute.SetParent(chutemount, 0);
                parachute?.Spawn();

                var addchute = chutemount.gameObject.AddComponent<PlayerParachute>();
                hasmount.MountPlayer(player);
            }
            return;
        }

        object OnPlayerLand(BasePlayer player, float num)
        {
            if (player == null) return null;
            if (ListConstainsPlayerID(player)) return false;
            return null;
        }

        void OnPlayerInput(BasePlayer player, InputState input)
        {
            if (player == null || input == null) return;
            if (ListConstainsPlayerID(player))
            {
                if (!player.isMounted)
                {
                    if (input.WasJustPressed(BUTTON.RELOAD))
                    {
                        AttachChute(player);
                        return;
                    }
                }
                if (player.isMounted)
                {
                    var haschute1 = player.GetMounted().GetComponentInParent<PlayerParachute>() ?? null;
                    if (haschute1)
                    {
                        haschute1.ChuteInput(input, player);
                    }
                    return;
                }
            }
        }

        object OnPlayerViolation(BasePlayer player, AntiHackType type, float amount)
        {
            if (player == null) return null;
            if (ListConstainsPlayerID(player)) return false;
            return null;
        }

        void SendInfoMessage(BasePlayer player, string message, float time)
        {
            player?.SendConsoleCommand("gametip.showgametip", message);
            timer.Once(time, () => player?.SendConsoleCommand("gametip.hidegametip"));
        }

        object CanDismountEntity(BasePlayer player, BaseMountable entity)
        {
            if (player == null) return null;
            if (!AllowFreeFall)
            {
                if (isParachuting.Contains(player.userID)) return true;
            }
            return null;
        }

        private void OnEntityDismounted(BaseMountable mountable, BasePlayer player)
        {
            if (mountable == null || player == null) return;
            if (player.GetComponent<PlayerJumpController>())
            {
                if (AllowFreeFall)
                {
                    SendInfoMessage(player, "Press your <color=black>[ R E L O A D ]</color> key to open parachute !!", 10f);
                }
                if (!AllowFreeFall)
                {
                    AttachChute(player);
                }
            }
            return;
        }

        public void DisMountPlayer(BasePlayer player)
        {
            if (player == null || !player.isMounted) return;
            var isonplane = player.GetMounted().GetComponentInParent<ColdFusionParachutePlane>() ?? null;
            if (isonplane == null) return;
            if (player.isMounted && isonplane != null)
            {
                player?.EnsureDismounted();
                AttachChute(player);
            }
            else return;
        }

        void OnEntityTakeDamage(BaseCombatEntity entity, HitInfo hitInfo)
        {
            if (entity == null || hitInfo == null) return;
            if (entity is BasePlayer)
            {
                BasePlayer victim = (BasePlayer)entity as BasePlayer;
                if (ListConstainsPlayerID(victim))
                {
                    hitInfo.damageTypes.ScaleAll(0);
                }
            }
        }

        static void DestroyAll<T>()
        {
            var objects = GameObject.FindObjectsOfType(typeof(T));
            if (objects != null)
                foreach (var gameObj in objects)
                    GameObject.Destroy(gameObj);
        }

        void OnPlayerDie(BasePlayer player, HitInfo info)
        {
            if (player == null) return;
            RemovePlayerID(player);
            if (!EnableRespawnButton) return;
            timer.Once(4f, () => AddPlayerButton(player));
        }

        void AddPlayerButton(BasePlayer player)
        {
            if (player == null) return;
            player.gameObject.AddComponent<ColdFusionParachuteRespawnButton>();
        }

        void OnPlayerRespawned(BasePlayer player)
        {
            if (player == null) return;
            var hasgui = player.GetComponent<ColdFusionParachuteRespawnButton>() ?? null;
            if (hasgui != null) GameObject.Destroy(hasgui);
        }

        void Unload()
        {
            coldfusionparachuteplayerlist.Clear();
            isParachuting.Clear();
            cooldownlist.Clear();
            DestroyAll<ColdFusionParachuteRespawnButton>();
            DestroyAll<ColdFusionParachutePlane>();
            DestroyAll<PlayerParachute>();
            DestroyAll<PlayerJumpController>();
        }

        #endregion

        #region Respawn Button Cui

        class ColdFusionParachuteRespawnButton : MonoBehaviour
        {
            BasePlayer player;

            void Awake()
            {
                player = base.GetComponentInParent<BasePlayer>();
                RespawnButton(player);
            }

            public void RespawnButton(BasePlayer player)
            {
                DestroyCui(player);
                if (player == null) { OnDestroy(); return; }

                var elements = new CuiElementContainer();
                string colorstring = "0.32 0.39 0.19 0.5";
                string textstring = "Use ColdFusionParachute \n Respawn";
                if (cooldownlist.Contains(player.userID)) { colorstring = "0.30 0.25 0.14 0.5"; textstring = "ColdFusionParachute Respawn \n Unavailable"; }

                string clickbutton = elements.Add(new CuiButton
                {
                    Button = { Command = $"dorespawn " + player.userID, Color = colorstring },
                    RectTransform = { AnchorMin = "0.45 0.16", AnchorMax = "0.71 0.26" },
                    Text = { Text = textstring, FontSize = 20, Color = "1.0 1.0 1.0 1.0", Align = TextAnchor.MiddleCenter }
                }, "Overall", "coldfusionparachutebutton");

                elements.Add(new CuiElement
                {
                    Name = "coldfusionparachutegui",
                    Parent = "Overall",
                    Components =
                            {
                            new CuiRawImageComponent { Color = "1 1 1 1", Url = "https://i.imgur.com/XPokWoq.png", Sprite = "assets/content/textures/generic/fulltransparent.tga" },
                            new CuiRectTransformComponent { AnchorMin = "0.46 0.17",  AnchorMax = "0.50 0.25" }
                            }
                });

                CuiHelper.AddUi(player, elements);
            }

            void DestroyCui(BasePlayer player)
            {
                if (player == null) { OnDestroy(); return; }
                CuiHelper.DestroyUi(player, "coldfusionparachutegui");
                CuiHelper.DestroyUi(player, "coldfusionparachutebutton");
            }

            void OnDestroy()
            {
                DestroyCui(player);
                Destroy(this);
            }
        }

        #endregion

        #region ColdFusionParachute Plane Entity

        class ColdFusionParachutePlane : BaseEntity
        {
            BaseEntity cpentity;
            BaseEntity plane;
            Vector3 cpentitypos;
            public float counter;

            public BaseEntity jumpchair1;
            public BaseEntity jumpchair2;
            public BaseEntity jumpchair3;
            public BaseEntity jumpchair4;
            public BaseEntity jumpchair5;
            public BaseEntity jumpchair6;
            public BaseEntity jumpchair7;
            public BaseEntity jumpchair8;
            public BaseEntity jumpchair9;
            public BaseEntity jumpchair10;
            public BaseEntity jumpchair11;
            public BaseEntity jumpchair12;

            BaseEntity wallsign;

            Vector3 movetopoint;

            void Awake()
            {
                cpentity = GetComponent<BaseEntity>();
                if (cpentity == null) { OnDestroy(); return; }
                cpentitypos = cpentity.transform.position + new Vector3(0f, -5f, 0f);
                counter = 0f;
                plane = GameManager.server.CreateEntity("assets/prefabs/npc/cargo plane/cargo_plane.prefab", cpentity.transform.position + new Vector3(0f, -5f, 0f), Quaternion.identity, true);
                if (plane != null)
                {
                    plane.enabled = false;
                    plane.Spawn();
                    plane.SetParent(cpentity, 0);
                }
                string chairprefab = "assets/prefabs/deployable/chair/chair.deployed.prefab";
                jumpchair1 = GameManager.server.CreateEntity(chairprefab, cpentitypos, Quaternion.identity, true);
                jumpchair1.transform.localEulerAngles = new Vector3(0, 90, 0);
                jumpchair1.transform.localPosition = new Vector3(-1.2f, 3f, -7.43f);
                SpawnRefresh(jumpchair1);
                jumpchair1?.Spawn();
                jumpchair1.SetParent(plane, 0);

                jumpchair2 = GameManager.server.CreateEntity(chairprefab, cpentitypos, Quaternion.identity, true);
                jumpchair2.transform.localEulerAngles = new Vector3(0, 90, 0);
                jumpchair2.transform.localPosition = new Vector3(-1.2f, 3f, -6.76f);
                SpawnRefresh(jumpchair2);
                jumpchair2?.Spawn();
                jumpchair2.SetParent(plane, 0);

                jumpchair3 = GameManager.server.CreateEntity(chairprefab, cpentitypos, Quaternion.identity, true);
                jumpchair3.transform.localEulerAngles = new Vector3(0, 90, 0);
                jumpchair3.transform.localPosition = new Vector3(-1.2f, 3f, -6.10f);
                SpawnRefresh(jumpchair3);
                jumpchair3?.Spawn();
                jumpchair3.SetParent(plane, 0);

                jumpchair4 = GameManager.server.CreateEntity(chairprefab, cpentitypos, Quaternion.identity, true);
                jumpchair4.transform.localEulerAngles = new Vector3(0, 90, 0);
                jumpchair4.transform.localPosition = new Vector3(-1.2f, 3f, -5.43f);
                SpawnRefresh(jumpchair4);
                jumpchair4?.Spawn();
                jumpchair4.SetParent(plane, 0);

                jumpchair5 = GameManager.server.CreateEntity(chairprefab, cpentitypos, Quaternion.identity, true);
                jumpchair5.transform.localEulerAngles = new Vector3(0, 90, 0);
                jumpchair5.transform.localPosition = new Vector3(-1.2f, 3f, -4.76f);
                SpawnRefresh(jumpchair5);
                jumpchair5?.Spawn();
                jumpchair5.SetParent(plane, 0);

                jumpchair6 = GameManager.server.CreateEntity(chairprefab, cpentitypos, Quaternion.identity, true);
                jumpchair6.transform.localEulerAngles = new Vector3(0, 90, 0);
                jumpchair6.transform.localPosition = new Vector3(-1.2f, 3f, -4.10f);
                SpawnRefresh(jumpchair6);
                jumpchair6?.Spawn();
                jumpchair6.SetParent(plane, 0);
                AddWallSign();

                jumpchair7 = GameManager.server.CreateEntity(chairprefab, cpentitypos, Quaternion.identity, true);
                jumpchair7.transform.localEulerAngles = new Vector3(0, 270, 0);
                jumpchair7.transform.localPosition = new Vector3(1.2f, 3f, -7.43f);
                SpawnRefresh(jumpchair7);
                jumpchair7?.Spawn();
                jumpchair7.SetParent(plane, 0);

                jumpchair8 = GameManager.server.CreateEntity(chairprefab, cpentitypos, Quaternion.identity, true);
                jumpchair8.transform.localEulerAngles = new Vector3(0, 270, 0);
                jumpchair8.transform.localPosition = new Vector3(1.2f, 3f, -6.76f);
                SpawnRefresh(jumpchair8);
                jumpchair8?.Spawn();
                jumpchair8.SetParent(plane, 0);

                jumpchair9 = GameManager.server.CreateEntity(chairprefab, cpentitypos, Quaternion.identity, true);
                jumpchair9.transform.localEulerAngles = new Vector3(0, 270, 0);
                jumpchair9.transform.localPosition = new Vector3(1.2f, 3f, -6.10f);
                SpawnRefresh(jumpchair9);
                jumpchair9?.Spawn();
                jumpchair9.SetParent(plane, 0);

                jumpchair10 = GameManager.server.CreateEntity(chairprefab, cpentitypos, Quaternion.identity, true);
                jumpchair10.transform.localEulerAngles = new Vector3(0, 270, 0);
                jumpchair10.transform.localPosition = new Vector3(1.2f, 3f, -5.43f);
                SpawnRefresh(jumpchair10);
                jumpchair10?.Spawn();
                jumpchair10.SetParent(plane, 0);

                jumpchair11 = GameManager.server.CreateEntity(chairprefab, cpentitypos, Quaternion.identity, true);
                jumpchair11.transform.localEulerAngles = new Vector3(0, 270, 0);
                jumpchair11.transform.localPosition = new Vector3(1.2f, 3f, -4.76f);
                SpawnRefresh(jumpchair11);
                jumpchair11?.Spawn();
                jumpchair11.SetParent(plane, 0);

                jumpchair12 = GameManager.server.CreateEntity(chairprefab, cpentitypos, Quaternion.identity, true);
                jumpchair12.transform.localEulerAngles = new Vector3(0, 270, 0);
                jumpchair12.transform.localPosition = new Vector3(1.2f, 3f, -4.10f);
                SpawnRefresh(jumpchair12);
                jumpchair12?.Spawn();
                jumpchair12.SetParent(plane, 0);

                movetopoint = FindCoords();
            }

            void AddWallSign()
            {
                if (plane == null) { OnDestroy(); return; }
                string prefabwallsign = "assets/prefabs/deployable/rug/rug.deployed.prefab";
                wallsign = GameManager.server.CreateEntity(prefabwallsign, cpentitypos, Quaternion.identity, true);
                wallsign.transform.localEulerAngles = new Vector3(0, 270, 90);
                wallsign.transform.localPosition = new Vector3(0f, 4.7f, -3.8f);
                wallsign.skinID = wallskinid;
                wallsign?.Spawn();
                wallsign.SetParent(plane, 0);
                SpawnRefresh(wallsign);
            }

            public bool FindMountableChair(BasePlayer player)
            {
                if (ChairIsAvailable(player, jumpchair1)) return true;
                if (ChairIsAvailable(player, jumpchair2)) return true;
                if (ChairIsAvailable(player, jumpchair3)) return true;
                if (ChairIsAvailable(player, jumpchair4)) return true;
                if (ChairIsAvailable(player, jumpchair5)) return true;
                if (ChairIsAvailable(player, jumpchair6)) return true;
                if (ChairIsAvailable(player, jumpchair7)) return true;
                if (ChairIsAvailable(player, jumpchair8)) return true;
                if (ChairIsAvailable(player, jumpchair9)) return true;
                if (ChairIsAvailable(player, jumpchair10)) return true;
                if (ChairIsAvailable(player, jumpchair11)) return true;
                if (ChairIsAvailable(player, jumpchair12)) return true;
                return false;
            }

            bool ChairIsAvailable(BasePlayer player, BaseEntity entity)
            {
                var findmount = entity.GetComponent<BaseMountable>() ?? null;
                if (findmount != null)
                {
                    if (findmount._mounted) return false;
                    else
                        findmount.MountPlayer(player);
                    return true;
                }
                return false;
            }

            public bool PlayersAreMounted()
            {
                if (jumpchair1 != null && jumpchair1.GetComponent<BaseMountable>()._mounted) return true;
                if (jumpchair2 != null && jumpchair2.GetComponent<BaseMountable>()._mounted) return true;
                if (jumpchair3 != null && jumpchair3.GetComponent<BaseMountable>()._mounted) return true;
                if (jumpchair4 != null && jumpchair4.GetComponent<BaseMountable>()._mounted) return true;

                if (jumpchair5 != null && jumpchair5.GetComponent<BaseMountable>()._mounted) return true;
                if (jumpchair6 != null && jumpchair6.GetComponent<BaseMountable>()._mounted) return true;
                if (jumpchair7 != null && jumpchair7.GetComponent<BaseMountable>()._mounted) return true;
                if (jumpchair8 != null && jumpchair8.GetComponent<BaseMountable>()._mounted) return true;

                if (jumpchair9 != null && jumpchair9.GetComponent<BaseMountable>()._mounted) return true;
                if (jumpchair10 != null && jumpchair10.GetComponent<BaseMountable>()._mounted) return true;
                if (jumpchair11 != null && jumpchair11.GetComponent<BaseMountable>()._mounted) return true;
                if (jumpchair12 != null && jumpchair12.GetComponent<BaseMountable>()._mounted) return true;
                return false;
            }



            void SpawnRefresh(BaseNetworkable entity1)
            {
                var hasstab = entity1.GetComponent<StabilityEntity>();
                if (hasstab)
                {
                    hasstab.grounded = true;
                }
                var hasmount = entity1.GetComponent<BaseMountable>();
                if (hasmount)
                {
                    hasmount.isMobile = true;
                }
            }

            Vector3 FindCoords()
            {
                float spawnline = ((ConVar.Server.worldsize) / 2) - GlobalMapOffset;
                float spawnminx = spawnline;
                float spawnmaxx = spawnline;
                float spawnminz = spawnline;
                float spawnmaxz = spawnline;

                float xrandom1 = UnityEngine.Random.Range(0, 2);
                if (xrandom1 == 1) { spawnminx = spawnline; spawnmaxx = spawnline; spawnminz = 0; spawnmaxz = UnityEngine.Random.Range(0, spawnline); }
                if (xrandom1 == 0) { spawnminz = spawnline; spawnmaxz = spawnline; spawnminx = 0; spawnmaxx = UnityEngine.Random.Range(0, spawnline); }

                Vector3 spawnpoint = new Vector3(UnityEngine.Random.Range(spawnminx, spawnmaxx), FlightDeck, UnityEngine.Random.Range(spawnminz, spawnmaxz));

                float xrandom2 = UnityEngine.Random.Range(0, 2);
                float zrandom2 = UnityEngine.Random.Range(0, 2);
                if (xrandom2 == 1) spawnpoint.x = -spawnpoint.x;
                if (zrandom2 == 1) spawnpoint.z = -spawnpoint.z;
                return spawnpoint;
            }

            void FixedUpdate()
            {
                if (cpentity == null && plane == null) { OnDestroy(); return; }
                if (!PlayersAreMounted())
                {
                    counter = counter + 1f;
                    if (counter >= (ColdFusionParachutePlaneDespawn * 15f)) OnDestroy();
                }
                else counter = 0f;

                if (cpentity.transform.position == movetopoint) movetopoint = FindCoords();
                Vector3 targetDir = movetopoint - transform.position;
                Vector3 newDir = Vector3.RotateTowards(transform.forward, targetDir, 5f * Time.deltaTime, 0.0F);

                cpentity.transform.position = Vector3.MoveTowards(cpentity.transform.position, movetopoint, (25f) * Time.deltaTime);
                cpentity.transform.rotation = Quaternion.LookRotation(newDir);

                plane.transform.position = cpentity.transform.position + new Vector3(0f, -5f, 0f);
                plane.transform.rotation = cpentity.transform.rotation;
            }

            void OnDestroy()
            {
                if (plane != null) { plane.Invoke("KillMessage", 0.1f); }
                if (cpentity != null) { cpentity.Invoke("KillMessage", 0.1f); }
            }
        }

        #endregion

        #region Player Parachute Entity

        class PlayerParachute : BaseEntity
        {
            BaseEntity mount;
            Vector3 direction;
            Vector3 position;
            public bool moveforward;
            public bool rotright;
            public bool rotleft;

            void Awake()
            {
                mount = GetComponentInParent<BaseEntity>();
                if (mount == null) { OnDestroy(); return; }
                position = mount.transform.position;
                moveforward = false;
            }

            bool PlayerIsMounted()
            {
                bool flag = mount.GetComponent<BaseMountable>().IsMounted();
                return flag;
            }

            public void ChuteInput(InputState input, BasePlayer player)
            {
                if (input == null || player == null) return;
                if (input.WasJustPressed(BUTTON.FORWARD)) moveforward = true;
                if (input.WasJustReleased(BUTTON.FORWARD)) moveforward = false;
                if (input.WasJustPressed(BUTTON.RIGHT)) rotright = true;
                if (input.WasJustReleased(BUTTON.RIGHT)) rotright = false;
                if (input.WasJustPressed(BUTTON.LEFT)) rotleft = true;
                if (input.WasJustReleased(BUTTON.LEFT)) rotleft = false;
            }

            void FixedUpdate()
            {
                if (!PlayerIsMounted() || mount == null) { OnDestroy(); return; }
                if (Physics.Raycast(new Ray(mount.transform.position, Vector3.down), 3f, layerMask))
                {
                    OnDestroy();
                    return;
                }
                if (rotright) mount.transform.eulerAngles += new Vector3(0, 2, 0);
                else if (rotleft) mount.transform.eulerAngles += new Vector3(0, -2, 0);

                if (moveforward) mount.transform.localPosition += ((transform.forward * parchuteFwdSpeed) * Time.deltaTime);

                mount.transform.position = Vector3.MoveTowards(mount.transform.position, mount.transform.position + Vector3.down, (parachuteDownSpeed) * Time.deltaTime);
                mount.transform.hasChanged = true;
                mount.SendNetworkUpdateImmediate();
                mount.UpdateNetworkGroup();
            }

            public void OnDestroy()
            {
                if (mount != null) { mount.Invoke("KillMessage", 0.1f); }
            }
        }

        #endregion

        #region Player Jump Controller

        class PlayerJumpController : MonoBehaviour
        {
            BasePlayer player;
            public bool usedchute;
            ColdFusionParachute _instance;
            float dismountcounter;

            void Awake()
            {
                _instance = new ColdFusionParachute();
                player = GetComponentInParent<BasePlayer>() ?? null;
                if (player == null) { OnDestroy(); return; }
                usedchute = false;
                dismountcounter = 0f;
                player.ClearEntityQueue();
            }

            void FixedUpdate()
            {
                if (player == null) { OnDestroy(); return; }
                if (Physics.Raycast(new Ray(player.transform.position, Vector3.down), 10f, layerMask))
                {
                    OnDestroy();
                    return;
                }
                if (ForceDismountFromPlane)
                {
                    dismountcounter = dismountcounter + 0.1f;
                    if (dismountcounter >= ForceJumpTime) { _instance.DisMountPlayer(player); dismountcounter = 0f; }
                }
            }

            public void OnDestroy()
            {
                if (coldfusionparachuteplayerlist.Contains(player.userID)) coldfusionparachuteplayerlist.Remove(player.userID);
                if (isParachuting.Contains(player.userID)) isParachuting.Remove(player.userID);
                GameObject.Destroy(this);
            }
        }

        #endregion

    }
}

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