Decompiled source of TumorShadowFix v0.0.7

TumorShadowFix.dll

Decompiled 3 days ago
using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using Agents;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Unity.IL2CPP;
using CullingSystem;
using Enemies;
using HarmonyLib;
using IRF;
using Il2CppInterop.Runtime.Injection;
using Il2CppInterop.Runtime.InteropTypes;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using Il2CppSystem;
using Il2CppSystem.Collections.Generic;
using Microsoft.CodeAnalysis;
using Player;
using UnityEngine;
using UnityEngine.Rendering;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("TumorShadowFix")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("TumorShadowFix")]
[assembly: AssemblyTitle("TumorShadowFix")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
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;
		}
	}
}
namespace TumorShadowFix
{
	[BepInPlugin("TumorShadowFix", "TumorShadowFix", "0.0.7")]
	public class Plugin : BasePlugin
	{
		public class FixEnemySER : MonoBehaviour
		{
			private EnemyAgent enemy;

			private List<MeshRenderer> sammuta = new List<MeshRenderer>();

			private List<SkinnedMeshRenderer> sammuta2 = new List<SkinnedMeshRenderer>();

			private SkinnedMeshRenderer smr;

			private ShadowEnemyRenderer ser;

			private bool initialized;

			private bool thermalShadows = _cfgThermalShadows.Value;

			public void Update()
			{
				if (!initialized || (Object)(object)enemy == (Object)null || (Object)(object)ser == (Object)null)
				{
					return;
				}
				if (!((Agent)enemy).Alive && !((Component)ser).gameObject.activeSelf)
				{
					((Component)ser).gameObject.SetActive(true);
				}
				else
				{
					if (!((Agent)enemy).Alive)
					{
						return;
					}
					if (!((Component)ser).gameObject.activeSelf)
					{
						((Component)ser).gameObject.SetActive(true);
					}
					foreach (MeshRenderer sammutum in sammuta)
					{
						((Renderer)sammutum).shadowCastingMode = (ShadowCastingMode)3;
					}
					foreach (SkinnedMeshRenderer item in sammuta2)
					{
						((Renderer)item).shadowCastingMode = (ShadowCastingMode)3;
					}
				}
			}

			public void Attach(EnemyAgent enemy)
			{
				this.enemy = enemy;
				foreach (MeshRenderer componentsInChild in ((Component)enemy).GetComponentsInChildren<MeshRenderer>())
				{
					if (((Object)((Component)componentsInChild).gameObject).name.ToLower().Contains("infested"))
					{
						sammuta.Add(componentsInChild);
					}
				}
				Il2CppArrayBase<SkinnedMeshRenderer> componentsInChildren = ((Component)enemy).GetComponentsInChildren<SkinnedMeshRenderer>();
				foreach (SkinnedMeshRenderer item in componentsInChildren)
				{
					if (((Object)((Component)item).gameObject).name.ToLower() == "g_pouncer")
					{
						sammuta2.Add(item);
					}
					if (((Object)((Component)item).gameObject).name.ToLower() == "g_body")
					{
						sammuta2.Add(item);
					}
				}
				foreach (MeshRenderer sammutum in sammuta)
				{
					((Renderer)sammutum).shadowCastingMode = (ShadowCastingMode)3;
				}
				foreach (SkinnedMeshRenderer item2 in sammuta2)
				{
					((Renderer)item2).shadowCastingMode = (ShadowCastingMode)3;
				}
				if (!thermalShadows)
				{
					return;
				}
				Il2CppArrayBase<SkinnedMeshRenderer> componentsInChildren2 = ((Component)this.enemy).GetComponentsInChildren<SkinnedMeshRenderer>(true);
				if (componentsInChildren2.Length == 1)
				{
					((Renderer)componentsInChildren[0]).shadowCastingMode = (ShadowCastingMode)3;
					ser = ((Component)componentsInChildren2[0]).gameObject.AddComponent<ShadowEnemyRenderer>();
					ser.Renderer = (Renderer)(object)componentsInChildren2[0];
				}
				if (componentsInChildren2.Length > 1)
				{
					foreach (SkinnedMeshRenderer item3 in componentsInChildren2)
					{
						if (((Object)((Component)item3).gameObject).name.ToLower().Contains("g_body_shadow") || ((Object)((Component)item3).gameObject).name.ToLower().Contains("g_shooter") || ((Object)((Component)item3).gameObject).name.ToLower().Contains("g_tank") || ((Object)((Component)item3).gameObject).name.ToLower().Contains("g_birther") || ((Object)((Component)item3).gameObject).name.ToLower().Contains("g_pouncer_shadow"))
						{
							((Renderer)item3).shadowCastingMode = (ShadowCastingMode)3;
							ser = ((Component)item3).gameObject.AddComponent<ShadowEnemyRenderer>();
							ser.Renderer = (Renderer)(object)item3;
						}
					}
				}
				if ((Object)(object)ser != (Object)null)
				{
					ser.MovingCuller = this.enemy.MovingCuller;
					initialized = true;
				}
			}
		}

