using System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BoneLib; using BoneLib.BoneMenu; using Il2CppSLZ.VRMK; using MelonLoader; using MelonLoader.Preferences; using Microsoft.CodeAnalysis; using TitanStrength; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: MelonInfo(typeof(TitanStrengthMod), "Titan Strength", "1.0.0", "ChappieStudios", null)] [assembly: MelonGame("Stress Level Zero", "BONELAB")] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] [assembly: AssemblyCompany("TitanStrength")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("TitanStrength")] [assembly: AssemblyTitle("TitanStrength")] [assembly: AssemblyVersion("1.0.0.0")] [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.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace TitanStrength { public sealed class TitanStrengthMod : MelonMod { private const float MenuStep = 5f; private const float MenuMin = 1f; private const float MenuMax = float.MaxValue; private MelonPreferences_Category _category; private MelonPreferences_Entry _enabled; private MelonPreferences_Entry _strengthMultiplier; private MelonPreferences_Entry _physHandMultiplier; private readonly Dictionary _originalValues = new Dictionary(); private float _nextApplyTime; private bool _menuRegistered; public override void OnInitializeMelon() { _category = MelonPreferences.CreateCategory("TitanStrength"); _enabled = _category.CreateEntry("Enabled", true, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _strengthMultiplier = _category.CreateEntry("AvatarStrengthMultiplier", 50f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _physHandMultiplier = _category.CreateEntry("HandForceMultiplier", 30f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); RegisterBoneMenu(); ((MelonBase)this).LoggerInstance.Msg("Titan Strength loaded. BoneMenu toggle is under Mods > Titan Strength. F8 toggles it too."); } public override void OnUpdate() { if (Input.GetKeyDown((KeyCode)289)) { SetEnabled(!_enabled.Value); } if (!(Time.time < _nextApplyTime)) { _nextApplyTime = Time.time + 0.75f; if (_enabled.Value) { ApplyStrength(); } else { RestoreOriginals(); } } } public override void OnDeinitializeMelon() { RestoreOriginals(); } private void RegisterBoneMenu() { //IL_0023: 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_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Unknown result type (might be due to invalid IL or missing references) if (_menuRegistered) { return; } try { Page obj = Page.Root.CreatePage("Titan Strength", new Color(1f, 0.25f, 0.05f), 0, true); obj.CreateBool("Enabled", Color.green, _enabled.Value, (Action)SetEnabled); obj.CreateFloat("Avatar Strength", Color.yellow, _strengthMultiplier.Value, 5f, 1f, float.MaxValue, (Action)delegate(float value) { _strengthMultiplier.Value = value; _category.SaveToFile(false); if (_enabled.Value) { ClearCachedOriginalsForReapply(); ApplyStrength(); } }); obj.CreateFloat("Hand Force", Color.cyan, _physHandMultiplier.Value, 5f, 1f, float.MaxValue, (Action)delegate(float value) { _physHandMultiplier.Value = value; _category.SaveToFile(false); if (_enabled.Value) { ClearCachedOriginalsForReapply(); ApplyStrength(); } }); obj.CreateFunction("Reapply Now", Color.white, (Action)ApplyStrength); _menuRegistered = true; } catch (Exception ex) { ((MelonBase)this).LoggerInstance.Warning("BoneMenu registration failed, F8 fallback still works: " + ex.Message); } } private void SetEnabled(bool enabled) { _enabled.Value = enabled; _category.SaveToFile(false); if (enabled) { ApplyStrength(); ((MelonBase)this).LoggerInstance.Msg("Titan Strength enabled."); } else { RestoreOriginals(); ((MelonBase)this).LoggerInstance.Msg("Titan Strength disabled."); } } private void ApplyStrength() { Avatar avatar = Player.Avatar; if ((Object)(object)avatar != (Object)null) { BoostFloatProperty(avatar, "_strengthUpper", _strengthMultiplier.Value); BoostFloatProperty(avatar, "_strengthLower", _strengthMultiplier.Value); BoostFloatProperty(avatar, "_strengthGrip", _strengthMultiplier.Value); } BoostHand(Player.LeftHand, "Left"); BoostHand(Player.RightHand, "Right"); } private void BoostHand(object hand, string side) { if (hand != null) { InvokeIfExists(hand, "SetGripStrength", _strengthMultiplier.Value); object propertyOrField = GetPropertyOrField(hand, "physHand"); if (propertyOrField != null) { BoostFloatProperty(propertyOrField, "_forceMultiplier", _physHandMultiplier.Value, side + "."); BoostFloatProperty(propertyOrField, "gripMult", _strengthMultiplier.Value, side + "."); BoostFloatProperty(propertyOrField, "xPosForce", _physHandMultiplier.Value, side + "."); BoostFloatProperty(propertyOrField, "xNegForce", _physHandMultiplier.Value, side + "."); BoostFloatProperty(propertyOrField, "yPosForce", _physHandMultiplier.Value, side + "."); BoostFloatProperty(propertyOrField, "yNegForce", _physHandMultiplier.Value, side + "."); BoostFloatProperty(propertyOrField, "zPosForce", _physHandMultiplier.Value, side + "."); BoostFloatProperty(propertyOrField, "zNegForce", _physHandMultiplier.Value, side + "."); } } } private void BoostFloatProperty(object target, string name, float multiplier, string prefix = "") { Type type = target.GetType(); string key = prefix + type.FullName + "." + name; MemberInfo memberInfo = FindPropertyOrField(type, name); if (memberInfo == null) { return; } float? num = ReadFloat(target, memberInfo); if (num.HasValue) { if (!_originalValues.ContainsKey(key)) { _originalValues[key] = num.Value; } float value = Mathf.Max(_originalValues[key] * multiplier, multiplier); WriteFloat(target, memberInfo, value); } } private void RestoreOriginals() { Avatar avatar = Player.Avatar; if ((Object)(object)avatar != (Object)null) { RestoreFloatProperty(avatar, "_strengthUpper"); RestoreFloatProperty(avatar, "_strengthLower"); RestoreFloatProperty(avatar, "_strengthGrip"); } RestoreHand(Player.LeftHand, "Left"); RestoreHand(Player.RightHand, "Right"); } private void RestoreHand(object hand, string side) { if (hand == null) { return; } object propertyOrField = GetPropertyOrField(hand, "physHand"); if (propertyOrField != null) { string[] array = new string[8] { "_forceMultiplier", "gripMult", "xPosForce", "xNegForce", "yPosForce", "yNegForce", "zPosForce", "zNegForce" }; foreach (string name in array) { RestoreFloatProperty(propertyOrField, name, side + "."); } } } private void RestoreFloatProperty(object target, string name, string prefix = "") { Type type = target.GetType(); string key = prefix + type.FullName + "." + name; if (_originalValues.TryGetValue(key, out var value)) { MemberInfo memberInfo = FindPropertyOrField(type, name); if (memberInfo != null) { WriteFloat(target, memberInfo, value); } } } private void ClearCachedOriginalsForReapply() { RestoreOriginals(); _originalValues.Clear(); } private static MemberInfo FindPropertyOrField(Type type, string name) { return (MemberInfo)(((object)type.GetProperty(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)) ?? ((object)type.GetField(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))); } private static float? ReadFloat(object target, MemberInfo member) { try { if (member is PropertyInfo propertyInfo && propertyInfo.PropertyType == typeof(float)) { return (float)propertyInfo.GetValue(target); } if (member is FieldInfo fieldInfo && fieldInfo.FieldType == typeof(float)) { return (float)fieldInfo.GetValue(target); } } catch { } return null; } private static void WriteFloat(object target, MemberInfo member, float value) { try { if (member is PropertyInfo propertyInfo) { if (propertyInfo.CanWrite && propertyInfo.PropertyType == typeof(float)) { propertyInfo.SetValue(target, value); } } else if (member is FieldInfo fieldInfo && fieldInfo.FieldType == typeof(float)) { fieldInfo.SetValue(target, value); } } catch { } } private static object GetPropertyOrField(object target, string name) { MemberInfo memberInfo = FindPropertyOrField(target.GetType(), name); try { if (memberInfo is PropertyInfo propertyInfo) { return propertyInfo.GetValue(target); } if (memberInfo is FieldInfo fieldInfo) { return fieldInfo.GetValue(target); } } catch { } return null; } private static void InvokeIfExists(object target, string name, params object[] args) { try { target.GetType().GetMethod(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)?.Invoke(target, args); } catch { } } } }