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 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); } } }