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 Spiritbound v0.1.1
plugins/SpiritboundMod.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.AI.Walker; using EntityStates.BrotherMonster; using EntityStates.GravekeeperMonster.Weapon; using HG; using HG.BlendableTypes; using KinematicCharacterController; using On.RoR2; using On.RoR2.UI; using R2API; using R2API.Networking; using R2API.Networking.Interfaces; using R2API.Utils; using RoR2; using RoR2.Achievements; using RoR2.Audio; using RoR2.CharacterAI; using RoR2.ContentManagement; using RoR2.Orbs; using RoR2.Projectile; using RoR2.Skills; using RoR2.UI; using SpiritboundMod.Modules; using SpiritboundMod.Modules.Achievements; using SpiritboundMod.Modules.BaseStates; using SpiritboundMod.Modules.Characters; using SpiritboundMod.Spirit.Components; using SpiritboundMod.Spirit.SkillStates; using SpiritboundMod.Spiritbound; using SpiritboundMod.Spiritbound.Components; using SpiritboundMod.Spiritbound.Content; using SpiritboundMod.Spiritbound.SkillStates; using ThreeEyedGames; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.Networking; using UnityEngine.Rendering; using UnityEngine.Rendering.PostProcessing; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")] [assembly: AssemblyCompany("SpiritboundMod")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+34804e740b3a89893e71c4a8f97bc84ee6e85c5e")] [assembly: AssemblyProduct("SpiritboundMod")] [assembly: AssemblyTitle("SpiritboundMod")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] internal enum SpiritboundCameraParams { DEFAULT, AIM_PISTOL, AIM_SNIPER, EMOTE } namespace SpiritboundMod { 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 ErrorAssetBundle(string assetName, string bundleName) { Error("failed to load asset, " + assetName + ", because it does not exist in asset bundle, " + bundleName); } 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); } } [NetworkCompatibility(/*Could not decode attribute arguments.*/)] [BepInPlugin("com.kenko.Spiritbound", "Spiritbound", "1.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] public class SpiritboundPlugin : BaseUnityPlugin { public const string MODUID = "com.kenko.Spiritbound"; public const string MODNAME = "Spiritbound"; public const string MODVERSION = "1.0.0"; public const string DEVELOPER_PREFIX = "KENKO"; public static SpiritboundPlugin instance; public static bool emotesInstalled => Chainloader.PluginInfos.ContainsKey("com.weliveinasociety.CustomEmotesAPI"); public static bool scepterInstalled => Chainloader.PluginInfos.ContainsKey("com.DestroyedClone.AncientScepter"); private void Awake() { instance = this; NetworkingAPI.RegisterMessageType<SyncBloodExplosion>(); NetworkingAPI.RegisterMessageType<SyncStackOrb>(); NetworkingAPI.RegisterMessageType<SyncHealOrb>(); Log.Init(((BaseUnityPlugin)this).Logger); Language.Init(); new SpiritboundSurvivor().Initialize(); new SpiritCharacter().Initialize(); new ContentPacks().Initialize(); } private void Start() { SoundBanks.Init(); } } } namespace SpiritboundMod.Spirit.SkillStates { public class SpiritBarrage : BaseState { public float baseDuration = 0.1f; public string muzzleString; public float missileForce = GravekeeperBarrage.missileForce; public float damageCoefficient = SpiritboundStaticValues.wispDamageCoefficient; public float maxSpread = 0f; public GameObject projectilePrefab = SpiritboundAssets.spiritOrbPrefab; private GameObject muzzleFlashEffect = SpiritboundAssets.arrowMuzzleFlashEffect; private float duration; private ChildLocator childLocator; private float missileStopwatch; private int spiritOrbAmount; public override void OnEnter() { childLocator = ((EntityState)this).GetModelChildLocator(); ((BaseState)this).OnEnter(); duration = baseDuration / base.attackSpeedStat; if (((EntityState)this).characterBody.baseNameToken == "KENKO_SPIRIT_NAME") { spiritOrbAmount = ((EntityState)this).GetComponent<SpiritController>().owner.GetComponent<CharacterBody>().GetBuffCount(SpiritboundBuffs.soulStacksBuff) + 1; int num = Random.Range(0, 2); muzzleString = ((num == 0) ? "MuzzleFlashL" : "MuzzleFlashR"); } else { spiritOrbAmount = ((EntityState)this).characterBody.GetBuffCount(SpiritboundBuffs.soulStacksBuff) + 1; muzzleString = "FirePack"; } ((EntityState)this).characterBody.SetAimTimer(duration + 1f); } private void FireBlob(Ray projectileRay, float bonusPitch, float bonusYaw) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0021: 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_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) ((Ray)(ref projectileRay)).direction = Util.ApplySpread(((Ray)(ref projectileRay)).direction, 0f, maxSpread, 1f, 1f, bonusYaw, bonusPitch); EffectManager.SimpleMuzzleFlash(muzzleFlashEffect, ((EntityState)this).gameObject, muzzleString, true); if (NetworkServer.active) { ProjectileManager.instance.FireProjectile(projectilePrefab, ((Ray)(ref projectileRay)).origin, Util.QuaternionSafeLookRotation(((Ray)(ref projectileRay)).direction), ((EntityState)this).gameObject, base.damageStat * damageCoefficient, missileForce, Util.CheckRoll(base.critStat, ((EntityState)this).characterBody.master), (DamageColorIndex)0, (GameObject)null, -1f); } } public override void OnExit() { ((EntityState)this).OnExit(); } public override void FixedUpdate() { //IL_0068: 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_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: 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_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_00ce: Unknown result type (might be due to invalid IL or missing references) ((EntityState)this).FixedUpdate(); missileStopwatch += Time.fixedDeltaTime; if (missileStopwatch >= duration / (float)spiritOrbAmount) { missileStopwatch = 0f; Transform val = childLocator.FindChild(muzzleString); if (Object.op_Implicit((Object)(object)val)) { Ray projectileRay = default(Ray); ((Ray)(ref projectileRay)).origin = val.position; Ray aimRay = ((BaseState)this).GetAimRay(); ((Ray)(ref projectileRay)).direction = ((Ray)(ref aimRay)).direction; float num = 1000f; RaycastHit val2 = default(RaycastHit); if (Physics.Raycast(((BaseState)this).GetAimRay(), ref val2, num, LayerMask.op_Implicit(((LayerIndex)(ref LayerIndex.world)).mask))) { ((Ray)(ref projectileRay)).direction = ((RaycastHit)(ref val2)).point - val.position; } FireBlob(projectileRay, 0f, 0f); } } if (((EntityState)this).fixedAge >= duration * 1.25f && ((EntityState)this).isAuthority) { ((EntityState)this).outer.SetNextStateToMain(); } } 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)3; } } public class SpiritBite : BaseMeleeAttack { protected GameObject swingEffectInstance; public override void OnEnter() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Unknown result type (might be due to invalid IL or missing references) RefreshState(); hitboxGroupName = "MeleeHitbox"; damageType = (DamageType)8; damageCoefficient = SpiritboundStaticValues.spiritBiteDamageCoefficient; procCoefficient = 1f; pushForce = 300f; bonusForce = Vector3.zero; baseDuration = 1f; attackStartPercentTime = 0.2f; attackEndPercentTime = 0.4f; earlyExitPercentTime = 0.5f; hitStopDuration = 0.05f; attackRecoil = 2f / ((BaseState)this).attackSpeedStat; hitHopVelocity = 0f; swingSoundString = ""; hitSoundString = ""; playbackRateParam = "Bite.playbackRate"; swingEffectPrefab = SpiritboundAssets.spiritBiteEffect; hitEffectPrefab = SpiritboundAssets.spiritboundHitEffect; impactSound = SpiritboundAssets.biteImpactSoundEvent.index; muzzleString = "BiteMuzzleFlash"; if (((EntityState)this).characterBody.HasBuff(Buffs.WarCryBuff)) { moddedDamageTypeHolder.Add(DamageTypes.CurrentHealthSpirit); } base.OnEnter(); } protected override void OnHitEnemyAuthority() { Util.PlaySound(hitSoundString, ((EntityState)this).gameObject); } protected override void FireAttack() { base.FireAttack(); } protected override void PlaySwingEffect() { Util.PlaySound(swingSoundString, ((EntityState)this).gameObject); if (Object.op_Implicit((Object)(object)swingEffectPrefab)) { Transform val = ((BaseState)this).FindModelChild(muzzleString); if (Object.op_Implicit((Object)(object)val)) { swingEffectInstance = Object.Instantiate<GameObject>(swingEffectPrefab, val); } } } protected override void PlayAttackAnimation() { RefreshState(); ((EntityState)this).PlayCrossfade("Gesture, Override", "Bite", playbackRateParam, duration * 1.3f, 0.05f); } public override void OnExit() { base.OnExit(); if (Object.op_Implicit((Object)(object)swingEffectInstance)) { EntityState.Destroy((Object)(object)swingEffectInstance); } } } public class SpiritLunge : BaseState { public static float giveUpDuration = 3f; public static float speedCoefficient = 6f; public Vector3 position; public float minDistanceFromPoint = 10f; public override void OnEnter() { ((BaseState)this).OnEnter(); ((EntityState)this).characterBody.isSprinting = true; if (minDistanceFromPoint <= 0f) { minDistanceFromPoint = 1f; } ((EntityState)this).PlayAnimation("FullBody, Override", "Dash", "Dash.playbackRate", giveUpDuration); } public override void FixedUpdate() { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0093: 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_00a3: 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_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_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_00fd: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) ((EntityState)this).FixedUpdate(); PerformInputs(); bool flag = Vector3.Distance(position, ((EntityState)this).transform.position) <= minDistanceFromPoint; bool flag2 = ((EntityState)this).fixedAge >= giveUpDuration; if ((flag || flag2) && ((EntityState)this).isAuthority) { if (flag2) { ((BaseCharacterController)((EntityState)this).characterMotor).Motor.SetPosition(position, true); } ((EntityState)this).outer.SetNextStateToMain(); } if (((EntityState)this).isAuthority) { RigidbodyDirection rigidbodyDirection = ((EntityState)this).rigidbodyDirection; Vector3 val = position - ((EntityState)this).transform.position; rigidbodyDirection.aimDirection = ((Vector3)(ref val)).normalized; RigidbodyMotor rigidbodyMotor = ((EntityState)this).rigidbodyMotor; Vector3 rootMotion = rigidbodyMotor.rootMotion; val = position - ((EntityState)this).transform.position; rigidbodyMotor.rootMotion = rootMotion + ((Vector3)(ref val)).normalized * (speedCoefficient * base.moveSpeedStat * Time.fixedDeltaTime); } } private void PerformInputs() { if (Object.op_Implicit((Object)(object)((EntityState)this).skillLocator)) { if (((EntityState)this).inputBank.skill1.down && Object.op_Implicit((Object)(object)((EntityState)this).skillLocator.primary)) { ((EntityState)this).skillLocator.primary.ExecuteIfReady(); } if (((EntityState)this).inputBank.skill2.down && Object.op_Implicit((Object)(object)((EntityState)this).skillLocator.secondary)) { ((EntityState)this).skillLocator.secondary.ExecuteIfReady(); } if (((EntityState)this).inputBank.skill3.down && Object.op_Implicit((Object)(object)((EntityState)this).skillLocator.utility)) { ((EntityState)this).skillLocator.utility.ExecuteIfReady(); } if (((EntityState)this).inputBank.skill4.down && Object.op_Implicit((Object)(object)((EntityState)this).skillLocator.special)) { ((EntityState)this).skillLocator.special.ExecuteIfReady(); } } } public override void OnExit() { ((EntityState)this).characterBody.isSprinting = false; ((EntityState)this).PlayCrossfade("FullBody, Override", "BufferEmpty", 0.2f); ((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 SpiritMainState : BaseState { private Animator modelAnimator; private bool skill1InputReceived; private bool skill2InputReceived; private bool skill3InputReceived; private bool skill4InputReceived; private bool sprintInputReceived; public override void OnEnter() { ((BaseState)this).OnEnter(); modelAnimator = ((EntityState)this).GetModelAnimator(); ((EntityState)this).PlayAnimation("Body", "Idle"); modelAnimator.SetFloat("Fly.rate", 1f); } public override void FixedUpdate() { ((EntityState)this).FixedUpdate(); PerformInputs(); } public override void Update() { ((EntityState)this).Update(); if (!(Time.deltaTime <= 0f)) { UpdateAnimParams(); } } private void PerformInputs() { //IL_003e: 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_0053: Unknown result type (might be due to invalid IL or missing references) //IL_006f: 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_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) if (!((EntityState)this).isAuthority) { return; } if (Object.op_Implicit((Object)(object)((EntityState)this).inputBank)) { if (Object.op_Implicit((Object)(object)((EntityState)this).rigidbodyMotor)) { ((EntityState)this).rigidbodyMotor.moveVector = ((EntityState)this).inputBank.moveVector * ((EntityState)this).characterBody.moveSpeed; } if (Object.op_Implicit((Object)(object)((EntityState)this).rigidbodyDirection)) { if (((EntityState)this).inputBank.moveVector != Vector3.zero) { ((EntityState)this).rigidbodyDirection.aimDirection = ((EntityState)this).inputBank.moveVector; } else { ((EntityState)this).rigidbodyDirection.aimDirection.y = 0f; } } skill1InputReceived = ((EntityState)this).inputBank.skill1.down; skill2InputReceived = ((EntityState)this).inputBank.skill2.down; skill3InputReceived = ((EntityState)this).inputBank.skill3.down; skill4InputReceived = ((EntityState)this).inputBank.skill4.down; sprintInputReceived |= ((EntityState)this).inputBank.sprint.down; if (((Vector3)(ref ((EntityState)this).inputBank.moveVector)).magnitude <= 0.5f) { sprintInputReceived = false; } ((EntityState)this).characterBody.isSprinting = sprintInputReceived; if (sprintInputReceived) { modelAnimator.SetFloat("Fly.rate", 1.5f); } sprintInputReceived = false; } if (Object.op_Implicit((Object)(object)((EntityState)this).skillLocator)) { if (skill1InputReceived && Object.op_Implicit((Object)(object)((EntityState)this).skillLocator.primary)) { ((EntityState)this).skillLocator.primary.ExecuteIfReady(); } if (skill2InputReceived && Object.op_Implicit((Object)(object)((EntityState)this).skillLocator.secondary)) { ((EntityState)this).skillLocator.secondary.ExecuteIfReady(); } if (skill3InputReceived && Object.op_Implicit((Object)(object)((EntityState)this).skillLocator.utility)) { ((EntityState)this).skillLocator.utility.ExecuteIfReady(); } if (skill4InputReceived && Object.op_Implicit((Object)(object)((EntityState)this).skillLocator.special)) { ((EntityState)this).skillLocator.special.ExecuteIfReady(); } } } private void UpdateAnimParams() { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0021: 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) if (Object.op_Implicit((Object)(object)modelAnimator)) { Vector3 moveVector = ((EntityState)this).inputBank.moveVector; bool flag = moveVector != Vector3.zero && ((EntityState)this).characterBody.moveSpeed > Mathf.Epsilon; modelAnimator.SetBool("isMoving", flag); } } } public class SpiritRedirect : SpiritLunge { public bool isEmpower; public override void OnEnter() { base.OnEnter(); if (NetworkServer.active && isEmpower) { ((EntityState)this).characterBody.AddTimedBuff(Buffs.WarCryBuff, 8f); } } public override void OnExit() { base.OnExit(); if (isEmpower) { ((EntityState)this).gameObject.GetComponent<SpiritController>().inFrenzy = true; } } } } namespace SpiritboundMod.Spirit.Components { public class SpiritController : MonoBehaviour { public static SkillDef missileSkillDef; public GameObject owner; private GameObject masterObject; private BaseAI baseAI; private AISkillDriver[] aISkillDrivers; private EntityStateMachine weaponMachine; private EntityStateMachine bodyMachine; public SkillLocator skillLocator; private bool attackMode = true; public CharacterBody characterBody; public Highlight targetHighlight; public bool inFrenzy; public GameObject currentTarget => baseAI.currentEnemy.gameObject; public HurtBox currentBestHurtbox => baseAI.currentEnemy.bestHurtBox; public bool inAttackMode => attackMode; private void Awake() { skillLocator = ((Component)this).GetComponent<SkillLocator>(); ((MonoBehaviour)this).Invoke("ApplyEffects", 0.3f); } private void Start() { characterBody = ((Component)this).GetComponent<CharacterBody>(); if (Object.op_Implicit((Object)(object)owner) && Object.op_Implicit((Object)(object)characterBody)) { CharacterBody component = owner.GetComponent<CharacterBody>(); if (component.skinIndex != characterBody.skinIndex) { ApplySpiritSkin(component); } } masterObject = ((Component)characterBody.master).gameObject; aISkillDrivers = masterObject.GetComponents<AISkillDriver>(); baseAI = masterObject.GetComponent<BaseAI>(); weaponMachine = EntityStateMachine.FindByCustomName(((Component)this).gameObject, "Weapon"); bodyMachine = EntityStateMachine.FindByCustomName(((Component)this).gameObject, "Body"); EnterFollowMode(); } public void ApplySpiritSkin(CharacterBody ownerBody) { if (!Object.op_Implicit((Object)(object)ownerBody) || !Object.op_Implicit((Object)(object)characterBody)) { return; } characterBody.skinIndex = ownerBody.skinIndex; ModelLocator component = ((Component)this).GetComponent<ModelLocator>(); if (Object.op_Implicit((Object)(object)component)) { GameObject gameObject = ((Component)component.modelTransform).gameObject; if (Object.op_Implicit((Object)(object)gameObject)) { ModelSkinController component2 = gameObject.GetComponent<ModelSkinController>(); component2.ApplySkin((int)characterBody.skinIndex); } } } public void ApplyEffects() { ModelLocator component = ((Component)this).GetComponent<ModelLocator>(); ChildLocator componentInChildren = ((Component)component.modelBaseTransform).GetComponentInChildren<ChildLocator>(); ((Renderer)((Component)componentInChildren.FindChild("FireR")).gameObject.GetComponent<ParticleSystemRenderer>()).material = SpiritboundAssets.fireMatInFront; ((Renderer)((Component)componentInChildren.FindChild("FireL")).gameObject.GetComponent<ParticleSystemRenderer>()).material = SpiritboundAssets.fireMatInFront; } public void SetTarget(HurtBox target) { //IL_007c: Unknown result type (might be due to invalid IL or missing references) HealthComponent healthComponent = target.healthComponent; GameObject gameObject = ((Component)healthComponent).gameObject; if (Object.op_Implicit((Object)(object)target) && Object.op_Implicit((Object)(object)healthComponent) && healthComponent.alive && Object.op_Implicit((Object)(object)gameObject)) { CreateHighlight(gameObject); baseAI.currentEnemy.gameObject = gameObject; baseAI.currentEnemy.bestHurtBox = target; baseAI.enemyAttention = 1f; baseAI.BeginSkillDriver(baseAI.EvaluateSkillDrivers()); } } public void EnterAttackMode() { if (Util.HasEffectiveAuthority(owner)) { Util.PlaySound("", ((Component)this).gameObject); } if (attackMode) { return; } attackMode = true; AISkillDriver[] array = aISkillDrivers; foreach (AISkillDriver val in array) { if (!((Behaviour)val).enabled && SpiritCharacter.attackDrivers.Contains(val.customName)) { ((Behaviour)val).enabled = true; } } } public void EnterFollowMode() { //IL_00dc: Unknown result type (might be due to invalid IL or missing references) if (Util.HasEffectiveAuthority(owner)) { Util.PlaySound("Play_gravekeeper_death_01", ((Component)this).gameObject); } if (!attackMode) { return; } attackMode = false; if (Object.op_Implicit((Object)(object)targetHighlight)) { Object.Destroy((Object)(object)targetHighlight); } AISkillDriver[] array = aISkillDrivers; foreach (AISkillDriver val in array) { if (((Behaviour)val).enabled && SpiritCharacter.attackDrivers.Contains(val.customName)) { ((Behaviour)val).enabled = false; } } baseAI.currentEnemy.gameObject = null; baseAI.currentEnemy.bestHurtBox = null; baseAI.BeginSkillDriver(baseAI.EvaluateSkillDrivers()); } public void LungeAtEnemy(CharacterBody victimBody) { //IL_0013: 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) bodyMachine.SetInterruptState((EntityState)(object)new SpiritLunge { position = victimBody.transform.position }, (InterruptPriority)2); } public void FreeOrb() { weaponMachine.SetInterruptState((EntityState)(object)new SpiritBarrage(), (InterruptPriority)2); } public void Redirect(Vector3 position, float minDistance, bool empower = true) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) bodyMachine.SetInterruptState((EntityState)(object)new SpiritRedirect { position = position, minDistanceFromPoint = minDistance, isEmpower = empower }, (InterruptPriority)2); } private void FixedUpdate() { if (characterBody.isPlayerControlled) { return; } if (!Object.op_Implicit((Object)(object)owner) && Object.op_Implicit((Object)(object)masterObject)) { owner = masterObject.GetComponent<CharacterMaster>().minionOwnership.ownerMaster.bodyInstanceObject; if (!Object.op_Implicit((Object)(object)owner)) { return; } SpiritMasterComponent component = owner.GetComponent<SpiritMasterComponent>(); if (!Object.op_Implicit((Object)(object)component)) { if (characterBody.master.godMode) { characterBody.master.ToggleGod(); } characterBody.master.TrueKill(); } component.spiritController = this; } if (Object.op_Implicit((Object)(object)owner) && inFrenzy && !characterBody.HasBuff(Buffs.WarCryBuff)) { inFrenzy = false; owner.GetComponent<SpiritMasterComponent>().FollowOrder(); } } private void CreateHighlight(GameObject target) { //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0093: 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_00d2: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)target.GetComponent<Highlight>())) { return; } if (Object.op_Implicit((Object)(object)targetHighlight)) { Object.Destroy((Object)(object)targetHighlight); } ModelLocator component = target.GetComponent<ModelLocator>(); if (!Object.op_Implicit((Object)(object)component)) { return; } Transform modelTransform = component.modelTransform; if (!Object.op_Implicit((Object)(object)modelTransform)) { return; } CharacterModel component2 = ((Component)modelTransform).GetComponent<CharacterModel>(); if (!Object.op_Implicit((Object)(object)component2)) { return; } RendererInfo[] baseRendererInfos = component2.baseRendererInfos; foreach (RendererInfo val in baseRendererInfos) { if (!val.ignoreOverlays) { targetHighlight = target.AddComponent<Highlight>(); targetHighlight.highlightColor = (HighlightColor)1; targetHighlight.strength = 1.5f; targetHighlight.targetRenderer = val.renderer; targetHighlight.isOn = true; break; } } } } } namespace SpiritboundMod.Spiritbound { public class SpiritboundSurvivor : SurvivorBase<SpiritboundSurvivor> { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static hook_Init <>9__61_0; internal void <Emotes>b__61_0(orig_Init orig) { orig.Invoke(); GameObject val = SpiritboundAssets.mainAssetBundle.LoadAsset<GameObject>("spiritbound_emoteskeleton"); CustomEmotesAPI.ImportArmature(characterPrefab, val, 0, true); } } public const string SOULBOUND_PREFIX = "KENKO_SPIRITBOUND_"; internal static GameObject characterPrefab; public static SkillDef convictScepterSkillDef; public override string assetBundleName => "spiritbound"; public override string bodyName => "SpiritboundBody"; public override string masterName => "SpiritboundMonsterMaster"; public override string modelPrefabName => "mdlSpiritbound"; public override string displayPrefabName => "SpiritboundDisplay"; public override string survivorTokenPrefix => "KENKO_SPIRITBOUND_"; public override BodyInfo bodyInfo => new BodyInfo { bodyName = bodyName, bodyNameToken = "KENKO_SPIRITBOUND_NAME", subtitleNameToken = "KENKO_SPIRITBOUND_SUBTITLE", characterPortrait = assetBundle.LoadAsset<Texture>("texSpiritboundIcon"), bodyColor = SpiritboundAssets.spiritBoundColor, sortPosition = 6f, spreadBloomDecayTime = 0.7f, spreadBloomCurve = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Captain/CaptainBody.prefab").WaitForCompletion().gameObject.GetComponent<CharacterBody>().spreadBloomCurve, crosshair = SpiritboundAssets.spiritboundCrosshair, podPrefab = LegacyResourcesAPI.Load<GameObject>("Prefabs/NetworkedObjects/SurvivorPod"), maxHealth = 110f, damage = 12f, jumpCount = 1 }; public override CustomRendererInfo[] customRendererInfos => new CustomRendererInfo[7] { new CustomRendererInfo { childName = "Model" }, new CustomRendererInfo { childName = "HairModel" }, new CustomRendererInfo { childName = "HornModel" }, new CustomRendererInfo { childName = "MaskModel" }, new CustomRendererInfo { childName = "TrinketModel" }, new CustomRendererInfo { childName = "PackModel" }, new CustomRendererInfo { childName = "BowModel" } }; public override UnlockableDef characterUnlockableDef => SpiritboundUnlockables.characterUnlockableDef; public override ItemDisplaysBase itemDisplays => new SpiritboundItemDisplays(); public override AssetBundle assetBundle { get; protected set; } public override GameObject bodyPrefab { get; protected set; } public override CharacterBody prefabCharacterBody { get; protected set; } public override GameObject characterModelObject { get; protected set; } public override CharacterModel prefabCharacterModel { get; protected set; } public override GameObject displayPrefab { get; protected set; } public override void Initialize() { base.Initialize(); } public override void InitializeCharacter() { SpiritboundAssets.Init(assetBundle); SpiritboundConfig.Init(); SpiritboundUnlockables.Init(); base.InitializeCharacter(); CameraParams.InitializeParams(); DamageTypes.Init(); SpiritboundStates.Init(); SpiritboundTokens.Init(); SpiritboundBuffs.Init(assetBundle); InitializeEntityStateMachines(); InitializeSkills(); InitializeSkins(); InitializeCharacterMaster(); AdditionalBodySetup(); characterPrefab = bodyPrefab; AddHooks(); } private void AdditionalBodySetup() { AddHitboxes(); bodyPrefab.AddComponent<SpiritboundController>(); bodyPrefab.AddComponent<SpiritMasterComponent>(); } public void AddHitboxes() { } public override void InitializeEntityStateMachines() { Prefabs.ClearEntityStateMachines(bodyPrefab); Prefabs.AddMainEntityStateMachine(bodyPrefab, "Body", typeof(MainState), typeof(SpawnTeleporterState)); Prefabs.AddEntityStateMachine(bodyPrefab, "Weapon"); Prefabs.AddEntityStateMachine(bodyPrefab, "Weapon2"); Prefabs.AddEntityStateMachine(bodyPrefab, "Dash"); } public override void InitializeSkills() { bodyPrefab.AddComponent<SpiritboundPassive>(); Skills.CreateSkillFamilies(bodyPrefab); AddPassiveSkills(); AddPrimarySkills(); AddSecondarySkills(); AddUtilitySkills(); AddSpecialSkills(); } private void AddPassiveSkills() { //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Unknown result type (might be due to invalid IL or missing references) SpiritboundPassive component = bodyPrefab.GetComponent<SpiritboundPassive>(); SkillLocator component2 = bodyPrefab.GetComponent<SkillLocator>(); component2.passiveSkill.enabled = false; component.spiritboundPassive = Skills.CreateSkillDef(new SkillDefInfo { skillName = "KENKO_SPIRITBOUND_PASSIVE_NAME", skillNameToken = "KENKO_SPIRITBOUND_PASSIVE_NAME", skillDescriptionToken = "KENKO_SPIRITBOUND_PASSIVE_DESCRIPTION", skillIcon = assetBundle.LoadAsset<Sprite>("texSpiritboundPassive"), keywordTokens = new string[1] { Tokens.spiritBoundStacksKeyword }, activationState = new SerializableEntityStateType(typeof(Idle)), activationStateMachineName = "", baseMaxStock = 1, baseRechargeInterval = 0f, beginSkillCooldownOnSkillEnd = false, canceledFromSprinting = false, forceSprintDuringState = false, fullRestockOnAssign = true, interruptPriority = (InterruptPriority)0, resetCooldownTimerOnUse = false, isCombatSkill = false, mustKeyPress = false, cancelSprintingOnActivation = false, rechargeStock = 1, requiredStock = 2, stockToConsume = 1 }); Skills.AddPassiveSkills(component.passiveSkillSlot.skillFamily, component.spiritboundPassive); } private void AddPrimarySkills() { //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) SkillDefInfo skillDefInfo = new SkillDefInfo(); skillDefInfo.skillName = "Bow"; skillDefInfo.skillNameToken = "KENKO_SPIRITBOUND_PRIMARY_BOW_NAME"; skillDefInfo.skillDescriptionToken = "KENKO_SPIRITBOUND_PRIMARY_BOW_DESCRIPTION"; skillDefInfo.keywordTokens = new string[2] { Tokens.agileKeyword, Tokens.respiteKeyword }; skillDefInfo.skillIcon = assetBundle.LoadAsset<Sprite>("tex"); skillDefInfo.activationState = new SerializableEntityStateType(typeof(ChargeArrow)); skillDefInfo.activationStateMachineName = "Weapon"; skillDefInfo.interruptPriority = (InterruptPriority)0; skillDefInfo.baseMaxStock = 1; skillDefInfo.baseRechargeInterval = 1f; skillDefInfo.rechargeStock = 0; skillDefInfo.requiredStock = 0; skillDefInfo.stockToConsume = 0; skillDefInfo.resetCooldownTimerOnUse = false; skillDefInfo.fullRestockOnAssign = true; skillDefInfo.dontAllowPastMaxStocks = false; skillDefInfo.beginSkillCooldownOnSkillEnd = true; skillDefInfo.mustKeyPress = false; skillDefInfo.isCombatSkill = true; skillDefInfo.canceledFromSprinting = false; skillDefInfo.cancelSprintingOnActivation = false; skillDefInfo.forceSprintDuringState = false; SkillDef val = Skills.CreateSkillDef(skillDefInfo); Skills.AddPrimarySkills(bodyPrefab, val); } private void AddSecondarySkills() { //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) SkillDefInfo skillDefInfo = new SkillDefInfo(); skillDefInfo.skillName = "Hop"; skillDefInfo.skillNameToken = "KENKO_SPIRITBOUND_SECONDARY_HOP_NAME"; skillDefInfo.skillDescriptionToken = "KENKO_SPIRITBOUND_SECONDARY_HOP_DESCRIPTION"; skillDefInfo.keywordTokens = new string[0]; skillDefInfo.skillIcon = assetBundle.LoadAsset<Sprite>("tex"); skillDefInfo.activationState = new SerializableEntityStateType(typeof(HopFire)); skillDefInfo.activationStateMachineName = "Weapon"; skillDefInfo.interruptPriority = (InterruptPriority)2; skillDefInfo.baseMaxStock = 1; skillDefInfo.baseRechargeInterval = 7f; skillDefInfo.rechargeStock = 1; skillDefInfo.requiredStock = 1; skillDefInfo.stockToConsume = 1; skillDefInfo.resetCooldownTimerOnUse = false; skillDefInfo.fullRestockOnAssign = true; skillDefInfo.dontAllowPastMaxStocks = false; skillDefInfo.beginSkillCooldownOnSkillEnd = true; skillDefInfo.mustKeyPress = false; skillDefInfo.isCombatSkill = true; skillDefInfo.canceledFromSprinting = false; skillDefInfo.cancelSprintingOnActivation = false; skillDefInfo.forceSprintDuringState = true; SkillDef val = Skills.CreateSkillDef(skillDefInfo); Skills.AddSecondarySkills(bodyPrefab, val); } private void AddUtilitySkills() { //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) SkillDefInfo skillDefInfo = new SkillDefInfo(); skillDefInfo.skillName = "Spirit Swap"; skillDefInfo.skillNameToken = "KENKO_SPIRITBOUND_UTILITY_SWAP_NAME"; skillDefInfo.skillDescriptionToken = "KENKO_SPIRITBOUND_UTILITY_SWAP_DESCRIPTION"; skillDefInfo.keywordTokens = new string[0]; skillDefInfo.skillIcon = assetBundle.LoadAsset<Sprite>("tex"); skillDefInfo.activationState = new SerializableEntityStateType(typeof(SwapWithSpirit)); skillDefInfo.activationStateMachineName = "Dash"; skillDefInfo.interruptPriority = (InterruptPriority)1; skillDefInfo.baseRechargeInterval = 8f; skillDefInfo.baseMaxStock = 1; skillDefInfo.rechargeStock = 1; skillDefInfo.requiredStock = 1; skillDefInfo.stockToConsume = 1; skillDefInfo.resetCooldownTimerOnUse = false; skillDefInfo.fullRestockOnAssign = true; skillDefInfo.dontAllowPastMaxStocks = false; skillDefInfo.mustKeyPress = true; skillDefInfo.beginSkillCooldownOnSkillEnd = false; skillDefInfo.isCombatSkill = false; skillDefInfo.canceledFromSprinting = false; skillDefInfo.cancelSprintingOnActivation = false; skillDefInfo.forceSprintDuringState = true; SkillDef val = Skills.CreateSkillDef(skillDefInfo); Skills.AddUtilitySkills(bodyPrefab, val); } private void AddSpecialSkills() { //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) SkillDefInfo skillDefInfo = new SkillDefInfo(); skillDefInfo.skillName = "Redirect"; skillDefInfo.skillNameToken = "KENKO_SPIRITBOUND_SPECIAL_REDIRECT_NAME"; skillDefInfo.skillDescriptionToken = "KENKO_SPIRITBOUND_SPECIAL_REDIRECT_DESCRIPTION"; skillDefInfo.keywordTokens = new string[0]; skillDefInfo.skillIcon = assetBundle.LoadAsset<Sprite>("texConvictIcon"); skillDefInfo.activationState = new SerializableEntityStateType(typeof(RedirectSpirit)); skillDefInfo.activationStateMachineName = "Weapon2"; skillDefInfo.interruptPriority = (InterruptPriority)2; skillDefInfo.baseRechargeInterval = 16f; skillDefInfo.baseMaxStock = 1; skillDefInfo.rechargeStock = 1; skillDefInfo.requiredStock = 1; skillDefInfo.stockToConsume = 1; skillDefInfo.resetCooldownTimerOnUse = false; skillDefInfo.fullRestockOnAssign = true; skillDefInfo.dontAllowPastMaxStocks = false; skillDefInfo.mustKeyPress = true; skillDefInfo.beginSkillCooldownOnSkillEnd = false; skillDefInfo.isCombatSkill = true; skillDefInfo.canceledFromSprinting = false; skillDefInfo.cancelSprintingOnActivation = false; skillDefInfo.forceSprintDuringState = false; SkillDef val = Skills.CreateSkillDef(skillDefInfo); Skills.AddSpecialSkills(bodyPrefab, val); } public override void InitializeSkins() { ModelSkinController val = ((Component)prefabCharacterModel).gameObject.AddComponent<ModelSkinController>(); ChildLocator component = ((Component)prefabCharacterModel).GetComponent<ChildLocator>(); RendererInfo[] baseRendererInfos = prefabCharacterModel.baseRendererInfos; List<SkinDef> list = new List<SkinDef>(); SkinDef val2 = Skins.CreateSkinDef("DEFAULT_SKIN", assetBundle.LoadAsset<Sprite>("texDefaultSkin"), baseRendererInfos, ((Component)prefabCharacterModel).gameObject); val2.meshReplacements = Skins.getMeshReplacements(assetBundle, baseRendererInfos, "meshBody", "meshHair", "meshHorns", "meshLambMask", "meshTrinket", "meshPack", "meshBow"); list.Add(val2); val.skins = list.ToArray(); } public override void InitializeCharacterMaster() { SpiritboundAI.Init(bodyPrefab, masterName); } private void AddHooks() { //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 //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Expected O, but got Unknown HUD.onHudTargetChangedGlobal += HUDSetup; LoadoutPanelController.Rebuild += new hook_Rebuild(LoadoutPanelController_Rebuild); HealthComponent.TakeDamage += new hook_TakeDamage(HealthComponent_TakeDamage); GlobalEventManager.onCharacterDeathGlobal += GlobalEventManager_onCharacterDeathGlobal; CharacterBody.RecalculateStats += new hook_RecalculateStats(CharacterBody_RecalculateStats); if (SpiritboundPlugin.emotesInstalled) { Emotes(); } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] private static void Emotes() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown object obj = <>c.<>9__61_0; if (obj == null) { hook_Init val = delegate(orig_Init orig) { orig.Invoke(); GameObject val2 = SpiritboundAssets.mainAssetBundle.LoadAsset<GameObject>("spiritbound_emoteskeleton"); CustomEmotesAPI.ImportArmature(characterPrefab, val2, 0, true); }; <>c.<>9__61_0 = val; obj = (object)val; } SurvivorCatalog.Init += (hook_Init)obj; } private static void LoadoutPanelController_Rebuild(orig_Rebuild orig, LoadoutPanelController self) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self); if (self.currentDisplayData.bodyIndex != BodyCatalog.FindBodyIndex("SpiritboundBody")) { return; } LanguageTextMeshController[] componentsInChildren = ((Component)self).gameObject.GetComponentsInChildren<LanguageTextMeshController>(); foreach (LanguageTextMeshController val in componentsInChildren) { if (Object.op_Implicit((Object)(object)val) && val.token == "LOADOUT_SKILL_MISC") { val.token = "Passive"; } } } private void CharacterBody_RecalculateStats(orig_RecalculateStats orig, CharacterBody self) { orig.Invoke(self); if (Object.op_Implicit((Object)(object)self) && self.baseNameToken == "KENKO_SPIRITBOUND_NAME" && self.HasBuff(SpiritboundBuffs.spiritMovespeedStacksBuff)) { self.moveSpeed += (float)self.GetBuffCount(SpiritboundBuffs.spiritMovespeedStacksBuff); } } private void HealthComponent_TakeDamage(orig_TakeDamage orig, HealthComponent self, DamageInfo damageInfo) { //IL_00ba: Unknown result type (might be due to invalid IL or missing references) if ((NetworkServer.active && self.alive) || !self.godMode || self.ospTimer <= 0f) { CharacterBody body = self.body; CharacterBody val = null; if (Object.op_Implicit((Object)(object)damageInfo.attacker)) { val = damageInfo.attacker.GetComponent<CharacterBody>(); } if (damageInfo.damage > 0f && !damageInfo.rejected && Object.op_Implicit((Object)(object)body) && Object.op_Implicit((Object)(object)val) && val.baseNameToken == "KENKO_SPIRIT_NAME") { SpiritController component = ((Component)val).GetComponent<SpiritController>(); if (Object.op_Implicit((Object)(object)component) && Object.op_Implicit((Object)(object)body) && DamageAPI.HasModdedDamageType(damageInfo, DamageTypes.CurrentHealthSpirit)) { damageInfo.damage += body.healthComponent.health * (SpiritboundStaticValues.currentHPDamage + (float)component.owner.GetComponent<CharacterBody>().GetBuffCount(SpiritboundBuffs.soulStacksBuff) * SpiritboundStaticValues.currentHpStacking); } } } orig.Invoke(self, damageInfo); } private static void GlobalEventManager_onCharacterDeathGlobal(DamageReport damageReport) { //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Unknown result type (might be due to invalid IL or missing references) CharacterBody attackerBody = damageReport.attackerBody; if (NetworkServer.active && Object.op_Implicit((Object)(object)attackerBody) && Object.op_Implicit((Object)(object)damageReport.victim) && (damageReport.victim.body.isBoss || damageReport.victim.body.isChampion)) { if (attackerBody.baseNameToken == "KENKO_SPIRITBOUND_NAME") { StackOrb stackOrb = new StackOrb(); ((Orb)stackOrb).origin = ((Component)damageReport.victim).transform.position; ((Orb)stackOrb).target = Util.FindBodyMainHurtBox(attackerBody); OrbManager.instance.AddOrb((Orb)(object)stackOrb); } else if (attackerBody.baseNameToken == "KENKO_SPIRIT_NAME") { StackOrb stackOrb2 = new StackOrb(); ((Orb)stackOrb2).origin = ((Component)damageReport.victim).transform.position; ((Orb)stackOrb2).target = Util.FindBodyMainHurtBox(((Component)attackerBody).GetComponent<SpiritController>().owner); OrbManager.instance.AddOrb((Orb)(object)stackOrb2); } } } private static void HUDSetup(HUD hud) { //IL_01be: Unknown result type (might be due to invalid IL or missing references) //IL_01e2: Unknown result type (might be due to invalid IL or missing references) //IL_01f9: Unknown result type (might be due to invalid IL or missing references) //IL_0210: Unknown result type (might be due to invalid IL or missing references) //IL_0227: Unknown result type (might be due to invalid IL or missing references) //IL_023e: Unknown result type (might be due to invalid IL or missing references) //IL_0255: Unknown result type (might be due to invalid IL or missing references) //IL_026c: Unknown result type (might be due to invalid IL or missing references) //IL_0288: Unknown result type (might be due to invalid IL or missing references) //IL_030b: Unknown result type (might be due to invalid IL or missing references) //IL_0322: Unknown result type (might be due to invalid IL or missing references) //IL_0339: Unknown result type (might be due to invalid IL or missing references) //IL_0350: Unknown result type (might be due to invalid IL or missing references) //IL_0367: Unknown result type (might be due to invalid IL or missing references) //IL_0383: Unknown result type (might be due to invalid IL or missing references) //IL_039f: Unknown result type (might be due to invalid IL or missing references) //IL_03a4: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)hud.targetBodyObject) && Object.op_Implicit((Object)(object)hud.targetMaster) && (Object)(object)hud.targetMaster.bodyPrefab == (Object)(object)characterPrefab && ((NetworkBehaviour)hud.targetMaster).hasAuthority) { Transform parent = ((Component)hud.equipmentIcons[0]).gameObject.transform.parent; Transform val = ((Component)hud).transform.Find("MainContainer").Find("MainUIArea").Find("SpringCanvas") .Find("BottomLeftCluster") .Find("BarRoots") .Find("LevelDisplayCluster"); GameObject val2 = Object.Instantiate<GameObject>(((Component)val).gameObject, ((Component)hud).transform.Find("MainContainer").Find("MainUIArea").Find("SpringCanvas") .Find("BottomLeftCluster")); ((Object)val2).name = "HealthTracker"; val2.transform.SetParent(((Component)hud).transform.Find("MainContainer").Find("MainUIArea").Find("CrosshairCanvas") .Find("CrosshairExtras")); Object.DestroyImmediate((Object)(object)((Component)val2.transform.GetChild(0)).gameObject); Object.Destroy((Object)(object)val2.GetComponentInChildren<LevelText>()); Object.Destroy((Object)(object)val2.GetComponentInChildren<ExpBar>()); ((Component)val2.transform.Find("LevelDisplayRoot").Find("ValueText")).gameObject.SetActive(false); Object.DestroyImmediate((Object)(object)((Component)val2.transform.Find("ExpBarRoot")).gameObject); ((Component)val2.transform.Find("LevelDisplayRoot")).GetComponent<RectTransform>().anchoredPosition = new Vector2(-12f, 0f); RectTransform component = val2.GetComponent<RectTransform>(); ((Transform)component).localScale = new Vector3(0.8f, 0.8f, 1f); component.anchorMin = new Vector2(0f, 0f); component.anchorMax = new Vector2(0f, 0f); component.offsetMin = new Vector2(120f, -40f); component.offsetMax = new Vector2(120f, -40f); component.pivot = new Vector2(0.5f, 0f); component.anchoredPosition = new Vector2(50f, 0f); ((Transform)component).localPosition = new Vector3(120f, -40f, 0f); GameObject val3 = Object.Instantiate<GameObject>(SpiritboundAssets.mainAssetBundle.LoadAsset<GameObject>("WeaponChargeBar")); ((Object)val3).name = "SpiritShieldMeter"; val3.transform.SetParent(((Component)hud).transform.Find("MainContainer").Find("MainUIArea").Find("CrosshairCanvas") .Find("CrosshairExtras")); component = val3.GetComponent<RectTransform>(); ((Transform)component).localScale = new Vector3(0.75f, 0.1f, 1f); component.anchorMin = new Vector2(100f, 2f); component.anchorMax = new Vector2(100f, 2f); component.pivot = new Vector2(0.5f, 0f); component.anchoredPosition = new Vector2(100f, 2f); ((Transform)component).localPosition = new Vector3(100f, 2f, 0f); ((Transform)component).rotation = Quaternion.Euler(new Vector3(0f, 0f, 90f)); PassiveHealHudController passiveHealHudController = val2.AddComponent<PassiveHealHudController>(); passiveHealHudController.targetHUD = hud; passiveHealHudController.targetText = ((Component)val2.transform.Find("LevelDisplayRoot").Find("PrefixText")).gameObject.GetComponent<LanguageTextMeshController>(); passiveHealHudController.durationDisplay = val3; passiveHealHudController.durationBar = ((Component)val3.transform.GetChild(1)).gameObject.GetComponent<Image>(); passiveHealHudController.durationBarColor = ((Component)val3.transform.GetChild(0)).gameObject.GetComponent<Image>(); } } } public class SpiritCharacter : CharacterBase<SpiritCharacter> { public const string SPIRIT_PREFIX = "KENKO_SPIRIT_"; internal static GameObject characterPrefab; internal static List<string> attackDrivers = new List<string>(); internal static List<string> spiritItemBlackList = new List<string> { "FreeChest", "TreasureCache", "TreasureCacheVoid", "AutoCastEquipment", "ExtraLife", "ExtraLifeVoid", "DroneWeapons" }; public override string assetBundleName => "spiritbound"; public override string bodyName => "SpiritBody"; public override string modelPrefabName => "mdlSpirit"; public override BodyInfo bodyInfo => new BodyInfo { bodyNameToClone = "FlameDrone", bodyName = bodyName, bodyNameToken = "KENKO_SPIRIT_NAME", crosshair = Assets.LoadCrosshair("Standard"), subtitleNameToken = "KENKO_SPIRIT_SUBTITLE", characterPortrait = assetBundle.LoadAsset<Texture>("texWolfIcon"), maxHealth = 100f, healthGrowth = 30.000002f, healthRegen = 1f, armor = 0f, moveSpeed = 10f, acceleration = 150f }; public override CustomRendererInfo[] customRendererInfos => new CustomRendererInfo[3] { new CustomRendererInfo { childName = "Model", material = SpiritboundAssets.spiritBodyMat }, new CustomRendererInfo { childName = "FurModel", material = SpiritboundAssets.spiritFurMat }, new CustomRendererInfo { childName = "MaskModel", material = SpiritboundAssets.spiritBodyMat } }; public override ItemDisplaysBase itemDisplays => new SpiritItemDisplays(); public override AssetBundle assetBundle { get; protected set; } public override GameObject bodyPrefab { get; protected set; } public override CharacterBody prefabCharacterBody { get; protected set; } public override GameObject characterModelObject { get; protected set; } public override CharacterModel prefabCharacterModel { get; protected set; } public override void InitializeCharacter() { InitializeCharacterBodyPrefab(); InitializeCharacterMaster(); InitializeEntityStateMachines(); InitializeSkills(); AddHitboxes(); InitializeSkins(); AdditionalBodySetup(); characterPrefab = bodyPrefab; } private void AdditionalBodySetup() { bodyPrefab.AddComponent<SpiritController>(); } public void AddHitboxes() { Prefabs.SetupHitBoxGroup(characterModelObject, "MeleeHitbox", "MeleeHitbox"); } public override void InitializeEntityStateMachines() { Prefabs.ClearEntityStateMachines(bodyPrefab); Prefabs.AddMainEntityStateMachine(bodyPrefab, "Body", typeof(SpiritMainState), typeof(SpawnTeleporterState)); Prefabs.AddEntityStateMachine(bodyPrefab, "Weapon"); Prefabs.AddEntityStateMachine(bodyPrefab, "Weapon2"); AkEvent[] components = bodyPrefab.GetComponents<AkEvent>(); foreach (AkEvent val in components) { Object.DestroyImmediate((Object)(object)val); } } public override void InitializeCharacterMaster() { //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) GameObject val = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Drones/FlameDroneMaster.prefab").WaitForCompletion(), "SpiritMaster"); CharacterMaster component = val.GetComponent<CharacterMaster>(); component.bodyPrefab = bodyPrefab; BaseAI component2 = val.GetComponent<BaseAI>(); component2.aimVectorMaxSpeed = 5000f; component2.aimVectorDampTime = 0.01f; AddSkillDrivers(val); SpiritboundMod.Modules.Content.AddMasterPrefab(val); SpiritMasterComponent.summonPrefab = val; } private void AddSkillDrivers(GameObject masterPrefab) { //IL_0042: 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_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Unknown result type (might be due to invalid IL or missing references) //IL_0184: Unknown result type (might be due to invalid IL or missing references) //IL_018b: Unknown result type (might be due to invalid IL or missing references) //IL_0192: Unknown result type (might be due to invalid IL or missing references) //IL_01ab: 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) //IL_025a: Unknown result type (might be due to invalid IL or missing references) //IL_0261: Unknown result type (might be due to invalid IL or missing references) //IL_0268: Unknown result type (might be due to invalid IL or missing references) //IL_0281: Unknown result type (might be due to invalid IL or missing references) //IL_02c4: Unknown result type (might be due to invalid IL or missing references) //IL_0330: Unknown result type (might be due to invalid IL or missing references) //IL_0337: Unknown result type (might be due to invalid IL or missing references) //IL_033e: Unknown result type (might be due to invalid IL or missing references) //IL_0357: Unknown result type (might be due to invalid IL or missing references) //IL_039d: Unknown result type (might be due to invalid IL or missing references) //IL_0415: Unknown result type (might be due to invalid IL or missing references) //IL_041d: Unknown result type (might be due to invalid IL or missing references) //IL_0425: Unknown result type (might be due to invalid IL or missing references) //IL_0441: Unknown result type (might be due to invalid IL or missing references) //IL_0491: Unknown result type (might be due to invalid IL or missing references) //IL_0509: Unknown result type (might be due to invalid IL or missing references) //IL_0511: Unknown result type (might be due to invalid IL or missing references) //IL_0519: Unknown result type (might be due to invalid IL or missing references) //IL_0535: Unknown result type (might be due to invalid IL or missing references) //IL_057d: Unknown result type (might be due to invalid IL or missing references) //IL_0585: Unknown result type (might be due to invalid IL or missing references) //IL_05cd: Unknown result type (might be due to invalid IL or missing references) //IL_0605: Unknown result type (might be due to invalid IL or missing references) //IL_063d: Unknown result type (might be due to invalid IL or missing references) //IL_0659: Unknown result type (might be due to invalid IL or missing references) //IL_0661: Unknown result type (might be due to invalid IL or missing references) //IL_06a9: Unknown result type (might be due to invalid IL or missing references) //IL_06e1: Unknown result type (might be due to invalid IL or missing references) //IL_0719: Unknown result type (might be due to invalid IL or missing references) //IL_0735: Unknown result type (might be due to invalid IL or missing references) //IL_073d: Unknown result type (might be due to invalid IL or missing references) //IL_0785: Unknown result type (might be due to invalid IL or missing references) //IL_07bd: Unknown result type (might be due to invalid IL or missing references) //IL_07f5: Unknown result type (might be due to invalid IL or missing references) AISkillDriver[] componentsInChildren = masterPrefab.GetComponentsInChildren<AISkillDriver>(); foreach (AISkillDriver val in componentsInChildren) { Object.DestroyImmediate((Object)(object)val); } AISkillDriver val2 = masterPrefab.AddComponent<AISkillDriver>(); val2.customName = "BiteOffNodeGraph"; val2.skillSlot = (SkillSlot)0; val2.requireSkillReady = true; val2.minUserHealthFraction = float.NegativeInfinity; val2.maxUserHealthFraction = float.PositiveInfinity; val2.minTargetHealthFraction = float.NegativeInfinity; val2.maxTargetHealthFraction = float.PositiveInfinity; val2.minDistance = 0f; val2.maxDistance = 5f; val2.activationRequiresAimConfirmation = false; val2.activationRequiresTargetLoS = false; val2.selectionRequiresTargetLoS = true; val2.maxTimesSelected = -1; val2.moveTargetType = (TargetType)0; val2.movementType = (MovementType)1; val2.aimType = (AimType)1; val2.moveInputScale = 1f; val2.ignoreNodeGraph = true; val2.buttonPressType = (ButtonPressType)0; if (!attackDrivers.Contains(val2.customName)) { attackDrivers.Add(val2.customName); } AISkillDriver val3 = masterPrefab.AddComponent<AISkillDriver>(); val3.customName = "FireWisps"; val3.skillSlot = (SkillSlot)1; val3.requireSkillReady = true; val3.minUserHealthFraction = float.NegativeInfinity; val3.maxUserHealthFraction = float.PositiveInfinity; val3.minTargetHealthFraction = float.NegativeInfinity; val3.maxTargetHealthFraction = float.PositiveInfinity; val3.minDistance = 0f; val3.maxDistance = 20f; val3.activationRequiresAimConfirmation = true; val3.activationRequiresTargetLoS = true; val3.selectionRequiresTargetLoS = true; val3.maxTimesSelected = -1; val3.moveTargetType = (TargetType)0; val3.movementType = (MovementType)1; val3.aimType = (AimType)1; val3.moveInputScale = 1f; val3.ignoreNodeGraph = false; val3.buttonPressType = (ButtonPressType)0; if (!attackDrivers.Contains(val3.customName)) { attackDrivers.Add(val3.customName); } AISkillDriver val4 = masterPrefab.AddComponent<AISkillDriver>(); val4.customName = "StrafeNearTarget"; val4.skillSlot = (SkillSlot)(-1); val4.requireSkillReady = true; val4.minUserHealthFraction = float.NegativeInfinity; val4.maxUserHealthFraction = float.PositiveInfinity; val4.minTargetHealthFraction = float.NegativeInfinity; val4.maxTargetHealthFraction = float.PositiveInfinity; val4.minDistance = 0f; val4.maxDistance = 5f; val4.activationRequiresAimConfirmation = false; val4.activationRequiresTargetLoS = false; val4.selectionRequiresTargetLoS = true; val4.maxTimesSelected = -1; val4.moveTargetType = (TargetType)0; val4.movementType = (MovementType)2; val4.aimType = (AimType)1; val4.moveInputScale = 1f; val4.ignoreNodeGraph = true; val4.buttonPressType = (ButtonPressType)0; if (!attackDrivers.Contains(val4.customName)) { attackDrivers.Add(val4.customName); } AISkillDriver val5 = masterPrefab.AddComponent<AISkillDriver>(); val5.customName = "ChaseTargetClose"; val5.skillSlot = (SkillSlot)(-1); val5.requireSkillReady = true; val5.minUserHealthFraction = float.NegativeInfinity; val5.maxUserHealthFraction = float.PositiveInfinity; val5.minTargetHealthFraction = float.NegativeInfinity; val5.maxTargetHealthFraction = float.PositiveInfinity; val5.minDistance = 0f; val5.maxDistance = 10f; val5.activationRequiresAimConfirmation = false; val5.activationRequiresTargetLoS = false; val5.selectionRequiresTargetLoS = true; val5.maxTimesSelected = -1; val5.moveTargetType = (TargetType)0; val5.movementType = (MovementType)1; val5.aimType = (AimType)1; val5.moveInputScale = 1f; val5.ignoreNodeGraph = true; val5.buttonPressType = (ButtonPressType)0; if (!attackDrivers.Contains(val5.customName)) { attackDrivers.Add(val5.customName); } AISkillDriver val6 = masterPrefab.AddComponent<AISkillDriver>(); val6.customName = "ChaseFromAfar"; val6.skillSlot = (SkillSlot)(-1); val6.requireSkillReady = true; val6.minUserHealthFraction = float.NegativeInfinity; val6.maxUserHealthFraction = float.PositiveInfinity; val6.minTargetHealthFraction = float.NegativeInfinity; val6.maxTargetHealthFraction = float.PositiveInfinity; val6.minDistance = 0f; val6.maxDistance = float.PositiveInfinity; val6.activationRequiresAimConfirmation = false; val6.activationRequiresTargetLoS = false; val6.selectionRequiresTargetLoS = false; val6.maxTimesSelected = -1; val6.moveTargetType = (TargetType)0; val6.movementType = (MovementType)1; val6.aimType = (AimType)1; val6.moveInputScale = 1f; val6.ignoreNodeGraph = false; val6.buttonPressType = (ButtonPressType)0; val6.shouldSprint = true; if (!attackDrivers.Contains(val6.customName)) { attackDrivers.Add(val6.customName); } AISkillDriver val7 = masterPrefab.AddComponent<AISkillDriver>(); val7.customName = "DoNothing"; val7.skillSlot = (SkillSlot)(-1); val7.requireSkillReady = true; val7.minUserHealthFraction = float.NegativeInfinity; val7.maxUserHealthFraction = float.PositiveInfinity; val7.minTargetHealthFraction = float.NegativeInfinity; val7.maxTargetHealthFraction = float.PositiveInfinity; val7.minDistance = 0f; val7.maxDistance = float.PositiveInfinity; val7.activationRequiresAimConfirmation = false; val7.activationRequiresTargetLoS = false; val7.selectionRequiresTargetLoS = false; val7.maxTimesSelected = -1; val7.moveTargetType = (TargetType)0; val7.movementType = (MovementType)0; val7.aimType = (AimType)0; val7.moveInputScale = 1f; val7.ignoreNodeGraph = false; val7.buttonPressType = (ButtonPressType)0; if (!attackDrivers.Contains(val7.customName)) { attackDrivers.Add(val7.customName); } AISkillDriver val8 = masterPrefab.AddComponent<AISkillDriver>(); val8.customName = "HardLeashToLeader"; val8.movementType = (MovementType)1; val8.moveTargetType = (TargetType)2; val8.activationRequiresAimConfirmation = false; val8.activationRequiresTargetLoS = false; val8.selectionRequiresTargetLoS = false; val8.maxTimesSelected = -1; val8.maxDistance = float.PositiveInfinity; val8.minDistance = 120f; val8.requireSkillReady = false; val8.aimType = (AimType)3; val8.ignoreNodeGraph = false; val8.moveInputScale = 1f; val8.driverUpdateTimerOverride = -1f; val8.shouldSprint = true; val8.shouldFireEquipment = false; val8.buttonPressType = (ButtonPressType)0; val8.minTargetHealthFraction = float.NegativeInfinity; val8.maxTargetHealthFraction = float.PositiveInfinity; val8.minUserHealthFraction = float.NegativeInfinity; val8.maxUserHealthFraction = float.PositiveInfinity; val8.skillSlot = (SkillSlot)(-1); AISkillDriver val9 = masterPrefab.AddComponent<AISkillDriver>(); val9.customName = "SoftLeashToLeader"; val9.movementType = (MovementType)1; val9.moveTargetType = (TargetType)2; val9.activationRequiresAimConfirmation = false; val9.activationRequiresTargetLoS = false; val9.selectionRequiresTargetLoS = false; val9.maxTimesSelected = -1; val9.maxDistance = float.PositiveInfinity; val9.minDistance = 10f; val9.requireSkillReady = false; val9.aimType = (AimType)2; val9.ignoreNodeGraph = false; val9.moveInputScale = 1f; val9.driverUpdateTimerOverride = -1f; val9.shouldSprint = false; val9.shouldFireEquipment = false; val9.buttonPressType = (ButtonPressType)0; val9.minTargetHealthFraction = float.NegativeInfinity; val9.maxTargetHealthFraction = float.PositiveInfinity; val9.minUserHealthFraction = float.NegativeInfinity; val9.maxUserHealthFraction = float.PositiveInfinity; val9.skillSlot = (SkillSlot)(-1); AISkillDriver val10 = masterPrefab.AddComponent<AISkillDriver>(); val10.customName = "IdleNearLeader"; val10.movementType = (MovementType)0; val10.moveTargetType = (TargetType)2; val10.activationRequiresAimConfirmation = false; val10.activationRequiresTargetLoS = false; val10.selectionRequiresTargetLoS = false; val10.maxTimesSelected = -1; val10.maxDistance = float.PositiveInfinity; val10.minDistance = 0f; val10.requireSkillReady = false; val10.aimType = (AimType)2; val10.ignoreNodeGraph = false; val10.moveInputScale = 1f; val10.driverUpdateTimerOverride = -1f; val10.shouldSprint = false; val10.shouldFireEquipment = false; val10.buttonPressType = (ButtonPressType)0; val10.minTargetHealthFraction = float.NegativeInfinity; val10.maxTargetHealthFraction = float.PositiveInfinity; val10.minUserHealthFraction = float.NegativeInfinity; val10.maxUserHealthFraction = float.PositiveInfinity; val10.skillSlot = (SkillSlot)(-1); } public override void InitializeSkills() { bodyPrefab.AddComponent<SpiritboundPassive>(); Skills.CreateSkillFamilies(bodyPrefab); AddPassiveSkills(); AddPrimarySkills(); AddSecondarySkills(); AddUtilitySkills(); AddSpecialSkills(); } private void AddPassiveSkills() { //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) SpiritboundPassive component = bodyPrefab.GetComponent<SpiritboundPassive>(); SkillLocator component2 = bodyPrefab.GetComponent<SkillLocator>(); component2.passiveSkill.enabled = false; component.spiritboundPassive = Skills.CreateSkillDef(new SkillDefInfo { skillName = "KENKO_SPIRIT_PASSIVE_NAME", skillNameToken = "KENKO_SPIRIT_PASSIVE_NAME", skillDescriptionToken = "KENKO_SPIRIT_PASSIVE_DESCRIPTION", skillIcon = assetBundle.LoadAsset<Sprite>("texDefaultSkin"), keywordTokens = new string[0], activationState = new SerializableEntityStateType(typeof(Idle)), activationStateMachineName = "", baseMaxStock = 1, baseRechargeInterval = 0f, beginSkillCooldownOnSkillEnd = false, canceledFromSprinting = false, forceSprintDuringState = false, fullRestockOnAssign = true, interruptPriority = (InterruptPriority)0, resetCooldownTimerOnUse = false, isCombatSkill = false, mustKeyPress = false, cancelSprintingOnActivation = false, rechargeStock = 1, requiredStock = 2, stockToConsume = 1 }); Skills.AddPassiveSkills(component.passiveSkillSlot.skillFamily, component.spiritboundPassive); } private void AddPrimarySkills() { //IL_002a: Unknown result type (might be due to invalid IL or missing references) SteppedSkillDef val = Skills.CreateSkillDef<SteppedSkillDef>(new SkillDefInfo("Bite", "KENKO_SPIRIT_PRIMARY_BITE_NAME", "KENKO_SPIRIT_PRIMARY_BITE_DESCRIPTION", assetBundle.LoadAsset<Sprite>("texSpiritBiteIcon"), new SerializableEntityStateType(typeof(SpiritBite)))); val.stepCount = 1; val.stepGraceDuration = 0.1f; Skills.AddPrimarySkills(bodyPrefab, (SkillDef)val); } private void AddSecondarySkills() { //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) SkillDefInfo skillDefInfo = new SkillDefInfo(); skillDefInfo.skillName = "Fire Orb"; skillDefInfo.skillNameToken = "KENKO_SPIRIT_SECONDARY_ORB_NAME"; skillDefInfo.skillDescriptionToken = "KENKO_SPIRIT_SECONDARY_ORB_DESCRIPTION"; skillDefInfo.keywordTokens = new string[0]; skillDefInfo.skillIcon = assetBundle.LoadAsset<Sprite>("texSpiritOrbIcon"); skillDefInfo.activationState = new SerializableEntityStateType(typeof(SpiritBarrage)); skillDefInfo.activationStateMachineName = "Weapon2"; skillDefInfo.interruptPriority = (InterruptPriority)2; skillDefInfo.baseMaxStock = 1; skillDefInfo.baseRechargeInterval = 3f; skillDefInfo.rechargeStock = 1; skillDefInfo.requiredStock = 1; skillDefInfo.stockToConsume = 1; skillDefInfo.resetCooldownTimerOnUse = false; skillDefInfo.fullRestockOnAssign = true; skillDefInfo.dontAllowPastMaxStocks = false; skillDefInfo.beginSkillCooldownOnSkillEnd = true; skillDefInfo.mustKeyPress = false; skillDefInfo.isCombatSkill = true; skillDefInfo.canceledFromSprinting = false; skillDefInfo.cancelSprintingOnActivation = false; skillDefInfo.forceSprintDuringState = false; SkillDef val = Skills.CreateSkillDef(skillDefInfo); Skills.AddSecondarySkills(bodyPrefab, val); } private void AddUtilitySkills() { //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) SkillDefInfo skillDefInfo = new SkillDefInfo(); skillDefInfo.skillName = "Idle"; skillDefInfo.skillNameToken = "KENKO_SPIRIT_IDLE_NAME"; skillDefInfo.skillDescriptionToken = "KENKO_SPIRIT_IDLE_DESCRIPTION"; skillDefInfo.keywordTokens = new string[0]; skillDefInfo.skillIcon = assetBundle.LoadAsset<Sprite>("texFalsifyIcon"); skillDefInfo.activationState = new SerializableEntityStateType(typeof(SpiritMainState)); skillDefInfo.activationStateMachineName = "Weapon"; skillDefInfo.interruptPriority = (InterruptPriority)1; skillDefInfo.baseRechargeInterval = 6f; skillDefInfo.baseMaxStock = 1; skillDefInfo.rechargeStock = 1; skillDefInfo.requiredStock = 1; skillDefInfo.stockToConsume = 1; skillDefInfo.resetCooldownTimerOnUse = false; skillDefInfo.fullRestockOnAssign = true; skillDefInfo.dontAllowPastMaxStocks = false; skillDefInfo.mustKeyPress = false; skillDefInfo.beginSkillCooldownOnSkillEnd = false; skillDefInfo.isCombatSkill = false; skillDefInfo.canceledFromSprinting = false; skillDefInfo.cancelSprintingOnActivation = false; skillDefInfo.forceSprintDuringState = true; SkillDef val = Skills.CreateSkillDef(skillDefInfo); Skills.AddUtilitySkills(bodyPrefab, val); } private void AddSpecialSkills() { //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) SkillDefInfo skillDefInfo = new SkillDefInfo(); skillDefInfo.skillName = "Idle"; skillDefInfo.skillNameToken = "KENKO_SPIRIT_IDLE_NAME"; skillDefInfo.skillDescriptionToken = "KENKO_SPIRIT_IDLE_DESCRIPTION"; skillDefInfo.keywordTokens = new string[0]; skillDefInfo.skillIcon = assetBundle.LoadAsset<Sprite>("texFalsifyIcon"); skillDefInfo.activationState = new SerializableEntityStateType(typeof(SpiritMainState)); skillDefInfo.activationStateMachineName = "Weapon"; skillDefInfo.interruptPriority = (InterruptPriority)1; skillDefInfo.baseRechargeInterval = 6f; skillDefInfo.baseMaxStock = 1; skillDefInfo.rechargeStock = 1; skillDefInfo.requiredStock = 1; skillDefInfo.stockToConsume = 1; skillDefInfo.resetCooldownTimerOnUse = false; skillDefInfo.fullRestockOnAssign = true; skillDefInfo.dontAllowPastMaxStocks = false; skillDefInfo.mustKeyPress = false; skillDefInfo.beginSkillCooldownOnSkillEnd = false; skillDefInfo.isCombatSkill = false; skillDefInfo.canceledFromSprinting = false; skillDefInfo.cancelSprintingOnActivation = false; skillDefInfo.forceSprintDuringState = true; SkillDef val = Skills.CreateSkillDef(skillDefInfo); Skills.AddSpecialSkills(bodyPrefab, val); } public override void InitializeSkins() { ModelSkinController val = ((Component)prefabCharacterModel).gameObject.AddComponent<ModelSkinController>(); ChildLocator component = ((Component)prefabCharacterModel).GetComponent<ChildLocator>(); RendererInfo[] baseRendererInfos = prefabCharacterModel.baseRendererInfos; List<SkinDef> list = new List<SkinDef>(); SkinDef val2 = Skins.CreateSkinDef("DEFAULT_SKIN", assetBundle.LoadAsset<Sprite>("texDefaultSkin"), baseRendererInfos, ((Component)prefabCharacterModel).gameObject); val2.meshReplacements = Skins.getMeshReplacements(assetBundle, baseRendererInfos, "meshSpiritBody", "meshFur", "meshSpiritMask"); list.Add(val2); val.skins = list.ToArray(); } } } namespace SpiritboundMod.Spiritbound.SkillStates { public class ChargeArrow : BaseSpiritboundSkillState { private GameObject chargeEffectPrefab = SpiritboundAssets.chargeEffect; private GameObject chargeFullEffectPrefab = SpiritboundAssets.fullChargeEffect; private GameObject muzzleFlashEffectPrefab = SpiritboundAssets.arrowMuzzleFlashEffect; private GameObject arrowPrefab = SpiritboundAssets.arrowPrefab; private GameObject arrowChargedPrefab = SpiritboundAssets.chargedArrowPrefab; public static float baseChargeDuration = 1f; public static float baseMaxChargeDuration = 2f; public static float minBloomRadius = 0f; public static float maxBloomRadius = 0.5f; public static float minChargeDuration = 0.3f; public static string muzzleName = "BowMuzzle"; public static float fullChargeAnimationDuration = 0.34f; public float chargeDuration; public float maxChargeDuration; public Animator animator; public Transform muzzleTransform; public GameObject chargeEffectInstance; public uint loopSoundInstanceId; public bool playedFullChargeEffects = false; public override void OnEnter() { //IL_00de: 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) base.OnEnter(); chargeDuration = baseChargeDuration / ((BaseState)this).attackSpeedStat; maxChargeDuration = baseMaxChargeDuration / ((BaseState)this).attackSpeedStat; if (NetworkServer.active && ((EntityState)this).characterBody.GetBuffCount(SpiritboundBuffs.quickShotBuff) > 0) { chargeDuration /= 2f; maxChargeDuration = chargeDuration; } animator = ((EntityState)this).GetModelAnimator(); ChildLocator modelChildLocator = ((EntityState)this).GetModelChildLocator(); if (Object.op_Implicit((Object)(object)modelChildLocator)) { muzzleTransform = modelChildLocator.FindChild(muzzleName) ?? ((EntityState)this).characterBody.coreTransform; if (Object.op_Implicit((Object)(object)muzzleTransform) && Object.op_Implicit((Object)(object)chargeEffectPrefab)) { chargeEffectInstance = Object.Instantiate<GameObject>(chargeEffectPrefab, muzzleTransform.position, muzzleTransform.rotation); chargeEffectInstance.transform.parent = muzzleTransform; ScaleParticleSystemDuration component = chargeEffectInstance.GetComponent<ScaleParticleSystemDuration>(); if (Object.op_Implicit((Object)(object)component)) { component.newDuration = chargeDuration; } ObjectScaleCurve component2 = chargeEffectInstance.GetComponent<ObjectScaleCurve>(); if (Object.op_Implicit((Object)(object)component2)) { component2.timeMax = chargeDuration; } } } Util.PlayAttackSpeedSound("Play_MULT_m1_snipe_charge", ((EntityState)this).gameObject, ((BaseState)this).attackSpeedStat); ((EntityState)this).PlayAnimation("Gesture, Override", "ChargeArrow"); } public float CalcCharge() { return Mathf.Clamp01(((EntityState)this).fixedAge / chargeDuration); } public override void Update() { ((EntityState)this).Update(); ((EntityState)this).characterBody.SetAimTimer(1f); ((EntityState)this).characterBody.SetSpreadBloom(((EntityState)this).age / chargeDuration, true); } public override void FixedUpdate() { base.FixedUpdate(); float num = CalcCharge(); if (!playedFullChargeEffects && num >= 1f) { playedFullChargeEffects = true; PlayFullChargeEffects(); } if (((EntityState)this).isAuthority && (!((BaseSkillState)this).IsKeyDownAuthority() || ((EntityState)this).fixedAge >= maxChargeDuration) && ((EntityState)this).fixedAge >= minChargeDuration) { ((EntityState)this).outer.SetNextStateToMain(); } } public void PlayFullChargeEffects() { //IL_004d: 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) AkSoundEngine.StopPlayingID(loopSoundInstanceId); if (Object.op_Implicit((Object)(object)chargeEffectInstance)) { EntityState.Destroy((Object)(object)chargeEffectInstance); } EffectManager.SimpleMuzzleFlash(muzzleFlashEffectPrefab, ((EntityState)this).gameObject, muzzleName, false); chargeEffectInstance = Object.Instantiate<GameObject>(chargeFullEffectPrefab, muzzleTransform.position, muzzleTransform.rotation); chargeEffectInstance.transform.parent = muzzleTransform; loopSoundInstanceId = Util.PlaySound("Play_gravekeeper_attack1_fly_loop", ((EntityState)this).gameObject); } public void FireArrowAuthority() { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: 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_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: 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) //IL_015e: Unknown result type (might be due to invalid IL or missing references) //IL_01f4: Unknown result type (might be due to invalid IL or missing references) //IL_01f9: 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_0150: Unknown result type (might be due to invalid IL or missing references) //IL_0216: Unknown result type (might be due to invalid IL or missing references) //IL_020a: Unknown result type (might be due to invalid IL or missing references) //IL_020f: Unknown result type (might be due to invalid IL or missing references) //IL_0217: Unknown result type (might be due to invalid IL or missing references) //IL_0254: Unknown result type (might be due to invalid IL or missing references) //IL_0256: Unknown result type (might be due to invalid IL or missing references) //IL_025d: Unknown result type (might be due to invalid IL or missing references) float num = CalcCharge(); Ray aimRay = ((BaseState)this).GetAimRay(); Util.PlaySound("Play_huntress_m1_shoot", ((EntityState)this).gameObject); if (num >= 1f) { Util.PlaySound("Play_clayboss_m1_shoot", ((EntityState)this).gameObject); } Quaternion val = Util.QuaternionSafeLookRotation(((Ray)(ref aimRay)).direction); float num2 = Random.Range(0f, ((EntityState)this).characterBody.spreadBloomAngle); float num3 = Random.Range(0f, 360f); Vector3 val2 = Quaternion.Euler(0f, 0f, num3) * (Quaternion.Euler(num2, 0f, 0f) * Vector3.forward); float y = val2.y; val2.y = 0f; float num4 = (Mathf.Atan2(val2.z, val2.x) * 57.29578f - 90f) * 1f; float num5 = Mathf.Atan2(y, ((Vector3)(ref val2)).magnitude) * 57.29578f * 1f; arrowChargedPrefab.GetComponent<ModdedDamageTypeHolderComponent>().Add(DamageTypes.MountingDread); if (((EntityState)this).characterBody.HasBuff(SpiritboundBuffs.spiritHealBuff)) { arrowPrefab.GetComponent<ModdedDamageTypeHolderComponent>().Add(DamageTypes.Heal); arrowChargedPrefab.GetComponent<ModdedDamageTypeHolderComponent>().Add(DamageTypes.Heal); } FireProjectileInfo val3 = default(FireProjectileInfo); val3.damage = Util.Remap(num, 0f, 1f, SpiritboundStaticValues.arrowBaseDamageCoefficient, SpiritboundStaticValues.arrowFullDamageCoefficient) * ((BaseState)this).damageStat; val3.useSpeedOverride = true; ((FireProjectileInfo)(ref val3)).speedOverride = Util.Remap(num, 0f, 1f, 50f + (float)(((EntityState)this).characterBody.GetBuffCount(SpiritboundBuffs.soulStacksBuff) * 5), 150f + (float)(((EntityState)this).characterBody.GetBuffCount(SpiritboundBuffs.soulStacksBuff) * 5)); val3.crit = ((EntityState)this).characterBody.RollCrit(); val3.position = ((Ray)(ref aimRay)).origin; val3.rotation = ((num < 1f) ? val : Util.QuaternionSafeLookRotation(((Ray)(ref aimRay)).direction)); val3.owner = ((EntityState)this).gameObject; val3.force = 400f * num; val3.projectilePrefab = ((num < 1f) ? arrowPrefab : arrowChargedPrefab); FireProjectileInfo val4 = val3; ProjectileManager.instance.FireProjectile(val4); } public override void OnExit() { AkSoundEngine.StopPlayingID(loopSoundInstanceId); if (!((EntityState)this).outer.destroying) { ((EntityState)this).PlayAnimation("Gesture, Override", "FireArrow"); if (((EntityState)this).isAuthority) { FireArrowAuthority(); } } if (Object.op_Implicit((Object)(object)chargeEffectInstance)) { EntityState.Destroy((Object)(object)chargeEffectInstance); } if (NetworkServer.active && ((EntityState)this).characterBody.GetBuffCount(SpiritboundBuffs.quickShotBuff) > 0) { ((EntityState)this).characterBody.RemoveBuff(SpiritboundBuffs.quickShotBuff); } ((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; } } public class HopFire : BaseSpiritboundSkillState { private GameObject muzzleFlashEffect = SpiritboundAssets.arrowMuzzleFlashEffect; protected Vector3 hopVector; public float duration = 0.3f; public float speedCoefficient = 7f; public float orbDamageCoefficient = SpiritboundStaticValues.wispDamageCoefficient; private ChildLocator childLocator; protected AimRequest request; private bool fired = false; private bool isCrit; public override void OnEnter() { //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0089: 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_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_016e: 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_01d7: Unknown result type (might be due to invalid IL or missing references) //IL_01dc: Unknown result type (might be due to invalid IL or missing references) //IL_01de: Unknown result type (might be due to invalid IL or missing references) //IL_01e3: 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) //IL_0207: Unknown result type (might be due to invalid IL or missing references) //IL_0234: Unknown result type (might be due to invalid IL or missing references) //IL_0236: Unknown result type (might be due to invalid IL or missing references) //IL_021d: Unknown result type (might be due to invalid IL or missing references) //IL_0222: Unknown result type (might be due to invalid IL or missing references) //IL_0227: Unknown result type (might be due to invalid IL or missing references) RefreshState(); base.OnEnter(); ((EntityState)this).characterBody.SetAimTimer(2f); Transform modelTransform = ((EntityState)this).GetModelTransform(); if (Object.op_Implicit((Object)(object)modelTransform)) { childLocator = ((Component)modelTransform).GetComponent<ChildLocator>(); } if (Object.op_Implicit((Object)(object)((EntityState)this).cameraTargetParams)) { request = ((EntityState)this).cameraTargetParams.RequestAimType((AimType)2); } hopVector = GetHopVector(); ((EntityState)this).characterMotor.velocity = Vector3.zero; Vector3 aimDirection = ((EntityState)this).inputBank.aimDirection; aimDirection.y = 0f; if ((((EntityState)this).inputBank.aimDirection.y < 0f && Vector3.Angle(aimDirection, hopVector) <= 90f) || (((EntityState)this).inputBank.aimDirection.y > 0f && Vector3.Angle(aimDirection, hopVector) >= 90f)) { hopVector.y *= -1f; } if (Vector3.Angle(((EntityState)this).inputBank.aimDirection, aimDirection) <= 45f) { hopVector.y = 0.25f; } hopVector.y = Mathf.Clamp(hopVector.y, 0.1f, 0.75f); ((EntityState)this).characterDirection.moveVector = hopVector; ((EntityState)this).PlayCrossfade("FullBody, Override", "Dash", "Dash.playbackRate", duration * 1.5f, 0.05f); ((EntityState)this).PlayAnimation("Gesture, Override", "BufferEmpty"); if (Object.op_Implicit((Object)(object)BaseSlideState.slideEffectPrefab) && Object.op_Implicit((Object)(object)((EntityState)this).characterBody)) { Vector3 val = ((EntityState)this).characterBody.footPosition; Quaternion val2 = Quaternion.identity; Transform val3 = ((BaseState)this).FindModelChild("Base"); if (Object.op_Implicit((Object)(object)val3)) { val = val3.position; } if (Object.op_Implicit((Object)(object)((EntityState)this).characterDirection)) { val2 = Util.QuaternionSafeLookRotation(hopVector); } EffectManager.SimpleEffect(LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/FeatherEffect"), val, val2, true); } speedCoefficient = 0.3f * ((EntityState)this).characterBody.jumpPower * Mathf.Clamp(((EntityState)this).characterBody.moveSpeed / 4f, 5f, 20f); isCrit = Util.CheckRoll(((EntityState)this).characterBody.crit, ((EntityState)this).characterBody.master); if (NetworkServer.active) { ((EntityState)this).characterBody.AddBuff(Buffs.HiddenInvincibility); } Util.PlaySound("sfx_driver_dash", ((EntityState)this).gameObject); } protected virtual Vector3 GetHopVector() { //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_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_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_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_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_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_0081: Unknown result type (might be due to invalid IL or missing references) Vector3 aimDirection = ((EntityState)this).inputBank.aimDirection; aimDirection.y = 0f; Vector3 val = -Vector3.Cross(Vector3.up, aimDirection); float num = Vector3.Angle(((EntityState)this).inputBank.aimDirection, aimDirection); if (((EntityState)this).inputBank.aimDirection.y < 0f) { num = 0f - num; } return Vector3.Normalize(Quaternion.AngleAxis(num, val) * ((EntityState)this).inputBank.moveVector); } public override void FixedUpdate() { //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) base.FixedUpdate(); if (((EntityState)this).fixedAge >= duration / 2f && !fired) { fired = true; Fire(); EntityStateMachine.FindByCustomName(((EntityState)this).gameObject, "Weapon2").SetInterruptState((EntityState)(object)new SpiritBarrage(), (InterruptPriority)2); spiritMasterComponent.SpiritOrbOrder(); } if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor) && Object.op_Implicit((Object)(object)((EntityState)this).characterDirection) && ((EntityState)this).isAuthority) { ((BaseCharacterController)((EntityState)this).characterMotor).Motor.ForceUnground(); ((EntityState)this).characterMotor.velocity = hopVector * speedCoefficient; } if (((EntityState)this).fixedAge >= duration && ((EntityState)this).isAuthority) { ((EntityState)this).outer.SetNextStateToMain(); } } protected virtual GenericDamageOrb CreateArrowOrb() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown return (GenericDamageOrb)new HuntressArrowOrb(); } private void Fire() { //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_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) //IL_0024: 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_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) //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) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00da: 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_013f: Unknown result type (might be due to invalid IL or missing references) if (!NetworkServer.active) { return; } HurtBox[] hurtBoxes = new SphereSearch { origin = ((EntityState)this).transform.position, radius = 20f, mask = ((LayerIndex)(ref LayerIndex.entityPrecise)).mask }.RefreshCandidates().FilterCandidatesByHurtBoxTeam(TeamMask.GetEnemyTeams(((EntityState)this).characterBody.teamComponent.teamIndex)).OrderCandidatesByDistance() .FilterCandidatesByDistinctHurtBoxEntities() .GetHurtBoxes(); if (hurtBoxes.Length == 0) { return; } int num = Mathf.Clamp(hurtBoxes.Length, 1, 3 + ((EntityState)this).characterBody.GetBuffCount(SpiritboundBuffs.soulStacksBuff)); for (int i = 0; i < num; i++) { GenericDamageOrb val = CreateArrowOrb(); val.damageValue = ((EntityState)this).characterBody.damage * SpiritboundStaticValues.arrowBaseDamageCoefficient; val.isCrit = isCrit; val.teamIndex = TeamComponent.GetObjectTeam(((EntityState)this).gameObject); val.attacker = ((EntityState)this).gameObject; val.procCoefficient = 0.7f; HurtBox val2 = hurtBoxes[i]; if (Object.op_Implicit((Object)(object)val2)) { Transform val3 = childLocator.FindChild("BowMuzzle"); EffectManager.SimpleMuzzleFlash(muzzleFlashEffect, ((EntityState)this).gameObject, "BowMuzzle", true); ((Orb)val).origin = val3.position; ((Orb)val).target = val2; OrbManager.instance.AddOrb((Orb)(object)val); } } } public override void OnExit() { if (!fired) { Fire(); } if (!((EntityState)this).outer.destroying && Object.op_Implicit((Object)(object)((EntityState)this).cameraTargetParams)) { request.Dispose(); } ((EntityState)this).OnExit(); if (NetworkServer.active) { ((EntityState)this).characterBody.RemoveBuff(Buffs.HiddenInvincibility); for (int num = 5 - ((EntityState)this).characterBody.GetBuffCount(SpiritboundBuffs.quickShotBuff); num > 0; num--) { ((EntityState)this).characterBody.AddTimedBuff(SpiritboundBuffs.quickShotBuff, 4f); } } } 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)4; } } public class MainState : GenericCharacterMain { private Animator animator; public LocalUser localUser; public override void OnEnter() { ((GenericCharacterMain)this).OnEnter(); animator = ((BaseCharacterMain)this).modelAnimator; FindLocalUser(); } private void FindLocalUser() { if (localUser != null || !Object.op_Implicit((Object)(object)((EntityState)this).characterBody)) { return; } foreach (LocalUser readOnlyLocalUsers in LocalUserManager.readOnlyLocalUsersList) { if ((Object)(object)readOnlyLocalUsers.cachedBody == (Object)(object)((EntityState)this).characterBody) { localUser = readOnlyLocalUsers; break; } } } public override void FixedUpdate() { ((GenericCharacterMain)this).FixedUpdate(); if (Object.op_Implicit((Object)(object)animator)) { bool flag = false; if (!((EntityState)this).characterBody.outOfDanger || !((EntityState)this).characterBody.outOfCombat) { flag = true; } animator.SetBool("inCombat", flag); if (((BaseState)this).isGrounded) { animator.SetFloat("airBlend", 0f); } else { animator.SetFloat("airBlend", 1f); } } } public override void ProcessJump() { //IL_020e: Unknown result type (might be due to invalid IL or missing references) //IL_0213: Unknown result type (might be due to invalid IL or missing references) //IL_021a: Unknown result type (might be due to invalid IL or missing references) //IL_022b: Expected O, but got Unknown //IL_024e: Unknown result type (might be due to invalid IL or missing references) //IL_0253: Unknown result type (might be due to invalid IL or missing references) //IL_025a: Unknown result type (might be due to invalid IL or missing references) //IL_0265: Unknown result type (might be due to invalid IL or missing references) //IL_027c: Expected O, but got Unknown //IL_0290: Unknown result type (might be due to invalid IL or missing references) //IL_0295: Unknown result type (might be due to invalid IL or missing references) //IL_029c: Unknown result type (might be due to invalid IL or missing references) //IL_02a7: Unknown result type (might be due to invalid IL or missing references) //IL_02ae: Unknown result type (might be due to invalid IL or missing references) //IL_02b3: Unknown result type (might be due to invalid IL or missing references) //IL_02b8: Unknown result type (might be due to invalid IL or missing references) //IL_02c3: Expected O, but got Unknown if (!((BaseCharacterMain)this).hasCharacterMotor) { return; }