		public class FixShadows : MonoBehaviour
		{
			private Renderer orig;

			private EnemyAgent enemy;

			private Renderer mr1;

			private Renderer mr2;

			private bool destroyed;

			private bool initialized;

			private List<Renderer> renderers = new List<Renderer>();

			private float jee;

			private Dam_EnemyDamageLimb_Custom bulb;

			private bool tempset;

			private bool visibleFromBehind = _cfgVisibleFromBehind.Value;

			private bool unhide;

			private PlayerAgent plr = PlayerManager.GetLocalPlayerAgent();

			private float debugreporttime;

			public void Attach(EnemyAgent enemy, Renderer rend, Renderer sphere, Renderer shadow)
			{
				jee = Time.realtimeSinceStartup;
				this.enemy = enemy;
				mr1 = sphere;
				mr2 = shadow;
				orig = rend;
				foreach (Renderer componentsInChild in ((Component)enemy).GetComponentsInChildren<Renderer>())
				{
					renderers.Add(componentsInChild);
				}
				bulb = ((Component)orig).GetComponentInParent<Dam_EnemyDamageLimb_Custom>();
				if ((Object)(object)bulb == (Object)null)
				{
					Debug.Log(Object.op_Implicit("TumorShadowFix - egg not found. damn."));
				}
				if ((Object)(object)bulb != (Object)null)
				{
					((Dam_EnemyDamageLimb)bulb).OnLimbDestroyed += Action.op_Implicit((Action)Done);
				}
				((Agent)enemy).SetAnimatorCullingEnabled(false);
				initialized = true;
			}

			public void Done()
			{
				Debug.Log(Object.op_Implicit($"TumorShadowFix - tumor has been popped from enemy {((Agent)enemy).GlobalID}, removing shadow.."));
				mr2.forceRenderingOff = true;
				mr2.castShadows = false;
				mr2.receiveShadows = false;
				enemy.MovingCuller.CullBucket.ShadowRenderers.Remove(mr2);
				Enumerator<MaterialRef> enumerator = enemy.MaterialHandler.m_materialRefs.GetEnumerator();
				while (enumerator.MoveNext())
				{
					MaterialRef current = enumerator.Current;
					try
					{
						current.m_renderers.Remove(mr2);
					}
					catch (Exception)
					{
					}
				}
				enemy.MovingCuller.CullBucket.ComputeTotalBounds();
				((C_Cullable)enemy.MovingCuller.CullBucket).NeedsShadowRefresh = true;
				destroyed = true;
			}

