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

FREE Paraglider : 2.4.2 2.4.2

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6

/*      INFO
          ____ _ _  _ ____ _  _ _    ____ ____ _ ___ _   _ 
          [__  | |\ | | __ |  | |    |__| |__/ |  |   \_/  
          ___] | | \| |__] |__| |___ |  | |  \ |  |    |   
        --------------------------------------------------
        For Quickest Support and Business Inquiries:
        Discord: singularity_gg
        
        For Updates or Support:
        [https://codefling.com/singularity12]
        --------------------------------------------------
        Paraglider introduces Control Adjustments with Lift, Descent, Boost, Launch, Trails/Effects, and Jet Drop
        with configurable Permissions, Cooldowns, Fuel Rates, and more.Customize these from within your config file located at (yourserver/oxide/config/Paraglider.json)
        --------------------------------------------------
*/
/*      PERMISSIONS INCLUDE: (Granting a higher tier permission overrides lower tier versions of that permission)
        
        "paraglider.use"--------------------Use improved parachute (as paraglider) or any of its controls and effects
        "paraglider.launchcmd"--------------Use the /launch chat command
        "paraglider.launcht1"---------------TIER 1: Launch and take off from standing
        "paraglider.launcht2"---------------TIER 2: Launch and take off from standing
        "paraglider.launcht3"---------------TIER 3: Launch and take off from standing
        "paraglider.boostt1"----------------TIER 1: Use boost to accelerate forward or backwards in Paraglider
        "paraglider.boostt2"----------------TIER 2: Use boost to accelerate forward or backwards in Paraglider
        "paraglider.boostt3"----------------TIER 3: Use boost to accelerate forward or backwards in Paraglider
        "paraglider.afterburnert1"----------TIER 1: Use afterburners for lift and altitude
        "paraglider.afterburnert2"----------TIER 2: Use afterburners for lift and altitude
        "paraglider.afterburnert3"----------TIER 3: Use afterburners for lift and altitude
        "paraglider.fuelt2"-----------------TIER 2: Fuel Capacity and recharge (TIER 1 is default with afterburner perms)
        "paraglider.fuelt3"-----------------TIER 3: Fuel Capacity and recharge
        "paraglider.lowert1"----------------TIER 1: Lower the Paraglider quickly
        "paraglider.lowert2"----------------TIER 2: Lower the Paraglider quickly
        "paraglider.lowert3"----------------TIER 3: Lower the Paraglider quickly
        "paraglider.jetdropt1"--------------TIER 1: Drop from a jet with /drop
        "paraglider.jetdropt2"--------------TIER 2: Drop from a jet with /drop
        "paraglider.jetdropt3"--------------TIER 3: Drop from a jet with /drop
        "paraglider.useflares"--------------Use flares to disable SAM targeting
        "paraglider.freeflares"-------------No need for flares in Inventory
        "paraglider.smoke"------------------Use smoke trail effect
        "paraglider.unlimitedfuel"----------Afterburners to no fuel
        "paraglider.spawnwithparachute"-----Respawn wearing a parachute
        "paraglider.nolaunchcd"-------------No cooldown for Launch takeoff
        "paraglider.nojetdropcd"------------No cooldown for Jet Drop
        "paraglider.jetrespawn"-------------Respawn automatically in a Jet Drop 
        "paraglider.yesescape"--------------Ignore No Escape Raid/Combat Block
*/
using System;
using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Core.Configuration;
using UnityEngine;
using Facepunch;
using System.Collections.Generic;
using Newtonsoft.Json;
namespace Oxide.Plugins {
    [Info("Paraglider", "Singularity", "2.4.2")]
    [Description("Introduces new, configurable mechanics to Parachutes")]
    class Paraglider : RustPlugin {
#region Fields
        [PluginReference]
        Plugin NoEscape;
#region Permissions
        private const string PermissionParaglide = "paraglider.use";
        private const string PermissionLaunchCommand = "paraglider.launchcmd";
        private const string PermissionLaunchT1 = "paraglider.launcht1";
        private const string PermissionLaunchT2 = "paraglider.launcht2";
        private const string PermissionLaunchT3 = "paraglider.launcht3";
        private const string PermissionBoostT1 = "paraglider.boostt1";
        private const string PermissionBoostT2 = "paraglider.boostt2";
        private const string PermissionBoostT3 = "paraglider.boostt3";
        private const string PermissionAfterburnerT1 = "paraglider.afterburnert1";
        private const string PermissionAfterburnerT2 = "paraglider.afterburnert2";
        private const string PermissionAfterburnerT3 = "paraglider.afterburnert3";
        private const string PermissionFuelT2 = "paraglider.fuelt2";
        private const string PermissionFuelT3 = "paraglider.fuelt3";
        private const string PermissionNoFuelRequired = "paraglider.unlimitedfuel";
        private const string PermissionLowerT1 = "paraglider.lowert1";
        private const string PermissionLowerT2 = "paraglider.lowert2";
        private const string PermissionLowerT3 = "paraglider.lowert3";
        private const string PermissionUseFlares = "paraglider.useflares";
        private const string PermissionFreeFlares = "paraglider.freeflares";
        private const string PermissionSmoke = "paraglider.smoke";
        private const string PermissionJetDropT1 = "paraglider.jetdropt1";
        private const string PermissionJetDropT2 = "paraglider.jetdropt2";
        private const string PermissionJetDropT3 = "paraglider.jetdropt3";
        private const string PermissionSpawnWithChute = "paraglider.spawnwithparachute";
        private const string PermissionNoLaunchCooldown = "paraglider.nolaunchcd";
        private const string PermissionNoJetDropCooldown = "paraglider.nojetdropcd";
        private const string PermissionSpawnfromJet = "paraglider.jetrespawn";
        private const string PermissionIgnoreNoEscape = "paraglider.yesescape";
#endregion
#region Prefabs
        public string FlareEffect = "assets/content/vehicles/attackhelicopter/effects/pfx_flares_attackhelicopter.prefab";
        public string AfterburnerEffect = "assets/prefabs/clothes/diving.tank/effects/tank_refill.prefab";
        public string BoosterEffectA = "assets/prefabs/tools/spraycan/reskineffect.prefab";
        //Currently commented out
        public string BoosterEffectB = "assets/prefabs/weapons/toolgun/effects/ringeffect.prefab";
        private const string SupplySignalPath = "assets/prefabs/tools/supply signal/grenade.supplysignal.deployed.prefab";
        public string ParachuteVehiclePrefab = "assets/prefabs/vehicle/seats/parachuteseat.prefab";
        public string PreLaunchEffect = "assets/content/effects/crossbreed/pfx crossbreed plain.prefab";
#endregion
#region Entities
        private BaseEntity chairEntity;
        private BaseEntity spawnedJet;
        private BaseEntity spawnedRocket;
        private Item flareToConsume;
#endregion
#region Dictionaries and Data
        private ParagliderConfiguration _config;
        private const string ConfigFileVersion = "2.4.0";
        private Dictionary<BasePlayer, BaseEntity> playerParachuteMap = new Dictionary<BasePlayer, BaseEntity>();
        private Dictionary<string, float> playerLastAfterburnTime = new Dictionary<string, float>();
        private Dictionary<string, float> playerLastBoostTime = new Dictionary<string, float>();
        private Dictionary<string, float> playerLastFlaresTime = new Dictionary<string, float>();
        private Dictionary<string, float> playerFuel = new Dictionary<string, float>();
        private Dictionary<string, float> lastRefillTime = new Dictionary<string, float>();
        private Dictionary<string, float> lastFuelEmptyMessageTime = new Dictionary<string, float>();
        private Dictionary<string, float> lastFuelFullMessageTime = new Dictionary<string, float>();
        private Dictionary<string, float> lastEquipMessageTime = new Dictionary<string, float>();
        private Dictionary<string, float> lastLaunchMessageTime = new Dictionary<string, float>();
        private Dictionary<string, float> lastJetMessageTime = new Dictionary<string, float>();
        private Dictionary<string, float> lastFlareMessageTime = new Dictionary<string, float>();
        private Dictionary<string, float> lastLaunchTime = new Dictionary<string, float>();
        private Dictionary<string, float> lastCancelLaunchTime = new Dictionary<string, float>();
        private Dictionary<string, float> lastJetDropTime = new Dictionary<string, float>();
        Dictionary<string, object> launchingPlayers = new Dictionary<string, object>();
        public List<BaseEntity> smoketraillist = new List<BaseEntity>();
        private DynamicConfigFile playerData;
        private Dictionary<ulong, PlayerSettings> playerSettings = new Dictionary<ulong, PlayerSettings>();
        private Dictionary<ulong, Dictionary<string, bool>> playerPermissions = new Dictionary<ulong, Dictionary<string, bool>>();
        private List<string> permissionsToCache = new List<string> {
            "paraglider.use", "paraglider.launcht1", "paraglider.launcht2", "paraglider.launcht3", "paraglider.boostt1", "paraglider.boostt2", "paraglider.boostt3", "paraglider.afterburnert1", "paraglider.afterburnert2", "paraglider.afterburnert3", "paraglider.fuelt2", "paraglider.fuelt3", "paraglider.unlimitedfuel", "paraglider.lowert1", "paraglider.lowert2", "paraglider.lowert3", "paraglider.useflares", "paraglider.freeflares", "paraglider.smoke",
        }
        ;
        ///
        class PlayerSettings {
            public bool ToggleParaglider {
                get;
                set;
            }
        }
        ///
#endregion
#endregion
#region Hooks
        private void Init() {
            permission.RegisterPermission(PermissionParaglide, this);
            permission.RegisterPermission(PermissionLaunchT1, this);
            permission.RegisterPermission(PermissionLaunchT2, this);
            permission.RegisterPermission(PermissionLaunchT3, this);
            permission.RegisterPermission(PermissionBoostT1, this);
            permission.RegisterPermission(PermissionBoostT2, this);
            permission.RegisterPermission(PermissionBoostT3, this);
            permission.RegisterPermission(PermissionAfterburnerT1, this);
            permission.RegisterPermission(PermissionAfterburnerT2, this);
            permission.RegisterPermission(PermissionAfterburnerT3, this);
            permission.RegisterPermission(PermissionFuelT2, this);
            permission.RegisterPermission(PermissionFuelT3, this);
            permission.RegisterPermission(PermissionNoFuelRequired, this);
            permission.RegisterPermission(PermissionLowerT1, this);
            permission.RegisterPermission(PermissionLowerT2, this);
            permission.RegisterPermission(PermissionLowerT3, this);
            permission.RegisterPermission(PermissionUseFlares, this);
            permission.RegisterPermission(PermissionFreeFlares, this);
            permission.RegisterPermission(PermissionSmoke, this);
            permission.RegisterPermission(PermissionJetDropT1, this);
            permission.RegisterPermission(PermissionJetDropT2, this);
            permission.RegisterPermission(PermissionJetDropT3, this);
            permission.RegisterPermission(PermissionSpawnWithChute, this);
            permission.RegisterPermission(PermissionNoLaunchCooldown, this);
            permission.RegisterPermission(PermissionNoJetDropCooldown, this);
            permission.RegisterPermission(PermissionSpawnfromJet, this);
            permission.RegisterPermission(PermissionIgnoreNoEscape, this);
            LoadConfig();
            LoadPlayerData();
            UpdatePermissions();
        }
        private void OnPlayerConnected(BasePlayer player) {
            ulong playerId = player.userID;
            if (!playerSettings.ContainsKey(playerId)) {
                if (_config.ToggleParagliderDefault) {
                    playerSettings[playerId] = new PlayerSettings {
                        ToggleParaglider = true
                    }
                    ;
                }
                else {
                    {
                        playerSettings[playerId] = new PlayerSettings {
                            ToggleParaglider = false
                        }
                        ;
                    }
                }
            }
            UpdatePermissions();
        }
        private void LoadPlayerData() {
            playerData = Interface.Oxide.DataFileSystem.GetFile("Paraglider_playerdata");
            try {
                playerSettings = playerData.ReadObject<Dictionary<ulong, PlayerSettings>>();
            }
            catch {
                PrintWarning("Failed to load player data, creating new data file");
                playerSettings = new Dictionary<ulong, PlayerSettings>();
            }
        }
        private void SavePlayerData() {
            playerData.WriteObject(playerSettings);
        }
        private object CanMountEntity(BasePlayer player, BaseEntity entity) {
            if (entity is ParachuteSeat && HasPermission(player.userID, PermissionParaglide)) {
                Parachute parachute = entity.GetParentEntity() as Parachute;
                if (playerParachuteMap.ContainsKey(player)) {
                    BaseEntity smoketrail = playerParachuteMap[player];
                    if (smoketrail != null && !smoketrail.IsDestroyed) {
                        smoketrail.Kill();
                    }
                    playerParachuteMap.Remove(player);
                }
                if (parachute != null) {
                    player.ChatMessage("<size=12><color=#517508>PARAGLIDER EQUIPPED</color></size>");
                    if (HasPermission(player.userID, PermissionBoostT1) || HasPermission(player.userID, PermissionBoostT2) || HasPermission(player.userID, PermissionBoostT3)) {
                        player.ChatMessage("<size=10><color=#a4bd6f><size=12><color=#517508>SHIFT</color></size> to use your <size=12><color=#517508>BOOSTERS!</size></color></color></size>");
                    }
                    if (HasPermission(player.userID, PermissionAfterburnerT1) || HasPermission(player.userID, PermissionAfterburnerT2) || HasPermission(player.userID, PermissionAfterburnerT3)) {
                        player.ChatMessage("<size=10><color=#a4bd6f><size=12><color=#517508>LEFT CLICK</color></size> to use your <size=12><color=#517508>AFTERBURNERS!</color></size></color></size>");
                    }
                    if (HasPermission(player.userID, PermissionLowerT1) || HasPermission(player.userID, PermissionLowerT2) || HasPermission(player.userID, PermissionLowerT3)) {
                        player.ChatMessage("<size=10><color=#a4bd6f><size=12><color=#517508>RIGHT CLICK</color></size> to quickly <size=12><color=#517508>DESCEND!</color></size></color></size>");
                    }
                    if (HasPermission(player.userID, PermissionUseFlares)) {
                        player.ChatMessage("<size=10><color=#a4bd6f><size=12><color=#517508>E</color></size> to evade SAMs with <size=12><color=#517508>FLARES!</color></size></color></size>");
                    }
                    if (HasPermission(player.userID, PermissionSmoke)) {
                        player.ChatMessage("<size=10><color=#a4bd6f><size=12><color=#517508>R</color></size> to toggle <size=12><color=#517508>SMOKE TRAIL!</color></size></color></size>");
                    }
                    parachute.ForwardTiltAcceleration = _config.UnboostedForwardTiltAcceleration;
                    parachute.TurnForce = _config.UnboostedTurnForce;
                }
            }
            return null;
        }
        private object OnSamSiteTarget(SamSite sam, BaseMountable mountable) {
            if (sam == null) return null;
            if (mountable == null) return null;
            BasePlayer player = GetMountedPlayer(mountable);
            if (player.IsValid() && IsDroppingFlares(player)) {
                return true;
            }
            return null;
        }
        object OnPlayerRespawn(BasePlayer player, BasePlayer.SpawnPoint spawnPoint) {
            if (permission.UserHasPermission(player.UserIDString, PermissionSpawnfromJet)) {
                if (!IsParachuteInWearContainer(player)) {
                    GiveParachute(player);
                }
                JetDropPlayer(player);
            }
            return null;
        }
        object OnPlayerSleepEnded(BasePlayer player) {
            if (playerParachuteMap.ContainsKey(player)) {
                BaseEntity smoketrail = playerParachuteMap[player];
                if (smoketrail != null && !smoketrail.IsDestroyed) {
                    smoketrail.Kill();
                }
                playerParachuteMap.Remove(player);
            }
            if (permission.UserHasPermission(player.UserIDString, PermissionSpawnWithChute) && !IsParachuteInWearContainer(player)) {
                GiveParachute(player);
                NotifyPlayerControls(player);
            }
            return null;
        }
        object CanWearItem(PlayerInventory inventory, Item item, int targetSlot) {
            int targetPos = 7;
            BasePlayer player = inventory.containerWear?.playerOwner;
            if (player != null && targetPos == targetSlot && item.info.itemid == 602628465 && HasPermission(player.userID, PermissionParaglide)) {
                NotifyPlayerControls(player);
            }
            return null;
        }
        private void OnPlayerInput(BasePlayer player, InputState input) {
            if (player == null) return;
            if (input == null) return;
            ulong playerId = player.userID;
            if (playerSettings.ContainsKey(playerId)) {
                if (!playerSettings[playerId].ToggleParaglider) return;
            }
            float currentTime = Time.realtimeSinceStartup;
            if (HasPermission(player.userID, PermissionParaglide)) {
                BaseMountable mount = player.GetMounted();
                if (mount != null && mount.name.Equals(ParachuteVehiclePrefab) == true) {
                    Parachute parachute = mount.gameObject.GetComponentInParent<Parachute>();
                    if (player.GetHeldEntity() != null) return;
                    if (input.IsDown(BUTTON.FORWARD))  //BOOSTER
                    {
                        if (HasPermission(player.userID, PermissionBoostT3) && parachute != null) {
                            if (input.IsDown(BUTTON.SPRINT)) {
                                parachute.ForwardTiltAcceleration = _config.BoostedForwardTiltAccelerationT3;
                                parachute.TurnForce = _config.BoostedTurnForceT3;
                            }
                            else {
                                parachute.ForwardTiltAcceleration = _config.UnboostedForwardTiltAcceleration;
                            }
                        }
                        else if (HasPermission(player.userID, PermissionBoostT2) && parachute != null) {
                            if (input.IsDown(BUTTON.SPRINT)) {
                                parachute.ForwardTiltAcceleration = _config.BoostedForwardTiltAccelerationT2;
                                parachute.TurnForce = _config.BoostedTurnForceT2;
                            }
                            else {
                                parachute.ForwardTiltAcceleration = _config.UnboostedForwardTiltAcceleration;
                            }
                        }
                        else if (HasPermission(player.userID, PermissionBoostT1) && parachute != null) {
                            if (input.IsDown(BUTTON.SPRINT)) {
                                parachute.ForwardTiltAcceleration = _config.BoostedForwardTiltAccelerationT1;
                                parachute.TurnForce = _config.BoostedTurnForceT1;
                            }
                            else {
                                parachute.ForwardTiltAcceleration = _config.UnboostedForwardTiltAcceleration;
                            }
                        }
                    }
                    if (input.IsDown(BUTTON.BACKWARD))  //BACKWARD BOOSTER
                    {
                        if (HasPermission(player.userID, PermissionBoostT3)) {
                            if (input.IsDown(BUTTON.SPRINT) && parachute != null) {
                                parachute.BackInputForceMultiplier = _config.BoostedBackInputForceMultiplierT3;
                                parachute.TurnForce = _config.BoostedTurnForceT3;
                            }
                        }
                        else if (HasPermission(player.userID, PermissionBoostT2)) {
                            if (input.IsDown(BUTTON.SPRINT) && parachute != null) {
                                parachute.BackInputForceMultiplier = _config.BoostedBackInputForceMultiplierT2;
                                parachute.TurnForce = _config.BoostedTurnForceT2;
                            }
                        }
                        else if (HasPermission(player.userID, PermissionBoostT1)) {
                            if (input.IsDown(BUTTON.SPRINT) && parachute != null) {
                                parachute.BackInputForceMultiplier = _config.BoostedBackInputForceMultiplierT1;
                                parachute.TurnForce = _config.BoostedTurnForceT1;
                            }
                        }
                        else if (parachute != null) {
                            parachute.BackInputForceMultiplier = _config.UnboostedBackInputForceMultiplier;
                        }
                    }
                    if (input.IsDown(BUTTON.FIRE_PRIMARY) && parachute != null)  // AFTERBURNER
                    {
                        if (HasPermission(player.userID, PermissionAfterburnerT3))  //TIER 3
                        {
                            if (HasPermission(player.userID, PermissionNoFuelRequired)) {
                                PlayAfterburnEffect(player);
                                parachute.rigidBody.AddForce(Vector3.up * _config.upwardsForceT3, ForceMode.Impulse);
                                parachute.rigidBody.AddForce(parachute.transform.forward * _config.forwardsForceT3, ForceMode.Impulse);
                            }
                            else if (HasEnoughFuel(player.UserIDString)) {
                                ConsumeFuel(player.UserIDString, _config.FuelConsumption);
                                RefillFuelOverTime(player.UserIDString);
                                PlayAfterburnEffect(player);
                                parachute.rigidBody.AddForce(Vector3.up * _config.upwardsForceT3, ForceMode.Impulse);
                                parachute.rigidBody.AddForce(parachute.transform.forward * _config.forwardsForceT3, ForceMode.Impulse);
                            }
                            else if (!lastFuelEmptyMessageTime.ContainsKey(player.UserIDString) || (Time.realtimeSinceStartup - lastFuelEmptyMessageTime[player.UserIDString] >= 6f)) {
                                player.ChatMessage("<size=10><color=#a4bd6f>FUEL EMPTY!\nRefilling!</color></size>");
                                RefillFuelOverTime(player.UserIDString);
                                lastFuelEmptyMessageTime[player.UserIDString] = Time.realtimeSinceStartup;
                            }
                        }
                        else if (HasPermission(player.userID, PermissionAfterburnerT2))  //TIER 2
                        {
                            if (HasPermission(player.userID, PermissionNoFuelRequired)) {
                                PlayAfterburnEffect(player);
                                parachute.rigidBody.AddForce(Vector3.up * _config.upwardsForceT2, ForceMode.Impulse);
                                parachute.rigidBody.AddForce(parachute.transform.forward * _config.forwardsForceT2, ForceMode.Impulse);
                            }
                            else if (HasEnoughFuel(player.UserIDString)) {
                                ConsumeFuel(player.UserIDString, _config.FuelConsumption);
                                RefillFuelOverTime(player.UserIDString);
                                PlayAfterburnEffect(player);
                                parachute.rigidBody.AddForce(Vector3.up * _config.upwardsForceT2, ForceMode.Impulse);
                                parachute.rigidBody.AddForce(parachute.transform.forward * _config.forwardsForceT2, ForceMode.Impulse);
                            }
                            else if (!lastFuelEmptyMessageTime.ContainsKey(player.UserIDString) || (Time.realtimeSinceStartup - lastFuelEmptyMessageTime[player.UserIDString] >= 6f)) {
                                player.ChatMessage("<size=10><color=#a4bd6f>FUEL EMPTY!\nRefilling!</color></size>");
                                RefillFuelOverTime(player.UserIDString);
                                lastFuelEmptyMessageTime[player.UserIDString] = Time.realtimeSinceStartup;
                            }
                        }
                        else if (HasPermission(player.userID, PermissionAfterburnerT1))  //TIER 1
                        {
                            if (HasPermission(player.userID, PermissionNoFuelRequired)) {
                                PlayAfterburnEffect(player);
                                parachute.rigidBody.AddForce(Vector3.up * _config.upwardsForceT1, ForceMode.Impulse);
                                parachute.rigidBody.AddForce(parachute.transform.forward * _config.forwardsForceT1, ForceMode.Impulse);
                            }
                            else if (HasEnoughFuel(player.UserIDString)) {
                                ConsumeFuel(player.UserIDString, _config.FuelConsumption);
                                RefillFuelOverTime(player.UserIDString);
                                PlayAfterburnEffect(player);
                                parachute.rigidBody.AddForce(Vector3.up * _config.upwardsForceT1, ForceMode.Impulse);
                                parachute.rigidBody.AddForce(parachute.transform.forward * _config.forwardsForceT1, ForceMode.Impulse);
                            }
                            else if (!lastFuelEmptyMessageTime.ContainsKey(player.UserIDString) || (Time.realtimeSinceStartup - lastFuelEmptyMessageTime[player.UserIDString] >= 6f)) {
                                player.ChatMessage("<size=10><color=#a4bd6f>FUEL EMPTY!\nRefilling!</color></size>");
                                RefillFuelOverTime(player.UserIDString);
                                lastFuelEmptyMessageTime[player.UserIDString] = Time.realtimeSinceStartup;
                            }
                        }
                    }
                    if (input.WasJustPressed(BUTTON.USE))  //FLARES
                    {
                        if (HasPermission(player.userID, PermissionUseFlares)) {
                            if (!HasPermission(player.userID, PermissionFreeFlares)) {
                                var inventory = player.inventory;
                                bool hasFlare = false;
                                List<Item> items = Pool.GetList<Item>();
                                inventory.GetAllItems(items);
                                foreach (var flareitem in items) {
                                    if (flareitem.info.shortname == "flare") {
                                        hasFlare = true;
                                        flareToConsume = flareitem;
                                        break;
                                    }
                                }
                                Pool.FreeList(ref items);
                                if (!hasFlare) {
                                    player.ChatMessage("<color=#bcb6b3>You don't have any flares.</color>");
                                    return;
                                }
                                if (flareToConsume != null) {
                                    flareToConsume.UseItem(1);
                                }
                            }
                            playerLastFlaresTime[player.UserIDString] = Time.realtimeSinceStartup;
                            Vector3 effectPosition = player.transform.position - (player.transform.forward * 5f) - (player.transform.up * 3f);
                            Quaternion effectRotation = player.transform.rotation;
                            Vector3 effectDirection = effectRotation * Vector3.forward;
                            Effect.server.Run(FlareEffect, effectPosition, effectDirection);
                            if (!lastFlareMessageTime.ContainsKey(player.UserIDString) || (Time.realtimeSinceStartup - lastFlareMessageTime[player.UserIDString] >= _config.flaresCooldownDuration)) {
                                player.ChatMessage("<size=10><color=#a4bd6f>FLARES DEPLOYED</color>\n<color=#bcb6b3>SAM TARGETING DISABLED\n" + "for " + _config.flaresCooldownDuration.ToString() + " seconds</size></color>");
                                lastFlareMessageTime[player.UserIDString] = Time.realtimeSinceStartup;
                            }
                        }
                    }
                    if (input.IsDown(BUTTON.FIRE_SECONDARY) && parachute != null)  //LOWER
                    {
                        if (HasPermission(player.userID, PermissionLowerT3)) {
                            if (input.IsDown(BUTTON.SPRINT) && parachute != null && HasPermission(player.userID, PermissionBoostT3)) {
                                parachute.rigidBody.AddForce(Vector3.down * _config.boostDownwardsForceT3, ForceMode.Impulse);
                            }
                            else if (input.IsDown(BUTTON.SPRINT) && parachute != null && HasPermission(player.userID, PermissionBoostT2)) {
                                parachute.rigidBody.AddForce(Vector3.down * _config.boostDownwardsForceT2, ForceMode.Impulse);
                            }
                            else if (input.IsDown(BUTTON.SPRINT) && parachute != null && HasPermission(player.userID, PermissionBoostT1)) {
                                parachute.rigidBody.AddForce(Vector3.down * _config.boostDownwardsForceT1, ForceMode.Impulse);
                            }
                            if (input.IsDown(BUTTON.FIRE_PRIMARY) && parachute != null && HasPermission(player.userID, PermissionAfterburnerT3)) {
                                parachute.rigidBody.AddForce(Vector3.down * _config.afterburnDownwardsForceT3, ForceMode.Impulse);
                            }
                            else if (input.IsDown(BUTTON.FIRE_PRIMARY) && parachute != null && HasPermission(player.userID, PermissionAfterburnerT2)) {
                                parachute.rigidBody.AddForce(Vector3.down * _config.afterburnDownwardsForceT2, ForceMode.Impulse);
                            }
                            else if (input.IsDown(BUTTON.FIRE_PRIMARY) && parachute != null && HasPermission(player.userID, PermissionAfterburnerT1)) {
                                parachute.rigidBody.AddForce(Vector3.down * _config.afterburnDownwardsForceT1, ForceMode.Impulse);
                            }
                            else if (parachute != null) {
                                parachute.rigidBody.AddForce(Vector3.down * _config.downwardsForceT3, ForceMode.Impulse);
                            }
                        }
                        else if (HasPermission(player.userID, PermissionLowerT2)) {
                            if (input.IsDown(BUTTON.SPRINT) && parachute != null && HasPermission(player.userID, PermissionBoostT3)) {
                                parachute.rigidBody.AddForce(Vector3.down * _config.boostDownwardsForceT3, ForceMode.Impulse);
                            }
                            else if (input.IsDown(BUTTON.SPRINT) && parachute != null && HasPermission(player.userID, PermissionBoostT2)) {
                                parachute.rigidBody.AddForce(Vector3.down * _config.boostDownwardsForceT2, ForceMode.Impulse);
                            }
                            else if (input.IsDown(BUTTON.SPRINT) && parachute != null && HasPermission(player.userID, PermissionBoostT1)) {
                                parachute.rigidBody.AddForce(Vector3.down * _config.boostDownwardsForceT1, ForceMode.Impulse);
                            }
                            if (input.IsDown(BUTTON.FIRE_PRIMARY) && parachute != null && HasPermission(player.userID, PermissionAfterburnerT3)) {
                                parachute.rigidBody.AddForce(Vector3.down * _config.afterburnDownwardsForceT3, ForceMode.Impulse);
                            }
                            else if (input.IsDown(BUTTON.FIRE_PRIMARY) && parachute != null && HasPermission(player.userID, PermissionAfterburnerT2)) {
                                parachute.rigidBody.AddForce(Vector3.down * _config.afterburnDownwardsForceT2, ForceMode.Impulse);
                            }
                            else if (input.IsDown(BUTTON.FIRE_PRIMARY) && parachute != null && HasPermission(player.userID, PermissionAfterburnerT1)) {
                                parachute.rigidBody.AddForce(Vector3.down * _config.afterburnDownwardsForceT1, ForceMode.Impulse);
                            }
                            else if (parachute != null) {
                                parachute.rigidBody.AddForce(Vector3.down * _config.downwardsForceT2, ForceMode.Impulse);
                            }
                        }
                        else if (HasPermission(player.userID, PermissionLowerT1)) {
                            if (input.IsDown(BUTTON.SPRINT) && parachute != null && HasPermission(player.userID, PermissionBoostT3)) {
                                parachute.rigidBody.AddForce(Vector3.down * _config.boostDownwardsForceT3, ForceMode.Impulse);
                            }
                            else if (input.IsDown(BUTTON.SPRINT) && parachute != null && HasPermission(player.userID, PermissionBoostT2)) {
                                parachute.rigidBody.AddForce(Vector3.down * _config.boostDownwardsForceT2, ForceMode.Impulse);
                            }
                            else if (input.IsDown(BUTTON.SPRINT) && parachute != null && HasPermission(player.userID, PermissionBoostT1)) {
                                parachute.rigidBody.AddForce(Vector3.down * _config.boostDownwardsForceT1, ForceMode.Impulse);
                            }
                            if (input.IsDown(BUTTON.FIRE_PRIMARY) && parachute != null && HasPermission(player.userID, PermissionAfterburnerT3)) {
                                parachute.rigidBody.AddForce(Vector3.down * _config.afterburnDownwardsForceT3, ForceMode.Impulse);
                            }
                            else if (input.IsDown(BUTTON.FIRE_PRIMARY) && parachute != null && HasPermission(player.userID, PermissionAfterburnerT2)) {
                                parachute.rigidBody.AddForce(Vector3.down * _config.afterburnDownwardsForceT2, ForceMode.Impulse);
                            }
                            else if (input.IsDown(BUTTON.FIRE_PRIMARY) && parachute != null && HasPermission(player.userID, PermissionAfterburnerT1)) {
                                parachute.rigidBody.AddForce(Vector3.down * _config.afterburnDownwardsForceT1, ForceMode.Impulse);
                            }
                            else if (parachute != null) {
                                parachute.rigidBody.AddForce(Vector3.down * _config.downwardsForceT1, ForceMode.Impulse);
                            }
                        }
                    }
                    if (input.WasJustPressed(BUTTON.RELOAD) && parachute != null)  //TOGGLE SMOKE
                    {
                        if (HasPermission(player.userID, PermissionSmoke)) {
                            if (playerParachuteMap.ContainsKey(player)) {
                                BaseEntity smoketrail = playerParachuteMap[player];
                                if (smoketrail != null && !smoketrail.IsDestroyed) {
                                    smoketrail.Kill();
                                }
                                playerParachuteMap.Remove(player);
                                player.ChatMessage("<size=10><color=#cf4bde>SMOKE TRAIL DISABLED</color></size>");
                            }
                            else if (!playerParachuteMap.ContainsKey(player)) {
                                SpawnSupplySignal(player, parachute, SupplySignalPath);
                            }
                        }
                    }
                }
                if (input.WasJustPressed(BUTTON.FIRE_THIRD)) {
                    if (!IsParachuteInWearContainer(player)) {
                        return;
                    }
                    if (HasPermission(player.userID, PermissionLaunchT1) || HasPermission(player.userID, PermissionLaunchT2) || HasPermission(player.userID, PermissionLaunchT3)) {
                        if (IsRaidBlocked(player) || IsCombatBlocked(player)) return;
                        if (!permission.UserHasPermission(player.UserIDString, PermissionIgnoreNoEscape) && !player.CanBuild() && _config.preventLaunchWhenBuildBlocked) {
                            player.ChatMessage($"<size=10><color=#a4bd6f>Building Blocked!</color></size>");
                            return;
                        }
                        if (!lastCancelLaunchTime.ContainsKey(player.UserIDString) || (Time.realtimeSinceStartup - lastCancelLaunchTime[player.UserIDString] >= 0.75f)) {
                            if (permission.UserHasPermission(player.UserIDString, PermissionLaunchT3))  //TIER 3
                            {
                                if (!lastLaunchTime.ContainsKey(player.UserIDString) || (Time.realtimeSinceStartup - lastLaunchTime[player.UserIDString] >= _config.launchCooldownT3) || permission.UserHasPermission(player.UserIDString, PermissionNoLaunchCooldown)) {
                                    player.ChatMessage("<color=#517508>LAUNCHING PARAGLIDER</color>\n<size=10><color=#a4bd6f>[RELEASE TO CANCEL]\nMake sure you have space!</color></size>");
                                    launchingPlayers[player.UserIDString] = null;
                                    var count = (int)_config.CountdownTimerT3;
                                    CountdownToLaunch(player, count, input);
                                }
                                else {
                                    float timeElapsed = Time.realtimeSinceStartup - lastLaunchTime[player.UserIDString];
                                    float remainingTime = _config.launchCooldownT3 - timeElapsed;
                                    if (remainingTime < 0) {
                                        remainingTime = 0;
                                    }
                                    player.ChatMessage($"<size=10><color=#a4bd6f>Launch Cooldown remaining: {remainingTime:F1} seconds</color></size>");
                                }
                            }
                            else if (permission.UserHasPermission(player.UserIDString, PermissionLaunchT2))  //TIER 2
                            {
                                if (!lastLaunchTime.ContainsKey(player.UserIDString) || (Time.realtimeSinceStartup - lastLaunchTime[player.UserIDString] >= _config.launchCooldownT2) || permission.UserHasPermission(player.UserIDString, PermissionNoLaunchCooldown)) {
                                    player.ChatMessage("<color=#517508>LAUNCHING PARAGLIDER</color>\n<size=10><color=#a4bd6f>[RELEASE TO CANCEL]\nMake sure you have space!</color></size>");
                                    launchingPlayers[player.UserIDString] = null;
                                    var count = (int)_config.CountdownTimerT2;
                                    CountdownToLaunch(player, count, input);
                                }
                                else {
                                    float timeElapsed = Time.realtimeSinceStartup - lastLaunchTime[player.UserIDString];
                                    float remainingTime = _config.launchCooldownT2 - timeElapsed;
                                    if (remainingTime < 0) {
                                        remainingTime = 0;
                                    }
                                    player.ChatMessage($"<size=10><color=#a4bd6f>Launch Cooldown remaining: {remainingTime:F1} seconds</color></size>");
                                }
                            }
                            else if (permission.UserHasPermission(player.UserIDString, PermissionLaunchT1))  //TIER 1
                            {
                                if (!lastLaunchTime.ContainsKey(player.UserIDString) || (Time.realtimeSinceStartup - lastLaunchTime[player.UserIDString] >= _config.launchCooldownT1) || permission.UserHasPermission(player.UserIDString, PermissionNoLaunchCooldown)) {
                                    player.ChatMessage("<color=#517508>LAUNCHING PARAGLIDER</color>\n<size=10><color=#a4bd6f>[RELEASE TO CANCEL]\nMake sure you have space!</color></size>");
                                    launchingPlayers[player.UserIDString] = null;
                                    var count = (int)_config.CountdownTimerT1;
                                    CountdownToLaunch(player, count, input);
                                }
                                else {
                                    float timeElapsed = Time.realtimeSinceStartup - lastLaunchTime[player.UserIDString];
                                    float remainingTime = _config.launchCooldownT1 - timeElapsed;
                                    if (remainingTime < 0) {
                                        remainingTime = 0;
                                    }
                                    player.ChatMessage($"<size=10><color=#a4bd6f>Launch Cooldown remaining: {remainingTime:F1} seconds</color></size>");
                                }
                            }
                        }
                    }
                }
                if (input.WasJustReleased(BUTTON.FIRE_THIRD)) {
                    if (launchingPlayers.ContainsKey(player.UserIDString)) {
                        launchingPlayers.Remove(player.UserIDString);
                        lastCancelLaunchTime[player.UserIDString] = Time.realtimeSinceStartup;
                    }
                }
            }
        }
#endregion
#region Methods
        private void GiveParachute(BasePlayer player) {
            Item parachute = ItemManager.CreateByItemID(ItemManager.FindItemDefinition("parachute").itemid, 1, 0);
            parachute.SetParent(player.inventory.containerWear);
            parachute.position = 7;
        }
        private void NotifyPlayerControls(BasePlayer player) {
            float currentTime = Time.realtimeSinceStartup;
            if (permission.UserHasPermission(player.UserIDString, PermissionParaglide)) {
                if (!lastEquipMessageTime.ContainsKey(player.UserIDString) || (Time.realtimeSinceStartup - lastEquipMessageTime[player.UserIDString] >= 6f)) {
                    player.ChatMessage("<size=12><color=#517508>PARAGLIDER EQUIPPED</color></size>");
                    lastEquipMessageTime[player.UserIDString] = Time.realtimeSinceStartup;
                    if (HasPermission(player.userID, PermissionLaunchT1) || HasPermission(player.userID, PermissionLaunchT2) || HasPermission(player.userID, PermissionLaunchT3)) {
                        if (!lastLaunchMessageTime.ContainsKey(player.UserIDString) || (Time.realtimeSinceStartup - lastLaunchMessageTime[player.UserIDString] >= 6f)) {
                            player.ChatMessage("<size=10><color=#a4bd6f>Hold <size=12><color=#517508>MIDDLE MOUSE</color></size> to <size=12><color=#517508>LAUNCH!</size></color></color>\n" + "<size=10><color=#a4bd6f>Make sure you have space!</color></size>");
                            lastLaunchMessageTime[player.UserIDString] = Time.realtimeSinceStartup;
                        }
                    }
                    if (permission.UserHasPermission(player.UserIDString, PermissionJetDropT1) || permission.UserHasPermission(player.UserIDString, PermissionJetDropT2) || permission.UserHasPermission(player.UserIDString, PermissionJetDropT3)) {
                        if (!lastJetMessageTime.ContainsKey(player.UserIDString) || (Time.realtimeSinceStartup - lastJetMessageTime[player.UserIDString] >= 6f)) {
                            player.ChatMessage("<size=10><color=#a4bd6f>Type <size=12><color=#517508>/drop</color></size> to get dropped by a <size=12><color=#517508>JET!</size></color></color></size>");
                            lastJetMessageTime[player.UserIDString] = Time.realtimeSinceStartup;
                        }
                    }
                }
            }
        }
        private void CountdownToLaunch(BasePlayer player, int count, InputState input) {
            if (!launchingPlayers.ContainsKey(player.UserIDString)) {
                lastCancelLaunchTime[player.UserIDString] = Time.realtimeSinceStartup;
                return;
            }
            if (!input.IsDown(BUTTON.FIRE_THIRD)) {
                launchingPlayers.Remove(player.UserIDString);
                lastCancelLaunchTime[player.UserIDString] = Time.realtimeSinceStartup;
                return;
            }
            if (count > 0) {
                if (_config.launchEffect) {
                    Vector3 preLaunchEffectPosition = player.transform.position;
                    Quaternion preLaunchEffectRotation = player.transform.rotation;
                    Vector3 preLaunchEffectDirection = preLaunchEffectRotation * Vector3.forward;
                    Effect.server.Run(PreLaunchEffect, preLaunchEffectPosition, preLaunchEffectDirection);
                    timer.Once(0.3f, () => Effect.server.Run(PreLaunchEffect, preLaunchEffectPosition, preLaunchEffectDirection));
                    timer.Once(0.6f, () => Effect.server.Run(PreLaunchEffect, preLaunchEffectPosition, preLaunchEffectDirection));
                    timer.Once(0.9f, () => Effect.server.Run(PreLaunchEffect, preLaunchEffectPosition, preLaunchEffectDirection));
                }
                player.ChatMessage($"<size=10><color=#ff0000>{count}</color></size>");
                timer.Once(1.0f, () => CountdownToLaunch(player, count - 1, input));
            }
            else if (count <= 0) {
                LaunchPlayer(player);
                launchingPlayers.Remove(player.UserIDString);
            }
        }
        private void LaunchByCommand(BasePlayer player, int count) {
            if (!launchingPlayers.ContainsKey(player.UserIDString)) {
                lastCancel
// ... [Code preview truncated due to length. Full source in attached file] ...

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