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 SurvivorsPlus v1.1.1
SurvivorsPlus.dll
Decompiled 2 years agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using EntityStates; using EntityStates.Bandit2.Weapon; using EntityStates.Captain.Weapon; using EntityStates.CaptainDefenseMatrixItem; using EntityStates.Commando; using EntityStates.Commando.CommandoWeapon; using EntityStates.Engi.EngiWeapon; using EntityStates.Engi.Mine; using EntityStates.Huntress; using EntityStates.Merc; using EntityStates.Railgunner.Reload; using EntityStates.Railgunner.Weapon; using EntityStates.VoidSurvivor; using IL.RoR2; using Microsoft.CodeAnalysis; using Mono.Cecil.Cil; using MonoMod.Cil; using On.EntityStates; using On.EntityStates.Bandit2.Weapon; using On.EntityStates.CaptainDefenseMatrixItem; using On.EntityStates.Commando; using On.EntityStates.Engi.EngiWeapon; using On.EntityStates.Engi.Mine; using On.EntityStates.Huntress; using On.EntityStates.Railgunner.Reload; using On.EntityStates.Railgunner.Weapon; using On.EntityStates.VoidSurvivor; using On.RoR2; using R2API; using RoR2; using RoR2.CharacterAI; using RoR2.EntityLogic; using RoR2.HudOverlay; using RoR2.Projectile; using RoR2.Skills; using SurvivorsPlus.Bandit; using SurvivorsPlus.Captain; using SurvivorsPlus.Commando; using SurvivorsPlus.Engineer; using SurvivorsPlus.Huntress; using SurvivorsPlus.Loader; using SurvivorsPlus.Mercenary; using SurvivorsPlus.REX; using SurvivorsPlus.Railgunner; using SurvivorsPlus.VoidFiend; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.Networking; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")] [assembly: AssemblyCompany("SurvivorsPlus")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+3a19b9bebbdbe9a3ce97821a90e60a74bc40b147")] [assembly: AssemblyProduct("SurvivorsPlus")] [assembly: AssemblyTitle("SurvivorsPlus")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace SurvivorsPlus { [BepInPlugin("com.Nuxlar.SurvivorsPlus", "SurvivorsPlus", "1.1.1")] public class SurvivorsPlus : BaseUnityPlugin { private GameObject arti = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Mage/MageBody.prefab").WaitForCompletion(); private GameObject mult = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Toolbot/ToolbotBody.prefab").WaitForCompletion(); public static ConfigEntry<bool> enableAccelerationChanges; public static ConfigEntry<bool> enableCommandoChanges; public static ConfigEntry<bool> enableHuntressChanges; public static ConfigEntry<bool> enableBanditChanges; public static ConfigEntry<bool> enableEngineerChanges; public static ConfigEntry<bool> enableMercChanges; public static ConfigEntry<bool> enableREXChanges; public static ConfigEntry<bool> enableRunnerChanges; public static ConfigEntry<bool> enableAcridChanges; public static ConfigEntry<bool> enableCaptainChanges; public static ConfigEntry<bool> enableVoidFiendChanges; public static ConfigEntry<bool> enableArtificerChanges; public static ConfigEntry<bool> enableLoaderChanges; private static ConfigFile SPConfig { get; set; } public void Awake() { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Expected O, but got Unknown SPConfig = new ConfigFile(Paths.ConfigPath + "\\com.Nuxlar.SurvivorsPlus.cfg", true); enableAccelerationChanges = SPConfig.Bind<bool>("General", "Enable Acceleration Changes", true, "Toggle Artificer and MUL-T acceleration changes on/off"); enableCommandoChanges = SPConfig.Bind<bool>("General", "Enable Commando Changes", true, "Toggle commando changes on/off"); enableHuntressChanges = SPConfig.Bind<bool>("General", "Enable Huntress Changes", true, "Toggle huntress changes on/off"); enableBanditChanges = SPConfig.Bind<bool>("General", "Enable Bandit Changes", true, "Toggle bandit changes on/off"); enableEngineerChanges = SPConfig.Bind<bool>("General", "Enable Engineer Changes", true, "Toggle engineer changes on/off"); enableMercChanges = SPConfig.Bind<bool>("General", "Enable Mercenary Changes", true, "Toggle mercenary changes on/off"); enableREXChanges = SPConfig.Bind<bool>("General", "Enable REX Changes", true, "Toggle REX changes on/off"); enableRunnerChanges = SPConfig.Bind<bool>("General", "Enable Railgunner Changes", true, "Toggle Railgunner changes on/off"); enableAcridChanges = SPConfig.Bind<bool>("General", "Enable Acrid Changes", true, "Toggle Acrid changes on/off"); enableCaptainChanges = SPConfig.Bind<bool>("General", "Enable Captain Changes", true, "Toggle Captain changes on/off"); enableVoidFiendChanges = SPConfig.Bind<bool>("General", "Enable Void Fiend Changes", true, "Toggle Void Fiend changes on/off"); enableArtificerChanges = SPConfig.Bind<bool>("General", "Enable Artificer Changes", true, "Toggle Artificer changes on/off"); enableLoaderChanges = SPConfig.Bind<bool>("General", "Enable Loader Changes", true, "Toggle Loader changes on/off"); if (enableAccelerationChanges.Value) { arti.GetComponent<CharacterBody>().baseAcceleration = 80f; mult.GetComponent<CharacterBody>().baseAcceleration = 80f; } if (enableCommandoChanges.Value) { new CommandoChanges(); } if (enableHuntressChanges.Value) { new HuntressChanges(); } if (enableBanditChanges.Value) { new BanditChanges(); } if (enableEngineerChanges.Value) { new EngineerChanges(); } if (enableMercChanges.Value) { new MercenaryChanges(); } if (enableREXChanges.Value) { new REXChanges(); } if (enableRunnerChanges.Value) { new RailgunnerChanges(); } if (enableCaptainChanges.Value) { new CaptainChanges(); } if (enableVoidFiendChanges.Value) { new VoidFiendChanges(); } if (enableLoaderChanges.Value) { new LoaderChanges(); } } public static void ChangeEntityStateValue(string entityStateConfiguration, string fieldName, string newValue) { //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) EntityStateConfiguration val = Addressables.LoadAssetAsync<EntityStateConfiguration>((object)entityStateConfiguration).WaitForCompletion(); for (int i = 0; i < val.serializedFieldsCollection.serializedFields.Length; i++) { if (val.serializedFieldsCollection.serializedFields[i].fieldName == fieldName) { val.serializedFieldsCollection.serializedFields[i].fieldValue.stringValue = newValue; } } } public static void ChangeEntityStateValueO(string entityStateConfiguration, string fieldName, Object newValue) { //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) EntityStateConfiguration val = Addressables.LoadAssetAsync<EntityStateConfiguration>((object)entityStateConfiguration).WaitForCompletion(); for (int i = 0; i < val.serializedFieldsCollection.serializedFields.Length; i++) { if (val.serializedFieldsCollection.serializedFields[i].fieldName == fieldName) { val.serializedFieldsCollection.serializedFields[i].fieldValue.objectValue = newValue; } } } } } namespace SurvivorsPlus.VoidFiend { public class VoidFiendChanges { public VoidFiendChanges() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Expected O, but got Unknown //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Expected O, but got Unknown //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Expected O, but got Unknown //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Expected O, but got Unknown RecalculateStatsAPI.GetStatCoefficients += new StatHookEventHandler(RecalculateStatsAPI_GetStatCoefficients); VoidSurvivorController.OnEnable += new hook_OnEnable(ChangeValues); GlobalEventManager.OnCharacterDeath += new hook_OnCharacterDeath(ExtraCorruptionOnKill); CorruptionTransitionBase.OnEnter += new hook_OnEnter(ReduceCorruptionAnim); } private void RecalculateStatsAPI_GetStatCoefficients(CharacterBody sender, StatHookEventArgs args) { if (Object.op_Implicit((Object)(object)sender) && sender.HasBuff(Buffs.VoidSurvivorCorruptMode)) { args.armorAdd -= 100f; } } private void ReduceCorruptionAnim(orig_OnEnter orig, CorruptionTransitionBase self) { if (self is EnterCorruptionTransition) { self.duration = 0.75f; } orig.Invoke(self); } private void ChangeValues(orig_OnEnable orig, VoidSurvivorController self) { self.corruptionPerCrit = 0f; self.corruptionForFullHeal = 0f; self.corruptionFractionPerSecondWhileCorrupted = -1f / 30f; self.corruptionPerSecondInCombat = 1f; self.corruptionPerSecondOutOfCombat = 0f; self.corruptionForFullDamage = 0f; orig.Invoke(self); } private void ExtraCorruptionOnKill(orig_OnCharacterDeath orig, GlobalEventManager self, DamageReport damageReport) { orig.Invoke(self, damageReport); if (Object.op_Implicit((Object)(object)damageReport.attackerBody) && Object.op_Implicit((Object)(object)((Component)damageReport.attackerBody).GetComponent<VoidSurvivorController>()) && !damageReport.attackerBody.HasBuff(Buffs.VoidSurvivorCorruptMode)) { ((Component)damageReport.attackerBody).GetComponent<VoidSurvivorController>().AddCorruption(2f); } } } } namespace SurvivorsPlus.REX { public class REXChanges { public static GameObject syringe = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Treebot/SyringeProjectile.prefab").WaitForCompletion(); public REXChanges() { syringe.GetComponent<ProjectileController>().procCoefficient = 0.8f; } } } namespace SurvivorsPlus.Railgunner { public class RailgunnerChanges { private GameObject railgunner = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/Railgunner/RailgunnerBody.prefab").WaitForCompletion(); private GameObject polarMine = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/Railgunner/RailgunnerMineAltDetonated.prefab").WaitForCompletion(); private SkillDef badPrimary = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/DLC1/Railgunner/RailgunnerBodyFirePistol.asset").WaitForCompletion(); private SkillDef snipeLight = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/DLC1/Railgunner/RailgunnerBodyFireSnipeLight.asset").WaitForCompletion(); private SkillDef snipeHeavy = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/DLC1/Railgunner/RailgunnerBodyScopeHeavy.asset").WaitForCompletion(); private SkillFamily utilityFamily = Addressables.LoadAssetAsync<SkillFamily>((object)"RoR2/DLC1/Railgunner/RailgunnerBodyUtilityFamily.asset").WaitForCompletion(); private SkillFamily specialFamily = Addressables.LoadAssetAsync<SkillFamily>((object)"RoR2/DLC1/Railgunner/RailgunnerBodySpecialFamily.asset").WaitForCompletion(); public RailgunnerChanges() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0096: 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_025a: Unknown result type (might be due to invalid IL or missing references) //IL_0264: Expected O, but got Unknown //IL_026b: Unknown result type (might be due to invalid IL or missing references) //IL_0275: Expected O, but got Unknown //IL_027c: Unknown result type (might be due to invalid IL or missing references) //IL_0286: Expected O, but got Unknown //IL_028d: Unknown result type (might be due to invalid IL or missing references) //IL_0297: Expected O, but got Unknown //IL_029e: Unknown result type (might be due to invalid IL or missing references) //IL_02a8: Expected O, but got Unknown //IL_02af: Unknown result type (might be due to invalid IL or missing references) //IL_02b9: Expected O, but got Unknown SurvivorsPlus.ChangeEntityStateValue("RoR2/DLC1/Railgunner/EntityStates.Railgunner.Backpack.Offline.asset", "baseDuration", "5"); SurvivorsPlus.ChangeEntityStateValue("RoR2/DLC1/Railgunner/EntityStates.Railgunner.Weapon.FireSnipeLight.asset", "critDamageMultiplier", "0"); SurvivorsPlus.ChangeEntityStateValue("RoR2/DLC1/Railgunner/EntityStates.Railgunner.Weapon.FireSnipeLight.asset", "damageCoefficient", "3"); SurvivorsPlus.ChangeEntityStateValue("RoR2/DLC1/Railgunner/EntityStates.Railgunner.Weapon.FireSnipeHeavy.asset", "damageCoefficient", "6"); SurvivorsPlus.ChangeEntityStateValue("RoR2/DLC1/Railgunner/EntityStates.Railgunner.Weapon.FireSnipeSuper.asset", "damageCoefficient", "24"); SurvivorsPlus.ChangeEntityStateValue("RoR2/DLC1/Railgunner/EntityStates.Railgunner.Weapon.FireSnipeCryo.asset", "damageCoefficient", "12"); railgunner.AddComponent<WeakspotController>(); polarMine.GetComponent<SlowDownProjectiles>().slowDownCoefficient = 0.01f; SkillLocator component = railgunner.GetComponent<SkillLocator>(); GenericSkill[] components = railgunner.GetComponents<GenericSkill>(); foreach (GenericSkill val in components) { if (!val.skillName.Contains("Passive")) { Object.Destroy((Object)(object)val); } } FamilyChanges(); component.primary.skillFamily.variants[0].skillDef.skillNameToken = "HH44 Rounds"; component.primary.skillFamily.variants[0].skillDef.skillDescriptionToken = "Fire a light projectile for <style=cIsDamage>300% damage</style>."; component.secondary.skillFamily.variants[0].skillDef.skillDescriptionToken = "Activate your <style=cIsUtility>long-range scope</style>, highlighting <style=cIsDamage>Weak Points</style> and transforming your weapon into a piercing <style=cIsDamage>600% damage</style> railgun."; component.special.skillFamily.variants[0].skillDef.skillDescriptionToken = "Fire a <style=cIsDamage>piercing</style> round for <style=cIsDamage>2400% damage</style> and <style=cIsDamage>150% Weak Point damage</style>. Afterwards, <style=cIsHealth>all your weapons are disabled</style> for <style=cIsHealth>5</style> seconds."; component.special.skillFamily.variants[1].skillDef.skillDescriptionToken = "<style=cIsUtility>Freezing</style>. Fire <style=cIsDamage>piercing</style> round for <style=cIsDamage>1200% damage</style>."; CharacterBody.RecalculateStats += new Manipulator(DoubleLope); CharacterBody.RecalculateStats += new Manipulator(DoubleCritMultiplier); BaseFireSnipe.OnEnter += new hook_OnEnter(AddReload); BaseFireSnipe.ModifyBullet += new hook_ModifyBullet(AlterBullet); HurtBox.OnEnable += new hook_OnEnable(ReduceWeakpointSize); Boosted.OnEnter += new hook_OnEnter(ReduceBoostBonus); } private void ReduceBoostBonus(orig_OnEnter orig, Boosted self) { self.bonusDamageCoefficient = 1.5f; orig.Invoke(self); } private void ReduceWeakpointSize(orig_OnEnable orig, HurtBox self) { orig.Invoke(self); HurtBox.sniperTargetRadius = 0.75f; } private void DoubleLope(ILContext il) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_005a: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); val.GotoNext((MoveType)2, new Func<Instruction, bool>[2] { (Instruction x) => ILPatternMatchingExt.MatchLdcR4(x, 2f), (Instruction x) => ILPatternMatchingExt.MatchLdcR4(x, 1f) }); val.Emit(OpCodes.Ldarg_0); val.EmitDelegate<Func<float, CharacterBody, float>>((Func<float, CharacterBody, float>)((float num, CharacterBody body) => (Object.op_Implicit((Object)(object)body.inventory) && body.inventory.GetItemCount(Items.ConvertCritChanceToCritDamage) > 0) ? 2f : num)); } private void DoubleCritMultiplier(ILContext il) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown ILCursor val = new ILCursor(il); int num = default(int); val.GotoNext((MoveType)0, new Func<Instruction, bool>[3] { (Instruction x) => ILPatternMatchingExt.MatchCall<CharacterBody>(x, "get_critMultiplier"), (Instruction x) => ILPatternMatchingExt.MatchLdloc(x, ref num), (Instruction x) => ILPatternMatchingExt.MatchLdcR4(x, 0.01f) }); val.Index += 2; val.Next.Operand = 0.02f; } private void AddReload(orig_OnEnter orig, BaseFireSnipe self) { if (self is FireSnipeLight) { self.useSecondaryStocks = true; self.queueReload = true; } orig.Invoke(self); } private void AlterBullet(orig_ModifyBullet orig, BaseFireSnipe self, BulletAttack bulletAttack) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) if (self is FireSnipeLight) { bulletAttack.sniper = true; bulletAttack.falloffModel = (FalloffModel)0; EntityStateMachine val = EntityStateMachine.FindByCustomName(((EntityState)self).gameObject, "Reload"); if (Object.op_Implicit((Object)(object)val)) { EntityState state = val.state; Boosted val2 = (Boosted)(object)((state is Boosted) ? state : null); if (val2 != null) { bulletAttack.damage += val2.GetBonusDamage() / 2f; val2.ConsumeBoost(self.queueReload); } else if (self.queueReload) { EntityState state2 = val.state; Waiting val3 = (Waiting)(object)((state2 is Waiting) ? state2 : null); if (val3 != null) { val3.QueueReload(); } } } EntityStateMachine val4 = EntityStateMachine.FindByCustomName(((EntityState)self).gameObject, "Backpack"); EntityState val5 = self.InstantiateBackpackState(); if (Object.op_Implicit((Object)(object)val4) && val5 != null) { val4.SetNextState(val5); } } else { orig.Invoke(self, bulletAttack); } } private void FamilyChanges() { //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0052: 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_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0072: 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_00da: 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) SkillLocator component = railgunner.GetComponent<SkillLocator>(); GenericSkill val = railgunner.AddComponent<GenericSkill>(); val.skillName = "RailgunnerPrimary"; SkillFamily val2 = ScriptableObject.CreateInstance<SkillFamily>(); ((Object)val2).name = "RailgunnerPrimaryFamily"; val2.variants = (Variant[])(object)new Variant[2] { new Variant { skillDef = snipeLight }, new Variant { skillDef = badPrimary } }; val._skillFamily = val2; ContentAddition.AddSkillFamily(val2); component.primary = val; GenericSkill val3 = railgunner.AddComponent<GenericSkill>(); val.skillName = "RailgunnerSecondary"; SkillFamily val4 = ScriptableObject.CreateInstance<SkillFamily>(); ((Object)val4).name = "RailgunnerSecondaryFamily"; val4.variants = (Variant[])(object)new Variant[1] { new Variant { skillDef = snipeHeavy } }; val3._skillFamily = val4; ContentAddition.AddSkillFamily(val4); component.secondary = val3; GenericSkill val5 = railgunner.AddComponent<GenericSkill>(); val5.skillName = "RailgunnerUtility"; val5._skillFamily = utilityFamily; component.utility = val5; GenericSkill val6 = railgunner.AddComponent<GenericSkill>(); val6.skillName = "RailgunnerSpecial"; val6._skillFamily = specialFamily; component.special = val6; } } public class WeakspotController : MonoBehaviour { public GameObject scopeOverlayPrefab = ((Component)Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/Railgunner/RailgunnerScopeHeavyOverlay.prefab").WaitForCompletion().transform.GetChild(0)).gameObject; private OverlayController overlayController; public void Start() { //IL_0009: 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) overlayController = HudOverlayManager.AddOverlay(((Component)this).gameObject, new OverlayCreationParams { prefab = scopeOverlayPrefab, childLocatorEntry = "ScopeContainer" }); } public void OnDisable() { RemoveOverlay(0f); } protected void RemoveOverlay(float transitionDuration) { if (overlayController != null) { HudOverlayManager.RemoveOverlay(overlayController); overlayController = null; } } } } namespace SurvivorsPlus.Mercenary { public class EvisDashNux : BaseState { private Transform modelTransform; public static GameObject blinkPrefab; private float stopwatch; private Vector3 dashVector = Vector3.zero; public static float smallHopVelocity; public static float dashPrepDuration; public static float dashDuration = 0.3f; public static float speedCoefficient = 25f; public static string beginSoundString; public static string endSoundString; public static float overlapSphereRadius; public static float lollypopFactor; private Animator animator; private CharacterModel characterModel; private HurtBoxGroup hurtboxGroup; private bool isDashing; private AimRequest aimRequest; public override void OnEnter() { //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_00d3: Unknown result type (might be due to invalid IL or missing references) ((BaseState)this).OnEnter(); Util.PlaySound(EvisDash.beginSoundString, ((EntityState)this).gameObject); modelTransform = ((EntityState)this).GetModelTransform(); if (Object.op_Implicit((Object)(object)((EntityState)this).cameraTargetParams)) { aimRequest = ((EntityState)this).cameraTargetParams.RequestAimType((AimType)2); } if (Object.op_Implicit((Object)(object)modelTransform)) { animator = ((Component)modelTransform).GetComponent<Animator>(); characterModel = ((Component)modelTransform).GetComponent<CharacterModel>(); } if (((EntityState)this).isAuthority) { ((BaseState)this).SmallHop(((EntityState)this).characterMotor, EvisDash.smallHopVelocity); } if (NetworkServer.active) { ((EntityState)this).characterBody.AddBuff(Buffs.HiddenInvincibility); } ((EntityState)this).PlayAnimation("FullBody, Override", "EvisPrep", "EvisPrep.playbackRate", EvisDash.dashPrepDuration); dashVector = ((EntityState)this).inputBank.aimDirection; ((EntityState)this).characterDirection.forward = dashVector; } private void CreateBlinkEffect(Vector3 origin) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000c: 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) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Expected O, but got Unknown EffectManager.SpawnEffect(EvisDash.blinkPrefab, new EffectData { rotation = Util.QuaternionSafeLookRotation(dashVector), origin = origin }, false); } public override void FixedUpdate() { //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_01d6: Unknown result type (might be due to invalid IL or missing references) //IL_0199: Unknown result type (might be due to invalid IL or missing references) //IL_019f: Unknown result type (might be due to invalid IL or missing references) //IL_01b6: Unknown result type (might be due to invalid IL or missing references) //IL_01bb: Unknown result type (might be due to invalid IL or missing references) //IL_01c0: Unknown result type (might be due to invalid IL or missing references) //IL_0201: Unknown result type (might be due to invalid IL or missing references) ((EntityState)this).FixedUpdate(); stopwatch += Time.fixedDeltaTime; if ((double)stopwatch > (double)EvisDash.dashPrepDuration && !isDashing) { isDashing = true; dashVector = ((EntityState)this).inputBank.aimDirection; CreateBlinkEffect(Util.GetCorePosition(((EntityState)this).gameObject)); ((EntityState)this).PlayCrossfade("FullBody, Override", "EvisLoop", 0.1f); if (Object.op_Implicit((Object)(object)modelTransform)) { TemporaryOverlay obj = ((Component)modelTransform).gameObject.AddComponent<TemporaryOverlay>(); obj.duration = 0.6f; obj.animateShaderAlpha = true; obj.alphaCurve = AnimationCurve.EaseInOut(0f, 1f, 1f, 0f); obj.destroyComponentOnEnd = true; obj.originalMaterial = LegacyResourcesAPI.Load<Material>("Materials/matHuntressFlashBright"); obj.AddToCharacerModel(((Component)modelTransform).GetComponent<CharacterModel>()); TemporaryOverlay obj2 = ((Component)modelTransform).gameObject.AddComponent<TemporaryOverlay>(); obj2.duration = 0.7f; obj2.animateShaderAlpha = true; obj2.alphaCurve = AnimationCurve.EaseInOut(0f, 1f, 1f, 0f); obj2.destroyComponentOnEnd = true; obj2.originalMaterial = LegacyResourcesAPI.Load<Material>("Materials/matHuntressFlashExpanded"); obj2.AddToCharacerModel(((Component)modelTransform).GetComponent<CharacterModel>()); } } bool flag = (double)stopwatch >= (double)EvisDash.dashDuration + (double)EvisDash.dashPrepDuration; if (isDashing) { if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor) && Object.op_Implicit((Object)(object)((EntityState)this).characterDirection)) { CharacterMotor characterMotor = ((EntityState)this).characterMotor; characterMotor.rootMotion += dashVector * (base.moveSpeedStat * EvisDash.speedCoefficient * Time.fixedDeltaTime); } if (((EntityState)this).isAuthority) { Collider[] array = Physics.OverlapSphere(((EntityState)this).transform.position, ((EntityState)this).characterBody.radius + EvisDash.overlapSphereRadius * (flag ? EvisDash.lollypopFactor : 1f), LayerMask.op_Implicit(((LayerIndex)(ref LayerIndex.entityPrecise)).mask)); for (int i = 0; i < array.Length; i++) { HurtBox component = ((Component)array[i]).GetComponent<HurtBox>(); if (Object.op_Implicit((Object)(object)component) && (Object)(object)component.healthComponent != (Object)(object)((EntityState)this).healthComponent) { ((EntityState)this).outer.SetNextState((EntityState)(object)new EvisNux()); return; } } } } if (flag && ((EntityState)this).isAuthority) { ((EntityState)this).outer.SetNextStateToMain(); } } public override void OnExit() { //IL_0018: 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_0027: Unknown result type (might be due to invalid IL or missing references) Util.PlaySound(EvisDash.endSoundString, ((EntityState)this).gameObject); CharacterMotor characterMotor = ((EntityState)this).characterMotor; characterMotor.velocity *= 0.1f; ((BaseState)this).SmallHop(((EntityState)this).characterMotor, EvisDash.smallHopVelocity); AimRequest obj = aimRequest; if (obj != null) { obj.Dispose(); } ((EntityState)this).PlayAnimation("FullBody, Override", "EvisLoopExit"); if (NetworkServer.active) { ((EntityState)this).characterBody.RemoveBuff(Buffs.HiddenInvincibility); } ((EntityState)this).OnExit(); } } public class EvisNux : BaseState { private Transform modelTransform; public static GameObject blinkPrefab; public static float duration = 2f; public static float damageCoefficient; public static float damageFrequency; public static float procCoefficient; public static string beginSoundString; public static string endSoundString; public static float maxRadius; public static GameObject hitEffectPrefab; public static string slashSoundString; public static string impactSoundString; public static string dashSoundString; public static float slashPitch; public static float smallHopVelocity; public static float lingeringInvincibilityDuration; private CharacterModel characterModel; private float stopwatch; private float attackStopwatch; private bool crit; private static float minimumDuration = 0.5f; private AimRequest aimRequest; private int hitCount; public override void OnEnter() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) ((BaseState)this).OnEnter(); CreateBlinkEffect(Util.GetCorePosition(((EntityState)this).gameObject)); Util.PlayAttackSpeedSound(Evis.beginSoundString, ((EntityState)this).gameObject, 1.2f); crit = Util.CheckRoll(base.critStat, ((EntityState)this).characterBody.master); modelTransform = ((EntityState)this).GetModelTransform(); if (Object.op_Implicit((Object)(object)modelTransform)) { characterModel = ((Component)modelTransform).GetComponent<CharacterModel>(); } if (Object.op_Implicit((Object)(object)characterModel)) { CharacterModel obj = characterModel; obj.invisibilityCount++; } if (Object.op_Implicit((Object)(object)((EntityState)this).cameraTargetParams)) { aimRequest = ((EntityState)this).cameraTargetParams.RequestAimType((AimType)2); } if (NetworkServer.active) { ((EntityState)this).characterBody.AddBuff(Buffs.HiddenInvincibility); } } public override void FixedUpdate() { //IL_0274: Unknown result type (might be due to invalid IL or missing references) //IL_0279: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_0119: Unknown result type (might be due to invalid IL or missing references) //IL_0194: Unknown result type (might be due to invalid IL or missing references) //IL_019b: Expected O, but got Unknown //IL_01cf: Unknown result type (might be due to invalid IL or missing references) //IL_01d4: Unknown result type (might be due to invalid IL or missing references) //IL_01f2: Unknown result type (might be due to invalid IL or missing references) //IL_01fc: 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) ((EntityState)this).FixedUpdate(); stopwatch += Time.fixedDeltaTime; attackStopwatch += Time.fixedDeltaTime; float num = 1f / Evis.damageFrequency / base.attackSpeedStat; if ((double)attackStopwatch >= (double)num) { hitCount++; attackStopwatch -= num; HurtBox val = SearchForTarget(); if (Object.op_Implicit((Object)(object)val)) { Util.PlayAttackSpeedSound(Evis.slashSoundString, ((EntityState)this).gameObject, Evis.slashPitch); Util.PlaySound(Evis.dashSoundString, ((EntityState)this).gameObject); Util.PlaySound(Evis.impactSoundString, ((EntityState)this).gameObject); HurtBoxGroup hurtBoxGroup = val.hurtBoxGroup; HurtBox val2 = hurtBoxGroup.hurtBoxes[Random.Range(0, hurtBoxGroup.hurtBoxes.Length - 1)]; if (Object.op_Implicit((Object)(object)val2)) { Vector3 position = ((Component)val2).transform.position; Vector2 insideUnitCircle = Random.insideUnitCircle; Vector2 normalized = ((Vector2)(ref insideUnitCircle)).normalized; Vector3 val3 = default(Vector3); ((Vector3)(ref val3))..ctor(normalized.x, 0f, normalized.y); EffectManager.SimpleImpactEffect(Evis.hitEffectPrefab, position, val3, false); Transform transform = ((Component)val.hurtBoxGroup).transform; TemporaryOverlay obj = ((Component)transform).gameObject.AddComponent<TemporaryOverlay>(); obj.duration = num; obj.animateShaderAlpha = true; obj.alphaCurve = AnimationCurve.EaseInOut(0f, 1f, 1f, 0f); obj.destroyComponentOnEnd = true; obj.originalMaterial = LegacyResourcesAPI.Load<Material>("Materials/matMercEvisTarget"); obj.AddToCharacerModel(((Component)transform).GetComponent<CharacterModel>()); if (NetworkServer.active) { DamageInfo val4 = new DamageInfo(); val4.damage = 1.5f * base.damageStat; val4.attacker = ((EntityState)this).gameObject; val4.procCoefficient = Evis.procCoefficient; val4.position = ((Component)val2).transform.position; val4.crit = crit; if (hitCount == 7) { val4.damageType = (DamageType)(val4.damageType | 0x800000); } val2.healthComponent.TakeDamage(val4); GlobalEventManager.instance.OnHitEnemy(val4, ((Component)val2.healthComponent).gameObject); GlobalEventManager.instance.OnHitAll(val4, ((Component)val2.healthComponent).gameObject); } } } else if (((EntityState)this).isAuthority && (double)stopwatch > (double)Evis.minimumDuration) { ((EntityState)this).outer.SetNextStateToMain(); } } if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor)) { ((EntityState)this).characterMotor.velocity = Vector3.zero; } if (!((double)stopwatch < (double)Evis.duration) && ((EntityState)this).isAuthority) { ((EntityState)this).outer.SetNextStateToMain(); } } private HurtBox SearchForTarget() { //IL_0000: 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) //IL_000c: 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) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) BullseyeSearch val = new BullseyeSearch { searchOrigin = ((EntityState)this).transform.position, searchDirection = Random.onUnitSphere, maxDistanceFilter = Evis.maxRadius, teamMaskFilter = TeamMask.GetUnprotectedTeams(((BaseState)this).GetTeam()), sortMode = (SortMode)1 }; val.RefreshCandidates(); val.FilterOutGameObject(((EntityState)this).gameObject); return val.GetResults().FirstOrDefault(); } private void CreateBlinkEffect(Vector3 origin) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Expected O, but got Unknown EffectManager.SpawnEffect(Evis.blinkPrefab, new EffectData { rotation = Util.QuaternionSafeLookRotation(Vector3.up), origin = origin }, false); } public override void OnExit() { //IL_0018: Unknown result type (might be due to invalid IL or missing references) Util.PlaySound(Evis.endSoundString, ((EntityState)this).gameObject); CreateBlinkEffect(Util.GetCorePosition(((EntityState)this).gameObject)); modelTransform = ((EntityState)this).GetModelTransform(); if (Object.op_Implicit((Object)(object)modelTransform)) { TemporaryOverlay obj = ((Component)modelTransform).gameObject.AddComponent<TemporaryOverlay>(); obj.duration = 0.6f; obj.animateShaderAlpha = true; obj.alphaCurve = AnimationCurve.EaseInOut(0f, 1f, 1f, 0f); obj.destroyComponentOnEnd = true; obj.originalMaterial = LegacyResourcesAPI.Load<Material>("Materials/matMercEvisTarget"); obj.AddToCharacerModel(((Component)modelTransform).GetComponent<CharacterModel>()); TemporaryOverlay obj2 = ((Component)modelTransform).gameObject.AddComponent<TemporaryOverlay>(); obj2.duration = 0.7f; obj2.animateShaderAlpha = true; obj2.alphaCurve = AnimationCurve.EaseInOut(0f, 1f, 1f, 0f); obj2.destroyComponentOnEnd = true; obj2.originalMaterial = LegacyResourcesAPI.Load<Material>("Materials/matHuntressFlashExpanded"); obj2.AddToCharacerModel(((Component)modelTransform).GetComponent<CharacterModel>()); } if (Object.op_Implicit((Object)(object)characterModel)) { CharacterModel obj3 = characterModel; obj3.invisibilityCount--; } AimRequest obj4 = aimRequest; if (obj4 != null) { obj4.Dispose(); } if (NetworkServer.active) { ((EntityState)this).characterBody.RemoveBuff(Buffs.HiddenInvincibility); ((EntityState)this).characterBody.AddTimedBuff(Buffs.HiddenInvincibility, Evis.lingeringInvincibilityDuration); } Util.PlaySound(Evis.endSoundString, ((EntityState)this).gameObject); ((BaseState)this).SmallHop(((EntityState)this).characterMotor, Evis.smallHopVelocity); ((EntityState)this).OnExit(); } } public class MercenaryChanges { private GameObject merc = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Merc/MercBody.prefab").WaitForCompletion(); private GameObject evisOverlapProjectile = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Merc/EvisOverlapProjectile.prefab").WaitForCompletion(); public MercenaryChanges() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_013c: 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) Object.Destroy((Object)(object)evisOverlapProjectile.GetComponent<DelayedEvent>()); bool flag = default(bool); ContentAddition.AddEntityState<EvisDashNux>(ref flag); ContentAddition.AddEntityState<EvisNux>(ref flag); SurvivorsPlus.ChangeEntityStateValue("RoR2/Base/Merc/EntityStates.Merc.Assaulter2.asset", "damageCoefficient", "4"); SurvivorsPlus.ChangeEntityStateValue("RoR2/Base/Merc/EntityStates.Merc.FocusedAssaultDash.asset", "delayedDamageCoefficient", "8"); CharacterBody component = merc.GetComponent<CharacterBody>(); component.baseRegen = 2.5f; component.levelRegen = 0.5f; SkillLocator component2 = merc.GetComponent<SkillLocator>(); component2.utility.skillFamily.variants[0].skillDef.skillDescriptionToken = "<style=cIsDamage>Stunning</style>. Dash forward, dealing <style=cIsDamage>400% damage</style>. If you hit an enemy, <style=cIsDamage>you can dash again</style>, up to <style=cIsDamage>3</style> total."; component2.utility.skillFamily.variants[1].skillDef.skillDescriptionToken = "<style=cIsDamage>Stunning</style>. Dash forward, dealing <style=cIsDamage>800% damage</style> and <style=cIsUtility>Exposing</style> enemies after<style=cIsUtility> 1 second</style>."; component2.special.skillFamily.variants[0].skillDef.skillDescriptionToken = "Target a nearby enemy, attacking them for <style=cIsDamage>150% damage</style> repeatedly. <style=cIsUtility>Exposing</style> on the final hit. <style=cIsUtility>You cannot be hit for the duration</style>."; component2.special.skillFamily.variants[0].skillDef.activationState = new SerializableEntityStateType(typeof(EvisDashNux)); } } } namespace SurvivorsPlus.Loader { public class LoaderChanges { private GameObject loader = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Loader/LoaderBody.prefab").WaitForCompletion(); public LoaderChanges() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) CharacterBody component = loader.GetComponent<CharacterBody>(); component.baseMaxHealth = 110f; component.levelMaxHealth = 33f; component.baseArmor = 10f; } } } namespace SurvivorsPlus.Huntress { public class HuntressChanges { public ModdedDamageType huntressSlow; private GameObject arrowRainProjectile = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Huntress/HuntressArrowRain.prefab").WaitForCompletion(); private GameObject huntress = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Huntress/HuntressBody.prefab").WaitForCompletion(); public HuntressChanges() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_0170: Unknown result type (might be due to invalid IL or missing references) //IL_017a: Expected O, but got Unknown //IL_0181: Unknown result type (might be due to invalid IL or missing references) //IL_018b: Expected O, but got Unknown huntressSlow = DamageAPI.ReserveDamageType(); SurvivorsPlus.ChangeEntityStateValue("RoR2/Base/Huntress/EntityStates.Huntress.HuntressWeapon.FireFlurrySeekingArrow.asset", "orbProcCoefficient", "0.8"); SurvivorsPlus.ChangeEntityStateValue("RoR2/Base/Huntress/EntityStates.Huntress.HuntressWeapon.FireFlurrySeekingArrow.asset", "baseDuration", "1"); SurvivorsPlus.ChangeEntityStateValue("RoR2/Base/Huntress/EntityStates.Huntress.ArrowRain.asset", "damageCoefficient", "6"); arrowRainProjectile.GetComponent<ProjectileDotZone>().overlapProcCoefficient = 0.6f; arrowRainProjectile.GetComponent<ProjectileDamage>().damageType = (DamageType)0; arrowRainProjectile.AddComponent<ModdedDamageTypeHolderComponent>().Add(huntressSlow); SkillLocator component = huntress.GetComponent<SkillLocator>(); component.utility.skillFamily.variants[0].skillDef.baseRechargeInterval = 6f; SkillDef skillDef = component.utility.skillFamily.variants[1].skillDef; skillDef.baseMaxStock = 1; skillDef.baseRechargeInterval = 3f; skillDef.skillDescriptionToken = "<style=cIsUtility>Agile</style>. <style=cIsUtility>Disappear</style> and <style=cIsUtility>teleport</style> a short distance."; component.secondary.skillFamily.variants[0].skillDef.skillDescriptionToken = "Throw a seeking glaive that bounces up to <style=cIsDamage>6</style> times for <style=cIsDamage>400%</style> damage."; component.special.skillFamily.variants[0].skillDef.skillDescriptionToken = "<style=cIsUtility>Teleport</style> into the sky. Target an area to rain arrows, <style=cIsUtility>slowing</style> all enemies and dealing <style=cIsDamage>450% damage per second</style>."; HealthComponent.SendDamageDealt += new hook_SendDamageDealt(ApplyNewDamageType); ArrowRain.UpdateAreaIndicator += new hook_UpdateAreaIndicator(ChangeAimLayer); } private void ApplyNewDamageType(orig_SendDamageDealt orig, DamageReport damageReport) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) if (DamageAPI.HasModdedDamageType(damageReport.damageInfo, huntressSlow) && Object.op_Implicit((Object)(object)damageReport.victimBody)) { damageReport.victimBody.AddTimedBuff(Buffs.Slow80, 1f); } orig.Invoke(damageReport); } private void ChangeAimLayer(orig_UpdateAreaIndicator orig, ArrowRain self) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_003c: 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) if (Object.op_Implicit((Object)(object)self.areaIndicatorInstance)) { float num = 1000f; RaycastHit val = default(RaycastHit); if (Physics.Raycast(((BaseState)self).GetAimRay(), ref val, num, LayerMask.op_Implicit(CommonMasks.bullet))) { self.areaIndicatorInstance.transform.position = ((RaycastHit)(ref val)).point; self.areaIndicatorInstance.transform.up = ((RaycastHit)(ref val)).normal; } } } } } namespace SurvivorsPlus.Engineer { public class BetterFireBeam : BaseState { public GameObject effectPrefab; public GameObject hitEffectPrefab = EngineerChanges.hitEffect; public GameObject laserPrefab = EngineerChanges.laser; public string muzzleString = "Muzzle"; public string attackSoundString = ""; public float damageCoefficient = 2f; public float procCoefficient = 3f; public float force; public float minSpread; public float maxSpread; public int bulletCount = 1; public float fireFrequency = 5f; public float maxDistance = 50f; private float fireTimer; private Ray laserRay; private Transform modelTransform; private GameObject laserEffectInstance; private Transform laserEffectInstanceEndTransform; public int bulletCountCurrent = 1; public override void OnEnter() { //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Unknown result type (might be due to invalid IL or missing references) ((BaseState)this).OnEnter(); fireTimer = 0f; modelTransform = ((EntityState)this).GetModelTransform(); if (!Object.op_Implicit((Object)(object)modelTransform)) { return; } ChildLocator component = ((Component)modelTransform).GetComponent<ChildLocator>(); if (!Object.op_Implicit((Object)(object)component)) { return; } Transform val = component.FindChild(muzzleString); if (Object.op_Implicit((Object)(object)val) && Object.op_Implicit((Object)(object)laserPrefab)) { if (((Component)val).transform.childCount > 0) { laserEffectInstance = ((Component)((Component)val).transform.GetChild(0)).gameObject; laserEffectInstanceEndTransform = laserEffectInstance.GetComponent<ChildLocator>().FindChild("LaserEnd"); } if (!Object.op_Implicit((Object)(object)laserEffectInstance)) { laserEffectInstance = Object.Instantiate<GameObject>(laserPrefab, val.position, val.rotation); laserEffectInstance.transform.parent = val; laserEffectInstanceEndTransform = laserEffectInstance.GetComponent<ChildLocator>().FindChild("LaserEnd"); } } } public override void FixedUpdate() { //IL_0008: 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_004e: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) ((EntityState)this).FixedUpdate(); laserRay = GetLaserRay(); fireTimer += Time.fixedDeltaTime; if ((double)fireTimer > (double)(1f / (fireFrequency * ((EntityState)this).characterBody.attackSpeed))) { FireBullet(modelTransform, laserRay, muzzleString); fireTimer = 0f; } if (Object.op_Implicit((Object)(object)laserEffectInstance) && Object.op_Implicit((Object)(object)laserEffectInstanceEndTransform)) { laserEffectInstanceEndTransform.position = GetBeamEndPoint(); } if (((EntityState)this).isAuthority && fireTimer == 0f) { ((EntityState)this).outer.SetNextState(GetNextState()); } } protected Vector3 GetBeamEndPoint() { //IL_000c: 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) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) Vector3 point = ((Ray)(ref laserRay)).GetPoint(maxDistance); GameObject gameObject = ((EntityState)this).gameObject; Ray val = laserRay; double num = maxDistance; LayerIndex val2 = LayerIndex.world; int num2 = LayerMask.op_Implicit(((LayerIndex)(ref val2)).mask); val2 = LayerIndex.entityPrecise; int num3 = LayerMask.op_Implicit(((LayerIndex)(ref val2)).mask); LayerMask val3 = LayerMask.op_Implicit(num2 | num3); RaycastHit val4 = default(RaycastHit); if (Util.CharacterRaycast(gameObject, val, ref val4, (float)num, val3, (QueryTriggerInteraction)0)) { point = ((RaycastHit)(ref val4)).point; } return point; } protected virtual EntityState GetNextState() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) return EntityStateCatalog.InstantiateState(((EntityState)this).outer.mainStateType); } public override InterruptPriority GetMinimumInterruptPriority() { return (InterruptPriority)1; } public virtual void ModifyBullet(BulletAttack bulletAttack) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) bulletAttack.damageType = (DamageType)(bulletAttack.damageType | 8); } public virtual bool ShouldFireLaser() { if (Object.op_Implicit((Object)(object)((EntityState)this).inputBank)) { return ((EntityState)this).inputBank.skill1.down; } return false; } public virtual Ray GetLaserRay() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return ((BaseState)this).GetAimRay(); } private void FireBullet(Transform modelTransform, Ray laserRay, string targetMuzzle) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Expected O, but got Unknown //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)effectPrefab)) { EffectManager.SimpleMuzzleFlash(effectPrefab, ((EntityState)this).gameObject, targetMuzzle, false); } if (((EntityState)this).isAuthority) { BulletAttack val = new BulletAttack(); val.owner = ((EntityState)this).gameObject; val.weapon = ((EntityState)this).gameObject; val.origin = ((Ray)(ref laserRay)).origin; val.aimVector = ((Ray)(ref laserRay)).direction; val.minSpread = minSpread; val.maxSpread = maxSpread; val.bulletCount = 1u; val.damage = damageCoefficient * base.damageStat / fireFrequency; val.procCoefficient = procCoefficient / fireFrequency; val.force = force; val.muzzleName = targetMuzzle; val.hitEffectPrefab = hitEffectPrefab; val.isCrit = Util.CheckRoll(base.critStat, ((EntityState)this).characterBody.master); val.HitEffectNormal = false; val.radius = 0f; val.maxDistance = maxDistance; ModifyBullet(val); val.Fire(); } } } public class EngineerChanges { public static GameObject hitEffect = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Common/VFX/Hitspark1.prefab").WaitForCompletion(); public static GameObject laser = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Engi/LaserEngiTurret.prefab").WaitForCompletion(); private GameObject engi = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Engi/EngiBody.prefab").WaitForCompletion(); private GameObject engiWalkerTurret = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Engi/EngiWalkerTurretBody.prefab").WaitForCompletion(); private GameObject engiWalkerTurretMaster = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Engi/EngiWalkerTurretMaster.prefab").WaitForCompletion(); public EngineerChanges() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_0119: Unknown result type (might be due to invalid IL or missing references) //IL_011e: Unknown result type (might be due to invalid IL or missing references) //IL_01d9: Unknown result type (might be due to invalid IL or missing references) //IL_01e3: Expected O, but got Unknown //IL_01ea: Unknown result type (might be due to invalid IL or missing references) //IL_01f4: Expected O, but got Unknown bool flag = default(bool); ContentAddition.AddEntityState<BetterFireBeam>(ref flag); SurvivorsPlus.ChangeEntityStateValue("RoR2/Base/Engi/EntityStates.EngiTurret.EngiTurretWeapon.FireBeam.asset", "maxDistance", "50"); SkillLocator component = engi.GetComponent<SkillLocator>(); SkillDef skillDef = component.primary.skillFamily.variants[0].skillDef; skillDef.skillDescriptionToken = "Fire <style=cIsDamage>3</style> grenades that deal <style=cIsDamage>100% damage</style> each."; skillDef.activationState = new SerializableEntityStateType(typeof(FireGrenades)); SkillDef skillDef2 = component.secondary.skillFamily.variants[0].skillDef; skillDef2.skillDescriptionToken = "Place a large blast radius mine that deals <style=cIsDamage>deal 600% damage</style> each. Can place up to 4."; skillDef2.baseRechargeInterval = 5f; engiWalkerTurret.AddComponent<TurretBeamRemover>(); engiWalkerTurret.GetComponent<SkillLocator>().primary.skillFamily.variants[0].skillDef.activationState = new SerializableEntityStateType(typeof(BetterFireBeam)); AISkillDriver[] array = (from x in engiWalkerTurretMaster.GetComponents<AISkillDriver>() where x.customName.Contains("ReturnToLeader") select x).ToArray(); foreach (AISkillDriver val in array) { if (val.maxDistance == 110f) { val.maxDistance = 55f; val.shouldSprint = true; } } AISkillDriver obj = (from x in engiWalkerTurretMaster.GetComponents<AISkillDriver>() where x.customName.Contains("ChaseAndFireAtEnemy") select x).First(); obj.maxDistance = 50f; obj.shouldSprint = true; BaseMineArmingState.OnEnter += new hook_OnEnter(BaseMineArmingState_OnEnter); FireGrenades.OnEnter += new hook_OnEnter(FireGrenades_OnEnter); } private void BaseMineArmingState_OnEnter(orig_OnEnter orig, BaseMineArmingState self) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Expected O, but got Unknown orig.Invoke(self); if (self is MineArmingFull) { self.damageScale = 2f; } if (self is MineArmingWeak) { ((EntityState)self).outer.SetState((EntityState)new MineArmingFull()); } } private void FireGrenades_OnEnter(orig_OnEnter orig, FireGrenades self) { FireGrenades.baseDuration = 1f; self.grenadeCountMax = 3; orig.Invoke(self); } } public class TurretBeamRemover : MonoBehaviour { private GameObject muzzle; private InputBankTest inputBank; private void Start() { muzzle = ((Component)((Component)((Component)this).GetComponent<CharacterBody>().modelLocator.modelTransform).GetComponent<ChildLocator>().FindChild("Muzzle")).gameObject; inputBank = ((Component)this).GetComponent<CharacterBody>().inputBank; } private void FixedUpdate() { if (muzzle.transform.childCount > 0 && !inputBank.skill1.down) { Object.Destroy((Object)(object)((Component)muzzle.transform.GetChild(0)).gameObject); } } } } namespace SurvivorsPlus.Commando { public class BetterSuppressiveFire : BaseState { public static GameObject effectPrefab = FireBarrage.effectPrefab; public static GameObject hitEffectPrefab = FireBarrage.hitEffectPrefab; public static GameObject tracerEffectPrefab = FireBarrage.tracerEffectPrefab; public static float damageCoefficient = 2f; public static float force = FireSweepBarrage.force; public static float minSpread = FireBarrage.minSpread; public static float maxSpread = FireBarrage.maxSpread; public static float baseDurationBetweenShots = 1f; public static float totalDuration = 2f; public static float bulletRadius = 1.5f; public static int baseBulletCount = FireBarrage.baseBulletCount; public static string fireBarrageSoundString = FireBarrage.fireBarrageSoundString; public static float recoilAmplitude = FireBarrage.recoilAmplitude; public static float spreadBloomValue = FireBarrage.spreadBloomValue; private int totalBulletsFired; private int bulletCount; public float stopwatchBetweenShots; private Animator modelAnimator; private Transform modelTransform; private float duration; private float durationBetweenShots; public override void OnEnter() { ((BaseState)this).OnEnter(); ((EntityState)this).characterBody.SetSpreadBloom(0.2f, false); durationBetweenShots = FireBarrage.baseDurationBetweenShots / base.attackSpeedStat; bulletCount = (int)((double)FireBarrage.baseBulletCount * (double)base.attackSpeedStat); duration = durationBetweenShots * (float)bulletCount; modelAnimator = ((EntityState)this).GetModelAnimator(); modelTransform = ((EntityState)this).GetModelTransform(); ((EntityState)this).PlayCrossfade("Gesture, Additive", "FireBarrage", "FireBarrage.playbackRate", duration, 0.2f); ((EntityState)this).PlayCrossfade("Gesture, Override", "FireBarrage", "FireBarrage.playbackRate", duration, 0.2f); if (Object.op_Implicit((Object)(object)((EntityState)this).characterBody)) { ((EntityState)this).characterBody.SetAimTimer(2f); } FireBullet(); } private void FireBullet() { //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_0085: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00af: 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_00bc: 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_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Unknown result type (might be due to invalid IL or missing references) //IL_0108: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_0136: 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_0148: Unknown result type (might be due to invalid IL or missing references) //IL_014a: Unknown result type (might be due to invalid IL or missing references) //IL_014f: Unknown result type (might be due to invalid IL or missing references) Ray aimRay = ((BaseState)this).GetAimRay(); string text = "MuzzleRight"; if (Object.op_Implicit((Object)(object)modelAnimator)) { if (Object.op_Implicit((Object)(object)effectPrefab)) { EffectManager.SimpleMuzzleFlash(effectPrefab, ((EntityState)this).gameObject, text, false); } ((EntityState)this).PlayAnimation("Gesture Additive, Right", "FirePistol, Right"); } ((BaseState)this).AddRecoil(-0.8f * recoilAmplitude, -1f * recoilAmplitude, -0.1f * recoilAmplitude, 0.15f * 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 = minSpread, maxSpread = maxSpread, bulletCount = 1u, falloffModel = (FalloffModel)0, damage = damageCoefficient * base.damageStat, force = force, tracerEffectPrefab = tracerEffectPrefab, muzzleName = text, hitEffectPrefab = hitEffectPrefab, isCrit = Util.CheckRoll(base.critStat, ((EntityState)this).characterBody.master), radius = bulletRadius, smartCollision = true, damageType = (DamageType)0, procCoefficient = 2f }.Fire(); } ((EntityState)this).characterBody.AddSpreadBloom(spreadBloomValue); totalBulletsFired++; Util.PlaySound(fireBarrageSoundString, ((EntityState)this).gameObject); } public override void OnExit() { ((EntityState)this).OnExit(); } public override void FixedUpdate() { ((EntityState)this).FixedUpdate(); stopwatchBetweenShots += Time.fixedDeltaTime; if ((double)stopwatchBetweenShots >= (double)durationBetweenShots && totalBulletsFired < bulletCount) { stopwatchBetweenShots -= durationBetweenShots; FireBullet(); } if (totalBulletsFired == bulletCount && ((EntityState)this).isAuthority) { ((EntityState)this).outer.SetNextStateToMain(); } } public override InterruptPriority GetMinimumInterruptPriority() { return (InterruptPriority)1; } } public class CommandoChanges { private GameObject commando = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Commando/CommandoBody.prefab").WaitForCompletion(); public CommandoChanges() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Expected O, but got Unknown //IL_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Expected O, but got Unknown //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_0116: Expected O, but got Unknown SkillLocator component = commando.GetComponent<SkillLocator>(); component.secondary.skillFamily.variants[1].skillDef.skillDescriptionToken = "Fire two close-range blasts that deal <style=cIsDamage>12x200% damage</style> total."; component.secondary.skillFamily.variants[0].skillDef.skillDescriptionToken = "Fire a <style=cIsUtility>piercing</style> bullet for <style=cIsDamage>400% damage</style>. Deals <style=cIsDamage>40%</style> more damage every time it passes through an enemy."; SkillDef skillDef = component.utility.skillFamily.variants[0].skillDef; skillDef.cancelSprintingOnActivation = false; skillDef.skillDescriptionToken = "<style=cIsUtility>Roll</style> forward a short distance. You are <style=cIsDamage>invincible</style> during the roll."; SkillDef skillDef2 = component.special.skillFamily.variants[0].skillDef; skillDef2.skillDescriptionToken = "Fire a barrage of high impact rounds that deal <style=cIsDamage>200% damage</style> with <style=cIsUtility>double the proc coefficient</style>."; skillDef2.activationState = new SerializableEntityStateType(typeof(BetterSuppressiveFire)); skillDef2.baseRechargeInterval = 6f; GenericProjectileBaseState.OnEnter += new hook_OnEnter(AlterFMJ); DodgeState.OnEnter += new hook_OnEnter(AddInvincibility); DodgeState.OnExit += new hook_OnExit(RemoveInvincibility); } private void AlterFMJ(orig_OnEnter orig, GenericProjectileBaseState self) { if (self is FireFMJ) { self.damageCoefficient = 4f; } orig.Invoke(self); } private void AddInvincibility(orig_OnEnter orig, DodgeState self) { self.initialSpeedCoefficient = 4f; self.finalSpeedCoefficient = 2f; ((EntityState)self).characterBody.AddBuff(Buffs.HiddenInvincibility); orig.Invoke(self); } private void RemoveInvincibility(orig_OnExit orig, DodgeState self) { orig.Invoke(self); ((EntityState)self).characterBody.RemoveBuff(Buffs.HiddenInvincibility); } } } namespace SurvivorsPlus.Captain { public class CaptainChanges { private GameObject captain = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Captain/CaptainBody.prefab").WaitForCompletion(); public CaptainChanges() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Expected O, but got Unknown captain.GetComponent<SkillLocator>().primary.skillFamily.variants[0].skillDef.activationState = new SerializableEntityStateType(typeof(FireCaptainShotgun)); DefenseMatrixOn.DeleteNearbyProjectile += new hook_DeleteNearbyProjectile(MicrobotEdit); } private void FamilyChanges() { SkillLocator component = captain.GetComponent<SkillLocator>(); GenericSkill val = captain.AddComponent<GenericSkill>(); val.skillName = "captainPrimary"; SkillFamily val2 = ScriptableObject.CreateInstance<SkillFamily>(); ((Object)val2).name = "captainPrimaryFamily"; val._skillFamily = val2; ContentAddition.AddSkillFamily(val2); component.primary = val; GenericSkill val3 = captain.AddComponent<GenericSkill>(); val.skillName = "captainSecondary"; SkillFamily val4 = ScriptableObject.CreateInstance<SkillFamily>(); ((Object)val4).name = "captainSecondaryFamily"; val3._skillFamily = val4; ContentAddition.AddSkillFamily(val4); component.secondary = val3; GenericSkill val5 = captain.AddComponent<GenericSkill>(); val5.skillName = "captainUtility"; component.utility = val5; GenericSkill val6 = captain.AddComponent<GenericSkill>(); val6.skillName = "captainSpecial"; component.special = val6; } private bool MicrobotEdit(orig_DeleteNearbyProjectile orig, DefenseMatrixOn self) { //IL_001a: 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_001f: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_0159: Unknown result type (might be due to invalid IL or missing references) //IL_015e: Unknown result type (might be due to invalid IL or missing references) //IL_0160: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_016f: Unknown result type (might be due to invalid IL or missing references) //IL_0174: Unknown result type (might be due to invalid IL or missing references) //IL_0175: Unknown result type (might be due to invalid IL or missing references) //IL_017c: Unknown result type (might be due to invalid IL or missing references) //IL_017d: Unknown result type (might be due to invalid IL or missing references) //IL_017f: Unknown result type (might be due to invalid IL or missing references) //IL_0186: Expected O, but got Unknown Vector3 val = (Object.op_Implicit((Object)(object)((BaseBodyAttachmentState)self).attachedBody) ? ((BaseBodyAttachmentState)self).attachedBody.corePosition : Vector3.zero); TeamIndex val2 = (TeamIndex)((!Object.op_Implicit((Object)(object)((BaseBodyAttachmentState)self).attachedBody)) ? (-1) : ((int)((BaseBodyAttachmentState)self).attachedBody.teamComponent.teamIndex)); float num = DefenseMatrixOn.projectileEraserRadius * DefenseMatrixOn.projectileEraserRadius; int num2 = 0; int itemStack = self.GetItemStack(); bool result = false; List<ProjectileController> instancesList = InstanceTracker.GetInstancesList<ProjectileController>(); List<ProjectileController> list = new List<ProjectileController>(); int i = 0; for (int count = instancesList.Count; i < count; i++) { if (num2 >= itemStack) { break; } ProjectileController val3 = instancesList[i]; if (val3.cannotBeDeleted || val3.teamFilter.teamIndex == val2) { continue; } Vector3 val4 = ((Component)val3).transform.position - val; if (((Vector3)(ref val4)).sqrMagnitude < num) { bool flag = true; ProjectileSimple component = ((Component)val3).gameObject.GetComponent<ProjectileSimple>(); ProjectileCharacterController component2 = ((Component)val3).gameObject.GetComponent<ProjectileCharacterController>(); if ((!Object.op_Implicit((Object)(object)component) || (Object.op_Implicit((Object)(object)component) && component.desiredForwardSpeed == 0f)) && !Object.op_Implicit((Object)(object)component2)) { flag = false; } if (flag) { list.Add(val3); num2++; } } } int j = 0; for (int count2 = list.Count; j < count2; j++) { ProjectileController val5 = list[j]; if (Object.op_Implicit((Object)(object)val5)) { result = true; Vector3 position = ((Component)val5).transform.position; Vector3 start = val; if (Object.op_Implicit((Object)(object)DefenseMatrixOn.tracerEffectPrefab)) { EffectData val6 = new EffectData { origin = position, start = start }; EffectManager.SpawnEffect(DefenseMatrixOn.tracerEffectPrefab, val6, true); } EntityState.Destroy((Object)(object)((Component)val5).gameObject); } } return result; } } } namespace SurvivorsPlus.Bandit { public class BanditChanges { public ModdedDamageType banditOpenWound; public ModdedDamageType banditDoubleHemorrhage; private GameObject lightsOutEffect = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Bandit2/Bandit2ResetEffect.prefab").WaitForCompletion(); private GameObject bandit = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Bandit2/Bandit2Body.prefab").WaitForCompletion(); private Material bloodMat = Addressables.LoadAssetAsync<Material>((object)"RoR2/Base/Common/VFX/matBloodHumanLarge.mat").WaitForCompletion(); private DotIndex emptyDotIdx; public BanditChanges() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_013d: Unknown result type (might be due to invalid IL or missing references) //IL_0142: Unknown result type (might be due to invalid IL or missing references) //IL_0148: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Unknown result type (might be due to invalid IL or missing references) //IL_0159: Unknown result type (might be due to invalid IL or missing references) //IL_015f: Expected O, but got Unknown //IL_016e: Unknown result type (might be due to invalid IL or missing references) //IL_0173: Unknown result type (might be due to invalid IL or missing references) //IL_017f: Unknown result type (might be due to invalid IL or missing references) //IL_0189: Expected O, but got Unknown //IL_0190: Unknown result type (might be due to invalid IL or missing references) //IL_019a: Expected O, but got Unknown //IL_01a1: Unknown result type (might be due to invalid IL or missing references) //IL_01ab: Expected O, but got Unknown //IL_01b2: Unknown result type (might be due to invalid IL or missing references) //IL_01bc: Expected O, but got Unknown //IL_01c3: Unknown result type (might be due to invalid IL or missing references) //IL_01cd: Expected O, but got Unknown ((Renderer)((Component)lightsOutEffect.transform.GetChild(0)).GetComponent<ParticleSystemRenderer>()).sharedMaterial = bloodMat; ((Renderer)((Component)lightsOutEffect.transform.GetChild(1)).GetComponent<ParticleSystemRenderer>()).sharedMaterial = bloodMat; ((Renderer)((Component)lightsOutEffect.transform.GetChild(2)).GetComponent<ParticleSystemRenderer>()).sharedMaterial = bloodMat; SkillLocator component = bandit.GetComponent<SkillLocator>(); component.utility.skillFamily.variants[0].skillDef.beginSkillCooldownOnSkillEnd = true; component.secondary.skillFamily.variants[0].skillDef.skillDescriptionToken = "Lunge and slash for <style=cIsDamage>360% damage</style>. Critical Strikes also cause <style=cIsHealth>2 Hemorrhage stacks</style>."; SkillDef skillDef = component.special.skillFamily.variants[0].skillDef; skillDef.skillNameToken = "Open Wound"; skillDef.skillDescriptionToken = "<style=cIsDamage>Slayer</style>. Fire a revolver shot for <style=cIsDamage>600% damage</style>. Clears all stacks of <style=cIsHealth>Hemorrhage, dealing remaining damage immediately</style>."; skillDef.baseRechargeInterval = 6f; banditDoubleHemorrhage = DamageAPI.ReserveDamageType(); banditOpenWound = DamageAPI.ReserveDamageType(); CustomDotBehaviour val = new CustomDotBehaviour(OpenWoundBehavior); emptyDotIdx = DotAPI.RegisterDotDef(0f, 0f, (DamageColorIndex)0, (BuffDef)null, val, (CustomDotVisual)null); HealthComponent.SendDamageDealt += new hook_SendDamageDealt(ApplyNewDamageTypes); FireShotgun2.FireBullet += new hook_FireBullet(ModifyFire); SlashBlade.AuthorityModifyOverlapAttack += new hook_AuthorityModifyOverlapAttack(IncreaseHemorrhageStacks); Bandit2FirePrimaryBase.OnEnter += new hook_OnEnter(ReduceRecoil); FireSidearmResetRevolver.ModifyBullet += new hook_ModifyBullet(AddOpenWound); } private void AddOpenWound(orig_ModifyBullet orig, FireSidearmResetRevolver self, BulletAttack bulletAttack) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) DamageAPI.AddModdedDamageType(bulletAttack, banditOpenWound); orig.Invoke(self, bulletAttack); } private void OpenWoundBehavior(DotController self, DotStack dotStack) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Invalid comparison between Unknown and I4 //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Expected O, but got Unknown //IL_00d2: 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_00de: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: 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_0114: Unknown result type (might be due to invalid IL or missing references) //IL_0131: Unknown result type (might be due to invalid IL or missing references) //IL_0136: Unknown result type (might be due to invalid IL or missing references) //IL_013d: Unknown result type (might be due to invalid IL or missing references) //IL_0147: Unknown result type (might be due to invalid IL or missing references) //IL_015e: Expected O, but got Unknown if (dotStack.dotIndex != emptyDotIdx || !Object.op_Implicit((Object)(object)self.victimBody) || !Object.op_Implicit((Object)(object)self.victimBody.healthComponent)) { return; } int i = 0; int count = self.dotStackList.Count; float num = 0f; for (; i < count; i++) { if ((int)self.dotStackList[i].dotIndex == 6) { float num2 = self.dotStackList[i].timer / 0.25f; float damage = self.dotStackList[i].damage; num += damage * num2; self.dotStackList[i].timer = 0f; } } if (num > 0f) { DamageInfo val = new DamageInfo(); val.damage = num; val.position = self.victimBody.corePosition; val.force = Vector3.zero; val.crit = false; val.procChainMask = default(ProcChainMask); val.procCoefficient = 1f; val.damageColorIndex = (DamageColorIndex)8; val.damageType = (DamageType)0; self.victimBody.healthComponent.TakeDamage(val); EffectManager.SpawnEffect(lightsOutEffect, new EffectData { origin = self.victimBody.corePosition, scale = self.victimBody.radius }, true); } } private void ModifyFire(orig_FireBullet orig, FireShotgun2 self, Ray aimRay) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Unknown result type (might be due to invalid IL or missing references) ((BaseState)self).StartAimMode(aimRay, 3f, false); ((GenericBulletBaseState)self).DoFireEffects(); ((GenericBulletBaseState)self).PlayFireAnimation(); ((BaseState)self).AddRecoil(-1f * ((GenericBulletBaseState)self).recoilAmplitudeY, -1.5f * ((GenericBulletBaseState)self).recoilAmplitudeY, -1f * ((GenericBulletBaseState)self).recoilAmplitudeX, 1f * ((GenericBulletBaseState)self).recoilAmplitudeX); if (((EntityState)self).isAuthority) { Vector3 val = Vector3.Cross(((Ray)(ref aimRay)).direction, Vector3.up); float num = 5f; Ray val5 = default(Ray); for (int i = 0; i < ((GenericBulletBaseState)self).bulletCount; i++) { float num2 = Random.Range((0f - num) / 2f, num / 2f); float num3 = Random.Range((0f - num) / 2f, num / 2f); Quaternion val2 = Quaternion.AngleAxis(num2, Vector3.up); Quaternion val3 = Quaternion.AngleAxis(num3, val); Vector3 val4 = val2 * val3 * ((Ray)(ref aimRay)).direction; ((Ray)(ref val5))..ctor(((Ray)(ref aimRay)).origin, val4); BulletAttack val6 = ((GenericBulletBaseState)self).GenerateBulletAttack(val5); ((GenericBulletBaseState)self).ModifyBullet(val6); val6.Fire(); } } } private void IncreaseHemorrhageStacks(orig_AuthorityModifyOverlapAttack orig, SlashBlade self, OverlapAttack overlapAttack) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) DamageAPI.AddModdedDamageType(overlapAttack, banditDoubleHemorrhage); orig.Invoke(self, overlapAttack); } private void ApplyNewDamageTypes(orig_SendDamageDealt orig, DamageReport damageReport) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) if (DamageAPI.HasModdedDamageType(damageReport.damageInfo, banditOpenWound) && Object.op_Implicit((Object)(object)damageReport.victimBody)) { DotController.InflictDot(((Component)damageReport.victimBody).gameObject, damageReport.attacker, emptyDotIdx, 0f, 1f, (uint?)null); } if (DamageAPI.HasModdedDamageType(damageReport.damageInfo, banditDoubleHemorrhage) && damageReport.damageInfo.crit && Object.op_Implicit((Object)(object)damageReport.victimBody)) { DotController.InflictDot(((Component)damageReport.victimBody).gameObject, damageReport.attacker, (DotIndex)6, 8f, 1f, (uint?)null); } orig.Invoke(damageReport); } private void ReduceRecoil(orig_OnEnter orig, Bandit2FirePrimaryBase self) { if (self is Bandit2FireRifle) { ((GenericBulletBaseState)self).spreadBloomValue = 0.65f; ((GenericBulletBaseState)self).spreadYawScale = 0.25f; ((GenericBulletBaseState)self).spreadPitchScale = 0.3f; } orig.Invoke(self); } } }