Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of ChirrAltSkills v0.0.2
ChirrAltSkills.dll
Decompiled 2 years agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using AncientScepter; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using ChirrAltSkills; using ChirrAltSkills.Chirr; using ChirrAltSkills.Chirr.SkillDefs; using ChirrAltSkills.Chirr.SkillDefs.Passive; using ChirrAltSkills.Chirr.SkillDefs.Special; using ChirrAltSkills.Chirr.SkillDefs.TargetableSkillDef; using ChirrAltSkills.Chirr.States; using ChirrAltSkills.Chirr.States.CharacterMains; using ChirrAltSkills.Chirr.States.Primary; using ChirrAltSkills.Chirr.States.Special; using DiggerPlugin; using EntityStates; using EntityStates.Commando.CommandoWeapon; using EntityStates.GummyClone; using EntityStates.Mage; using EntityStates.SS2UStates.Chirr; using HG; using HG.Reflection; using JetBrains.Annotations; using On.RoR2; using R2API; using R2API.Networking; using R2API.Networking.Interfaces; using RoR2; using RoR2.Skills; using Starstorm2Unofficial.Survivors.Chirr; using Starstorm2Unofficial.Survivors.Chirr.Components; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.Events; using UnityEngine.Networking; using UnityEngine.SceneManagement; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: OptIn] [assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")] [assembly: AssemblyCompany("ChirrAltSkills")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+459ca2f2a3065e0b85241076a402e1d93d2f9aa0")] [assembly: AssemblyProduct("ChirrAltSkills")] [assembly: AssemblyTitle("ChirrAltSkills")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] internal static class ChirrSetupHelpers { public static void AddToSkillFamily(SkillDef skillDef, SkillFamily skillFamily, UnlockableDef unlockableDef = null) { //IL_0009: 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_002b: Expected O, but got Unknown ref Variant[] variants = ref skillFamily.variants; Variant val = new Variant { skillDef = skillDef }; ((Variant)(ref val)).viewableNode = new Node(skillDef.skillNameToken, false, (Node)null); val.unlockableDef = unlockableDef; ArrayUtils.ArrayAppend<Variant>(ref variants, ref val); } public static void CopySkillDefFields(SkillDef parent, SkillDef child, bool copyIdentifiers) { //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0100: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)parent) && Object.op_Implicit((Object)(object)child)) { Debug.LogError((object)("Attempted to call CopySkillDefFields with no parent! Child: " + child.skillName)); } if (!Object.op_Implicit((Object)(object)child) && Object.op_Implicit((Object)(object)parent)) { Debug.LogError((object)("Attempted to call CopySkillDefFields with no child! Parent: " + parent.skillName)); } if (!Object.op_Implicit((Object)(object)child) && !Object.op_Implicit((Object)(object)parent)) { Debug.LogError((object)"Attempted to call CopySkillDefFields with no child or parent!!!"); } child.activationState = parent.activationState; child.activationStateMachineName = parent.activationStateMachineName; child.baseMaxStock = parent.baseMaxStock; child.baseRechargeInterval = parent.baseRechargeInterval; child.beginSkillCooldownOnSkillEnd = parent.beginSkillCooldownOnSkillEnd; child.canceledFromSprinting = parent.canceledFromSprinting; child.cancelSprintingOnActivation = parent.cancelSprintingOnActivation; child.dontAllowPastMaxStocks = parent.dontAllowPastMaxStocks; child.forceSprintDuringState = parent.forceSprintDuringState; child.fullRestockOnAssign = parent.fullRestockOnAssign; child.icon = parent.icon; child.interruptPriority = parent.interruptPriority; child.isCombatSkill = parent.isCombatSkill; child.keywordTokens = parent.keywordTokens; child.mustKeyPress = parent.mustKeyPress; child.rechargeStock = parent.rechargeStock; child.requiredStock = parent.requiredStock; child.resetCooldownTimerOnUse = parent.resetCooldownTimerOnUse; if (copyIdentifiers) { child.skillDescriptionToken = parent.skillDescriptionToken; child.skillName = parent.skillName; child.skillNameToken = parent.skillNameToken; } child.stockToConsume = parent.stockToConsume; } public static T CreateSkillDef<T>(string token, bool setDefaultStateToIdle = true) where T : AssignableSkillDef { //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) Debug.Log((object)token); T val = ScriptableObject.CreateInstance<T>(); ((SkillDef)val).skillName = token; ((Object)val).name = token; ((SkillDef)val).skillNameToken = token + "_NAME"; ((SkillDef)val).skillDescriptionToken = token + "_DESC"; if (setDefaultStateToIdle) { ((SkillDef)val).activationState = new SerializableEntityStateType(typeof(Idle)); } return val; } public static ChirrTargetableSkillDef CreateTargetableSkillDef(string token) { return CreateSkillDef(token) as ChirrTargetableSkillDef; } public static SkillDef CreateSkillDef(string token) { SkillDef val = ScriptableObject.CreateInstance<SkillDef>(); val.skillName = token; ((Object)val).name = token; val.skillNameToken = token + "_NAME"; val.skillDescriptionToken = token + "_DESC"; return val; } public static SkillDef CreateSkillDef(string token, SkillFamily family, UnlockableDef unlockableDef = null) { SkillDef val = CreateSkillDef(token); AddToSkillFamily(val, family, unlockableDef); return val; } } namespace ChirrAltSkills { public static class Assets { public static class ChirrAssets { public static Sprite passiveStageBuffIcon; public static Sprite passiveSnackiesPerStageIcon; public static Sprite passiveBunnyIcon; public static Sprite passiveSoulmateIcon; public static Sprite passiveDiggerIcon; public static Sprite primaryLeafBladeIcon; public static Sprite secondaryHeadbuttWeakenIcon; public static Sprite specialTFIcon; public static Sprite specialTransformScepterIcon; public static Sprite specialEatIcon; public static Sprite specialEatScepterIcon; public static Sprite buffIndulgenceIcon; public static Sprite buffSnackiesIcon; public static Sprite buffSoulmateIcon; public static Sprite buffAdrenalineIcon; public static Sprite buffHoverDurationIcon; public static Sprite buffBunnyJumpIcon; public static Sprite LoadSprite(string path) { return mainAssetBundle.LoadAsset<Sprite>(path); } public static void Init() { passiveStageBuffIcon = LoadSprite("PassiveStageBuffIcon"); passiveSnackiesPerStageIcon = LoadSprite("PassiveSnackiesPerStageIcon"); passiveBunnyIcon = LoadSprite("PassiveBunnyIcon"); passiveSoulmateIcon = LoadSprite("PassiveSoulmateIcon"); passiveDiggerIcon = LoadSprite("PassiveDiggerIcon"); specialTFIcon = LoadSprite("SpecialTransformEnemyIcon"); specialTransformScepterIcon = LoadSprite("SpecialTransformEnemyScepterIcon"); specialEatIcon = LoadSprite("SpecialEatEnemyIcon"); specialEatScepterIcon = LoadSprite("SpecialEatEnemyScepterIcon"); buffSnackiesIcon = LoadSprite("BuffSnackiesIcon"); buffIndulgenceIcon = buffSnackiesIcon; buffSoulmateIcon = LoadSprite("BuffSoulmateIcon"); buffAdrenalineIcon = LoadSprite("BuffAdrenalineIcon"); buffHoverDurationIcon = LoadSprite("BuffHoverDurationIcon"); buffBunnyJumpIcon = LoadSprite("BuffBunnyJumpIcon"); } } public static AssetBundle mainAssetBundle; public const string bundleName = "chirraltskillsassetbundle"; public static string AssetBundlePath => Path.Combine(Path.GetDirectoryName(CASPlugin.PInfo.Location), "chirraltskillsassetbundle"); public static T LoadAddressable<T>(string path) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) return Addressables.LoadAssetAsync<T>((object)path).WaitForCompletion(); } public static void Init() { PopulateAssets(); ChirrAssets.Init(); } public static void PopulateAssets() { mainAssetBundle = AssetBundle.LoadFromFile(AssetBundlePath); } } public class AssignableSkillDef : SkillDef { public Func<GenericSkill, BaseSkillInstanceData> onAssign; public Action<GenericSkill> onUnassign; public override BaseSkillInstanceData OnAssigned(GenericSkill skillSlot) { return onAssign?.Invoke(skillSlot); } public override void OnUnassigned(GenericSkill skillSlot) { ((SkillDef)this).OnUnassigned(skillSlot); onUnassign?.Invoke(skillSlot); } } internal class Buffs { public static BuffDef indulgenceBuff; public static BuffDef snackiesBuff; public static BuffDef soulmateBuff; public static BuffDef adrenalineBuff; public static BuffDef hoverDurationIndicatorBuff; public static BuffDef bunnyJumpBuff; public static void Init() { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Expected O, but got Unknown CreateBuffs(); RecalculateStatsAPI.GetStatCoefficients += new StatHookEventHandler(RecalculateStatsAPI_GetStatCoefficients); } private static void RecalculateStatsAPI_GetStatCoefficients(CharacterBody sender, StatHookEventArgs args) { int buffCount = sender.GetBuffCount(snackiesBuff); int buffCount2 = sender.GetBuffCount(indulgenceBuff); int num = buffCount + buffCount2; if (num > 0) { args.armorAdd += 0.005f * (float)num; args.attackSpeedMultAdd -= 0.003f * (float)num; args.baseHealthAdd += (float)(15 * num); args.jumpPowerMultAdd -= 0.001f * (float)num; args.moveSpeedReductionMultAdd += 0.005f * (float)num; sender.characterMotor.mass = ChirrSetup.cachedMass + ChirrSetup.cachedMass / 10f * (float)num; } int buffCount3 = sender.GetBuffCount(soulmateBuff); if (buffCount3 > 0) { args.armorAdd += 5f * (float)buffCount3; args.baseRegenAdd += 0.5f * (float)buffCount3; args.healthMultAdd += 0.1f * (float)buffCount3; } int buffCount4 = sender.GetBuffCount(bunnyJumpBuff); if (buffCount4 > 0) { args.jumpPowerMultAdd += 0.1f * (float)buffCount4; } } public static void CreateBuffs() { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_0130: Unknown result type (might be due to invalid IL or missing references) //IL_01cc: Unknown result type (might be due to invalid IL or missing references) //IL_01d1: Unknown result type (might be due to invalid IL or missing references) //IL_0218: Unknown result type (might be due to invalid IL or missing references) //IL_0222: Expected O, but got Unknown //IL_018c: Unknown result type (might be due to invalid IL or missing references) //IL_0196: Expected O, but got Unknown //IL_0252: Unknown result type (might be due to invalid IL or missing references) //IL_0257: Unknown result type (might be due to invalid IL or missing references) //IL_02d0: Unknown result type (might be due to invalid IL or missing references) //IL_02d5: Unknown result type (might be due to invalid IL or missing references) snackiesBuff = ScriptableObject.CreateInstance<BuffDef>(); ((Object)snackiesBuff).name = "DCSS2UChirrSnackies"; snackiesBuff.buffColor = new Color(0.98f, 0.376f, 0f); snackiesBuff.canStack = true; snackiesBuff.iconSprite = Assets.ChirrAssets.buffSnackiesIcon; snackiesBuff.isCooldown = false; snackiesBuff.isDebuff = false; snackiesBuff.isHidden = false; ContentAddition.AddBuffDef(snackiesBuff); indulgenceBuff = ScriptableObject.CreateInstance<BuffDef>(); ((Object)indulgenceBuff).name = "DCSS2UChirrIndulgence"; indulgenceBuff.buffColor = new Color(0.69f, 0.104f, 0.104f); indulgenceBuff.iconSprite = Assets.ChirrAssets.buffIndulgenceIcon; indulgenceBuff.canStack = true; indulgenceBuff.isCooldown = false; indulgenceBuff.isDebuff = false; indulgenceBuff.isHidden = false; ContentAddition.AddBuffDef(indulgenceBuff); soulmateBuff = ScriptableObject.CreateInstance<BuffDef>(); ((Object)soulmateBuff).name = "DCSS2UChirrComfortingPresence"; soulmateBuff.buffColor = new Color(0.351f, 0.77f, 0.246f); soulmateBuff.iconSprite = Assets.ChirrAssets.buffSoulmateIcon; soulmateBuff.canStack = true; soulmateBuff.isCooldown = false; soulmateBuff.isDebuff = false; soulmateBuff.isHidden = false; ContentAddition.AddBuffDef(soulmateBuff); if (CASPlugin.modloaded_Digger) { BuffCatalog.Init += new hook_Init(GetDiggerGoldRush); } else { adrenalineBuff = ScriptableObject.CreateInstance<BuffDef>(); ((Object)adrenalineBuff).name = "DCSS2UChirrAdrenaline"; adrenalineBuff.buffColor = new Color(0.753f, 0.77f, 0.246f); adrenalineBuff.iconSprite = Assets.ChirrAssets.buffAdrenalineIcon; adrenalineBuff.canStack = true; adrenalineBuff.isCooldown = false; adrenalineBuff.isDebuff = false; adrenalineBuff.isHidden = false; RecalculateStatsAPI.GetStatCoefficients += new StatHookEventHandler(ChirrGoldRushRecalcStats); } hoverDurationIndicatorBuff = ScriptableObject.CreateInstance<BuffDef>(); ((Object)hoverDurationIndicatorBuff).name = "DCSS2UChirrHoverDurationRemaining"; hoverDurationIndicatorBuff.buffColor = new Color(0.351f, 0.77f, 0.246f); hoverDurationIndicatorBuff.iconSprite = Assets.ChirrAssets.buffHoverDurationIcon; hoverDurationIndicatorBuff.canStack = true; hoverDurationIndicatorBuff.isCooldown = false; hoverDurationIndicatorBuff.isDebuff = false; hoverDurationIndicatorBuff.isHidden = false; ContentAddition.AddBuffDef(hoverDurationIndicatorBuff); bunnyJumpBuff = ScriptableObject.CreateInstance<BuffDef>(); ((Object)bunnyJumpBuff).name = "DCSS2UChirrBunnyJumpBoost"; bunnyJumpBuff.buffColor = new Color(0.351f, 0.77f, 0.246f); bunnyJumpBuff.iconSprite = Assets.ChirrAssets.buffBunnyJumpIcon; bunnyJumpBuff.canStack = true; bunnyJumpBuff.isCooldown = false; bunnyJumpBuff.isDebuff = false; bunnyJumpBuff.isHidden = false; ContentAddition.AddBuffDef(bunnyJumpBuff); } private static void ChirrGoldRushRecalcStats(CharacterBody sender, StatHookEventArgs args) { int buffCount = sender.GetBuffCount(adrenalineBuff); if (buffCount > 0) { args.attackSpeedMultAdd += 0.1f * (float)buffCount; args.baseMoveSpeedAdd += 0.15f * (float)buffCount; args.baseRegenAdd += 0.25f * (float)buffCount; } } private static void GetDiggerGoldRush(orig_Init orig) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(); adrenalineBuff = BuffCatalog.GetBuffDef(BuffCatalog.FindBuffIndex("GoldRush")); } } [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("com.DestroyedClone.ChirrAltSkills", "ChirrSS2U Alt Skills", "0.0.2")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class CASPlugin : BaseUnityPlugin { internal static ManualLogSource _logger; internal static ConfigFile _config; internal const string LastDllVersion = "0.16.4"; public static bool modloaded_Digger; public static bool modloaded_ClassicItems; public static bool modloaded_Scepter; public static PluginInfo PInfo { get; set; } public void Awake() { PInfo = ((BaseUnityPlugin)this).Info; _logger = ((BaseUnityPlugin)this).Logger; _config = ((BaseUnityPlugin)this).Config; modloaded_Digger = Chainloader.PluginInfos.ContainsKey("com.rob.DiggerUnearthed"); modloaded_ClassicItems = Chainloader.PluginInfos.ContainsKey("com.ThinkInvisible.ClassicItems"); modloaded_Scepter = Chainloader.PluginInfos.ContainsKey("com.DestroyedClone.AncientScepter"); ConfigSetup.Init(); Assets.Init(); Buffs.Init(); DamageTypes.Init(); ChirrSetup.Init(); ChirrCommands.AddChatCommands(); Networking.Init(); } } internal class ConfigSetup { public static ConfigEntry<bool> cfgEnablePassiveStageBuff; public static ConfigEntry<bool> cfgEnablePassiveSnackies; public static ConfigEntry<bool> cfgEnablePassiveBunny; public static ConfigEntry<bool> cfgEnablePassiveSoulmate; public static ConfigEntry<bool> cfgEnablePassiveDigger; public static ConfigEntry<bool> cfgEnablePrimaryDoubleTap; public static ConfigEntry<bool> cfgEnableSpecialTransform; public static ConfigEntry<bool> cfgEnableSpecialEat; private const string desc = "Enable this skill for usage."; public static void Init() { cfgEnablePassiveStageBuff = CASPlugin._config.Bind<bool>("Passive", "Stage Buff", true, "Enable this skill for usage."); cfgEnablePassiveSnackies = CASPlugin._config.Bind<bool>("Passive", "Snackies", true, "Enable this skill for usage."); cfgEnablePassiveBunny = CASPlugin._config.Bind<bool>("Passive", "Bunny", true, "Enable this skill for usage."); cfgEnablePassiveSoulmate = CASPlugin._config.Bind<bool>("Passive", "Soulmate", true, "Enable this skill for usage."); cfgEnablePassiveDigger = CASPlugin._config.Bind<bool>("Passive", "Digger", true, "Enable this skill for usage."); cfgEnablePrimaryDoubleTap = CASPlugin._config.Bind<bool>("Primary", "Double Tap", true, "Enable this skill for usage."); cfgEnableSpecialTransform = CASPlugin._config.Bind<bool>("Special", "Transform", true, "Enable this skill for usage."); cfgEnableSpecialEat = CASPlugin._config.Bind<bool>("Special", "Eat", true, "Enable this skill for usage."); } } internal class DamageTypes { public static ModdedDamageType chirrChompDT; public static void Init() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) chirrChompDT = DamageAPI.ReserveDamageType(); GlobalEventManager.onCharacterDeathGlobal += GlobalEventManager_onCharacterDeathGlobal; } private static void GlobalEventManager_onCharacterDeathGlobal(DamageReport dr) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)dr.attacker) && dr.attackerBodyIndex == ChirrCore.bodyIndex && DamageAPI.HasModdedDamageType(dr.damageInfo, chirrChompDT)) { EatEnemy(dr); } } private static void EatEnemy(DamageReport damageReport) { //IL_00c2: 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) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Expected O, but got Unknown //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) float num = damageReport.combinedHealthBeforeDamage / damageReport.victimBody.healthComponent.fullCombinedHealth; float num2 = num * 100f; float num3 = 10f + 1f * num2 * 0.5f; int num4 = Mathf.CeilToInt(num2 * 0.5f); for (int i = 0; i < num4; i++) { damageReport.attackerBody.AddTimedBuff(Buffs.snackiesBuff, num3); } int buffCount = damageReport.victimBody.GetBuffCount(Buffs.snackiesBuff); buffCount += damageReport.victimBody.GetBuffCount(Buffs.indulgenceBuff); float num5 = 10f; for (int j = 0; j < buffCount; j++) { damageReport.attackerBody.AddTimedBuff(Buffs.snackiesBuff, num5); } EffectData val = new EffectData { origin = damageReport.attackerBody.corePosition }; val.SetNetworkedObjectReference(damageReport.attacker); EffectManager.SpawnEffect(LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/FruitHealEffect"), val, true); damageReport.attackerBody.healthComponent.HealFraction(num, default(ProcChainMask)); } } public class Networking { public class SendToClient_ChirrStatInfo : INetMessage, ISerializableObject { public NetworkInstanceId targetNetId; private const string formatToken = "DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_1"; private const string armorToken = "DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_ARMOR"; public float armor; private const string attackspeedToken = "DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_ATTACKSPEED"; public float attackspeed; private const string movespeedToken = "DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_MOVESPEED"; public float movespeed; private const string regenToken = "DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_REGEN"; public float regen; private const string hoverToken = "DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_HOVER"; public float hover; public SendToClient_ChirrStatInfo() { } public SendToClient_ChirrStatInfo(NetworkInstanceId targetNetId, float armor, float movespeed, float attackspeed, float regen, float hover) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) this.targetNetId = targetNetId; this.armor = armor; this.movespeed = movespeed; this.attackspeed = attackspeed; this.regen = regen; this.hover = hover; } public void Deserialize(NetworkReader reader) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) targetNetId = reader.ReadNetworkId(); armor = reader.ReadSingle(); movespeed = reader.ReadSingle(); attackspeed = reader.ReadSingle(); regen = reader.ReadSingle(); hover = reader.ReadSingle(); } public void OnReceived() { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) if (!(((NetworkBehaviour)LocalUserManager.GetFirstLocalUser().currentNetworkUser).netId != targetNetId)) { string stringFormatted = Language.GetStringFormatted("DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_1", new object[10] { Language.GetString("DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_ARMOR"), armor.ToString(), Language.GetString("DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_ATTACKSPEED"), $"{attackspeed:P}", Language.GetString("DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_MOVESPEED"), $"{movespeed:P}", Language.GetString("DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_REGEN"), regen.ToString(), Language.GetString("DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_HOVER"), $"{hover:P}" }); Chat.AddMessage(stringFormatted); } } public void Serialize(NetworkWriter writer) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) writer.Write(targetNetId); writer.Write(armor); writer.Write(attackspeed); writer.Write(movespeed); writer.Write(regen); writer.Write(hover); } } public class SendToAllSimpleChatMessage : INetMessage, ISerializableObject { public string formatToken; public string paramTokens; public SendToAllSimpleChatMessage() { } public SendToAllSimpleChatMessage(string formatToken, string paramTokens) { this.formatToken = formatToken; this.paramTokens = paramTokens; } public void Deserialize(NetworkReader reader) { formatToken = reader.ReadString(); paramTokens = reader.ReadString(); } public void OnReceived() { List<string> list = new List<string>(); string[] array = paramTokens.Split(new char[1] { ',' }); foreach (string text in array) { list.Add(Language.GetString(text)); } Chat.AddMessage(Language.GetStringFormatted(formatToken, new object[1] { list })); } public void Serialize(NetworkWriter writer) { writer.Write(formatToken); writer.Write(paramTokens); } } public static void Init() { NetworkingAPI.RegisterMessageType<SendToClient_ChirrStatInfo>(); } } } namespace ChirrAltSkills.Chirr { internal class ChirrCommands { public static void AddChatCommands() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown Chat.SendBroadcastChat_ChatMessageBase += new hook_SendBroadcastChat_ChatMessageBase(ActivateChatCommand); } private static void ActivateChatCommand(orig_SendBroadcastChat_ChatMessageBase orig, ChatMessageBase message) { //IL_0043: Unknown result type (might be due to invalid IL or missing references) UserChatMessage val = (UserChatMessage)(object)((message is UserChatMessage) ? message : null); if (val != null && !(val.text.ToLower() != "/chirrstage")) { ChirrStageBuffInfo.GetCurrentStageBuffInfo().SendChatChangeMessage(((NetworkBehaviour)val.sender.GetComponent<NetworkUser>()).netId); val.text += " [!]"; orig.Invoke(message); } } [ConCommand(/*Could not decode attribute arguments.*/)] private static void CCPrintStageBuffInfo(ConCommandArgs _) { if (!Object.op_Implicit((Object)(object)Run.instance)) { Debug.LogWarning((object)"Can't run cas_printstagebuff without being in a run!"); } else { ChirrStageBuffInfo.GetCurrentStageBuffInfo().LogChangeMessage(); } } } public class ChirrSetup { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static hook_Init <>9__20_0; internal void <Init>b__20_0(orig_Init orig) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(); commandoBodyIndex = BodyCatalog.FindBodyIndex("CommandoBody"); } } public static float cachedMass; public static GameObject bodyPrefab; public static SkillLocator skillLocator; public static EntityStateMachine passiveESM; public static GenericSkill passiveSkill; public static SkillFamily passiveSkillFamily; public static PassiveStageBuffSD passiveStageBuffSD; public static PassiveSnackiesPerStageSD passiveSnackiesSD; public static PassiveBunnySD passiveBunnySD; public static PassiveSoulmateSD passiveSoulmateSD; public static PassiveDiggerSD passiveDiggerSD; public static PassiveTakeFlightSD passiveDefaultSD; public static SteppedSkillDef primaryDoubleTapSD; public static TransformEnemySD specialTransformSD; public static TransformEnemyScepterSD specialTransformScepterSD; public static EatEnemySD specialEatSD; public static EatEnemyScepterSD specialEatScepterSD; public static List<CharacterBody> chirrSoulmates = new List<CharacterBody>(); public static List<CharacterBody> commandoSoulmates = new List<CharacterBody>(); public static BodyIndex commandoBodyIndex; public static void Init() { //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Expected O, but got Unknown bodyPrefab = ChirrCore.chirrPrefab; cachedMass = bodyPrefab.GetComponent<CharacterMotor>().mass; skillLocator = bodyPrefab.GetComponent<SkillLocator>(); ChirrTracker chirrTracker = bodyPrefab.AddComponent<ChirrTracker>(); ((Behaviour)chirrTracker).enabled = false; RevertBaseChanges(); SetupPassive(); SetupPrimary(); SetupSpecial(); CharacterBody.onBodyStartGlobal += CharacterBody_onBodyStartGlobal; GlobalEventManager.onCharacterDeathGlobal += Server_onCharacterDeath; Run.onServerGameOver += Run_ResetSoulmates; Stage.onServerStageComplete += Stage_ResetSoulmates; object obj = <>c.<>9__20_0; if (obj == null) { hook_Init val = delegate(orig_Init orig) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(); commandoBodyIndex = BodyCatalog.FindBodyIndex("CommandoBody"); }; <>c.<>9__20_0 = val; obj = (object)val; } BodyCatalog.Init += (hook_Init)obj; ChirrStageBuffInfo.Init(); if (CASPlugin.modloaded_Scepter) { ScepterSetup(); } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] private static void ScepterSetup() { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) bool flag = default(bool); ContentAddition.AddEntityState<TransformEnemyScepterES>(ref flag); specialTransformScepterSD = ChirrSetupHelpers.CreateSkillDef<TransformEnemyScepterSD>("DESCLONE_SS2UCHIRR_TRANSFORM_SCEPTER"); ChirrSetupHelpers.CopySkillDefFields((SkillDef)(object)specialTransformSD, (SkillDef)(object)specialTransformScepterSD, copyIdentifiers: false); ((SkillDef)specialTransformScepterSD).activationState = new SerializableEntityStateType(typeof(TransformEnemyScepterES)); ((SkillDef)specialTransformScepterSD).icon = Assets.ChirrAssets.specialTransformScepterIcon; ContentAddition.AddSkillDef((SkillDef)(object)specialTransformScepterSD); ContentAddition.AddEntityState<EatEnemyScepterES>(ref flag); specialEatScepterSD = ChirrSetupHelpers.CreateSkillDef<EatEnemyScepterSD>("DESCLONE_SS2UCHIRR_EAT_SCEPTER"); ChirrSetupHelpers.CopySkillDefFields((SkillDef)(object)specialEatSD, (SkillDef)(object)specialEatScepterSD, copyIdentifiers: false); ((SkillDef)specialEatScepterSD).activationState = new SerializableEntityStateType(typeof(EatEnemyScepterES)); ((SkillDef)specialEatScepterSD).icon = Assets.ChirrAssets.specialEatScepterIcon; ((SkillDef)specialEatScepterSD).keywordTokens = new string[1] { "DESCLONE_SS2UCHIRR_SNACKIES_KEYWORD" }; ContentAddition.AddSkillDef((SkillDef)(object)specialEatScepterSD); ItemBase<AncientScepterItem>.instance.RegisterScepterSkill((SkillDef)(object)specialTransformScepterSD, "SS2UChirrBody", (SkillDef)(object)specialTransformSD); ItemBase<AncientScepterItem>.instance.RegisterScepterSkill((SkillDef)(object)specialEatScepterSD, "SS2UChirrBody", (SkillDef)(object)specialEatSD); } private static void RevertBaseChanges() { //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) bodyPrefab.GetComponent<CharacterBody>().baseJumpPower = 15f; EntityStateMachine[] components = bodyPrefab.GetComponents<EntityStateMachine>(); EntityStateMachine[] array = components; foreach (EntityStateMachine val in array) { if (val.customName == "Body") { val.mainStateType = new SerializableEntityStateType(typeof(ChirrCharMainVariableFly)); break; } } } private static void ResetSoulmates() { chirrSoulmates.Clear(); commandoSoulmates.Clear(); } private static void Stage_ResetSoulmates(Stage obj) { ResetSoulmates(); } private static void Run_ResetSoulmates(Run arg1, GameEndingDef arg2) { ResetSoulmates(); } private static void Server_onCharacterDeath(DamageReport obj) { //IL_0037: 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) if (!NetworkServer.active || obj == null || !Object.op_Implicit((Object)(object)obj.victim)) { return; } if (obj.victimBodyIndex == BodyCatalog.FindBodyIndex("CommandoBody")) { foreach (CharacterBody chirrSoulmate in chirrSoulmates) { if (Object.op_Implicit((Object)(object)chirrSoulmate)) { float num = 15f; for (int i = 0; i < 5; i++) { chirrSoulmate.AddTimedBuff(Buffs.BeetleJuice, num); } } } commandoSoulmates.Remove(obj.victimBody); } else if (obj.victimBodyIndex == ChirrCore.bodyIndex) { chirrSoulmates.Remove(obj.victimBody); } } private static void CharacterBody_onBodyStartGlobal(CharacterBody body) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) if (NetworkServer.active && Object.op_Implicit((Object)(object)body) && Object.op_Implicit((Object)(object)body.master) && body.bodyIndex == commandoBodyIndex && !commandoSoulmates.Contains(body)) { commandoSoulmates.Add(body); } } private static void SetupPassive() { //IL_0004: 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_008d: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) bool flag = default(bool); ContentAddition.AddEntityState<ChirrCharMainVariableFly>(ref flag); ContentAddition.AddEntityState<VariableHoverOn>(ref flag); passiveSkill = bodyPrefab.AddComponent<GenericSkill>(); passiveSkillFamily = ScriptableObject.CreateInstance<SkillFamily>(); ((Object)passiveSkillFamily).name = "DCSS2UChirrPassive"; passiveSkill._skillFamily = passiveSkillFamily; ContentAddition.AddSkillFamily(passiveSkillFamily); NetworkStateMachine component = bodyPrefab.GetComponent<NetworkStateMachine>(); passiveESM = bodyPrefab.AddComponent<EntityStateMachine>(); passiveESM.customName = "Passive"; passiveESM.initialStateType = new SerializableEntityStateType(typeof(Idle)); passiveESM.mainStateType = new SerializableEntityStateType(typeof(Idle)); ArrayUtils.ArrayAppend<EntityStateMachine>(ref component.stateMachines, ref passiveESM); passiveDefaultSD = ChirrSetupHelpers.CreateSkillDef<PassiveTakeFlightSD>("DESCLONE_SS2UCHIRR_PASSIVE_TAKEFLIGHT"); ((SkillDef)passiveDefaultSD).skillNameToken = skillLocator.passiveSkill.skillNameToken; ((SkillDef)passiveDefaultSD).skillName = ((SkillDef)passiveDefaultSD).skillNameToken; ((SkillDef)passiveDefaultSD).skillDescriptionToken = skillLocator.passiveSkill.skillDescriptionToken; ((SkillDef)passiveDefaultSD).icon = skillLocator.passiveSkill.icon; skillLocator.passiveSkill.enabled = false; AddPassive((SkillDef)(object)passiveDefaultSD); if (ConfigSetup.cfgEnablePassiveStageBuff.Value) { passiveStageBuffSD = ChirrSetupHelpers.CreateSkillDef<PassiveStageBuffSD>("DESCLONE_SS2UCHIRR_PASSIVE_STAGEBUFF"); ((SkillDef)passiveStageBuffSD).icon = Assets.ChirrAssets.passiveStageBuffIcon; AddPassive((SkillDef)(object)passiveStageBuffSD); } if (ConfigSetup.cfgEnablePassiveSnackies.Value) { passiveSnackiesSD = ChirrSetupHelpers.CreateSkillDef<PassiveSnackiesPerStageSD>("DESCLONE_SS2UCHIRR_PASSIVE_SNACKIESPERSTAGE"); ((SkillDef)passiveSnackiesSD).icon = Assets.ChirrAssets.passiveSnackiesPerStageIcon; ((SkillDef)passiveSnackiesSD).keywordTokens = new string[1] { "DESCLONE_SS2UCHIRR_SNACKIES_KEYWORD" }; AddPassive((SkillDef)(object)passiveSnackiesSD); } if (ConfigSetup.cfgEnablePassiveBunny.Value) { passiveBunnySD = ChirrSetupHelpers.CreateSkillDef<PassiveBunnySD>("DESCLONE_SS2UCHIRR_PASSIVE_BUNNY"); ((SkillDef)passiveBunnySD).icon = Assets.ChirrAssets.passiveBunnyIcon; AddPassive((SkillDef)(object)passiveBunnySD); } if (ConfigSetup.cfgEnablePassiveSoulmate.Value) { passiveSoulmateSD = ChirrSetupHelpers.CreateSkillDef<PassiveSoulmateSD>("DESCLONE_SS2UCHIRR_PASSIVE_SOULMATE"); ((SkillDef)passiveSoulmateSD).icon = Assets.ChirrAssets.passiveSoulmateIcon; AddPassive((SkillDef)(object)passiveSoulmateSD); } if (ConfigSetup.cfgEnablePassiveDigger.Value) { passiveDiggerSD = ChirrSetupHelpers.CreateSkillDef<PassiveDiggerSD>("DESCLONE_SS2UCHIRR_PASSIVE_DIGGER"); ((SkillDef)passiveDiggerSD).icon = Assets.ChirrAssets.passiveDiggerIcon; AddPassive((SkillDef)(object)passiveDiggerSD); } static void AddPassive(SkillDef skillDef) { //IL_0018: 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_003a: Expected O, but got Unknown skillDef.activationStateMachineName = "Passive"; ref Variant[] variants = ref passiveSkillFamily.variants; Variant val = new Variant { skillDef = skillDef }; ((Variant)(ref val)).viewableNode = new Node(skillDef.skillNameToken, false, (Node)null); val.unlockableDef = null; ArrayUtils.ArrayAppend<Variant>(ref variants, ref val); ContentAddition.AddSkillDef(skillDef); } } private static void SetupPrimary() { //IL_0025: 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_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) SkillFamily skillFamily = skillLocator.primary.skillFamily; if (ConfigSetup.cfgEnablePrimaryDoubleTap.Value) { bool flag = default(bool); ContentAddition.AddEntityState<FireDoubleTapES>(ref flag); primaryDoubleTapSD = ScriptableObject.CreateInstance<SteppedSkillDef>(); ((SkillDef)primaryDoubleTapSD).skillName = "DESCLONE_SS2UCHIRR_PRIMARY_DOUBLETAP"; ((Object)primaryDoubleTapSD).name = "DESCLONE_SS2UCHIRR_PRIMARY_DOUBLETAP"; ((SkillDef)primaryDoubleTapSD).skillNameToken = "DESCLONE_SS2UCHIRR_PRIMARY_DOUBLETAP_NAME"; ((SkillDef)primaryDoubleTapSD).skillDescriptionToken = "DESCLONE_SS2UCHIRR_PRIMARY_DOUBLETAP_DESC"; ChirrSetupHelpers.CopySkillDefFields(skillFamily.variants[0].skillDef, (SkillDef)(object)primaryDoubleTapSD, copyIdentifiers: false); ((SkillDef)primaryDoubleTapSD).icon = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Commando/CommandoBodyFirePistol.asset").WaitForCompletion().icon; ((SkillDef)primaryDoubleTapSD).activationState = new SerializableEntityStateType(typeof(FireDoubleTapES)); ((SkillDef)primaryDoubleTapSD).skillDescriptionToken = "COMMANDO_PRIMARY_DESCRIPTION"; primaryDoubleTapSD.stepCount = 2; primaryDoubleTapSD.stepGraceDuration = 0.1f; ContentAddition.AddSkillDef((SkillDef)(object)primaryDoubleTapSD); ChirrSetupHelpers.AddToSkillFamily((SkillDef)(object)primaryDoubleTapSD, skillFamily); } } private static void SetupSpecial() { //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Unknown result type (might be due to invalid IL or missing references) SkillDef skillDef = skillLocator.special.skillFamily.variants[0].skillDef; bool flag = default(bool); if (ConfigSetup.cfgEnableSpecialTransform.Value) { ContentAddition.AddEntityState<TransformEnemyES>(ref flag); specialTransformSD = ChirrSetupHelpers.CreateSkillDef<TransformEnemySD>("DESCLONE_SS2UCHIRR_TRANSFORM"); ChirrSetupHelpers.CopySkillDefFields(skillDef, (SkillDef)(object)specialTransformSD, copyIdentifiers: false); ((SkillDef)specialTransformSD).activationState = new SerializableEntityStateType(typeof(TransformEnemyES)); ((SkillDef)specialTransformSD).icon = Assets.ChirrAssets.specialTFIcon; ContentAddition.AddSkillDef((SkillDef)(object)specialTransformSD); ChirrSetupHelpers.AddToSkillFamily((SkillDef)(object)specialTransformSD, skillLocator.special.skillFamily); } if (ConfigSetup.cfgEnableSpecialEat.Value) { ContentAddition.AddEntityState<EatEnemyES>(ref flag); specialEatSD = ChirrSetupHelpers.CreateSkillDef<EatEnemySD>("DESCLONE_SS2UCHIRR_EAT"); ChirrSetupHelpers.CopySkillDefFields(skillDef, (SkillDef)(object)specialEatSD, copyIdentifiers: false); ((SkillDef)specialEatSD).activationState = new SerializableEntityStateType(typeof(EatEnemyES)); ((SkillDef)specialEatSD).icon = Assets.ChirrAssets.specialEatIcon; ((SkillDef)specialEatSD).keywordTokens = new string[1] { "DESCLONE_SS2UCHIRR_SNACKIES_KEYWORD" }; ContentAddition.AddSkillDef((SkillDef)(object)specialEatSD); ChirrSetupHelpers.AddToSkillFamily((SkillDef)(object)specialEatSD, skillLocator.special.skillFamily); } } } internal class ChirrStageBuffInfo { internal struct StageBuffInfo { public string[] stageIds; public float armor; public const float minArmor = 2f; public const float medArmor = 4f; public const float maxArmor = 6f; public float movespeed; public const float minMS = 0.1f; public const float medMS = 0.3f; public const float maxMS = 0.5f; public float attackspeed; public const float minAS = 0.1f; public const float medAS = 0.3f; public const float maxAS = 0.5f; public float regen; public const float minRegen = 0.2f; public const float medRegen = 0.4f; public const float maxRegen = 0.6f; public float hover; public const float minHover = 0.25f; public const float medHover = 0.5f; public const float maxHover = 1f; public const int moveSpeedMaxStagesCleared = 10; public const float stageMultiplierStagesCleared = 0.2f; public void GetResultingStatChanges(out float armorMult, out float asMult, out float msMult, out float regenMult, out string currentStageToken) { int num = Mathf.Max(0, Run.instance.stageClearCount); float num2 = 1f + (float)num * 0.2f; float num3 = 1f + (float)Mathf.Min(20, num) * 0.2f; armorMult = armor * num2; asMult = attackspeed * num2; msMult = movespeed * num3; regenMult = regen * num2; currentStageToken = SceneCatalog.GetSceneDefForCurrentScene().nameToken; } public void Apply(CharacterBody characterBody) { GetResultingStatChanges(out var armorMult, out var asMult, out var msMult, out var regenMult, out var _); characterBody.baseArmor += armorMult; characterBody.baseAttackSpeed += asMult; characterBody.baseMoveSpeed += msMult; characterBody.baseRegen += regenMult; characterBody.MarkAllStatsDirty(); } public void SendChatAnnouncementMessage(CharacterBody characterBody) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Expected O, but got Unknown if (NetworkServer.active) { SubjectFormatChatMessage val = new SubjectFormatChatMessage(); ((SubjectChatMessage)val).baseToken = "DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_0"; ((SubjectChatMessage)val).subjectCharacterBodyGameObject = ((Component)characterBody).gameObject; val.paramTokens = new string[1] { SceneCatalog.GetSceneDefForCurrentScene().nameToken }; Chat.SendBroadcastChat((ChatMessageBase)(object)val); } } public string GetChangeMessage() { GetResultingStatChanges(out var armorMult, out var asMult, out var msMult, out var regenMult, out var _); return Language.GetStringFormatted("DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_1", new object[10] { g("DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_ARMOR"), armorMult, g("DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_MOVESPEED"), $"{asMult:P}", g("DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_ATTACKSPEED"), $"{msMult:P}", g("DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_REGEN"), regenMult, g("DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_HOVER"), $"{hover:P}" }); static string g(string token) { return Language.GetString(token); } } public void SendChatChangeMessage(NetworkInstanceId targetNetId) { //IL_0022: Unknown result type (might be due to invalid IL or missing references) if (NetworkServer.active) { GetResultingStatChanges(out var armorMult, out var asMult, out var msMult, out var regenMult, out var _); NetMessageExtensions.Send((INetMessage)(object)new Networking.SendToClient_ChirrStatInfo(targetNetId, armorMult, asMult, msMult, regenMult, hover), (NetworkDestination)1); } } public void LogChangeMessage() { GetResultingStatChanges(out var armorMult, out var asMult, out var msMult, out var regenMult, out var _); string[] array = new string[10] { Language.GetString("DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_ARMOR"), armorMult.ToString(), Language.GetString("DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_MOVESPEED"), $"{asMult:P}", Language.GetString("DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_ATTACKSPEED"), $"{msMult:P}", Language.GetString("DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_REGEN"), regenMult.ToString(), Language.GetString("DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_HOVER"), $"{hover:P}" }; object[] array2 = array; Debug.Log((object)Language.GetStringFormatted("DESCLONE_SS2UCHIRR_STAGEBUFF_MESSAGE_1", array2)); } } public static StageBuffInfo defaultInfo = new StageBuffInfo { stageIds = new string[0], armor = 2f, movespeed = 0.1f, attackspeed = 0.1f, regen = 0.2f, hover = 0.5f }; public static StageBuffInfo blackbeachInfo = new StageBuffInfo { stageIds = new string[3] { "blackbeach", "blackbeach2", "itblackbeach" }, armor = 2f, movespeed = 0.1f, attackspeed = 0.1f, regen = 0.4f, hover = 1f }; public static StageBuffInfo golemplainsInfo = new StageBuffInfo { stageIds = new string[3] { "golemplains", "golemplains2", "itgolemplains" }, armor = 4f, movespeed = 0.3f, attackspeed = 0.1f, regen = 0.4f, hover = 1f }; public static StageBuffInfo snowyforestInfo = new StageBuffInfo { stageIds = new string[1] { "snowyforest" }, armor = 4f, movespeed = 0.1f, attackspeed = 0.1f, regen = 0.2f, hover = 1f }; public static StageBuffInfo goolakeInfo = new StageBuffInfo { stageIds = new string[2] { "goolake", "itgoolake" }, armor = 6f, movespeed = 0.1f, attackspeed = 0.1f, regen = 0.2f, hover = 0.25f }; public static StageBuffInfo foggyswampInfo = new StageBuffInfo { stageIds = new string[1] { "foggyswamp" }, armor = 4f, movespeed = 0.1f, attackspeed = 0.1f, regen = 0.6f, hover = 0.5f }; public static StageBuffInfo ancientloftInfo = new StageBuffInfo { stageIds = new string[2] { "ancientloft", "itancientloft" }, armor = 6f, movespeed = 0.1f, attackspeed = 0.1f, regen = 0.2f, hover = 0.25f }; public static StageBuffInfo frozenwallInfo = new StageBuffInfo { stageIds = new string[2] { "frozenwall", "itfrozenwall" }, armor = 4f, movespeed = 0.1f, attackspeed = 0.1f, regen = 0.2f, hover = 0.5f }; public static StageBuffInfo wispgraveyardInfo = new StageBuffInfo { stageIds = new string[1] { "wispgraveyard" }, armor = 4f, movespeed = 0.5f, attackspeed = 0.3f, regen = 0.4f, hover = 1f }; public static StageBuffInfo sulfurpoolsInfo = new StageBuffInfo { stageIds = new string[1] { "sulfurpools" }, armor = 6f, movespeed = 0.1f, attackspeed = 0.1f, regen = 0.2f, hover = 0.25f }; public static StageBuffInfo dampcaveInfo = new StageBuffInfo { stageIds = new string[2] { "dampcavesimple", "itdampcave" }, armor = 2f, movespeed = 0.3f, attackspeed = 0.1f, regen = 0.2f, hover = 0.5f }; public static StageBuffInfo shipgraveyardInfo = new StageBuffInfo { stageIds = new string[1] { "shipgraveyard" }, armor = 2f, movespeed = 0.5f, attackspeed = 0.1f, regen = 0.6f, hover = 1f }; public static StageBuffInfo rootjungleInfo = new StageBuffInfo { stageIds = new string[1] { "rootjungle" }, armor = 2f, movespeed = 0.5f, attackspeed = 0.1f, regen = 0.6f, hover = 1f }; public static StageBuffInfo skymeadowInfo = new StageBuffInfo { stageIds = new string[2] { "skymeadow", "itskymeadow" }, armor = 2f, movespeed = 0.5f, attackspeed = 0.1f, regen = 0.6f, hover = 1f }; public static StageBuffInfo bossInfo = new StageBuffInfo { stageIds = new string[8] { "moon", "moon2", "itmoon", "limbo", "artifactworld", "goldshores", "voidraid", "arena" }, armor = 6f, movespeed = 0.5f, attackspeed = 0.5f, regen = 0.6f, hover = 1f }; public static StageBuffInfo bazaarInfo = new StageBuffInfo { stageIds = new string[1] { "bazaar" } }; public static StageBuffInfo voidstageInfo = new StageBuffInfo { stageIds = new string[1] { "voidstage" }, armor = 4f, movespeed = 0.3f, attackspeed = 0.3f, regen = 0.4f, hover = 0.5f }; public static StageBuffInfo[] stageBuffInfos = new StageBuffInfo[16] { blackbeachInfo, golemplainsInfo, snowyforestInfo, goolakeInfo, foggyswampInfo, ancientloftInfo, frozenwallInfo, wispgraveyardInfo, sulfurpoolsInfo, dampcaveInfo, shipgraveyardInfo, rootjungleInfo, skymeadowInfo, bazaarInfo, voidstageInfo, bossInfo }; public static Dictionary<string, StageBuffInfo> stageBuffInfoDict = new Dictionary<string, StageBuffInfo>(); public static float GetStageHoverMultiplier() { return GetCurrentStageBuffInfo().hover; } public static StageBuffInfo GetCurrentStageBuffInfo() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) Scene activeScene = SceneManager.GetActiveScene(); return GetStageBuffInfo(((Scene)(ref activeScene)).name); } public static void Init() { GenerateDictionary(); } public static void GenerateDictionary() { StageBuffInfo[] array = stageBuffInfos; for (int i = 0; i < array.Length; i++) { StageBuffInfo value = array[i]; string[] stageIds = value.stageIds; foreach (string key in stageIds) { stageBuffInfoDict.Add(key, value); } } } public static StageBuffInfo GetStageBuffInfo(string stageName) { StageBuffInfo value; return stageBuffInfoDict.TryGetValue(stageName, out value) ? value : defaultInfo; } } public class SoulmateChirrBuffer : MonoBehaviour { public CharacterBody body; public float stopwatch = 0f; public float timer = 4f; public void FixedUpdate() { stopwatch -= Time.fixedDeltaTime; if (!(stopwatch <= 0f)) { return; } stopwatch = timer; int buffCount = body.GetBuffCount(Buffs.soulmateBuff); int num = ChirrSetup.commandoSoulmates.Count - buffCount; if (num > 0) { for (int i = 0; i < num; i++) { body.AddBuff(Buffs.soulmateBuff); } } else if (num < 0) { for (int j = 0; j < -num; j++) { body.RemoveBuff(Buffs.soulmateBuff); } } } public void OnDestroy() { while (body.HasBuff(Buffs.soulmateBuff)) { body.RemoveBuff(Buffs.soulmateBuff); } } } } namespace ChirrAltSkills.Chirr.States { internal class VariableHoverOn : JetpackOn { public float hoverVelocityMultiplier = 1f; public float hoverAccelerationMultiplier = 1f; public override void OnEnter() { ((JetpackOn)this).OnEnter(); JetpackOn.hoverAcceleration *= hoverAccelerationMultiplier; } public override void FixedUpdate() { //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: 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_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) ((JetpackOn)this).FixedUpdate(); if (((EntityState)this).isAuthority) { float y = ((EntityState)this).characterMotor.velocity.y; y = Mathf.MoveTowards(y, JetpackOn.hoverVelocity, JetpackOn.hoverAcceleration * Time.fixedDeltaTime); ((EntityState)this).characterMotor.velocity = new Vector3(((EntityState)this).characterMotor.velocity.x, y, ((EntityState)this).characterMotor.velocity.z); } if (Object.op_Implicit((Object)(object)((EntityState)this).characterBody) && !((EntityState)this).characterBody.isSprinting && Object.op_Implicit((Object)(object)((EntityState)this).inputBank)) { Ray aimRay = ((BaseState)this).GetAimRay(); Vector2 val = default(Vector2); ((Vector2)(ref val))..ctor(((EntityState)this).inputBank.moveVector.x, ((EntityState)this).inputBank.moveVector.z); Vector2 val2 = default(Vector2); ((Vector2)(ref val2))..ctor(((Ray)(ref aimRay)).direction.x, ((Ray)(ref aimRay)).direction.z); float num = Vector2.Angle(val, val2); if (num <= 90f) { ((EntityState)this).characterBody.isSprinting = true; } } } } } namespace ChirrAltSkills.Chirr.States.Special { internal class EatEnemyES : BaseState { public const float baseBuffDuration = 10f; public const float stackBuffDuration = 1f; public const float damageCoefficient = 5f; public const float stacksPerHealthPercentage = 0.5f; public const float secondsPerHealthPercentage = 0.5f; private ChirrTracker chirrTracker; private readonly float duration = 0.25f; public virtual bool AllowBoss => false; public override void OnEnter() { ((BaseState)this).OnEnter(); chirrTracker = ((EntityState)this).GetComponent<ChirrTracker>(); Util.PlaySound("SS2UChirrSpecial", ((EntityState)this).gameObject); if (Object.op_Implicit((Object)(object)((EntityState)this).characterBody)) { ((EntityState)this).characterBody.SetAimTimer(duration + 1f); } if (NetworkServer.active) { ChompEnemy(chirrTracker.GetTrackingTarget().healthComponent); } } public override void FixedUpdate() { ((EntityState)this).FixedUpdate(); if (((EntityState)this).fixedAge > duration && ((EntityState)this).isAuthority) { ((EntityState)this).outer.SetNextStateToMain(); } } public void ChompEnemy(HealthComponent enemyHC) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0012: 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_002f: 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_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_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_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Expected O, but got Unknown //IL_0072: Unknown result type (might be due to invalid IL or missing references) DamageInfo val = new DamageInfo { attacker = ((EntityState)this).gameObject, inflictor = ((EntityState)this).gameObject, crit = ((EntityState)this).characterBody.RollCrit(), damage = ((EntityState)this).characterBody.damage * 5f, damageType = (DamageType)0, damageColorIndex = (DamageColorIndex)5, position = enemyHC.body.corePosition, procCoefficient = 0.1f }; DamageAPI.AddModdedDamageType(val, DamageTypes.chirrChompDT); enemyHC.TakeDamage(val); } public override void OnExit() { ((EntityState)this).OnExit(); } public override InterruptPriority GetMinimumInterruptPriority() { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) return (InterruptPriority)2; } } internal class EatEnemyScepterES : EatEnemyES { public override bool AllowBoss => true; } internal class TransformEnemyES : BaseState { private ChirrTracker chirrTracker; private readonly float duration = 0.25f; public virtual bool AllowBoss => false; public override void OnEnter() { ((BaseState)this).OnEnter(); chirrTracker = ((EntityState)this).GetComponent<ChirrTracker>(); Util.PlaySound("SS2UChirrSpecial", ((EntityState)this).gameObject); if (Object.op_Implicit((Object)(object)((EntityState)this).characterBody)) { ((EntityState)this).characterBody.SetAimTimer(duration + 1f); } if (NetworkServer.active) { TransformEnemy(chirrTracker.GetTrackingTarget().healthComponent); } } public override void FixedUpdate() { ((EntityState)this).FixedUpdate(); if (((EntityState)this).fixedAge > duration && ((EntityState)this).isAuthority) { ((EntityState)this).outer.SetNextStateToMain(); } } public void TransformEnemy(HealthComponent enemyHC) { //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_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Expected O, but got Unknown //IL_0037: 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_006c: Expected O, but got Unknown //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0078: 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_008e: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Expected O, but got Unknown Vector3 footPosition = enemyHC.body.footPosition; MasterCopySpawnCard val = MasterCopySpawnCard.FromMaster(((EntityState)this).characterBody.master, false, false, (Action<CharacterMaster>)null); MonsterSpawnDistance val2 = (MonsterSpawnDistance)1; DirectorPlacementRule val3 = new DirectorPlacementRule { placementMode = (PlacementMode)0, position = footPosition }; DirectorCore.GetMonsterSpawnDistance(val2, ref val3.minDistance, ref val3.maxDistance); DirectorSpawnRequest val4 = new DirectorSpawnRequest((SpawnCard)(object)val, val3, new Xoroshiro128Plus(Run.instance.seed + (ulong)Run.instance.fixedTime)) { teamIndexOverride = ((EntityState)this).characterBody.master.teamIndex, ignoreTeamMemberLimit = true, summonerBodyObject = ((Component)((EntityState)this).characterBody).gameObject }; DirectorSpawnRequest val5 = val4; val5.onSpawnedServer = (Action<SpawnResult>)Delegate.Combine(val5.onSpawnedServer, (Action<SpawnResult>)delegate(SpawnResult result) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Expected O, but got Unknown //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Invalid comparison between Unknown and I4 //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_0141: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Expected O, but got Unknown CharacterMaster component = result.spawnedInstance.GetComponent<CharacterMaster>(); Deployable val7 = result.spawnedInstance.AddComponent<Deployable>(); val7.onUndeploy = (UnityEvent)(((object)val7.onUndeploy) ?? ((object)new UnityEvent())); val7.onUndeploy.AddListener(new UnityAction(component.TrueKill)); component.inventory.CopyItemsFrom(((EntityState)this).characterBody.inventory); component.inventory.CopyEquipmentFrom(((EntityState)this).characterBody.inventory); foreach (string item in ChirrFriendController.itemCopyBlacklist) { ItemIndex val8 = ItemCatalog.FindItemIndex(item); if ((int)val8 != -1) { component.inventory.RemoveItem(val8, component.inventory.GetItemCount(val8)); } } float lifeTimer = (AllowBoss ? 20f : 10f); ComponentHelpers.AddComponent<MasterSuicideOnTimer>((MonoBehaviour)(object)component).lifeTimer = lifeTimer; GameObject bodyObject = component.GetBodyObject(); if (Object.op_Implicit((Object)(object)bodyObject)) { EntityStateMachine[] components = bodyObject.GetComponents<EntityStateMachine>(); foreach (EntityStateMachine val9 in components) { if (val9.customName == "Body") { val9.SetState((EntityState)new GummyCloneSpawnState()); break; } } } }); GameObject val6 = DirectorCore.instance.TrySpawnObject(val4); Object.Destroy((Object)(object)val); enemyHC.Suicide(((Component)((EntityState)this).characterBody).gameObject, (GameObject)null, (DamageType)0); } } internal class TransformEnemyScepterES : TransformEnemyES { public override bool AllowBoss => true; } } namespace ChirrAltSkills.Chirr.States.Primary { public class FireDoubleTapES : BaseSkillState, IStepSetter { private int pistol; private Ray aimRay; private float duration; void IStepSetter.SetStep(int i) { pistol = i; } private void FireBullet(string targetMuzzle) { //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0087: 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_009a: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Unknown result type (might be due to invalid IL or missing references) //IL_0133: Unknown result type (might be due to invalid IL or missing references) Util.PlaySound(FirePistol2.firePistolSoundString, ((EntityState)this).gameObject); if (Object.op_Implicit((Object)(object)ChirrPrimary.muzzleflashEffectPrefab)) { EffectManager.SimpleMuzzleFlash(ChirrPrimary.muzzleflashEffectPrefab, ((EntityState)this).gameObject, targetMuzzle, false); } ((BaseState)this).AddRecoil(-0.4f * FirePistol2.recoilAmplitude, -0.8f * FirePistol2.recoilAmplitude, -0.3f * FirePistol2.recoilAmplitude, 0.3f * FirePistol2.recoilAmplitude); if (((EntityState)this).isAuthority) { new BulletAttack { owner = ((EntityState)this).gameObject, weapon = ((EntityState)this).gameObject, origin = ((Ray)(ref aimRay)).origin, aimVector = ((Ray)(ref aimRay)).direction, minSpread = 0f, maxSpread = ((EntityState)this).characterBody.spreadBloomAngle, damage = FirePistol2.damageCoefficient * ((BaseState)this).damageStat, force = FirePistol2.force, tracerEffectPrefab = FirePistol2.tracerEffectPrefab, muzzleName = targetMuzzle, hitEffectPrefab = FirePistol2.hitEffectPrefab, isCrit = Util.CheckRoll(((BaseState)this).critStat, ((EntityState)this).characterBody.master), radius = 0.1f, smartCollision = true }.Fire(); } ((EntityState)this).characterBody.AddSpreadBloom(FirePistol2.spreadBloomValue); } public override void OnEnter() { //IL_001c: 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_0028: Unknown result type (might be due to invalid IL or missing references) ((BaseState)this).OnEnter(); duration = FirePistol2.baseDuration / ((BaseState)this).attackSpeedStat; aimRay = ((BaseState)this).GetAimRay(); ((BaseState)this).StartAimMode(aimRay, 3f, false); ((EntityState)this).PlayCrossfade("Gesture, Override", "Primary", "Primary.playbackRate", duration, 0.1f); ((EntityState)this).PlayCrossfade("Gesture, Additive", "Primary", "Primary.playbackRate", duration, 0.1f); if (pistol % 2 == 0) { FireBullet("MuzzleWingL"); } else { FireBullet("MuzzleWingR"); } } public override void FixedUpdate() { ((EntityState)this).FixedUpdate(); if (!(((EntityState)this).fixedAge < duration) && ((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)1; } } } namespace ChirrAltSkills.Chirr.States.CharacterMains { internal class ChirrCharMainVariableFly : ChirrMain { private float hoverVelocityMultiplier = 1f; private float hoverAccelerationMultiplier = 1f; private bool canHover = true; private bool hoverHasDuration = false; private float hoverDuration = -1f; private float hoverStopwatch = 0f; private bool hoverOnCooldown = false; public bool isBunny = false; private static BuffDef IndicatorBuff => Buffs.hoverDurationIndicatorBuff; public void ChangeHoverMultiplier(float hoverVelocityMultiplier, float hoverAccelerationMultiplier) { this.hoverVelocityMultiplier = hoverVelocityMultiplier; this.hoverAccelerationMultiplier = hoverAccelerationMultiplier; if (hoverAccelerationMultiplier < 0f) { canHover = false; } } public void ChangeMainBasedOnSkillDef() { //IL_0119: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Expected O, but got Unknown GenericSkill[] components = ((EntityState)this).gameObject.GetComponents<GenericSkill>(); foreach (GenericSkill val in components) { if (Object.op_Implicit((Object)(object)val) && Object.op_Implicit((Object)(object)val.skillFamily) && !(((Object)val.skillFamily).name != "DCSS2UChirrPassive")) { if ((Object)(object)val.skillDef == (Object)(object)ChirrSetup.passiveStageBuffSD) { float stageHoverMultiplier = ChirrStageBuffInfo.GetStageHoverMultiplier(); float num = Mathf.Max(1f, 1f / stageHoverMultiplier); ChangeHoverMultiplier(1f, num); } else if ((Object)(object)val.skillDef == (Object)(object)ChirrSetup.passiveBunnySD) { isBunny = true; hoverHasDuration = true; hoverDuration = 2f; } else if ((Object)(object)val.skillDef == (Object)(object)ChirrSetup.passiveDiggerSD) { hoverHasDuration = true; hoverDuration = 5f; } break; } } if (hoverHasDuration) { ((EntityState)this).characterMotor.onHitGroundServer += new HitGroundDelegate(ClearIndicatorBuffOnLandingServer); } } private void ClearIndicatorBuffOnLandingServer(ref HitGroundInfo hitGroundInfo) { ((EntityState)this).characterBody.ClearTimedBuffs(IndicatorBuff); } public override void OnEnter() { //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Expected O, but got Unknown ((ChirrMain)this).OnEnter(); ChangeMainBasedOnSkillDef(); if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor) && hoverHasDuration) { ((EntityState)this).characterMotor.onHitGroundAuthority += new HitGroundDelegate(ResetHoverCooldown); } SkillDef skillDef = ((EntityState)this).skillLocator.special.skillDef; if ((Object)(object)skillDef == (Object)(object)ChirrSetup.specialEatSD) { base.friendController.maxTrackingDistance = 0f; } else if ((Object)(object)skillDef == (Object)(object)ChirrSetup.specialTransformSD) { base.friendController.maxTrackingDistance = 0f; } } private void ResetHoverCooldown(ref HitGroundInfo hitGroundInfo) { hoverStopwatch = hoverDuration; hoverOnCooldown = false; if (NetworkServer.active) { while (((EntityState)this).characterBody.HasBuff(IndicatorBuff)) { ((EntityState)this).characterBody.RemoveBuff(IndicatorBuff); } } } public void GenericCharacterMain_ProcessJump() { //IL_01f8: Unknown result type (might be due to invalid IL or missing references) //IL_01fd: Unknown result type (might be due to invalid IL or missing references) //IL_0204: Unknown result type (might be due to invalid IL or missing references) //IL_0215: Expected O, but got Unknown //IL_0238: Unknown result type (might be due to invalid IL or missing references) //IL_023d: Unknown result type (might be due to invalid IL or missing references) //IL_0244: Unknown result type (might be due to invalid IL or missing references) //IL_024f: Unknown result type (might be due to invalid IL or missing references) //IL_0266: Expected O, but got Unknown //IL_027a: Unknown result type (might be due to invalid IL or missing references) //IL_027f: Unknown result type (might be due to invalid IL or missing references) //IL_0286: Unknown result type (might be due to invalid IL or missing references) //IL_0291: Unknown result type (might be due to invalid IL or missing references) //IL_0298: Unknown result type (might be due to invalid IL or missing references) //IL_029d: Unknown result type (might be due to invalid IL or missing references) //IL_02a2: Unknown result type (might be due to invalid IL or missing references) //IL_02ad: Expected O, but got Unknown if (!((BaseCharacterMain)this).hasCharacterMotor) { return; } bool flag = false; bool flag2 = false; if (!((GenericCharacterMain)this).jumpInputReceived || !Object.op_Implicit((Object)(object)((EntityState)this).characterBody) || ((EntityState)this).characterMotor.jumpCount >= ((EntityState)this).characterBody.maxJumpCount) { return; } int itemCount = ((EntityState)this).characterBody.inventory.GetItemCount(Items.JumpBoost); float num = 1f; float num2 = 1f; if (((EntityState)this).characterMotor.jumpCount >= ((EntityState)this).characterBody.baseJumpCount) { flag = true; num = 1.5f; num2 = 1.5f; } else if ((float)itemCount > 0f && ((EntityState)this).characterBody.isSprinting) { float num3 = ((EntityState)this).characterBody.acceleration * ((EntityState)this).characterMotor.airControl; if (((EntityState)this).characterBody.moveSpeed > 0f && num3 > 0f) { flag2 = true; float num4 = Mathf.Sqrt(10f * (float)itemCount / num3); float num5 = ((EntityState)this).characterBody.moveSpeed / num3; num = (num4 + num5) / num5; } } GenericCharacterMain.ApplyJumpVelocity(((EntityState)this).characterMotor, ((EntityState)this).characterBody, num, num2, false); if (((BaseCharacterMain)this).hasModelAnimator) { int layerIndex = ((BaseCharacterMain)this).modelAnimator.GetLayerIndex("Body"); if (layerIndex >= 0) { if (((EntityState)this).characterMotor.jumpCount == 0 || ((EntityState)this).characterBody.baseJumpCount == 1) { ((BaseCharacterMain)this).modelAnimator.CrossFadeInFixedTime("Jump", ((BaseCharacterMain)this).smoothingParameters.intoJumpTransitionTime, layerIndex); } else { ((BaseCharacterMain)this).modelAnimator.CrossFadeInFixedTime("BonusJump", ((BaseCharacterMain)this).smoothingParameters.intoJumpTransitionTime, layerIndex); } } } if (flag) { EffectManager.SpawnEffect(LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/FeatherEffect"), new EffectData { origin = ((EntityState)this).characterBody.footPosition }, true); } else if (((EntityState)this).characterMotor.jumpCount > 0) { EffectManager.SpawnEffect(LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/ImpactEffects/CharacterLandImpact"), new EffectData { origin = ((EntityState)this).characterBody.footPosition, scale = ((EntityState)this).characterBody.radius }, true); } if (flag2) { EffectManager.SpawnEffect(LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/BoostJumpEffect"), new EffectData { origin = ((EntityState)this).characterBody.footPosition, rotation = Util.QuaternionSafeLookRotation(((EntityState)this).characterMotor.velocity) }, true); } CharacterMotor characterMotor = ((EntityState)this).characterMotor; characterMotor.jumpCount++; } public override void ProcessJump() { //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_014c: Unknown result type (might be due to invalid IL or missing references) //IL_0156: Expected O, but got Unknown GenericCharacterMain_ProcessJump(); base.inJetpackState = ((object)base.jetpackStateMachine.state).GetType() == typeof(VariableHoverOn); if (!((BaseCharacterMain)this).hasCharacterMotor || !((BaseCharacterMain)this).hasInputBank || !((EntityState)this).isAuthority) { return; } bool flag = ((EntityState)this).inputBank.jump.down && ((EntityState)this).characterMotor.velocity.y < 0f && !((EntityState)this).characterMotor.isGrounded; if (canHover && flag && !base.inJetpackState && (!hoverHasDuration || !hoverOnCooldown)) { base.jetpackStateMachine.SetNextState((EntityState)(object)new VariableHoverOn { hoverVelocityMultiplier = hoverVelocityMultiplier, hoverAccelerationMultiplier = hoverAccelerationMultiplier }); for (int i = 0; (float)i < hoverDuration + 1f; i++) { ((EntityState)this).characterBody.AddTimedBuffAuthority(IndicatorBuff.buffIndex, hoverDuration - (float)i); } } if (base.inJetpackState && (!flag || !canHover || hoverOnCooldown)) { base.jetpackStateMachine.SetNextState((EntityState)new Idle()); } } public override void FixedUpdate() { ((ChirrMain)this).FixedUpdate(); base.inJetpackState = Object.op_Implicit((Object)(object)base.jetpackStateMachine) && ((object)base.jetpackStateMachine.state).GetType() == typeof(VariableHoverOn); if (hoverHasDuration && base.inJetpackState && !hoverOnCooldown) { hoverStopwatch -= Time.fixedDeltaTime; hoverOnCooldown = hoverStopwatch <= 0f; } } public override void OnExit() { //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Expected O, but got Unknown if (NetworkServer.active) { while (((EntityState)this).characterBody.HasBuff(IndicatorBuff)) { ((EntityState)this).characterBody.RemoveBuff(IndicatorBuff); } } if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor) && hoverHasDuration) { ((EntityState)this).characterMotor.onHitGroundAuthority -= new HitGroundDelegate(ResetHoverCooldown); } ((ChirrMain)this).OnExit(); } } } namespace ChirrAltSkills.Chirr.SkillDefs { public class DiggerCloneComponent : MonoBehaviour { private float adrenalineGainBuffer; private float adrenalineCap; private int moneyTracker; private float residue; private int buffCounter; public CharacterBody characterBody; public void Awake() { characterBody = ((Component)this).GetComponent<CharacterBody>(); } public void Start() { adrenalineGainBuffer = 0.3f; moneyTracker = (int)characterBody.master.money; adrenalineCap = (CASPlugin.modloaded_Digger ? GetModdedAdrenalineCap() : 49f); } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public float GetModdedAdrenalineCap() { return DiggerPlugin.adrenalineCap; } public void FixedUpdate() { adrenalineGainBuffer -= Time.fixedDeltaTime; if (adrenalineGainBuffer <= 0f && NetworkServer.active) { UpdatePassiveBuff(); } else { buffCounter = characterBody.GetBuffCount(Buffs.adrenalineBuff); } } private void UpdatePassiveBuff() { int buffCount = characterBody.GetBuffCount(Buffs.adrenalineBuff); int money = (int)characterBody.master.money; if (moneyTracker < money) { RefreshExistingStacks(buffCount); GiveNewStacks(money); } moneyTracker = money; HandleStackDecay(buffCount); } private void RefreshExistingStacks(int currentCount) { characterBody.ClearTimedBuffs(Buffs.adrenalineBuff); for (int i = 0; i < currentCount; i++) { if ((float)characterBody.GetBuffCount(Buffs.adrenalineBuff) <= adrenalineCap) { characterBody.AddTimedBuff(Buffs.adrenalineBuff, 5f); } } } private void GiveNewStacks(int newMoney) { float num = (float)(newMoney - moneyTracker) / Mathf.Pow(Run.instance.difficultyCoefficient, 1.25f); residue = (num + residue) % 5f; float num2 = (num + residue) / 5f; for (int i = 1; (float)i <= num2; i++) { if ((float)characterBody.GetBuffCount(Buffs.adrenalineBuff) <= adrenalineCap) { characterBody.AddTimedBuff(Buffs.adrenalineBuff, 5f); } } } private void HandleStackDecay(int currentCount) { if (buffCounter != 0 && currentCount == 0) { for (int i = 1; (double)i < (double)buffCounter * 0.5; i++) { if ((float)characterBody.GetBuffCount(Buffs.adrenalineBuff) <= adrenalineCap) { characterBody.AddTimedBuff(Buffs.adrenalineBuff, 1f); } } } buffCounter = characterBody.GetBuffCount(Buffs.adrenalineBuff); } private void OnDestroy() { characterBody.ClearTimedBuffs(Buffs.adrenalineBuff); } } public class PassiveDiggerSD : AssignableSkillDef { protected class InstanceData : BaseSkillInstanceData { public DiggerCloneComponent diggerComponent; } public override BaseSkillInstanceData OnAssigned(GenericSkill skillSlot) { if (!NetworkServer.active) { return base.OnAssigned(skillSlot); } DiggerCloneComponent diggerCloneComponent = ((Component)skillSlot.characterBody).GetComponent<DiggerCloneComponent>(); if (!Object.op_Implicit((Object)(object)diggerCloneComponent)) { diggerCloneComponent = ComponentHelpers.AddComponent<DiggerCloneComponent>((MonoBehaviour)(object)skillSlot.characterBody); } return (BaseSkillInstanceData)(object)new InstanceData { diggerComponent = diggerCloneComponent }; } public override void OnUnassigned(GenericSkill skillSlot) { if (NetworkServer.active) { Object.Destroy((Object)(object)((InstanceData)(object)skillSlot.skillInstanceData).diggerComponent); } base.OnUnassigned(skillSlot); } } public class PassiveSnackiesPerStageSD : AssignableSkillDef { public override BaseSkillInstanceData OnAssigned(GenericSkill skillSlot) { if (NetworkServer.active) { int num = Mathf.Abs(Run.instance.stageClearCount); int num2 = 2 + num * 2; for (int i = 0; i < num2; i++) { skillSlot.characterBody.AddBuff(Buffs.indulgenceBuff); } } return base.OnAssigned(skillSlot); } public override void OnUnassigned(GenericSkill skillSlot) { if (NetworkServer.active) { while (skillSlot.characterBody.HasBuff(Buffs.indulgenceBuff)) { skillSlot.characterBody.RemoveBuff(Buffs.indulgenceBuff); } } base.OnUnassigned(skillSlot); } } public class PassiveSoulmateSD : AssignableSkillDef { public override BaseSkillInstanceData OnAssigned(GenericSkill skillSlot) { if (NetworkServer.active && !ChirrSetup.chirrSoulmates.Contains(skillSlot.characterBody)) { ChirrSetup.chirrSoulmates.Add(skillSlot.characterBody); ComponentHelpers.AddComponent<SoulmateChirrBuffer>((MonoBehaviour)(object)skillSlot.characterBody).body = skillSlot.characterBody; } return base.OnAssigned(skillSlot); } public override void OnUnassigned(GenericSkill skillSlot) { if (NetworkServer.active && ChirrSetup.chirrSoulmates.Contains(skillSlot.characterBody)) { ChirrSetup.chirrSoulmates.Remove(skillSlot.characterBody); SoulmateChirrBuffer component = ((Component)skillSlot.characterBody).GetComponent<SoulmateChirrBuffer>(); if (Object.op_Implicit((Object)(object)component)) { Object.Destroy((Object)(object)component); } } base.OnUnassigned(skillSlot); } } public class PassiveStageBuffSD : AssignableSkillDef { public override BaseSkillInstanceData OnAssigned(GenericSkill skillSlot) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) Scene activeScene = SceneManager.GetActiveScene(); ChirrStageBuffInfo.StageBuffInfo stageBuffInfo = ChirrStageBuffInfo.GetStageBuffInfo(((Scene)(ref activeScene)).name); stageBuffInfo.Apply(skillSlot.characterBody); stageBuffInfo.SendChatAnnouncementMessage(skillSlot.characterBody); return base.OnAssigned(skillSlot); } } } namespace ChirrAltSkills.Chirr.SkillDefs.TargetableSkillDef { public class ChirrTargetableSkillDef : AssignableSkillDef { protected class InstanceData : BaseSkillInstanceData { public ChirrTracker chirrTracker; public bool healthThreshold = false; public float healthThresholdPercentage; } public override BaseSkillInstanceData OnAssigned([NotNull] GenericSkill skillSlot) { ChirrTracker component = ((Component)skillSlot).GetComponent<ChirrTracker>(); ((Behaviour)component).enabled = true; return (BaseSkillInstanceData)(object)new InstanceData { chirrTracker = component }; } public override void OnUnassigned(GenericSkill skillSlot) { ((Behaviour)((InstanceData)(object)skillSlot.skillInstanceData).chirrTracker).enabled = false; base.OnUnassigned(skillSlot); } private static bool HasTarget([NotNull] GenericSkill skillSlot) { ChirrTracker chirrTracker = ((InstanceData)(object)skillSlot.skillInstanceData).chirrTracker; return Object.op_Implicit((Object)(object)(((Object)(object)chirrTracker != (Object)null) ? chirrTracker.GetTrackingTarget() : null)); } public override bool CanExecute([NotNull] GenericSkill skillSlot) { return HasTarget(skillSlot) && ((SkillDef)this).CanExecute(skillSlot); } public override bool IsReady([NotNull] GenericSkill skillSlot) { return ((SkillDef)this).IsReady(skillSlot) && HasTarget(skillSlot); } } [RequireComponent(typeof(InputBankTest))] [RequireComponent(typeof(CharacterBody))] [RequireComponent(typeof(TeamComponent))] public class ChirrTracker : MonoBehaviour { public float maxTrackingDistanceCalculated = 5f; public float maxTrackingDistance = 5f; public const float maxTrackingDistancePerStack = 1f; public const float maxTrackingAngle = 20f; public float trackerUpdateFrequency = 10f; private HurtBox trackingTarget; private CharacterBody characterBody; private TeamComponent teamComponent; private InputBankTest inputBank; private float trackerUpdateStopwatch; private Indicator indicator; private readonly BullseyeSearch search = new BullseyeSearch(); public bool targetNeedsHealthThreshold = false; public float targetHealthThresholdPercentage = 1f; public bool targetCanBeBoss = false; public bool targetCanBeNonMaster = false; private void Awake() { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown indicator = new Indicator(((Component)this).gameObject, LegacyResourcesAPI.Load<GameObject>("Prefabs/HuntressTrackingIndicator")); } private void Start() { characterBody = ((Component)this).GetComponent<CharacterBody>(); inputBank = ((Component)this).GetComponent<InputBankTest>(); teamComponent = ((Component)this).GetComponent<TeamComponent>(); } public HurtBox GetTrackingTarget() { return trackingTarget; } private void OnEnable() { indicator.active = true; } private void OnDisable() { indicator.active = false; } private void FixedUpdate() { //IL_0057: 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_006d: Unknown result type (might be due to invalid IL or missing references) trackerUpdateStopwatch += Time.fixedDeltaTime; if (trackerUpdateStopwatch >= 1f / trackerUpdateFrequency) { ModifyRange(); trackerUpdateStopwatch -= 1f / trackerUpdateFrequency; Ray aimRay = default(Ray); ((Ray)(ref aimRay))..ctor(inputBank.aimOrigin, inputBank.aimDirection); SearchForTarget(aimRay); indicator.targetTransform = (Object.op_Implicit((Object)(object)trackingTarget) ? ((Component)trackingTarget).transform : null); } } private void ModifyRange() { int buffCount = characterBody.GetBuffCount(Buffs.snackiesBuff); maxTrackingDistanceCalculated = maxTrackingDistance + 1f * (float)buffCount; } private bool CanTargetBoss(HurtBox hurtBox) { return targetCanBeBoss || !hurtBox.healthComponent.body.isBoss; } private bool CanTargetMaster(HurtBox hurtBox) { return targetCanBeNonMaster || !Object.op_Implicit((Object)(object)hurtBox.healthComponent.body.master); } private bool CanTargetHealthPercentage(HurtBox hurtBox) { return !targetNeedsHealthThreshold || hurtBox.healthComponent.combinedHealthFraction <= targetHealthThresholdPercentage; } private void SearchForTarget(Ray aimRay) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_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_0047: 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) search.teamMaskFilter = TeamMask.GetUnprotectedTeams(teamComponent.teamIndex); search.filterByLoS = true; search.searchOrigin = ((Ray)(ref aimRay)).origin; search.searchDirection = ((Ray)(ref aimRay)).direction; search.sortMode = (SortMode)1; search.maxDistanceFilter = maxTrackingDistanceCalculated; search.maxAngleFilter = 20f; search.RefreshCandidates(); search.FilterOutGameObject(((Component)this).gameObject); IEnumerable<HurtBox> results = search.GetResults(); bool flag = false; foreach (HurtBox item in results) { if (!Object.op_Implicit((Object)(object)item.healthComponent) || !item.healthComponent.alive || !Object.op_Implicit((Object)(object)item.healthComponent.body) || !CanTargetHealthPercentage(item) || !CanTargetMaster(item) || !CanTargetBoss(item)) { continue; } trackingTarget = item; flag = true; break; } if (!flag) { trackingTarget = null; } } } } namespace ChirrAltSkills.Chirr.SkillDefs.Special { public class EatEnemyScepterSD : ChirrTargetableSkillDef { public override BaseSkillInstanceData OnAssigned([NotNull] GenericSkill skillSlot) { BaseSkillInstanceData val = base.OnAssigned(skillSlot); ChirrTracker chirrTracker = ((InstanceData)(object)val).chirrTracker; chirrTracker.maxTrackingDistance = 10f; chirrTracker.targetNeedsHealthThreshold = false; chirrTracker.targetCanBeNonMaster = true; chirrTracker.targetCanBeBoss = true; return val; } } public class EatEnemySD : ChirrTargetableSkillDef { public override BaseSkillInstanceData OnAssigned([NotNull] GenericSkill skillSlot) { BaseSkillInstanceData val = base.OnAssigned(skillSlot); ChirrTracker chirrTracker = ((InstanceData)(object)val).chirrTracker; chirrTracker.maxTrackingDistance = 5f; chirrTracker.targetNeedsHealthThreshold = false; chirrTracker.targetCanBeNonMaster = true; chirrTracker.targetCanBeBoss = false; return val; } } internal class EatRadiusBehavior : MonoBehaviour { private CharacterBody characterBody; private readonly float updateFrequency = 0.5f; private float stopwatch = 0f; private GameObject indicator; private bool indicatorEnabled { get { return Object.op_Implicit((Object)(object)indicator); } set { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) if (indicatorEnabled != value) { if (value) { GameObject val = LegacyResourcesAPI.Load<GameObject>("Prefabs/NetworkedObjects/NearbyDamageBonusIndicator"); indicator = Object.Instantiate<GameObject>(val, characterBody.corePosition, Quaternion.identity); indicator.GetComponent<NetworkedBodyAttachment>().AttachToGameObjectAndSpawn(((Component)this).gameObject, (string)null); } else { Object.Destroy((Object)(object)indicator); indicator = null; } } } } private void Awake() { characterBody = ((Component)this).gameObject.GetComponent<CharacterBody>(); } private void OnEnable() { indicatorEnabled = true; } private void OnDisable() { indicatorEnabled = false; } private void FixedUpdate() { } } public class TransformEnemyScepterSD : ChirrTargetableSkillDef { public override BaseSkillInstanceData OnAssigned([NotNull] GenericSkill skillSlot) { BaseSkillInstanceData val = base.OnAssigned(skillSlot); ChirrTracker chirrTracker = ((InstanceData)(object)val).chirrTracker; chirrTracker.maxTrackingDistance = 10f; chirrTracker.targetCanBeBoss = false; chirrTracker.targetCanBeNonMaster = true; chirrTracker.targetNeedsHealthThreshold = true; chirrTracker.targetHealthThresholdPercentage = 0.5f; return val; } } public class TransformEnemySD : ChirrTargetableSkillDef { public override BaseSkillInstanceData OnAssigned([NotNull] GenericSkill skillSlot) { BaseSkillInstanceData val = base.OnAssigned(skillSlot); ChirrTracker chirrTracker = ((InstanceData)(object)val).chirrTracker; chirrTracker.maxTrackingDistance = 5f; chirrTracker.targetCanBeBoss = true; chirrTracker.targetCanBeNonMaster = true; chirrTracker.targetNeedsHealthThreshold = true; chirrTracker.targetHealthThresholdPercentage = 0.5f; return val; } } } namespace ChirrAltSkills.Chirr.SkillDefs.Passive { public class PassiveBunnySD : AssignableSkillDef { public class InstanceData : BaseSkillInstanceData { public GenericSkill skillSlot; public void BunnyBoostOnLand_Server(ref HitGroundInfo _) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) skillSlot.characterBody.AddTimedBuffAuthority(Buffs.bunnyJumpBuff.buffIndex, 10f); } } public override BaseSkillInstanceData OnAssigned(GenericSkill skillSlot) { //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_0046: 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_0073: Expected O, but got Unknown InstanceData instanceData = new InstanceData { skillSlot = skillSlot }; CharacterBody characterBody = skillSlot.characterBody; characterBody.baseJumpCount += 2; CharacterBody characterBody2 = skillSlot.characterBody; characterBody2.baseJumpPower -= 3.75f; CharacterBody characterBody3 = skillSlot.characterBody; characterBody3.bodyFlags = (BodyFlags)(characterBody3.bodyFlags | 1); skillSlot.characterBody.MarkAllStatsDirty(); skillSlot.characterBody.characterMotor.onHitGroundAuthority += new HitGroundDelegate(instanceData.BunnyBoostOnLand_Server); return (BaseSkillInstanceData)(object)instanceData; } public override void OnUnassigned(GenericSkill skillSlot) { //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_006e: 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_00a5: Expected O, but got Unknown CharacterBody characterBody = skillSlot.characterBody; characterBody.baseJumpCount -= 2; CharacterBody characterBody2 = skillSlot.characterBody; characterBody2.baseJumpPower += 3.75f; if (NetworkServer.active) { while (skillSlot.characterBody.HasBuff(Buffs.bunnyJumpBuff)) { skillSlot.characterBody.RemoveBuff(Buffs.bunnyJumpBuff); } } CharacterBody characterBody3 = skillSlot.characterBody; characterBody3.bodyFlags = (BodyFlags)(characterBody3.bodyFlags & -2); skillSlot.characterBody.MarkAllStatsDirty(); skillSlot.characterBody.characterMotor.onHitGroundAuthority -= new HitGroundDelegate(((InstanceData)(object)skillSlot.skillInstanceData).BunnyBoostOnLand_Server); base.OnUnassigned(skillSlot); } } public class PassiveTakeFlightSD : AssignableSkillDef { public override BaseSkillInstanceData OnAssigned(GenericSkill skillSlot) { skillSlot.characterBody.baseJumpPower = 22.5f; return base.OnAssigned(skillSlot); } public override void OnUnassigned(GenericSkill skillSlot) { skillSlot.characterBody.baseJumpPower = 15f; base.OnUnassigned(skillSlot); } } }