Decompiled source of SimCruiser G25 v1.5.0

SimCruiser-G25.dll

Decompiled 2 months ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using GameNetcodeStuff;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Utilities;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("SimCruiser-G25")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+fdc72aef662d7c66ed76e0c676e106aa0cf6ee29")]
[assembly: AssemblyProduct("SimCruiser-G25")]
[assembly: AssemblyTitle("SimCruiser-G25")]
[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.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]
	[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]
	[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 SimCruiser_G25
{
	[BepInPlugin("com.BigSaltyBeans.SimCruiser_G25", "Sim Cruiser G25", "1.2.0")]
	public class SimCruiser_G25 : BaseUnityPlugin
	{
		private const string GUID = "com.BigSaltyBeans.SimCruiser_G25";

		private const string NAME = "Sim Cruiser G25";

		private const string VERSION = "1.2.0";

		private void Awake()
		{
			Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), "com.BigSaltyBeans.SimCruiser_G25");
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Patched Sim Cruiser G25");
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "SimCruiser-G25";

		public const string PLUGIN_NAME = "SimCruiser-G25";

		public const string PLUGIN_VERSION = "1.0.0";
	}
}
namespace SimCruiser_G25.Patches
{
	[HarmonyPatch(typeof(StartOfRound), "Update")]
	internal class AddWheelBindings
	{
		private static bool added;

		private static void Postfix()
		{
			if (added)
			{
				return;
			}
			PlayerControllerB val = StartOfRound.Instance?.localPlayerController;
			if ((Object)(object)val == (Object)null)
			{
				return;
			}
			InputActionAsset asset = val.playerActions.asset;
			if ((Object)(object)asset == (Object)null)
			{
				Debug.LogError((object)"Fatal PlayerActions is null :(");
				return;
			}
			InputActionAsset actions = InputSystem.actions;
			if ((Object)(object)actions == (Object)null)
			{
				Debug.LogError((object)"Fatal PlayerActions is null :(");
				return;
			}
			ApplyBindings(asset);
			ApplyBindings(actions);
			added = true;
			Debug.Log((object)"Added G25's input bindings! :D");
		}

