Decompiled source of Overpass Openner v0.1.2

Mono/OverpassOpennerMono.dll

Decompiled 2 days ago
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using MelonLoader;
using OverpassOpennerMono;
using ScheduleOne.Tools;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: MelonInfo(typeof(Core), "Overpass Openner Mono", "0.1.1", "freddab007", null)]
[assembly: MelonGame("TVGS", "Schedule I")]
[assembly: AssemblyTitle("OverpassOpennerMono")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("OverpassOpennerMono")]
[assembly: AssemblyCopyright("Copyright ©  2026")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("30335616-b370-4e42-bdda-662e9a235b87")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace OverpassOpennerMono;

public class Core : MelonMod
{
	private DestroyBridgeBorder destroy = new DestroyBridgeBorder();

	public override void OnInitializeMelon()
	{
		destroy.Init();
		((MelonBase)this).LoggerInstance.Msg("Overpass Openner Initialized.");
	}

	public override void OnSceneWasLoaded(int buildIndex, string sceneName)
	{
		((MelonMod)this).OnSceneWasLoaded(buildIndex, sceneName);
		if (buildIndex == 1 && destroy != null)
		{
			destroy.OpenRamp();
		}
	}
}
internal class DestroyBridgeBorder : MelonMod
{
	private List<string> borders = new List<string>();

	private string rampCollider;

	private string overpassPath;

	private GameObject lastSemgment;

	public override void OnInitializeMelon()
	{
		((MelonBase)this).OnInitializeMelon();
	}

	public void Init()
	{
		borders.Add("Map/Hyland Point/Overpass/Overpass Ramp/Cube (1)");
		borders.Add("Map/Hyland Point/Overpass/Overpass Ramp/Cube");
		borders.Add("Map/Hyland Point/Overpass/Overpass Ramp/Cube (2)");
		borders.Add("Map/Hyland Point/Overpass/Overpass Ramp/RoadBlocker4_LOD (1)");
		borders.Add("Map/Hyland Point/Overpass/Overpass Ramp/RoadBlocker4_LOD (2)");
		borders.Add("Map/Hyland Point/Overpass/Overpass Ramp/RoadBlocker4_LOD (3)");
		borders.Add("Map/Hyland Point/Overpass/Overpass Ramp/RoadBlocker4_LOD (4)");
		rampCollider = "Map/Hyland Point/Overpass/Overpass Ramp/overpass_ramp";
		overpassPath = "Map/Hyland Point/Overpass";
	}

	public void OpenRamp()
	{
		DestroyBorder();
		RemoveConvexColRamp();
		GameObject _parentOfSegments = GameObject.Find(overpassPath);
		RepairOverpassCollider(ref _parentOfSegments);
		MelonCoroutines.Start(ApplyTreeFix());
	}

	public void AddSegments(GameObject _parent, int _nb, Vector3 _start)
	{
	}

	private void RepairConcreteCol(BoxCollider _concrete)
	{
		//IL_0023: 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)
		if (!((Component)_concrete).gameObject.activeSelf)
		{
			((Component)_concrete).gameObject.SetActive(true);
		}
		_concrete.center = Vector3.zero;
		_concrete.size = new Vector3(10f, 14f, 0.18f);
	}

	private void ActivateFenceCol(BoxCollider _fence, OptimizedColliderGroup _segment)
	{
		//IL_00af: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)_segment).name.Contains("62"))
		{
			((Component)_fence).gameObject.SetActive(true);
		}
		else if (((Object)_fence).name.Contains("5") || ((Object)_fence).name.Contains("6") || ((Object)_fence).name.Contains("7") || ((Object)_fence).name.Contains("8") || ((Object)_fence).name.Contains("9"))
		{
			((Component)_fence).gameObject.SetActive(true);
			((Component)_fence).GetComponent<BoxCollider>().center = new Vector3(0f, 0f, -0.75f);
		}
	}

	private void ActivateDividerCol(BoxCollider _divider, OptimizedColliderGroup _segment)
	{
		if (!((Object)_segment).name.Contains("62"))
		{
			((Component)_divider).gameObject.SetActive(true);
		}
	}

	private void RemoveConcreteCol(OptimizedColliderGroup _segment)
	{
		Collider[] array = (Collider[])(object)new Collider[_segment.Colliders.Count() - 1];
		int num = 0;
		for (int num2 = _segment.Colliders.Count() - 1; num2 > 0; num2--)
		{
			array[num] = _segment.Colliders[num2];
			num++;
		}
		_segment.Colliders = array;
	}

	public void RepairOverpassCollider(ref GameObject _parentOfSegments)
	{
		if (!((Object)(object)_parentOfSegments != (Object)null))
		{
			return;
		}
		OptimizedColliderGroup[] componentsInChildren = _parentOfSegments.GetComponentsInChildren<OptimizedColliderGroup>();
		OptimizedColliderGroup[] array = componentsInChildren;
		foreach (OptimizedColliderGroup val in array)
		{
			BoxCollider[] componentsInChildren2 = ((Component)val).gameObject.GetComponentsInChildren<BoxCollider>(true);
			IEnumerable<BoxCollider> enumerable = componentsInChildren2.Where((BoxCollider x) => ((Object)x).name.Contains("Concrete"));
			foreach (BoxCollider item in enumerable)
			{
				RepairConcreteCol(item);
			}
			IEnumerable<BoxCollider> enumerable2 = componentsInChildren2.Where((BoxCollider x) => ((Object)x).name.Contains("Fence"));
			foreach (BoxCollider item2 in enumerable2)
			{
				ActivateFenceCol(item2, val);
			}
			IEnumerable<BoxCollider> enumerable3 = componentsInChildren2.Where((BoxCollider x) => ((Object)x).name.Contains("Divider"));
			foreach (BoxCollider item3 in enumerable3)
			{
				ActivateDividerCol(item3, val);
			}
			RemoveConcreteCol(val);
		}
	}

	public void RemoveConvexColRamp()
	{
		GameObject val = GameObject.Find(rampCollider);
		if ((Object)(object)val != (Object)null)
		{
			MeshCollider[] componentsInChildren = val.GetComponentsInChildren<MeshCollider>();
			MeshCollider[] array = componentsInChildren;
			foreach (MeshCollider val2 in array)
			{
				val2.convex = false;
			}
		}
	}

	public void DestroyBorder()
	{
		for (int i = 0; i < borders.Count; i++)
		{
			GameObject val = GameObject.Find(borders[i]);
			if ((Object)(object)val != (Object)null)
			{
				val.SetActive(false);
			}
		}
	}

	public IEnumerator ApplyTreeFix()
	{
		yield return (object)new WaitForSeconds(2f);
		Terrain terrain = Object.FindObjectOfType<Terrain>();
		if ((Object)(object)terrain == (Object)null)
		{
			MelonLogger.Warning("Terrain not found");
			yield break;
		}
		TerrainData data = terrain.terrainData;
		TreePrototype[] treePrototypes = data.treePrototypes;
		foreach (TreePrototype proto in treePrototypes)
		{
			GameObject prefab = proto.prefab;
			CapsuleCollider collider = prefab.GetComponent<CapsuleCollider>();
			if ((Object)(object)collider != (Object)null)
			{
				collider.height *= 0.5f;
				collider.center = new Vector3(collider.center.x, collider.center.y * 0.5f, collider.center.z);
			}
		}
		data.RefreshPrototypes();
		int maxTree = data.treeInstanceCount - 1;
		TreeInstance[] treeArray = (TreeInstance[])(object)new TreeInstance[maxTree];
		for (int i = 0; i < maxTree; i++)
		{
			if (i != 1082)
			{
				treeArray[i] = data.treeInstances[i];
			}
		}
		terrain.terrainData.SetTreeInstances(treeArray, true);
		((Component)terrain).gameObject.SetActive(false);
		((Component)terrain).gameObject.SetActive(true);
	}
}

IL2CPP/OverpassOpenner.dll

Decompiled 2 days ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using Il2CppScheduleOne.Tools;
using MelonLoader;
using Microsoft.CodeAnalysis;
using Overpass_Openner;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: MelonInfo(typeof(Core), "Overpass Openner IL2CPP", "0.1.2", "freddab007", null)]
[assembly: MelonGame("TVGS", "Schedule I")]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("OverpassOpenner")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("OverpassOpenner")]
[assembly: AssemblyTitle("OverpassOpenner")]
[assembly: NeutralResourcesLanguage("en-US")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.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.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace Overpass_Openner
{
	public class Core : MelonMod
	{
		private DestroyBridgeBorder destroy = new DestroyBridgeBorder();

		public override void OnInitializeMelon()
		{
			destroy.Init();
			((MelonBase)this).LoggerInstance.Msg("Overpass Openner Initialized.");
		}

		public override void OnSceneWasLoaded(int buildIndex, string sceneName)
		{
			((MelonMod)this).OnSceneWasLoaded(buildIndex, sceneName);
			if (buildIndex == 1 && destroy != null)
			{
				destroy.OpenRamp();
			}
		}
	}
	internal class DestroyBridgeBorder : MelonMod
	{
		private List<string> borders = new List<string>();

		private string rampCollider;

		private string overpassPath;

		private GameObject lastSemgment;

		public override void OnInitializeMelon()
		{
			((MelonBase)this).OnInitializeMelon();
		}

		public void Init()
		{
			borders.Add("Map/Hyland Point/Overpass/Overpass Ramp/Cube (1)");
			borders.Add("Map/Hyland Point/Overpass/Overpass Ramp/Cube");
			borders.Add("Map/Hyland Point/Overpass/Overpass Ramp/Cube (2)");
			borders.Add("Map/Hyland Point/Overpass/Overpass Ramp/RoadBlocker4_LOD (1)");
			borders.Add("Map/Hyland Point/Overpass/Overpass Ramp/RoadBlocker4_LOD (2)");
			borders.Add("Map/Hyland Point/Overpass/Overpass Ramp/RoadBlocker4_LOD (3)");
			borders.Add("Map/Hyland Point/Overpass/Overpass Ramp/RoadBlocker4_LOD (4)");
			rampCollider = "Map/Hyland Point/Overpass/Overpass Ramp/overpass_ramp";
			overpassPath = "Map/Hyland Point/Overpass";
		}

		public void OpenRamp()
		{
			DestroyBorder();
			RemoveConvexColRamp();
			GameObject _parentOfSegments = GameObject.Find(overpassPath);
			RepairOverpassCollider(ref _parentOfSegments);
			MelonCoroutines.Start(ApplyTreeFix());
		}

		public void AddSegments(GameObject _parent, int _nb, Vector3 _start)
		{
		}

		private void RepairConcreteCol(BoxCollider _concrete)
		{
			//IL_0023: 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)
			if (!((Component)_concrete).gameObject.active)
			{
				((Component)_concrete).gameObject.SetActive(true);
			}
			_concrete.center = Vector3.zero;
			_concrete.size = new Vector3(10f, 14f, 0.18f);
		}

		private void ActivateFenceCol(BoxCollider _fence, OptimizedColliderGroup _segment)
		{
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)_segment).name.Contains("62"))
			{
				((Component)_fence).gameObject.SetActive(true);
			}
			else if (((Object)_fence).name.Contains("5") || ((Object)_fence).name.Contains("6") || ((Object)_fence).name.Contains("7") || ((Object)_fence).name.Contains("8") || ((Object)_fence).name.Contains("9"))
			{
				((Component)_fence).gameObject.SetActive(true);
				((Component)_fence).GetComponent<BoxCollider>().center = new Vector3(0f, 0f, -0.75f);
			}
		}

		private void ActivateDividerCol(BoxCollider _divider, OptimizedColliderGroup _segment)
		{
			if (!((Object)_segment).name.Contains("62"))
			{
				((Component)_divider).gameObject.SetActive(true);
			}
		}

		private void RemoveConcreteCol(OptimizedColliderGroup _segment)
		{
			Il2CppReferenceArray<Collider> val = new Il2CppReferenceArray<Collider>((long)(((Il2CppArrayBase<Collider>)(object)_segment.Colliders).Count - 1));
			int num = 0;
			for (int num2 = ((Il2CppArrayBase<Collider>)(object)_segment.Colliders).Count - 1; num2 > 0; num2--)
			{
				((Il2CppArrayBase<Collider>)(object)val)[num] = ((Il2CppArrayBase<Collider>)(object)_segment.Colliders)[num2];
				num++;
			}
			_segment.Colliders = val;
		}

		public void RepairOverpassCollider(ref GameObject _parentOfSegments)
		{
			if (!((Object)(object)_parentOfSegments != (Object)null))
			{
				return;
			}
			Il2CppArrayBase<OptimizedColliderGroup> componentsInChildren = _parentOfSegments.GetComponentsInChildren<OptimizedColliderGroup>();
			foreach (OptimizedColliderGroup item in componentsInChildren)
			{
				Il2CppArrayBase<BoxCollider> componentsInChildren2 = ((Component)item).gameObject.GetComponentsInChildren<BoxCollider>(true);
				IEnumerable<BoxCollider> enumerable = ((IEnumerable<BoxCollider>)componentsInChildren2).Where((BoxCollider x) => ((Object)x).name.Contains("Concrete"));
				foreach (BoxCollider item2 in enumerable)
				{
					RepairConcreteCol(item2);
				}
				IEnumerable<BoxCollider> enumerable2 = ((IEnumerable<BoxCollider>)componentsInChildren2).Where((BoxCollider x) => ((Object)x).name.Contains("Fence"));
				foreach (BoxCollider item3 in enumerable2)
				{
					ActivateFenceCol(item3, item);
				}
				IEnumerable<BoxCollider> enumerable3 = ((IEnumerable<BoxCollider>)componentsInChildren2).Where((BoxCollider x) => ((Object)x).name.Contains("Divider"));
				foreach (BoxCollider item4 in enumerable3)
				{
					ActivateDividerCol(item4, item);
				}
				RemoveConcreteCol(item);
			}
		}

		public void RemoveConvexColRamp()
		{
			GameObject val = GameObject.Find(rampCollider);
			if (!((Object)(object)val != (Object)null))
			{
				return;
			}
			Il2CppArrayBase<MeshCollider> componentsInChildren = val.GetComponentsInChildren<MeshCollider>();
			foreach (MeshCollider item in componentsInChildren)
			{
				item.convex = false;
			}
		}

		public void DestroyBorder()
		{
			for (int i = 0; i < borders.Count; i++)
			{
				GameObject val = GameObject.Find(borders[i]);
				if ((Object)(object)val != (Object)null)
				{
					val.SetActive(false);
				}
			}
		}

		public IEnumerator ApplyTreeFix()
		{
			yield return (object)new WaitForSeconds(2f);
			Terrain terrain = Object.FindObjectOfType<Terrain>();
			if ((Object)(object)terrain == (Object)null)
			{
				MelonLogger.Warning("Terrain not found");
				yield break;
			}
			TerrainData data = terrain.terrainData;
			foreach (TreePrototype proto in (Il2CppArrayBase<TreePrototype>)(object)data.treePrototypes)
			{
				GameObject prefab = proto.prefab;
				CapsuleCollider collider = prefab.GetComponent<CapsuleCollider>();
				if ((Object)(object)collider != (Object)null)
				{
					collider.height *= 0.5f;
					collider.center = new Vector3(collider.center.x, collider.center.y * 0.5f, collider.center.z);
				}
			}
			data.RefreshPrototypes();
			int maxTree = data.treeInstanceCount - 1;
			Il2CppStructArray<TreeInstance> treeArray = new Il2CppStructArray<TreeInstance>((long)maxTree);
			for (int i = 0; i < maxTree; i++)
			{
				if (i != 1082)
				{
					((Il2CppArrayBase<TreeInstance>)(object)treeArray)[i] = ((Il2CppArrayBase<TreeInstance>)(object)data.treeInstances)[i];
				}
			}
			terrain.terrainData.SetTreeInstances(treeArray, true);
			((Component)terrain).gameObject.SetActive(false);
			((Component)terrain).gameObject.SetActive(true);
		}
	}
}