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 YandereCuteamena v2.0.0
BepInEx/plugins/YandereCuteamena/com.github.xuuxiaolan.yanderecuteamena.dll
Decompiled 6 months agousing System; using System.CodeDom.Compiler; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Logging; using Dawn; using Dawn.Utils; using Dusk; using GameNetcodeStuff; using HarmonyLib; using Microsoft.CodeAnalysis; using Unity.Netcode; using Unity.Netcode.Components; using UnityEngine; using UnityEngine.AI; using UnityEngine.Events; using UnityEngine.SceneManagement; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("com.github.xuuxiaolan.yanderecuteamena")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("2.0.0.0")] [assembly: AssemblyInformationalVersion("2.0.0+0aec61723227e99416559b61bbf8756a0fe710d1")] [assembly: AssemblyProduct("YandereCuteamena")] [assembly: AssemblyTitle("com.github.xuuxiaolan.yanderecuteamena")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("2.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.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 YandereCuteamena { [RequireComponent(typeof(SmartAgentNavigator))] [RequireComponent(typeof(Animator))] [RequireComponent(typeof(NetworkAnimator))] [RequireComponent(typeof(NetworkTransform))] [RequireComponent(typeof(Collider))] public abstract class AdvancedEnemyAI : EnemyAI { internal EnemyAI? targetEnemy; internal PlayerControllerB? previousTargetPlayer; [Header("Required Components")] [SerializeField] internal NetworkAnimator creatureNetworkAnimator; [SerializeField] internal SmartAgentNavigator smartAgentNavigator; [Header("Inherited Fields")] public AudioClip[] _hitBodySounds = Array.Empty<AudioClip>(); public AudioClip spawnSound; [HideInInspector] public Random enemyRandom = new Random(); public override void Start() { ((EnemyAI)this).Start(); enemyRandom = new Random(StartOfRound.Instance.randomMapSeed + RoundManager.Instance.SpawnedEnemies.Count + 69); if ((Object)(object)spawnSound != (Object)null) { base.creatureVoice.PlayOneShot(spawnSound); } smartAgentNavigator.OnUseEntranceTeleport.AddListener((UnityAction<bool>)((EnemyAI)this).SetEnemyOutside); smartAgentNavigator.SetAllValues(base.isOutside); GrabEnemyRarity(base.enemyType.enemyName); } public override void HitEnemy(int force = 1, PlayerControllerB? playerWhoHit = null, bool playHitSFX = false, int hitID = -1) { ((EnemyAI)this).HitEnemy(force, playerWhoHit, playHitSFX, hitID); if (!base.isEnemyDead && playHitSFX && _hitBodySounds.Length != 0) { base.creatureSFX.PlayOneShot(_hitBodySounds[enemyRandom.Next(_hitBodySounds.Length)]); } } public void GrabEnemyRarity(string enemyName) { string enemyName2 = enemyName; SpawnableEnemyWithRarity val = ((IEnumerable<SpawnableEnemyWithRarity>)RoundManager.Instance.currentLevel.OutsideEnemies).FirstOrDefault((Func<SpawnableEnemyWithRarity, bool>)((SpawnableEnemyWithRarity x) => x.enemyType.enemyName.Equals(enemyName2))) ?? ((IEnumerable<SpawnableEnemyWithRarity>)RoundManager.Instance.currentLevel.DaytimeEnemies).FirstOrDefault((Func<SpawnableEnemyWithRarity, bool>)((SpawnableEnemyWithRarity x) => x.enemyType.enemyName.Equals(enemyName2))) ?? ((IEnumerable<SpawnableEnemyWithRarity>)RoundManager.Instance.currentLevel.Enemies).FirstOrDefault((Func<SpawnableEnemyWithRarity, bool>)((SpawnableEnemyWithRarity x) => x.enemyType.enemyName.Equals(enemyName2))); if (val != null) { YandereCuteamena.Logger.LogDebug((object)(enemyName2 + " has Rarity: " + val.rarity)); } else { YandereCuteamena.Logger.LogWarning((object)"Enemy not found."); } } public bool FindClosestPlayerInRange(float range, bool targetAlreadyTargettedPerson = true) { //IL_007a: 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_004b: Unknown result type (might be due to invalid IL or missing references) PlayerControllerB val = null; float num = float.MaxValue; PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; foreach (PlayerControllerB val2 in allPlayerScripts) { if (((NetworkBehaviour)val2).IsSpawned && val2.isPlayerControlled && !val2.isPlayerDead && !val2.isInHangarShipRoom && EnemyHasLineOfSightToPosition(((Component)val2).transform.position, 60f, range) && !CheckIfPersonAlreadyTargetted(targetAlreadyTargettedPerson, val2)) { float num2 = Vector3.Distance(((Component)this).transform.position, ((Component)val2).transform.position); if (num2 < num) { num = num2; val = val2; } } } if ((Object)(object)val == (Object)null) { return false; } base.targetPlayer = val; return true; } public bool CheckIfPersonAlreadyTargetted(bool targetAlreadyTargettedPerson, PlayerControllerB playerToCheck) { if (!targetAlreadyTargettedPerson) { return false; } foreach (EnemyAI spawnedEnemy in RoundManager.Instance.SpawnedEnemies) { if (spawnedEnemy is AdvancedEnemyAI advancedEnemyAI && (Object)(object)((EnemyAI)advancedEnemyAI).targetPlayer == (Object)(object)playerToCheck) { return true; } } return false; } public bool EnemyHasLineOfSightToPosition(Vector3 pos, float width = 60f, float range = 20f, float proximityAwareness = 5f) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: 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_0051: 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) //IL_0058: 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_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) Transform val = ((!((Object)(object)base.eye == (Object)null)) ? base.eye : ((Component)this).transform); float num = Vector3.Distance(val.position, pos); if (num < proximityAwareness) { return true; } if (num >= range || Physics.Linecast(val.position, pos, StartOfRound.Instance.collidersAndRoomMaskAndDefault, (QueryTriggerInteraction)1)) { return false; } Vector3 val2 = pos - val.position; return Vector3.Angle(val.forward, val2) < width; } public bool PlayerLookingAtEnemy(PlayerControllerB player, float dotProductThreshold) { //IL_0006: 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_001b: 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_0023: 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_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0039: 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_005a: Unknown result type (might be due to invalid IL or missing references) Vector3 val = ((Component)this).transform.position - ((Component)player).gameObject.transform.position; Vector3 normalized = ((Vector3)(ref val)).normalized; if (Vector3.Dot(((Component)player.gameplayCamera).transform.forward, normalized) < dotProductThreshold) { return false; } if (Physics.Linecast(((Component)player.gameplayCamera).transform.position, ((Component)this).transform.position, StartOfRound.Instance.collidersAndRoomMaskAndDefault, (QueryTriggerInteraction)1)) { return false; } return true; } public bool EnemySeesPlayer(PlayerControllerB player, float dotThreshold) { //IL_0029: 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_0039: 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_0041: 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) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0070: 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) Transform val = ((!((Object)(object)base.eye == (Object)null)) ? ((Component)base.eye).transform : ((Component)this).transform); Vector3 val2 = ((Component)player).transform.position - val.position; Vector3 normalized = ((Vector3)(ref val2)).normalized; if (Vector3.Dot(((Component)this).transform.forward, normalized) < dotThreshold) { return false; } float num = Vector3.Distance(val.position, ((Component)player).transform.position); if (Physics.Raycast(val.position, normalized, num, StartOfRound.Instance.collidersAndRoomMaskAndDefault, (QueryTriggerInteraction)1)) { return false; } return true; } [ServerRpc(RequireOwnership = false)] public void SetTargetServerRpc(int PlayerID) { SetTargetClientRpc(PlayerID); } [ClientRpc] public void SetTargetClientRpc(int PlayerID) { if (PlayerID == -1) { base.targetPlayer = null; PlayerSetAsTarget(null); } else if ((Object)(object)StartOfRound.Instance.allPlayerScripts[PlayerID] == (Object)null) { PlayerSetAsTarget(null); } else { previousTargetPlayer = base.targetPlayer; base.targetPlayer = StartOfRound.Instance.allPlayerScripts[PlayerID]; PlayerSetAsTarget(base.targetPlayer); } } [ServerRpc(RequireOwnership = false)] public void SetEnemyTargetServerRpc(int enemyID) { SetEnemyTargetClientRpc(enemyID); } [ClientRpc] public void SetEnemyTargetClientRpc(int enemyID) { if (enemyID == -1) { targetEnemy = null; EnemySetAsTarget(null); } else if ((Object)(object)RoundManager.Instance.SpawnedEnemies[enemyID] == (Object)null) { EnemySetAsTarget(null); } else { targetEnemy = RoundManager.Instance.SpawnedEnemies[enemyID]; EnemySetAsTarget(targetEnemy); } } public virtual void EnemySetAsTarget(EnemyAI? enemy) { } public virtual void PlayerSetAsTarget(PlayerControllerB? player) { } } public class CuteamenaEnemyAI : AdvancedEnemyAI { private enum CuteamenaState { Searching, Passive, Jealous, Yandere, Grief } private enum AttackType { Cleaver, Headbutt } [Header("Misc")] [SerializeField] private InteractTrigger _headPatTrigger; [SerializeField] private GameObject _cleaverGameObject; [Header("Stats")] [SerializeField] private float _wanderSpeed = 2f; [SerializeField] private float _followSpeed = 4f; [SerializeField] private float _chasingSpeed = 6f; [SerializeField] private int _healAmount = 10; [SerializeField] private float _healCooldown = 5f; [SerializeField] private float _attentionDistanceThreshold = 8f; [SerializeField] private float _jealousAttackRange = 5f; [SerializeField] private float _detectionRange = 20f; [SerializeField] private float _doorLockpickInterval = 200f; [SerializeField] private float _attackInterval = 5f; [SerializeField] private float _threatFindInterval = 2f; [Header("Audio")] [SerializeField] private AudioSource _griefingSource; [SerializeField] private AudioClip _cheerUpSound; [SerializeField] private AudioClip _yandereLaughSound; [SerializeField] private AudioClip[] _patSounds = Array.Empty<AudioClip>(); [SerializeField] private AudioClip[] _footstepSounds = Array.Empty<AudioClip>(); private PlayerControllerB? _chasingPlayer; private DoorLock? _targetDoor; private bool _isCleaverDrawn; private float _healTimer; private float _doorLockpickTimer; private float _attackTimer; private float _threatFindTimer; private static readonly int RunSpeedFloat = Animator.StringToHash("RunSpeed"); private static readonly int IsDeadAnimation = Animator.StringToHash("isDead"); private static readonly int CryingAnimation = Animator.StringToHash("crying"); private static readonly int HitAnimation = Animator.StringToHash("hit"); private static readonly int HeadbuttAnimation = Animator.StringToHash("headbutt"); private static readonly int PetAnimation = Animator.StringToHash("pat"); private static readonly int PullOutKnifeAnimation = Animator.StringToHash("pullOutKnife"); private static readonly int SlashAnimation = Animator.StringToHash("slashAttack"); public override void Start() { base.Start(); ((UnityEvent<PlayerControllerB>)(object)_headPatTrigger.onInteract).AddListener((UnityAction<PlayerControllerB>)OnHeadPatInteract); smartAgentNavigator.StartSearchRoutine(40f); ((EnemyAI)this).agent.speed = _wanderSpeed; _healTimer = _healCooldown; } public override void Update() { ((EnemyAI)this).Update(); _headPatTrigger.interactable = ((EnemyAI)this).currentBehaviourStateIndex == 1 || ((EnemyAI)this).currentBehaviourStateIndex == 2; if (!((EnemyAI)this).isEnemyDead && ((NetworkBehaviour)this).IsServer) { _threatFindTimer -= Time.deltaTime; _healTimer -= Time.deltaTime; _doorLockpickTimer -= Time.deltaTime; _attackTimer -= Time.deltaTime; } } public override void DoAIInterval() { //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) ((EnemyAI)this).DoAIInterval(); if (!((EnemyAI)this).isEnemyDead && !StartOfRound.Instance.allPlayersDead) { Animator creatureAnimator = ((EnemyAI)this).creatureAnimator; int runSpeedFloat = RunSpeedFloat; Vector3 velocity = ((EnemyAI)this).agent.velocity; creatureAnimator.SetFloat(runSpeedFloat, ((Vector3)(ref velocity)).magnitude / 3f); switch (((EnemyAI)this).currentBehaviourStateIndex) { case 0: LookForSenpai(); break; case 1: DoPassiveBehavior(); break; case 2: DoJealousBehavior(); break; case 3: DoYandereBehavior(); break; case 4: DoGriefBehavior(); break; } } } private void LookForSenpai() { //IL_0029: 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) PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; foreach (PlayerControllerB val in allPlayerScripts) { if (!val.isPlayerDead && val.isPlayerControlled && Vector3.Distance(((Component)this).transform.position, ((Component)val).transform.position) < _detectionRange) { ((EnemyAI)this).agent.speed = _followSpeed; SetTargetServerRpc(Array.IndexOf(StartOfRound.Instance.allPlayerScripts, val)); ((EnemyAI)this).SwitchToBehaviourServerRpc(1); break; } } } private void DoPassiveBehavior() { //IL_0196: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0116: Unknown result type (might be due to invalid IL or missing references) //IL_0122: 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_0129: Unknown result type (might be due to invalid IL or missing references) //IL_013a: 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_009a: 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) if ((Object)(object)((EnemyAI)this).targetPlayer == (Object)null || ((EnemyAI)this).targetPlayer.isPlayerDead) { ((EnemyAI)this).agent.speed = 0f; ((EnemyAI)this).creatureAnimator.SetBool(CryingAnimation, true); ((EnemyAI)this).SwitchToBehaviourServerRpc(4); return; } if ((Object)(object)targetEnemy != (Object)null) { if (targetEnemy.isEnemyDead) { SetEnemyTargetServerRpc(-1); return; } smartAgentNavigator.DoPathingToDestination(((Component)targetEnemy).transform.position); if (!(_attackTimer > 0f) && Vector3.Distance(((Component)this).transform.position, ((Component)targetEnemy).transform.position) < ((EnemyAI)this).agent.stoppingDistance) { _attackTimer = _attackInterval; creatureNetworkAnimator.SetTrigger(HeadbuttAnimation, true); } return; } if ((Object)(object)_targetDoor != (Object)null && _doorLockpickTimer <= 0f) { smartAgentNavigator.DoPathingToDestination(RoundManager.Instance.GetRandomNavMeshPositionInRadius(((Component)_targetDoor).transform.position, 2f, default(NavMeshHit))); if (Vector3.Distance(((Component)this).transform.position, ((Component)_targetDoor).transform.position) < ((EnemyAI)this).agent.stoppingDistance + 1f) { creatureNetworkAnimator.SetTrigger(HeadbuttAnimation, true); _doorLockpickTimer = _doorLockpickInterval; } return; } smartAgentNavigator.DoPathingToDestination(((Component)((EnemyAI)this).targetPlayer).transform.position); if (_healTimer <= 0f && ((EnemyAI)this).targetPlayer.health < 100) { HealSenpai(); _healTimer = _healCooldown; } else if (_threatFindTimer <= 0f) { FindThreatsNearbySenpai(); _threatFindTimer = _threatFindInterval; } else if (_doorLockpickTimer <= 0f) { ChooseDoorToLockpick(); _doorLockpickTimer = _doorLockpickInterval; } else if (IsSenpaiIgnoringMe() || IsSenpaiWithOtherPlayers()) { ((EnemyAI)this).SwitchToBehaviourServerRpc(2); } } private void DoJealousBehavior() { if ((Object)(object)((EnemyAI)this).targetPlayer == (Object)null || ((EnemyAI)this).targetPlayer.isPlayerDead) { ((EnemyAI)this).agent.speed = 0f; ((EnemyAI)this).creatureAnimator.SetBool(CryingAnimation, true); ((EnemyAI)this).SwitchToBehaviourServerRpc(4); return; } FollowSenpaiForwardly(); float distanceToRival; PlayerControllerB val = LookForOtherPlayers(out distanceToRival); if ((Object)(object)val != (Object)null) { AttackPlayer(val, distanceToRival); } else if (HasBeenFurtherIgnored()) { creatureNetworkAnimator.SetTrigger(PullOutKnifeAnimation, true); ((EnemyAI)this).agent.speed = _chasingSpeed; ((EnemyAI)this).SwitchToBehaviourServerRpc(3); } } private void DoYandereBehavior() { //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) if (!_isCleaverDrawn) { return; } if ((Object)(object)_chasingPlayer == (Object)null) { float num = float.MaxValue; PlayerControllerB chasingPlayer = null; PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; foreach (PlayerControllerB val in allPlayerScripts) { if (val.isPlayerControlled && !val.isPlayerDead) { chasingPlayer = val; num = Mathf.Min(num, Vector3.Distance(((Component)this).transform.position, ((Component)val).transform.position)); } } if (num <= _detectionRange) { _chasingPlayer = chasingPlayer; } } else if (_chasingPlayer.isPlayerDead) { _chasingPlayer = null; } ChaseAndAttackPlayer(_chasingPlayer); } private void DoGriefBehavior() { if (HasSenpaiBodyBeenMoved()) { creatureNetworkAnimator.SetTrigger(PullOutKnifeAnimation, true); ((EnemyAI)this).agent.speed = _chasingSpeed; ((EnemyAI)this).creatureAnimator.SetBool(CryingAnimation, false); ((EnemyAI)this).SwitchToBehaviourServerRpc(3); } } private void OnHeadPatInteract(PlayerControllerB player) { if (!((Object)(object)player == (Object)null) && !((Object)(object)player != (Object)(object)((EnemyAI)this).targetPlayer)) { HeadPatServerRpc(PlayerControllerReference.op_Implicit(player)); } } [ServerRpc(RequireOwnership = false)] private void HeadPatServerRpc(PlayerControllerReference playerControllerReference) { PlayerControllerB val = PlayerControllerReference.op_Implicit(playerControllerReference); creatureNetworkAnimator.SetTrigger(PetAnimation, true); if (((EnemyAI)this).currentBehaviourStateIndex == 2 && !((Object)(object)val != (Object)(object)((EnemyAI)this).targetPlayer)) { ((EnemyAI)this).SwitchToBehaviourClientRpc(1); } } private void ChaseAndAttackPlayer(PlayerControllerB? player) { //IL_0016: 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_0032: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)player == (Object)null)) { smartAgentNavigator.DoPathingToDestination(((Component)player).transform.position); if (Vector3.Distance(((Component)this).transform.position, ((Component)player).transform.position) < 2f) { creatureNetworkAnimator.SetTrigger(SlashAnimation, true); } } } private void FollowSenpaiForwardly() { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_001b: 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_002a: 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_0036: Unknown result type (might be due to invalid IL or missing references) Vector3 val = ((Component)((EnemyAI)this).targetPlayer).transform.position + ((Component)((EnemyAI)this).targetPlayer).transform.forward * 2f; smartAgentNavigator.DoPathingToDestination(val); } private void HealSenpai() { //IL_0013: Unknown result type (might be due to invalid IL or missing references) ((EnemyAI)this).targetPlayer.DamagePlayerFromOtherClientServerRpc(-_healAmount, ((Component)this).transform.position, Array.IndexOf(StartOfRound.Instance.allPlayerScripts, ((EnemyAI)this).targetPlayer)); } private void FindThreatsNearbySenpai() { //IL_000b: Unknown result type (might be due to invalid IL or missing references) Collider[] array = Physics.OverlapSphere(((Component)((EnemyAI)this).targetPlayer).transform.position, 10f, LayerMask.GetMask(new string[1] { "Enemies" }), (QueryTriggerInteraction)2); Collider[] array2 = array; foreach (Collider val in array2) { EnemyAICollisionDetect component = ((Component)val).GetComponent<EnemyAICollisionDetect>(); if (!((Object)(object)component == (Object)null) && component.mainScript.enemyType.canDie && !component.mainScript.isEnemyDead && !((Object)(object)component.mainScript.enemyType == (Object)(object)((EnemyAI)this).enemyType)) { SetEnemyTargetServerRpc(RoundManager.Instance.SpawnedEnemies.IndexOf(component.mainScript)); break; } } } private void ChooseDoorToLockpick() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) Collider[] array = Physics.OverlapSphere(((Component)this).transform.position, 10f, LayerMask.GetMask(new string[1] { "InteractableObject" }), (QueryTriggerInteraction)2); Collider[] array2 = array; foreach (Collider val in array2) { DoorLock component = ((Component)val).GetComponent<DoorLock>(); if ((Object)(object)component != (Object)null && component.isLocked) { ((Component)component).gameObject.GetComponent<NavMeshObstacle>().carving = false; _targetDoor = component; break; } } } private bool IsSenpaiIgnoringMe() { //IL_0006: 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) if (Vector3.Distance(((Component)this).transform.position, ((Component)((EnemyAI)this).targetPlayer).transform.position) > _attentionDistanceThreshold) { return !PlayerLookingAtEnemy(((EnemyAI)this).targetPlayer, 0.2f); } return false; } private bool IsSenpaiWithOtherPlayers() { //IL_0034: 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) PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; foreach (PlayerControllerB val in allPlayerScripts) { if (!((Object)(object)val == (Object)(object)((EnemyAI)this).targetPlayer) && !val.isPlayerDead && !(Vector3.Distance(((Component)((EnemyAI)this).targetPlayer).transform.position, ((Component)val).transform.position) > 5f)) { return true; } } return false; } private PlayerControllerB? LookForOtherPlayers(out float distanceToRival) { //IL_003f: 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) distanceToRival = 0f; PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; foreach (PlayerControllerB val in allPlayerScripts) { if (!((Object)(object)val == (Object)(object)((EnemyAI)this).targetPlayer) && !val.isPlayerDead && val.isPlayerControlled) { distanceToRival = Vector3.Distance(((Component)this).transform.position, ((Component)val).transform.position); if (!(distanceToRival > _jealousAttackRange + 5f) && !IsSenpaiLookingAt(val)) { return val; } } } return null; } private bool IsSenpaiLookingAt(PlayerControllerB player) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_001b: 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_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_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) Vector3 val = ((Component)player).transform.position - ((Component)((EnemyAI)this).targetPlayer.gameplayCamera).transform.position; Vector3 normalized = ((Vector3)(ref val)).normalized; float num = Vector3.Dot(((Component)((EnemyAI)this).targetPlayer.gameplayCamera).transform.forward, normalized); return num > 0.7f; } private bool HasBeenFurtherIgnored() { return Random.Range(0, 1000) < 2; } private void AttackPlayer(PlayerControllerB player, float distanceToRival) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) smartAgentNavigator.DoPathingToDestination(((Component)player).transform.position); if (!(distanceToRival < ((EnemyAI)this).agent.stoppingDistance + _jealousAttackRange)) { creatureNetworkAnimator.SetTrigger(HeadbuttAnimation, true); } } private void AttackPlayerWithAttackType(PlayerControllerB player, AttackType attackType) { //IL_0016: 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_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) switch (attackType) { case AttackType.Cleaver: player.DamagePlayer(20, true, false, (CauseOfDeath)1, 0, false, ((Component)this).transform.forward * 10f); break; case AttackType.Headbutt: player.DamagePlayer(10, true, false, (CauseOfDeath)1, 0, false, ((Component)this).transform.forward * 10f); break; } } private bool HasSenpaiBodyBeenMoved() { if ((Object)(object)((EnemyAI)this).targetPlayer.deadBody == (Object)null) { return false; } DeadBodyInfo deadBody = ((EnemyAI)this).targetPlayer.deadBody; if (deadBody.grabBodyObject.isHeld) { return true; } return deadBody.bodyMovedThisFrame; } public void StartPatAnimEvent() { smartAgentNavigator.DisableMovement(true); smartAgentNavigator.StopAgent(); } public void EndPatAnimEvent() { smartAgentNavigator.DisableMovement(false); } public void StartGriefingAnimEvent() { _ = _griefingSource.isPlaying; } public void FootstepSoundAnimEvent() { ((EnemyAI)this).creatureSFX.PlayOneShot(_footstepSounds[enemyRandom.Next(_footstepSounds.Length)]); } public void DrawMeatCleaverAnimEvent() { _isCleaverDrawn = true; _cleaverGameObject.SetActive(true); } public void DropCleaverAnimEvent() { //IL_0037: 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_0046: 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) _isCleaverDrawn = false; _cleaverGameObject.SetActive(false); NetworkSingleton<CuteamenaUtils>.Instance.SpawnScrap(((Registry<DawnItemInfo>)(object)LethalContent.Items)[YandereCuteamenaItemKeys.Cleaver].Item, _cleaverGameObject.transform.position, defaultRotation: true, 0); } public void OnSwingCleaverAnimEvent() { if (!((Object)(object)_chasingPlayer == (Object)null)) { AttackPlayerWithAttackType(_chasingPlayer, AttackType.Cleaver); } } public void HeadbuttAnimEvent() { if ((Object)(object)_targetDoor != (Object)null) { _targetDoor.UnlockDoor(); ((Component)_targetDoor).gameObject.GetComponent<NavMeshObstacle>().carving = true; _targetDoor = null; } else if ((Object)(object)_chasingPlayer != (Object)null) { AttackPlayerWithAttackType(_chasingPlayer, AttackType.Headbutt); } else if ((Object)(object)targetEnemy != (Object)null) { targetEnemy.HitEnemy(1, ((EnemyAI)this).targetPlayer, true, -1); } } public override void HitEnemy(int force = 1, PlayerControllerB? playerWhoHit = null, bool playHitSFX = false, int hitID = -1) { base.HitEnemy(force, playerWhoHit, playHitSFX, hitID); if (((EnemyAI)this).isEnemyDead) { return; } ((EnemyAI)this).enemyHP = ((EnemyAI)this).enemyHP - force; if (((EnemyAI)this).enemyHP <= 0) { if (((NetworkBehaviour)this).IsOwner) { ((EnemyAI)this).KillEnemyOnOwnerClient(false); } return; } if (((NetworkBehaviour)this).IsServer) { creatureNetworkAnimator.SetTrigger(HitAnimation, true); } if (!((Object)(object)playerWhoHit == (Object)null) && ((EnemyAI)this).currentBehaviourStateIndex != 3) { if (((EnemyAI)this).currentBehaviourStateIndex == 2) { creatureNetworkAnimator.SetTrigger(PullOutKnifeAnimation, true); ((EnemyAI)this).agent.speed = _chasingSpeed; ((EnemyAI)this).SwitchToBehaviourStateOnLocalClient(3); } else { ((EnemyAI)this).SwitchToBehaviourStateOnLocalClient(2); } } } public override void KillEnemy(bool destroy = false) { ((EnemyAI)this).KillEnemy(destroy); _cleaverGameObject.SetActive(false); if (((NetworkBehaviour)this).IsServer) { ((EnemyAI)this).creatureAnimator.SetBool(IsDeadAnimation, true); } } } internal class CuteamenaUtils : NetworkSingleton<CuteamenaUtils> { [CompilerGenerated] private sealed class <ForceRotationForABit>d__3 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public GameObject go; public Quaternion rotation; private float <duration>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <ForceRotationForABit>d__3(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0042: Unknown result type (might be due to invalid IL or missing references) switch (<>1__state) { default: return false; case 0: <>1__state = -1; <duration>5__2 = 0.25f; break; case 1: <>1__state = -1; break; } if (<duration>5__2 > 0f) { <duration>5__2 -= Time.deltaTime; go.transform.rotation = rotation; <>2__current = null; <>1__state = 1; return true; } 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(); } } public NetworkObjectReference SpawnScrap(Item? item, Vector3 position, bool defaultRotation, int valueIncrease, Quaternion rotation = default(Quaternion)) { //IL_0018: 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_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_008f: 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_009a: 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_00d7: 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_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0083: 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_00e4: 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_00df: Unknown result type (might be due to invalid IL or missing references) //IL_0162: Unknown result type (might be due to invalid IL or missing references) //IL_0155: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)StartOfRound.Instance == (Object)null || (Object)(object)item == (Object)null) { return default(NetworkObjectReference); } Transform val = null; if ((Object)(object)val == (Object)null) { val = StartOfRound.Instance.propsContainer; } Vector3 val2 = position; RaycastHit val3 = default(RaycastHit); if (Physics.Raycast(position + Vector3.up * 1f, Vector3.down, ref val3, 100f, StartOfRound.Instance.collidersAndRoomMaskAndDefault, (QueryTriggerInteraction)1)) { val2 = ((RaycastHit)(ref val3)).point + Vector3.up * item.verticalOffset; } GameObject val4 = Object.Instantiate<GameObject>(item.spawnPrefab, val2 + Vector3.up * 0.2f, Quaternion.identity, val); GrabbableObject component = val4.GetComponent<GrabbableObject>(); NetworkObject networkObject = ((NetworkBehaviour)component).NetworkObject; component.fallTime = 0f; networkObject.Spawn(false); UpdateParentAndRotationsServerRpc(new NetworkObjectReference(val4), defaultRotation ? Quaternion.Euler(item.restingRotation) : rotation); int num = (int)((float)Random.Range(item.minValue, item.maxValue) * RoundManager.Instance.scrapValueMultiplier) + valueIncrease; ScanNodeProperties componentInChildren = val4.GetComponentInChildren<ScanNodeProperties>(); if ((Object)(object)componentInChildren != (Object)null) { componentInChildren.scrapValue = num; componentInChildren.subText = $"Value: ${num}"; component.scrapValue = num; UpdateScanNodeServerRpc(new NetworkObjectReference(networkObject), num); } return new NetworkObjectReference(val4); } [ServerRpc(RequireOwnership = false)] public void UpdateParentAndRotationsServerRpc(NetworkObjectReference go, Quaternion rotation) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) UpdateParentAndRotationsClientRpc(go, rotation); } [ClientRpc] public void UpdateParentAndRotationsClientRpc(NetworkObjectReference go, Quaternion rotation) { //IL_0060: Unknown result type (might be due to invalid IL or missing references) NetworkObject val = default(NetworkObject); ((NetworkObjectReference)(ref go)).TryGet(ref val, (NetworkManager)null); if ((Object)(object)val != (Object)null) { if (val.AutoObjectParentSync && ((NetworkBehaviour)this).IsServer) { ((Component)val).transform.parent = StartOfRound.Instance.propsContainer; } else if (!val.AutoObjectParentSync) { ((Component)val).transform.parent = StartOfRound.Instance.propsContainer; } ((MonoBehaviour)this).StartCoroutine(ForceRotationForABit(((Component)val).gameObject, rotation)); } } [IteratorStateMachine(typeof(<ForceRotationForABit>d__3))] private IEnumerator ForceRotationForABit(GameObject go, Quaternion rotation) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <ForceRotationForABit>d__3(0) { go = go, rotation = rotation }; } [ServerRpc(RequireOwnership = false)] public void UpdateScanNodeServerRpc(NetworkObjectReference go, int value) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) UpdateScanNodeClientRpc(go, value); } [ClientRpc] public void UpdateScanNodeClientRpc(NetworkObjectReference go, int value) { NetworkObject val = default(NetworkObject); ((NetworkObjectReference)(ref go)).TryGet(ref val, (NetworkManager)null); GrabbableObject val2 = default(GrabbableObject); if ((Object)(object)val != (Object)null && ((Component)val).gameObject.TryGetComponent<GrabbableObject>(ref val2)) { val2.SetScrapValue(value); } } } [HarmonyPatch(typeof(StartOfRound))] internal static class StartOfRoundPatch { [HarmonyPatch("Awake")] [HarmonyPostfix] public static void StartOfRound_Awake(ref StartOfRound __instance) { NetworkObjectExtensions.OnSpawn(((NetworkBehaviour)__instance).NetworkObject, (Action)CreateNetworkManager); } private static void CreateNetworkManager() { //IL_0040: Unknown result type (might be due to invalid IL or missing references) if ((((NetworkBehaviour)StartOfRound.Instance).IsServer || ((NetworkBehaviour)StartOfRound.Instance).IsHost) && (Object)(object)NetworkSingleton<CuteamenaUtils>.Instance == (Object)null) { GameObject val = Object.Instantiate<GameObject>(YandereCuteamena.Assets.UtilsPrefab); SceneManager.MoveGameObjectToScene(val, ((Component)StartOfRound.Instance).gameObject.scene); val.GetComponent<NetworkObject>().Spawn(false); } } } [BepInPlugin("com.github.xuuxiaolan.yanderecuteamena", "YandereCuteamena", "2.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class YandereCuteamena : BaseUnityPlugin { internal class MainAssets : AssetBundleLoader<MainAssets> { [LoadFromBundle("CuteamenaUtils.prefab")] public GameObject UtilsPrefab { get; private set; } public MainAssets(AssetBundle bundle) : base(bundle) { } } internal static readonly Harmony _harmony = new Harmony("com.github.xuuxiaolan.yanderecuteamena"); internal static ManualLogSource Logger { get; private set; } public static DuskMod Mod { get; private set; } internal static MainAssets Assets { get; private set; } = null; private void Awake() { Logger = ((BaseUnityPlugin)this).Logger; _harmony.PatchAll(typeof(StartOfRoundPatch)); AssetBundle val = AssetBundleUtils.LoadBundle(Assembly.GetExecutingAssembly(), "yanderecuteamenaassets"); Assets = new MainAssets(val); Mod = DuskMod.RegisterMod((BaseUnityPlugin)(object)this, val); Mod.RegisterContentHandlers(); Logger.LogInfo((object)"com.github.xuuxiaolan.yanderecuteamena v2.0.0 has loaded!"); } } public class CuteamenaHandler : ContentHandler<CuteamenaHandler> { public class CuteamenaBundle : AssetBundleLoader<CuteamenaBundle> { public CuteamenaBundle(DuskMod mod, string filePath) : base(mod, filePath) { } } public CuteamenaBundle? Cuteamena; public CuteamenaHandler(DuskMod mod) : base(mod) { ((ContentHandler)this).RegisterContent<CuteamenaBundle>("cuteaassets", ref Cuteamena, false); } } public static class MyPluginInfo { public const string PLUGIN_GUID = "com.github.xuuxiaolan.yanderecuteamena"; public const string PLUGIN_NAME = "YandereCuteamena"; public const string PLUGIN_VERSION = "2.0.0"; } [GeneratedCode("DawnLib", "0.4.3")] public static class YandereCuteamenaEnemyKeys { public static NamespacedKey<DawnEnemyInfo> Cutea = NamespacedKey<DawnEnemyInfo>.From("yandere_cuteamena", "cutea"); public static NamespacedKey<DawnEnemyInfo>? GetByReflection(string name) { return (NamespacedKey<DawnEnemyInfo>)(typeof(YandereCuteamenaEnemyKeys).GetField(name)?.GetValue(null)); } } [GeneratedCode("DawnLib", "0.4.3")] public static class YandereCuteamenaItemKeys { public static NamespacedKey<DawnItemInfo> Cleaver = NamespacedKey<DawnItemInfo>.From("yandere_cuteamena", "cleaver"); public static NamespacedKey<DawnItemInfo>? GetByReflection(string name) { return (NamespacedKey<DawnItemInfo>)(typeof(YandereCuteamenaItemKeys).GetField(name)?.GetValue(null)); } } }