using System; using System.Collections; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BoneLib; using BoneLib.BoneMenu; using Il2CppInterop.Runtime.InteropTypes.Arrays; using MelonLoader; using MelonLoader.Preferences; using Microsoft.CodeAnalysis; using ShockwaveLanding; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: MelonInfo(typeof(ShockwaveMod), "Shockwave Landing", "1.0.0", "TonPseudo", null)] [assembly: MelonGame("Stress Level Zero", "BONELAB")] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] [assembly: AssemblyCompany("ShockwaveLanding")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("ShockwaveLanding")] [assembly: AssemblyTitle("ShockwaveLanding")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [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 ShockwaveLanding { public class ShockwaveMod : MelonMod { private static MelonPreferences_Category _category; private static MelonPreferences_Entry _enabled; private static MelonPreferences_Entry _intensity; private static MelonPreferences_Entry _minFallHeight; private static MelonPreferences_Entry _radius; private static MelonPreferences_Entry _upwardsModifier; private static MelonPreferences_Entry _scaleWithFall; private static MelonPreferences_Entry _maxFallScale; private float _previousY; private bool _hasPreviousY; private float _peakY; private bool _isFalling; private const float FallSpeedThreshold = 2f; private const float LandingSpeedThreshold = 0.5f; private bool _menuBuilt; public override void OnInitializeMelon() { _category = MelonPreferences.CreateCategory("ShockwaveLanding"); _enabled = _category.CreateEntry("Enabled", true, (string)null, "Active ou désactive complètement le mod", false, false, (ValueValidator)null, (string)null); _intensity = _category.CreateEntry("Intensity", 20f, (string)null, "Force appliquée aux objets/ennemis dans le rayon (plus haut = plus fort)", false, false, (ValueValidator)null, (string)null); _minFallHeight = _category.CreateEntry("MinFallHeight", 3f, (string)null, "Hauteur de chute minimum (mètres) avant de déclencher l'onde de choc", false, false, (ValueValidator)null, (string)null); _radius = _category.CreateEntry("Radius", 8f, (string)null, "Rayon d'effet de l'onde de choc en mètres", false, false, (ValueValidator)null, (string)null); _upwardsModifier = _category.CreateEntry("UpwardsModifier", 1.5f, (string)null, "Composante verticale ajoutée au knockback (façon AddExplosionForce)", false, false, (ValueValidator)null, (string)null); _scaleWithFall = _category.CreateEntry("ScaleWithFallHeight", true, (string)null, "Si activé, l'intensité augmente avec la hauteur de chute réelle", false, false, (ValueValidator)null, (string)null); _maxFallScale = _category.CreateEntry("MaxFallScaleMultiplier", 3f, (string)null, "Multiplicateur maximum appliqué à l'intensité pour les très grandes chutes", false, false, (ValueValidator)null, (string)null); Hooking.OnUIRigCreated += SetupBoneMenu; MelonLogger.Msg("[ShockwaveLanding] Mod chargé. Intensité=" + _intensity.Value + " MinFall=" + _minFallHeight.Value + "m Radius=" + _radius.Value + "m"); } private void SetupBoneMenu() { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_0141: Unknown result type (might be due to invalid IL or missing references) //IL_018a: Unknown result type (might be due to invalid IL or missing references) //IL_01c3: Unknown result type (might be due to invalid IL or missing references) if (!_menuBuilt) { _menuBuilt = true; Page obj = Page.Root.CreatePage("Shockwave Landing", Color.red, 0, true); obj.CreateBool("Mod active", Color.green, _enabled.Value, (Action)delegate(bool val) { _enabled.Value = val; }); obj.CreateFloat("Intensite", Color.white, _intensity.Value, 5f, 0f, 500f, (Action)delegate(float val) { _intensity.Value = val; }); obj.CreateFloat("Hauteur min de chute (m)", Color.white, _minFallHeight.Value, 0.5f, 0.5f, 30f, (Action)delegate(float val) { _minFallHeight.Value = val; }); obj.CreateFloat("Rayon (m)", Color.white, _radius.Value, 0.5f, 1f, 30f, (Action)delegate(float val) { _radius.Value = val; }); obj.CreateFloat("Modificateur vertical", Color.white, _upwardsModifier.Value, 0.25f, 0f, 10f, (Action)delegate(float val) { _upwardsModifier.Value = val; }); obj.CreateBool("Scaler avec la chute", Color.white, _scaleWithFall.Value, (Action)delegate(bool val) { _scaleWithFall.Value = val; }); obj.CreateFloat("Multiplicateur max", Color.white, _maxFallScale.Value, 0.25f, 1f, 10f, (Action)delegate(float val) { _maxFallScale.Value = val; }); MelonLogger.Msg("[ShockwaveLanding] Page BoneMenu créée."); } } public override void OnUpdate() { TrackFallAndLanding(); } private void TrackFallAndLanding() { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) if (!_enabled.Value) { return; } Transform head = Player.Head; if ((Object)(object)head == (Object)null) { return; } float y = head.position.y; if (!_hasPreviousY) { _previousY = y; _hasPreviousY = true; return; } float deltaTime = Time.deltaTime; if (deltaTime <= 0f) { return; } float num = (y - _previousY) / deltaTime; if (!_isFalling) { if (num <= -2f) { _isFalling = true; _peakY = _previousY; } } else { _peakY = Mathf.Max(_peakY, _previousY); if (num > -0.5f) { _isFalling = false; float num2 = _peakY - y; if (num2 >= _minFallHeight.Value) { TriggerShockwave(head.position, num2); } } } _previousY = y; } private void TriggerShockwave(Vector3 origin, float fallDistance) { //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) float num = _intensity.Value; if (_scaleWithFall.Value && _minFallHeight.Value > 0f) { float num2 = Mathf.Clamp(fallDistance / _minFallHeight.Value, 1f, _maxFallScale.Value); num *= num2; } Collider[] array = Il2CppArrayBase.op_Implicit((Il2CppArrayBase)(object)Physics.OverlapSphere(origin, _radius.Value)); Transform val = (((Object)(object)Player.Head != (Object)null) ? Player.Head.root : null); Collider[] array2 = array; foreach (Collider val2 in array2) { Rigidbody attachedRigidbody = val2.attachedRigidbody; if (!((Object)(object)attachedRigidbody == (Object)null) && (!((Object)(object)val != (Object)null) || !((Object)(object)((Component)val2).transform.root == (Object)(object)val))) { attachedRigidbody.AddExplosionForce(num, origin, _radius.Value, _upwardsModifier.Value, (ForceMode)1); } } SpawnShockwaveVfx(origin); MelonLogger.Msg($"[ShockwaveLanding] Atterrissage détecté (chute={fallDistance:F1}m) -> intensité={num:F1}, {array.Length} colliders touchés."); } private void SpawnShockwaveVfx(Vector3 origin) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) GameObject val = GameObject.CreatePrimitive((PrimitiveType)2); ((Object)val).name = "ShockwaveLanding_VFX"; Object.Destroy((Object)(object)val.GetComponent()); val.transform.position = origin + Vector3.up * 0.02f; val.transform.localScale = new Vector3(0.1f, 0.02f, 0.1f); Renderer component = val.GetComponent(); if ((Object)(object)component != (Object)null) { component.material.color = new Color(1f, 0.5f, 0.1f, 0.6f); } MelonCoroutines.Start(AnimateRing(val, _radius.Value)); } private IEnumerator AnimateRing(GameObject ring, float targetRadius) { float duration = 0.35f; float t = 0f; float startScale = 0.1f; float endScale = targetRadius * 2f; while (t < duration && (Object)(object)ring != (Object)null) { t += Time.deltaTime; float num = t / duration; float num2 = Mathf.Lerp(startScale, endScale, num); ring.transform.localScale = new Vector3(num2, 0.02f, num2); Renderer component = ring.GetComponent(); if ((Object)(object)component != (Object)null) { Color color = component.material.color; color.a = Mathf.Lerp(0.6f, 0f, num); component.material.color = color; } yield return null; } if ((Object)(object)ring != (Object)null) { Object.Destroy((Object)(object)ring); } } } }