using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Localization.Components;
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("GravityControl")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("GravityControl")]
[assembly: AssemblyCopyright("Copyright © 2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("5112b8c7-e2ca-445a-ae0f-80eb05284f9b")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace CustomGravitySetting;
[BepInPlugin("com.morsecodeguy.gravitycontrol", "Gravity Control", "1.0.0")]
public class CustomGravitySettingPlugin : BaseUnityPlugin
{
public static ManualLogSource Log;
public static float[] GravityMultipliers = new float[100];
public static int CurrentIndex = 19;
public static Vector3 OriginalGravity;
public static float CurrentMultiplier => GravityMultipliers[CurrentIndex];
private void Awake()
{
//IL_0035: Unknown result type (might be due to invalid IL or missing references)
//IL_003a: Unknown result type (might be due to invalid IL or missing references)
//IL_0044: Unknown result type (might be due to invalid IL or missing references)
//IL_004a: Expected O, but got Unknown
Log = ((BaseUnityPlugin)this).Logger;
for (int i = 0; i < GravityMultipliers.Length; i++)
{
GravityMultipliers[i] = 0.05f * (float)(i + 1);
}
OriginalGravity = Physics.gravity;
Harmony val = new Harmony("com.morsecodeguy.customgravity");
val.PatchAll();
}
public static void IncreaseMultiplier()
{
if (CurrentIndex < GravityMultipliers.Length - 1)
{
CurrentIndex++;
ApplyGravity();
}
}
public static void DecreaseMultiplier()
{
if (CurrentIndex > 0)
{
CurrentIndex--;
ApplyGravity();
}
}
public static bool TrySetMultiplier(string input)
{
input = input.Replace("x", "").Trim();
if (float.TryParse(input, out var result))
{
int currentIndex = 0;
float num = Mathf.Abs(result - GravityMultipliers[0]);
for (int i = 1; i < GravityMultipliers.Length; i++)
{
float num2 = Mathf.Abs(result - GravityMultipliers[i]);
if (num2 < num)
{
num = num2;
currentIndex = i;
}
}
CurrentIndex = currentIndex;
ApplyGravity();
return true;
}
return false;
}
public static void ApplyGravity()
{
//IL_001b: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
Physics.gravity = new Vector3(0f, OriginalGravity.y * CurrentMultiplier, 0f);
Log.LogInfo((object)$"[CustomGravitySetting] Gravity set to: {Physics.gravity}");
}
}
[HarmonyPatch(typeof(GameSettingsPanel), "Start")]
public static class GameSettingsPanel_Start_Patch
{
private static void Postfix(GameSettingsPanel __instance)
{
//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)
//IL_0215: Unknown result type (might be due to invalid IL or missing references)
//IL_021f: Expected O, but got Unknown
//IL_022e: Unknown result type (might be due to invalid IL or missing references)
//IL_0238: Expected O, but got Unknown
if ((Object)(object)__instance == (Object)null)
{
return;
}
Scene activeScene = SceneManager.GetActiveScene();
string name = ((Scene)(ref activeScene)).name;
if (name == "MainMenu" || name == "MenuMultiplayerSteam")
{
CustomGravitySettingPlugin.CurrentIndex = 19;
CustomGravitySettingPlugin.ApplyGravity();
}
Transform val = ((Component)__instance).transform.Find("MoveSetsPanel/Scroll View/Viewport/Content/TimeScaleMinSettingButtonOptionPanel");
if ((Object)(object)val == (Object)null)
{
Debug.LogError((object)"[CustomGravitySetting] Template panel not found!");
return;
}
Transform val2 = Object.Instantiate<Transform>(val, val.parent);
((Object)val2).name = "GravitySettingButtonOptionPanel";
val2.SetSiblingIndex(val.GetSiblingIndex() + 1);
ButtonOptionSelect component = ((Component)val2).GetComponent<ButtonOptionSelect>();
if ((Object)(object)component != (Object)null)
{
Object.Destroy((Object)(object)component);
}
Transform val3 = val2.Find("Text (Legacy)");
if ((Object)(object)val3 != (Object)null)
{
Text component2 = ((Component)val3).GetComponent<Text>();
if ((Object)(object)component2 != (Object)null)
{
component2.text = "Gravity Scale";
}
LocalizeStringEvent component3 = ((Component)val3).GetComponent<LocalizeStringEvent>();
if ((Object)(object)component3 != (Object)null)
{
Object.Destroy((Object)(object)component3);
}
}
Transform obj = val2.Find("NextButton");
Button val4 = ((obj != null) ? ((Component)obj).GetComponent<Button>() : null);
Transform obj2 = val2.Find("PreviousButton");
Button val5 = ((obj2 != null) ? ((Component)obj2).GetComponent<Button>() : null);
Transform obj3 = val2.Find("InputField (Legacy)");
InputField inputField = ((obj3 != null) ? ((Component)obj3).GetComponent<InputField>() : null);
if ((Object)(object)val4 == (Object)null || (Object)(object)val5 == (Object)null || (Object)(object)inputField == (Object)null)
{
Debug.LogError((object)"[CustomGravitySetting] Missing one or more UI components in gravity panel.");
return;
}
((UnityEventBase)val4.onClick).RemoveAllListeners();
((UnityEventBase)val5.onClick).RemoveAllListeners();
((UnityEventBase)inputField.onEndEdit).RemoveAllListeners();
inputField.text = $"{CustomGravitySettingPlugin.CurrentMultiplier:0.00}x";
((UnityEvent)val5.onClick).AddListener((UnityAction)delegate
{
CustomGravitySettingPlugin.DecreaseMultiplier();
inputField.text = $"{CustomGravitySettingPlugin.CurrentMultiplier:0.00}x";
});
((UnityEvent)val4.onClick).AddListener((UnityAction)delegate
{
CustomGravitySettingPlugin.IncreaseMultiplier();
inputField.text = $"{CustomGravitySettingPlugin.CurrentMultiplier:0.00}x";
});
((UnityEvent<string>)(object)inputField.onEndEdit).AddListener((UnityAction<string>)delegate(string input)
{
if (CustomGravitySettingPlugin.TrySetMultiplier(input))
{
inputField.text = $"{CustomGravitySettingPlugin.CurrentMultiplier:0.00}x";
}
else
{
inputField.text = $"{CustomGravitySettingPlugin.CurrentMultiplier:0.00}x";
}
});
}
}