Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of SigmaLabubu v1.0.1
plugins/SigmaLabubu/BakaMODs.SigmaLabubu.dll
Decompiled 7 months ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BakaMODs.SigmaLabubu.NetcodePatcher; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using GameNetcodeStuff; using HarmonyLib; using LethalLib.Modules; using Microsoft.CodeAnalysis; using SigmaLabubu.Configuration; using SigmaLabubu.Spawning; using Unity.Netcode; using UnityEngine; using UnityEngine.AI; [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("BakaMODs.SigmaLabubu")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("SigmaLabubu")] [assembly: AssemblyTitle("BakaMODs.SigmaLabubu")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] [module: NetcodePatchedAssembly] internal class <Module> { static <Module>() { NetworkVariableSerializationTypes.InitializeSerializer_UnmanagedINetworkSerializable<NetworkObjectReference>(); NetworkVariableSerializationTypes.InitializeEqualityChecker_UnmanagedIEquatable<NetworkObjectReference>(); } } 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; } } [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 SigmaLabubu { internal class LabubuPrimeAI : HoarderBugAI { [CompilerGenerated] private sealed class <PrimeVaporDeathRoutine>d__107 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public bool destroy; public LabubuPrimeAI <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <PrimeVaporDeathRoutine>d__107(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>4__this.TryMakeNonBlocking(); <>4__this.TrySpawnDeathFX(); <>4__this.TryHideModel(); <>2__current = (object)new WaitForSeconds(0.45f); <>1__state = 1; return true; case 1: <>1__state = -1; <>4__this.<>n__0(destroy); return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private const string ANIM_START_WALK = "startWalk"; private const string ANIM_STOP_WALK = "stopWalk"; private const string ANIM_DEATH = "KillEnemy"; private bool walkingAnimActive = false; private Animator currentActiveAnimator; private static int primeSpawnCount; private static readonly int MAX_PRIMES; private bool hasSummonedAlly = false; private float idleTimer = 0f; private float navCheckCooldown = 0f; private bool wasHoldingItem = false; private float itemSearchCooldown = 0f; private float refreshItemsCooldown = 0f; private float navDiagLogCooldown = 0f; private float doorAssistCooldown = 0f; private float doorAssistWaitTimer = 0f; private bool colliderDimsInitialized = false; private float colliderRadius = 0.4f; private float colliderHeight = 1.8f; private Vector3 colliderCenter = Vector3.zero; private Vector3 lastSetDestination = new Vector3(99999f, 99999f, 99999f); private float destinationRefreshCooldown = 0f; private static readonly Dictionary<GrabbableObject, LabubuPrimeAI> s_itemReservations; private GrabbableObject reservedItem = null; private GrabbableObject lastHeldItemRef = null; private GrabbableObject lastDroppedItemRef = null; private float lastDropTime = 0f; private float nextLocalVoiceTime = 0f; private static float nextGlobalVoiceTime; private float originalVoiceVolume = 1f; private bool hadPlayerInSight = false; private float voiceSightDwell = 0f; private float voiceOutOfSight = 0f; private bool voiceArmed = true; private float voiceBlockedUntil = 0f; private static int organizerVariantIndex; private static int sigmaSlotsRemaining; private static bool sigmaSlotsDepleted; private static readonly HashSet<ulong> variantsWithSigmaActive; private bool aggressiveMode = false; private bool aggroVoicePlayed = false; private readonly Dictionary<PlayerControllerB, GrabbableObject> lastHeldByPlayer = new Dictionary<PlayerControllerB, GrabbableObject>(8); private NetworkVariable<int> modelVariantIndex = new NetworkVariable<int>(-1, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0); public List<GameObject> modelVariants = new List<GameObject>(); private static bool isNestPositionSet; private static Vector3 sharedNestPosition; public static List<PlayerControllerB> HuntedPlayers; private static int activeSigmaCount; public static readonly int MAX_SIGMAS; private static Dictionary<PlayerControllerB, SigmaLabubuAI> activeHunts; private bool deathSequenceStarted = false; private bool IsOrganizer => primeSpawnCount >= 2 && modelVariantIndex.Value == organizerVariantIndex; static LabubuPrimeAI() { primeSpawnCount = 0; MAX_PRIMES = 3; s_itemReservations = new Dictionary<GrabbableObject, LabubuPrimeAI>(128); nextGlobalVoiceTime = 0f; organizerVariantIndex = -1; sigmaSlotsRemaining = 3; sigmaSlotsDepleted = false; variantsWithSigmaActive = new HashSet<ulong>(); isNestPositionSet = false; HuntedPlayers = new List<PlayerControllerB>(); activeSigmaCount = 0; MAX_SIGMAS = 3; activeHunts = new Dictionary<PlayerControllerB, SigmaLabubuAI>(); sigmaSlotsRemaining = MAX_SIGMAS; sigmaSlotsDepleted = false; } public static void ResetSigmaSlotsForNewRound() { sigmaSlotsRemaining = MAX_SIGMAS; sigmaSlotsDepleted = false; variantsWithSigmaActive.Clear(); } public static void ConsumeSigmaSlot() { if (!sigmaSlotsDepleted) { sigmaSlotsRemaining = Mathf.Max(0, sigmaSlotsRemaining - 1); if (sigmaSlotsRemaining <= 0) { sigmaSlotsDepleted = true; } } } public static bool CanSpawnMoreSigmas() { return !sigmaSlotsDepleted && sigmaSlotsRemaining > 0; } private static void NotifySigmaStartedForSpawner(ulong spawnerId) { if (spawnerId != 0) { variantsWithSigmaActive.Add(spawnerId); } } public static void NotifySigmaEndedForSpawner(ulong spawnerId) { if (spawnerId != 0) { variantsWithSigmaActive.Remove(spawnerId); } } public override void DoAIInterval() { //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) try { ((HoarderBugAI)this).DoAIInterval(); } catch (Exception ex) { try { Plugin.Logger.LogWarning((object)("[LabubuPrimeAI] base.DoAIInterval NRE: " + ex.Message)); } catch { } } if (((EnemyAI)this).isEnemyDead || StartOfRound.Instance.allPlayersDead || (!((NetworkBehaviour)this).IsOwner && !((EnemyAI)this).isClientCalculatingAI)) { return; } if (sigmaSlotsDepleted) { aggressiveMode = true; } if ((Object)(object)((EnemyAI)this).agent != (Object)null) { Vector3 velocity = ((EnemyAI)this).agent.velocity; if (((Vector3)(ref velocity)).sqrMagnitude > 0.1f) { UpdateWalkAnimation(shouldWalk: true); goto IL_00c8; } } UpdateWalkAnimation(shouldWalk: false); goto IL_00c8; IL_00c8: if (aggressiveMode) { TryAggressiveChaseTick(); return; } if (((EnemyAI)this).currentBehaviourStateIndex == 2 && (Object)(object)base.angryAtPlayer != (Object)null) { ((EnemyAI)this).SwitchToBehaviourState(1); AttemptToSummonSigma(base.angryAtPlayer); } DriveHoarderBehaviour(); PeriodicHousekeeping(); SigmaTriggerTick(); KickstartMovementIfStuck(); DoorAssistTick(); try { VoiceOnSightTick(); } catch { } try { if ((Object)(object)((EnemyAI)this).creatureVoice != (Object)null) { bool flag = !hadPlayerInSight || Time.time < voiceBlockedUntil; if (flag && !((EnemyAI)this).creatureVoice.isPlaying) { ((EnemyAI)this).creatureVoice.mute = true; } else if (!flag) { ((EnemyAI)this).creatureVoice.mute = false; } } } catch { } } [ServerRpc(RequireOwnership = false)] private void SummonAllyServerRpc() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_01a6: 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_0115: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_0124: Unknown result type (might be due to invalid IL or missing references) //IL_0129: Unknown result type (might be due to invalid IL or missing references) //IL_012e: 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_0147: Unknown result type (might be due to invalid IL or missing references) //IL_0183: Unknown result type (might be due to invalid IL or missing references) //IL_0188: Unknown result type (might be due to invalid IL or missing references) //IL_0165: Unknown result type (might be due to invalid IL or missing references) //IL_016a: Unknown result type (might be due to invalid IL or missing references) //IL_0174: Unknown result type (might be due to invalid IL or missing references) //IL_0179: Unknown result type (might be due to invalid IL or missing references) //IL_017e: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost)) { ServerRpcParams val = default(ServerRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(915988411u, val, (RpcDelivery)0); ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 915988411u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost) && primeSpawnCount < MAX_PRIMES) { primeSpawnCount++; if (!TryFindSafeVariantSpawnNear(((Component)this).transform.position, out var pos) && !TryFindValidIndoorSpawn(out pos)) { Vector3 val3 = ((Component)this).transform.position + Random.insideUnitSphere * 2f; val3.y = ((Component)this).transform.position.y; NavMeshHit val4 = default(NavMeshHit); pos = (NavMesh.SamplePosition(val3, ref val4, 2f, -1) ? ((NavMeshHit)(ref val4)).position : (((Component)this).transform.position + Vector3.up * 0.25f)); } GameObject enemyPrefab = ((EnemyAI)this).enemyType.enemyPrefab; if ((Object)(object)enemyPrefab != (Object)null) { GameObject val5 = Object.Instantiate<GameObject>(enemyPrefab, pos, Quaternion.identity); val5.GetComponent<NetworkObject>().Spawn(true); Plugin.Logger.LogInfo((object)$"Labubu Prime Ally #{primeSpawnCount} invocado!"); } } } private void SummonAllyServerSide() { //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_0100: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) if (((NetworkBehaviour)this).IsServer && primeSpawnCount < MAX_PRIMES) { primeSpawnCount++; if (!TryFindSafeVariantSpawnNear(((Component)this).transform.position, out var pos) && !TryFindValidIndoorSpawn(out pos)) { Vector3 val = ((Component)this).transform.position + Random.insideUnitSphere * 2f; val.y = ((Component)this).transform.position.y; NavMeshHit val2 = default(NavMeshHit); pos = (NavMesh.SamplePosition(val, ref val2, 2f, -1) ? ((NavMeshHit)(ref val2)).position : (((Component)this).transform.position + Vector3.up * 0.25f)); } GameObject enemyPrefab = ((EnemyAI)this).enemyType.enemyPrefab; if ((Object)(object)enemyPrefab != (Object)null) { GameObject val3 = Object.Instantiate<GameObject>(enemyPrefab, pos, Quaternion.identity); val3.GetComponent<NetworkObject>().Spawn(true); Plugin.Logger.LogInfo((object)$"Labubu Prime Ally #{primeSpawnCount} invocado!"); } } } private bool TryFindSafeVariantSpawnNear(Vector3 origin, out Vector3 pos) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Unknown result type (might be due to invalid IL or missing references) //IL_0124: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Unknown result type (might be due to invalid IL or missing references) pos = Vector3.zero; GameObject prefab = (((Object)(object)((EnemyAI)this).enemyType != (Object)null) ? ((EnemyAI)this).enemyType.enemyPrefab : null); float radius = 0.45f; float height = 1.8f; GetVariantColliderDims(prefab, out radius, out height); float[] array = new float[3] { 1.2f, 1.8f, 2.4f }; int[] array2 = new int[6] { 0, 60, -60, 120, -120, 180 }; NavMeshHit val3 = default(NavMeshHit); NavMeshHit val4 = default(NavMeshHit); foreach (float num in array) { foreach (float num2 in array2) { Vector3 val = Quaternion.AngleAxis(num2, Vector3.up) * ((Component)this).transform.forward; Vector3 val2 = origin + val * num; try { if (NavMesh.SamplePosition(val2, ref val3, 1.2f, -1)) { Vector3 position = ((NavMeshHit)(ref val3)).position; if (!(Mathf.Abs(position.y - origin.y) > 1f) && !NavMesh.Raycast(origin, position, ref val4, -1) && HasFreeCapsuleAtWithDims(position, radius, height)) { pos = position; return true; } } } catch { } } } return false; } private void GetVariantColliderDims(GameObject prefab, out float radius, out float height) { radius = 0.45f; height = 1.8f; try { if (!((Object)(object)prefab != (Object)null)) { return; } CapsuleCollider componentInChildren = prefab.GetComponentInChildren<CapsuleCollider>(true); if ((Object)(object)componentInChildren != (Object)null) { radius = Mathf.Max(0.2f, componentInChildren.radius); height = Mathf.Max(1f, componentInChildren.height); return; } NavMeshAgent component = prefab.GetComponent<NavMeshAgent>(); if ((Object)(object)component != (Object)null) { radius = Mathf.Max(0.2f, component.radius); height = Mathf.Max(1f, component.height); } } catch { } } [ServerRpc(RequireOwnership = false)] private void SummonSigmaServerRpc(ulong targetPlayerClientId) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_027c: 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_0322: Unknown result type (might be due to invalid IL or missing references) //IL_0324: Unknown result type (might be due to invalid IL or missing references) //IL_02a6: Unknown result type (might be due to invalid IL or missing references) //IL_02b1: Unknown result type (might be due to invalid IL or missing references) //IL_02bb: Unknown result type (might be due to invalid IL or missing references) //IL_02c0: Unknown result type (might be due to invalid IL or missing references) //IL_02c5: Unknown result type (might be due to invalid IL or missing references) //IL_02cf: Unknown result type (might be due to invalid IL or missing references) //IL_02d4: Unknown result type (might be due to invalid IL or missing references) //IL_02d9: Unknown result type (might be due to invalid IL or missing references) //IL_02db: Unknown result type (might be due to invalid IL or missing references) //IL_0363: Unknown result type (might be due to invalid IL or missing references) //IL_0318: Unknown result type (might be due to invalid IL or missing references) //IL_031d: Unknown result type (might be due to invalid IL or missing references) //IL_02f9: Unknown result type (might be due to invalid IL or missing references) //IL_02fe: Unknown result type (might be due to invalid IL or missing references) //IL_0308: Unknown result type (might be due to invalid IL or missing references) //IL_030d: Unknown result type (might be due to invalid IL or missing references) //IL_0312: Unknown result type (might be due to invalid IL or missing references) //IL_0398: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost)) { ServerRpcParams val = default(ServerRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(1484071541u, val, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val2, targetPlayerClientId); ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 1484071541u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 || (!networkManager.IsServer && !networkManager.IsHost)) { return; } ulong targetPlayerClientId2 = targetPlayerClientId; PlayerControllerB val3 = ((IEnumerable<PlayerControllerB>)StartOfRound.Instance.allPlayerScripts).FirstOrDefault((Func<PlayerControllerB, bool>)((PlayerControllerB p) => p.actualClientId == targetPlayerClientId2)); if ((Object)(object)val3 == (Object)null) { try { Plugin.Logger.LogWarning((object)"[SigmaSummon] Abort: targetPlayer null"); return; } catch { return; } } if (HuntedPlayers.Contains(val3)) { try { Plugin.Logger.LogInfo((object)("[SigmaSummon] Abort: " + val3.playerUsername + " already hunted")); return; } catch { return; } } if (activeSigmaCount >= MAX_SIGMAS) { try { Plugin.Logger.LogInfo((object)"[SigmaSummon] Abort: activeSigmaCount >= MAX_SIGMAS"); return; } catch { return; } } if (!CanSpawnMoreSigmas()) { try { Plugin.Logger.LogInfo((object)$"[SigmaSummon] Abort: sigma slots depleted (remaining={sigmaSlotsRemaining})"); return; } catch { return; } } NetworkObject component = ((Component)this).GetComponent<NetworkObject>(); if ((Object)(object)component == (Object)null) { return; } ulong networkObjectId = component.NetworkObjectId; if (variantsWithSigmaActive.Contains(networkObjectId)) { try { Plugin.Logger.LogInfo((object)$"[SigmaSummon] Abort: variant {networkObjectId} already has Sigma"); return; } catch { return; } } HuntedPlayers.Add(val3); activeSigmaCount++; GameObject sigmaLabubuPrefab = Plugin.SigmaLabubuPrefab; if ((Object)(object)sigmaLabubuPrefab == (Object)null) { try { Plugin.Logger.LogError((object)"[SigmaSummon] Abort: SigmaLabubuPrefab is null"); return; } catch { return; } } if (!TryFindSafeSigmaSpawnNear(((Component)this).transform.position, ((Component)this).transform.forward, out var pos)) { Vector3 val4 = ((Component)this).transform.position - ((Component)this).transform.forward * 2f + Vector3.up * 0.25f; NavMeshHit val5 = default(NavMeshHit); pos = (NavMesh.SamplePosition(val4, ref val5, 2f, -1) ? ((NavMeshHit)(ref val5)).position : (((Component)this).transform.position + Vector3.up * 0.25f)); } GameObject val6 = Object.Instantiate<GameObject>(sigmaLabubuPrefab, pos, Quaternion.identity); val6.GetComponent<NetworkObject>().Spawn(true); SigmaLabubuAI component2 = val6.GetComponent<SigmaLabubuAI>(); if ((Object)(object)component2 != (Object)null) { component2.targetPlayerRef.Value = NetworkObjectReference.op_Implicit(((Component)val3).GetComponent<NetworkObject>()); component2.SetSpawnerVariant(networkObjectId); activeHunts[val3] = component2; } NotifySigmaStartedForSpawner(networkObjectId); try { Plugin.Logger.LogInfo((object)$"[SigmaSummon] Spawned Sigma at {pos} for {val3.playerUsername} by variant {networkObjectId}"); } catch { } ScreamAndRetreatLocal(); } private void SummonSigmaServerSide(PlayerControllerB targetPlayer) { //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_016e: Unknown result type (might be due to invalid IL or missing references) //IL_016f: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_0100: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Unknown result type (might be due to invalid IL or missing references) //IL_0114: Unknown result type (might be due to invalid IL or missing references) //IL_011e: Unknown result type (might be due to invalid IL or missing references) //IL_0123: 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_012a: Unknown result type (might be due to invalid IL or missing references) //IL_01ae: Unknown result type (might be due to invalid IL or missing references) //IL_0166: Unknown result type (might be due to invalid IL or missing references) //IL_016b: Unknown result type (might be due to invalid IL or missing references) //IL_0148: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Unknown result type (might be due to invalid IL or missing references) //IL_0157: Unknown result type (might be due to invalid IL or missing references) //IL_015c: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Unknown result type (might be due to invalid IL or missing references) if (!((NetworkBehaviour)this).IsServer || (Object)(object)targetPlayer == (Object)null || HuntedPlayers.Contains(targetPlayer) || activeSigmaCount >= MAX_SIGMAS || !CanSpawnMoreSigmas()) { return; } NetworkObject component = ((Component)this).GetComponent<NetworkObject>(); if ((Object)(object)component == (Object)null) { return; } ulong networkObjectId = component.NetworkObjectId; if (variantsWithSigmaActive.Contains(networkObjectId)) { return; } HuntedPlayers.Add(targetPlayer); activeSigmaCount++; GameObject sigmaLabubuPrefab = Plugin.SigmaLabubuPrefab; if (!((Object)(object)sigmaLabubuPrefab == (Object)null)) { if (!TryFindSafeSigmaSpawnNear(((Component)this).transform.position, ((Component)this).transform.forward, out var pos)) { Vector3 val = ((Component)this).transform.position - ((Component)this).transform.forward * 2f + Vector3.up * 0.25f; NavMeshHit val2 = default(NavMeshHit); pos = (NavMesh.SamplePosition(val, ref val2, 2f, -1) ? ((NavMeshHit)(ref val2)).position : (((Component)this).transform.position + Vector3.up * 0.25f)); } GameObject val3 = Object.Instantiate<GameObject>(sigmaLabubuPrefab, pos, Quaternion.identity); val3.GetComponent<NetworkObject>().Spawn(true); SigmaLabubuAI component2 = val3.GetComponent<SigmaLabubuAI>(); if ((Object)(object)component2 != (Object)null) { component2.targetPlayerRef.Value = NetworkObjectReference.op_Implicit(((Component)targetPlayer).GetComponent<NetworkObject>()); component2.SetSpawnerVariant(networkObjectId); activeHunts[targetPlayer] = component2; } NotifySigmaStartedForSpawner(networkObjectId); ScreamAndRetreatLocal(); } } private bool TryFindSafeSigmaSpawnNear(Vector3 origin, Vector3 forward, out Vector3 pos) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Unknown result type (might be due to invalid IL or missing references) pos = Vector3.zero; float radius = 0.4f; float height = 1.8f; GetSigmaColliderDims(out radius, out height); float[] array = new float[4] { 1f, 1.5f, 2f, 2.5f }; int[] array2 = new int[12] { 180, 150, -150, 120, -120, 90, -90, 60, -60, 30, -30, 0 }; NavMeshHit val3 = default(NavMeshHit); NavMeshHit val4 = default(NavMeshHit); foreach (float num in array) { foreach (float num2 in array2) { Vector3 val = Quaternion.AngleAxis(num2, Vector3.up) * ((Vector3)(ref forward)).normalized; Vector3 val2 = origin + -val * num + Vector3.up * 0.1f; try { if (NavMesh.SamplePosition(val2, ref val3, 1.5f, -1)) { Vector3 position = ((NavMeshHit)(ref val3)).position; if (!(Mathf.Abs(position.y - origin.y) > 1f) && !NavMesh.Raycast(origin, position, ref val4, -1) && HasFreeCapsuleAtWithDims(position, radius, height)) { pos = position; return true; } } } catch { } } } return false; } private void GetSigmaColliderDims(out float radius, out float height) { radius = 0.4f; height = 1.8f; try { GameObject sigmaLabubuPrefab = Plugin.SigmaLabubuPrefab; if (!((Object)(object)sigmaLabubuPrefab != (Object)null)) { return; } CapsuleCollider componentInChildren = sigmaLabubuPrefab.GetComponentInChildren<CapsuleCollider>(true); if ((Object)(object)componentInChildren != (Object)null) { radius = Mathf.Max(0.2f, componentInChildren.radius); height = Mathf.Max(1f, componentInChildren.height); return; } NavMeshAgent component = sigmaLabubuPrefab.GetComponent<NavMeshAgent>(); if ((Object)(object)component != (Object)null) { radius = Mathf.Max(0.2f, component.radius); height = Mathf.Max(1f, component.height); } } catch { } } private bool HasFreeCapsuleAtWithDims(Vector3 centerPos, float radius, float height) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001d: 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_001f: 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_0025: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002d: 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_0032: Unknown result type (might be due to invalid IL or missing references) try { float num = Mathf.Max(radius, height * 0.5f); Vector3 val = Vector3.up * (num - radius); Vector3 val2 = centerPos + val; Vector3 val3 = centerPos - val; int num2 = -1; Collider[] array = Physics.OverlapCapsule(val2, val3, radius, num2, (QueryTriggerInteraction)1); foreach (Collider val4 in array) { if (!((Object)(object)val4 == (Object)null) && !val4.isTrigger) { return false; } } return true; } catch { } return false; } public override void OnNetworkSpawn() { ((NetworkBehaviour)this).OnNetworkSpawn(); if (((NetworkBehaviour)this).IsServer) { if (modelVariants.Count > 0) { int num = ((primeSpawnCount > 0) ? (primeSpawnCount - 1) : 0); num = Mathf.Clamp(num, 0, modelVariants.Count - 1); modelVariantIndex.Value = num; Plugin.Logger.LogInfo((object)$"[Variants] Assigned variant index {num} (primeSpawnCount={primeSpawnCount})."); } if (organizerVariantIndex == -1 && primeSpawnCount >= 2) { organizerVariantIndex = 0; Plugin.Logger.LogInfo((object)$"[Organizer] Activated: variant index {organizerVariantIndex} organizes/guards nest items."); } RarityBoostController.NotifyLabubuPrimeSpawned(); } if (((NetworkBehaviour)this).IsOwner) { EnsureOnNavMeshAndKickstart(); try { ((EnemyAI)this).SwitchToBehaviourState(0); } catch { } if ((Object)(object)((EnemyAI)this).agent != (Object)null) { ((EnemyAI)this).agent.isStopped = false; try { ((EnemyAI)this).agent.autoBraking = false; } catch { } try { NetworkObject component = ((Component)this).GetComponent<NetworkObject>(); if ((Object)(object)component != (Object)null) { int num2 = 40; ((EnemyAI)this).agent.avoidancePriority = Mathf.Clamp(num2 + (int)(component.NetworkObjectId % 40), 20, 80); } } catch { } float num3 = Mathf.Max(0.1f, Plugin.BoundConfig.AgentSpeed.Value); float num4 = Mathf.Max(0.1f, Plugin.BoundConfig.AgentAcceleration.Value); if (((EnemyAI)this).agent.speed < num3) { ((EnemyAI)this).agent.speed = num3; } if (((EnemyAI)this).agent.acceleration < num4) { ((EnemyAI)this).agent.acceleration = num4; } } try { HoarderBugAI.RefreshGrabbableObjectsInMapList(); } catch { } } NetworkVariable<int> obj5 = modelVariantIndex; obj5.OnValueChanged = (OnValueChangedDelegate<int>)(object)Delegate.Combine((Delegate?)(object)obj5.OnValueChanged, (Delegate?)(object)new OnValueChangedDelegate<int>(OnModelVariantChanged)); SetModelVariant(modelVariantIndex.Value); try { FixCollisionDetectMainScript(); } catch (Exception) { } try { if ((Object)(object)((EnemyAI)this).creatureVoice != (Object)null) { originalVoiceVolume = Mathf.Max(0.01f, ((EnemyAI)this).creatureVoice.volume); } } catch { } } public override void OnNetworkDespawn() { ((NetworkBehaviour)this).OnNetworkDespawn(); NetworkVariable<int> obj = modelVariantIndex; obj.OnValueChanged = (OnValueChangedDelegate<int>)(object)Delegate.Remove((Delegate?)(object)obj.OnValueChanged, (Delegate?)(object)new OnValueChangedDelegate<int>(OnModelVariantChanged)); } private void OnModelVariantChanged(int previousValue, int newValue) { SetModelVariant(newValue); } private void SetModelVariant(int index) { if (modelVariants.Count == 0 || index < 0 || index >= modelVariants.Count) { return; } for (int i = 0; i < modelVariants.Count; i++) { if ((Object)(object)modelVariants[i] != (Object)null) { bool flag = i == index; modelVariants[i].SetActive(flag); if (flag) { currentActiveAnimator = modelVariants[i].GetComponentInChildren<Animator>(); ((EnemyAI)this).creatureAnimator = currentActiveAnimator; TryBindAudioSourcesFromModel(modelVariants[i]); } } } } public override void Start() { //IL_004a: 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_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) ((HoarderBugAI)this).Start(); if (!isNestPositionSet) { sharedNestPosition = ((EnemyAI)this).ChooseClosestNodeToPosition(((Component)this).transform.position, false, 0).position; isNestPositionSet = true; primeSpawnCount = Mathf.Max(primeSpawnCount, 1); } base.nestPosition = sharedNestPosition; } [ClientRpc] private void SyncSharedNestPositionClientRpc(Vector3 nestPos) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(2797527559u, val, (RpcDelivery)0); ((FastBufferWriter)(ref val2)).WriteValueSafe(ref nestPos); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 2797527559u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost)) { sharedNestPosition = nestPos; base.nestPosition = sharedNestPosition; isNestPositionSet = true; } } } public override void HitEnemy(int force = 1, PlayerControllerB playerWhoHit = null, bool playHitSFX = false, int hitID = -1) { ((HoarderBugAI)this).HitEnemy(force, playerWhoHit, playHitSFX, hitID); if (!((EnemyAI)this).isEnemyDead && ((NetworkBehaviour)this).IsOwner && (Object)(object)playerWhoHit != (Object)null) { AttemptToSummonSigma(playerWhoHit); } } private void AttemptToSummonSigma(PlayerControllerB triggeredByPlayer) { if (activeSigmaCount < MAX_SIGMAS && !HuntedPlayers.Contains(triggeredByPlayer) && ((NetworkBehaviour)this).IsServer) { SummonSigmaServerSide(triggeredByPlayer); } } private void ScreamAndRetreatLocal() { TryPlayVoiceSafe((base.angryScreechSFX != null && base.angryScreechSFX.Length != 0) ? base.angryScreechSFX[0] : null); ((EnemyAI)this).SwitchToBehaviourState(1); } public static void ReleaseHuntedPlayer(PlayerControllerB target) { if ((Object)(object)target != (Object)null && HuntedPlayers.Contains(target)) { HuntedPlayers.Remove(target); activeHunts.Remove(target); } HuntedPlayers.RemoveAll((PlayerControllerB p) => (Object)(object)p == (Object)null || p.isPlayerDead); } public static void ReportSigmaDestroyed(PlayerControllerB targetNoLongerHunted) { ReleaseHuntedPlayer(targetNoLongerHunted); activeSigmaCount--; if (activeSigmaCount < 0) { activeSigmaCount = 0; } } private void OnDisable() { try { ReleaseReservation(reservedItem); } catch { } } public override void OnDestroy() { try { ReleaseReservation(reservedItem); } catch { } try { NetworkObject component = ((Component)this).GetComponent<NetworkObject>(); if ((Object)(object)component != (Object)null) { NotifySigmaEndedForSpawner(component.NetworkObjectId); } } catch { } ((EnemyAI)this).OnDestroy(); if (((NetworkBehaviour)this).IsServer) { primeSpawnCount = 0; isNestPositionSet = false; HuntedPlayers.Clear(); activeSigmaCount = 0; activeHunts.Clear(); organizerVariantIndex = -1; } } private static bool TryFindValidIndoorSpawn(out Vector3 pos) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_019f: Unknown result type (might be due to invalid IL or missing references) //IL_01a1: Unknown result type (might be due to invalid IL or missing references) //IL_015e: Unknown result type (might be due to invalid IL or missing references) //IL_0167: Unknown result type (might be due to invalid IL or missing references) pos = Vector3.zero; RoundManager instance = RoundManager.Instance; if ((Object)(object)instance == (Object)null || instance.insideAINodes == null || instance.insideAINodes.Length == 0) { return false; } Vector3 val = (((Object)(object)StartOfRound.Instance != (Object)null && (Object)(object)StartOfRound.Instance.elevatorTransform != (Object)null) ? StartOfRound.Instance.elevatorTransform.position : RoundManager.FindMainEntrancePosition(true, false)); PlayerControllerB[] array = (((Object)(object)StartOfRound.Instance != (Object)null) ? StartOfRound.Instance.allPlayerScripts : null); NavMeshHit val3 = default(NavMeshHit); for (int i = 0; i < 40; i++) { Vector3 position = instance.insideAINodes[Random.Range(0, instance.insideAINodes.Length)].transform.position; Vector3 val2 = Random.insideUnitSphere * Random.Range(4f, 10f); val2.y = 0f; if (!NavMesh.SamplePosition(position + val2, ref val3, 8f, -1)) { continue; } Vector3 position2 = ((NavMeshHit)(ref val3)).position; if (Vector3.Distance(position2, val) < 16f) { continue; } bool flag = false; if (array != null) { PlayerControllerB[] array2 = array; foreach (PlayerControllerB val4 in array2) { if (!((Object)(object)val4 == (Object)null) && !val4.isPlayerDead && Vector3.Distance(position2, ((Component)val4).transform.position) < 16f) { flag = true; break; } } } if (!flag) { pos = position2; return true; } } return false; } private void FixCollisionDetectMainScript() { EnemyAICollisionDetect[] componentsInChildren = ((Component)this).GetComponentsInChildren<EnemyAICollisionDetect>(true); if (componentsInChildren == null) { return; } EnemyAICollisionDetect[] array = componentsInChildren; foreach (EnemyAICollisionDetect val in array) { if (!((Object)(object)val == (Object)null) && (Object)(object)val.mainScript == (Object)null) { val.mainScript = (EnemyAI)(object)this; } } } private void EnsureOnNavMeshAndKickstart() { //IL_0116: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)((EnemyAI)this).agent == (Object)null) { ((EnemyAI)this).agent = ((Component)this).GetComponent<NavMeshAgent>(); } NavMeshHit val = default(NavMeshHit); if ((Object)(object)((EnemyAI)this).agent != (Object)null && !((EnemyAI)this).agent.isOnNavMesh && NavMesh.SamplePosition(((Component)this).transform.position, ref val, 6f, -1)) { ((EnemyAI)this).agent.Warp(((NavMeshHit)(ref val)).position); } if ((Object)(object)((EnemyAI)this).agent != (Object)null && ((EnemyAI)this).agent.isOnNavMesh) { ((EnemyAI)this).agent.autoRepath = true; ((EnemyAI)this).agent.autoTraverseOffMeshLink = true; ((EnemyAI)this).agent.stoppingDistance = 0.15f; ((EnemyAI)this).agent.updateRotation = true; ((EnemyAI)this).agent.isStopped = false; try { ((EnemyAI)this).openDoorSpeedMultiplier = Mathf.Max(((EnemyAI)this).openDoorSpeedMultiplier, Plugin.BoundConfig.OpenDoorSpeedMultiplier.Value); } catch { } if (TryFindValidIndoorSpawn(out var pos)) { SetDestinationThrottled(pos); } } } private void KickstartMovementIfStuck() { //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Invalid comparison between Unknown and I4 //IL_017c: Unknown result type (might be due to invalid IL or missing references) //IL_01b5: Unknown result type (might be due to invalid IL or missing references) //IL_01ba: Unknown result type (might be due to invalid IL or missing references) //IL_01fc: Unknown result type (might be due to invalid IL or missing references) //IL_01ff: Unknown result type (might be due to invalid IL or missing references) //IL_0256: Unknown result type (might be due to invalid IL or missing references) //IL_0222: Unknown result type (might be due to invalid IL or missing references) //IL_0225: Unknown result type (might be due to invalid IL or missing references) //IL_0247: Unknown result type (might be due to invalid IL or missing references) //IL_0249: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)((EnemyAI)this).agent == (Object)null || !((EnemyAI)this).agent.isOnNavMesh) { return; } navCheckCooldown -= ((EnemyAI)this).AIIntervalTime; navDiagLogCooldown -= ((EnemyAI)this).AIIntervalTime; Vector3 velocity = ((EnemyAI)this).agent.velocity; if (((Vector3)(ref velocity)).sqrMagnitude < 0.01f) { idleTimer += ((EnemyAI)this).AIIntervalTime; } else { idleTimer = 0f; } if (!(navCheckCooldown <= 0f)) { return; } navCheckCooldown = 2f; float num = Mathf.Max(0.1f, Plugin.BoundConfig.IdleSecondsBeforeKickstart.Value); if (!(idleTimer >= num) && ((EnemyAI)this).agent.hasPath && (int)((EnemyAI)this).agent.pathStatus != 2) { return; } if (Plugin.BoundConfig.EnableNavDiagnostics.Value && navDiagLogCooldown <= 0f) { ManualLogSource logger = Plugin.Logger; object[] obj = new object[7] { modelVariantIndex.Value, ((EnemyAI)this).agent.isOnNavMesh, ((EnemyAI)this).agent.hasPath, ((EnemyAI)this).agent.pathStatus, ((EnemyAI)this).agent.isStopped, ((EnemyAI)this).agent.remainingDistance, null }; velocity = ((EnemyAI)this).agent.velocity; obj[6] = ((Vector3)(ref velocity)).magnitude; logger.LogInfo((object)string.Format("[NavDiag] LabubuPrime v{0} stuck: onNavMesh={1} hasPath={2} pathStatus={3} isStopped={4} remaining={5:F2} vel={6:F2}", obj)); navDiagLogCooldown = 3f; } ResetNestWaitModes(); if (!TryFindValidIndoorSpawn(out var pos)) { return; } if (!IsOrganizer && Vector3.Distance(pos, base.nestPosition) < 6f) { for (int i = 0; i < 5; i++) { if (!(Vector3.Distance(pos, base.nestPosition) < 6f)) { break; } if (!TryFindValidIndoorSpawn(out var pos2)) { break; } pos = pos2; } } SetDestinationThrottled(pos); idleTimer = 0f; } private void DoorAssistTick() { //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_034b: Unknown result type (might be due to invalid IL or missing references) //IL_0363: Unknown result type (might be due to invalid IL or missing references) //IL_0379: Unknown result type (might be due to invalid IL or missing references) //IL_01b3: Unknown result type (might be due to invalid IL or missing references) //IL_01b8: Unknown result type (might be due to invalid IL or missing references) //IL_01be: Unknown result type (might be due to invalid IL or missing references) //IL_01c3: Unknown result type (might be due to invalid IL or missing references) //IL_01c8: Unknown result type (might be due to invalid IL or missing references) //IL_0108: Unknown result type (might be due to invalid IL or missing references) //IL_0113: 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_011d: Unknown result type (might be due to invalid IL or missing references) //IL_01cb: 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) if ((Object)(object)((EnemyAI)this).agent == (Object)null || !((EnemyAI)this).agent.isOnNavMesh) { return; } doorAssistCooldown -= ((EnemyAI)this).AIIntervalTime; if (doorAssistCooldown < 0f) { doorAssistCooldown = 0f; } if (doorAssistWaitTimer > 0f) { doorAssistWaitTimer -= ((EnemyAI)this).AIIntervalTime; } Vector3 velocity = ((EnemyAI)this).agent.velocity; if (((Vector3)(ref velocity)).sqrMagnitude > 0.01f) { return; } Vector3 val = ((Component)this).transform.forward; float num = float.MaxValue; if (((EnemyAI)this).agent.hasPath && ((EnemyAI)this).agent.path != null) { Vector3[] corners = ((EnemyAI)this).agent.path.corners; if (corners != null && corners.Length >= 2) { Vector3 val2 = corners[1] - ((Component)this).transform.position; num = ((Vector3)(ref val2)).magnitude; if (((Vector3)(ref val2)).sqrMagnitude > 0.01f) { val = ((Vector3)(ref val2)).normalized; } } } if (doorAssistCooldown <= 0f) { float num2 = Mathf.Max(0.5f, (Plugin.BoundConfig?.DoorScanRadius?.Value).GetValueOrDefault(2.5f)); Vector3 val3 = ((Component)this).transform.position + val * 1f; try { Collider[] array = Physics.OverlapSphere(val3, num2, -1, (QueryTriggerInteraction)2); for (int i = 0; i < array.Length; i++) { if ((Object)(object)array[i] == (Object)null) { continue; } DoorLock val4 = ((Component)array[i]).GetComponentInParent<DoorLock>(); if ((Object)(object)val4 == (Object)null) { val4 = ((Component)array[i]).GetComponent<DoorLock>(); } if (!((Object)(object)val4 == (Object)null)) { try { val4.OpenDoorAsEnemyServerRpc(); } catch { } try { val4.OpenDoorAsEnemy(true); } catch { } doorAssistCooldown = 0.25f; doorAssistWaitTimer = Mathf.Max(0.1f, (Plugin.BoundConfig?.DoorAssistMaxWaitSeconds?.Value).GetValueOrDefault(1f)); return; } } } catch { } } if (!(doorAssistWaitTimer <= 0f) || !(num <= 2.75f)) { return; } float maxDistance = Mathf.Max(0.2f, (Plugin.BoundConfig?.DoorBypassOffset?.Value).GetValueOrDefault(1.6f)); if (!TryFindSafeBypassPosition(val, maxDistance, out var safePos)) { return; } try { ((EnemyAI)this).agent.Warp(safePos); if (TryFindValidIndoorSpawn(out var pos)) { SetDestinationThrottled(pos); } idleTimer = 0f; doorAssistCooldown = 0.3f; } catch { } } private bool TryFindSafeBypassPosition(Vector3 dir, float maxDistance, out Vector3 safePos) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) safePos = Vector3.zero; InitializeColliderDimsIfNeeded(); float[] array = new float[3] { 0.7f, 1f, 1.3f }; NavMeshHit val3 = default(NavMeshHit); NavMeshHit val4 = default(NavMeshHit); for (int i = 0; i < array.Length; i++) { float num = Mathf.Clamp(maxDistance * array[i], 0.2f, maxDistance * 1.5f); Vector3 val = ((Component)this).transform.position + ((Vector3)(ref dir)).normalized * num; Vector3 val2 = val; try { if (NavMesh.SamplePosition(val, ref val3, 1f, -1)) { val2 = ((NavMeshHit)(ref val3)).position; if (!(Mathf.Abs(val2.y - ((Component)this).transform.position.y) > 0.75f) && !NavMesh.Raycast(((Component)this).transform.position, val2, ref val4, -1) && HasFreeCapsuleAt(val2)) { safePos = val2; return true; } } } catch { } } return false; } private void InitializeColliderDimsIfNeeded() { //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_0143: Unknown result type (might be due to invalid IL or missing references) //IL_0148: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Unknown result type (might be due to invalid IL or missing references) if (colliderDimsInitialized) { return; } colliderDimsInitialized = true; try { CapsuleCollider componentInChildren = ((Component)this).GetComponentInChildren<CapsuleCollider>(); if ((Object)(object)componentInChildren != (Object)null) { colliderRadius = Mathf.Max(0.1f, componentInChildren.radius * Mathf.Max(((Component)this).transform.lossyScale.x, ((Component)this).transform.lossyScale.z)); colliderHeight = Mathf.Max(0.5f, componentInChildren.height * ((Component)this).transform.lossyScale.y); Bounds bounds = ((Collider)componentInChildren).bounds; colliderCenter = ((Bounds)(ref bounds)).center - Vector3.up * (colliderHeight * 0.5f - colliderRadius); return; } } catch { } try { if ((Object)(object)((EnemyAI)this).agent != (Object)null) { colliderRadius = Mathf.Max(0.1f, ((EnemyAI)this).agent.radius); colliderHeight = Mathf.Max(1f, ((EnemyAI)this).agent.height); colliderCenter = ((Component)this).transform.position + Vector3.up * (colliderHeight * 0.5f - colliderRadius); } } catch { } } private bool HasFreeCapsuleAt(Vector3 centerPos) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0035: 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_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) try { float num = Mathf.Max(colliderRadius, colliderHeight * 0.5f); Vector3 val = Vector3.up * (num - colliderRadius); Vector3 val2 = centerPos + val; Vector3 val3 = centerPos - val; int num2 = -1; Collider[] array = Physics.OverlapCapsule(val2, val3, colliderRadius, num2, (QueryTriggerInteraction)1); foreach (Collider val4 in array) { if (!((Object)(object)val4 == (Object)null) && !((Component)val4).transform.IsChildOf(((Component)this).transform) && !val4.isTrigger) { return false; } } return true; } catch { } return false; } private void DriveHoarderBehaviour() { //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_0243: Unknown result type (might be due to invalid IL or missing references) //IL_016e: Unknown result type (might be due to invalid IL or missing references) //IL_0216: 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_01a5: Unknown result type (might be due to invalid IL or missing references) //IL_01fc: Unknown result type (might be due to invalid IL or missing references) //IL_01c8: Unknown result type (might be due to invalid IL or missing references) //IL_01cb: Unknown result type (might be due to invalid IL or missing references) //IL_01ed: Unknown result type (might be due to invalid IL or missing references) //IL_01ef: Unknown result type (might be due to invalid IL or missing references) if (!wasHoldingItem && base.heldItem != null) { OnItemGrabbed(); } else if (wasHoldingItem && base.heldItem == null) { OnItemDropped(); } wasHoldingItem = base.heldItem != null; if (base.heldItem != null) { try { lastHeldItemRef = base.heldItem.itemGrabbableObject; } catch { lastHeldItemRef = null; } } if (base.heldItem != null) { if (Vector3.Distance(((Component)this).transform.position, base.nestPosition) > 1.5f) { SetDestinationThrottled(base.nestPosition); } return; } itemSearchCooldown -= ((EnemyAI)this).AIIntervalTime; if ((Object)(object)base.targetItem == (Object)null && itemSearchCooldown <= 0f) { itemSearchCooldown = 0.5f; GrabbableObject val = ((!IsOrganizer) ? FindClosestGrabbableItem(skipReserved: true) : FindItemForOrganizer(1.5f, 6f, skipReserved: true)); Vector3 pos; if ((Object)(object)val != (Object)null) { if (TryReserveItem(val)) { base.targetItem = val; SetDestinationThrottled(((Component)val).transform.position); } } else if (!IsOrganizer && TryFindValidIndoorSpawn(out pos)) { if (!IsOrganizer && Vector3.Distance(pos, base.nestPosition) < 6f) { for (int i = 0; i < 5; i++) { if (!(Vector3.Distance(pos, base.nestPosition) < 6f)) { break; } if (!TryFindValidIndoorSpawn(out var pos2)) { break; } pos = pos2; } } SetDestinationThrottled(pos); } else if (IsOrganizer) { SetDestinationThrottled(base.nestPosition); } } if ((Object)(object)base.targetItem != (Object)null) { SetDestinationThrottled(((Component)base.targetItem).transform.position); } } private void OnItemGrabbed() { if (!hasSummonedAlly && primeSpawnCount < MAX_PRIMES) { if (((NetworkBehaviour)this).IsServer) { SummonAllyServerSide(); } hasSummonedAlly = true; Plugin.Logger.LogInfo((object)"[Variants] Item grabbed; summoning next Labubu Prime variant."); if (organizerVariantIndex == -1 && primeSpawnCount >= 2) { organizerVariantIndex = 0; Plugin.Logger.LogInfo((object)$"[Organizer] Activated post-grab: variant {organizerVariantIndex} organizes/guards nest."); } } try { ReleaseReservation(reservedItem); } catch { } try { nextLocalVoiceTime = Mathf.Max(nextLocalVoiceTime, Time.time + 2.5f); voiceBlockedUntil = Mathf.Max(voiceBlockedUntil, Time.time + 2f); } catch { } } private void OnItemDropped() { //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) base.targetItem = null; try { ReleaseReservation(reservedItem); } catch { } ResetNestWaitModes(); if ((Object)(object)lastHeldItemRef != (Object)null) { lastDroppedItemRef = lastHeldItemRef; lastDropTime = Time.time; } try { ((EnemyAI)this).SwitchToBehaviourState(0); } catch { } if (!IsOrganizer && TryFindValidIndoorSpawn(out var pos)) { if (Vector3.Distance(pos, base.nestPosition) < 6f) { for (int i = 0; i < 5; i++) { if (!(Vector3.Distance(pos, base.nestPosition) < 6f)) { break; } if (!TryFindValidIndoorSpawn(out var pos2)) { break; } pos = pos2; } } ((EnemyAI)this).SetDestinationToPosition(pos, false); } try { nextLocalVoiceTime = Mathf.Max(nextLocalVoiceTime, Time.time + 2f); voiceBlockedUntil = Mathf.Max(voiceBlockedUntil, Time.time + 1.5f); } catch { } } private GrabbableObject FindClosestGrabbableItem(bool skipReserved = false) { //IL_0196: Unknown result type (might be due to invalid IL or missing references) //IL_019c: Unknown result type (might be due to invalid IL or missing references) //IL_0165: Unknown result type (might be due to invalid IL or missing references) //IL_016b: Unknown result type (might be due to invalid IL or missing references) //IL_01fb: Unknown result type (might be due to invalid IL or missing references) //IL_0207: Unknown result type (might be due to invalid IL or missing references) GrabbableObject result = null; float num = float.MaxValue; List<GrabbableObject> list = new List<GrabbableObject>(64); try { List<HoarderBugItem> hoarderBugItems = HoarderBugAI.HoarderBugItems; if (hoarderBugItems != null) { for (int i = 0; i < hoarderBugItems.Count; i++) { HoarderBugItem val = hoarderBugItems[i]; if (val != null && (Object)(object)val.itemGrabbableObject != (Object)null) { list.Add(val.itemGrabbableObject); } } } } catch { } try { List<GameObject> grabbableObjectsInMap = HoarderBugAI.grabbableObjectsInMap; if (grabbableObjectsInMap != null) { for (int j = 0; j < grabbableObjectsInMap.Count; j++) { GameObject val2 = grabbableObjectsInMap[j]; if (!((Object)(object)val2 == (Object)null)) { GrabbableObject component = val2.GetComponent<GrabbableObject>(); if ((Object)(object)component != (Object)null) { list.Add(component); } } } } } catch { } for (int k = 0; k < list.Count; k++) { GrabbableObject val3 = list[k]; if ((Object)(object)val3 == (Object)null || !val3.grabbableToEnemies || val3.deactivated || (skipReserved && IsItemReservedByOther(val3))) { continue; } if (!IsOrganizer) { float num2 = Vector3.Distance(((Component)val3).transform.position, base.nestPosition); if (num2 < 2.5f) { continue; } } else { float num3 = Vector3.Distance(((Component)val3).transform.position, base.nestPosition); if (num3 < 1.5f || ((Object)(object)lastDroppedItemRef != (Object)null && (Object)(object)val3 == (Object)(object)lastDroppedItemRef && Time.time - lastDropTime < 3f)) { continue; } } float num4 = Vector3.Distance(((Component)this).transform.position, ((Component)val3).transform.position); if (num4 < num) { result = val3; num = num4; } } return result; } private GrabbableObject FindItemForOrganizer(float minNestDistance, float maxNestDistance, bool skipReserved = false) { //IL_0155: Unknown result type (might be due to invalid IL or missing references) //IL_015b: Unknown result type (might be due to invalid IL or missing references) //IL_01bd: Unknown result type (might be due to invalid IL or missing references) //IL_01c9: Unknown result type (might be due to invalid IL or missing references) GrabbableObject result = null; float num = float.MaxValue; List<GrabbableObject> list = new List<GrabbableObject>(64); try { List<HoarderBugItem> hoarderBugItems = HoarderBugAI.HoarderBugItems; if (hoarderBugItems != null) { for (int i = 0; i < hoarderBugItems.Count; i++) { HoarderBugItem val = hoarderBugItems[i]; if (val != null && (Object)(object)val.itemGrabbableObject != (Object)null) { list.Add(val.itemGrabbableObject); } } } } catch { } try { List<GameObject> grabbableObjectsInMap = HoarderBugAI.grabbableObjectsInMap; if (grabbableObjectsInMap != null) { for (int j = 0; j < grabbableObjectsInMap.Count; j++) { GameObject val2 = grabbableObjectsInMap[j]; if (!((Object)(object)val2 == (Object)null)) { GrabbableObject component = val2.GetComponent<GrabbableObject>(); if ((Object)(object)component != (Object)null) { list.Add(component); } } } } } catch { } for (int k = 0; k < list.Count; k++) { GrabbableObject val3 = list[k]; if ((Object)(object)val3 == (Object)null || !val3.grabbableToEnemies || val3.deactivated || (skipReserved && IsItemReservedByOther(val3))) { continue; } float num2 = Vector3.Distance(((Component)val3).transform.position, base.nestPosition); if (!(num2 < minNestDistance) && !(num2 > maxNestDistance) && (!((Object)(object)lastDroppedItemRef != (Object)null) || !((Object)(object)val3 == (Object)(object)lastDroppedItemRef) || !(Time.time - lastDropTime < 3f))) { float num3 = Vector3.Distance(((Component)this).transform.position, ((Component)val3).transform.position); if (num3 < num) { result = val3; num = num3; } } } return result; } private bool SetDestinationSmart(Vector3 pos) { //IL_0005: 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) bool flag = false; try { flag = ((EnemyAI)this).SetDestinationToPosition(pos, false); if (!flag && (Object)(object)((EnemyAI)this).agent != (Object)null) { ((EnemyAI)this).agent.ResetPath(); flag = ((EnemyAI)this).agent.SetDestination(pos); } } catch { } return flag; } private bool SetDestinationThrottled(Vector3 pos) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) destinationRefreshCooldown -= ((EnemyAI)this).AIIntervalTime; float num = Vector3.Distance(pos, lastSetDestination); if (num < 0.5f && destinationRefreshCooldown > 0f) { return false; } bool flag = SetDestinationSmart(pos); if (flag) { lastSetDestination = pos; destinationRefreshCooldown = 0.25f; } return flag; } private static bool IsItemReservedByOther(GrabbableObject item) { if ((Object)(object)item == (Object)null) { return false; } if (s_itemReservations.TryGetValue(item, out LabubuPrimeAI value)) { if ((Object)(object)value == (Object)null) { s_itemReservations.Remove(item); return false; } return true; } return false; } private bool TryReserveItem(GrabbableObject item) { if ((Object)(object)item == (Object)null) { return false; } if (s_itemReservations.TryGetValue(item, out LabubuPrimeAI value)) { if ((Object)(object)value == (Object)(object)this) { return true; } return false; } s_itemReservations[item] = this; reservedItem = item; return true; } private void ReleaseReservation(GrabbableObject item) { if (!((Object)(object)item == (Object)null) && s_itemReservations.TryGetValue(item, out LabubuPrimeAI value) && (Object)(object)value == (Object)(object)this) { s_itemReservations.Remove(item); if ((Object)(object)reservedItem == (Object)(object)item) { reservedItem = null; } } } private bool TryPlayVoiceSafe(AudioClip clip) { try { if ((Object)(object)((EnemyAI)this).creatureVoice == (Object)null || (Object)(object)clip == (Object)null) { return false; } float time = Time.time; float num = 2.5f; float num2 = Mathf.Max(0f, Plugin.BoundConfig.VoiceGlobalGapSeconds.Value); if (time < nextLocalVoiceTime) { return false; } if (time < nextGlobalVoiceTime) { return false; } ((EnemyAI)this).creatureVoice.PlayOneShot(clip); nextLocalVoiceTime = time + num; nextGlobalVoiceTime = time + num2; return true; } catch { } return false; } private void VoiceOnSightTick() { bool flag = HasAnyPlayerInSight(25f); if (flag) { voiceOutOfSight = 0f; voiceSightDwell += ((EnemyAI)this).AIIntervalTime; if (voiceArmed && voiceSightDwell >= 0.6f) { AudioClip val = null; try { if (base.angryScreechSFX != null && base.angryScreechSFX.Length != 0) { val = base.angryScreechSFX[0]; } } catch { } if ((Object)(object)val == (Object)null && (Object)(object)((EnemyAI)this).creatureVoice != (Object)null && (Object)(object)((EnemyAI)this).creatureVoice.clip != (Object)null) { val = ((EnemyAI)this).creatureVoice.clip; } if (TryPlayVoiceSafe(val)) { voiceArmed = false; voiceSightDwell = 0f; } } } else { voiceSightDwell = 0f; voiceOutOfSight += ((EnemyAI)this).AIIntervalTime; if (voiceOutOfSight >= 1.5f) { voiceArmed = true; } } hadPlayerInSight = flag; } private bool HasAnyPlayerInSight(float range) { //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_0111: Unknown result type (might be due to invalid IL or missing references) //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_0124: Unknown result type (might be due to invalid IL or missing references) //IL_0126: 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) try { StartOfRound instance = StartOfRound.Instance; if ((Object)(object)instance == (Object)null || instance.allPlayerScripts == null) { return false; } RaycastHit val5 = default(RaycastHit); for (int i = 0; i < instance.allPlayerScripts.Length; i++) { PlayerControllerB val = instance.allPlayerScripts[i]; if ((Object)(object)val == (Object)null || val.isPlayerDead) { continue; } float num = Vector3.Distance(((Component)this).transform.position, ((Component)val).transform.position); if (num > range) { continue; } Vector3 val2 = ((Component)this).transform.position + Vector3.up * 1.5f; Vector3 val3 = (((Object)(object)val.playerEye != (Object)null) ? val.playerEye.position : (((Component)val).transform.position + Vector3.up * 1.6f)); Vector3 val4 = val3 - val2; float magnitude = ((Vector3)(ref val4)).magnitude; if (magnitude <= 0.01f) { return true; } val4 /= Mathf.Max(0.0001f, magnitude); if (Physics.Raycast(val2, val4, ref val5, magnitude, -1, (QueryTriggerInteraction)2)) { PlayerControllerB componentInParent = ((Component)((RaycastHit)(ref val5)).transform).GetComponentInParent<PlayerControllerB>(); if ((Object)(object)componentInParent != (Object)null && (Object)(object)componentInParent == (Object)(object)val) { return true; } } } } catch { } return false; } private void ResetNestWaitModes() { try { Type typeFromHandle = typeof(HoarderBugAI); FieldInfo field = typeFromHandle.GetField("waitingAtNest", BindingFlags.Instance | BindingFlags.NonPublic); FieldInfo field2 = typeFromHandle.GetField("inReturnToNestMode", BindingFlags.Instance | BindingFlags.NonPublic); if (field != null) { field.SetValue(this, false); } if (field2 != null) { field2.SetValue(this, false); } } catch { } } private void PeriodicHousekeeping() { refreshItemsCooldown -= ((EnemyAI)this).AIIntervalTime; if (refreshItemsCooldown <= 0f) { refreshItemsCooldown = 5f; try { HoarderBugAI.RefreshGrabbableObjectsInMapList(); } catch { } } try { nextLocalVoiceTime = Mathf.Max(nextLocalVoiceTime, Time.time + Mathf.Max(0.1f, Plugin.BoundConfig.VoiceLocalCooldownSeconds.Value)); } catch { } } private void UpdateWalkAnimation(bool shouldWalk) { if (!((Object)(object)((EnemyAI)this).creatureAnimator == (Object)null)) { if (shouldWalk && !walkingAnimActive) { walkingAnimActive = true; ((EnemyAI)this).creatureAnimator.SetTrigger("startWalk"); } else if (!shouldWalk && walkingAnimActive) { walkingAnimActive = false; ((EnemyAI)this).creatureAnimator.SetTrigger("stopWalk"); } } } public override void KillEnemy(bool destroy = false) { if (!deathSequenceStarted) { deathSequenceStarted = true; UpdateWalkAnimation(shouldWalk: false); if ((Object)(object)((EnemyAI)this).creatureAnimator != (Object)null) { ((EnemyAI)this).creatureAnimator.SetTrigger("KillEnemy"); } TryPlayDeathSFX(); ((MonoBehaviour)this).StartCoroutine(PrimeVaporDeathRoutine(destroy)); } } [IteratorStateMachine(typeof(<PrimeVaporDeathRoutine>d__107))] private IEnumerator PrimeVaporDeathRoutine(bool destroy) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <PrimeVaporDeathRoutine>d__107(0) { <>4__this = this, destroy = destroy }; } private void SafeTrigger(string triggerName) { //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Invalid comparison between Unknown and I4 try { if ((Object)(object)((EnemyAI)this).creatureAnimator == (Object)null) { return; } AnimatorControllerParameter[] parameters = ((EnemyAI)this).creatureAnimator.parameters; foreach (AnimatorControllerParameter val in parameters) { if (val.name == triggerName && (int)val.type == 9) { ((EnemyAI)this).creatureAnimator.SetTrigger(triggerName); break; } } } catch { } } private void TryMakeNonBlocking() { try { NavMeshAgent component = ((Component)this).GetComponent<NavMeshAgent>(); if ((Object)(object)component != (Object)null) { ((Behaviour)component).enabled = false; } } catch { } try { Collider[] componentsInChildren = ((Component)this).GetComponentsInChildren<Collider>(true); for (int i = 0; i < componentsInChildren.Length; i++) { if ((Object)(object)componentsInChildren[i] != (Object)null) { componentsInChildren[i].enabled = false; } } } catch { } try { Rigidbody[] componentsInChildren2 = ((Component)this).GetComponentsInChildren<Rigidbody>(true); foreach (Rigidbody val in componentsInChildren2) { if (!((Object)(object)val == (Object)null)) { val.isKinematic = true; val.detectCollisions = false; } } } catch { } } private void TrySpawnDeathFX() { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_002c: 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) try { if ((Object)(object)Plugin.ExplosionPrefab != (Object)null) { GameObject val = Object.Instantiate<GameObject>(Plugin.ExplosionPrefab, ((Component)this).transform.position + Vector3.up * 0.8f, Quaternion.identity); Object.Destroy((Object)(object)val, 4f); } } catch { } } private void TryHideModel() { //IL_0045: 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) try { Renderer[] componentsInChildren = ((Component)this).GetComponentsInChildren<Renderer>(true); for (int i = 0; i < componentsInChildren.Length; i++) { if ((Object)(object)componentsInChildren[i] != (Object)null) { componentsInChildren[i].enabled = false; } } } catch { } try { ((Component)this).transform.localScale = Vector3.one * 0.03f; } catch { } } private void TryPlayDeathSFX() { try { AudioClip val = null; Type typeFromHandle = typeof(EnemyAI); FieldInfo field = typeFromHandle.GetField("deathSFX", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field != null && field.GetValue(this) is AudioClip[] array && array.Length != 0) { val = array[0]; } if ((Object)(object)val == (Object)null) { try { if (base.angryScreechSFX != null && base.angryScreechSFX.Length != 0) { val = base.angryScreechSFX[Mathf.Min(1, base.angryScreechSFX.Length - 1)]; } } catch { } } if ((Object)(object)val != (Object)null && (Object)(object)((EnemyAI)this).creatureSFX != (Object)null) { ((EnemyAI)this).creatureSFX.PlayOneShot(val); } } catch { } } private void TryAggressiveChaseTick() { //IL_012d: 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_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)((EnemyAI)this).agent == (Object)null || !((EnemyAI)this).agent.isOnNavMesh) { return; } if (!aggroVoicePlayed) { try { TryPlayVoiceSafe((base.angryScreechSFX != null && base.angryScreechSFX.Length != 0) ? base.angryScreechSFX[0] : null); } catch { } aggroVoicePlayed = true; } PlayerControllerB val = null; float num = float.MaxValue; PlayerControllerB[] array = (((Object)(object)StartOfRound.Instance != (Object)null) ? StartOfRound.Instance.allPlayerScripts : null); if (array != null) { foreach (PlayerControllerB val2 in array) { if (!((Object)(object)val2 == (Object)null) && !val2.isPlayerDead) { float num2 = Vector3.Distance(((Component)this).transform.position, ((Component)val2).transform.position); if (num2 < num && num2 <= 25f) { num = num2; val = val2; } } } } Vector3 pos; if ((Object)(object)val != (Object)null) { SetDestinationThrottled(((Component)val).transform.position); } else if (TryFindValidIndoorSpawn(out pos)) { SetDestinationThrottled(pos); } } private void SigmaTriggerTick() { //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Unknown result type (might be due to invalid IL or missing references) if (!((NetworkBehaviour)this).IsOwner && !((EnemyAI)this).isClientCalculatingAI) { return; } StartOfRound instance = StartOfRound.Instance; if ((Object)(object)instance == (Object)null) { return; } PlayerControllerB[] allPlayerScripts = instance.allPlayerScripts; if (allPlayerScripts == null) { return; } float num = 2f; foreach (PlayerControllerB val in allPlayerScripts) { if ((Object)(object)val == (Object)null || val.isPlayerDead) { continue; } GrabbableObject val2 = (lastHeldByPlayer.ContainsKey(val) ? lastHeldByPlayer[val] : null); GrabbableObject playerHeldItemSafe = GetPlayerHeldItemSafe(val); if ((Object)(object)val2 == (Object)null && (Object)(object)playerHeldItemSafe != (Object)null) { float num2 = Vector3.Distance(((Component)val).transform.position, base.nestPosition); if (num2 <= num) { AttemptToSummonSigma(val); } } lastHeldByPlayer[val] = playerHeldItemSafe; } } private GrabbableObject GetPlayerHeldItemSafe(PlayerControllerB p) { try { PropertyInfo property = typeof(PlayerControllerB).GetProperty("currentlyHeldObjectServer"); if (property != null) { object? value = property.GetValue(p, null); return (GrabbableObject)((value is GrabbableObject) ? value : null); } } catch { } try { PropertyInfo property2 = typeof(PlayerControllerB).GetProperty("currentlyHeldObject"); if (property2 != null) { object? value2 = property2.GetValue(p, null); return (GrabbableObject)((value2 is GrabbableObject) ? value2 : null); } } catch { } return null; } public override void OnCollideWithPlayer(Collider other) { //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) ((HoarderBugAI)this).OnCollideWithPlayer(other); if (!aggressiveMode || ((EnemyAI)this).isEnemyDead) { return; } try { PlayerControllerB val = ((EnemyAI)this).MeetsStandardPlayerCollisionConditions(other, false, false); if ((Object)(object)val != (Object)null) { val.DamagePlayer(10, true, true, (CauseOfDeath)6, 0, false, default(Vector3)); } } catch { } } private void TryBindAudioSourcesFromModel(GameObject root) { try { if ((Object)(object)root == (Object)null) { return; } AudioSource[] componentsInChildren = root.GetComponentsInChildren<AudioSource>(true); if (componentsInChildren == null || componentsInChildren.Length == 0) { return; } AudioSource val = null; AudioSource val2 = null; foreach (AudioSource val3 in componentsInChildren) { if (!((Object)(object)val3 == (Object)null)) { string text = ((Object)((Component)val3).gameObject).name.ToLowerInvariant(); if ((Object)(object)val == (Object)null && (text.Contains("voice") || text.Contains("voc") || text.Contains("mouth"))) { val = val3; } if ((Object)(object)val2 == (Object)null && (text.Contains("sfx") || text.Contains("step") || text.Contains("foot"))) { val2 = val3; } } } if ((Object)(object)val == (Object)null) { val = componentsInChildren[0]; } if ((Object)(object)val2 == (Object)null) { val2 = ((componentsInChildren.Length > 1) ? componentsInChildren[1] : componentsInChildren[0]); } if ((Object)(object)val != (Object)null) { ((EnemyAI)this).creatureVoice = val; } if ((Object)(object)val2 != (Object)null) { ((EnemyAI)this).creatureSFX = val2; } try { if ((Object)(object)((EnemyAI)this).creatureVoice != (Object)null) { originalVoiceVolume = Mathf.Max(0.01f, ((EnemyAI)this).creatureVoice.volume); } } catch { } } catch { } } [CompilerGenerated] [DebuggerHidden] private void <>n__0(bool destroy = false) { ((HoarderBugAI)this).KillEnemy(destroy); } protected override void __initializeVariables() { if (modelVariantIndex == null) { throw new Exception("LabubuPrimeAI.modelVariantIndex cannot be null. All NetworkVariableBase instances must be initialized."); } ((NetworkVariableBase)modelVariantIndex).Initialize((NetworkBehaviour)(object)this); ((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)modelVariantIndex, "modelVariantIndex"); ((NetworkBehaviour)this).NetworkVariableFields.Add((NetworkVariableBase)(object)modelVariantIndex); ((HoarderBugAI)this).__initializeVariables(); } [RuntimeInitializeOnLoadMethod] internal static void InitializeRPCS_LabubuPrimeAI() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Expected O, but got Unknown //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Expected O, but got Unknown NetworkManager.__rpc_func_table.Add(915988411u, (RpcReceiveHandler)new RpcReceiveHandler(__rpc_handler_915988411)); NetworkManager.__rpc_func_table.Add(1484071541u, (RpcReceiveHandler)new RpcReceiveHandler(__rpc_handler_1484071541)); NetworkManager.__rpc_func_table.Add(2797527559u, (RpcReceiveHandler)new RpcReceiveHandler(__rpc_handler_2797527559)); } private static void __rpc_handler_915988411(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { target.__rpc_exec_stage = (__RpcExecStage)1; ((LabubuPrimeAI)(object)target).SummonAllyServerRpc(); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_1484071541(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0023: 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_0050: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { ulong targetPlayerClientId = default(ulong); ByteUnpacker.ReadValueBitPacked(reader, ref targetPlayerClientId); target.__rpc_exec_stage = (__RpcExecStage)1; ((LabubuPrimeAI)(object)target).SummonSigmaServerRpc(targetPlayerClientId); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_2797527559(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { Vector3 nestPos = default(Vector3); ((FastBufferReader)(ref reader)).ReadValueSafe(ref nestPos); target.__rpc_exec_stage = (__RpcExecStage)2; ((LabubuPrimeAI)(object)target).SyncSharedNestPositionClientRpc(nestPos); target.__rpc_exec_stage = (__RpcExecStage)0; } } protected internal override string __getTypeName() { return "LabubuPrimeAI"; } } [BepInPlugin("BakaMODs.SigmaLabubu", "SigmaLabubu", "1.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Plugin : BaseUnityPlugin { internal static ManualLogSource Logger; public static AssetBundle? ModAssets; public static GameObject? SigmaLabubuPrefab; public static GameObject? ExplosionPrefab; public static EnemyType? LabubuPrimeType; internal static PluginConfig BoundConfig { get; private set; } private static float ConfiguredDoorOpenMultiplier => (BoundConfig?.OpenDoorSpeedMultiplier?.Value).GetValueOrDefault(1f); private void Awake() { //IL_0251: Unknown result type (might be due to invalid IL or missing references) //IL_0258: Expected O, but got Unknown //IL_027e: Unknown result type (might be due to invalid IL or missing references) //IL_0285: Expected O, but got Unknown Logger = ((BaseUnityPlugin)this).Logger; BoundConfig = new PluginConfig(((BaseUnityPlugin)this).Config); InitializeNetworkBehaviours(); string path = "sigmalabubuassets"; ModAssets = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location), path)); if ((Object)(object)ModAssets == (Object)null) { Logger.LogError((object)"Failed to load custom assets."); return; } EnemyType val = ModAssets.LoadAsset<EnemyType>("PrimeLabubuObj"); TerminalNode val2 = ModAssets.LoadAsset<TerminalNode>("LabubuPrimeTN"); TerminalKeyword val3 = ModAssets.LoadAsset<TerminalKeyword>("LabubuPrimeTK"); SigmaLabubuPrefab = ModAssets.LoadAsset<GameObject>("SigmaLabubu"); ExplosionPrefab = ModAssets.LoadAsset<GameObject>("Explosion"); if ((Object)(object)ExplosionPrefab == (Object)null) { Logger.LogWarning((object)"[FX] Explosion prefab not found in bundle (name 'Explosion'). Using fallback vapor FX."); } LabubuPrimeType = val; try { EnemyHelper.SetProbabilityCurve(BoundConfig.SpawnProbabilityCurve.Value); } catch (Exception ex) { Logger.LogWarning((object)("[Spawn] Failed to set probability curve: " + ex.Message)); } try { if ((Object)(object)val != (Object)null && (Object)(object)val.enemyPrefab != (Object)null) { EnemyAI component = val.enemyPrefab.GetComponent<EnemyAI>(); if ((Object)(object)component != (Object)null) { component.openDoorSpeedMultiplier = Mathf.Max(0.01f, ConfiguredDoorOpenMultiplier); Logger.LogInfo((object)$"[Doors] Set openDoorSpeedMultiplier on prefab = {component.openDoorSpeedMultiplier}"); } } } catch (Exception ex2) { Logger.LogWarning((object)("[Doors] Failed to set openDoorSpeedMultiplier: " + ex2.Message)); } NetworkPrefabs.RegisterNetworkPrefab(val.enemyPrefab); NetworkPrefabs.RegisterNetworkPrefab(SigmaLabubuPrefab); Enemies.RegisterEnemy(val, BoundConfig.EasyMoonSpawnWeight.Value, (LevelTypes)28, val2, val3); Enemies.RegisterEnemy(val, BoundConfig.MediumMoonSpawnWeight.Value, (LevelTypes)96, val2, val3); Enemies.RegisterEnemy(val, BoundConfig.HardMoonSpawnWeight.Value, (LevelTypes)896, val2, val3); Enemies.RegisterEnemy(val, BoundConfig.ModdedMoonSpawnWeight.Value, (LevelTypes)1024, val2, val3); GameObject val4 = new GameObject("SpawnControl"); Object.DontDestroyOnLoad((Object)(object)val4); val4.AddComponent<SpawnControl>(); Logger.LogInfo((object)"[Spawn] SpawnControl anexado e ativo."); try { Harmony val5 = new Harmony("BakaMODs.SigmaLabubu"); val5.PatchAll(); Logger.LogInfo((object)"[Spawn] Harmony patches applied (RoundManager, HoarderBug, Intercept)."); } catch (Exception arg) { Logger.LogError((object)$"[Spawn] Failed to apply Harmony patches: {arg}"); } Logger.LogInfo((object)"Plugin BakaMODs.SigmaLabubu is loaded!"); } private static void InitializeNetworkBehaviours() { Type[] types = Assembly.GetExecutingAssembly().GetTypes(); Type[] array = types; foreach (Type type in array) { MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFla