Please disclose if your mod was created primarily using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of IBelieveICanFly v1.0.3
IBelieveICanFly.dll
Decompiled a month ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Globalization; using System.IO; using System.IO.Compression; using System.Linq; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using IBelieveICanFly.Patches; using IBelieveICanFly.Registration; using ItemManager; using JetBrains.Annotations; using Microsoft.CodeAnalysis; using PieceManager; using ServerSync; using TMPro; using UnityEngine; using UnityEngine.Audio; using UnityEngine.SceneManagement; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("IBelieveICanFly")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Yggdrah")] [assembly: AssemblyProduct("IBelieveICanFly")] [assembly: AssemblyCopyright("Copyright \ufffd 2025")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("E0E2F92E-557C-4A05-9D89-AA92A0BD75C4")] [assembly: AssemblyFileVersion("1.0.3")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.3.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace IBelieveICanFly { [BepInPlugin("Yggdrah.IBelieveICanFly", "IBelieveICanFly", "1.0.3")] public class IBelieveICanFlyPlugin : BaseUnityPlugin { private class ConfigurationManagerAttributes { public int? Order; public bool? Browsable; public string? Category; public Action<ConfigEntryBase>? CustomDrawer; } private class AcceptableShortcuts : AcceptableValueBase { public AcceptableShortcuts() : base(typeof(KeyboardShortcut)) { } public override object Clamp(object value) { return value; } public override bool IsValid(object value) { return true; } public override string ToDescriptionString() { return "# Acceptable values: " + string.Join(", ", UnityInput.Current.SupportedKeyCodes); } } internal const string ModName = "IBelieveICanFly"; internal const string ModVersion = "1.0.3"; internal const string Author = "Yggdrah"; private const string ModGUID = "Yggdrah.IBelieveICanFly"; private static readonly string ConfigFileName = "Yggdrah.IBelieveICanFly.cfg"; private static readonly string ConfigFileFullPath; internal static string ConnectionError; private readonly Harmony _harmony = new Harmony("Yggdrah.IBelieveICanFly"); internal static IBelieveICanFlyPlugin? context; public static readonly ManualLogSource IBelieveICanFlyLogger; private static readonly ConfigSync ConfigSync; private static readonly Dictionary<string, AssetBundle> _assetBundleCache; public const string bundleName = "ibelieveicanfly"; private static ConfigEntry<bool>? _serverConfigLocked; public void Awake() { bool saveOnConfigSet = ((BaseUnityPlugin)this).Config.SaveOnConfigSet; ((BaseUnityPlugin)this).Config.SaveOnConfigSet = false; context = this; _serverConfigLocked = config("01 - ServerSync", "01 - Lock Configuration", value: true, "Whether to enable or disable if the configuration is locked in which only server admins can change"); ConfigSync.AddLockingConfigEntry<bool>(_serverConfigLocked); GetAssetBundle("ibelieveicanfly"); Config.RegisterAllConfigs(((BaseUnityPlugin)this).Config, "Yggdrah.IBelieveICanFly"); Assembly executingAssembly = Assembly.GetExecutingAssembly(); _harmony.PatchAll(executingAssembly); SetupWatcher(); GliderSystem.Initialize(); IBelieveICanFly.Registration.Item.RegisterAll("ibelieveicanfly"); if (saveOnConfigSet) { ((BaseUnityPlugin)this).Config.SaveOnConfigSet = saveOnConfigSet; ((BaseUnityPlugin)this).Config.Save(); } } private void OnDestroy() { ((BaseUnityPlugin)this).Config.Save(); GliderSystem.OnModUnload(); GliderSystem.CleanupRemotePlayerGliders(); } public static AssetBundle? GetAssetBundle(string filename) { string filename2 = filename; if (_assetBundleCache.TryGetValue(filename2, out AssetBundle value)) { return value; } AssetBundle val = ((IEnumerable<AssetBundle>)Resources.FindObjectsOfTypeAll<AssetBundle>()).FirstOrDefault((Func<AssetBundle, bool>)((AssetBundle a) => ((Object)a).name == filename2)); if ((Object)(object)val != (Object)null) { _assetBundleCache[filename2] = val; return val; } try { Assembly executingAssembly = Assembly.GetExecutingAssembly(); string name = executingAssembly.GetManifestResourceNames().Single((string str) => str.EndsWith(filename2)); using Stream stream = executingAssembly.GetManifestResourceStream(name); AssetBundle val2 = AssetBundle.LoadFromStream(stream); _assetBundleCache[filename2] = val2; return val2; } catch (Exception) { return null; } } private void SetupWatcher() { FileSystemWatcher fileSystemWatcher = new FileSystemWatcher(Paths.ConfigPath, ConfigFileName); fileSystemWatcher.Changed += ReadConfigValues; fileSystemWatcher.Created += ReadConfigValues; fileSystemWatcher.Renamed += ReadConfigValues; fileSystemWatcher.IncludeSubdirectories = true; fileSystemWatcher.SynchronizingObject = ThreadingHelper.SynchronizingObject; fileSystemWatcher.EnableRaisingEvents = true; } private void ReadConfigValues(object sender, FileSystemEventArgs e) { if (File.Exists(ConfigFileFullPath)) { ((BaseUnityPlugin)this).Config.Reload(); } } internal ConfigEntry<T> config<T>(string group, string name, T value, ConfigDescription description, bool synchronizedSetting = true) { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Expected O, but got Unknown ConfigDescription val = new ConfigDescription(description.Description + (synchronizedSetting ? " [Synced with Server]" : " [Not Synced with Server]"), description.AcceptableValues, description.Tags); ConfigEntry<T> val2 = ((BaseUnityPlugin)this).Config.Bind<T>(group, name, value, val); SyncedConfigEntry<T> syncedConfigEntry = ConfigSync.AddConfigEntry<T>(val2); syncedConfigEntry.SynchronizedConfig = synchronizedSetting; return val2; } internal ConfigEntry<T> config<T>(string group, string name, T value, string description, bool synchronizedSetting = true) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Expected O, but got Unknown return config(group, name, value, new ConfigDescription(description, (AcceptableValueBase)null, Array.Empty<object>()), synchronizedSetting); } static IBelieveICanFlyPlugin() { string configPath = Paths.ConfigPath; char directorySeparatorChar = Path.DirectorySeparatorChar; ConfigFileFullPath = configPath + directorySeparatorChar + ConfigFileName; ConnectionError = ""; IBelieveICanFlyLogger = Logger.CreateLogSource("IBelieveICanFly"); ConfigSync = new ConfigSync("Yggdrah.IBelieveICanFly") { DisplayName = "IBelieveICanFly", CurrentVersion = "1.0.3", MinimumRequiredVersion = "1.0.3", ModRequired = true }; _assetBundleCache = new Dictionary<string, AssetBundle>(); } } public static class KeyboardExtensions { public static bool IsKeyDown(this KeyboardShortcut shortcut) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) return (int)((KeyboardShortcut)(ref shortcut)).MainKey != 0 && Input.GetKeyDown(((KeyboardShortcut)(ref shortcut)).MainKey) && ((KeyboardShortcut)(ref shortcut)).Modifiers.All((Func<KeyCode, bool>)Input.GetKey); } public static bool IsKeyHeld(this KeyboardShortcut shortcut) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) return (int)((KeyboardShortcut)(ref shortcut)).MainKey != 0 && Input.GetKey(((KeyboardShortcut)(ref shortcut)).MainKey) && ((KeyboardShortcut)(ref shortcut)).Modifiers.All((Func<KeyCode, bool>)Input.GetKey); } } [HarmonyPatch(typeof(ZNet), "OnNewConnection")] public static class RegisterAndCheckVersion { private static void Prefix(ZNetPeer peer, ref ZNet __instance) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown peer.m_rpc.Register<ZPackage>("IBelieveICanFly_VersionCheck", (Action<ZRpc, ZPackage>)RpcHandlers.RPC_IBelieveICanFly_Version); ZPackage val = new ZPackage(); val.Write("1.0.3"); peer.m_rpc.Invoke("IBelieveICanFly_VersionCheck", new object[1] { val }); } } [HarmonyPatch(typeof(ZNet), "RPC_PeerInfo")] public static class VerifyClient { private static bool Prefix(ZRpc rpc, ZPackage pkg, ref ZNet __instance) { if (!__instance.IsServer() || RpcHandlers.ValidatedPeers.Contains(rpc)) { return true; } rpc.Invoke("Error", new object[1] { 3 }); return false; } private static void Postfix(ZNet __instance) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown ZRoutedRpc.instance.InvokeRoutedRPC(ZRoutedRpc.instance.GetServerPeerID(), "RequestAdminSync", new object[1] { (object)new ZPackage() }); } } [HarmonyPatch(typeof(FejdStartup), "ShowConnectError")] public class ShowConnectionError { private static void Postfix(FejdStartup __instance) { if (__instance.m_connectionFailedPanel.activeSelf) { __instance.m_connectionFailedError.fontSizeMax = 25f; __instance.m_connectionFailedError.fontSizeMin = 15f; TMP_Text connectionFailedError = __instance.m_connectionFailedError; connectionFailedError.text = connectionFailedError.text + "\n" + IBelieveICanFlyPlugin.ConnectionError; } } } [HarmonyPatch(typeof(ZNet), "Disconnect")] public static class RemoveDisconnectedPeerFromVerified { private static void Prefix(ZNetPeer peer, ref ZNet __instance) { if (__instance.IsServer()) { RpcHandlers.ValidatedPeers.Remove(peer.m_rpc); } } } public static class RpcHandlers { public static readonly List<ZRpc> ValidatedPeers = new List<ZRpc>(); public static void RPC_IBelieveICanFly_Version(ZRpc rpc, ZPackage pkg) { string text = pkg.ReadString(); if (text != "1.0.3") { IBelieveICanFlyPlugin.ConnectionError = "IBelieveICanFly Installed: 1.0.3\n Needed: " + text; if (ZNet.instance.IsServer()) { rpc.Invoke("Error", new object[1] { 3 }); } } else if (ZNet.instance.IsServer()) { ValidatedPeers.Add(rpc); } } } } namespace IBelieveICanFly.Registration { public static class Config { public static ConfigEntry<bool> ToggleMode { get; private set; } public static ConfigEntry<bool> Wings1Enabled { get; private set; } public static ConfigEntry<string> Wings1ItemName { get; private set; } public static ConfigEntry<bool> Wings1CheckRightHand { get; private set; } public static ConfigEntry<bool> Wings1CheckLeftHand { get; private set; } public static ConfigEntry<bool> Wings1CheckUtility { get; private set; } public static ConfigEntry<bool> Wings1UseFallReset { get; private set; } public static ConfigEntry<bool> Wings1Animation { get; private set; } public static ConfigEntry<float> Wings1MinActivationFallSpeed { get; private set; } public static ConfigEntry<float> Wings1ForwardSpeed { get; private set; } public static ConfigEntry<float> Wings1ForwardForce { get; private set; } public static ConfigEntry<float> Wings1DescentSpeed { get; private set; } public static ConfigEntry<float> Wings1AirTurnSpeed { get; private set; } public static ConfigEntry<float> Wings1LateralDamp { get; private set; } public static ConfigEntry<float> Wings1GroundProbeDistance { get; private set; } public static ConfigEntry<float> Wings1CushionDescentSpeed { get; private set; } public static ConfigEntry<float> Wings1CushionLerp { get; private set; } public static ConfigEntry<float> Wings1UpDownOffset { get; private set; } public static ConfigEntry<float> Wings1LeftRightOffset { get; private set; } public static ConfigEntry<float> Wings1ForwardBackOffset { get; private set; } public static ConfigEntry<float> Wings1RotationX { get; private set; } public static ConfigEntry<float> Wings1RotationY { get; private set; } public static ConfigEntry<float> Wings1RotationZ { get; private set; } public static ConfigEntry<float> Wings1Scale { get; private set; } public static ConfigEntry<bool> Wings1SFX { get; private set; } public static ConfigEntry<bool> Wings1AttachSFXToPlayer { get; private set; } public static ConfigEntry<string> Wings1StartSFX { get; private set; } public static ConfigEntry<string> Wings1LoopSFX { get; private set; } public static ConfigEntry<string> Wings1StopSFX { get; private set; } public static ConfigEntry<bool> Wings1VFX { get; private set; } public static ConfigEntry<bool> Wings1AttachEffectsToPlayer { get; private set; } public static ConfigEntry<string> Wings1StartVFX { get; private set; } public static ConfigEntry<string> Wings1LoopVFX { get; private set; } public static ConfigEntry<string> Wings1StopVFX { get; private set; } public static ConfigEntry<string> Wings1VFXPosition { get; private set; } public static ConfigEntry<float> Wings1VFXScale { get; private set; } public static ConfigEntry<float> Wings1VFXCustomX { get; private set; } public static ConfigEntry<float> Wings1VFXCustomY { get; private set; } public static ConfigEntry<float> Wings1VFXCustomZ { get; private set; } public static ConfigEntry<string> Wings1VisualPrefab { get; private set; } public static ConfigEntry<float> Wings1TiltMaxPitch { get; private set; } public static ConfigEntry<float> Wings1TiltMaxRoll { get; private set; } public static ConfigEntry<float> Wings1TiltPitchSmoothTime { get; private set; } public static ConfigEntry<float> Wings1TiltRollSmoothTime { get; private set; } public static ConfigEntry<bool> Wings2Enabled { get; private set; } public static ConfigEntry<string> Wings2ItemName { get; private set; } public static ConfigEntry<bool> Wings2CheckRightHand { get; private set; } public static ConfigEntry<bool> Wings2CheckLeftHand { get; private set; } public static ConfigEntry<bool> Wings2CheckUtility { get; private set; } public static ConfigEntry<bool> Wings2UseFallReset { get; private set; } public static ConfigEntry<bool> Wings2Animation { get; private set; } public static ConfigEntry<float> Wings2MinActivationFallSpeed { get; private set; } public static ConfigEntry<float> Wings2ForwardSpeed { get; private set; } public static ConfigEntry<float> Wings2ForwardForce { get; private set; } public static ConfigEntry<float> Wings2DescentSpeed { get; private set; } public static ConfigEntry<float> Wings2AirTurnSpeed { get; private set; } public static ConfigEntry<float> Wings2LateralDamp { get; private set; } public static ConfigEntry<float> Wings2GroundProbeDistance { get; private set; } public static ConfigEntry<float> Wings2CushionDescentSpeed { get; private set; } public static ConfigEntry<float> Wings2CushionLerp { get; private set; } public static ConfigEntry<float> Wings2UpDownOffset { get; private set; } public static ConfigEntry<float> Wings2LeftRightOffset { get; private set; } public static ConfigEntry<float> Wings2ForwardBackOffset { get; private set; } public static ConfigEntry<float> Wings2RotationX { get; private set; } public static ConfigEntry<float> Wings2RotationY { get; private set; } public static ConfigEntry<float> Wings2RotationZ { get; private set; } public static ConfigEntry<float> Wings2Scale { get; private set; } public static ConfigEntry<bool> Wings2SFX { get; private set; } public static ConfigEntry<bool> Wings2AttachSFXToPlayer { get; private set; } public static ConfigEntry<string> Wings2StartSFX { get; private set; } public static ConfigEntry<string> Wings2LoopSFX { get; private set; } public static ConfigEntry<string> Wings2StopSFX { get; private set; } public static ConfigEntry<bool> Wings2VFX { get; private set; } public static ConfigEntry<bool> Wings2AttachEffectsToPlayer { get; private set; } public static ConfigEntry<string> Wings2StartVFX { get; private set; } public static ConfigEntry<string> Wings2LoopVFX { get; private set; } public static ConfigEntry<string> Wings2StopVFX { get; private set; } public static ConfigEntry<string> Wings2VFXPosition { get; private set; } public static ConfigEntry<float> Wings2VFXScale { get; private set; } public static ConfigEntry<float> Wings2VFXCustomX { get; private set; } public static ConfigEntry<float> Wings2VFXCustomY { get; private set; } public static ConfigEntry<float> Wings2VFXCustomZ { get; private set; } public static ConfigEntry<string> Wings2VisualPrefab { get; private set; } public static ConfigEntry<float> Wings2TiltMaxPitch { get; private set; } public static ConfigEntry<float> Wings2TiltMaxRoll { get; private set; } public static ConfigEntry<float> Wings2TiltPitchSmoothTime { get; private set; } public static ConfigEntry<float> Wings2TiltRollSmoothTime { get; private set; } public static ConfigEntry<bool> Wings3Enabled { get; private set; } public static ConfigEntry<string> Wings3ItemName { get; private set; } public static ConfigEntry<bool> Wings3CheckRightHand { get; private set; } public static ConfigEntry<bool> Wings3CheckLeftHand { get; private set; } public static ConfigEntry<bool> Wings3CheckUtility { get; private set; } public static ConfigEntry<bool> Wings3UseFallReset { get; private set; } public static ConfigEntry<bool> Wings3Animation { get; private set; } public static ConfigEntry<float> Wings3MinActivationFallSpeed { get; private set; } public static ConfigEntry<float> Wings3ForwardSpeed { get; private set; } public static ConfigEntry<float> Wings3ForwardForce { get; private set; } public static ConfigEntry<float> Wings3DescentSpeed { get; private set; } public static ConfigEntry<float> Wings3AirTurnSpeed { get; private set; } public static ConfigEntry<float> Wings3LateralDamp { get; private set; } public static ConfigEntry<float> Wings3GroundProbeDistance { get; private set; } public static ConfigEntry<float> Wings3CushionDescentSpeed { get; private set; } public static ConfigEntry<float> Wings3CushionLerp { get; private set; } public static ConfigEntry<float> Wings3UpDownOffset { get; private set; } public static ConfigEntry<float> Wings3LeftRightOffset { get; private set; } public static ConfigEntry<float> Wings3ForwardBackOffset { get; private set; } public static ConfigEntry<float> Wings3RotationX { get; private set; } public static ConfigEntry<float> Wings3RotationY { get; private set; } public static ConfigEntry<float> Wings3RotationZ { get; private set; } public static ConfigEntry<float> Wings3Scale { get; private set; } public static ConfigEntry<bool> Wings3SFX { get; private set; } public static ConfigEntry<bool> Wings3AttachSFXToPlayer { get; private set; } public static ConfigEntry<string> Wings3StartSFX { get; private set; } public static ConfigEntry<string> Wings3LoopSFX { get; private set; } public static ConfigEntry<string> Wings3StopSFX { get; private set; } public static ConfigEntry<bool> Wings3VFX { get; private set; } public static ConfigEntry<bool> Wings3AttachEffectsToPlayer { get; private set; } public static ConfigEntry<string> Wings3StartVFX { get; private set; } public static ConfigEntry<string> Wings3LoopVFX { get; private set; } public static ConfigEntry<string> Wings3StopVFX { get; private set; } public static ConfigEntry<string> Wings3VFXPosition { get; private set; } public static ConfigEntry<float> Wings3VFXScale { get; private set; } public static ConfigEntry<float> Wings3VFXCustomX { get; private set; } public static ConfigEntry<float> Wings3VFXCustomY { get; private set; } public static ConfigEntry<float> Wings3VFXCustomZ { get; private set; } public static ConfigEntry<string> Wings3VisualPrefab { get; private set; } public static ConfigEntry<float> Wings3TiltMaxPitch { get; private set; } public static ConfigEntry<float> Wings3TiltMaxRoll { get; private set; } public static ConfigEntry<float> Wings3TiltPitchSmoothTime { get; private set; } public static ConfigEntry<float> Wings3TiltRollSmoothTime { get; private set; } public static ConfigEntry<bool> Wings4Enabled { get; private set; } public static ConfigEntry<string> Wings4ItemName { get; private set; } public static ConfigEntry<bool> Wings4CheckRightHand { get; private set; } public static ConfigEntry<bool> Wings4CheckLeftHand { get; private set; } public static ConfigEntry<bool> Wings4CheckUtility { get; private set; } public static ConfigEntry<bool> Wings4UseFallReset { get; private set; } public static ConfigEntry<bool> Wings4Animation { get; private set; } public static ConfigEntry<float> Wings4MinActivationFallSpeed { get; private set; } public static ConfigEntry<float> Wings4ForwardSpeed { get; private set; } public static ConfigEntry<float> Wings4ForwardForce { get; private set; } public static ConfigEntry<float> Wings4DescentSpeed { get; private set; } public static ConfigEntry<float> Wings4AirTurnSpeed { get; private set; } public static ConfigEntry<float> Wings4LateralDamp { get; private set; } public static ConfigEntry<float> Wings4GroundProbeDistance { get; private set; } public static ConfigEntry<float> Wings4CushionDescentSpeed { get; private set; } public static ConfigEntry<float> Wings4CushionLerp { get; private set; } public static ConfigEntry<float> Wings4UpDownOffset { get; private set; } public static ConfigEntry<float> Wings4LeftRightOffset { get; private set; } public static ConfigEntry<float> Wings4ForwardBackOffset { get; private set; } public static ConfigEntry<float> Wings4RotationX { get; private set; } public static ConfigEntry<float> Wings4RotationY { get; private set; } public static ConfigEntry<float> Wings4RotationZ { get; private set; } public static ConfigEntry<float> Wings4Scale { get; private set; } public static ConfigEntry<bool> Wings4SFX { get; private set; } public static ConfigEntry<bool> Wings4AttachSFXToPlayer { get; private set; } public static ConfigEntry<string> Wings4StartSFX { get; private set; } public static ConfigEntry<string> Wings4LoopSFX { get; private set; } public static ConfigEntry<string> Wings4StopSFX { get; private set; } public static ConfigEntry<bool> Wings4VFX { get; private set; } public static ConfigEntry<bool> Wings4AttachEffectsToPlayer { get; private set; } public static ConfigEntry<string> Wings4StartVFX { get; private set; } public static ConfigEntry<string> Wings4LoopVFX { get; private set; } public static ConfigEntry<string> Wings4StopVFX { get; private set; } public static ConfigEntry<string> Wings4VFXPosition { get; private set; } public static ConfigEntry<float> Wings4VFXScale { get; private set; } public static ConfigEntry<float> Wings4VFXCustomX { get; private set; } public static ConfigEntry<float> Wings4VFXCustomY { get; private set; } public static ConfigEntry<float> Wings4VFXCustomZ { get; private set; } public static ConfigEntry<string> Wings4VisualPrefab { get; private set; } public static ConfigEntry<float> Wings4TiltMaxPitch { get; private set; } public static ConfigEntry<float> Wings4TiltMaxRoll { get; private set; } public static ConfigEntry<float> Wings4TiltPitchSmoothTime { get; private set; } public static ConfigEntry<float> Wings4TiltRollSmoothTime { get; private set; } public static ConfigEntry<bool> Wings5Enabled { get; private set; } public static ConfigEntry<string> Wings5ItemName { get; private set; } public static ConfigEntry<bool> Wings5CheckRightHand { get; private set; } public static ConfigEntry<bool> Wings5CheckLeftHand { get; private set; } public static ConfigEntry<bool> Wings5CheckUtility { get; private set; } public static ConfigEntry<bool> Wings5UseFallReset { get; private set; } public static ConfigEntry<bool> Wings5Animation { get; private set; } public static ConfigEntry<float> Wings5MinActivationFallSpeed { get; private set; } public static ConfigEntry<float> Wings5ForwardSpeed { get; private set; } public static ConfigEntry<float> Wings5ForwardForce { get; private set; } public static ConfigEntry<float> Wings5DescentSpeed { get; private set; } public static ConfigEntry<float> Wings5AirTurnSpeed { get; private set; } public static ConfigEntry<float> Wings5LateralDamp { get; private set; } public static ConfigEntry<float> Wings5GroundProbeDistance { get; private set; } public static ConfigEntry<float> Wings5CushionDescentSpeed { get; private set; } public static ConfigEntry<float> Wings5CushionLerp { get; private set; } public static ConfigEntry<float> Wings5UpDownOffset { get; private set; } public static ConfigEntry<float> Wings5LeftRightOffset { get; private set; } public static ConfigEntry<float> Wings5ForwardBackOffset { get; private set; } public static ConfigEntry<float> Wings5RotationX { get; private set; } public static ConfigEntry<float> Wings5RotationY { get; private set; } public static ConfigEntry<float> Wings5RotationZ { get; private set; } public static ConfigEntry<float> Wings5Scale { get; private set; } public static ConfigEntry<bool> Wings5SFX { get; private set; } public static ConfigEntry<bool> Wings5AttachSFXToPlayer { get; private set; } public static ConfigEntry<string> Wings5StartSFX { get; private set; } public static ConfigEntry<string> Wings5LoopSFX { get; private set; } public static ConfigEntry<string> Wings5StopSFX { get; private set; } public static ConfigEntry<bool> Wings5VFX { get; private set; } public static ConfigEntry<bool> Wings5AttachEffectsToPlayer { get; private set; } public static ConfigEntry<string> Wings5StartVFX { get; private set; } public static ConfigEntry<string> Wings5LoopVFX { get; private set; } public static ConfigEntry<string> Wings5StopVFX { get; private set; } public static ConfigEntry<string> Wings5VFXPosition { get; private set; } public static ConfigEntry<float> Wings5VFXScale { get; private set; } public static ConfigEntry<float> Wings5VFXCustomX { get; private set; } public static ConfigEntry<float> Wings5VFXCustomY { get; private set; } public static ConfigEntry<float> Wings5VFXCustomZ { get; private set; } public static ConfigEntry<string> Wings5VisualPrefab { get; private set; } public static ConfigEntry<float> Wings5TiltMaxPitch { get; private set; } public static ConfigEntry<float> Wings5TiltMaxRoll { get; private set; } public static ConfigEntry<float> Wings5TiltPitchSmoothTime { get; private set; } public static ConfigEntry<float> Wings5TiltRollSmoothTime { get; private set; } public static void RegisterAllConfigs(ConfigFile config, string modGuid) { if ((Object)(object)IBelieveICanFlyPlugin.context != (Object)null) { ToggleMode = IBelieveICanFlyPlugin.context.config("02 - General Settings", "01 - Toggle Mode", value: true, "Whether to enable or disable if pressing Space will toggle gliding. When disabled, hold Space to glide."); RegisterWings1(); RegisterWings2(); RegisterWings3(); RegisterWings4(); RegisterWings5(); } } private static void RegisterWings1() { Wings1Enabled = IBelieveICanFlyPlugin.context.config("02.01 - Wings 1", "01 - Enabled", value: true, "Whether to enable or disable Wings 1. When enabled, this wings configuration will be active."); Wings1ItemName = IBelieveICanFlyPlugin.context.config("02.01 - Wings 1", "02 - Item Name", "Glider_BackPack_Ygg", "Item prefab name that triggers Wings 1. Use vanilla item names like 'SwordIron' or custom item names."); Wings1VisualPrefab = IBelieveICanFlyPlugin.context.config("02.01 - Wings 1", "03 - Visual Prefab Override", "DragonWings_Ygg", "Optional: Override the visual prefab shown when gliding. If empty, uses the trigger item's model. Use this to show wings while having a ring/amulet as the trigger item."); Wings1CheckRightHand = IBelieveICanFlyPlugin.context.config("02.02 - Wings 1", "01 - Check Right Hand", value: false, "Whether to enable or disable checking the right hand slot for Wings 1 item."); Wings1CheckLeftHand = IBelieveICanFlyPlugin.context.config("02.02 - Wings 1", "02 - Check Left Hand", value: false, "Whether to enable or disable checking the left hand slot for Wings 1 item."); Wings1CheckUtility = IBelieveICanFlyPlugin.context.config("02.02 - Wings 1", "03 - Check Utility Slot", value: true, "Whether to enable or disable checking the utility/belt slot for Wings 1 item."); Wings1UseFallReset = IBelieveICanFlyPlugin.context.config("02.02 - Wings 1", "04 - Prevent Fall Damage", value: true, "Whether to enable or disable fall damage when landing after gliding with Wings 1."); Wings1Animation = IBelieveICanFlyPlugin.context.config("02.02 - Wings 1", "05 - Use Animation", value: true, "Whether to enable or disable using animation while gliding with Wings 1."); Wings1MinActivationFallSpeed = IBelieveICanFlyPlugin.context.config("02.03 - Wings 1", "01 - Min Activation Fall Speed", -0.5f, "Prevent glide trigger if you barely left ground for Wings 1."); Wings1ForwardSpeed = IBelieveICanFlyPlugin.context.config("02.03 - Wings 1", "02 - Max Forward Speed", 10f, "Maximum forward speed while gliding with Wings 1."); Wings1ForwardForce = IBelieveICanFlyPlugin.context.config("02.03 - Wings 1", "03 - Forward Force", 5f, "Forward acceleration while gliding with Wings 1."); Wings1DescentSpeed = IBelieveICanFlyPlugin.context.config("02.03 - Wings 1", "04 - Max Descent Speed", -4f, "How fast you can fall while gliding with Wings 1 (more negative = faster fall)."); Wings1AirTurnSpeed = IBelieveICanFlyPlugin.context.config("02.03 - Wings 1", "05 - Air Turn Speed", 120f, "Yaw control while gliding with Wings 1 (deg/sec)."); Wings1LateralDamp = IBelieveICanFlyPlugin.context.config("02.03 - Wings 1", "06 - Lateral Damping", 0.15f, "Slight damping to stabilize lateral drift for Wings 1."); Wings1GroundProbeDistance = IBelieveICanFlyPlugin.context.config("02.03 - Wings 1", "07 - Ground Probe Distance", 2.5f, "Start cushioning this far from ground for Wings 1."); Wings1CushionDescentSpeed = IBelieveICanFlyPlugin.context.config("02.03 - Wings 1", "08 - Cushion Descent Speed", -0.7f, "Final descent cap near ground for Wings 1."); Wings1CushionLerp = IBelieveICanFlyPlugin.context.config("02.03 - Wings 1", "09 - Cushion Lerp", 0.6f, "How quickly we clamp toward the cushion speed for Wings 1."); Wings1TiltMaxPitch = IBelieveICanFlyPlugin.context.config("02.04 - Wings 1", "01 - Max Pitch", 25f, "Maximum pitch angle (nose up/down) in degrees for Wings 1."); Wings1TiltMaxRoll = IBelieveICanFlyPlugin.context.config("02.04 - Wings 1", "02 - Max Roll", 35f, "Maximum roll angle (banking) in degrees for Wings 1."); Wings1TiltPitchSmoothTime = IBelieveICanFlyPlugin.context.config("02.04 - Wings 1", "03 - Pitch Smooth Time", 0.15f, "How quickly pitch changes (lower = faster response) for Wings 1."); Wings1TiltRollSmoothTime = IBelieveICanFlyPlugin.context.config("02.04 - Wings 1", "04 - Roll Smooth Time", 0.1f, "How quickly roll/banking changes (lower = faster response) for Wings 1."); Wings1UpDownOffset = IBelieveICanFlyPlugin.context.config("02.05 - Wings 1", "01 - Up/Down Offset", 0.3f, "Adjust Wings 1 vertical position on the player's back. Higher values move it up."); Wings1LeftRightOffset = IBelieveICanFlyPlugin.context.config("02.05 - Wings 1", "02 - Left/Right Offset", 0f, "Adjust Wings 1 horizontal position on the player's back. Positive values move it to the right."); Wings1ForwardBackOffset = IBelieveICanFlyPlugin.context.config("02.05 - Wings 1", "03 - Forward/Back Offset", 0.7f, "Adjust Wings 1 position front-to-back on the player. Negative values move it backward."); Wings1RotationX = IBelieveICanFlyPlugin.context.config("02.06 - Wings 1", "01 - X Rotation", 10f, "Adjust Wings 1 pitch rotation in degrees. Controls tilt forward/backward."); Wings1RotationY = IBelieveICanFlyPlugin.context.config("02.06 - Wings 1", "02 - Y Rotation", 160f, "Adjust Wings 1 yaw rotation in degrees. Controls left/right facing."); Wings1RotationZ = IBelieveICanFlyPlugin.context.config("02.06 - Wings 1", "03 - Z Rotation", 0f, "Adjust Wings 1 roll rotation in degrees. Controls tilt to sides."); Wings1Scale = IBelieveICanFlyPlugin.context.config("02.06 - Wings 1", "04 - Scale", 0.3f, "Adjust the overall size of Wings 1. 1.0 is normal size."); Wings1SFX = IBelieveICanFlyPlugin.context.config("02.07 - Wings 1", "01 - SFX", value: true, "Whether to enable or disable SFX when gliding with Wings 1."); Wings1AttachSFXToPlayer = IBelieveICanFlyPlugin.context.config("02.07 - Wings 1", "02 - Attach SFX To Player", value: true, "Whether to enable or disable SFX for Wings 1 will be attached to the player and follow their movement."); Wings1StartSFX = IBelieveICanFlyPlugin.context.config("02.07 - Wings 1", "03 - Start SFX", "sfx_flap_glider_Ygg", "Sound effect to play when starting to glide with Wings 1. Use vanilla sound effect names."); Wings1LoopSFX = IBelieveICanFlyPlugin.context.config("02.07 - Wings 1", "04 - Loop SFX", "", "Sound effect to play continuously while gliding with Wings 1. Use vanilla sound effect names."); Wings1StopSFX = IBelieveICanFlyPlugin.context.config("02.07 - Wings 1", "05 - Stop SFX", "sfx_flap_glider_Ygg", "Sound effect to play when stopping gliding with Wings 1. Use vanilla sound effect names."); Wings1VFX = IBelieveICanFlyPlugin.context.config("02.08 - Wings 1", "01 - VFX", value: true, "Whether to enable or disable VFX when gliding with Wings 1."); Wings1AttachEffectsToPlayer = IBelieveICanFlyPlugin.context.config("02.08 - Wings 1", "02 - Attach VFX To Player", value: true, "Whether to enable or disable VFX for Wings 1 will be attached to the player and follow their movement."); Wings1StartVFX = IBelieveICanFlyPlugin.context.config("02.08 - Wings 1", "03 - Start VFX", "", "Visual effect to play when starting to glide with Wings 1. Use vanilla VFX names."); Wings1LoopVFX = IBelieveICanFlyPlugin.context.config("02.08 - Wings 1", "04 - Loop VFX", "", "Visual effect to play continuously while gliding with Wings 1. Use vanilla VFX names."); Wings1StopVFX = IBelieveICanFlyPlugin.context.config("02.08 - Wings 1", "05 - Stop VFX", "", "Visual effect to play when stopping gliding with Wings 1. Use vanilla VFX names."); Wings1VFXPosition = IBelieveICanFlyPlugin.context.config("02.08 - Wings 1", "06 - VFX Position", "Root", "Position for VFX for Wings 1: 'Root' (at player's feet), 'Middle' (at player's center), or 'Custom' (use custom coordinates)."); Wings1VFXScale = IBelieveICanFlyPlugin.context.config("02.08 - Wings 1", "07 - VFX Scale", 1f, "Scale factor for VFX for Wings 1. 1.0 is normal size."); Wings1VFXCustomX = IBelieveICanFlyPlugin.context.config("02.08 - Wings 1", "08 - Custom X Offset", 0f, "X offset for custom VFX position for Wings 1 (only used when VFX Position is set to 'Custom')."); Wings1VFXCustomY = IBelieveICanFlyPlugin.context.config("02.08 - Wings 1", "09 - Custom Y Offset", 1f, "Y offset for custom VFX position for Wings 1 (only used when VFX Position is set to 'Custom')."); Wings1VFXCustomZ = IBelieveICanFlyPlugin.context.config("02.08 - Wings 1", "10 - Custom Z Offset", 0f, "Z offset for custom VFX position for Wings 1 (only used when VFX Position is set to 'Custom')."); } private static void RegisterWings2() { Wings2Enabled = IBelieveICanFlyPlugin.context.config("03.01 - Wings 2", "01 - Enabled", value: true, "Whether to enable or disable Wings 2. When enabled, this wings configuration will be active."); Wings2ItemName = IBelieveICanFlyPlugin.context.config("03.01 - Wings 2", "02 - Item Name", "Glider_BackPack_DragonModer_Ygg", "Item prefab name that triggers Wings 2. Use vanilla item names like 'SwordBronze' or custom item names."); Wings2VisualPrefab = IBelieveICanFlyPlugin.context.config("03.01 - Wings 2", "03 - Visual Prefab Override", "DragonWings_Ygg1", "Optional: Override the visual prefab shown when gliding. If empty, uses the trigger item's model. Use this to show wings while having a ring/amulet as the trigger item."); Wings2CheckRightHand = IBelieveICanFlyPlugin.context.config("03.02 - Wings 2", "01 - Check Right Hand", value: false, "Whether to enable or disable checking the right hand slot for Wings 2 item."); Wings2CheckLeftHand = IBelieveICanFlyPlugin.context.config("03.02 - Wings 2", "02 - Check Left Hand", value: false, "Whether to enable or disable checking the left hand slot for Wings 2 item."); Wings2CheckUtility = IBelieveICanFlyPlugin.context.config("03.02 - Wings 2", "03 - Check Utility Slot", value: true, "Whether to enable or disable checking the utility/belt slot for Wings 2 item."); Wings2UseFallReset = IBelieveICanFlyPlugin.context.config("03.02 - Wings 2", "04 - Prevent Fall Damage", value: true, "Whether to enable or disable fall damage when landing after gliding with Wings 2."); Wings2Animation = IBelieveICanFlyPlugin.context.config("03.02 - Wings 2", "05 - Use Animation", value: true, "Whether to enable or disable using animation while gliding with Wings 2."); Wings2MinActivationFallSpeed = IBelieveICanFlyPlugin.context.config("03.03 - Wings 2", "01 - Min Activation Fall Speed", -0.5f, "Prevent glide trigger if you barely left ground for Wings 2."); Wings2ForwardSpeed = IBelieveICanFlyPlugin.context.config("03.03 - Wings 2", "02 - Max Forward Speed", 12f, "Maximum forward speed while gliding with Wings 2."); Wings2ForwardForce = IBelieveICanFlyPlugin.context.config("03.03 - Wings 2", "03 - Forward Force", 8f, "Forward acceleration while gliding with Wings 2."); Wings2DescentSpeed = IBelieveICanFlyPlugin.context.config("03.03 - Wings 2", "04 - Max Descent Speed", -3.5f, "How fast you can fall while gliding with Wings 2 (more negative = faster fall)."); Wings2AirTurnSpeed = IBelieveICanFlyPlugin.context.config("03.03 - Wings 2", "05 - Air Turn Speed", 100f, "Yaw control while gliding with Wings 2 (deg/sec)."); Wings2LateralDamp = IBelieveICanFlyPlugin.context.config("03.03 - Wings 2", "06 - Lateral Damping", 0.15f, "Slight damping to stabilize lateral drift for Wings 2."); Wings2GroundProbeDistance = IBelieveICanFlyPlugin.context.config("03.03 - Wings 2", "07 - Ground Probe Distance", 2.5f, "Start cushioning this far from ground for Wings 2."); Wings2CushionDescentSpeed = IBelieveICanFlyPlugin.context.config("03.03 - Wings 2", "08 - Cushion Descent Speed", -0.7f, "Final descent cap near ground for Wings 2."); Wings2CushionLerp = IBelieveICanFlyPlugin.context.config("03.03 - Wings 2", "09 - Cushion Lerp", 0.6f, "How quickly we clamp toward the cushion speed for Wings 2."); Wings2TiltMaxPitch = IBelieveICanFlyPlugin.context.config("03.04 - Wings 2", "01 - Max Pitch", 25f, "Maximum pitch angle (nose up/down) in degrees for Wings 2."); Wings2TiltMaxRoll = IBelieveICanFlyPlugin.context.config("03.04 - Wings 2", "02 - Max Roll", 35f, "Maximum roll angle (banking) in degrees for Wings 2."); Wings2TiltPitchSmoothTime = IBelieveICanFlyPlugin.context.config("03.04 - Wings 2", "03 - Pitch Smooth Time", 0.15f, "How quickly pitch changes (lower = faster response) for Wings 2."); Wings2TiltRollSmoothTime = IBelieveICanFlyPlugin.context.config("03.04 - Wings 2", "04 - Roll Smooth Time", 0.1f, "How quickly roll/banking changes (lower = faster response) for Wings 2."); Wings2UpDownOffset = IBelieveICanFlyPlugin.context.config("03.05 - Wings 2", "01 - Up/Down Offset", -0.18f, "Adjust Wings 2 vertical position on the player's back. Higher values move it up."); Wings2LeftRightOffset = IBelieveICanFlyPlugin.context.config("03.05 - Wings 2", "02 - Left/Right Offset", 0f, "Adjust Wings 2 horizontal position on the player's back. Positive values move it to the right."); Wings2ForwardBackOffset = IBelieveICanFlyPlugin.context.config("03.05 - Wings 2", "03 - Forward/Back Offset", -0.15f, "Adjust Wings 2 position front-to-back on the player. Negative values move it backward."); Wings2RotationX = IBelieveICanFlyPlugin.context.config("03.06 - Wings 2", "01 - X Rotation", 0f, "Adjust Wings 2 pitch rotation in degrees. Controls tilt forward/backward."); Wings2RotationY = IBelieveICanFlyPlugin.context.config("03.06 - Wings 2", "02 - Y Rotation", 0f, "Adjust Wings 2 yaw rotation in degrees. Controls left/right facing."); Wings2RotationZ = IBelieveICanFlyPlugin.context.config("03.06 - Wings 2", "03 - Z Rotation", 0f, "Adjust Wings 2 roll rotation in degrees. Controls tilt to sides."); Wings2Scale = IBelieveICanFlyPlugin.context.config("03.06 - Wings 2", "04 - Scale", 0.3f, "Adjust the overall size of Wings 2. 1.0 is normal size."); Wings2SFX = IBelieveICanFlyPlugin.context.config("03.07 - Wings 2", "01 - SFX", value: true, "Whether to enable or disable SFX when gliding with Wings 2."); Wings2AttachSFXToPlayer = IBelieveICanFlyPlugin.context.config("03.07 - Wings 2", "02 - Attach SFX To Player", value: true, "Whether to enable or disable SFX for Wings 2 will be attached to the player and follow their movement."); Wings2StartSFX = IBelieveICanFlyPlugin.context.config("03.07 - Wings 2", "03 - Start SFX", "sfx_flap_glider_Ygg", "Sound effect to play when starting to glide with Wings 2. Use vanilla sound effect names."); Wings2LoopSFX = IBelieveICanFlyPlugin.context.config("03.07 - Wings 2", "04 - Loop SFX", "", "Sound effect to play continuously while gliding with Wings 2. Use vanilla sound effect names."); Wings2StopSFX = IBelieveICanFlyPlugin.context.config("03.07 - Wings 2", "05 - Stop SFX", "sfx_flap_glider_Ygg", "Sound effect to play when stopping gliding with Wings 2. Use vanilla sound effect names."); Wings2VFX = IBelieveICanFlyPlugin.context.config("03.08 - Wings 2", "01 - VFX", value: true, "Whether to enable or disable VFX when gliding with Wings 2."); Wings2AttachEffectsToPlayer = IBelieveICanFlyPlugin.context.config("03.08 - Wings 2", "02 - Attach VFX To Player", value: true, "Whether to enable or disable VFX for Wings 2 will be attached to the player and follow their movement."); Wings2StartVFX = IBelieveICanFlyPlugin.context.config("03.08 - Wings 2", "03 - Start VFX", "", "Visual effect to play when starting to glide with Wings 2. Use vanilla VFX names."); Wings2LoopVFX = IBelieveICanFlyPlugin.context.config("03.08 - Wings 2", "04 - Loop VFX", "", "Visual effect to play continuously while gliding with Wings 2. Use vanilla VFX names."); Wings2StopVFX = IBelieveICanFlyPlugin.context.config("03.08 - Wings 2", "05 - Stop VFX", "", "Visual effect to play when stopping gliding with Wings 2. Use vanilla VFX names."); Wings2VFXPosition = IBelieveICanFlyPlugin.context.config("03.08 - Wings 2", "06 - VFX Position", "Root", "Position for VFX for Wings 2: 'Root' (at player's feet), 'Middle' (at player's center), or 'Custom' (use custom coordinates)."); Wings2VFXScale = IBelieveICanFlyPlugin.context.config("03.08 - Wings 2", "07 - VFX Scale", 1f, "Scale factor for VFX for Wings 2. 1.0 is normal size."); Wings2VFXCustomX = IBelieveICanFlyPlugin.context.config("03.08 - Wings 2", "08 - Custom X Offset", 0f, "X offset for custom VFX position for Wings 2 (only used when VFX Position is set to 'Custom')."); Wings2VFXCustomY = IBelieveICanFlyPlugin.context.config("03.08 - Wings 2", "09 - Custom Y Offset", 1f, "Y offset for custom VFX position for Wings 2 (only used when VFX Position is set to 'Custom')."); Wings2VFXCustomZ = IBelieveICanFlyPlugin.context.config("03.08 - Wings 2", "10 - Custom Z Offset", 0f, "Z offset for custom VFX position for Wings 2 (only used when VFX Position is set to 'Custom')."); } private static void RegisterWings3() { Wings3Enabled = IBelieveICanFlyPlugin.context.config("04.01 - Wings 3", "01 - Enabled", value: true, "Whether to enable or disable Wings 3. When enabled, this wings configuration will be active."); Wings3ItemName = IBelieveICanFlyPlugin.context.config("04.01 - Wings 3", "02 - Item Name", "Glider_BackPack_BlackDragon_Ygg", "Item prefab name that triggers Wings 3. Use vanilla item names like 'SwordBlackmetal' or custom item names."); Wings3VisualPrefab = IBelieveICanFlyPlugin.context.config("04.01 - Wings 3", "03 - Visual Prefab Override", "DragonWings_Ygg2", "Optional: Override the visual prefab shown when gliding. If empty, uses the trigger item's model. Use this to show wings while having a ring/amulet as the trigger item."); Wings3CheckRightHand = IBelieveICanFlyPlugin.context.config("04.02 - Wings 3", "01 - Check Right Hand", value: false, "Whether to enable or disable checking the right hand slot for Wings 3 item."); Wings3CheckLeftHand = IBelieveICanFlyPlugin.context.config("04.02 - Wings 3", "02 - Check Left Hand", value: false, "Whether to enable or disable checking the left hand slot for Wings 3 item."); Wings3CheckUtility = IBelieveICanFlyPlugin.context.config("04.02 - Wings 3", "03 - Check Utility Slot", value: true, "Whether to enable or disable checking the utility/belt slot for Wings 3 item."); Wings3UseFallReset = IBelieveICanFlyPlugin.context.config("04.02 - Wings 3", "04 - Prevent Fall Damage", value: true, "Whether to enable or disable fall damage when landing after gliding with Wings 3."); Wings3Animation = IBelieveICanFlyPlugin.context.config("04.02 - Wings 3", "05 - Use Animation", value: true, "Whether to enable or disable using animation while gliding with Wings 3."); Wings3MinActivationFallSpeed = IBelieveICanFlyPlugin.context.config("04.03 - Wings 3", "01 - Min Activation Fall Speed", -0.5f, "Prevent glide trigger if you barely left ground for Wings 3."); Wings3ForwardSpeed = IBelieveICanFlyPlugin.context.config("04.03 - Wings 3", "02 - Max Forward Speed", 20f, "Maximum forward speed while gliding with Wings 3."); Wings3ForwardForce = IBelieveICanFlyPlugin.context.config("04.03 - Wings 3", "03 - Forward Force", 12f, "Forward acceleration while gliding with Wings 3."); Wings3DescentSpeed = IBelieveICanFlyPlugin.context.config("04.03 - Wings 3", "04 - Max Descent Speed", -2.5f, "How fast you can fall while gliding with Wings 3 (more negative = faster fall)."); Wings3AirTurnSpeed = IBelieveICanFlyPlugin.context.config("04.03 - Wings 3", "05 - Air Turn Speed", 100f, "Yaw control while gliding with Wings 3 (deg/sec)."); Wings3LateralDamp = IBelieveICanFlyPlugin.context.config("04.03 - Wings 3", "06 - Lateral Damping", 0.15f, "Slight damping to stabilize lateral drift for Wings 3."); Wings3GroundProbeDistance = IBelieveICanFlyPlugin.context.config("04.03 - Wings 3", "07 - Ground Probe Distance", 2.5f, "Start cushioning this far from ground for Wings 3."); Wings3CushionDescentSpeed = IBelieveICanFlyPlugin.context.config("04.03 - Wings 3", "08 - Cushion Descent Speed", -0.7f, "Final descent cap near ground for Wings 3."); Wings3CushionLerp = IBelieveICanFlyPlugin.context.config("04.03 - Wings 3", "09 - Cushion Lerp", 0.6f, "How quickly we clamp toward the cushion speed for Wings 3."); Wings3TiltMaxPitch = IBelieveICanFlyPlugin.context.config("04.04 - Wings 3", "01 - Max Pitch", 25f, "Maximum pitch angle (nose up/down) in degrees for Wings 3."); Wings3TiltMaxRoll = IBelieveICanFlyPlugin.context.config("04.04 - Wings 3", "02 - Max Roll", 35f, "Maximum roll angle (banking) in degrees for Wings 3."); Wings3TiltPitchSmoothTime = IBelieveICanFlyPlugin.context.config("04.04 - Wings 3", "03 - Pitch Smooth Time", 0.15f, "How quickly pitch changes (lower = faster response) for Wings 3."); Wings3TiltRollSmoothTime = IBelieveICanFlyPlugin.context.config("04.04 - Wings 3", "04 - Roll Smooth Time", 0.1f, "How quickly roll/banking changes (lower = faster response) for Wings 3."); Wings3UpDownOffset = IBelieveICanFlyPlugin.context.config("04.05 - Wings 3", "01 - Up/Down Offset", -0.1f, "Adjust Wings 3 vertical position on the player's back. Higher values move it up."); Wings3LeftRightOffset = IBelieveICanFlyPlugin.context.config("04.05 - Wings 3", "02 - Left/Right Offset", 0f, "Adjust Wings 3 horizontal position on the player's back. Positive values move it to the right."); Wings3ForwardBackOffset = IBelieveICanFlyPlugin.context.config("04.05 - Wings 3", "03 - Forward/Back Offset", -0.2f, "Adjust Wings 3 position front-to-back on the player. Negative values move it backward."); Wings3RotationX = IBelieveICanFlyPlugin.context.config("04.06 - Wings 3", "01 - X Rotation", 0f, "Adjust Wings 3 pitch rotation in degrees. Controls tilt forward/backward."); Wings3RotationY = IBelieveICanFlyPlugin.context.config("04.06 - Wings 3", "02 - Y Rotation", 0f, "Adjust Wings 3 yaw rotation in degrees. Controls left/right facing."); Wings3RotationZ = IBelieveICanFlyPlugin.context.config("04.06 - Wings 3", "03 - Z Rotation", 0f, "Adjust Wings 3 roll rotation in degrees. Controls tilt to sides."); Wings3Scale = IBelieveICanFlyPlugin.context.config("04.06 - Wings 3", "04 - Scale", 0.3f, "Adjust the overall size of Wings 3. 1.0 is normal size."); Wings3SFX = IBelieveICanFlyPlugin.context.config("04.07 - Wings 3", "01 - SFX", value: true, "Whether to enable or disable SFX when gliding with Wings 3."); Wings3AttachSFXToPlayer = IBelieveICanFlyPlugin.context.config("04.07 - Wings 3", "02 - Attach SFX To Player", value: true, "Whether to enable or disable SFX for Wings 3 will be attached to the player and follow their movement."); Wings3StartSFX = IBelieveICanFlyPlugin.context.config("04.07 - Wings 3", "03 - Start SFX", "sfx_flap_glider_Ygg", "Sound effect to play when starting to glide with Wings 3. Use vanilla sound effect names."); Wings3LoopSFX = IBelieveICanFlyPlugin.context.config("04.07 - Wings 3", "04 - Loop SFX", "sfx_flap_glider_Ygg", "Sound effect to play continuously while gliding with Wings 3. Use vanilla sound effect names."); Wings3StopSFX = IBelieveICanFlyPlugin.context.config("04.07 - Wings 3", "05 - Stop SFX", "sfx_flap_glider_Ygg", "Sound effect to play when stopping gliding with Wings 3. Use vanilla sound effect names."); Wings3VFX = IBelieveICanFlyPlugin.context.config("04.08 - Wings 3", "01 - VFX", value: true, "Whether to enable or disable VFX when gliding with Wings 3."); Wings3AttachEffectsToPlayer = IBelieveICanFlyPlugin.context.config("04.08 - Wings 3", "02 - Attach VFX To Player", value: true, "Whether to enable or disable VFX for Wings 3 will be attached to the player and follow their movement."); Wings3StartVFX = IBelieveICanFlyPlugin.context.config("04.08 - Wings 3", "03 - Start VFX", "", "Visual effect to play when starting to glide with Wings 3. Use vanilla VFX names."); Wings3LoopVFX = IBelieveICanFlyPlugin.context.config("04.08 - Wings 3", "04 - Loop VFX", "", "Visual effect to play continuously while gliding with Wings 3. Use vanilla VFX names."); Wings3StopVFX = IBelieveICanFlyPlugin.context.config("04.08 - Wings 3", "05 - Stop VFX", "", "Visual effect to play when stopping gliding with Wings 3. Use vanilla VFX names."); Wings3VFXPosition = IBelieveICanFlyPlugin.context.config("04.08 - Wings 3", "06 - VFX Position", "Root", "Position for VFX for Wings 3: 'Root' (at player's feet), 'Middle' (at player's center), or 'Custom' (use custom coordinates)."); Wings3VFXScale = IBelieveICanFlyPlugin.context.config("04.08 - Wings 3", "07 - VFX Scale", 1f, "Scale factor for VFX for Wings 3. 1.0 is normal size."); Wings3VFXCustomX = IBelieveICanFlyPlugin.context.config("04.08 - Wings 3", "08 - Custom X Offset", 0f, "X offset for custom VFX position for Wings 3 (only used when VFX Position is set to 'Custom')."); Wings3VFXCustomY = IBelieveICanFlyPlugin.context.config("04.08 - Wings 3", "09 - Custom Y Offset", 1f, "Y offset for custom VFX position for Wings 3 (only used when VFX Position is set to 'Custom')."); Wings3VFXCustomZ = IBelieveICanFlyPlugin.context.config("04.08 - Wings 3", "10 - Custom Z Offset", 0f, "Z offset for custom VFX position for Wings 3 (only used when VFX Position is set to 'Custom')."); } private static void RegisterWings4() { Wings4Enabled = IBelieveICanFlyPlugin.context.config("05.01 - Wings 4", "01 - Enabled", value: true, "Whether to enable or disable Wings 4. When enabled, this wings configuration will be active."); Wings4ItemName = IBelieveICanFlyPlugin.context.config("05.01 - Wings 4", "02 - Item Name", "Glider_Gjall_BackPack_Ygg", "Item prefab name that triggers Wings 4. Use vanilla item names like 'SwordSilver' or custom item names."); Wings4VisualPrefab = IBelieveICanFlyPlugin.context.config("05.01 - Wings 4", "03 - Visual Prefab Override", "DragonWings_Ygg3", "Optional: Override the visual prefab shown when gliding. If empty, uses the trigger item's model. Use this to show wings while having a ring/amulet as the trigger item."); Wings4CheckRightHand = IBelieveICanFlyPlugin.context.config("05.02 - Wings 4", "01 - Check Right Hand", value: false, "Whether to enable or disable checking the right hand slot for Wings 4 item."); Wings4CheckLeftHand = IBelieveICanFlyPlugin.context.config("05.02 - Wings 4", "02 - Check Left Hand", value: false, "Whether to enable or disable checking the left hand slot for Wings 4 item."); Wings4CheckUtility = IBelieveICanFlyPlugin.context.config("05.02 - Wings 4", "03 - Check Utility Slot", value: true, "Whether to enable or disable checking the utility/belt slot for Wings 4 item."); Wings4UseFallReset = IBelieveICanFlyPlugin.context.config("05.02 - Wings 4", "04 - Prevent Fall Damage", value: true, "Whether to enable or disable fall damage when landing after gliding with Wings 4."); Wings4Animation = IBelieveICanFlyPlugin.context.config("05.02 - Wings 4", "05 - Use Animation", value: true, "Whether to enable or disable using animation while gliding with Wings 4."); Wings4MinActivationFallSpeed = IBelieveICanFlyPlugin.context.config("05.03 - Wings 4", "01 - Min Activation Fall Speed", -0.5f, "Prevent glide trigger if you barely left ground for Wings 4."); Wings4ForwardSpeed = IBelieveICanFlyPlugin.context.config("05.03 - Wings 4", "02 - Max Forward Speed", 6f, "Maximum forward speed while gliding with Wings 4."); Wings4ForwardForce = IBelieveICanFlyPlugin.context.config("05.03 - Wings 4", "03 - Forward Force", 11f, "Forward acceleration while gliding with Wings 4."); Wings4DescentSpeed = IBelieveICanFlyPlugin.context.config("05.03 - Wings 4", "04 - Max Descent Speed", -1f, "How fast you can fall while gliding with Wings 4 (more negative = faster fall)."); Wings4AirTurnSpeed = IBelieveICanFlyPlugin.context.config("05.03 - Wings 4", "05 - Air Turn Speed", 130f, "Yaw control while gliding with Wings 4 (deg/sec)."); Wings4LateralDamp = IBelieveICanFlyPlugin.context.config("05.03 - Wings 4", "06 - Lateral Damping", 0.15f, "Slight damping to stabilize lateral drift for Wings 4."); Wings4GroundProbeDistance = IBelieveICanFlyPlugin.context.config("05.03 - Wings 4", "07 - Ground Probe Distance", 2.5f, "Start cushioning this far from ground for Wings 4."); Wings4CushionDescentSpeed = IBelieveICanFlyPlugin.context.config("05.03 - Wings 4", "08 - Cushion Descent Speed", -0.7f, "Final descent cap near ground for Wings 4."); Wings4CushionLerp = IBelieveICanFlyPlugin.context.config("05.03 - Wings 4", "09 - Cushion Lerp", 0.6f, "How quickly we clamp toward the cushion speed for Wings 4."); Wings4TiltMaxPitch = IBelieveICanFlyPlugin.context.config("05.04 - Wings 4", "01 - Max Pitch", 25f, "Maximum pitch angle (nose up/down) in degrees for Wings 4."); Wings4TiltMaxRoll = IBelieveICanFlyPlugin.context.config("05.04 - Wings 4", "02 - Max Roll", 35f, "Maximum roll angle (banking) in degrees for Wings 4."); Wings4TiltPitchSmoothTime = IBelieveICanFlyPlugin.context.config("05.04 - Wings 4", "03 - Pitch Smooth Time", 0.15f, "How quickly pitch changes (lower = faster response) for Wings 4."); Wings4TiltRollSmoothTime = IBelieveICanFlyPlugin.context.config("05.04 - Wings 4", "04 - Roll Smooth Time", 0.1f, "How quickly roll/banking changes (lower = faster response) for Wings 4."); Wings4UpDownOffset = IBelieveICanFlyPlugin.context.config("05.05 - Wings 4", "01 - Up/Down Offset", -2f, "Adjust Wings 4 vertical position on the player's back. Higher values move it up."); Wings4LeftRightOffset = IBelieveICanFlyPlugin.context.config("05.05 - Wings 4", "02 - Left/Right Offset", 0f, "Adjust Wings 4 horizontal position on the player's back. Positive values move it to the right."); Wings4ForwardBackOffset = IBelieveICanFlyPlugin.context.config("05.05 - Wings 4", "03 - Forward/Back Offset", -5f, "Adjust Wings 4 position front-to-back on the player. Negative values move it backward."); Wings4RotationX = IBelieveICanFlyPlugin.context.config("05.06 - Wings 4", "01 - X Rotation", 70f, "Adjust Wings 4 pitch rotation in degrees. Controls tilt forward/backward."); Wings4RotationY = IBelieveICanFlyPlugin.context.config("05.06 - Wings 4", "02 - Y Rotation", 0f, "Adjust Wings 4 yaw rotation in degrees. Controls left/right facing."); Wings4RotationZ = IBelieveICanFlyPlugin.context.config("05.06 - Wings 4", "03 - Z Rotation", 0f, "Adjust Wings 4 roll rotation in degrees. Controls tilt to sides."); Wings4Scale = IBelieveICanFlyPlugin.context.config("05.06 - Wings 4", "04 - Scale", 0.4f, "Adjust the overall size of Wings 4. 1.0 is normal size."); Wings4SFX = IBelieveICanFlyPlugin.context.config("05.07 - Wings 4", "01 - SFX", value: true, "Whether to enable or disable SFX when gliding with Wings 4."); Wings4AttachSFXToPlayer = IBelieveICanFlyPlugin.context.config("05.07 - Wings 4", "02 - Attach SFX To Player", value: true, "Whether to enable or disable SFX for Wings 4 will be attached to the player and follow their movement."); Wings4StartSFX = IBelieveICanFlyPlugin.context.config("05.07 - Wings 4", "03 - Start SFX", "sfx_flap_glider_Ygg", "Sound effect to play when starting to glide with Wings 4. Use vanilla sound effect names."); Wings4LoopSFX = IBelieveICanFlyPlugin.context.config("05.07 - Wings 4", "04 - Loop SFX", "", "Sound effect to play continuously while gliding with Wings 4. Use vanilla sound effect names."); Wings4StopSFX = IBelieveICanFlyPlugin.context.config("05.07 - Wings 4", "05 - Stop SFX", "sfx_flap_glider_Ygg", "Sound effect to play when stopping gliding with Wings 4. Use vanilla sound effect names."); Wings4VFX = IBelieveICanFlyPlugin.context.config("05.08 - Wings 4", "01 - VFX", value: true, "Whether to enable or disable VFX when gliding with Wings 4."); Wings4AttachEffectsToPlayer = IBelieveICanFlyPlugin.context.config("05.08 - Wings 4", "02 - Attach VFX To Player", value: true, "Whether to enable or disable VFX for Wings 4 will be attached to the player and follow their movement."); Wings4StartVFX = IBelieveICanFlyPlugin.context.config("05.08 - Wings 4", "03 - Start VFX", "", "Visual effect to play when starting to glide with Wings 4. Use vanilla VFX names."); Wings4LoopVFX = IBelieveICanFlyPlugin.context.config("05.08 - Wings 4", "04 - Loop VFX", "", "Visual effect to play continuously while gliding with Wings 4. Use vanilla VFX names."); Wings4StopVFX = IBelieveICanFlyPlugin.context.config("05.08 - Wings 4", "05 - Stop VFX", "", "Visual effect to play when stopping gliding with Wings 4. Use vanilla VFX names."); Wings4VFXPosition = IBelieveICanFlyPlugin.context.config("05.08 - Wings 4", "06 - VFX Position", "Root", "Position for VFX for Wings 4: 'Root' (at player's feet), 'Middle' (at player's center), or 'Custom' (use custom coordinates)."); Wings4VFXScale = IBelieveICanFlyPlugin.context.config("05.08 - Wings 4", "07 - VFX Scale", 1f, "Scale factor for VFX for Wings 4. 1.0 is normal size."); Wings4VFXCustomX = IBelieveICanFlyPlugin.context.config("05.08 - Wings 4", "08 - Custom X Offset", 0f, "X offset for custom VFX position for Wings 4 (only used when VFX Position is set to 'Custom')."); Wings4VFXCustomY = IBelieveICanFlyPlugin.context.config("05.08 - Wings 4", "09 - Custom Y Offset", 1f, "Y offset for custom VFX position for Wings 4 (only used when VFX Position is set to 'Custom')."); Wings4VFXCustomZ = IBelieveICanFlyPlugin.context.config("05.08 - Wings 4", "10 - Custom Z Offset", 0f, "Z offset for custom VFX position for Wings 4 (only used when VFX Position is set to 'Custom')."); } private static void RegisterWings5() { Wings5Enabled = IBelieveICanFlyPlugin.context.config("06.01 - Wings 5", "01 - Enabled", value: true, "Whether to enable or disable Wings 5. When enabled, this wings configuration will be active."); Wings5ItemName = IBelieveICanFlyPlugin.context.config("06.01 - Wings 5", "02 - Item Name", "Glider_Gjall_Fader_BackPack_Ygg", "Item prefab name that triggers Wings 5. Use vanilla item names like 'SwordFlametal' or custom item names."); Wings5VisualPrefab = IBelieveICanFlyPlugin.context.config("06.01 - Wings 5", "03 - Visual Prefab Override", "DragonWings_Ygg4", "Optional: Override the visual prefab shown when gliding. If empty, uses the trigger item's model. Use this to show wings while having a ring/amulet as the trigger item."); Wings5CheckRightHand = IBelieveICanFlyPlugin.context.config("06.02 - Wings 5", "01 - Check Right Hand", value: false, "Whether to enable or disable checking the right hand slot for Wings 5 item."); Wings5CheckLeftHand = IBelieveICanFlyPlugin.context.config("06.02 - Wings 5", "02 - Check Left Hand", value: false, "Whether to enable or disable checking the left hand slot for Wings 5 item."); Wings5CheckUtility = IBelieveICanFlyPlugin.context.config("06.02 - Wings 5", "03 - Check Utility Slot", value: true, "Whether to enable or disable checking the utility/belt slot for Wings 5 item."); Wings5UseFallReset = IBelieveICanFlyPlugin.context.config("06.02 - Wings 5", "04 - Prevent Fall Damage", value: true, "Whether to enable or disable fall damage when landing after gliding with Wings 5."); Wings5Animation = IBelieveICanFlyPlugin.context.config("06.02 - Wings 5", "05 - Use Animation", value: true, "Whether to enable or disable using animation while gliding with Wings 5."); Wings5MinActivationFallSpeed = IBelieveICanFlyPlugin.context.config("06.03 - Wings 5", "01 - Min Activation Fall Speed", -0.5f, "Prevent glide trigger if you barely left ground for Wings 5."); Wings5ForwardSpeed = IBelieveICanFlyPlugin.context.config("06.03 - Wings 5", "02 - Max Forward Speed", 20f, "Maximum forward speed while gliding with Wings 5."); Wings5ForwardForce = IBelieveICanFlyPlugin.context.config("06.03 - Wings 5", "03 - Forward Force", 14f, "Forward acceleration while gliding with Wings 5."); Wings5DescentSpeed = IBelieveICanFlyPlugin.context.config("06.03 - Wings 5", "04 - Max Descent Speed", -1f, "How fast you can fall while gliding with Wings 5 (more negative = faster fall)."); Wings5AirTurnSpeed = IBelieveICanFlyPlugin.context.config("06.03 - Wings 5", "05 - Air Turn Speed", 150f, "Yaw control while gliding with Wings 5 (deg/sec)."); Wings5LateralDamp = IBelieveICanFlyPlugin.context.config("06.03 - Wings 5", "06 - Lateral Damping", 0.15f, "Slight damping to stabilize lateral drift for Wings 5."); Wings5GroundProbeDistance = IBelieveICanFlyPlugin.context.config("06.03 - Wings 5", "07 - Ground Probe Distance", 2.5f, "Start cushioning this far from ground for Wings 5."); Wings5CushionDescentSpeed = IBelieveICanFlyPlugin.context.config("06.03 - Wings 5", "08 - Cushion Descent Speed", -0.7f, "Final descent cap near ground for Wings 5."); Wings5CushionLerp = IBelieveICanFlyPlugin.context.config("06.03 - Wings 5", "09 - Cushion Lerp", 0.6f, "How quickly we clamp toward the cushion speed for Wings 5."); Wings5TiltMaxPitch = IBelieveICanFlyPlugin.context.config("06.04 - Wings 5", "01 - Max Pitch", 25f, "Maximum pitch angle (nose up/down) in degrees for Wings 5."); Wings5TiltMaxRoll = IBelieveICanFlyPlugin.context.config("06.04 - Wings 5", "02 - Max Roll", 35f, "Maximum roll angle (banking) in degrees for Wings 5."); Wings5TiltPitchSmoothTime = IBelieveICanFlyPlugin.context.config("06.04 - Wings 5", "03 - Pitch Smooth Time", 0.15f, "How quickly pitch changes (lower = faster response) for Wings 5."); Wings5TiltRollSmoothTime = IBelieveICanFlyPlugin.context.config("06.04 - Wings 5", "04 - Roll Smooth Time", 0.1f, "How quickly roll/banking changes (lower = faster response) for Wings 5."); Wings5UpDownOffset = IBelieveICanFlyPlugin.context.config("06.05 - Wings 5", "01 - Up/Down Offset", -1f, "Adjust Wings 5 vertical position on the player's back. Higher values move it up."); Wings5LeftRightOffset = IBelieveICanFlyPlugin.context.config("06.05 - Wings 5", "02 - Left/Right Offset", 0f, "Adjust Wings 5 horizontal position on the player's back. Positive values move it to the right."); Wings5ForwardBackOffset = IBelieveICanFlyPlugin.context.config("06.05 - Wings 5", "03 - Forward/Back Offset", -2.5f, "Adjust Wings 5 position front-to-back on the player. Negative values move it backward."); Wings5RotationX = IBelieveICanFlyPlugin.context.config("06.06 - Wings 5", "01 - X Rotation", 70f, "Adjust Wings 5 pitch rotation in degrees. Controls tilt forward/backward."); Wings5RotationY = IBelieveICanFlyPlugin.context.config("06.06 - Wings 5", "02 - Y Rotation", 0f, "Adjust Wings 5 yaw rotation in degrees. Controls left/right facing."); Wings5RotationZ = IBelieveICanFlyPlugin.context.config("06.06 - Wings 5", "03 - Z Rotation", 0f, "Adjust Wings 5 roll rotation in degrees. Controls tilt to sides."); Wings5Scale = IBelieveICanFlyPlugin.context.config("06.06 - Wings 5", "04 - Scale", 0.2f, "Adjust the overall size of Wings 5. 1.0 is normal size."); Wings5SFX = IBelieveICanFlyPlugin.context.config("06.07 - Wings 5", "01 - SFX", value: true, "Whether to enable or disable SFX when gliding with Wings 5."); Wings5AttachSFXToPlayer = IBelieveICanFlyPlugin.context.config("06.07 - Wings 5", "02 - Attach SFX To Player", value: true, "Whether to enable or disable SFX for Wings 5 will be attached to the player and follow their movement."); Wings5StartSFX = IBelieveICanFlyPlugin.context.config("06.07 - Wings 5", "03 - Start SFX", "sfx_FireAddFuel", "Sound effect to play when starting to glide with Wings 5. Use vanilla sound effect names."); Wings5LoopSFX = IBelieveICanFlyPlugin.context.config("06.07 - Wings 5", "04 - Loop SFX", "", "Sound effect to play continuously while gliding with Wings 5. Use vanilla sound effect names."); Wings5StopSFX = IBelieveICanFlyPlugin.context.config("06.07 - Wings 5", "05 - Stop SFX", "sfx_flap_glider_Ygg", "Sound effect to play when stopping gliding with Wings 5. Use vanilla sound effect names."); Wings5VFX = IBelieveICanFlyPlugin.context.config("06.08 - Wings 5", "01 - VFX", value: true, "Whether to enable or disable VFX when gliding with Wings 5."); Wings5AttachEffectsToPlayer = IBelieveICanFlyPlugin.context.config("06.08 - Wings 5", "02 - Attach VFX To Player", value: true, "Whether to enable or disable VFX for Wings 5 will be attached to the player and follow their movement."); Wings5StartVFX = IBelieveICanFlyPlugin.context.config("06.08 - Wings 5", "03 - Start VFX", "vfx_GjallFuelBurst_Ygg", "Visual effect to play when starting to glide with Wings 5. Use vanilla VFX names."); Wings5LoopVFX = IBelieveICanFlyPlugin.context.config("06.08 - Wings 5", "04 - Loop VFX", "vfx_GjallFuelBurst_Ygg2", "Visual effect to play continuously while gliding with Wings 5. Use vanilla VFX names."); Wings5StopVFX = IBelieveICanFlyPlugin.context.config("06.08 - Wings 5", "05 - Stop VFX", "vfx_odin_despawn", "Visual effect to play when stopping gliding with Wings 5. Use vanilla VFX names."); Wings5VFXPosition = IBelieveICanFlyPlugin.context.config("06.08 - Wings 5", "06 - VFX Position", "Root", "Position for VFX for Wings 5: 'Root' (at player's feet), 'Middle' (at player's center), or 'Custom' (use custom coordinates)."); Wings5VFXScale = IBelieveICanFlyPlugin.context.config("06.08 - Wings 5", "07 - VFX Scale", 1f, "Scale factor for VFX for Wings 5. 1.0 is normal size."); Wings5VFXCustomX = IBelieveICanFlyPlugin.context.config("06.08 - Wings 5", "08 - Custom X Offset", 0f, "X offset for custom VFX position for Wings 5 (only used when VFX Position is set to 'Custom')."); Wings5VFXCustomY = IBelieveICanFlyPlugin.context.config("06.08 - Wings 5", "09 - Custom Y Offset", 1f, "Y offset for custom VFX position for Wings 5 (only used when VFX Position is set to 'Custom')."); Wings5VFXCustomZ = IBelieveICanFlyPlugin.context.config("06.08 - Wings 5", "10 - Custom Z Offset", 0f, "Z offset for custom VFX position for Wings 5 (only used when VFX Position is set to 'Custom')."); } public static (bool enabled, int wingsIndex) GetWingsConfigForItem(ItemData item) { if (item == null) { return (false, -1); } string text = (Object.op_Implicit((Object)(object)item.m_dropPrefab) ? ((Object)item.m_dropPrefab).name : ""); string name = item.m_shared.m_name; if (Wings1Enabled.Value && !string.IsNullOrEmpty(Wings1ItemName.Value) && (text.Equals(Wings1ItemName.Value) || name.Equals(Wings1ItemName.Value) || name.Contains(Wings1ItemName.Value))) { return (true, 1); } if (Wings2Enabled.Value && !string.IsNullOrEmpty(Wings2ItemName.Value) && (text.Equals(Wings2ItemName.Value) || name.Equals(Wings2ItemName.Value) || name.Contains(Wings2ItemName.Value))) { return (true, 2); } if (Wings3Enabled.Value && !string.IsNullOrEmpty(Wings3ItemName.Value) && (text.Equals(Wings3ItemName.Value) || name.Equals(Wings3ItemName.Value) || name.Contains(Wings3ItemName.Value))) { return (true, 3); } if (Wings4Enabled.Value && !string.IsNullOrEmpty(Wings4ItemName.Value) && (text.Equals(Wings4ItemName.Value) || name.Equals(Wings4ItemName.Value) || name.Contains(Wings4ItemName.Value))) { return (true, 4); } if (Wings5Enabled.Value && !string.IsNullOrEmpty(Wings5ItemName.Value) && (text.Equals(Wings5ItemName.Value) || name.Equals(Wings5ItemName.Value) || name.Contains(Wings5ItemName.Value))) { return (true, 5); } return (false, -1); } public static string GetWingsVisualPrefab(int wingsIndex) { if (1 == 0) { } string result = wingsIndex switch { 1 => Wings1VisualPrefab.Value, 2 => Wings2VisualPrefab.Value, 3 => Wings3VisualPrefab.Value, 4 => Wings4VisualPrefab.Value, 5 => Wings5VisualPrefab.Value, _ => "", }; if (1 == 0) { } return result; } public static bool GetWingsCheckRightHand(int wingsIndex) { if (1 == 0) { } bool result = wingsIndex switch { 1 => Wings1CheckRightHand.Value, 2 => Wings2CheckRightHand.Value, 3 => Wings3CheckRightHand.Value, 4 => Wings4CheckRightHand.Value, 5 => Wings5CheckRightHand.Value, _ => true, }; if (1 == 0) { } return result; } public static bool GetWingsCheckLeftHand(int wingsIndex) { if (1 == 0) { } bool result = wingsIndex switch { 1 => Wings1CheckLeftHand.Value, 2 => Wings2CheckLeftHand.Value, 3 => Wings3CheckLeftHand.Value, 4 => Wings4CheckLeftHand.Value, 5 => Wings5CheckLeftHand.Value, _ => false, }; if (1 == 0) { } return result; } public static bool GetWingsCheckUtility(int wingsIndex) { if (1 == 0) { } bool result = wingsIndex switch { 1 => Wings1CheckUtility.Value, 2 => Wings2CheckUtility.Value, 3 => Wings3CheckUtility.Value, 4 => Wings4CheckUtility.Value, 5 => Wings5CheckUtility.Value, _ => false, }; if (1 == 0) { } return result; } public static bool GetWingsUseFallReset(int wingsIndex) { if (1 == 0) { } bool result = wingsIndex switch { 1 => Wings1UseFallReset.Value, 2 => Wings2UseFallReset.Value, 3 => Wings3UseFallReset.Value, 4 => Wings4UseFallReset.Value, 5 => Wings5UseFallReset.Value, _ => true, }; if (1 == 0) { } return result; } public static bool GetWingsAnimation(int wingsIndex) { if (1 == 0) { } bool result = wingsIndex switch { 1 => Wings1Animation.Value, 2 => Wings2Animation.Value, 3 => Wings3Animation.Value, 4 => Wings4Animation.Value, 5 => Wings5Animation.Value, _ => true, }; if (1 == 0) { } return result; } public static float GetWingsMinActivationFallSpeed(int wingsIndex) { if (1 == 0) { } float result = wingsIndex switch { 1 => Wings1MinActivationFallSpeed.Value, 2 => Wings2MinActivationFallSpeed.Value, 3 => Wings3MinActivationFallSpeed.Value, 4 => Wings4MinActivationFallSpeed.Value, 5 => Wings5MinActivationFallSpeed.Value, _ => -0.5f, }; if (1 == 0) { } return result; } public static bool GetWingsSFX(int wingsIndex) { if (1 == 0) { } bool result = wingsIndex switch { 1 => Wings1SFX.Value, 2 => Wings2SFX.Value, 3 => Wings3SFX.Value, 4 => Wings4SFX.Value, 5 => Wings5SFX.Value, _ => true, }; if (1 == 0) { } return result; } public static string GetWingsStartSFX(int wingsIndex) { if (1 == 0) { } string result = wingsIndex switch { 1 => Wings1StartSFX.Value, 2 => Wings2StartSFX.Value, 3 => Wings3StartSFX.Value, 4 => Wings4StartSFX.Value, 5 => Wings5StartSFX.Value, _ => "", }; if (1 == 0) { } return result; } public static string GetWingsLoopSFX(int wingsIndex) { if (1 == 0) { } string result = wingsIndex switch { 1 => Wings1LoopSFX.Value, 2 => Wings2LoopSFX.Value, 3 => Wings3LoopSFX.Value, 4 => Wings4LoopSFX.Value, 5 => Wings5LoopSFX.Value, _ => "", }; if (1 == 0) { } return result; } public static string GetWingsStopSFX(int wingsIndex) { if (1 == 0) { } string result = wingsIndex switch { 1 => Wings1StopSFX.Value, 2 => Wings2StopSFX.Value, 3 => Wings3StopSFX.Value, 4 => Wings4StopSFX.Value, 5 => Wings5StopSFX.Value, _ => "", }; if (1 == 0) { } return result; } public static bool GetWingsVFX(int wingsIndex) { if (1 == 0) { } bool result = wingsIndex switch { 1 => Wings1VFX.Value, 2 => Wings2VFX.Value, 3 => Wings3VFX.Value, 4 => Wings4VFX.Value, 5 => Wings5VFX.Value, _ => true, }; if (1 == 0) { } return result; } public static string GetWingsStartVFX(int wingsIndex) { if (1 == 0) { } string result = wingsIndex switch { 1 => Wings1StartVFX.Value, 2 => Wings2StartVFX.Value, 3 => Wings3StartVFX.Value, 4 => Wings4StartVFX.Value, 5 => Wings5StartVFX.Value, _ => "", }; if (1 == 0) { } return result; } public static string GetWingsLoopVFX(int wingsIndex) { if (1 == 0) { } string result = wingsIndex switch { 1 => Wings1LoopVFX.Value, 2 => Wings2LoopVFX.Value, 3 => Wings3LoopVFX.Value, 4 => Wings4LoopVFX.Value, 5 => Wings5LoopVFX.Value, _ => "", }; if (1 == 0) { } return result; } public static string GetWingsStopVFX(int wingsIndex) { if (1 == 0) { } string result = wingsIndex switch { 1 => Wings1StopVFX.Value, 2 => Wings2StopVFX.Value, 3 => Wings3StopVFX.Value, 4 => Wings4StopVFX.Value, 5 => Wings5StopVFX.Value, _ => "", }; if (1 == 0) { } return result; } public static float GetWingsForwardSpeed(int wingsIndex) { if (1 == 0) { } float result = wingsIndex switch { 1 => Wings1ForwardSpeed.Value, 2 => Wings2ForwardSpeed.Value, 3 => Wings3ForwardSpeed.Value, 4 => Wings4ForwardSpeed.Value, 5 => Wings5ForwardSpeed.Value, _ => 14f, }; if (1 == 0) { } return result; } public static float GetWingsForwardForce(int wingsIndex) { if (1 == 0) { } float result = wingsIndex switch { 1 => Wings1ForwardForce.Value, 2 => Wings2ForwardForce.Value, 3 => Wings3ForwardForce.Value, 4 => Wings4ForwardForce.Value, 5 => Wings5ForwardForce.Value, _ => 10f, }; if (1 == 0) { } return result; } public static float GetWingsDescentSpeed(int wingsIndex) { if (1 == 0) { } float result = wingsIndex switch { 1 => Wings1DescentSpeed.Value, 2 => Wings2DescentSpeed.Value, 3 => Wings3DescentSpeed.Value, 4 => Wings4DescentSpeed.Value, 5 => Wings5DescentSpeed.Value, _ => -4f, }; if (1 == 0) { } return result; } public static float GetWingsAirTurnSpeed(int wingsIndex) { if (1 == 0) { } float result = wingsIndex switch { 1 => Wings1AirTurnSpeed.Value, 2 => Wings2AirTurnSpeed.Value, 3 => Wings3AirTurnSpeed.Value, 4 => Wings4AirTurnSpeed.Value, 5 => Wings5AirTurnSpeed.Value, _ => 120f, }; if (1 == 0) { } return result; } public static float GetWingsLateralDamp(int wingsIndex) { if (1 == 0) { } float result = wingsIndex switch { 1 => Wings1LateralDamp.Value, 2 => Wings2LateralDamp.Value, 3 => Wings3LateralDamp.Value, 4 => Wings4LateralDamp.Value, 5 => Wings5LateralDamp.Value, _ => 0.15f, }; if (1 == 0) { } return result; } public static float GetWingsGroundProbeDistance(int wingsIndex) { if (1 == 0) { } float result = wingsIndex switch { 1 => Wings1GroundProbeDistance.Value, 2 => Wings2GroundProbeDistance.Value, 3 => Wings3GroundProbeDistance.Value, 4 => Wings4GroundProbeDistance.Value, 5 => Wings5GroundProbeDistance.Value, _ => 2.5f, }; if (1 == 0) { } return result; } public static float GetWingsCushionDescentSpeed(int wingsIndex) { if (1 == 0) { } float result = wingsIndex switch { 1 => Wings1CushionDescentSpeed.Value, 2 => Wings2CushionDescentSpeed.Value, 3 => Wings3CushionDescentSpeed.Value, 4 => Wings4CushionDescentSpeed.Value, 5 => Wings5CushionDescentSpeed.Value, _ => -0.7f, }; if (1 == 0) { } return result; } public static float GetWingsCushionLerp(int wingsIndex) { if (1 == 0) { } float result = wingsIndex switch { 1 => Wings1CushionLerp.Value, 2 => Wings2CushionLerp.Value, 3 => Wings3CushionLerp.Value, 4 => Wings4CushionLerp.Value, 5 => Wings5CushionLerp.Value, _ => 0.6f, }; if (1 == 0) { } return result; } public static float GetWingsTiltMaxPitch(int wingsIndex) { if (1 == 0) { } float result = wingsIndex switch { 1 => Wings1TiltMaxPitch.Value, 2 => Wings2TiltMaxPitch.Value, 3 => Wings3TiltMaxPitch.Value, 4 => Wings4TiltMaxPitch.Value, 5 => Wings5TiltMaxPitch.Value, _ => 25f, }; if (1 == 0) { } return result; } public static float GetWingsTiltMaxRoll(int wingsIndex) { if (1 == 0) { } float result = wingsIndex switch { 1 => Wings1TiltMaxRoll.Value, 2 => Wings2TiltMaxRoll.Value, 3 => Wings3TiltMaxRoll.Value, 4 => Wings4TiltMaxRoll.Value, 5 => Wings5TiltMaxRoll.Value, _ => 35f, }; if (1 == 0) { } return result; } public static float GetWingsTiltPitchSmoothTime(int wingsIndex) { if (1 == 0) { } float result = wingsIndex switch { 1 => Wings1TiltPitchSmoothTime.Value, 2 => Wings2TiltPitchSmoothTime.Value, 3 => Wings3TiltPitchSmoothTime.Value, 4 => Wings4TiltPitchSmoothTime.Value, 5 => Wings5TiltPitchSmoothTime.Value, _ => 0.15f, }; if (1 == 0) { } return result; } public static float GetWingsTiltRollSmoothTime(int wingsIndex) { if (1 == 0) { } float result = wingsIndex switch { 1 => Wings1TiltRollSmoothTime.Value, 2 => Wings2TiltRollSmoothTime.Value, 3 => Wings3TiltRollSmoothTime.Value, 4 => Wings4TiltRollSmoothTime.Value, 5 => Wings5TiltRollSmoothTime.Value, _ => 0.1f, }; if (1 == 0) { } return result; } public static float GetWingsUpDownOffset(int wingsIndex) { if (1 == 0) { } float result = wingsIndex switch { 1 => Wings1UpDownOffset.Value, 2 => Wings2UpDownOffset.Value, 3 => Wings3UpDownOffset.Value, 4 => Wings4UpDownOffset.Value, 5 => Wings5UpDownOffset.Value, _ => 1.2f, }; if (1 == 0) { } return result; } public static float GetWingsLeftRightOffset(int wingsIndex) { if (1 == 0) { } float result = wingsIndex switch { 1 => Wings1LeftRightOffset.Value, 2 => Wings2LeftRightOffset.Value, 3 => Wings3LeftRightOffset.Value, 4 => Wings4LeftRightOffset.Value, 5 => Wings5LeftRightOffset.Value, _ => 0f, }; if (1 == 0) { } return result; } public static float GetWingsForwardBackOffset(int wingsIndex) { if (1 == 0) { } float result = wingsIndex switch { 1 => Wings1ForwardBackOffset.Value, 2 => Wings2ForwardBackOffset.Value, 3 => Wings3ForwardBackOffset.Value, 4 => Wings4ForwardBackOffset.Value, 5 => Wings5ForwardBackOffset.Value, _ => -0.1f, }; if (1 == 0) { } return result; } public static float GetWingsRotationX(int wingsIndex) { if (1 == 0) { } float result = wingsIndex switch { 1 => Wings1RotationX.Value, 2 => Wings2RotationX.Value, 3 => Wings3RotationX.Value, 4 => Wings4RotationX.Value, 5 => Wings5RotationX.Value, _ => 0f, }; if (1 == 0) { } return result; } public static float GetWingsRotationY(int wingsIndex) { if (1 == 0) { } float result = wingsIndex switch { 1 => Wings1RotationY.Value, 2 => Wings2RotationY.Value, 3 => Wings3RotationY.Value, 4 => Wings4RotationY.Value, 5 => Wings5RotationY.Value, _ => 180f, }; if (1 == 0) { } return result; } public static float GetWingsRotationZ(int wingsIndex) { if (1 == 0) { } float result = wingsIndex switch { 1 => Wings1RotationZ.Value, 2 => Wings2RotationZ.Value, 3 => Wings3RotationZ.Value, 4 => Wings4RotationZ.Value, 5 => Wings5RotationZ.Value, _ => 0f, }; if (1 == 0) { } return result; } public static float GetWingsScale(int wingsIndex) { if (1 == 0) { } float result = wingsIndex switch { 1 => Wings1Scale.Value, 2 => Wings2Scale.Value, 3 => Wings3Scale.Value, 4 => Wings4Scale.Value, 5 => Wings5Scale.Value, _ => 1f, }; if (1 == 0) { } return result; } public static bool GetWingsAttachSFXToPlayer(int wingsIndex) { if (1 == 0) { } bool result = wingsIndex switch { 1 => Wings1AttachSFXToPlayer.Value, 2 => Wings2AttachSFXToPlayer.Value, 3 => Wings3AttachSFXToPlayer.Value, 4 => Wings4AttachSFXToPlayer.Value, 5 => Wings5AttachSFXToPlayer.Value, _ => true, }; if (1 == 0) { } return result; } public static bool GetWingsAttachEffectsToPlayer(int wingsIndex) { if (1 == 0) { } bool result = wingsIndex switch { 1 => Wings1AttachEffectsToPlayer.Value, 2 => Wings2AttachEffectsToPlayer.Value, 3 => Wings3AttachEffectsToPlayer.Value, 4 => Wings4AttachEffectsToPlayer.Value, 5 => Wings5AttachEffectsToPlayer.Value, _ => true, }; if (1 == 0) { } return result; } public static string GetWingsVFXPosition(int wingsIndex) { if (1 == 0) { } string result = wingsIndex switch { 1 => Wings1VFXPosition.Value, 2 => Wings2VFXPosition.Value, 3 => Wings3VFXPosition.Value, 4 => Wings4VFXPosition.Value, 5 => Wings5VFXPosition.Value, _ => "Root", }; if (1 == 0) { } return result; } public static float GetWingsVFXScale(int wingsIndex) { if (1 == 0) { } float result = wingsIndex switch { 1 => Wings1VFXScale.Value, 2 => Wings2VFXScale.Value, 3 => Wings3VFXScale.Value, 4 => Wings4VFXScale.Value, 5 => Wings5VFXScale.Value, _ => 1f, }; if (1 == 0) { } return result; } public static float GetWingsVFXCustomX(int wingsIndex) { if (1 == 0) { } float result = wingsIndex switch { 1 => Wings1VFXCustomX.Value, 2 => Wings2VFXCustomX.Value, 3 => Wings3VFXCustomX.Value, 4 => Wings4VFXCustomX.Value, 5 => Wings5VFXCustomX.Value, _ => 0f, }; if (1 == 0) { } return result; } public static float GetWingsVFXCustomY(int wingsIndex) { if (1 == 0) { } float result = wingsIndex switch { 1 => Wings1VFXCustomY.Value, 2 => Wings2VFXCustomY.Value, 3 => Wings3VFXCustomY.Value, 4 => Wings4VFXCustomY.Value, 5 => Wings5VFXCustomY.Value, _ => 1f, }; if (1 == 0) { } return result; } public static float GetWingsVFXCustomZ(int wingsIndex) { if (1 == 0) { } float result = wingsIndex switch { 1 => Wings1VFXCustomZ.Value, 2 => Wings2VFXCustomZ.Value, 3 => Wings3VFXCustomZ.Value, 4 => Wings4VFXCustomZ.Value, 5 => Wings5VFXCustomZ.Value, _ => 0f, }; if (1 == 0) { } return result; } public static int GetCurrentWingsIndex() { return GliderSystem.GetCurrentWingsIndex(); } } public static class Item { public static ItemManager.Item? Glider_BackPack_Ygg { get; private set; } public static ItemManager.Item? Glider_Gjall_BackPack_Ygg { get; private set; } public static ItemManager.Item? Glider_Gjall_Fader_BackPack_Ygg { get; private set; } public static ItemManager.Item? Glider_BackPack_DragonModer_Ygg { get; private set; } public static ItemManager.Item? Glider_BackPack_BlackDragon_Ygg { get; private set; } public static ItemManager.Item? Wing1 { get; private set; } public static ItemManager.Item? Wing2 { get; private set; } public static ItemManager.Item? Wing3 { get; private set; } public static ItemManager.Item? Wing4 { get; private set; } public static ItemManager.Item? Wing5 { get; private set; } public static ItemManager.Item? Wing6 { get; private set; } public static void RegisterAll(string bundleName) { RegisterItems(bundleName); RegisterGliders(bundleName); RegisterFX(bundleName); } private static void RegisterItems(string bundleName) { Glider_BackPack_Ygg = new ItemManager.Item(bundleName, "Glider_BackPack_Ygg"); Glider_BackPack_Ygg.Name.English("Glider Bag"); Glider_BackPack_Ygg.Description.English("A Glider Bag made from Crystal Glass, Deerhides and Wood."); Glider_BackPack_Ygg.Crafting.Add(ItemManager.CraftingTable.Workbench, 0); Glider_BackPack_Ygg.RequiredItems.Add("DeerHide", 5); Glider_BackPack_Ygg.RequiredItems.Add("Crystal", 10); Glider_BackPack_Ygg.RequiredItems.Add("FineWood", 15); Glider_BackPack_Ygg.CraftAmount = 1; Glider_Gjall_BackPack_Ygg = new ItemManager.Item(bundleName, "Glider_Gjall_BackPack_Ygg"); Glider_Gjall_BackPack_Ygg.Name.English("Gjall Air Balloon"); Glider_Gjall_BackPack_Ygg.Description.English("A Balloon Glider made from Gjall Trophy, Wisps and Yggdrassil Wood."); Glider_Gjall_BackPack_Ygg.Crafting.Add(ItemManager.CraftingTable.BlackForge, 0); Glider_Gjall_BackPack_Ygg.RequiredItems.Add("TrophyGjall", 1); Glider_Gjall_BackPack_Ygg.RequiredItems.Add("Wisp", 10); Glider_Gjall_BackPack_Ygg.RequiredItems.Add("YggdrasilWood", 15); Glider_Gjall_BackPack_Ygg.CraftAmount = 1; Glider_Gjall_Fader_BackPack_Ygg = new ItemManager.Item(bundleName, "Glider_Gjall_Fader_BackPack_Ygg"); Glider_Gjall_Fader_BackPack_Ygg.Name.English("Infused Gjall Glider"); Glider_Gjall_Fader_BackPack_Ygg.Description.English("Fader Infused Balloon Glider made from Gjall Trophy, Wisps and Yggdrassil Wood."); Glider_Gjall_Fader_BackPack_Ygg.Crafting.Add(ItemManager.CraftingTable.BlackForge, 0); Glider_Gjall_Fader_BackPack_Ygg.RequiredItems.Add("Glider_Gjall_BackPack_Ygg", 1); Glider_Gjall_Fader_BackPack_Ygg.RequiredItems.Add("TrophyFader", 1); Glider_Gjall_Fader_BackPack_Ygg.CraftAmount = 1; Glider_BackPack_DragonModer_Ygg = new ItemManager.Item(bundleName, "Glider_BackPack_DragonModer_Ygg"); Glider_BackPack_DragonModer_Ygg.Name.English("Dragon Glider Wings"); Glider_BackPack_DragonModer_Ygg.Description.English("A Dragon Glider back sack made from Moders wings."); Glider_BackPack_BlackDragon_Ygg = new ItemManager.Item(bundleName, "Glider_BackPack_BlackDragon_Ygg"); Glider_BackPack_BlackDragon_Ygg.Name.English("Black Dragon Glider Wings"); Glider_BackPack_BlackDragon_Ygg.Description.English("A Dragon Glider back sack made from a special Black Dragon Wings."); } private static void RegisterGliders(string bundleName) { Wing1 = new ItemManager.Item(bundleName, "DragonWings_Ygg"); Wing1.Name.English("Glider Glass"); Wing1.Description.English("Wing 1"); Wing2 = new ItemManager.Item(bundleName, "DragonWings_Ygg1"); Wing2.Name.English("Dragon Glider Wings"); Wing2.Description.English("Wing 2"); Wing3 = new ItemManager.Item(bundleName, "DragonWings_Ygg2"); Wing3.Name.English("Black Dragon Glider Wings"); Wing3.Description.English("Wing 3"); Wing4 = new ItemManager.Item(bundleName, "DragonWings_Ygg3"); Wing4.Name.English("Gjall Air Balloon"); Wing4.Description.English("Wing 4"); Wing5 = new ItemManager.Item(bundleName, "DragonWings_Ygg4"); Wing5.Name.English("Infused Gjall Balloon"); Wing5.Description.English("Wing 5"); MaterialReplacer.RegisterGameObjectForShaderSwap(Wing5.Prefab, MaterialReplacer.ShaderType.UseUnityShader); } private static void RegisterFX(string bundleName) { GameObject val = PrefabManager.RegisterPrefab("ibelieveicanfly", "sfx_flap_glider_Ygg"); GameObject val2 = PrefabManager.RegisterPrefab("ibelieveicanfly", "sfx_gliding_glider_Ygg"); GameObject val3 = PrefabManager.RegisterPrefab("ibelieveicanfly", "vfx_GjallFuelBurst_Ygg"); GameObject val4 = PrefabManager.RegisterPrefab("ibelieveicanfly", "vfx_GjallFuelBurst_Ygg2"); MaterialReplacer.RegisterGameObjectForShaderSwap(val3.gameObject, MaterialReplacer.ShaderType.UseUnityShader); MaterialReplacer.RegisterGameObjectForShaderSwap(val4.gameObject, MaterialReplacer.ShaderType.UseUnityShader); } } } namespace IBelieveICanFly.Patches { public static class GliderSystem { private const string WINGS1_CONTROLLER_NAME = "gliding_controller"; private const string WINGS1_START_TRIGGER = "start_gliding"; private const string WINGS1_STOP_TRIGGER = "stop_gliding"; private const float WINGS1_EXIT_DURATION = 0.1f; private const string WINGS2_CONTROLLER_NAME = "gliding_controller2"; private const string WINGS2_START_TRIGGER = "start_gliding"; private const string WINGS2_STOP_TRIGGER = "stop_gliding"; private const float WINGS2_EXIT_DURATION = 0.1f; private const string WINGS3_CONTROLLER_NAME = "gliding_controller3"; private const string WINGS3_START_TRIGGER = "start_gliding"; private const string WINGS3_STOP_TRIGGER = "stop_gliding"; private const float WINGS3_EXIT_DURATION = 0.1f; private const string WINGS4_CONTROLLER_NAME = "gliding_controller"; private const string WINGS4_START_TRIGGER = "start_gliding"; private const string WINGS4_STOP_TRIGGER = "stop_gliding"; private const float WINGS4_EXIT_DURATION = 0.1f; private const string WINGS5_CONTROLLER_NAME = "gliding_controller"; private const string WINGS5_START_TRIGGER = "start_gliding"; private const string WINGS5_STOP_TRIGGER = "stop_gliding"; private const float WINGS5_EXIT_DURATION = 0.1f; private static float lastItemCheckTime = 0f; private static float itemCheckInterval = 0.5f; private static bool cachedItemEquippedResult = false; private static bool isCurrentlyGliding = false; private static RuntimeAnimatorController? originalController; private static Dictionary<int, RuntimeAnimatorController?> gliderControllers = new Dictionary<int, RuntimeAnimatorController>(); private static bool isExitingGlide = false; private static float exitAnimationStartTime = 0f; private static ItemData? equippedGliderItem = null; private static int currentWingsIndex = -1; private static FieldInfo? _fiMaxAirAltitude; private static bool toggleModeActive = false; private static bool lastSpaceKeyState = false; private static GameObject? activeLoopVFX = null; private static GameObject? activeLoopSFX = null; private const string ZDO_GLIDING_KEY = "IBelieveICanFly_Gliding"; private const string ZDO_WINGS_INDEX_KEY = "IBelieveICanFly_WingsIndex"; private static readonly Dictionary<ZDOID, GameObject> remotePlayerGliders = new Dictionary<ZDOID, GameObject>(); private static readonly Dictionary<ZDOID, RuntimeAnimatorController> remotePlayerOriginalControllers = new Dictionary<ZDOID, RuntimeAnimatorController>(); public static LayerMask groundMask = LayerMask.op_Implicit(-1); private static Vector3 _smoothedForward = Vector3.forward; private static Vector3 _smoothedVelocity = Vector3.zero; private static float _currentPitch = 0f; private static float _currentRoll = 0f; private static float _pitchVelocity = 0f; private static float _rollVelocity = 0f; private static Vector3 _lastPosition = Vector3.zero; private static float _lastUpdateTime = 0f; public static bool IsCurrentlyGliding() { return isCurrentlyGliding; } public static RuntimeAnimatorController? GetGliderController(int wingsIndex) { RuntimeAnimatorController value; return gliderControllers.TryGetValue(wingsIndex, out value) ? value : null; } public static RuntimeAnimatorController? GetOriginalController() { return originalController; } public static int GetCurrentWingsIndex() { return currentWingsIndex; } public static string GetWingsControllerName(int wingsIndex) { if (1 == 0) { } string result = wingsIndex switch { 1 => "gliding_controller", 2 => "gliding_controller2", 3 => "gliding_controller3", 4 => "gliding_controller", 5 => "gliding_controller", _ => "gliding_controller", }; if (1 == 0) { } return result; } public static string GetWingsStartTrigger(int wingsIndex) { if (1 == 0) { } string result = wingsIndex switch { 1 => "start_gliding", 2 => "start_gliding", 3 => "start_gliding", 4 => "start_gliding", 5 => "start_gliding", _ => "start_gliding", }; if (1 == 0) { } return result; } public static string GetWingsStopTrigger(int wingsIndex) { if (1 == 0) { } string result = wingsIndex switch { 1 => "stop_gliding", 2 => "stop_gliding", 3 => "stop_gliding", 4 => "stop_gliding", 5 => "stop_gliding", _ => "stop_gliding", }; if (1 == 0) { } return result; } public static float GetWingsExitDuration(int wingsIndex) { if (1 == 0) { } float result = wingsIndex switch { 1 => 0.1f, 2 => 0.1f, 3 => 0.1f, 4 => 0.1f, 5 => 0.1f, _ => 0.1f, }; if (1 == 0) { } return result; } public static void Initialize() { lastItemCheckTime = 0f; cachedItemEquippedResult = false; AssetBundle assetBundle = IBelieveICanFlyPlugin.GetAssetBundle("ibelieveicanfly"); if ((Object)(object)assetBundle != (Object)null) { for (int i = 1; i <= 5; i++) { string wingsControllerName = GetWingsControllerName(i); RuntimeAnimatorController val = assetBundle.LoadAsset<RuntimeAnimatorController>(wingsControllerName); if ((Object)(object)val != (Object)null) { gliderControllers[i] = val; } } if (gliderControllers.Count == 0) { RuntimeAnimatorController val2 = assetBundle.LoadAsset<RuntimeAnimatorController>("gliding_controller"); if ((Object)(object)val2 != (Object)null) { for (int j = 1; j <= 5; j++) { gliderControllers[j] = val2; } } } } try { _fiMaxAirAltitude = typeof(Character).GetField("m_maxAirAltitude", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); } catch (Exception) { _fiMaxAirAltitude = null; } } private static bool CanGlide(Player player) { //IL_00e0: Unknown result type (might be due to invalid IL or missing references) var (flag, num) = GetEquippedWingsConfig(player); if (!flag) { return false; } currentWingsIndex = num; bool flag2 = ((Character)player).IsOnGround(); bool flag3 = ((Character)player).InWater(); bool flag4 = ((Character)player).IsAttached(); if (flag2 || flag3 || flag4) { return false; } bool key = Input.GetKey((KeyCode)32); bool keyDown = Input.GetKeyDown((KeyCode)32); if (Config.ToggleMode.Value) { if (keyDown) { toggleModeActive = !toggleModeActive; } if (!toggleModeActive) { return false; } } else if (!key) { toggleModeActive = false; return false; } Rigidbody component = ((Component)player).GetComponent<Rigidbody>(); if ((Object)(object)component == (Object)null) { return false; } float y = component.linearVelocity.y; float wingsMinActivationFallSpeed = Config.GetWingsMinActivationFallSpeed(currentWingsIndex); if (y > wingsMinActivationFallSpeed) { return false; } return true; } public static bool IsGliderItem(ItemData item) { if ((Object)(object)item?.m_dropPrefab == (Object)null) { return false; } return Config.GetWingsConfigForItem(item).enabled; } public static (bool enabled, int wingsIndex) GetEquippedWingsConfig(Player player) { if (Time.time < lastItemCheckTime + itemCheckInterval && equippedGliderItem != null) { if (cachedItemEquippedResult) { return Config.GetWingsConfigForItem(equippedGliderItem); } return (false, -1); } lastItemCheckTime = Time.time; ItemData rightItem = ((Humanoid)player).GetRightItem(); if (rightItem != null) { (bool, int) wingsConfigForItem = Config.GetWingsConfigForItem(rightItem); if (wingsConfigForItem.Item1 && Config.GetWingsCheckRightHand(wingsConfigForItem.Item2)) { equippedGliderItem = rightItem; cachedItemEquippedResult = true; return wingsConfigForItem; } } ItemData leftItem = ((Humanoid)player).GetLeftItem(); if (leftItem != null) { (bool, int) wingsConfigForItem2 = Config.GetWingsConfigForItem(leftItem); if (wingsConfigForItem2.Item1 && Config.GetWingsCheckLeftHand(wingsConfigForItem2.Item2)) { equippedGliderItem = leftItem; cachedItemEquippedResult = true; return wingsConfigForItem2; } } if (((Humanoid)player).m_utilityItem != null) { (bool, int) wingsConfigForItem3 = Config.GetWingsConfigForItem(((Humanoid)player).m_utilityItem); if (wingsConfigForItem3.Item1 && Config.GetWingsCheckUtility(wingsConfigForItem3.Item2)) { equippedGliderItem = ((Humanoid)player).m_utilityItem;