The BepInEx console will not appear when launching like it does for other games on Thunderstore. This is normal (and helps prevent crashes during startup). You can turn it back on in your BepInEx.cfg file.
Decompiled source of RopePlus v1.0.0
plugins/ropeplus.dll
Decompiled 5 days agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using HarmonyLib; using Microsoft.CodeAnalysis; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("ropeplus")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("0.1.0.0")] [assembly: AssemblyInformationalVersion("0.1.0")] [assembly: AssemblyProduct("ropeplus")] [assembly: AssemblyTitle("RopePlus")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.1.0.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 BepInEx { [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] [Conditional("CodeGeneration")] internal sealed class BepInAutoPluginAttribute : Attribute { public BepInAutoPluginAttribute(string? id = null, string? name = null, string? version = null) { } } } namespace BepInEx.Preloader.Core.Patching { [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] [Conditional("CodeGeneration")] internal sealed class PatcherAutoPluginAttribute : Attribute { public PatcherAutoPluginAttribute(string? id = null, string? name = null, string? version = null) { } } } namespace RopePlusMod { [BepInPlugin("com.xammen.ropeplus", "Rope Plus Mod", "1.0.0")] public class RopePlusMod : BaseUnityPlugin { [HarmonyPatch(/*Could not decode attribute arguments.*/)] public static class RopeMaxSegmentsPatch { public static void Postfix(ref int __result) { __result = 50; } } [HarmonyPatch(typeof(RopeSpool), "DefaultFuel")] public static class RopeSpoolDefaultFuelPatch { public static void Postfix(ref FloatItemData __result) { __result.Value = 200f; } } [HarmonyPatch(/*Could not decode attribute arguments.*/)] public static class RopeFuelGetterPatch { public static void Postfix(RopeSpool __instance, ref float __result) { } } [HarmonyPatch(/*Could not decode attribute arguments.*/)] public static class RopeFuelSetterPatch { public static void Prefix(RopeSpool __instance, ref float value) { if (value > 200f) { value = 200f; } if (value < 0f) { value = 0f; } } } [HarmonyPatch(typeof(RopeSpool), "Awake")] public static class RopeSpoolAwakePatch { public static void Postfix(RopeSpool __instance) { FieldInfo fieldInfo = AccessTools.Field(typeof(RopeSpool), "ropeStartFuel"); if (fieldInfo != null) { fieldInfo.SetValue(__instance, 200f); } FloatItemData data = ((ItemComponent)__instance).GetData<FloatItemData>((DataEntryKey)10, (Func<FloatItemData>)(() => new FloatItemData { Value = 200f })); if (data.Value > 200f) { data.Value = 200f; } if (data.Value < 0f) { data.Value = 0f; } } } [HarmonyPatch(typeof(RopeSpool), "OnInstanceDataSet")] public static class RopeSpoolDataSetPatch { public static void Postfix(RopeSpool __instance) { } } [HarmonyPatch(typeof(RopeShooter), "OnPrimaryFinishedCast")] public static class RopeShooterCastPatch { public static void Prefix(RopeShooter __instance) { FieldInfo fieldInfo = AccessTools.Field(typeof(RopeShooter), "length"); if (fieldInfo != null) { fieldInfo.SetValue(__instance, 50); } } } [HarmonyPatch(typeof(RopeAnchorWithRope), "SpawnRope")] public static class RopeAnchorWithRopePatch { public static void Prefix(RopeAnchorWithRope __instance) { FieldInfo fieldInfo = AccessTools.Field(typeof(RopeAnchorWithRope), "ropeSegmentLength"); if (fieldInfo != null) { fieldInfo.SetValue(__instance, 50); } } } [HarmonyPatch(typeof(RopeBoneVisualizer), "Awake")] public static class RopeBoneVisualizerAwakePatch { public static void Postfix(RopeBoneVisualizer __instance) { FieldInfo fieldInfo = AccessTools.Field(typeof(RopeBoneVisualizer), "bones"); FieldInfo fieldInfo2 = AccessTools.Field(typeof(RopeBoneVisualizer), "boneRoot"); if (fieldInfo == null || fieldInfo2 == null) { return; } List<Transform> list = fieldInfo.GetValue(__instance) as List<Transform>; object? value = fieldInfo2.GetValue(__instance); Transform val = (Transform)((value is Transform) ? value : null); if (list == null || (Object)(object)val == (Object)null) { return; } int count = list.Count; int num = 50; if (count < num) { Transform val2 = list.Last(); for (int i = count; i < num; i++) { Transform val3 = Object.Instantiate<Transform>(val2, val); ((Object)val3).name = $"ExtraBone_{i}"; list.Add(val3); } } } } [HarmonyPatch(typeof(RopeBoneVisualizer), "LateUpdate")] public static class RopeBoneVisualizerColorPatch { public static void Postfix(RopeBoneVisualizer __instance) { //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Expected O, but got Unknown //IL_00cc: Unknown result type (might be due to invalid IL or missing references) FieldInfo fieldInfo = AccessTools.Field(typeof(RopeBoneVisualizer), "bones"); FieldInfo fieldInfo2 = AccessTools.Field(typeof(RopeBoneVisualizer), "meshRenderer"); if (fieldInfo == null || fieldInfo2 == null) { return; } List<Transform> list = fieldInfo.GetValue(__instance) as List<Transform>; object? value = fieldInfo2.GetValue(__instance); SkinnedMeshRenderer val = (SkinnedMeshRenderer)((value is SkinnedMeshRenderer) ? value : null); if (list != null && !((Object)(object)val == (Object)null) && list.Count != 0) { int num = ((Renderer)val).materials.Length - 1; int num2 = Mathf.Min(new int[3] { 49, list.Count - 1, num }); if (num2 >= 0 && num2 <= num) { MaterialPropertyBlock val2 = new MaterialPropertyBlock(); ((Renderer)val).GetPropertyBlock(val2, num2); val2.SetColor("_Color", new Color(0.4f, 0.2f, 0.05f)); ((Renderer)val).SetPropertyBlock(val2, num2); } } } } private const int MaxSegments = 50; private const float RopeDurability = 200f; private void Awake() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) ((BaseUnityPlugin)this).Logger.LogInfo((object)"Rope Plus Mod loaded !"); new Harmony("com.xammen.ropeplus").PatchAll(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Patches appliqués avec succès !"); } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } }