using System;
using System.CodeDom.Compiler;
using System.Collections;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using AIGraph;
using BepInEx;
using BepInEx.Unity.IL2CPP;
using BepInEx.Unity.IL2CPP.Utils.Collections;
using HarmonyLib;
using Il2CppSystem;
using LevelGeneration;
using Microsoft.CodeAnalysis;
using Player;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("GlueFix")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("GlueFix")]
[assembly: AssemblyTitle("GlueFix")]
[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 GlueFix
{
[BepInPlugin("GlueFix", "GlueFix", "0.0.5")]
public class Plugin : BasePlugin
{
public class GlueFix : MonoBehaviour
{
public static void Initialize()
{
foreach (InfectionSpitter item in Object.FindObjectsOfType<InfectionSpitter>())
{
CoroutineManager.StartCoroutine(CollectionExtensions.WrapToIl2Cpp(SpitterKiller(item)), (Action)null);
}
foreach (CellSoundEmitter item2 in Object.FindObjectsOfType<CellSoundEmitter>())
{
Behaviour component = ((Component)item2).GetComponent<Behaviour>();
if ((Object)(object)component != (Object)null)
{
component.enabled = false;
}
((MonoBehaviour)item2).StopAllCoroutines();
item2.StopSound();
if (item2.m_sound != null)
{
item2.m_sound.Recycle();
}
Debug.Log(Object.op_Implicit("GlueFix - removed sound from " + ((Object)((Component)((Component)item2).transform.parent).gameObject).name));
}
}
public static void GlueKiller(GlueGunProjectile blob)
{
CoroutineManager.StartCoroutine(CollectionExtensions.WrapToIl2Cpp(GlueFixer(blob)), (Action)null);
}
public static IEnumerator SpitterKiller(InfectionSpitter spit)
{
AIG_CourseNode node = spit.m_courseNode;
int id = ((Object)spit).GetInstanceID();
PlayerAgent plr = PlayerManager.GetLocalPlayerAgent();
while (true)
{
if (plr.m_courseNode != node && spit.m_sound != null && spit.m_purrLoopPlaying)
{
spit.m_purrLoopPlaying = false;
spit.CleanupSound();
Debug.Log(Object.op_Implicit($"GlueFix - removed audio from spitter {id} in zone {spit.m_courseNode.m_zone.ID} area {spit.m_courseNode.m_area.UID}"));
}
yield return (object)new WaitForSeconds(1f);
}
}
public static IEnumerator GlueFixer(GlueGunProjectile blob)
{
float alku = Clock.Time;
yield return (object)new WaitForSeconds(6f);
_ = blob.SyncID;
if (!((Object)(object)blob != (Object)null))
{
yield break;
}
while ((Object)(object)blob != (Object)null)
{
float num = Clock.Time - alku;
if ((int)blob.m_collisionLandingType == 5 && !((StickingProjectileBase)blob).CollisionCheck(false))
{
Debug.Log(Object.op_Implicit($"GlueFix: destroy hovering blob {blob.SyncID}"));
if (blob.m_sound != null)
{
blob.m_sound.Recycle();
}
blob.m_sound = null;
ProjectileManager.WantToDestroyGlue(blob.SyncID);
}
if ((int)blob.m_collisionLandingType == 4)
{
if ((Object)(object)((Component)((StickingProjectileBase)blob).m_projLastRayHitCollider).gameObject == (Object)null)
{
Debug.Log(Object.op_Implicit($"a true orphan is found and removed {blob.SyncID}"));
if (blob.m_sound != null)
{
blob.m_sound.Recycle();
}
blob.m_sound = null;
ProjectileManager.WantToDestroyGlue(blob.SyncID);
}
if ((Object)(object)((Component)((StickingProjectileBase)blob).m_projLastRayHitCollider).gameObject != (Object)null)
{
LG_WeakDoor componentInParent = ((Component)((StickingProjectileBase)blob).m_projLastRayHitCollider).gameObject.GetComponentInParent<LG_WeakDoor>();
if ((Object)(object)componentInParent == (Object)null)
{
if (blob.m_sound != null)
{
blob.m_sound.Recycle();
}
blob.m_sound = null;
ProjectileManager.WantToDestroyGlue(blob.SyncID);
}
if ((Object)(object)componentInParent != (Object)null && (int)componentInParent.LastStatus == 11)
{
if (blob.m_sound != null)
{
blob.m_sound.Recycle();
}
blob.m_sound = null;
ProjectileManager.WantToDestroyGlue(blob.SyncID);
Debug.Log(Object.op_Implicit($"GlueFix: destroy blob of destroyed door {blob.SyncID}"));
}
}
}
if (num > 257f && (int)blob.m_collisionLandingType != 4)
{
Debug.Log(Object.op_Implicit($"GlueFix: destroy ghost blob {blob.SyncID}"));
if (blob.m_sound != null)
{
blob.m_sound.Recycle();
}
blob.m_sound = null;
ProjectileManager.WantToDestroyGlue(blob.SyncID);
}
yield return (object)new WaitForSeconds(1f);
}
}
}
[HarmonyPatch(typeof(GlueGunProjectile), "Awake")]
private class CfoamDebugPatches
{
[HarmonyPostfix]
private static void Postfix(GlueGunProjectile __instance)
{
GlueFix.GlueKiller(__instance);
}
[HarmonyPatch(typeof(GlueGunProjectile), "SyncDestroy")]
[HarmonyPrefix]
private static bool Prefix(GlueGunProjectile __instance)
{
if (__instance.m_sound != null)
{
Debug.Log(Object.op_Implicit("GlueFix: blob destroyed, m_sound recycled"));
__instance.m_sound.Recycle();
}
return true;
}
[HarmonyPatch(typeof(Item), "OnDespawn")]
[HarmonyPrefix]
private static void KillSound(Item __instance)
{
CellSoundPlayer component = ((Component)__instance).GetComponent<CellSoundPlayer>();
if (component != null)
{
component.Recycle();
Debug.Log(Object.op_Implicit("GlueFix - CellSoundPlayer of item " + ((Object)((Component)__instance).gameObject).name + " was recycled"));
}
}
}
public override void Load()
{
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
new Harmony("GlueFix").PatchAll();
((BasePlugin)this).AddComponent<GlueFix>();
LG_Factory.OnFactoryBuildDone += Action.op_Implicit((Action)GlueFix.Initialize);
}
}
[GeneratedCode("VersionInfoGenerator", "2.0.0+git50a4b1a-master")]
[CompilerGenerated]
internal static class VersionInfo
{
public const string RootNamespace = "GlueFix";
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;
}
}