		private static void ApplyBindings(InputActionAsset actions)
		{
			//IL_0109: Unknown result type (might be due to invalid IL or missing references)
			//IL_010e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0112: Unknown result type (might be due to invalid IL or missing references)
			//IL_0117: Unknown result type (might be due to invalid IL or missing references)
			//IL_014c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0151: Unknown result type (might be due to invalid IL or missing references)
			//IL_0155: Unknown result type (might be due to invalid IL or missing references)
			//IL_015a: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_020f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0214: Unknown result type (might be due to invalid IL or missing references)
			//IL_021d: Unknown result type (might be due to invalid IL or missing references)
			//IL_022c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0231: Unknown result type (might be due to invalid IL or missing references)
			//IL_023a: 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_024d: Unknown result type (might be due to invalid IL or missing references)
			//IL_025d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0262: Unknown result type (might be due to invalid IL or missing references)
			//IL_0272: Unknown result type (might be due to invalid IL or missing references)
			//IL_0277: Unknown result type (might be due to invalid IL or missing references)
			//IL_0287: Unknown result type (might be due to invalid IL or missing references)
			//IL_028c: Unknown result type (might be due to invalid IL or missing references)
			//IL_029c: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f7: Unknown result type (might be due to invalid IL or missing references)
			InputActionMap val = actions.FindActionMap("Movement", false);
			if (val == null)
			{
				Debug.LogError((object)"Fatal Movement Actions is null :(");
				return;
			}
			bool enabled = val.enabled;
			if (enabled)
			{
				val.Disable();
			}
			InputAction val2 = actions.FindAction("Move", false);
			if (val2 == null)
			{
				Debug.LogError((object)"Fatal Move Action in PlayerActions is null :(");
				return;
			}
			InputAction val3 = actions.FindAction("Jump", false);
			if (val3 == null)
			{
				Debug.LogError((object)"Fatal Jump Action in PlayerActions is null :(");
				return;
			}
			InputAction val4 = actions.FindAction("Interact", false);
			if (val4 == null)
			{
				Debug.LogError((object)"Fatal Interact Action in PlayerActions is null :(");
				return;
			}
			InputAction val5 = actions.FindAction("Look", false);
			if (val5 == null)
			{
				Debug.LogError((object)"Fatal Look Action in PlayerActions is null :(");
				return;
			}
			InputAction val6 = InputActionSetupExtensions.AddAction(val, "DriveGear", (InputActionType)1, (string)null, (string)null, (string)null, (string)null, (string)null);
			InputAction val7 = InputActionSetupExtensions.AddAction(val, "ReverseGear", (InputActionType)1, (string)null, (string)null, (string)null, (string)null, (string)null);
			Enumerator<InputDevice> enumerator = InputSystem.devices.GetEnumerator();
			try
			{
				while (enumerator.MoveNext())
				{
					InputDevice current = enumerator.Current;
					Debug.Log((object)((InputControl)current).path);
				}
			}
			finally
			{
				((IDisposable)enumerator/*cast due to .constrained prefix*/).Dispose();
			}
			Enumerator<InputDevice> enumerator2 = InputSystem.devices.GetEnumerator();
			try
			{
				while (enumerator2.MoveNext())
				{
					InputDevice current2 = enumerator2.Current;
					if (!((InputControl)current2).displayName.ToLower().Contains("g25"))
					{
						continue;
					}
					Debug.Log((object)("Found g25: " + ((InputControl)current2).name));
					Enumerator<InputControl> enumerator3 = current2.allControls.GetEnumerator();
					try
					{
						while (enumerator3.MoveNext())
						{
							InputControl current3 = enumerator3.Current;
							Debug.Log((object)current3.path);
						}
					}
					finally
					{
						((IDisposable)enumerator3/*cast due to .constrained prefix*/).Dispose();
					}
				}
			}
			finally
			{
				((IDisposable)enumerator2/*cast due to .constrained prefix*/).Dispose();
			}
			BindingSyntax val8 = InputActionSetupExtensions.AddBinding(val5, "<HID::G25 Racing Wheel>/hat", (string)null, (string)null, (string)null);
			((BindingSyntax)(ref val8)).WithProcessor("scaleVector2(x=100,y=100)");
			val8 = InputActionSetupExtensions.AddBinding(val2, "<HID::G25 Racing Wheel>/stick", (string)null, (string)null, (string)null);
			((BindingSyntax)(ref val8)).WithProcessor("scaleVector2(x=1,y=1)");
			CompositeSyntax val9 = InputActionSetupExtensions.AddCompositeBinding(val2, "2DVector", (string)null, (string)null);
			val9 = ((CompositeSyntax)(ref val9)).With("Up", "<HID::G25 Racing Wheel>/button16", (string)null, (string)null);
			val9 = ((CompositeSyntax)(ref val9)).With("Down", "<HID::G25 Racing Wheel>/button18", (string)null, (string)null);
			val9 = ((CompositeSyntax)(ref val9)).With("Left", "<HID::G25 Racing Wheel>/button17", (string)null, (string)null);
			((CompositeSyntax)(ref val9)).With("Right", "<HID::G25 Racing Wheel>/button19", (string)null, (string)null);
			val8 = InputActionSetupExtensions.AddBinding(val3, "<HID::G25 Racing Wheel>/button8", (string)null, (string)null, (string)null);
			((BindingSyntax)(ref val8)).WithInteraction("press");
			val8 = InputActionSetupExtensions.AddBinding(val4, "<HID::G25 Racing Wheel>/button7", (string)null, (string)null, (string)null);
			((BindingSyntax)(ref val8)).WithInteraction("press");
			InputActionSetupExtensions.AddBinding(val6, "<HID::G25 Racing Wheel>/button11", (string)null, (string)null, (string)null);
			InputActionSetupExtensions.AddBinding(val7, "<HID::G25 Racing Wheel>/button12", (string)null, (string)null, (string)null);
			if (enabled)
			{
				val.Enable();
			}
		}
	}
	[HarmonyPatch(typeof(VehicleController), "GetVehicleInput")]
	public class CruiserInputRewrite
	{
		private static bool Prefix(VehicleController __instance)
		{
			//IL_0050: 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_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_019a: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a0: Invalid comparison between Unknown and I4
			if (__instance.localPlayerInControl)
			{
				if (__instance.testingVehicleInEditor)
				{
					__instance.moveInputVector = __instance.input.actions.FindAction("Move", false).ReadValue<Vector2>();
				}
				else
				{
					__instance.moveInputVector = InputSystem.actions.FindAction("Move", false).ReadValue<Vector2>();
				}
				__instance.steeringInput = Mathf.Clamp(__instance.moveInputVector.x * 3f, -3f, 3f);
				Debug.Log((object)__instance.steeringInput);
				if (Mathf.Abs(__instance.moveInputVector.x) > 0.1f)
				{
					__instance.steeringWheelAudio.volume = Mathf.Lerp(__instance.steeringWheelAudio.volume, Mathf.Abs(__instance.moveInputVector.x), 5f * Time.deltaTime);
				}
				else
				{
					__instance.steeringWheelAudio.volume = Mathf.Lerp(__instance.steeringWheelAudio.volume, 0f, 5f * Time.deltaTime);
				}
				__instance.steeringAnimValue = __instance.moveInputVector.x;
				__instance.drivePedalPressed = __instance.moveInputVector.y > 0.1f;
				__instance.brakePedalPressed = __instance.moveInputVector.y < -0.1f;
				int num = 3;
				if (InputSystem.actions.FindAction("DriveGear", false).IsPressed())
				{
					num = 1;
				}
				else if (InputSystem.actions.FindAction("ReverseGear", false).IsPressed())
				{
					num = 2;
				}
				if ((int)__instance.gear != num)
				{
					__instance.ShiftToGearAndSync(num);
				}
			}
			return false;
		}
	}
	[HarmonyPatch(typeof(VehicleController), "SetCarEffects")]
	public class SetNewSteeringAnim
	{
		private static bool Prefix(VehicleController __instance, float setSteering)
		{
			//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0110: Unknown result type (might be due to invalid IL or missing references)
			//IL_0144: Unknown result type (might be due to invalid IL or missing references)
			//IL_015f: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01aa: Invalid comparison between Unknown and I4
			//IL_01e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01eb: Invalid comparison between Unknown and I4
			//IL_03c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_03d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_03d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_03e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_062e: Unknown result type (might be due to invalid IL or missing references)
			//IL_066f: Unknown result type (might be due to invalid IL or missing references)
			//IL_06de: Unknown result type (might be due to invalid IL or missing references)
			//IL_06ae: Unknown result type (might be due to invalid IL or missing references)
			__instance.steeringWheelAnimFloat = Mathf.Clamp(__instance.steeringWheelAnimFloat + setSteering * __instance.steeringWheelTurnSpeed * Time.deltaTime / 6f, -2.4f, 2.4f);
			float num = Mathf.Clamp((__instance.steeringWheelAnimFloat + 2.4f) / 4.8f, 0f, 1f);
			float num2 = Mathf.Clamp((__instance.steeringWheelAnimFloat + 2.4f) / 4.8f, 0.01f, 0.99f) - __instance.steeringWheelAnimator.GetFloat("steeringWheelTurnSpeed");
			__instance.steeringWheelAnimator.SetFloat("steeringWheelTurnSpeed", num);
			if ((Object)(object)__instance.currentDriver != (Object)null)
			{
				__instance.currentDriver.playerBodyAnimator.SetFloat("animationSpeed", __instance.currentDriver.playerBodyAnimator.GetFloat("animationSpeed") + num2 * 2f);
			}
			((Component)__instance.leftWheelMesh).transform.localEulerAngles = new Vector3(((Component)__instance.leftWheelMesh).transform.localEulerAngles.x, __instance.steeringWheelAnimFloat * 50f, 0f);
			__instance.MatchWheelMeshToCollider(__instance.leftWheelMesh, __instance.FrontLeftWheel);
			((Component)__instance.rightWheelMesh).transform.localEulerAngles = new Vector3(((Component)__instance.rightWheelMesh).transform.localEulerAngles.x, __instance.steeringWheelAnimFloat * 50f, 0f);
			__instance.MatchWheelMeshToCollider(__instance.rightWheelMesh, __instance.FrontRightWheel);
			__instance.MatchWheelMeshToCollider(__instance.backLeftWheelMesh, __instance.BackLeftWheel);
			__instance.MatchWheelMeshToCollider(__instance.backRightWheelMesh, __instance.BackRightWheel);
			if ((int)__instance.gear == 2)
			{
				__instance.gearStickAnimValue = Mathf.MoveTowards(__instance.gearStickAnimValue, 0.5f, 15f * Time.deltaTime * (Time.realtimeSinceStartup - __instance.timeAtLastGearShift));
			}
			else if ((int)__instance.gear == 3)
			{
				__instance.gearStickAnimValue = Mathf.MoveTowards(__instance.gearStickAnimValue, 1f, 15f * Time.deltaTime * (Time.realtimeSinceStartup - __instance.timeAtLastGearShift));
			}
			else
			{
				__instance.gearStickAnimValue = Mathf.MoveTowards(__instance.gearStickAnimValue, 0f, 15f * Time.deltaTime * (Time.realtimeSinceStartup - __instance.timeAtLastGearShift));
			}
			__instance.gearStickAnimator.SetFloat("gear", Mathf.Clamp(__instance.gearStickAnimValue, 0.01f, 0.99f));
			if (__instance.EngineRPM < -5f)
			{
				if (!__instance.backLightsOn)
				{
					__instance.backLightsOn = true;
					((Renderer)__instance.backLightsMesh).material = __instance.backLightOnMat;
					__instance.backLightsContainer.SetActive(true);
				}
			}
			else if (__instance.backLightsOn)
			{
				__instance.backLightsOn = false;
				((Renderer)__instance.backLightsMesh).material = __instance.headlightsOffMat;
				__instance.backLightsContainer.SetActive(false);
			}
			__instance.SetVehicleAudioProperties(__instance.extremeStressAudio, __instance.underExtremeStress, 0.2f, 1f, 3f, true, 1f);
			if (((NetworkBehaviour)__instance).IsOwner)
			{
				if (!__instance.syncedExtremeStress && __instance.underExtremeStress && __instance.extremeStressAudio.volume > 0.35f)
				{
					__instance.syncedExtremeStress = true;
					__instance.SyncExtremeStressServerRpc(__instance.underExtremeStress);
				}
				else if (__instance.syncedExtremeStress && !__instance.underExtremeStress && __instance.extremeStressAudio.volume < 0.5f)
				{
					__instance.syncedExtremeStress = false;
					__instance.SyncExtremeStressServerRpc(__instance.underExtremeStress);
				}
			}
			__instance.SetRadioValues();
			float num3 = Vector3.Dot(Vector3.Normalize(__instance.mainRigidbody.velocity * 1000f), ((Component)__instance).transform.forward);
			bool flag = num3 > -0.6f && num3 < 0.4f && (((Vector3)(ref __instance.averageVelocity)).magnitude > 4f || __instance.EngineRPM > 400f);
			if ((!__instance.FrontLeftWheel.isGrounded && !__instance.FrontRightWheel.isGrounded) || (!__instance.BackLeftWheel.isGrounded && !__instance.BackRightWheel.isGrounded))
			{
				flag = false;
			}
			if (__instance.FrontLeftWheel.motorTorque > 900f && __instance.FrontRightWheel.motorTorque > 900f)
			{
				flag = true;
				num3 = Mathf.Max(num3, 0.8f);
				if (((Vector3)(ref __instance.averageVelocity)).magnitude > 8f && !__instance.tireSparks.isPlaying)
				{
					__instance.tireSparks.Play(true);
				}
			}
			else
			{
				__instance.tireSparks.Stop(true, (ParticleSystemStopBehavior)1);
			}
			__instance.SetVehicleAudioProperties(__instance.skiddingAudio, flag, 0f, num3, 3f, true, 1f);
			__instance.carEngine2AudioActive = __instance.ignitionStarted;
			float num4 = Mathf.Abs(__instance.EngineRPM);
			float num5 = Mathf.Clamp(num4 / __instance.engineIntensityPercentage, 0.7f, 1.5f);
			__instance.SetVehicleAudioProperties(__instance.engineAudio2, __instance.carEngine2AudioActive, 0.7f, num5, 3f, false, 0.5f);
			num5 = Mathf.Clamp(num4 / __instance.engineIntensityPercentage, 0.65f, 1.15f);
			float num6 = num5;
			if (!__instance.ignitionStarted)
			{
				num6 = 1f;
			}
			__instance.SetVehicleAudioProperties(__instance.engineAudio1, __instance.carEngine1AudioActive, 0.7f, num6, 2f, false, 0.7f);
			if (__instance.engineAudio1.volume > 0.3f && __instance.engineAudio1.isPlaying && Time.realtimeSinceStartup - __instance.timeAtLastEngineAudioPing > 2f)
			{
				__instance.timeAtLastEngineAudioPing = Time.realtimeSinceStartup;
				if (__instance.EngineRPM > 130f)
				{
					RoundManager.Instance.PlayAudibleNoise(((Component)__instance.engineAudio1).transform.position, 32f, 0.75f, 0, false, 2692);
				}
				if (__instance.EngineRPM > 60f)
				{
					RoundManager.Instance.PlayAudibleNoise(((Component)__instance.engineAudio1).transform.position, 25f, 0.6f, 0, false, 2692);
				}
				else if (!__instance.ignitionStarted)
				{
					RoundManager.Instance.PlayAudibleNoise(((Component)__instance.engineAudio1).transform.position, 15f, 0.6f, 0, false, 2692);
				}
				else
				{
					RoundManager.Instance.PlayAudibleNoise(((Component)__instance.engineAudio1).transform.position, 11f, 0.5f, 0, false, 2692);
				}
			}
			__instance.carRollingAudioActive = num4 > 10f;
			num5 = Mathf.Clamp(num4 / (__instance.engineIntensityPercentage * 0.35f), 0f, 1f);
			__instance.SetVehicleAudioProperties(__instance.rollingAudio, __instance.carRollingAudioActive, 0f, num5, 5f, true, 1f);
			__instance.turbulenceAudio.volume = Mathf.Lerp(__instance.turbulenceAudio.volume, Mathf.Min(1f, __instance.turbulenceAmount), 10f * Time.deltaTime);
			__instance.turbulenceAmount = Mathf.Max(__instance.turbulenceAmount - Time.deltaTime, 0f);
			if (__instance.turbulenceAudio.volume > 0.02f)
			{
				if (!__instance.turbulenceAudio.isPlaying)
				{
					__instance.turbulenceAudio.Play();
				}
			}
			else if (__instance.turbulenceAudio.isPlaying)
			{
				__instance.turbulenceAudio.Stop();
			}
			return false;
		}
	}
}