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] ...