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 Mortician v0.1.5
plugins/Morris.dll
Decompiled 2 years 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.IO; 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.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using EmotesAPI; using EntityStates; using EntityStates.SurvivorPod; using HG; using HG.BlendableTypes; using JetBrains.Annotations; using KinematicCharacterController; using Mono.Cecil.Cil; using MonoMod.Cil; using Morris; using Morris.Components; using Morris.Content; using Morris.Modules; using Morris.Modules.Characters; using Morris.Modules.NPC; using Morris.Modules.Survivors; using On.RoR2; using R2API; using R2API.Utils; using RoR2; using RoR2.Achievements; using RoR2.CharacterAI; using RoR2.ContentManagement; using RoR2.Navigation; using RoR2.Orbs; using RoR2.Projectile; using RoR2.Skills; using RoR2.UI; using ShaderSwapper; using SkillStates.CoffinPod; using SkillStates.Ghoul; using SkillStates.Morris; using SkillStates.SharedStates; using SkillStates.Tombstone; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.Events; using UnityEngine.Networking; using UnityEngine.Rendering; [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("Morris")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+c346115485ec0a14284147d6289de929408937ea")] [assembly: AssemblyProduct("Morris")] [assembly: AssemblyTitle("Morris")] [assembly: CompilationRelaxations(8)] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: UnverifiableCode] public class SoulOrbLocator : MonoBehaviour { [SerializeField] private GameObject[] soulOrbs; public void ActivateSphere(int i) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: 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_002f: Expected O, but got Unknown soulOrbs[i].SetActive(true); EffectData val = new EffectData { origin = soulOrbs[i].transform.position }; EffectManager.SpawnEffect(MorrisAssets.SoulOrbActivatedEffect, val, true); } public void DeactivateSphere(int i) { soulOrbs[i].SetActive(false); } public Vector3 GetPosition(int i) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0013: 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) return soulOrbs[i].transform.position; } } namespace SkillStates.Tombstone { internal class TombstoneDeath : GenericCharacterDeath { public override void OnEnter() { ((GenericCharacterDeath)this).OnEnter(); } public override void FixedUpdate() { ((GenericCharacterDeath)this).FixedUpdate(); } public override void Update() { ((EntityState)this).Update(); } public override void OnExit() { ((GenericCharacterDeath)this).OnExit(); } } internal class TombstoneLaunched : BaseLaunchedState { public override void OnEnter() { //IL_000f: Unknown result type (might be due to invalid IL or missing references) launchPower = 60f; damageType = (DamageType)32; impactVFX = MorrisAssets.OmniImpactVFXTombstone; base.OnEnter(); ((EntityState)this).gameObject.layer = LayerIndex.fakeActor.intVal; ((BaseCharacterController)((EntityState)this).characterMotor).Motor.RebuildCollidableLayers(); ((EntityState)this).characterMotor.muteWalkMotion = false; } public override void PlayLaunchEntry() { ((EntityState)this).PlayAnimation("FullBody, Override", "ForwardSpin"); } public override void PlayLaunchExit() { ((EntityState)this).PlayAnimation("FullBody, Override", "BufferEmpty"); } public override void OnExit() { ((EntityState)this).gameObject.layer = LayerIndex.defaultLayer.intVal; ((BaseCharacterController)((EntityState)this).characterMotor).Motor.RebuildCollidableLayers(); ((EntityState)this).characterMotor.muteWalkMotion = true; base.OnExit(); } } internal class TombstoneMain : GenericCharacterMain { private MorrisMinionController minionController; public override void OnEnter() { ((GenericCharacterMain)this).OnEnter(); minionController = ((EntityState)this).GetComponent<MorrisMinionController>(); } public override void FixedUpdate() { ((GenericCharacterMain)this).FixedUpdate(); } public override void Update() { ((GenericCharacterMain)this).Update(); } public override void OnExit() { ((GenericCharacterMain)this).OnExit(); } } internal class TombstoneSpawn : BaseState { public static float duration = 1f; public string spawnSoundString = "Morris_TombstoneSpawn"; public override void OnEnter() { ((BaseState)this).OnEnter(); Util.PlaySound(spawnSoundString, ((EntityState)this).gameObject); Transform modelTransform = ((EntityState)this).GetModelTransform(); TemporaryOverlayInstance val = TemporaryOverlayManager.AddOverlay(((EntityState)this).gameObject); val.duration = duration * 1.2f; val.animateShaderAlpha = true; val.alphaCurve = AnimationCurve.EaseInOut(0f, 1f, 1f, 0.1f); val.destroyComponentOnEnd = true; val.originalMaterial = MorrisAssets.TombstoneSpawnMat; val.AddToCharacterModel(((Component)modelTransform).GetComponent<CharacterModel>()); } public override void FixedUpdate() { ((EntityState)this).FixedUpdate(); if (((EntityState)this).fixedAge >= duration && ((EntityState)this).isAuthority) { ((EntityState)this).outer.SetNextStateToMain(); } } public override void Update() { ((EntityState)this).Update(); } public override void OnExit() { ((EntityState)this).OnExit(); } } } namespace SkillStates.SharedStates { internal class BaseLaunchedState : BaseState { public static float minDuration = 0.3f; public static float maxDuration = 5f; public static float damageCoefficient = 3.5f; public static float yOffset = 0.1f; public static float minMassToExitState = 200f; public static Vector3 downwardForce = Vector3.zero; public float launchPower; public DamageType damageType; private MorrisMinionController minionController; private OverlapAttack attack; public Vector3 launchVector; private List<HurtBox> victims = new List<HurtBox>(); private float cachedAirControl; protected GameObject impactVFX; public override void OnEnter() { //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Expected O, but got Unknown //IL_007e: 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_00c3: 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_00d4: 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_00de: 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_0135: Expected O, but got Unknown //IL_017d: Unknown result type (might be due to invalid IL or missing references) //IL_0182: Unknown result type (might be due to invalid IL or missing references) //IL_0187: Unknown result type (might be due to invalid IL or missing references) //IL_01a3: Unknown result type (might be due to invalid IL or missing references) //IL_01a8: Unknown result type (might be due to invalid IL or missing references) //IL_01fd: Unknown result type (might be due to invalid IL or missing references) //IL_0202: Unknown result type (might be due to invalid IL or missing references) ((BaseState)this).OnEnter(); PlayLaunchEntry(); minionController = ((EntityState)this).GetComponent<MorrisMinionController>(); launchVector.y += yOffset; cachedAirControl = ((EntityState)this).characterMotor.airControl; ((EntityState)this).characterMotor.airControl = 0.15f; if (NetworkServer.active) { ((EntityState)this).characterBody.AddBuff(Buffs.HiddenInvincibility); } if (((EntityState)this).isAuthority) { ((EntityState)this).characterDirection.forward = launchVector; ((EntityState)this).characterBody.isSprinting = true; ((BaseCharacterController)((EntityState)this).characterMotor).Motor.ForceUnground(0.1f); ((EntityState)this).characterMotor.velocity = Vector3.zero; CharacterMotor characterMotor = ((EntityState)this).characterMotor; characterMotor.velocity += launchVector * launchPower; } Transform modelTransform = ((EntityState)this).GetModelTransform(); HitBoxGroup hitBoxGroup = new HitBoxGroup(); if (Object.op_Implicit((Object)(object)modelTransform)) { hitBoxGroup = Array.Find(((Component)modelTransform).GetComponents<HitBoxGroup>(), (HitBoxGroup element) => element.groupName == "LaunchHitbox"); } attack = new OverlapAttack(); attack.attacker = (Object.op_Implicit((Object)(object)minionController.owner) ? minionController.owner : ((EntityState)this).gameObject); attack.inflictor = ((EntityState)this).gameObject; attack.damageType = DamageTypeCombo.op_Implicit(damageType); attack.procCoefficient = 1f; attack.teamIndex = ((BaseState)this).GetTeam(); attack.isCrit = (Object.op_Implicit((Object)(object)minionController.owner) ? Util.CheckRoll(minionController.ownerBody.crit, minionController.ownerBody.master) : ((BaseState)this).RollCrit()); attack.forceVector = downwardForce; attack.pushAwayForce = 1f; attack.damage = damageCoefficient * base.damageStat; attack.hitBoxGroup = hitBoxGroup; attack.hitEffectPrefab = impactVFX; } public override void FixedUpdate() { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Invalid comparison between Unknown and I4 //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Invalid comparison between Unknown and I4 ((EntityState)this).FixedUpdate(); if (!((EntityState)this).isAuthority) { return; } ((EntityState)this).characterDirection.forward = ((Vector3)(ref ((EntityState)this).characterMotor.velocity)).normalized; if (attack.Fire(victims)) { foreach (HurtBox victim in victims) { if (!Object.op_Implicit((Object)(object)victim.healthComponent) || !victim.healthComponent.alive) { continue; } Rigidbody component = ((Component)victim.healthComponent).GetComponent<Rigidbody>(); if (Object.op_Implicit((Object)(object)component)) { float mass = component.mass; if (mass >= minMassToExitState) { OnHitLargeEnemy(victim); } } else { CharacterBody body = victim.healthComponent.body; if ((int)body.hullClassification == 1 || (int)body.hullClassification == 2) { OnHitLargeEnemy(victim); } } } } if ((((EntityState)this).fixedAge >= minDuration && ((BaseCharacterController)((EntityState)this).characterMotor).Motor.GroundingStatus.IsStableOnGround) || ((EntityState)this).fixedAge >= maxDuration) { ((EntityState)this).outer.SetNextStateToMain(); } } public virtual void PlayLaunchEntry() { } public virtual void PlayLaunchExit() { } public virtual void OnHitLargeEnemy(HurtBox target) { } public override void OnExit() { //IL_002b: 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_003a: Unknown result type (might be due to invalid IL or missing references) PlayLaunchExit(); if (NetworkServer.active) { ((EntityState)this).characterBody.RemoveBuff(Buffs.HiddenInvincibility); } CharacterMotor characterMotor = ((EntityState)this).characterMotor; characterMotor.velocity *= 0.05f; ((EntityState)this).characterMotor.airControl = cachedAirControl; ((EntityState)this).OnExit(); } public override InterruptPriority GetMinimumInterruptPriority() { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) return (InterruptPriority)5; } } } namespace SkillStates.Morris { internal class PlaceTombstone : BaseState { private struct PlacementInfo { public bool ok; public Vector3 position; public Quaternion rotation; } public static GameObject tombstoneMasterPrefab; private const float tombstoneHeight = 7f; private const float tombstoneRadius = 1f; private float entryDelay = 0.1f; private float exitDelay = 0.25f; private bool exitPending; private BlueprintController blueprintController; private PlacementInfo currentPlacementInfo; public override void OnEnter() { //IL_002b: 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) ((BaseState)this).OnEnter(); if (((EntityState)this).isAuthority) { currentPlacementInfo = GetPlacementInfo(); blueprintController = Object.Instantiate<GameObject>(MorrisAssets.TombstoneBlueprintsPrefab, currentPlacementInfo.position, currentPlacementInfo.rotation).GetComponent<BlueprintController>(); } } public override void FixedUpdate() { //IL_00a8: 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_00bd: Unknown result type (might be due to invalid IL or missing references) ((EntityState)this).FixedUpdate(); if (!((EntityState)this).isAuthority) { return; } entryDelay -= Time.fixedDeltaTime; if (entryDelay <= 0f && !exitPending) { if ((((EntityState)this).inputBank.skill1.down || ((ButtonState)(ref ((EntityState)this).inputBank.skill4)).justPressed) && currentPlacementInfo.ok) { ((EntityState)this).PlayCrossfade("Gesture, Override", "LanternRaise", 0.05f); ((EntityState)this).characterBody.SendConstructTurret(((EntityState)this).characterBody, currentPlacementInfo.position, currentPlacementInfo.rotation, MasterCatalog.FindMasterIndex(tombstoneMasterPrefab)); ((BaseState)this).StartAimMode(2f, false); ((EntityState)this).skillLocator.special.DeductStock(1); DestroyBlueprints(); exitPending = true; } if (((ButtonState)(ref ((EntityState)this).inputBank.skill2)).justPressed) { DestroyBlueprints(); exitPending = true; } } else if (exitPending) { exitDelay -= Time.fixedDeltaTime; if (exitDelay <= 0f) { ((EntityState)this).outer.SetNextStateToMain(); } } } public override void Update() { //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) ((EntityState)this).Update(); currentPlacementInfo = GetPlacementInfo(); if (Object.op_Implicit((Object)(object)blueprintController)) { blueprintController.PushState(currentPlacementInfo.position, currentPlacementInfo.rotation, currentPlacementInfo.ok); } } private void DestroyBlueprints() { EntityState.Destroy((Object)(object)((Component)blueprintController).gameObject); } public override void OnExit() { ((EntityState)this).OnExit(); } public override InterruptPriority GetMinimumInterruptPriority() { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) return (InterruptPriority)2; } private PlacementInfo GetPlacementInfo() { //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_000a: 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) //IL_0026: 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) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0045: 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_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_0067: Unknown result type (might be due to invalid IL or missing references) //IL_006c: 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_0086: 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_00a8: 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_00e4: 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_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: 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_010c: 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_0117: 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) //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_013a: Unknown result type (might be due to invalid IL or missing references) //IL_0149: Unknown result type (might be due to invalid IL or missing references) Ray aimRay = ((BaseState)this).GetAimRay(); Vector3 direction = ((Ray)(ref aimRay)).direction; direction.y = 0f; ((Vector3)(ref direction)).Normalize(); ((Ray)(ref aimRay)).direction = direction; PlacementInfo result = default(PlacementInfo); result.ok = false; result.rotation = Util.QuaternionSafeLookRotation(-direction); Ray val = default(Ray); ((Ray)(ref val))..ctor(((Ray)(ref aimRay)).GetPoint(4f) + Vector3.up * 2f, Vector3.down); float num = 8f; float num2 = num; RaycastHit val2 = default(RaycastHit); if (Physics.SphereCast(val, 1f, ref val2, num, LayerMask.op_Implicit(((LayerIndex)(ref LayerIndex.world)).mask)) && ((RaycastHit)(ref val2)).normal.y > 0.5f) { num2 = ((RaycastHit)(ref val2)).distance; result.ok = true; } Vector3 point = ((Ray)(ref val)).GetPoint(num2 + 1f); result.position = point; if (result.ok && Physics.CheckCapsule(result.position + Vector3.up * 1f, result.position + Vector3.up * 7f, 0.9f, LayerMask.op_Implicit(((LayerIndex)(ref LayerIndex.world)).mask) | LayerMask.op_Implicit(((LayerIndex)(ref LayerIndex.defaultLayer)).mask))) { result.ok = false; } return result; } } internal class Sacrifice : BaseState { public static float baseDuration = 1.333f; public static float sacrificePercentHealAmount = 0.15f; private LanternTracker lanternTracker; private float duration; private float effectTime; private float earlyExitTime; private bool hasSnapped; private HurtBox target; public override void OnEnter() { ((BaseState)this).OnEnter(); duration = baseDuration / base.attackSpeedStat; effectTime = duration * 0.35f; earlyExitTime = duration * 0.625f; lanternTracker = ((EntityState)this).GetComponent<LanternTracker>(); if (!Object.op_Implicit((Object)(object)target)) { target = lanternTracker.GetTrackingTarget(); } ((EntityState)this).PlayCrossfade("Right Arm, Override", "FingerSnap", "Swing.playbackRate", duration, 0.05f); SacrificeGhoul(target); ((BaseState)this).StartAimMode(2f, false); } public override void OnSerialize(NetworkWriter writer) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) NetworkExtensions.Write(writer, HurtBoxReference.FromHurtBox(target)); } public override void OnDeserialize(NetworkReader reader) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) HurtBoxReference val = NetworkExtensions.ReadHurtBoxReference(reader); target = ((HurtBoxReference)(ref val)).ResolveHurtBox(); } public override void FixedUpdate() { ((EntityState)this).FixedUpdate(); if (((EntityState)this).fixedAge >= effectTime && !hasSnapped) { hasSnapped = true; EffectManager.SimpleMuzzleFlash(MorrisAssets.MorrisFingerSnap, ((EntityState)this).gameObject, "IndexFingerR", false); } if (((EntityState)this).fixedAge >= duration && ((EntityState)this).isAuthority) { ((EntityState)this).outer.SetNextStateToMain(); } } public void SacrificeGhoul(HurtBox sacrificeTarget) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Expected O, but got Unknown //IL_001a: 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) MorrisMinionController component = ((Component)sacrificeTarget.healthComponent).GetComponent<MorrisMinionController>(); HealOrb val = new HealOrb(); ((Orb)val).origin = ((Component)component).transform.position; ((Orb)val).target = ((EntityState)this).characterBody.mainHurtBox; val.healValue = ((EntityState)this).characterBody.maxHealth * sacrificePercentHealAmount; val.overrideDuration = 0.5f; if (NetworkServer.active) { OrbManager.instance.AddOrb((Orb)(object)val); } component.Sacrifice(((EntityState)this).gameObject); } public override void OnExit() { ((EntityState)this).OnExit(); } public override InterruptPriority GetMinimumInterruptPriority() { //IL_0013: 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) return (InterruptPriority)((!(((EntityState)this).fixedAge >= earlyExitTime)) ? 2 : 0); } } internal class SpawnGhoul : BaseState { public static float baseDuration = 1f; private float duration; private float earlyExitTime; public override void OnEnter() { ((BaseState)this).OnEnter(); duration = baseDuration / base.attackSpeedStat; earlyExitTime = duration * 0.3f; ((EntityState)this).PlayCrossfade("Gesture, Override", "LanternRaise", "Swing.playbackRate", duration, 0.05f); ((BaseState)this).StartAimMode(2f, false); AttemptSpawnGhoul(); } private void AttemptSpawnGhoul() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //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_003e: 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_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) MasterSummon val = new MasterSummon(); val.masterPrefab = GhoulMinion.ghoulMasterPrefab; val.ignoreTeamMemberLimit = true; val.teamIndexOverride = (TeamIndex)1; val.summonerBodyObject = ((EntityState)this).gameObject; val.position = GetBestSpawnPosition(((BaseState)this).GetAimRay()); val.rotation = Util.QuaternionSafeLookRotation(((EntityState)this).characterDirection.forward); if (NetworkServer.active) { CharacterMaster val2 = val.Perform(); if (Object.op_Implicit((Object)(object)val2)) { val2.inventory.CopyEquipmentFrom(((EntityState)this).characterBody.inventory); } } } private Vector3 GetBestSpawnPosition(Ray aimRay) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0008: 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_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_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_0055: 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_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: 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_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: 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_00e0: 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_00e9: Unknown result type (might be due to invalid IL or missing references) Vector3 direction = ((Ray)(ref aimRay)).direction; direction.y = 0f; ((Vector3)(ref direction)).Normalize(); ((Ray)(ref aimRay)).origin = ((Ray)(ref aimRay)).origin + Vector3.up * 2f; ((Ray)(ref aimRay)).direction = direction; RaycastHit val = default(RaycastHit); Ray val2 = default(Ray); if (Physics.Raycast(aimRay, ref val, 3f, LayerMask.op_Implicit(((LayerIndex)(ref LayerIndex.world)).mask))) { ((Ray)(ref val2))..ctor(((RaycastHit)(ref val)).point + Vector3.up * 2f, Vector3.down); } else { ((Ray)(ref val2))..ctor(((Ray)(ref aimRay)).GetPoint(3f) + Vector3.up * 2f, Vector3.down); } Physics.Raycast(val2, ref val, (float)LayerMask.op_Implicit(((LayerIndex)(ref LayerIndex.world)).mask)); return ((RaycastHit)(ref val)).point; } private bool ValidateRaycastHit(Ray ray, RaycastHit hit) { //IL_0003: 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_001d: Unknown result type (might be due to invalid IL or missing references) if (((RaycastHit)(ref hit)).normal.y > 0.5f && Vector3.Distance(((RaycastHit)(ref hit)).point, ((Ray)(ref ray)).origin) <= 10f) { return true; } return false; } public override void FixedUpdate() { ((EntityState)this).FixedUpdate(); if (((EntityState)this).fixedAge >= duration && ((EntityState)this).isAuthority) { ((EntityState)this).outer.SetNextStateToMain(); } } public override void OnExit() { ((EntityState)this).OnExit(); } public override InterruptPriority GetMinimumInterruptPriority() { //IL_0013: 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) return (InterruptPriority)((!(((EntityState)this).fixedAge >= earlyExitTime)) ? 2 : 0); } } internal class SwingShovel : BaseState, IStepSetter { public static float baseDuration = 1.833f; public static float damageCoefficient = 8f; public static float smallHopVelocity = 6f; public static float hitPauseDuration = 0.12f; private Animator animator; private OverlapAttack attack; private HitBoxGroup hitBoxGroup; private float duration; private float step; private float fireTime; private float fireEndTime; private float earlyExitTime; private bool hasFired; private bool hasHopped; public string swingSoundString = "Morris_SwingShovel"; public string hitGhoulSoundString = "Morris_HitGhoulWithShovel"; public string hitTombstoneSoundString = ""; private HitStopCachedState hitStopCachedState; private float stopWatch; private float hitPauseTimer; private bool inHitPause; public override void OnEnter() { //IL_0121: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Expected O, but got Unknown //IL_0154: Unknown result type (might be due to invalid IL or missing references) //IL_0159: Unknown result type (might be due to invalid IL or missing references) //IL_0175: Unknown result type (might be due to invalid IL or missing references) //IL_017a: Unknown result type (might be due to invalid IL or missing references) //IL_0196: Unknown result type (might be due to invalid IL or missing references) //IL_019b: Unknown result type (might be due to invalid IL or missing references) //IL_01ee: Unknown result type (might be due to invalid IL or missing references) ((BaseState)this).OnEnter(); animator = ((EntityState)this).GetModelAnimator(); duration = baseDuration / base.attackSpeedStat; fireTime = duration * 0.18f; fireEndTime = duration * 0.22f; earlyExitTime = duration * 0.54f; ((BaseState)this).StartAimMode(2f, false); string text = "Swing" + step; if (!animator.GetBool("isMoving") && ((EntityState)this).characterMotor.isGrounded) { ((EntityState)this).PlayCrossfade("FullBody, Override", text, "Swing.playbackRate", duration, 0.1f); } ((EntityState)this).PlayCrossfade("Gesture, Override", text, "Swing.playbackRate", duration, 0.1f); Transform modelTransform = ((EntityState)this).GetModelTransform(); if (Object.op_Implicit((Object)(object)modelTransform)) { hitBoxGroup = Array.Find(((Component)modelTransform).GetComponents<HitBoxGroup>(), (HitBoxGroup element) => element.groupName == "Swing"); } attack = new OverlapAttack(); attack.attacker = ((EntityState)this).gameObject; attack.inflictor = ((EntityState)this).gameObject; attack.damageType = DamageTypeCombo.op_Implicit((DamageType)0); attack.procCoefficient = 1f; attack.teamIndex = ((BaseState)this).GetTeam(); attack.isCrit = ((BaseState)this).RollCrit(); attack.forceVector = Vector3.zero; attack.pushAwayForce = 1f; attack.damage = damageCoefficient * base.damageStat; attack.hitBoxGroup = hitBoxGroup; attack.hitEffectPrefab = MorrisAssets.MorrisShovelHit; DamageAPI.AddModdedDamageType(attack, MorrisPlugin.LaunchGhoul); } public override void FixedUpdate() { //IL_0065: 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) ((EntityState)this).FixedUpdate(); hitPauseTimer -= Time.fixedDeltaTime; if (((EntityState)this).fixedAge >= fireTime && !hasFired) { HitGhoul(); FireAttack(); } if (hitPauseTimer <= 0f && inHitPause) { ((BaseState)this).ConsumeHitStopCachedState(hitStopCachedState, ((EntityState)this).characterMotor, animator); inHitPause = false; } if (!inHitPause) { stopWatch += Time.fixedDeltaTime; } else { ((EntityState)this).characterMotor.velocity = Vector3.zero; animator.SetFloat("Swing.playbackRate", 0f); } if (stopWatch >= duration && hasFired && ((EntityState)this).isAuthority) { ((EntityState)this).outer.SetNextStateToMain(); } } public void FireAttack() { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0017: 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_00c5: 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) Transform val = ((BaseState)this).FindModelChild("SwingPivot"); Ray aimRay = ((BaseState)this).GetAimRay(); val.rotation = Util.QuaternionSafeLookRotation(((Ray)(ref aimRay)).direction); if (!hasFired) { PlaySwingEffect(); hasFired = true; } if (((EntityState)this).isAuthority && attack.Fire((List<HurtBox>)null)) { if (!((EntityState)this).characterMotor.isGrounded && !hasHopped) { hasHopped = true; ((BaseState)this).SmallHop(((EntityState)this).characterMotor, smallHopVelocity); } if (!inHitPause) { hitStopCachedState = ((BaseState)this).CreateHitStopCachedState(((EntityState)this).characterMotor, animator, "Swing.playbackRate"); hitPauseTimer = hitPauseDuration / base.attackSpeedStat; inHitPause = true; } } } public void HitGhoul() { //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_000a: 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) //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_0024: 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_0033: 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_003b: Unknown result type (might be due to invalid IL or missing references) //IL_003d: 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_0040: 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_0056: 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_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Unknown result type (might be due to invalid IL or missing references) Ray aimRay = ((BaseState)this).GetAimRay(); Vector3 direction = ((Ray)(ref aimRay)).direction; Transform val = ((BaseState)this).FindModelChild("LaunchHitbox"); Vector3 position = val.position; Vector3 val2 = val.lossyScale * 0.5f; Quaternion rotation = val.rotation; Collider[] array = Physics.OverlapBox(position, val2, rotation, LayerMask.op_Implicit(((LayerIndex)(ref LayerIndex.defaultLayer)).mask) | LayerMask.op_Implicit(((LayerIndex)(ref LayerIndex.playerFakeActor)).mask)); Collider[] array2 = array; foreach (Collider val3 in array2) { MorrisMinionController component = ((Component)val3).GetComponent<MorrisMinionController>(); if (Object.op_Implicit((Object)(object)component) && component.teamIndex == ((EntityState)this).teamComponent.teamIndex) { switch (component.minionType) { case MorrisMinionController.MorrisMinionType.Ghoul: Util.PlaySound(hitGhoulSoundString, ((Component)component).gameObject); break; case MorrisMinionController.MorrisMinionType.Tombstone: Util.PlaySound(hitTombstoneSoundString, ((Component)component).gameObject); break; } component.Launch(direction); } } } public void HitGhoul(HitBoxGroup hitBoxGroup) { //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_000a: 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) //IL_0030: 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_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) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004c: 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_0055: 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_005e: 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_00a8: 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_010d: Unknown result type (might be due to invalid IL or missing references) Ray aimRay = ((BaseState)this).GetAimRay(); Vector3 direction = ((Ray)(ref aimRay)).direction; HitBox[] hitBoxes = hitBoxGroup.hitBoxes; foreach (HitBox val in hitBoxes) { Transform transform = ((Component)val).transform; Vector3 position = transform.position; Vector3 val2 = transform.lossyScale * 0.5f; Quaternion rotation = transform.rotation; Collider[] array = Physics.OverlapBox(position, val2, rotation, LayerMask.op_Implicit(((LayerIndex)(ref LayerIndex.defaultLayer)).mask) | LayerMask.op_Implicit(((LayerIndex)(ref LayerIndex.fakeActor)).mask)); Collider[] array2 = array; foreach (Collider val3 in array2) { MorrisMinionController component = ((Component)val3).GetComponent<MorrisMinionController>(); if (Object.op_Implicit((Object)(object)component) && component.teamIndex == ((EntityState)this).teamComponent.teamIndex) { switch (component.minionType) { case MorrisMinionController.MorrisMinionType.Ghoul: Util.PlaySound(hitGhoulSoundString, ((Component)component).gameObject); break; case MorrisMinionController.MorrisMinionType.Tombstone: Util.PlaySound(hitTombstoneSoundString, ((Component)component).gameObject); break; } component.Launch(direction); } } } } public void PlaySwingEffect() { string text = ((step == 0f) ? "SwingLeft" : "SwingRight"); string text2 = ((step == 0f) ? "1" : "2"); text2 = swingSoundString + text2; Util.PlaySound(text2, ((EntityState)this).gameObject); EffectManager.SimpleMuzzleFlash(MorrisAssets.ShovelSwingVFX, ((EntityState)this).gameObject, text, false); } public override void OnExit() { ((EntityState)this).OnExit(); } public override InterruptPriority GetMinimumInterruptPriority() { //IL_001b: 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) return (InterruptPriority)((!(((EntityState)this).fixedAge >= earlyExitTime) || !hasFired) ? 1 : 0); } public void SetStep(int i) { step = i; } } internal class SkillTemplate : BaseState { public override void OnEnter() { ((BaseState)this).OnEnter(); ((BaseState)this).StartAimMode(2f, false); } public override void FixedUpdate() { ((EntityState)this).FixedUpdate(); ((EntityState)this).outer.SetNextStateToMain(); } public override void OnExit() { ((EntityState)this).OnExit(); } public override InterruptPriority GetMinimumInterruptPriority() { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) return (InterruptPriority)2; } } } namespace SkillStates.Ghoul { internal class BileSpit : BaseState { public static GameObject spitPrefab = Projectiles.ghoulBilePrefab; public static GameObject muzzleEffect = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Croco/MuzzleflashCroco.prefab").WaitForCompletion(); public static float baseDuration = 1f; public static float damageCoefficient = 1f; private MorrisMinionController minionController; private float duration; private float fireTime; private bool hasFired; public override void OnEnter() { ((BaseState)this).OnEnter(); minionController = ((EntityState)this).GetComponent<MorrisMinionController>(); duration = baseDuration / base.attackSpeedStat; fireTime = duration * 0.2f; ((EntityState)this).PlayCrossfade("Gesture, Override", "BileSpit", "Attack.playbackRate", duration, 0.1f); ((BaseState)this).StartAimMode(duration, false); } public override void FixedUpdate() { //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_005f: Unknown result type (might be due to invalid IL or missing references) //IL_00db: 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_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: 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) ((EntityState)this).FixedUpdate(); if (((EntityState)this).fixedAge >= fireTime && !hasFired) { hasFired = true; EffectManager.SimpleMuzzleFlash(muzzleEffect, ((EntityState)this).gameObject, "UpperJaw", true); if (((EntityState)this).isAuthority) { Ray aimRay = ((BaseState)this).GetAimRay(); FireProjectileInfo val = default(FireProjectileInfo); val.crit = (Object.op_Implicit((Object)(object)minionController.owner) ? Util.CheckRoll(minionController.ownerBody.crit, minionController.ownerBody.master) : ((BaseState)this).RollCrit()); val.damage = damageCoefficient * base.damageStat; val.force = 100f; val.owner = ((EntityState)this).gameObject; val.position = ((Ray)(ref aimRay)).origin; val.rotation = Util.QuaternionSafeLookRotation(((Ray)(ref aimRay)).direction); val.projectilePrefab = spitPrefab; ProjectileManager.instance.FireProjectile(val); } } if (((EntityState)this).fixedAge >= duration && ((EntityState)this).isAuthority) { ((EntityState)this).outer.SetNextStateToMain(); } } public override void OnExit() { ((EntityState)this).OnExit(); } public override InterruptPriority GetMinimumInterruptPriority() { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) return (InterruptPriority)2; } } internal class ClingState : BaseState { public static float damageCoefficient = GhoulMelee.damageCoefficient; public static float biteInterval = 0.7f; public static Vector3 downwardForce = Vector3.down * 800f; public HurtBox initialTarget; public HurtBoxGroup targetGroup; private Transform modelTransform; private HurtBox clingHurtbox; private Collider targetCollider; private bool negativeOffset; private MorrisMinionController minionController; private float stopwatch; public override void OnEnter() { //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) ((BaseState)this).OnEnter(); ((EntityState)this).PlayAnimation("FullBody, Override", "ClingLoop"); ((EntityState)this).PlayCrossfade("FullBody, Additive", "ClingBite", "Attack.playbackRate", biteInterval, 0.1f); ((Behaviour)((EntityState)this).modelLocator).enabled = false; ((Behaviour)((EntityState)this).characterDirection).enabled = false; modelTransform = ((EntityState)this).GetModelTransform(); negativeOffset = Random.value > 0.5f; if (Object.op_Implicit((Object)(object)initialTarget)) { targetGroup = initialTarget.hurtBoxGroup; int num = Random.Range(0, targetGroup.hurtBoxes.Length); clingHurtbox = targetGroup.hurtBoxes[num]; targetCollider = ((Component)clingHurtbox).GetComponent<Collider>(); } if (((EntityState)this).isAuthority) { ((EntityState)this).characterMotor.velocity = Vector3.zero; } minionController = ((EntityState)this).GetComponent<MorrisMinionController>(); minionController.isInClingState = true; } public override void OnSerialize(NetworkWriter writer) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) NetworkExtensions.Write(writer, HurtBoxReference.FromHurtBox(initialTarget)); } public override void OnDeserialize(NetworkReader reader) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) HurtBoxReference val = NetworkExtensions.ReadHurtBoxReference(reader); initialTarget = ((HurtBoxReference)(ref val)).ResolveHurtBox(); } public override void FixedUpdate() { ((EntityState)this).FixedUpdate(); UpdateClingPoint(); stopwatch += Time.fixedDeltaTime; if (stopwatch >= biteInterval && initialTarget.healthComponent.alive) { stopwatch = 0f; Bite(); } if (!initialTarget.healthComponent.alive && ((EntityState)this).isAuthority) { ((EntityState)this).outer.SetNextStateToMain(); } } public void UpdateClingPoint() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0017: 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_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_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_003b: 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_0043: 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_005e: 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_00a1: 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_0074: 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) ((EntityState)this).characterMotor.velocity = Vector3.zero; ((EntityState)this).characterMotor.rootMotion = Vector3.zero; Bounds bounds = targetCollider.bounds; Vector3 center = ((Bounds)(ref bounds)).center; bounds = targetCollider.bounds; float num = ((Bounds)(ref bounds)).extents.z; Quaternion val = ((Component)targetCollider).transform.rotation; if (negativeOffset) { num *= -1f; val = Quaternion.Inverse(val); } center.z -= num; ((BaseCharacterController)((EntityState)this).characterMotor).Motor.SetPosition(center, true); modelTransform.position = center; modelTransform.rotation = val; } public void Bite() { //IL_0021: 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_0032: Unknown result type (might be due to invalid IL or missing references) //IL_003d: 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_005a: Expected O, but got Unknown //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_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_00ab: 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_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: 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_00fd: 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_014c: 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_0152: 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_015d: Unknown result type (might be due to invalid IL or missing references) //IL_0163: Unknown result type (might be due to invalid IL or missing references) //IL_016f: Expected O, but got Unknown ((EntityState)this).PlayCrossfade("FullBody, Additive", "ClingBite", "Attack.playbackRate", biteInterval, 0.1f); EffectData val = new EffectData { origin = ((Component)clingHurtbox).transform.position, rotation = modelTransform.rotation, scale = 1.5f }; EffectManager.SpawnEffect(MorrisAssets.GhoulBiteEffect, val, true); EffectManager.SpawnEffect(MorrisAssets.OmniImpactVFXGhoul, val, true); Util.PlaySound("Play_acrid_m2_bite_hit", ((EntityState)this).gameObject, "Volume_SFX", 0.2f); try { DamageInfo val2 = new DamageInfo { position = ((Component)initialTarget).transform.position, attacker = (Object.op_Implicit((Object)(object)minionController.owner) ? minionController.owner : ((EntityState)this).gameObject), inflictor = ((EntityState)this).gameObject, damage = damageCoefficient * base.damageStat, damageColorIndex = (DamageColorIndex)0, damageType = DamageTypeCombo.op_Implicit((DamageType)0), crit = (Object.op_Implicit((Object)(object)minionController.owner) ? Util.CheckRoll(minionController.ownerBody.crit, minionController.ownerBody.master) : ((BaseState)this).RollCrit()), force = downwardForce, procChainMask = default(ProcChainMask), procCoefficient = 0.8f }; if (NetworkServer.active) { initialTarget.healthComponent.TakeDamage(val2); GlobalEventManager.instance.OnHitEnemy(val2, ((Component)initialTarget.healthComponent).gameObject); GlobalEventManager.instance.OnHitAll(val2, ((Component)initialTarget.healthComponent).gameObject); } } catch (Exception) { Log.Warning("NRE in Bite()"); } } public override void OnExit() { ((Behaviour)((EntityState)this).modelLocator).enabled = true; ((Behaviour)((EntityState)this).characterDirection).enabled = true; minionController.isInClingState = false; ((EntityState)this).gameObject.layer = LayerIndex.playerFakeActor.intVal; ((BaseCharacterController)((EntityState)this).characterMotor).Motor.RebuildCollidableLayers(); ((EntityState)this).PlayAnimation("FullBody, Override", "BufferEmpty"); ((EntityState)this).OnExit(); } public override InterruptPriority GetMinimumInterruptPriority() { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) return (InterruptPriority)5; } } internal class GhoulDeath : GenericCharacterDeath { public static float duration = 0.375f; public static float sacrificedDamageCoefficient = 7f; public static float sacrificedRadius = 18f; public static float smallHopVelocity = 7f; private MorrisMinionController minionController; private bool sacrificed; private BlastAttack attack; private float radius; private bool hasExploded; public override void OnEnter() { //IL_00da: 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_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: 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) ((GenericCharacterDeath)this).OnEnter(); minionController = ((EntityState)this).gameObject.GetComponent<MorrisMinionController>(); sacrificed = minionController.sacrificed; if (sacrificed) { ((EntityState)this).PlayCrossfade("FullBody, Override", "Sacrificed", 0.1f); Transform modelTransform = ((EntityState)this).GetModelTransform(); TemporaryOverlayInstance val = TemporaryOverlayManager.AddOverlay(((EntityState)this).gameObject); val.duration = duration * 1.5f; val.animateShaderAlpha = true; val.alphaCurve = AnimationCurve.EaseInOut(0f, 0f, 1f, 1f); val.destroyComponentOnEnd = true; val.originalMaterial = MorrisAssets.GhoulSacrificedMat; val.AddToCharacterModel(((Component)modelTransform).GetComponent<CharacterModel>()); } else { RagdollController component = ((Component)((GenericCharacterDeath)this).cachedModelTransform).GetComponent<RagdollController>(); if (Object.op_Implicit((Object)(object)component)) { Vector3 val2 = ((EntityState)this).characterMotor.velocity + Vector3.up * 3f; component.BeginRagdoll(val2); } } if (sacrificed && ((EntityState)this).isAuthority) { ((EntityState)this).characterMotor.velocity = Vector3.zero; ((BaseState)this).SmallHop(((EntityState)this).characterMotor, smallHopVelocity); } } public override void FixedUpdate() { ((GenericCharacterDeath)this).FixedUpdate(); if (((EntityState)this).fixedAge >= duration && !hasExploded) { hasExploded = true; if (sacrificed) { ((GenericCharacterDeath)this).DestroyModel(); Explode(); } if (NetworkServer.active) { ((GenericCharacterDeath)this).DestroyBodyAsapServer(); } } } public void Explode() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000d: 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_0025: Expected O, but got Unknown //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Expected O, but got Unknown //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_011a: 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_0140: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Unknown result type (might be due to invalid IL or missing references) //IL_016d: Unknown result type (might be due to invalid IL or missing references) //IL_017d: Unknown result type (might be due to invalid IL or missing references) //IL_0182: Unknown result type (might be due to invalid IL or missing references) //IL_018d: Unknown result type (might be due to invalid IL or missing references) EffectData val = new EffectData { origin = ((EntityState)this).characterBody.footPosition, scale = radius }; EffectManager.SpawnEffect(MorrisAssets.GhoulSacrificeExplosion, val, true); if (((EntityState)this).isAuthority) { attack = new BlastAttack(); attack.attacker = (Object.op_Implicit((Object)(object)minionController.sacrificeOwner) ? minionController.sacrificeOwner : minionController.owner); attack.inflictor = ((EntityState)this).gameObject; attack.teamIndex = ((BaseState)this).GetTeam(); attack.baseDamage = sacrificedDamageCoefficient * ((BaseState)this).damageStat; attack.crit = (Object.op_Implicit((Object)(object)minionController.owner) ? Util.CheckRoll(minionController.ownerBody.crit, minionController.ownerBody.master) : ((BaseState)this).RollCrit()); attack.procCoefficient = 1f; attack.damageType = DamageTypeCombo.op_Implicit((DamageType)0); attack.baseForce = 0f; attack.position = ((EntityState)this).transform.position; attack.radius = sacrificedRadius; attack.attackerFiltering = (AttackerFiltering)2; attack.falloffModel = (FalloffModel)0; attack.impactEffect = EffectCatalog.FindEffectIndexFromPrefab(MorrisAssets.OmniImpactVFXGhoul); attack.Fire(); } } public override void OnExit() { ((GenericCharacterDeath)this).OnExit(); } } internal class GhoulLaunched : BaseLaunchedState { private Transform launchTrail; private Transform launchRings; private bool willCling; public override void OnEnter() { //IL_000e: Unknown result type (might be due to invalid IL or missing references) launchPower = 85f; damageType = (DamageType)0; impactVFX = MorrisAssets.OmniImpactVFXGhoul; base.OnEnter(); ((EntityState)this).gameObject.layer = LayerIndex.debris.intVal; ((BaseCharacterController)((EntityState)this).characterMotor).Motor.RebuildCollidableLayers(); launchTrail = ((BaseState)this).FindModelChild("LaunchTrail"); ((Component)launchTrail).gameObject.SetActive(true); launchRings = ((BaseState)this).FindModelChild("LaunchRings"); ((Component)launchRings).gameObject.SetActive(true); } public override void OnHitLargeEnemy(HurtBox target) { if (((EntityState)this).isAuthority) { willCling = true; ClingState nextState = new ClingState { initialTarget = target }; ((EntityState)this).outer.SetNextState((EntityState)(object)nextState); } } public override void PlayLaunchEntry() { ((EntityState)this).PlayAnimation("FullBody, Override", "LaunchedLoop"); } public override void PlayLaunchExit() { ((EntityState)this).PlayAnimation("FullBody, Override", "BufferEmpty"); } public override void OnExit() { if (!willCling) { ((EntityState)this).gameObject.layer = LayerIndex.playerFakeActor.intVal; ((BaseCharacterController)((EntityState)this).characterMotor).Motor.RebuildCollidableLayers(); } ((Component)launchTrail).gameObject.SetActive(false); ((Component)launchRings).gameObject.SetActive(false); if (((EntityState)this).isAuthority && ((EntityState)this).healthComponent.alive) { GameObject masterObject = ((EntityState)this).characterBody.masterObject; BaseAI component = masterObject.GetComponent<BaseAI>(); if (Object.op_Implicit((Object)(object)component)) { component.currentEnemy.Reset(); component.ForceAcquireNearestEnemyIfNoCurrentEnemy(); } } base.OnExit(); } } internal class GhoulMelee : BaseState { public static float baseDuration = 1f; public static float damageCoefficient = 1.5f; private MorrisMinionController minionController; private OverlapAttack attack; private string animString = "Melee"; private string muzzleName = "MuzzleMelee"; private int meleeIndex; private float duration; private float fireTime; private bool hasFired; public override void OnEnter() { //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Expected O, but got Unknown //IL_0100: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Expected O, but got Unknown //IL_0152: 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_0173: Unknown result type (might be due to invalid IL or missing references) //IL_0178: Unknown result type (might be due to invalid IL or missing references) //IL_01cd: Unknown result type (might be due to invalid IL or missing references) //IL_01d2: Unknown result type (might be due to invalid IL or missing references) ((BaseState)this).OnEnter(); duration = baseDuration / base.attackSpeedStat; fireTime = duration * 0.2f; ((BaseState)this).StartAimMode(2f, false); minionController = ((EntityState)this).GetComponent<MorrisMinionController>(); if (meleeIndex == 0) { meleeIndex = Random.RandomRangeInt(1, 5); } animString += meleeIndex; muzzleName += meleeIndex; ((EntityState)this).PlayCrossfade("Gesture, Override", animString, "Attack.playbackRate", duration, 0.1f); Transform modelTransform = ((EntityState)this).GetModelTransform(); HitBoxGroup hitBoxGroup = new HitBoxGroup(); if (Object.op_Implicit((Object)(object)modelTransform)) { hitBoxGroup = Array.Find(((Component)modelTransform).GetComponents<HitBoxGroup>(), (HitBoxGroup element) => element.groupName == "GhoulMelee"); } attack = new OverlapAttack(); attack.attacker = (Object.op_Implicit((Object)(object)minionController.owner) ? minionController.owner : ((EntityState)this).gameObject); attack.inflictor = ((EntityState)this).gameObject; attack.damageType = DamageTypeCombo.op_Implicit((DamageType)0); attack.procCoefficient = 1f; attack.teamIndex = ((BaseState)this).GetTeam(); attack.isCrit = (Object.op_Implicit((Object)(object)minionController.owner) ? Util.CheckRoll(minionController.ownerBody.crit, minionController.ownerBody.master) : ((BaseState)this).RollCrit()); attack.forceVector = Vector3.zero; attack.pushAwayForce = 1f; attack.damage = damageCoefficient * base.damageStat; attack.hitBoxGroup = hitBoxGroup; attack.hitEffectPrefab = MorrisAssets.OmniImpactVFXGhoul; } public override void OnSerialize(NetworkWriter writer) { ((EntityState)this).OnSerialize(writer); writer.Write((byte)meleeIndex); } public override void OnDeserialize(NetworkReader reader) { ((EntityState)this).OnDeserialize(reader); meleeIndex = reader.ReadByte(); } public override void FixedUpdate() { ((EntityState)this).FixedUpdate(); if (((EntityState)this).fixedAge >= fireTime && !hasFired) { hasFired = true; EffectManager.SimpleMuzzleFlash(MorrisAssets.GhoulMeleeEffects[meleeIndex], ((EntityState)this).gameObject, muzzleName, true); if (((EntityState)this).isAuthority) { attack.Fire((List<HurtBox>)null); } } if (((EntityState)this).fixedAge >= duration && ((EntityState)this).isAuthority) { ((EntityState)this).outer.SetNextStateToMain(); } } public override void OnExit() { ((EntityState)this).OnExit(); } public override InterruptPriority GetMinimumInterruptPriority() { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) return (InterruptPriority)1; } } internal class GhoulSpawn : BaseState { public static GameObject spawnEffect = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Lemurian/SpawnLemurian.prefab").WaitForCompletion(); public static float baseDuration = 0.5f; public override void OnEnter() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Expected O, but got Unknown ((BaseState)this).OnEnter(); if (NetworkServer.active) { ((EntityState)this).characterBody.AddBuff(Buffs.HiddenInvincibility); } EffectData val = new EffectData { origin = ((EntityState)this).characterBody.footPosition }; EffectManager.SpawnEffect(spawnEffect, val, true); Util.PlaySound("Play_treeBot_sprint_end", ((EntityState)this).gameObject); } public override void FixedUpdate() { ((EntityState)this).FixedUpdate(); if (((EntityState)this).fixedAge >= baseDuration && ((EntityState)this).isAuthority) { ((EntityState)this).outer.SetNextStateToMain(); } } public override void OnExit() { if (NetworkServer.active) { ((EntityState)this).characterBody.RemoveBuff(Buffs.HiddenInvincibility); } ((EntityState)this).OnExit(); } public override InterruptPriority GetMinimumInterruptPriority() { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) return (InterruptPriority)2; } } } namespace SkillStates.CoffinPod { internal class Descent : SurvivorPodBaseState { private const float duration = 4f; private ShakeEmitter shakeEmitter; public override void OnEnter() { //IL_0067: 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_0093: Unknown result type (might be due to invalid IL or missing references) ((SurvivorPodBaseState)this).OnEnter(); Transform modelTransform = ((EntityState)this).GetModelTransform(); if (!Object.op_Implicit((Object)(object)modelTransform)) { return; } ChildLocator component = ((Component)modelTransform).GetComponent<ChildLocator>(); if (Object.op_Implicit((Object)(object)component)) { Transform val = component.FindChild("Pivot"); if (Object.op_Implicit((Object)(object)val)) { shakeEmitter = ((Component)val).gameObject.AddComponent<ShakeEmitter>(); shakeEmitter.wave = new Wave { amplitude = 1f, frequency = 180f, cycleOffset = 0f }; shakeEmitter.duration = 10000f; shakeEmitter.radius = 400f; shakeEmitter.amplitudeTimeDecay = false; } } } public override void FixedUpdate() { ((EntityState)this).FixedUpdate(); if (((EntityState)this).isAuthority && ((EntityState)this).fixedAge > 4f) { ((EntityState)this).outer.SetNextState((EntityState)(object)new Landed()); } } public override void OnExit() { EntityState.Destroy((Object)(object)shakeEmitter); ((EntityState)this).OnExit(); } public override InterruptPriority GetMinimumInterruptPriority() { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) return (InterruptPriority)2; } } internal class Landed : SurvivorPodBaseState { public override void OnEnter() { ((SurvivorPodBaseState)this).OnEnter(); ((SurvivorPodBaseState)this).vehicleSeat.handleVehicleExitRequestServer.AddCallback((CallbackDelegate<bool, GameObject>)HandleVehicleExitRequest); } private void HandleVehicleExitRequest(GameObject arg, ref bool? resultOverride) { ((SurvivorPodBaseState)this).survivorPodController.exitAllowed = false; ((EntityState)this).outer.SetNextState((EntityState)(object)new Release()); resultOverride = true; } public override void FixedUpdate() { ((EntityState)this).FixedUpdate(); if (((EntityState)this).fixedAge > 0f) { ((SurvivorPodBaseState)this).survivorPodController.exitAllowed = true; } } public override void OnExit() { ((SurvivorPodBaseState)this).vehicleSeat.handleVehicleExitRequestServer.RemoveCallback((CallbackDelegate<bool, GameObject>)HandleVehicleExitRequest); ((SurvivorPodBaseState)this).survivorPodController.exitAllowed = false; ((EntityState)this).OnExit(); } public override InterruptPriority GetMinimumInterruptPriority() { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) return (InterruptPriority)2; } } internal class Release : SurvivorPodBaseState { public override void OnEnter() { ((SurvivorPodBaseState)this).OnEnter(); ((EntityState)this).PlayAnimation("Base", "OpenDoor"); if (NetworkServer.active && Object.op_Implicit((Object)(object)((SurvivorPodBaseState)this).vehicleSeat) && Object.op_Implicit((Object)(object)((SurvivorPodBaseState)this).vehicleSeat.currentPassengerBody)) { ((SurvivorPodBaseState)this).vehicleSeat.EjectPassenger(((Component)((SurvivorPodBaseState)this).vehicleSeat.currentPassengerBody).gameObject); } } public override void FixedUpdate() { ((EntityState)this).FixedUpdate(); if (NetworkServer.active && !Object.op_Implicit((Object)(object)((SurvivorPodBaseState)this).vehicleSeat.currentPassengerBody)) { ((EntityState)this).outer.SetNextStateToMain(); } } public override void OnExit() { ((EntityState)this).OnExit(); } public override InterruptPriority GetMinimumInterruptPriority() { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) return (InterruptPriority)2; } } } namespace Morris { internal static class Log { internal static ManualLogSource _logSource; internal static void Init(ManualLogSource logSource) { _logSource = logSource; } internal static void Debug(object data) { _logSource.LogDebug(data); } internal static void Error(object data) { _logSource.LogError(data); } internal static void Fatal(object data) { _logSource.LogFatal(data); } internal static void Info(object data) { _logSource.LogInfo(data); } internal static void Message(object data) { _logSource.LogMessage(data); } internal static void Warning(object data) { _logSource.LogWarning(data); } } [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [NetworkCompatibility(/*Could not decode attribute arguments.*/)] [BepInPlugin("com.Bog.Morris", "Mortician", "0.1.5")] public class MorrisPlugin : BaseUnityPlugin { public const string MODUID = "com.Bog.Morris"; public const string MODNAME = "Mortician"; public const string MODVERSION = "0.1.5"; public const string DEVELOPER_PREFIX = "BOG"; public static MorrisPlugin instance; public static PluginInfo PInfo; public static GameObject MorrisBodyPrefab; public static BodyIndex MorrisBodyIndex; public static GameObject GhoulBodyPrefab; public static BodyIndex GhoulBodyIndex; internal static GameObject TombstoneBodyPrefab; internal static BodyIndex TombstoneBodyIndex; public static ModdedDamageType LaunchGhoul; public static bool containsCustomEmoteAPI; private void Awake() { //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) instance = this; Log.Init(((BaseUnityPlugin)this).Logger); PInfo = ((BaseUnityPlugin)this).Info; Config.ReadConfig(this); containsCustomEmoteAPI = Chainloader.PluginInfos.ContainsKey("com.weliveinasociety.CustomEmotesAPI"); MorrisAssets.Initialize(); ((MonoBehaviour)this).StartCoroutine(ShaderSwapper.UpgradeStubbedShadersAsync(MorrisAssets.mainAssetBundle)); States.RegisterStates(); Buffs.RegisterBuffs(); Projectiles.RegisterProjectiles(); Tokens.AddTokens(); ItemDisplays.PopulateDisplays(); LaunchGhoul = DamageAPI.ReserveDamageType(); new Morris.Modules.Survivors.Morris().Initialize(); new GhoulMinion().Initialize(); new TombstoneDeployable().Initialize(); new ContentPacks().Initialize(); Subscriptions(); Hook(); if (!containsCustomEmoteAPI) { } } public IEnumerator CoroutineMaterialStuff() { yield return ShaderSwapper.UpgradeStubbedShadersAsync(MorrisAssets.mainAssetBundle); yield return Materials.FixRenderQueues(); } private void Start() { } private void Subscriptions() { } private void ShowHealthBarToOwner(DamageDealtMessage obj) { //IL_0099: 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_00e5: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)obj.attacker) || !Object.op_Implicit((Object)(object)obj.victim) || obj.isSilent) { return; } MorrisMinionController component = obj.attacker.GetComponent<MorrisMinionController>(); if (!Object.op_Implicit((Object)(object)component) || !Object.op_Implicit((Object)(object)component.owner)) { return; } HealthComponent component2 = obj.victim.GetComponent<HealthComponent>(); if (!Object.op_Implicit((Object)(object)component2) || component2.dontShowHealthbar) { return; } TeamIndex teamIndex = component2.body.teamComponent.teamIndex; foreach (CombatHealthBarViewer instances in CombatHealthBarViewer.instancesList) { if ((Object)(object)component.owner == (Object)(object)instances.viewerBodyObject && Object.op_Implicit((Object)(object)instances.viewerBodyObject)) { instances.HandleDamage(component2, teamIndex); } } } private void Hook() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown BodyCatalog.SetBodyPrefabs += new hook_SetBodyPrefabs(BodyCatalog_SetBodyPrefabs); } private EntityState EntityStateCatalog_InstantiateState_Type(orig_InstantiateState_Type orig, Type stateType) { Log.Warning(Environment.StackTrace); return orig.Invoke(stateType); } private void GlobalEventManager_OnCharacterDeath(ILContext il) { } private void MinionGroup_AddMinion(ILContext il) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown ILCursor val = new ILCursor(il); val.TryGotoNext(new Func<Instruction, bool>[4] { (Instruction x) => ILPatternMatchingExt.MatchLdarg(x, 1), (Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt(x, (MethodBase)typeof(Component).GetMethod("GetComponent", new Type[0])), (Instruction x) => ILPatternMatchingExt.MatchStloc(x, 1), (Instruction x) => ILPatternMatchingExt.MatchLdloc(x, 1) }); val.Index += 4; Log.Warning(val); } private void BodyCatalog_SetBodyPrefabs(orig_SetBodyPrefabs orig, GameObject[] newBodyPrefabs) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0013: 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_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) orig.Invoke(newBodyPrefabs); MorrisBodyIndex = BodyCatalog.FindBodyIndex(MorrisBodyPrefab); GhoulBodyIndex = BodyCatalog.FindBodyIndex(GhoulBodyPrefab); TombstoneBodyIndex = BodyCatalog.FindBodyIndex(TombstoneBodyPrefab); } private void CustomEmoteAPICompat() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: 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 BodyCatalog.SetBodyPrefabs += new hook_SetBodyPrefabs(CreateEmoteSkeletons); CustomEmotesAPI.boneMapperCreated += new BoneMapperCreated(CustomEmotesAPI_boneMapperCreated); CustomEmotesAPI.animChanged += new AnimationChanged(CustomEmotesAPI_animChanged); } private void CreateEmoteSkeletons(orig_SetBodyPrefabs orig, GameObject[] newBodyPrefabs) { orig.Invoke(newBodyPrefabs); Log.Warning("Creating Morris emote skeleton"); GameObject val = MorrisAssets.mainAssetBundle.LoadAsset<GameObject>("MorrisHumanoidSkeleton"); CustomEmotesAPI.ImportArmature(MorrisBodyPrefab, val, 0, true); val.GetComponentInChildren<BoneMapper>().scale = 1f; Log.Warning("Creating Ghoul emote skeleton"); GameObject val2 = MorrisAssets.mainAssetBundle.LoadAsset<GameObject>("GhoulHumanoidSkeleton"); CustomEmotesAPI.ImportArmature(GhoulBodyPrefab, val2, 0, true); val2.GetComponentInChildren<BoneMapper>().scale = 1f; } private void CustomEmotesAPI_boneMapperCreated(BoneMapper mapper) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) if (mapper.mapperBody.bodyIndex != GhoulBodyIndex) { return; } MorrisMinionController component = ((Component)mapper.mapperBody).GetComponent<MorrisMinionController>(); if (Object.op_Implicit((Object)(object)component.owner)) { BoneMapper componentInChildren = ((Component)component.owner.GetComponent<ModelLocator>().modelTransform).GetComponentInChildren<BoneMapper>(); if (Object.op_Implicit((Object)(object)componentInChildren) && componentInChildren.currentClipName != "none") { CustomEmotesAPI.PlayAnimation(componentInChildren.currentClipName, mapper, -2); } } } private void CustomEmotesAPI_animChanged(string newAnimation, BoneMapper mapper) { //IL_0019: 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_005e: 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) if (mapper.mapperBody.bodyIndex != MorrisBodyIndex) { return; } IEnumerable<CharacterMaster> enumerable = CharacterMaster.readOnlyInstancesList.Where((CharacterMaster el) => (Object)(object)el.minionOwnership.ownerMaster == (Object)(object)mapper.mapperBody.master); foreach (CharacterMaster item in enumerable) { if (item.GetBody().bodyIndex == GhoulBodyIndex && item.GetBody().healthComponent.alive) { ModelLocator component = item.GetBodyObject().GetComponent<ModelLocator>(); if (Object.op_Implicit((Object)(object)component)) { BoneMapper componentInChildren = ((Component)component.modelTransform).GetComponentInChildren<BoneMapper>(); CustomEmotesAPI.PlayAnimation(newAnimation, componentInChildren, -2); } } } } } } namespace Morris.Content { internal class TombstoneSoulOrb : GenericDamageOrb { public static string explodeSoundString = "Play_engi_M2_explo"; public static float orbSpeed = 100f; public static float blastRadius = 15f; public override void Begin() { base.speed = orbSpeed; ((GenericDamageOrb)this).Begin(); } public override GameObject GetOrbEffect() { return MorrisAssets.SoulOrbTrailEffect; } public override void OnArrival() { //IL_001e: 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_002f: 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_0046: Expected O, but got Unknown //IL_0078: 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_0089: 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_00a0: 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_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: 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_00c8: 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_00cf: 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) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_00db: 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_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: 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_0104: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_011b: 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_0127: Unknown result type (might be due to invalid IL or missing references) //IL_012c: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)((Orb)this).target)) { GameObject soulOrbExplosion = MorrisAssets.SoulOrbExplosion; EffectData val = new EffectData { origin = ((Component)((Orb)this).target).transform.position, scale = blastRadius }; EffectManager.SpawnEffect(soulOrbExplosion, val, true); Util.PlaySound(explodeSoundString, ((Component)((Orb)this).target).gameObject); if (Object.op_Implicit((Object)(object)base.attacker)) { new BlastAttack { attacker = base.attacker, baseDamage = base.damageValue, baseForce = 0f, bonusForce = Vector3.down * 1000f, crit = base.isCrit, damageColorIndex = (DamageColorIndex)3, damageType = DamageTypeCombo.op_Implicit((DamageType)0), falloffModel = (FalloffModel)0, inflictor = null, position = ((Component)((Orb)this).target).transform.position, procChainMask = base.procChainMask, procCoefficient = base.procCoefficient, radius = blastRadius, teamIndex = TeamComponent.GetObjectTeam(base.attacker) }.Fire(); } } } } } namespace Morris.Modules { public static class Buffs { internal static BuffDef exhaustionDebuff; public static float exhaustStatReduction = 0.7f; public static float exhaustCooldownScale = 1.2f; internal static void RegisterBuffs() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: 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) BuffDef val = Addressables.LoadAssetAsync<BuffDef>((object)"RoR2/Base/Treebot/bdWeak.asset").WaitForCompletion(); exhaustionDebuff = AddNewBuff("Exhaustion", val.iconSprite, new Color(79f, 255f, 244f), canStack: false, isDebuff: true); } internal static BuffDef AddNewBuff(string buffName, Sprite buffIcon, Color buffColor, bool canStack, bool isDebuff) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) BuffDef val = ScriptableObject.CreateInstance<BuffDef>(); ((Object)val).name = buffName; val.buffColor = buffColor; val.canStack = canStack; val.isDebuff = isDebuff; val.eliteDef = null; val.iconSprite = buffIcon; Content.AddBuffDef(val); return val; } } public class Compat { public static void DoCustomEmoteCompat() { } private void Subscriptions() { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Expected O, but got Unknown if (Chainloader.PluginInfos.ContainsKey("com.weliveinasociety.CustomEmotesAPI")) { CustomEmotesAPI.animChanged += new AnimationChanged(CustomEmotesAPI_animChanged); } } private void CustomEmotesAPI_animChanged(string newAnimation, BoneMapper mapper) { //IL_0019: 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_005e: 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) if (mapper.mapperBody.bodyIndex != MorrisPlugin.MorrisBodyIndex) { return; } IEnumerable<CharacterMaster> enumerable = CharacterMaster.readOnlyInstancesList.Where((CharacterMaster el) => (Object)(object)el.minionOwnership.ownerMaster == (Object)(object)mapper.mapperBody.master); foreach (CharacterMaster item in enumerable) { if (item.GetBody().bodyIndex == MorrisPlugin.GhoulBodyIndex) { Chat.AddMessage("Getting bone mapper for ghoul"); ModelLocator component = item.GetBodyObject().GetComponent<ModelLocator>(); if (Object.op_Implicit((Object)(object)component)) { BoneMapper componentInChildren = ((Component)component.modelTransform).GetComponentInChildren<BoneMapper>(); CustomEmotesAPI.PlayAnimation(newAnimation, componentInChildren, -2); } } } } } public static class Config { private static ConfigEntry<string> modVersion; public static ConfigEntry<float> sortPosition; public static ConfigEntry<int> ghoulLimit; public static string passiveTitle = "Passive"; public static string primaryTitle = "Primary"; public static string secondaryTitle = "Secondary"; public static string utilityTitle = "Utility"; public static string specialTitle = "Special"; public static void ReadConfig(MorrisPlugin plugin) { sortPosition = ((BaseUnityPlugin)plugin).Config.Bind<float>("General", "Lobby Sort Position", 16f, "Sort position of Mortician in the character select lobby"); ghoulLimit = ((BaseUnityPlugin)plugin).Config.Bind<int>("General", "Ghoul limit", 0, "The maximum amount of ghouls that you can have out in the field. Set this to 0 or a negative number to have no limit. The intended experience is to have no limit at all, so I highly suggest only touching this if you are experiencing lag."); } public static ConfigEntry<bool> CharacterEnableConfig(string characterName, string description = "Set to false to disable this character", bool enabledDefault = true) { return ((BaseUnityPlugin)MorrisPlugin.instance).Config.Bind<bool>("General", "Enable " + characterName, enabledDefault, description); } } internal class ContentPacks : IContentPackProvider { internal ContentPack contentPack = new ContentPack(); public static List<GameObject> bodyPrefabs = new List<GameObject>(); public static List<GameObject> masterPrefabs = new List<GameObject>(); public static List<GameObject> projectilePrefabs = new List<GameObject>(); public static List<SurvivorDef> survivorDefs = new List<SurvivorDef>(); public static List<UnlockableDef> unlockableDefs = new List<UnlockableDef>(); public static List<SkillFamily> skillFamilies = new List<SkillFamily>(); public static List<SkillDef> skillDefs = new List<SkillDef>(); public static List<Type> entityStates = new List<Type>(); public static List<BuffDef> buffDefs = new List<BuffDef>(); public static List<EffectDef> effectDefs = new List<EffectDef>(); public static List<GameObject> networkedObjects = new List<GameObject>(); public static List<NetworkSoundEventDef> networkSoundEventDefs = new List<NetworkSoundEventDef>(); public string identifier => "com.Bog.Morris"; public void Initialize() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown ContentManager.collectContentPackProviders += new CollectContentPackProvidersDelegate(ContentManager_collectContentPackProviders); } private void ContentManager_collectContentPackProviders(AddContentPackProviderDelegate addContentPackProvider) { addContentPackProvider.Invoke((IContentPackProvider)(object)this); } public IEnumerator LoadStaticContentAsync(LoadStaticContentAsyncArgs args) { contentPack.identifier = identifier; contentPack.bodyPrefabs.Add(bodyPrefabs.ToArray()); contentPack.masterPrefabs.Add(masterPrefabs.ToArray()); contentPack.projectilePrefabs.Add(projectilePrefabs.ToArray()); contentPack.survivorDefs.Add(survivorDefs.ToArray()); contentPack.unlockableDefs.Add(unlockableDefs.ToArray()); contentPack.skillDefs.Add(skillDefs.ToArray()); contentPack.skillFamilies.Add(skillFamilies.ToArray()); contentPack.entityStateTypes.Add(entityStates.ToArray()); contentPack.buffDefs.Add(buffDefs.ToArray()); contentPack.effectDefs.Add(effectDefs.ToArray()); contentPack.networkedObjectPrefabs.Add(networkedObjects.ToArray()); contentPack.networkSoundEventDefs.Add(networkSoundEventDefs.ToArray()); args.ReportProgress(1f); yield break; } public IEnumerator GenerateContentPackAsync(GetContentPackAsyncArgs args) { ContentPack.Copy(contentPack, args.output); args.ReportProgress(1f); yield break; } public IEnumerator FinalizeAsync(FinalizeAsyncArgs args) { args.ReportProgress(1f); yield break; } } internal class Content { public static void AddCharacterBodyPrefab(GameObject bprefab) { ContentPacks.bodyPrefabs.Add(bprefab); } public static void AddMasterPrefab(GameObject prefab) { ContentPacks.masterPrefabs.Add(prefab); } public static void AddProjectilePrefab(GameObject prefab) { ContentPacks.projectilePrefabs.Add(prefab); } public static void AddSurvivorDef(SurvivorDef survivorDef) { ContentPacks.survivorDefs.Add(survivorDef); } public static void AddUnlockableDef(UnlockableDef unlockableDef) { ContentPacks.unlockableDefs.Add(unlockableDef); } public static void AddSkillDef(SkillDef skillDef) { ContentPacks.skillDefs.Add(skillDef); } public static void AddSkillFamily(SkillFamily skillFamily) { ContentPacks.skillFamilies.Add(skillFamily); } public static void AddEntityState(Type entityState) { ContentPacks.entityStates.Add(entityState); } public static void AddBuffDef(BuffDef buffDef) { ContentPacks.buffDefs.Add(buffDef); } public static void AddEffectDef(EffectDef effectDef) { ContentPacks.effectDefs.Add(effectDef); } public static void AddNetworkedObject(GameObject networkedObject) { ContentPacks.networkedObjects.Add(networkedObject); } public static void AddNetworkSoundEventDef(NetworkSoundEventDef networkSoundEventDef) { ContentPacks.networkSoundEventDefs.Add(networkSoundEventDef); } } internal static class Helpers { internal const string agilePrefix = "<style=cIsUtility>Agile.</style> "; internal static string ScepterDescription(string desc) { return "\n<color=#d299ff>SCEPTER: " + desc + "</color>"; } public static T[] Append<T>(ref T[] array, List<T> list) { int num = array.Length; int count = list.Count; Array.Resize(ref array, num + count); list.CopyTo(array, num); return array; } public static Func<T[], T[]> AppendDel<T>(List<T> list) { return (T[] r) => Append(ref r, list); } } internal static class ItemDisplays { private static Dictionary<string, GameObject> itemDisplayPrefabs = new Dictionary<string, GameObject>(); internal static void PopulateDisplays() { PopulateFromBody("MageBody"); PopulateFromBody("LunarExploderBody"); PopulateCustomLightningArm(); } private static void PopulateFromBody(string bodyName) { ItemDisplayRuleSet itemDisplayRuleSet = ((Component)LegacyResourcesAPI.Load<GameObject>("Prefabs/CharacterBodies/" + bodyName).GetComponent<ModelLocator>().modelTransform).GetComponent<CharacterModel>().itemDisplayRuleSet; KeyAssetRuleGroup[] keyAssetRuleGroups = itemDisplayRuleSet.keyAssetRuleGroups; for (int i = 0; i < keyAssetRuleGroups.Length; i++) { ItemDisplayRule[] rules = keyAssetRuleGroups[i].displayRuleGroup.rules; for (int j = 0; j < rules.Length; j++) { GameObject followerPrefab = rules[j].followerPrefab; if (Object.op_Implicit((Object)(object)followerPrefab)) { string key = ((Object)followerPrefab).name?.ToLowerInvariant(); if (!itemDisplayPrefabs.ContainsKey(key)) { itemDisplayPrefabs[key] = followerPrefab; } } } } } private static void PopulateCustomLightningArm() { GameObject val = PrefabAPI.InstantiateClone(itemDisplayPrefabs["displaylightningarmright"], "DisplayLightningCustom", false); LimbMatcher component = val.GetComponent<LimbMatcher>(); component.limbPairs[0].targetChildLimb = "LightningArm1"; component.limbPairs[1].targetChildLimb = "LightningArm2"; component.limbPairs[2].targetChildLimb = "LightningArmEnd"; itemDisplayPrefabs["displaylightningarmcustom"] = val; } public static GameObject LoadDisplay(string name) { if (itemDisplayPrefabs.ContainsKey(name.ToLowerInvariant()) && Object.op_Implicit((Object)(object)itemDisplayPrefabs[name.ToLowerInvariant()])) { return itemDisplayPrefabs[name.ToLowerInvariant()]; } Log.Error("item display " + name + " returned null"); return null; } } internal static class Materials { private static List<Material> cachedMaterials = new List<Material>(); public static Material CreateHopooMaterial(string materialName) { //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Expected O, but got Unknown Material val = cachedMaterials.Find(delegate(Material mat) { materialName.Replace(" (Instance)", ""); return ((Object)mat).name.Contains(materialName); }); if (Object.op_Implicit((Object)(object)val)) { return val; } val = MorrisAssets.mainAssetBundle.LoadAsset<Material>(materialName); if (!Object.op_Implicit((Object)(object)val)) { Log.Error("Failed to load material: " + materialName + " - Check to see that the material in your Unity project matches this name"); return new Material(MorrisAssets.hotpoo); } return val.SetHopooMaterial(); } public static IEnumerator FixRenderQueues() { Material blueFire = MorrisAssets.mainAssetBundle.LoadAsset<Material>("matMorrisFireBlue"); Material greenFire = MorrisAssets.mainAssetBundle.LoadAsset<Material>("matMorrisFireGreen"); blueFire.renderQueue = 2950; greenFire.renderQueue = 2900; yield return null; } public static Material SetHopooMaterial(this Material tempMat) { //IL_006f: 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_014c: Unknown result type (might be due to invalid IL or missing references) if (cachedMaterials.Contains(tempMat)) { return tempMat; } float? num = null; float? num2 = null; Color? val = null; if (tempMat.IsKeywordEnabled("_NORMALMAP")) { num = tempMat.GetFloat("_BumpScale"); } if (tempMat.IsKeywordEnabled("_EMISSION")) { val = tempMat.GetColor("_EmissionColor"); } if (tempMat.IsKeywordEnabled("CUTOUT")) { num2 = tempMat.GetFloat("_Cutoff"); } tempMat.shader = MorrisAssets.hotpoo; tempMat.SetColor("_Color", tempMat.GetColor("_Color")); tempMat.SetTexture("_MainTex", tempMat.GetTexture("_MainTex")); tempMat.SetTexture("_EmTex", tempMat.GetTexture("_EmissionMap")); tempMat.SetTexture("_NormalTex", tempMat.GetTexture("_BumpMap")); tempMat.EnableKeyword("DITHER"); if (num.HasValue) { tempMat.SetFloat("_NormalStrength", num.Value); } if (val.HasValue) { tempMat.SetColor("_EmColor", val.Value); tempMat.SetFloat("_EmPower", 1f); } if (num2.HasValue) { tempMat.EnableKeyword("CUTOUT"); tempMat.SetFloat("_Cutoff", num2.Value); } if (tempMat.IsKeywordEnabled("NOCULL")) { tempMat.SetInt("_Cull", 0); } if (tempMat.IsKeywordEnabled("LIMBREMOVAL")) { tempMat.SetInt("_LimbRemovalOn", 1); } cachedMaterials.Add(tempMat); return tempMat; } public static Material MakeUnique(this Material material) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Expected O, but got Unknown if (cachedMaterials.Contains(material)) { return new Material(material); } return material; } public static Material SetColor(this Material material, Color color) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) material.SetColor("_Color", color); return material; } public static Material SetNormal(this Material material, float normalStrength = 1f) { material.SetFloat("_NormalStrength", normalStrength); return material; } public static Material SetEmission(t