			public void Update()
			{
				//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
				//IL_0118: Unknown result type (might be due to invalid IL or missing references)
				//IL_0128: Unknown result type (might be due to invalid IL or missing references)
				//IL_0138: Unknown result type (might be due to invalid IL or missing references)
				//IL_013d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0142: Unknown result type (might be due to invalid IL or missing references)
				//IL_0145: Unknown result type (might be due to invalid IL or missing references)
				//IL_014a: Unknown result type (might be due to invalid IL or missing references)
				//IL_014b: Unknown result type (might be due to invalid IL or missing references)
				//IL_01a9: Unknown result type (might be due to invalid IL or missing references)
				//IL_01af: Invalid comparison between Unknown and I4
				//IL_023e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0244: Invalid comparison between Unknown and I4
				if (destroyed || !initialized || Time.realtimeSinceStartup - jee < 1f || (Object)(object)enemy == (Object)null)
				{
					return;
				}
				if (!((Agent)enemy).Alive)
				{
					enemy.MovingCuller.CullBucket.Renderers.Remove(mr1);
					enemy.MovingCuller.CullBucket.ShadowRenderers.Remove(mr2);
					Enumerator<MaterialRef> enumerator = enemy.MaterialHandler.m_materialRefs.GetEnumerator();
					while (enumerator.MoveNext())
					{
						enumerator.Current.m_renderers.Remove(mr2);
					}
					destroyed = true;
					return;
				}
				unhide = false;
				if ((int)mr1.shadowCastingMode != 0)
				{
					mr1.shadowCastingMode = (ShadowCastingMode)0;
				}
				if (!((Object)enemy).name.ToLower().Contains("shadow"))
				{
					return;
				}
				if (visibleFromBehind)
				{
					Vector3 forward = ((Component)enemy).transform.forward;
					Vector3 val = ((Component)plr).transform.position - ((Component)enemy).transform.position;
					Vector3 normalized = ((Vector3)(ref val)).normalized;
					if (Vector3.Angle(forward, normalized) > 168f)
					{
						unhide = true;
					}
					if (unhide)
					{
						mr1.forceRenderingOff = false;
						return;
					}
				}
				if (!mr1.forceRenderingOff)
				{
					mr1.forceRenderingOff = true;
				}
				foreach (Renderer renderer in renderers)
				{
					if ((int)renderer.shadowCastingMode != 3)
					{
						renderer.shadowCastingMode = (ShadowCastingMode)3;
					}
					if (!renderer.castShadows)
					{
						renderer.castShadows = true;
					}
					if (!enemy.MovingCuller.m_disableAnimatorCullingWhenRenderingShadow)
					{
						enemy.MovingCuller.m_disableAnimatorCullingWhenRenderingShadow = true;
					}
					if (enemy.MovingCuller.m_animatorCullingEnabled)
					{
						((Agent)enemy).SetAnimatorCullingEnabled(false);
					}
					if (!enemy.MovingCuller.Culler.hasShadowsEnabled)
					{
						enemy.MovingCuller.Culler.hasShadowsEnabled = true;
					}
					if ((int)mr2.shadowCastingMode != 3)
					{
						mr2.shadowCastingMode = (ShadowCastingMode)3;
					}
				}
			}
		}

		[HarmonyPatch]
		private class testpatches
		{
			[HarmonyPatch(typeof(EnemyAllocator), "SpawnEnemy")]
			[HarmonyPostfix]
			private static void Postfix(EnemyAllocator __instance)
			{
				//IL_024f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0266: Unknown result type (might be due to invalid IL or missing references)
				//IL_0289: Unknown result type (might be due to invalid IL or missing references)
				//IL_02a0: Unknown result type (might be due to invalid IL or missing references)
				//IL_0328: Unknown result type (might be due to invalid IL or missing references)
				//IL_0385: Unknown result type (might be due to invalid IL or missing references)
				EnemyAgent spawnedEnemyAgent = __instance.m_spawnedEnemyAgent;
				if (((Object)spawnedEnemyAgent).name.ToLower().Contains("shadow"))
				{
					spawnedEnemyAgent.RequireTagForDetection = true;
					((Agent)spawnedEnemyAgent).SetAnimatorCullingEnabled(false);
					spawnedEnemyAgent.MovingCuller.m_disableAnimatorCullingWhenRenderingShadow = true;
					foreach (InstancedRenderFeature componentsInChild in ((Component)spawnedEnemyAgent).GetComponentsInChildren<InstancedRenderFeature>())
					{
						((Behaviour)componentsInChild).enabled = false;
					}
					if (_cfgThermalShadows.Value)
					{
						((Component)spawnedEnemyAgent).gameObject.AddComponent<FixEnemySER>().Attach(spawnedEnemyAgent);
					}
				}
				foreach (Renderer componentsInChild2 in ((Component)spawnedEnemyAgent).GetComponentsInChildren<Renderer>())
				{
					if (((Object)spawnedEnemyAgent).name.ToLower().Contains("tank") || ((Object)spawnedEnemyAgent).name.ToLower().Contains("birther"))
					{
						componentsInChild2.receiveShadows = true;
						componentsInChild2.castShadows = true;
						componentsInChild2.shadowCastingMode = (ShadowCastingMode)1;
					}
					if (((Object)spawnedEnemyAgent).name.ToLower().Contains("shadow"))
					{
						SkinnedMeshRenderer val = ((Il2CppObjectBase)componentsInChild2).TryCast<SkinnedMeshRenderer>();
						if ((Object)(object)val != (Object)null && (((Object)((Component)val).gameObject).name.ToLower().Contains("g_body_shadow") || ((Object)((Component)val).gameObject).name.ToLower().Contains("g_shooter") || ((Object)((Component)val).gameObject).name.ToLower().Contains("g_tank") || ((Object)((Component)val).gameObject).name.ToLower().Contains("g_birther") || ((Object)((Component)val).gameObject).name.ToLower().Contains("g_pouncer_shadow")))
						{
							val.updateWhenOffscreen = true;
						}
						if (componentsInChild2.enabled)
						{
							componentsInChild2.shadowCastingMode = (ShadowCastingMode)3;
						}
					}
					if (!((Object)componentsInChild2).name.ToLower().Contains("egg") && !((Object)componentsInChild2).name.ToLower().Contains("fleshsack"))
					{
						continue;
					}
					spawnedEnemyAgent.MovingCuller.m_disableAnimatorCullingWhenRenderingShadow = true;
					componentsInChild2.receiveShadows = false;
					componentsInChild2.castShadows = false;
					componentsInChild2.shadowCastingMode = (ShadowCastingMode)0;
					componentsInChild2.enabled = false;
					GameObject val2 = GameObject.CreatePrimitive((PrimitiveType)0);
					GameObject val3 = GameObject.CreatePrimitive((PrimitiveType)0);
					((Object)val2).name = "fd_egg_sphere1";
					((Object)val3).name = "fd_egg_sphere2_shadow";
					val2.transform.parent = ((Component)componentsInChild2).transform;
					val2.transform.localScale = Vector3.one;
					val2.transform.localPosition = ((Component)componentsInChild2).transform.localPosition;
					val3.transform.parent = ((Component)componentsInChild2).transform;
					val3.transform.localScale = Vector3.one;
					val3.transform.localPosition = ((Component)componentsInChild2).transform.localPosition;
					MeshRenderer component = val2.GetComponent<MeshRenderer>();
					MeshRenderer component2 = val3.GetComponent<MeshRenderer>();
					Material material = Object.Instantiate<Material>(((Renderer)component).sharedMaterial);
					Material material2 = Object.Instantiate<Material>(((Renderer)component).sharedMaterial);
					((Renderer)component).material = material;
					((Renderer)component2).material = material2;
					((Renderer)component).material.SetTexture("_MainTex", componentsInChild2.sharedMaterial.mainTexture);
					((Renderer)component).shadowCastingMode = (ShadowCastingMode)0;
					((Renderer)component).castShadows = false;
					((Renderer)component).material.color = new Color(1f, 1f, 1f, 1f);
					((Renderer)component).material.shader = Shader.Find("Cell/Enemy/EnemyFlesh_CD");
					((Renderer)component).material.enableInstancing = false;
					((Renderer)component2).shadowCastingMode = (ShadowCastingMode)3;
					((Renderer)component2).castShadows = true;
					((Renderer)component2).receiveShadows = false;
					((Renderer)component2).material.color = new Color(1f, 1f, 1f, 1f);
					((Renderer)component2).material.shader = Shader.Find("Cell/Enemy/EnemyFlesh_CD");
					((Renderer)component2).material.enableInstancing = false;
					((Collider)val2.GetComponent<SphereCollider>()).enabled = false;
					((Collider)val3.GetComponent<SphereCollider>()).enabled = false;
					Renderer component3 = val2.GetComponent<Renderer>();
					Renderer component4 = val3.GetComponent<Renderer>();
					try
					{
						Enumerator<MaterialRef> enumerator3 = spawnedEnemyAgent.MaterialHandler.m_materialRefs.GetEnumerator();
						while (enumerator3.MoveNext())
						{
							enumerator3.Current.m_renderers.Add(component4);
						}
					}
					catch (Exception value)
					{
						Debug.Log(Object.op_Implicit($"cmh error {value}"));
					}
					component3.shadowCastingMode = (ShadowCastingMode)0;
					component4.shadowCastingMode = (ShadowCastingMode)3;
					spawnedEnemyAgent.MovingCuller.CullBucket.Renderers.Remove(componentsInChild2);
					spawnedEnemyAgent.MovingCuller.CullBucket.Renderers.Add(component3);
					spawnedEnemyAgent.MovingCuller.Culler.hasShadowsEnabled = true;
					spawnedEnemyAgent.MovingCuller.CullBucket.ShadowRenderers.Add(component4);
					((Component)componentsInChild2).gameObject.AddComponent<FixShadows>().Attach(spawnedEnemyAgent, componentsInChild2, component3, component4);
				}
				spawnedEnemyAgent.MovingCuller.CullBucket.ComputeTotalBounds();
				((C_Cullable)spawnedEnemyAgent.MovingCuller.CullBucket).NeedsShadowRefresh = true;
			}
		}

		public static string CONFIG_PATH = Path.Combine(Paths.ConfigPath, "TumorShadowFix.cfg");

		public static ConfigFile config = new ConfigFile(CONFIG_PATH, true);

		public static ConfigEntry<bool> _cfgVisibleFromBehind;

		public static ConfigEntry<bool> _cfgThermalShadows;

		public override void Load()
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Expected O, but got Unknown
			//IL_002a: Expected O, but got Unknown
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Expected O, but got Unknown
			//IL_0059: Expected O, but got Unknown
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			_cfgVisibleFromBehind = config.Bind<bool>(new ConfigDefinition("General", "VisibleFromBehind"), false, new ConfigDescription("Make tumors visible when viewed from behind enemy", (AcceptableValueBase)null, Array.Empty<object>()));
			_cfgThermalShadows = config.Bind<bool>(new ConfigDefinition("General", "ThermalShadows"), true, new ConfigDescription("Make shadows made by this mod be visible on thermal imaging", (AcceptableValueBase)null, Array.Empty<object>()));
			ClassInjector.RegisterTypeInIl2Cpp<FixShadows>();
			ClassInjector.RegisterTypeInIl2Cpp<FixEnemySER>();
			new Harmony("oerr").PatchAll();
		}
	}
	[GeneratedCode("VersionInfoGenerator", "2.0.0+git50a4b1a-master")]
	[CompilerGenerated]
	internal static class VersionInfo
	{
		public const string RootNamespace = "TumorShadowFix";

		public const string Version = "1.0.0";

		public const string VersionPrerelease = null;

		public const string VersionMetadata = null;

		public const string SemVer = "1.0.0";

		public const string GitRevShort = null;

		public const string GitRevLong = null;

		public const string GitBranch = null;

		public const string GitTag = null;

		public const bool GitIsDirty = false;
	}
}