Latest versions of MelonLoader are known to have issues with some games. Use version 0.5.4 until the issue has been fixed!
Decompiled source of SpiderLab v1.0.2
Mods/SpiderLab.dll
Decompiled a year agousing System; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BoneLib; using BoneLib.BoneMenu; using BoneLib.BoneMenu.Elements; using HarmonyLib; using MelonLoader; using MelonLoader.Preferences; using SLZ; using SLZ.Interaction; using SLZ.Marrow.Input; using SLZ.Marrow.Utilities; using SLZ.Rig; using SLZ.SaveData; using SLZ.VRMK; using SpiderLab; using SpiderLab.Behaviours; using SpiderLab.Data; using SpiderLab.Preferences; using SpiderLab.Utils; using UnhollowerBaseLib; using UnhollowerRuntimeLib; using UnityEngine; using UnityEngine.XR; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("SpiderLab")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany(null)] [assembly: AssemblyProduct("SpiderLab")] [assembly: AssemblyCopyright("Created by Parzival")] [assembly: AssemblyTrademark(null)] [assembly: ComVisible(false)] [assembly: AssemblyFileVersion("1.0.2")] [assembly: NeutralResourcesLanguage("en")] [assembly: MelonInfo(typeof(Main), "SpiderLab", "1.0.2", "Parzival", "https://bonelab.thunderstore.io/package/Parzival/SpiderLab/")] [assembly: MelonGame("Stress Level Zero", "BONELAB")] [assembly: MelonIncompatibleAssemblies(new string[] { "SpiderlectricBoogaloo", "AvatarStatsLoader", "StatOverride" })] [assembly: MelonAdditionalDependencies(new string[] { "BoneLib" })] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("1.0.2.0")] namespace SpiderLab { public static class BuildInfo { public const string Name = "SpiderLab"; public const string Author = "Parzival"; public const string Company = null; public const string Version = "1.0.2"; public const string DownloadLink = "https://bonelab.thunderstore.io/package/Parzival/SpiderLab/"; public const string GameName = "BONELAB"; public const string DeveloperName = "Stress Level Zero"; } public class Main : MelonMod { public override void OnInitializeMelon() { Prefs.Initialize(); Patches.Initialize(); Bundles.LoadAssets(); Hooking.OnLevelInitialized += OnLevelInitialized; } public override void OnDeinitializeMelon() { Prefs.prefsCategory.SaveToFile(true); } private void OnLevelInitialized(LevelInfo info) { if (Player.handsExist) { if ((Object)(object)((Component)Player.leftHand).gameObject.GetComponent<WebShooter>() == (Object)null) { ((Component)Player.leftHand).gameObject.AddComponent<WebShooter>(); } if ((Object)(object)((Component)Player.rightHand).gameObject.GetComponent<WebShooter>() == (Object)null) { ((Component)Player.rightHand).gameObject.AddComponent<WebShooter>(); } ((Component)Player.GetPhysicsRig()).gameObject.AddComponent<AirControl>(); } else { MelonLogger.Warning("Couldn't init WebShooters, hands don't exist!"); } } private void LogAvatarInfo(Avatar avatar) { Msg("==========================="); Msg("Name: " + ((Object)avatar).name); Msg("Pointer: " + ((Il2CppObjectBase)avatar).Pointer.ToString("x")); Msg("Strength Boost: " + Prefs.enableSpiderStrength.Value); Msg("Mass: " + avatar.massTotal); Msg("Strength Upper: " + avatar.strengthUpper); Msg("Strength Lower: " + avatar.strengthLower); float num = avatar.strengthUpper / avatar.massTotal; Msg("Strength Upper to Total Mass: " + num); Msg("Strength % of Mass: " + num * 100f); Msg("Raw Strength Upper: " + avatar.strengthUpper / (avatar.massTotal / 75f)); static void Msg(string txt) { MelonLogger.Msg(txt); } } } internal static class Patches { public static void Initialize() { Hooking.CreateHook(typeof(WorldGrip).GetMethod("ValidateGripScore", AccessTools.all), typeof(Patches).GetMethod("WorldGripScorePostfix", AccessTools.all), false); Hooking.CreateHook(typeof(PhysicsRig).GetMethod("SetAvatar", AccessTools.all), typeof(Patches).GetMethod("PhysicsRigSetAvatarPrefix", AccessTools.all), true); } private static void WorldGripScorePostfix(Hand hand, SimpleTransform handTransform, ref float __result, WorldGrip __instance) { //IL_0013: 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_0029: 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_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) if (Prefs.enableWallCrawling.Value) { Vector3 val = hand.palmPositionTransform.position - __instance.genericHandStates[hand].raycastPoint; Vector3 normalized = ((Vector3)(ref val)).normalized; if (Vector3.Dot(-normalized, hand.palmPositionTransform.forward) >= 0.75f) { __instance.genericHandStates[hand].raycastNormal = normalized; __result = 1.5f; } } } private static void PhysicsRigSetAvatarPrefix(Avatar avatar) { if (Prefs.enableSpiderStrength.Value) { float num = Prefs.upperProportionalStrengthPerc.Value / 100f * avatar.massTotal * Prefs.upperStrengthBoostMultiplier.Value; avatar._strengthUpper = Mathf.Max(num, avatar._strengthUpper); float num2 = Prefs.lowerProportionalStrengthPerc.Value / 100f * avatar.massTotal * Prefs.lowerStrengthBoostMultiplier.Value; avatar._strengthLower = Mathf.Max(num2, avatar._strengthLower); } } } } namespace SpiderLab.Utils { public struct BoolTimer { private float resetTime; public void Set(float time, bool overwrite = false) { if (overwrite) { resetTime = Time.time + time; } else { resetTime = Mathf.Max(resetTime, Time.time + time); } } public void Reset() { resetTime = Time.time - 1f; } public bool GetValue() { return Time.time <= resetTime; } public static implicit operator bool(BoolTimer bt) { return bt.GetValue(); } } public static class ControllerInfo { public static bool GetTouchpadTouch(Handedness hand) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) if (!TryGetXRController(hand, out var controller)) { return false; } if ((int)controller.Type == 0) { InputDevice xrDevice = ((XRDevice)controller)._xrDevice; bool result = default(bool); if (((InputDevice)(ref xrDevice)).TryGetFeatureValue(CommonUsages.thumbrest, ref result)) { return result; } } return controller.TouchpadTouch; } public static bool GetFaceButtonsTouch(Handedness hand) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) if (!TryGetXRController(hand, out var controller)) { return false; } if (controller.ATouch) { return controller.BTouch; } return false; } public static float GetTrigger(Handedness hand) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) if (!TryGetXRController(hand, out var controller)) { return 0f; } return controller.Trigger; } private static bool TryGetXRController(Handedness hand, out XRController controller) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Invalid comparison between Unknown and I4 //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Invalid comparison between Unknown and I4 if ((int)hand != 1) { if ((int)hand == 2) { controller = MarrowGame.xr.RightController; return true; } MelonLogger.Error("Invalid hand type: " + ((object)(Handedness)(ref hand)).ToString()); controller = null; return false; } controller = MarrowGame.xr.LeftController; return true; } } public static class GeneralExtensions { public static void MatchRotation(this ref Vector3 vector, Vector3 target, float maxRadiansDelta, float maxMagnitudeDelta) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) vector = Vector3.RotateTowards(vector, target, maxRadiansDelta, maxMagnitudeDelta); } public static void PointTowards(this ref Vector3 vector, Vector3 target, float maxRadiansDelta) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) vector = Vector3.RotateTowards(vector, target - vector, maxRadiansDelta, 0f); } public static GameObject CreateChild(this GameObject go, string name, Vector3 localPosition = default(Vector3)) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Expected O, but got Unknown //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject(name); val.transform.SetParent(go.transform); if (localPosition == default(Vector3)) { localPosition = Vector3.zero; } val.transform.localPosition = localPosition; return val; } public static bool IsStaticLayer(this GameObject obj) { return (obj.layer & 0x2000) > 0; } } public static class AssetBundleExtensions { public static T LoadAssetWithFlags<T>(this AssetBundle bundle, string name) where T : Object { T val = bundle.LoadAsset<T>(name); ((Object)val).hideFlags = (HideFlags)32; return val; } public static T LoadAsset<T>(this AssetBundle bundle, string name) where T : Object { return ((Il2CppObjectBase)bundle.LoadAsset(name, Il2CppType.Of<T>(true))).Cast<T>(); } } public static class JointExtensions { public static Vector3 GetConnectedPoint(this ConfigurableJoint joint) { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)((Joint)joint).connectedBody != (Object)null) { return ((Component)((Joint)joint).connectedBody).transform.TransformPoint(((Joint)joint).connectedAnchor); } return ((Joint)joint).connectedAnchor; } public static void SetConnectedPoint(this ConfigurableJoint joint, Vector3 worldPoint) { //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) ((Joint)joint).autoConfigureConnectedAnchor = false; if ((Object)(object)((Joint)joint).connectedBody != (Object)null) { ((Joint)joint).connectedAnchor = ((Component)((Joint)joint).connectedBody).transform.InverseTransformPoint(worldPoint); } else { ((Joint)joint).connectedAnchor = worldPoint; } } public static Vector3 GetAnchorPoint(this ConfigurableJoint joint) { //IL_0007: 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 ((Component)joint).transform.TransformPoint(((Joint)joint).anchor); } public static void SetAnchorPoint(this ConfigurableJoint joint, Vector3 worldPoint) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) ((Joint)joint).anchor = ((Component)joint).transform.InverseTransformPoint(worldPoint); } public static Vector3 GetTargetPosition(this ConfigurableJoint joint) { //IL_0007: 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 ((Component)joint).transform.TransformPoint(joint.targetPosition); } public static void SetTargetPosition(this ConfigurableJoint joint, Vector3 worldPos) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) joint.targetPosition = ((Component)joint).transform.InverseTransformPoint(worldPos); } public static void SetLinearLimit(this ConfigurableJoint joint, float limit, float bounciness) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) SoftJointLimit linearLimit = joint.linearLimit; ((SoftJointLimit)(ref linearLimit)).limit = limit; ((SoftJointLimit)(ref linearLimit)).bounciness = bounciness; joint.linearLimit = linearLimit; } public static void SetLinearMotion(this ConfigurableJoint joint, ConfigurableJointMotion motion) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) joint.xMotion = motion; joint.yMotion = motion; joint.zMotion = motion; } public static void SetSpringLimit(this ConfigurableJoint joint, float spring, float damper) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) SoftJointLimitSpring linearLimitSpring = joint.linearLimitSpring; ((SoftJointLimitSpring)(ref linearLimitSpring)).spring = spring; ((SoftJointLimitSpring)(ref linearLimitSpring)).damper = damper; joint.linearLimitSpring = linearLimitSpring; } public static void SetSpringDrive(this ConfigurableJoint joint, float spring, float damper, float max) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) JointDrive val = default(JointDrive); ((JointDrive)(ref val)).positionSpring = spring; ((JointDrive)(ref val)).positionDamper = damper; ((JointDrive)(ref val)).maximumForce = max; joint.xDrive = val; joint.yDrive = val; joint.zDrive = val; } } } namespace SpiderLab.Preferences { public enum HandGesture { SPIDEY, GRIP } public enum WeblineInput { TOUCHPAD, DOUBLE_TOUCHPAD, DOUBLE_GESTURE, DOUBLE_TRIGGER, DOUBLE_TOUCH_BUTTONS } internal static class Prefs { public static MelonPreferences_Entry<bool> enableAimReticle; public static MelonPreferences_Entry<bool> enableWallCrawling; public static MelonPreferences_Entry<HandGesture> selectedGesture; public static MelonPreferences_Entry<WeblineInput> weblineInput; public static MelonPreferences_Entry<bool> enableWebSwinging; public static MelonPreferences_Entry<float> webzipPullSpeedMin; public static MelonPreferences_Entry<float> webzipStrengthMultiplier; public static MelonPreferences_Entry<bool> enableSpiderStrength; public static MelonPreferences_Entry<float> upperStrengthBoostMultiplier; public static MelonPreferences_Entry<float> upperProportionalStrengthPerc; public static MelonPreferences_Entry<float> lowerStrengthBoostMultiplier; public static MelonPreferences_Entry<float> lowerProportionalStrengthPerc; public static MelonPreferences_Category prefsCategory; public static MenuCategory menuCategory; public static bool WebShootersEnabled => enableWebSwinging.Value; public static float WebzipPullSpeedMax => webzipPullSpeedMin.Value + 1f; public static float WebzipImpulseSpeed => 50f * webzipStrengthMultiplier.Value; public static void Initialize() { prefsCategory = MelonPreferences.CreateCategory("SpiderLab"); selectedGesture = prefsCategory.CreateEntry<HandGesture>("Hand Gesture", HandGesture.GRIP, (string)null, "Required hand gesture for Webshooter inputs to register (SPIDEY, GRIP) (SPIDEY gesture requires finger tracking!)", false, false, (ValueValidator)null, (string)null); weblineInput = prefsCategory.CreateEntry<WeblineInput>("Webline Input", WeblineInput.TOUCHPAD, (string)null, "Input required to shoot a Webline, in addition to Hand Gesture Input (TOUCHPAD, DOUBLE_TOUCHPAD, DOUBLE_GESTURE, DOUBLE_TRIGGER, DOUBLE_TOUCH_BUTTONS) (DOUBLE_TOUCH_BUTTONS requires two face buttons with capacitive touch!)", false, false, (ValueValidator)null, (string)null); enableWallCrawling = prefsCategory.CreateEntry<bool>("Enable Wall Crawling", true, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); enableWebSwinging = prefsCategory.CreateEntry<bool>("Enable Web Swinging", true, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); enableSpiderStrength = prefsCategory.CreateEntry<bool>("Enable Spider Strength", true, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); upperStrengthBoostMultiplier = prefsCategory.CreateEntry<float>("Upper Strength Boost Multiplier", 1f, (string)null, "Controls the how strong the upper-body strength boost is", false, false, (ValueValidator)null, (string)null); upperProportionalStrengthPerc = prefsCategory.CreateEntry<float>("Upper Proportional Strength Percentage", 5f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); lowerStrengthBoostMultiplier = prefsCategory.CreateEntry<float>("Lower Strength Boost Multiplier", 1f, (string)null, "Controls the how strong the lower-body strength boost is", false, false, (ValueValidator)null, (string)null); lowerProportionalStrengthPerc = prefsCategory.CreateEntry<float>("Lower Proportional Strength Percentage", 3.45f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); webzipPullSpeedMin = prefsCategory.CreateEntry<float>("WebZip Minimum Pull Speed", 4f, (string)null, "Minimum pull speed for WebZip to kick in (m/s)", false, false, (ValueValidator)null, (string)null); webzipStrengthMultiplier = prefsCategory.CreateEntry<float>("WebZip Strength Multiplier", 1f, (string)null, "Controls how strong a maxxed WebZip is", false, false, (ValueValidator)null, (string)null); enableAimReticle = prefsCategory.CreateEntry<bool>("Enable Aiming Reticle", true, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); SetupBoneMenu(); prefsCategory.SaveToFile(false); } private static void SetupBoneMenu() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_001e: 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_0071: 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_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Unknown result type (might be due to invalid IL or missing references) //IL_0142: Unknown result type (might be due to invalid IL or missing references) //IL_018f: Unknown result type (might be due to invalid IL or missing references) //IL_01dc: Unknown result type (might be due to invalid IL or missing references) //IL_01f1: Unknown result type (might be due to invalid IL or missing references) //IL_022b: Unknown result type (might be due to invalid IL or missing references) //IL_0248: Unknown result type (might be due to invalid IL or missing references) //IL_0258: Unknown result type (might be due to invalid IL or missing references) //IL_02a0: Unknown result type (might be due to invalid IL or missing references) //IL_02e8: Unknown result type (might be due to invalid IL or missing references) //IL_02f8: Unknown result type (might be due to invalid IL or missing references) //IL_0340: Unknown result type (might be due to invalid IL or missing references) //IL_0392: Unknown result type (might be due to invalid IL or missing references) menuCategory = MenuManager.CreateCategory("SpiderLab", Color.red); MenuCategory obj = menuCategory.CreateCategory("Input", Color.white); obj.CreateEnumElement<HandGesture>(((MelonPreferences_Entry)selectedGesture).Identifier, Color.white, selectedGesture.Value, (Action<HandGesture>)delegate(HandGesture gesture) { selectedGesture.Value = gesture; }); obj.CreateEnumElement<WeblineInput>(((MelonPreferences_Entry)weblineInput).Identifier, Color.white, weblineInput.Value, (Action<WeblineInput>)delegate(WeblineInput webInput) { weblineInput.Value = webInput; }); MenuCategory obj2 = menuCategory.CreateCategory("Web Swinging", Color.white); obj2.CreateBoolElement(((MelonPreferences_Entry)enableAimReticle).Identifier, Color.white, enableAimReticle.Value, (Action<bool>)delegate(bool value) { enableAimReticle.Value = value; }); obj2.CreateBoolElement(((MelonPreferences_Entry)enableWebSwinging).Identifier, Color.white, enableWebSwinging.Value, (Action<bool>)delegate(bool value) { enableWebSwinging.Value = value; }); obj2.CreateFloatElement(((MelonPreferences_Entry)webzipPullSpeedMin).Identifier, Color.white, webzipPullSpeedMin.Value, 0.5f, 0f, 10f, (Action<float>)delegate(float value) { webzipPullSpeedMin.Value = value; }); obj2.CreateFloatElement(((MelonPreferences_Entry)webzipStrengthMultiplier).Identifier, Color.white, webzipStrengthMultiplier.Value, 0.2f, 0f, 10f, (Action<float>)delegate(float value) { webzipStrengthMultiplier.Value = value; }); MenuCategory obj3 = menuCategory.CreateCategory("Spider Strength", Color.white); obj3.CreateBoolElement(((MelonPreferences_Entry)enableSpiderStrength).Identifier, Color.white, enableSpiderStrength.Value, (Action<bool>)delegate(bool value) { enableSpiderStrength.Value = value; }); obj3.CreateFunctionElement("Update Stats", Color.yellow, (Action)UpdateStrengthStats); SubPanelElement obj4 = obj3.CreateSubPanel("Upper Strength", Color.white); obj4.CreateFloatElement("Strength Boost Multiplier", Color.white, upperStrengthBoostMultiplier.Value, 0.1f, 0f, 100f, (Action<float>)delegate(float value) { upperStrengthBoostMultiplier.Value = value; }); obj4.CreateFloatElement("Proportional Strength Percentage", Color.white, upperProportionalStrengthPerc.Value, 1f, 0f, 100f, (Action<float>)delegate(float value) { upperProportionalStrengthPerc.Value = value; }); SubPanelElement obj5 = obj3.CreateSubPanel("Lower Strength", Color.white); obj5.CreateFloatElement("Strength Boost Multiplier", Color.white, lowerStrengthBoostMultiplier.Value, 0.1f, 0f, 100f, (Action<float>)delegate(float value) { lowerStrengthBoostMultiplier.Value = value; }); obj5.CreateFloatElement("Proportional Strength Percentage", Color.white, lowerProportionalStrengthPerc.Value, 1f, 0f, 100f, (Action<float>)delegate(float value) { lowerProportionalStrengthPerc.Value = value; }); menuCategory.CreateBoolElement(((MelonPreferences_Entry)enableWallCrawling).Identifier, Color.white, enableWallCrawling.Value, (Action<bool>)delegate(bool value) { enableWallCrawling.Value = value; }); } public static void UpdateStrengthStats() { Player.GetPhysicsRig().SetAvatar(Player.GetCurrentAvatar()); } } } namespace SpiderLab.Data { internal static class Bundles { public static AssetBundle spiderLabBundle; public static GameObject webLinePrefab; public static GameObject webShooterReticlePrefab; public static AudioClip webLineAudioLow; public static AudioClip webLineAudioHigh; public static AudioClip webShotAudioLow; public static AudioClip webShotAudioHigh; public static void LoadAssets() { spiderLabBundle = EmebeddedAssetBundle.LoadFromAssembly(Assembly.GetExecutingAssembly(), "SpiderLab.src.Data.spiderlab.bundle"); if ((Object)(object)spiderLabBundle == (Object)null) { throw new NullReferenceException("SpiderLab bundle is null! Did you forget to compile the bundle into the dll?"); } webLinePrefab = spiderLabBundle.LoadAssetWithFlags<GameObject>("prefabs/webline"); webShooterReticlePrefab = spiderLabBundle.LoadAssetWithFlags<GameObject>("prefabs/webshooterreticle"); webLineAudioHigh = spiderLabBundle.LoadAssetWithFlags<AudioClip>("audio/webline_high"); webLineAudioLow = spiderLabBundle.LoadAssetWithFlags<AudioClip>("audio/webline_low"); webShotAudioHigh = spiderLabBundle.LoadAssetWithFlags<AudioClip>("audio/webshot_high"); webShotAudioLow = spiderLabBundle.LoadAssetWithFlags<AudioClip>("audio/webshot_low"); spiderLabBundle.Unload(false); } } public static class EmebeddedAssetBundle { public static AssetBundle LoadFromAssembly(Assembly assembly, string name) { if (assembly.GetManifestResourceNames().Contains(name)) { MelonLogger.Msg(ConsoleColor.DarkCyan, "Loading embedded bundle " + name + "..."); byte[] array; using (Stream stream = assembly.GetManifestResourceStream(name)) { using MemoryStream memoryStream = new MemoryStream(); stream.CopyTo(memoryStream); array = memoryStream.ToArray(); } MelonLogger.Msg(ConsoleColor.DarkCyan, "Done!"); return AssetBundle.LoadFromMemory(Il2CppStructArray<byte>.op_Implicit(array)); } MelonLogger.Warning("Missing embedded bundle " + name); return null; } } } namespace SpiderLab.Behaviours { [RegisterTypeInIl2Cpp] public class AirControl : MonoBehaviour { private RigManager rigMan; public AirControl(IntPtr ptr) : base(ptr) { } private void Start() { rigMan = Player.rigManager; } private void FixedUpdate() { //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)rigMan.activeSeat != (Object)null) && !rigMan.physicsRig.physG.isGrounded) { Vector2 val = (rigMan.ControllerRig.isRightHanded ? Player.leftHand.Controller.GetThumbStickAxis() : Player.rightHand.Controller.GetThumbStickAxis()); Vector3 val2 = rigMan.ControllerRig.directionMasterTransform.rotation * new Vector3(val.x, 0f, val.y) * 12f; rigMan.physicsRig.torso.rbChest.AddForce(val2, (ForceMode)5); } } } [RegisterTypeInIl2Cpp] public class WebLine : MonoBehaviour { public Vector3 anchorPoint; public Vector3 connectedPoint; private LineRenderer lRenderer; public WebLine(IntPtr ptr) : base(ptr) { } private void Start() { lRenderer = ((Component)this).GetComponent<LineRenderer>(); } public void SetActive(bool value) { ((Renderer)lRenderer).enabled = value; } public void UpdateLine(Vector3 anchorPoint, Vector3 connectedPoint) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) this.anchorPoint = anchorPoint; this.connectedPoint = connectedPoint; UpdateLine(); } public void UpdateLine() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) lRenderer.SetPosition(0, anchorPoint); lRenderer.SetPosition(1, connectedPoint); } public Vector3 GetLineSegment() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: 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 connectedPoint - anchorPoint; } public Vector3 GetNormal() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) Vector3 lineSegment = GetLineSegment(); return ((Vector3)(ref lineSegment)).normalized; } } [RegisterTypeInIl2Cpp] public class WebShooter : MonoBehaviour { private const float YOUNGS_MODULUS = 2E+11f; private const float WEB_CROSS_SECTIONAL_AREA = 0.0001767f; private const float LINEAR_SPRING_CONSTANT = 1372344f / (float)Math.E; private const float LINEAR_SPRING_DAMPER = 50485.715f; private float WEB_BREAK_FORCE = 1000000f; private const float MAX_WEB_RANGE = 70f; private const float LINEAR_DRIVE_SPRING = 500f; private const float LINEAR_DRIVE_DAMPER = 1f; private const float LINEAR_DRIVE_MAX = 2500f; public bool doWebWrapping; private LayerMask layerMask = LayerMask.op_Implicit(46081); private WebLine webLine; private Hand hand; private Transform aimReticle; private AudioSource audioSource; private float webLine_lowestLength; private ConfigurableJoint webJoint; private Collider webbedCollider; private BoolTimer isWebShotBtnPressMomentary; private BoolTimer weblineDoubleTap; private bool weblineLastDoubleTapState; private BoolTimer webzipCooldown; private Vector3 lastControllerPos; private const int ROLLING_AVERAGE_VELOCITY_MAX = 8; private Vector3[] controllerVelocities = (Vector3[])(object)new Vector3[8]; private int rollingAverageVelIndex; public WebShooter(IntPtr ptr) : base(ptr) { }//IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) private void Start() { hand = ((Component)this).GetComponent<Hand>(); webLine = Object.Instantiate<GameObject>(Bundles.webLinePrefab, ((Component)this).transform).AddComponent<WebLine>(); aimReticle = Object.Instantiate<GameObject>(Bundles.webShooterReticlePrefab).transform; audioSource = ((Component)this).gameObject.AddComponent<AudioSource>(); audioSource.playOnAwake = false; audioSource.minDistance = 0.5f; audioSource.spatialBlend = 1f; } private void LateUpdate() { if (!Prefs.WebShootersEnabled) { ((Component)aimReticle).gameObject.SetActive(false); if (IsWebAttatched()) { DestroyWebJoint(); } } else if (IsWebAttatched()) { UpdateWeb(); } else { webLine.SetActive(value: false); HandleAiming(); } } private void UpdateWeb() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //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_0025: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0166: Unknown result type (might be due to invalid IL or missing references) //IL_016d: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: 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_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) Vector3 val = webJoint.GetConnectedPoint(); Vector3 anchorPoint = webJoint.GetAnchorPoint(); Vector3 val2; if (doWebWrapping) { val2 = val - anchorPoint; RaycastHit val3 = default(RaycastHit); if (Physics.Raycast(anchorPoint, ((Vector3)(ref val2)).normalized, ref val3, 70f, LayerMask.op_Implicit(layerMask), (QueryTriggerInteraction)1) && ((Component)((RaycastHit)(ref val3)).collider).gameObject.isStatic && (((RaycastHit)(ref val3)).colliderInstanceID != ((Object)webbedCollider).GetInstanceID() || Vector3.Distance(((RaycastHit)(ref val3)).point, val) > 0.01f)) { ((Joint)webJoint).connectedBody = ((RaycastHit)(ref val3)).rigidbody; webJoint.SetConnectedPoint(((RaycastHit)(ref val3)).point); val = ((RaycastHit)(ref val3)).point; } } webLine.UpdateLine(hand.palmPositionTransform.position, val); val2 = val - anchorPoint; float magnitude = ((Vector3)(ref val2)).magnitude; if (magnitude < webLine_lowestLength) { webJoint.SetLinearLimit(magnitude, 1f); webLine_lowestLength = magnitude; } if (((Object)(object)webbedCollider.attachedRigidbody == (Object)null || webbedCollider.attachedRigidbody.mass >= Player.GetCurrentAvatar().massTotal * 10f) && IsYanking(out var intensity)) { float num = Prefs.WebzipImpulseSpeed * intensity; Player.rigManager.physicsRig.torso.rbChest.AddForce(webLine.GetNormal() * num, (ForceMode)2); hand.Controller.haptor.Haptic_Knock(); webzipCooldown.Set(1f); } if (!IsPlayerGesturing(HandGesture.GRIP) || (Object)(object)webbedCollider == (Object)null || !((Component)webbedCollider).gameObject.activeInHierarchy) { DestroyWebJoint(); } } private bool IsYanking(out float intensity) { //IL_000f: 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_002a: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: 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_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Unknown result type (might be due to invalid IL or missing references) Vector3 val = ((ControllerRig)Player.rigManager.openControllerRig).vrRoot.rotation * ((((Component)hand.Controller).transform.localPosition - lastControllerPos) / Time.deltaTime); lastControllerPos = ((Component)hand.Controller).transform.localPosition; controllerVelocities[rollingAverageVelIndex] = val; rollingAverageVelIndex = (rollingAverageVelIndex + 1) % 8; intensity = 0f; if ((bool)webzipCooldown) { return false; } Vector3 val2 = Vector3.zero; Vector3[] array = controllerVelocities; foreach (Vector3 val3 in array) { val2 += val3; } val2 /= (float)controllerVelocities.Length; if (Vector3.Dot(-webLine.GetNormal(), ((Vector3)(ref val2)).normalized) >= 0.4f && ((Vector3)(ref val2)).sqrMagnitude >= Prefs.webzipPullSpeedMin.Value * Prefs.webzipPullSpeedMin.Value) { float num = Mathf.InverseLerp(Prefs.webzipPullSpeedMin.Value, Prefs.WebzipPullSpeedMax, ((Vector3)(ref val2)).magnitude); intensity = 1f - Mathf.Pow(1f - Mathf.Clamp01(num), 3f); return true; } return false; } private void HandleAiming() { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)Player.GetObjectInHand(hand) != (Object)null) { ToggleReticle(value: false); return; } aimReticle.rotation = Quaternion.LookRotation(Player.playerHead.forward); RaycastHit hit = default(RaycastHit); if (Physics.SphereCast(((Component)this).transform.position, 0.07f, ((Component)this).transform.forward, ref hit, 70f, LayerMask.op_Implicit(layerMask), (QueryTriggerInteraction)1)) { aimReticle.position = ((RaycastHit)(ref hit)).point; ToggleReticle(value: true); if (CanShootWebLine()) { CreateWebJoint(hit); PlayAudio(Bundles.webLineAudioHigh, Bundles.webLineAudioLow); hand.Controller.haptor.Haptic_Tap(); ToggleReticle(value: false); } } else { ToggleReticle(value: false); } } private void ToggleReticle(bool value) { ((Component)aimReticle).gameObject.SetActive(Prefs.enableAimReticle.Value && value); } private bool CheckDoubleTapWebline(bool currentState) { bool result = false; if (currentState && !weblineLastDoubleTapState) { if ((bool)weblineDoubleTap) { weblineDoubleTap.Reset(); result = true; } else { weblineDoubleTap.Set(0.25f, overwrite: true); } } weblineLastDoubleTapState = currentState; return result; } private bool CanShootWebLine() { //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) if (!Prefs.enableWebSwinging.Value) { return false; } switch (Prefs.weblineInput.Value) { case WeblineInput.TOUCHPAD: if (ControllerInfo.GetTouchpadTouch(hand.handedness)) { return IsPlayerGesturing(Prefs.selectedGesture.Value); } return false; case WeblineInput.DOUBLE_TOUCHPAD: if (CheckDoubleTapWebline(ControllerInfo.GetTouchpadTouch(hand.handedness))) { return IsPlayerGesturing(Prefs.selectedGesture.Value); } return false; case WeblineInput.DOUBLE_GESTURE: return CheckDoubleTapWebline(IsPlayerGesturing(Prefs.selectedGesture.Value)); case WeblineInput.DOUBLE_TRIGGER: if (CheckDoubleTapWebline(ControllerInfo.GetTrigger(hand.handedness) >= 0.75f)) { return IsPlayerGesturing(Prefs.selectedGesture.Value); } return false; case WeblineInput.DOUBLE_TOUCH_BUTTONS: if (CheckDoubleTapWebline(ControllerInfo.GetFaceButtonsTouch(hand.handedness))) { return IsPlayerGesturing(Prefs.selectedGesture.Value); } return false; default: return false; } } private bool CanShootWebShot() { if (!IsWebAttatched() && IsPlayerGesturing(Prefs.selectedGesture.Value)) { if (!hand.Controller.GetBButtonDown()) { if (hand.Controller.GetBButtonUp()) { return isWebShotBtnPressMomentary; } return false; } isWebShotBtnPressMomentary.Set(0.2f); } return false; } private bool IsPlayerGesturing(HandGesture gesture) { if ((Object)(object)Player.GetObjectInHand(hand) != (Object)null || hand.Skeleton.IsSnatching()) { return false; } BaseController controller = hand.Controller; switch (gesture) { case HandGesture.SPIDEY: if (controller.GetIndexCurlAxis() <= 0.3f && controller.GetMiddleCurlAxis() >= 0.7f && controller.GetRingCurlAxis() >= 0.7f) { return controller.GetPinkyCurlAxis() <= 0.3f; } return false; case HandGesture.GRIP: return controller.GetIndexCurlAxis() + controller.GetMiddleCurlAxis() + controller.GetRingCurlAxis() + controller.GetPinkyCurlAxis() >= 1.4f; default: return false; } } private bool IsWebAttatched() { return (Object)(object)webJoint != (Object)null; } private void CreateWebJoint(RaycastHit hit) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Unknown result type (might be due to invalid IL or missing references) webJoint = ((Component)this).gameObject.AddComponent<ConfigurableJoint>(); ((Joint)webJoint).connectedBody = ((RaycastHit)(ref hit)).rigidbody; webJoint.SetAnchorPoint(((Component)this).transform.position); webJoint.SetConnectedPoint(((RaycastHit)(ref hit)).point); webJoint.SetLinearMotion((ConfigurableJointMotion)1); webJoint.SetLinearLimit(((RaycastHit)(ref hit)).distance + 0.075f, 1f); webLine_lowestLength = ((RaycastHit)(ref hit)).distance; webJoint.SetSpringLimit(1372344f / (float)Math.E, 50485.715f); webJoint.SetSpringDrive(0f, 0f, 0f); ((Joint)webJoint).breakForce = WEB_BREAK_FORCE; ((Joint)webJoint).enableCollision = true; webbedCollider = ((RaycastHit)(ref hit)).collider; webLine.SetActive(value: true); webLine.UpdateLine(hand.palmPositionTransform.position, ((RaycastHit)(ref hit)).point); } private void DestroyWebJoint() { if ((Object)(object)webJoint != (Object)null) { webLine.SetActive(value: false); Object.Destroy((Object)(object)webJoint); } } private void PlayAudio(AudioClip high, AudioClip low) { AudioClip val = ((Random.value > 0.5f) ? high : low); float num = 0.5f * (DataManager.ActiveSave.PlayerSettings.VolumeSFX / 10f); audioSource.loop = false; audioSource.PlayOneShot(val, num); } } }