Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of SOTSItemRework v1.1.1
SOTSItemRework.dll
Decompiled a year agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using EntityStates; using EntityStates.ImpMonster; using IL.RoR2; using KinematicCharacterController; using Microsoft.CodeAnalysis; using Mono.Cecil.Cil; using MonoMod.Cil; using On.RoR2; using R2API; using RoR2; using RoR2.Navigation; using RoR2.Projectile; using SOTSItemRework.Items.Green; using SOTSItemRework.Items.Red; using SOTSItemRework.Items.White; 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.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("SOTSItemRework")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("SOTSItemRework")] [assembly: AssemblyTitle("SOTSItemRework")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } } namespace SOTSItemRework { public class ProjectileGlue : MonoBehaviour { private Transform target; private ProjectileTargetComponent targetComponent; public void Start() { targetComponent = ((Component)this).GetComponent<ProjectileTargetComponent>(); target = targetComponent.target; } private void FixedUpdate() { //IL_001a: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)target)) { ((Component)this).transform.position = target.position; } } } [BepInPlugin("com.Nuxlar.SOTSItemRework", "SOTSItemRework", "1.1.1")] public class SOTSItemRework : BaseUnityPlugin { public static ItemDef emptyItem = ScriptableObject.CreateInstance<ItemDef>(); public static BuffDef emptyBuff = ScriptableObject.CreateInstance<BuffDef>(); public static AssetBundle assetBundle; public static Sprite transmitterEquipIcon; public static ConfigEntry<bool> enableEcho; public static ConfigEntry<bool> enableAntler; public static ConfigEntry<bool> enableFin; public static ConfigEntry<bool> enableChronic; public static ConfigEntry<bool> enableLantern; public static ConfigEntry<bool> enableDoll; public static ConfigEntry<bool> enableBeads; public static ConfigEntry<bool> enableThorn; public static ConfigEntry<bool> enableTransmitter; public static ConfigEntry<bool> enableWarBonds; public static ConfigEntry<bool> enableLens; public static ConfigEntry<bool> enableNectar; private static ConfigFile SIRConfig { 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 //IL_01e2: Unknown result type (might be due to invalid IL or missing references) //IL_021d: Unknown result type (might be due to invalid IL or missing references) SIRConfig = new ConfigFile(Paths.ConfigPath + "\\com.Nuxlar.SOTSItemRework.cfg", true); enableEcho = SIRConfig.Bind<bool>("General", "Enable Warped Echo Change", true, "Enable Rework"); enableAntler = SIRConfig.Bind<bool>("General", "Enable Antler Shield Change", true, "Enable Rework"); enableFin = SIRConfig.Bind<bool>("General", "Enable Knockback Fin Change", true, "Enable Rework"); enableChronic = SIRConfig.Bind<bool>("General", "Enable Chronic Expansion Change", true, "Enable Rework"); enableLantern = SIRConfig.Bind<bool>("General", "Enable Bolstering Lantern Change", true, "Enable Rework"); enableDoll = SIRConfig.Bind<bool>("General", "Enable Chance Doll Change", true, "Enable Rework"); enableBeads = SIRConfig.Bind<bool>("General", "Enable Prayer Beads Change", true, "Enable Rework"); enableThorn = SIRConfig.Bind<bool>("General", "Enable Noxious Thorn Change", true, "Enable Rework"); enableTransmitter = SIRConfig.Bind<bool>("General", "Enable Unstable Transmitter Change", true, "Enable Rework"); enableWarBonds = SIRConfig.Bind<bool>("General", "Enable War Bonds Change", true, "Enable Rework"); enableLens = SIRConfig.Bind<bool>("General", "Enable Runic Lens Change", true, "Enable Rework"); enableNectar = SIRConfig.Bind<bool>("General", "Enable Growth Nectar Change", true, "Enable Rework"); assetBundle = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location), "sotsitemrework.bundle")); transmitterEquipIcon = assetBundle.LoadAsset<Sprite>("assets/transmitterequipicon.png"); emptyItem.tier = (ItemTier)5; emptyItem.hidden = true; emptyItem.deprecatedTier = (ItemTier)5; ((Object)emptyItem).name = "Empty ItemNux"; ContentAddition.AddItemDef(emptyItem); ((Object)emptyBuff).name = "Empty BuffNux"; ContentAddition.AddBuffDef(emptyBuff); bool flag = default(bool); ContentAddition.AddEntityState<TransmitterBlink>(ref flag); if (enableEcho.Value) { new WarpedEcho(); } if (enableAntler.Value) { new AntlerShield(); } if (enableFin.Value) { new KnockbackFin(); } if (enableChronic.Value) { new ChronicExpansion(); } if (enableLantern.Value) { new BolsteringLantern(); } if (enableDoll.Value) { new ChanceDoll(); } if (enableBeads.Value) { new PrayerBeads(); } if (enableThorn.Value) { new NoxiousThorn(); } if (enableTransmitter.Value) { new UnstableTransmitter(); } if (enableWarBonds.Value) { new WarBonds(); } if (enableLens.Value) { new RunicLens(); } if (enableNectar.Value) { new GrowthNectar(); } } } public class TransmitterBlink : BaseState { private Transform modelTransform; private float stopwatch; private float duration = 0.3f; private Vector3 blinkDestination = Vector3.zero; private Vector3 blinkStart = Vector3.zero; private Animator animator; private CharacterModel characterModel; private HurtBoxGroup hurtboxGroup; private Vector3 blinkVector = Vector3.zero; public override void OnEnter() { //IL_00ae: 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_00bd: 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_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_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_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_012a: Unknown result type (might be due to invalid IL or missing references) //IL_0135: Unknown result type (might be due to invalid IL or missing references) //IL_013a: Unknown result type (might be due to invalid IL or missing references) //IL_013f: Unknown result type (might be due to invalid IL or missing references) //IL_0144: Unknown result type (might be due to invalid IL or missing references) //IL_0150: Unknown result type (might be due to invalid IL or missing references) ((BaseState)this).OnEnter(); modelTransform = ((EntityState)this).GetModelTransform(); if (Object.op_Implicit((Object)(object)modelTransform)) { animator = ((Component)modelTransform).GetComponent<Animator>(); characterModel = ((Component)modelTransform).GetComponent<CharacterModel>(); hurtboxGroup = ((Component)modelTransform).GetComponent<HurtBoxGroup>(); } if (Object.op_Implicit((Object)(object)characterModel)) { CharacterModel obj = characterModel; obj.invisibilityCount++; } if (Object.op_Implicit((Object)(object)hurtboxGroup)) { HurtBoxGroup obj2 = hurtboxGroup; int hurtBoxesDeactivatorCounter = obj2.hurtBoxesDeactivatorCounter + 1; obj2.hurtBoxesDeactivatorCounter = hurtBoxesDeactivatorCounter; } if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor)) { ((Behaviour)((EntityState)this).characterMotor).enabled = false; } Vector3 val = GetBlinkVector() * 50f; blinkDestination = ((EntityState)this).transform.position; blinkStart = ((EntityState)this).transform.position; NodeGraph groundNodes = SceneInfo.instance.groundNodes; groundNodes.GetNodePosition(groundNodes.FindClosestNode(((EntityState)this).transform.position + val, ((EntityState)this).characterBody.hullClassification, float.PositiveInfinity), ref blinkDestination); blinkDestination += ((EntityState)this).transform.position - ((EntityState)this).characterBody.footPosition; CreateBlinkEffect(Util.GetCorePosition(((EntityState)this).gameObject)); RiftAttack(); } 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(BlinkState.blinkPrefab, new EffectData { rotation = Util.QuaternionSafeLookRotation(blinkVector), origin = origin }, false); } protected virtual Vector3 GetBlinkVector() { //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_002a: 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_002f: 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) Vector3 val = ((((EntityState)this).inputBank.moveVector == Vector3.zero) ? ((EntityState)this).characterDirection.forward : ((EntityState)this).inputBank.moveVector); return ((Vector3)(ref val)).normalized; } private void SetPosition(Vector3 newPosition) { //IL_0019: 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) if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor)) { ((BaseCharacterController)((EntityState)this).characterMotor).Motor.SetPositionAndRotation(newPosition, Quaternion.identity, true); } } private void RiftAttack() { //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_0016: 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) //IL_0038: 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_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_005b: 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_0062: 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_006e: 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_0075: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_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_0097: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: 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_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: 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_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_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_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Expected O, but got Unknown new BlastAttack { attacker = ((Component)((EntityState)this).characterBody).gameObject, baseDamage = ((EntityState)this).characterBody.damage * 4f, baseForce = 1000f, bonusForce = Vector3.zero, attackerFiltering = (AttackerFiltering)2, crit = ((EntityState)this).characterBody.RollCrit(), damageColorIndex = (DamageColorIndex)3, damageType = DamageTypeCombo.op_Implicit((DamageType)0), falloffModel = (FalloffModel)0, inflictor = ((Component)((EntityState)this).characterBody).gameObject, position = ((EntityState)this).characterBody.corePosition, procChainMask = default(ProcChainMask), procCoefficient = 1f, radius = 25f, losType = (LoSType)0, teamIndex = (TeamIndex)1 }.Fire(); EffectManager.SpawnEffect(CommonAssets.teleportOnLowHealthExplosion, new EffectData { origin = ((EntityState)this).characterBody.corePosition, scale = 50f, rotation = Quaternion.identity }, true); Util.PlaySound("Play_item_proc_teleportOnLowHealth", ((Component)((EntityState)this).characterBody).gameObject); } public override void FixedUpdate() { //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_005c: 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) ((EntityState)this).FixedUpdate(); stopwatch += ((EntityState)this).GetDeltaTime(); if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor) && Object.op_Implicit((Object)(object)((EntityState)this).characterDirection)) { ((EntityState)this).characterMotor.velocity = Vector3.zero; } SetPosition(Vector3.Lerp(blinkStart, blinkDestination, stopwatch / BlinkState.duration)); if (!((double)stopwatch < (double)BlinkState.duration) && ((EntityState)this).isAuthority) { ((EntityState)this).outer.SetNextStateToMain(); } } public override void OnExit() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) RiftAttack(); CreateBlinkEffect(Util.GetCorePosition(((EntityState)this).gameObject)); modelTransform = ((EntityState)this).GetModelTransform(); if (Object.op_Implicit((Object)(object)modelTransform) && Object.op_Implicit((Object)(object)BlinkState.destealthMaterial)) { TemporaryOverlayInstance obj = TemporaryOverlayManager.AddOverlay(((Component)animator).gameObject); obj.duration = 1f; obj.destroyComponentOnEnd = true; obj.originalMaterial = BlinkState.destealthMaterial; obj.inspectorCharacterModel = ((Component)animator).gameObject.GetComponent<CharacterModel>(); obj.alphaCurve = AnimationCurve.EaseInOut(0f, 1f, 1f, 0f); obj.animateShaderAlpha = true; } if (Object.op_Implicit((Object)(object)characterModel)) { CharacterModel obj2 = characterModel; obj2.invisibilityCount--; } if (Object.op_Implicit((Object)(object)hurtboxGroup)) { HurtBoxGroup obj3 = hurtboxGroup; int hurtBoxesDeactivatorCounter = obj3.hurtBoxesDeactivatorCounter - 1; obj3.hurtBoxesDeactivatorCounter = hurtBoxesDeactivatorCounter; } if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor)) { ((Behaviour)((EntityState)this).characterMotor).enabled = true; } ((EntityState)this).OnExit(); } public override InterruptPriority GetMinimumInterruptPriority() { return (InterruptPriority)5; } } } namespace SOTSItemRework.Items.White { public class AntlerShield { private ItemDef antlerDef = Addressables.LoadAssetAsync<ItemDef>((object)"RoR2/DLC2/Items/NegateAttack/NegateAttack.asset").WaitForCompletion(); public AntlerShield() { //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_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Expected O, but got Unknown //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Expected O, but got Unknown antlerDef.descriptionToken = "Gain shield equal to <style=cIsUtility>4%</style> <style=cStack>(+4% per stack)</style> of your maximum health. Increase movement speed by <style=cIsUtility>14%</style> <style=cStack>(+14% per stack)</style> while shield is active."; antlerDef.pickupToken = "Gain a recharging shield and increase movement speed while shield is active."; HealthComponent.TakeDamageProcess += new Manipulator(RemoveVanillaAntlerShield); RecalculateStatsAPI.GetStatCoefficients += new StatHookEventHandler(NewAntlerShield); } private void NewAntlerShield(CharacterBody sender, StatHookEventArgs args) { if (!Object.op_Implicit((Object)(object)sender.inventory)) { return; } int itemCount = sender.inventory.GetItemCount(Items.NegateAttack); if (itemCount > 0) { args.baseShieldAdd += 0.04f * sender.maxHealth * (float)itemCount; if (Object.op_Implicit((Object)(object)sender.healthComponent) && sender.healthComponent.shield > 0f) { args.moveSpeedMultAdd += 0.14f * (float)itemCount; } } } private void RemoveVanillaAntlerShield(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); if (val.TryGotoNext(new Func<Instruction, bool>[2] { (Instruction x) => ILPatternMatchingExt.MatchLdfld(x, typeof(ItemCounts), "antlerShield"), (Instruction x) => ILPatternMatchingExt.MatchLdcI4(x, 0) })) { val.Index += 2; val.EmitDelegate<Func<int, int>>((Func<int, int>)((int stack) => int.MaxValue)); } else { Debug.LogError((object)"SOTSItemRework: Removing vanilla Antler Shield hook failed."); } } } public class BolsteringLantern { private ItemDef lanternDef = Addressables.LoadAssetAsync<ItemDef>((object)"RoR2/DLC2/Items/LowerHealthHigherDamage/LowerHealthHigherDamage.asset").WaitForCompletion(); public BolsteringLantern() { //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_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Expected O, but got Unknown lanternDef.descriptionToken = "While <style=cIsHealth>health and shield are at 100%</style>, increase damage by <style=cIsUtility>20%</style> <style=cStack>(+20% per stack)</style>."; lanternDef.pickupToken = "Deal extra damage at max health."; CharacterBody.UpdateLowerHealthHigherDamage += new hook_UpdateLowerHealthHigherDamage(LanternChange); } private void LanternChange(orig_UpdateLowerHealthHigherDamage orig, CharacterBody self) { //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_012a: Unknown result type (might be due to invalid IL or missing references) //IL_0162: Unknown result type (might be due to invalid IL or missing references) //IL_0168: Invalid comparison between Unknown and I4 //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Invalid comparison between Unknown and I4 //IL_0193: Unknown result type (might be due to invalid IL or missing references) //IL_019d: 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_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: 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) if (!Object.op_Implicit((Object)(object)self.inventory)) { return; } int itemCount = self.inventory.GetItemCount(Items.LowerHealthHigherDamage); if (NetworkServer.active) { if (itemCount > 0) { if (Object.op_Implicit((Object)(object)self.inventory) && !((double)self.healthComponent.health <= 0.0) && (int)self.teamComponent.teamIndex == 1) { float combinedHealthFraction = self.healthComponent.combinedHealthFraction; if ((double)combinedHealthFraction >= 1.0 && !self.HasBuff(Buffs.LowerHealthHigherDamageBuff)) { self.AddBuff(Buffs.LowerHealthHigherDamageBuff); Util.PlaySound("Play_item_proc_lowerHealthHigherDamage_proc", ((Component)self).gameObject); self.TransmitItemBehavior(new NetworkItemBehaviorData(Items.LowerHealthHigherDamage.itemIndex, 1f)); } else if (self.HasBuff(Buffs.LowerHealthHigherDamageBuff) && !((double)combinedHealthFraction >= 1.0)) { self.RemoveBuff(Buffs.LowerHealthHigherDamageBuff); self.TransmitItemBehavior(new NetworkItemBehaviorData(Items.LowerHealthHigherDamage.itemIndex, 0f)); } } } else if (self.HasBuff(Buffs.LowerHealthHigherDamageBuff)) { self.RemoveBuff(Buffs.LowerHealthHigherDamageBuff); self.TransmitItemBehavior(new NetworkItemBehaviorData(Items.LowerHealthHigherDamage.itemIndex, 0f)); } } else if (itemCount == 0 && self.HasBuff(Buffs.LowerHealthHigherDamageBuff) && !((double)self.healthComponent.health <= 0.0) && (int)self.teamComponent.teamIndex == 1 && !((double)self.healthComponent.GetNormalizedHealth() >= 1.0)) { self.RemoveBuff(Buffs.LowerHealthHigherDamageBuff); self.TransmitItemBehavior(new NetworkItemBehaviorData(Items.LowerHealthHigherDamage.itemIndex, 0f)); } } } public class ChronicExpansion { private ItemDef cExpansionDef = Addressables.LoadAssetAsync<ItemDef>((object)"RoR2/DLC2/Items/IncreaseDamageOnMultiKill/IncreaseDamageOnMultiKill.asset").WaitForCompletion(); public ChronicExpansion() { //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_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Expected O, but got Unknown //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Expected O, but got Unknown //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Expected O, but got Unknown //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Expected O, but got Unknown //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Expected O, but got Unknown //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Expected O, but got Unknown cExpansionDef.nameToken = "Escalating Expansion"; cExpansionDef.descriptionToken = "Gain a stacking 5% Critical Strike chance after killing an enemy for <style=cIsUtility>3 seconds</style> <style=cStack>(+1.5s per stack)</style>. Duration resets with each kill."; cExpansionDef.pickupToken = "Gain a stacking 5% Critical Strike chance after killing an enemy for a limited time. Duration resets with each kill."; CharacterBody.RecalculateStats += new Manipulator(RemoveVanillaCExpansion); CharacterBody.RecalculateStats += new Manipulator(RemoveVanillaCExpansionBuff); GlobalEventManager.onCharacterDeathGlobal += ApplyCExpansionBuff; RecalculateStatsAPI.GetStatCoefficients += new StatHookEventHandler(NewCExpansionBuff); CharacterBody.AddTimedBuff_BuffDef_float += new hook_AddTimedBuff_BuffDef_float(ResetCExpansionBuff); CharacterBody.UpdateMultiKill += new hook_UpdateMultiKill(RemoveVanillaCExpansionMultiKillUpdate); CharacterBody.AddMultiKill += new hook_AddMultiKill(RemoveVanillaCExpansionMultiKill); } private void RemoveVanillaCExpansionMultiKillUpdate(orig_UpdateMultiKill orig, CharacterBody self, float deltaTime) { } private void RemoveVanillaCExpansionMultiKill(orig_AddMultiKill orig, CharacterBody self, int count) { } private void RemoveVanillaCExpansionBuff(ILContext il) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_003f: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); if (val.TryGotoNext(new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchLdsfld(x, typeof(Buffs), "IncreaseDamageBuff") })) { val.Remove(); val.Emit<SOTSItemRework>(OpCodes.Ldsfld, "emptyBuff"); } else { Debug.LogError((object)"SOTSItemRework: Removing vanilla CExpansion buff hook failed."); } } private void ResetCExpansionBuff(orig_AddTimedBuff_BuffDef_float orig, CharacterBody self, BuffDef buffDef, float duration) { //IL_0001: 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_0029: 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) if (buffDef.buffIndex == Buffs.IncreaseDamageBuff.buffIndex) { foreach (TimedBuff timedBuff in self.timedBuffs) { if (timedBuff.buffIndex == Buffs.IncreaseDamageBuff.buffIndex) { timedBuff.timer = duration; } } } orig.Invoke(self, buffDef, duration); } private void ApplyCExpansionBuff(DamageReport dmgReport) { //IL_0083: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)dmgReport.attacker) || !Object.op_Implicit((Object)(object)dmgReport.attackerBody) || !Object.op_Implicit((Object)(object)dmgReport.victim) || !Object.op_Implicit((Object)(object)dmgReport.victimBody) || !NetworkServer.active) { return; } CharacterBody attackerBody = dmgReport.attackerBody; if (Object.op_Implicit((Object)(object)attackerBody.inventory) && NetworkServer.active) { int itemCount = attackerBody.inventory.GetItemCount(Items.IncreaseDamageOnMultiKill); if (itemCount > 0) { float num = 1.5f + 1.5f * (float)itemCount; attackerBody.AddTimedBuffAuthority(Buffs.IncreaseDamageBuff.buffIndex, num); } } } private void RemoveVanillaCExpansion(ILContext il) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_003f: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); if (val.TryGotoNext(new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchLdsfld(x, typeof(Items), "IncreaseDamageOnMultiKill") })) { val.Remove(); val.Emit<SOTSItemRework>(OpCodes.Ldsfld, "emptyItem"); } else { Debug.LogError((object)"SOTSItemRework: Removing vanilla CExpansion hook failed."); } } private void NewCExpansionBuff(CharacterBody sender, StatHookEventArgs args) { int buffCount = sender.GetBuffCount(Buffs.IncreaseDamageBuff); if (buffCount > 0) { args.critAdd += 5f * (float)buffCount; } } } public class KnockbackFin { private ItemDef finDef = Addressables.LoadAssetAsync<ItemDef>((object)"RoR2/DLC2/Items/KnockBackHitEnemies/KnockBackHitEnemies.asset").WaitForCompletion(); public KnockbackFin() { //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_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Expected O, but got Unknown //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Expected O, but got Unknown finDef.nameToken = "Nimble Fin"; finDef.descriptionToken = "Increase jump height by <style=cIsUtility>20%</style> <style=cStack>(+20% per stack)</style>."; finDef.pickupToken = "Increase jump height by 20%."; RecalculateStatsAPI.GetStatCoefficients += new StatHookEventHandler(NewFin); GlobalEventManager.ProcessHitEnemy += new Manipulator(RemoveVanillaFin); } private void NewFin(CharacterBody sender, StatHookEventArgs args) { if (Object.op_Implicit((Object)(object)sender.inventory)) { int itemCount = sender.inventory.GetItemCount(Items.KnockBackHitEnemies); if (itemCount > 0) { args.jumpPowerMultAdd += 0.2f * (float)itemCount; } } } private void RemoveVanillaFin(ILContext il) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_003f: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); if (val.TryGotoNext(new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchLdsfld(x, typeof(Items), "KnockBackHitEnemies") })) { val.Remove(); val.Emit<SOTSItemRework>(OpCodes.Ldsfld, "emptyItem"); } else { Debug.LogError((object)"SOTSItemRework: Removing vanilla Fin hook failed."); } } } public class WarpedEcho { private ItemDef echoDef = Addressables.LoadAssetAsync<ItemDef>((object)"RoR2/DLC2/Items/DelayedDamage/DelayedDamage.asset").WaitForCompletion(); public WarpedEcho() { //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_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Expected O, but got Unknown //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Expected O, but got Unknown //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Expected O, but got Unknown echoDef.nameToken = "Wanderer's Compass"; echoDef.descriptionToken = "Increase sprint speed by <style=cIsUtility>35%</style> <style=cStack>(+35% per stack)</style> while out of combat."; echoDef.pickupToken = "Increase sprint speed while out of combat."; RecalculateStatsAPI.GetStatCoefficients += new StatHookEventHandler(SpeedEcho); DelayedDamageBehavior.Update += new hook_Update(RemoveVanillaEchoBehavior); CharacterBody.UpdateDelayedDamage += new hook_UpdateDelayedDamage(RemoveVanillaEcho); } private void RemoveVanillaEcho(orig_UpdateDelayedDamage orig, CharacterBody self, float deltaTime) { } private void RemoveVanillaEchoBehavior(orig_Update orig, DelayedDamageBehavior self) { } private void SpeedEcho(CharacterBody sender, StatHookEventArgs args) { if (Object.op_Implicit((Object)(object)sender.inventory)) { int itemCount = sender.inventory.GetItemCount(Items.DelayedDamage); if (itemCount > 0 && sender.outOfCombat) { args.sprintSpeedAdd += 0.35f * (float)itemCount; } } } } } namespace SOTSItemRework.Items.Red { public class GrowthNectar { private ItemDef nectarDef = Addressables.LoadAssetAsync<ItemDef>((object)"RoR2/DLC2/Items/BoostAllStats/BoostAllStats.asset").WaitForCompletion(); public GrowthNectar() { //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_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Expected O, but got Unknown //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Expected O, but got Unknown nectarDef.nameToken = "Vitality Nectar"; nectarDef.descriptionToken = "Gain a <style=cIsUtility>20%</style> <style=cStack>(+20% per stack)</style> stat boost while health is <style=cIsHealth>below 100%</style>."; nectarDef.pickupToken = "Gain a 20% stat boost while health is below 100%."; CharacterBody.RecalculateStats += new hook_RecalculateStats(AddNewNectar); CharacterBody.UpdateBoostAllStatsTimer += new hook_UpdateBoostAllStatsTimer(RemoveVanillaNectarTimer); } private void RemoveVanillaNectarTimer(orig_UpdateBoostAllStatsTimer orig, CharacterBody self, float deltaTime) { } private void AddNewNectar(orig_RecalculateStats orig, CharacterBody self) { //IL_009a: 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) orig.Invoke(self); if (!Object.op_Implicit((Object)(object)self) || !Object.op_Implicit((Object)(object)self.inventory)) { return; } if (self.inventory.GetItemCount(Items.BoostAllStats) > 0) { if (Object.op_Implicit((Object)(object)self.healthComponent) && self.healthComponent.combinedHealthFraction < 1f && self.GetBuffCount(Buffs.BoostAllStatsBuff) == 0) { self.SetBuffCount(Buffs.BoostAllStatsBuff.buffIndex, 1); } } else if (self.inventory.GetItemCount(Items.BoostAllStats) <= 0 && self.GetBuffCount(Buffs.BoostAllStatsBuff) > 0) { self.SetBuffCount(Buffs.BoostAllStatsBuff.buffIndex, 0); } } } public class RunicLens { private ItemDef lensDef = Addressables.LoadAssetAsync<ItemDef>((object)"RoR2/DLC2/Items/MeteorAttackOnHighDamage/MeteorAttackOnHighDamage.asset").WaitForCompletion(); private static GameObject tracerEffectPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Golem/TracerGolem.prefab").WaitForCompletion(); private static GameObject hitEffectPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Golem/ExplosionGolem.prefab").WaitForCompletion(); private static GameObject muzzleEffectPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Golem/MuzzleflashGolem.prefab").WaitForCompletion(); public RunicLens() { //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_0076: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Expected O, but got Unknown //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Expected O, but got Unknown List<ItemTag> list = lensDef.tags.ToList(); list.Add((ItemTag)11); list.Add((ItemTag)4); lensDef.tags = list.ToArray(); lensDef.descriptionToken = "Fire a retalitory laser on taking <style=cIsUtility>10% max health or more</style> as damage. Laser base damage <style=cIsHealth>scales with percent of max health lost</style>, multiplied by <style=cIsUtility>1</style><style=cStack> (+1 per stack)</style>."; lensDef.pickupToken = "Fire a retalitory laser blast upon taking high damage."; HealthComponent.TakeDamageProcess += new hook_TakeDamageProcess(AddNewLens); MeteorAttackOnHighDamageBehavior.FixedUpdate += new hook_FixedUpdate(RemoveVanillaLens); } private void RemoveVanillaLens(orig_FixedUpdate orig, MeteorAttackOnHighDamageBehavior self) { } private void AddNewLens(orig_TakeDamageProcess orig, HealthComponent self, DamageInfo damageInfo) { //IL_0134: Unknown result type (might be due to invalid IL or missing references) //IL_0139: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_0151: Unknown result type (might be due to invalid IL or missing references) //IL_0158: Unknown result type (might be due to invalid IL or missing references) //IL_015d: Unknown result type (might be due to invalid IL or missing references) //IL_0162: 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_017b: Unknown result type (might be due to invalid IL or missing references) //IL_017d: Unknown result type (might be due to invalid IL or missing references) //IL_0182: Unknown result type (might be due to invalid IL or missing references) //IL_0187: Unknown result type (might be due to invalid IL or missing references) //IL_0192: Unknown result type (might be due to invalid IL or missing references) //IL_0194: 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_01a4: Unknown result type (might be due to invalid IL or missing references) //IL_01a6: Unknown result type (might be due to invalid IL or missing references) //IL_01b0: Unknown result type (might be due to invalid IL or missing references) //IL_01b2: Unknown result type (might be due to invalid IL or missing references) //IL_01b7: Unknown result type (might be due to invalid IL or missing references) //IL_01be: Expected O, but got Unknown //IL_01c3: Unknown result type (might be due to invalid IL or missing references) //IL_01c8: Unknown result type (might be due to invalid IL or missing references) //IL_01ca: Unknown result type (might be due to invalid IL or missing references) //IL_01da: Expected O, but got Unknown if (!self.alive || self.godMode || (double)self.ospTimer > 0.0 || damageInfo.rejected) { return; } if (Object.op_Implicit((Object)(object)self.body) && Object.op_Implicit((Object)(object)self.body.inventory)) { int itemCount = self.body.inventory.GetItemCount(Items.MeteorAttackOnHighDamage); if (itemCount > 0 && Object.op_Implicit((Object)(object)damageInfo.attacker) && Object.op_Implicit((Object)(object)damageInfo.attacker.GetComponent<CharacterBody>())) { CharacterBody component = damageInfo.attacker.GetComponent<CharacterBody>(); CharacterBody body = self.body; float num = damageInfo.damage / self.fullCombinedHealth * 100f; Debug.LogWarning((object)("full combined hp " + self.fullCombinedHealth)); Debug.LogWarning((object)("hp nm: " + num)); Debug.LogWarning((object)("damage: " + damageInfo.damage)); num *= 1f * (float)itemCount; if (num < 10f) { orig.Invoke(self, damageInfo); return; } Util.PlaySound("Play_golem_laser_fire", ((Component)body).gameObject); new BlastAttack { attacker = ((Component)body).gameObject, inflictor = ((Component)body).gameObject, teamIndex = TeamComponent.GetObjectTeam(((Component)body).gameObject), baseDamage = body.damage * num, baseForce = 500f, position = component.corePosition, radius = 1f, falloffModel = (FalloffModel)0 }.Fire(); EffectData val = new EffectData { origin = component.corePosition, start = body.corePosition }; EffectManager.SpawnEffect(muzzleEffectPrefab, new EffectData { origin = body.corePosition }, true); EffectManager.SpawnEffect(tracerEffectPrefab, val, true); EffectManager.SpawnEffect(hitEffectPrefab, val, true); } } orig.Invoke(self, damageInfo); } } public class WarBonds { private ItemDef bondDef = Addressables.LoadAssetAsync<ItemDef>((object)"RoR2/DLC2/Items/GoldOnStageStart/GoldOnStageStart.asset").WaitForCompletion(); private static GameObject orbitalProjectile = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Junk/Captain/CaptainAirstrikeProjectile2.prefab").WaitForCompletion(); public WarBonds() { //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_006b: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Expected O, but got Unknown //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Expected O, but got Unknown //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Expected O, but got Unknown orbitalProjectile.AddComponent<ProjectileGlue>(); orbitalProjectile.AddComponent<ProjectileTargetComponent>(); bondDef.nameToken = "Orbital Launch Codes"; bondDef.descriptionToken = "10% chance on hit to launch an orbital probe that deals <style=cIsUtility>750%</style> <style=cStack>(+750% per stack)</style> total damage."; bondDef.pickupToken = "10% chance on hit to launch an orbital probe."; GlobalEventManager.ProcessHitEnemy += new hook_ProcessHitEnemy(NewWarBond); GoldOnStageStartBehaviour.OnEnable += new hook_OnEnable(RemoveVanillaBondOnEnable); GoldOnStageStartBehaviour.OnDisable += new hook_OnDisable(RemoveVanillaBondOnDisable); } private void RemoveVanillaBondOnEnable(orig_OnEnable orig, GoldOnStageStartBehaviour self) { } private void RemoveVanillaBondOnDisable(orig_OnDisable orig, GoldOnStageStartBehaviour self) { } private void NewWarBond(orig_ProcessHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim) { //IL_00ca: 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_00f5: 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_0106: 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_014d: 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) //IL_0154: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self, damageInfo, victim); if ((double)damageInfo.procCoefficient == 0.0 || damageInfo.rejected || !NetworkServer.active || !Object.op_Implicit((Object)(object)damageInfo.attacker)) { return; } CharacterBody component = damageInfo.attacker.GetComponent<CharacterBody>(); if (!Object.op_Implicit((Object)(object)component)) { return; } CharacterMaster master = component.master; if (!Object.op_Implicit((Object)(object)master)) { return; } Inventory inventory = master.inventory; if (!((ProcChainMask)(ref damageInfo.procChainMask)).HasProc((ProcType)22)) { int itemCount = inventory.GetItemCount(Items.GoldOnStageStart); if (itemCount > 0 && Util.CheckRoll(10f * damageInfo.procCoefficient, master)) { float num = (float)(7.5 + 7.5 * (double)itemCount); float damage = Util.OnHitProcDamage(damageInfo.damage, component.damage, num); ProcChainMask procChainMask = default(ProcChainMask); ((ProcChainMask)(ref procChainMask)).AddProc((ProcType)22); ProjectileManager.instance.FireProjectile(new FireProjectileInfo { projectilePrefab = orbitalProjectile, position = damageInfo.position, rotation = Quaternion.identity, owner = damageInfo.attacker, damage = damage, force = 1000f, crit = damageInfo.crit, damageColorIndex = (DamageColorIndex)3, target = victim, procChainMask = procChainMask }); } } } } } namespace SOTSItemRework.Items.Green { public class ChanceDoll { private ItemDef dollDef = Addressables.LoadAssetAsync<ItemDef>((object)"RoR2/DLC2/Items/ExtraShrineItem/ExtraShrineItem.asset").WaitForCompletion(); public ChanceDoll() { //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_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Expected O, but got Unknown //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Expected O, but got Unknown //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Expected O, but got Unknown dollDef.descriptionToken = "Increase Luck by <style=cIsUtility>20%</style> <style=cStack>(+20% per stack)</style>."; dollDef.pickupToken = "Increase Luck by 20%."; ShrineChanceBehavior.AddShrineStack += new Manipulator(RemoveVanillaDoll); CharacterMaster.OnInventoryChanged += new hook_OnInventoryChanged(AddDecimalLuck); Util.CheckRoll_float_float_CharacterMaster += new hook_CheckRoll_float_float_CharacterMaster(CalculateDecimalLuck); } private void RemoveVanillaDoll(ILContext il) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_003f: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); if (val.TryGotoNext(new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchLdsfld(x, typeof(Items), "ExtraShrineItem") })) { val.Remove(); val.Emit<SOTSItemRework>(OpCodes.Ldsfld, "emptyItem"); } else { Debug.LogError((object)"SOTSItemRework: Removing vanilla Doll hook failed."); } } private void AddDecimalLuck(orig_OnInventoryChanged orig, CharacterMaster self) { orig.Invoke(self); if (self.inventory.GetItemCount(Items.ExtraShrineItem) > 0) { self.luck = 0f; self.luck += (float)self.inventory.GetItemCount(Items.Clover); self.luck -= (float)self.inventory.GetItemCount(Items.LunarBadLuck); self.luck += 0.2f * (float)self.inventory.GetItemCount(Items.ExtraShrineItem); } } private bool CalculateDecimalLuck(orig_CheckRoll_float_float_CharacterMaster orig, float percentChance, float luck, CharacterMaster effectOriginMaster) { if ((double)luck <= 0.0 || (double)luck % 1.0 == 0.0) { return orig.Invoke(percentChance, luck, effectOriginMaster); } if ((double)percentChance <= 0.0) { return false; } int num = Mathf.FloorToInt(Mathf.Abs(luck)); float num2 = Mathf.Abs(luck) - (float)num; float num3 = Random.Range(0f, 100f); for (int i = 0; i < num; i++) { float num4 = Random.Range(0f, 100f); num3 = (((double)luck > 0.0) ? Mathf.Min(num3, num4) : Mathf.Max(num3, num4)); } if ((double)num2 > 0.0) { float num5 = Random.Range(0f, 100f); if ((double)luck > 0.0 && (double)num5 < (double)num2 * 100.0) { float num6 = Random.Range(0f, 100f); num3 = Mathf.Min(num3, num6); } } if ((double)num3 > (double)percentChance) { return false; } if (Object.op_Implicit((Object)(object)effectOriginMaster)) { GameObject bodyObject = effectOriginMaster.GetBodyObject(); if (Object.op_Implicit((Object)(object)bodyObject)) { CharacterBody component = bodyObject.GetComponent<CharacterBody>(); if (Object.op_Implicit((Object)(object)component)) { component.wasLucky = true; } } } return true; } } public class NoxiousThorn { private ItemDef thornDef = Addressables.LoadAssetAsync<ItemDef>((object)"RoR2/DLC2/Items/TriggerEnemyDebuffs/TriggerEnemyDebuffs.asset").WaitForCompletion(); private GameObject blightedMissile = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/ElitePoison/UrchinSeekingProjectile.prefab").WaitForCompletion(), "BlightedThornMissileNux", false); public NoxiousThorn() { //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_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_0149: Unknown result type (might be due to invalid IL or missing references) //IL_0153: Expected O, but got Unknown //IL_015a: Unknown result type (might be due to invalid IL or missing references) //IL_0164: Expected O, but got Unknown Object.Destroy((Object)(object)blightedMissile.GetComponent<ProjectileSimple>()); Object.Destroy((Object)(object)blightedMissile.GetComponent<ProjectileDirectionalTargetFinder>()); Object.Destroy((Object)(object)blightedMissile.GetComponent<ProjectileSteerTowardTarget>()); blightedMissile.GetComponent<ProjectileDamage>().damageType = DamageTypeCombo.op_Implicit((DamageType)1048576); Rigidbody component = blightedMissile.GetComponent<Rigidbody>(); component.collisionDetectionMode = (CollisionDetectionMode)0; component.useGravity = true; component.freezeRotation = false; blightedMissile.AddComponent<QuaternionPID>().gain = 25f; MissileController obj = blightedMissile.AddComponent<MissileController>(); obj.acceleration = 3f; obj.deathTimer = 16f; obj.maxSeekDistance = 100f; obj.maxVelocity = 35f; obj.turbulence = 1f; obj.delayTimer = 0.3f; obj.giveupTimer = 8f; ContentAddition.AddProjectile(blightedMissile); thornDef.descriptionToken = "<style=cIsUtility>15%</style> chance to fire a seeking thorn that deals <style=cIsUtility>75%</style> <style=cStack>(+75% per stack)</style> total damage and blights enemies."; thornDef.pickupToken = "Chance to fire a blighted seeking thorn."; GlobalEventManager.ProcessHitEnemy += new hook_ProcessHitEnemy(NewThorn); CharacterBody.TriggerEnemyDebuffs += new hook_TriggerEnemyDebuffs(RemoveVanillaThorn); } private void RemoveVanillaThorn(orig_TriggerEnemyDebuffs orig, CharacterBody self, DamageInfo damageInfo) { } private void NewThorn(orig_ProcessHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim) { //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self, damageInfo, victim); if ((double)damageInfo.procCoefficient == 0.0 || damageInfo.rejected || !NetworkServer.active || !Object.op_Implicit((Object)(object)damageInfo.attacker)) { return; } CharacterBody component = damageInfo.attacker.GetComponent<CharacterBody>(); if (!Object.op_Implicit((Object)(object)component)) { return; } CharacterMaster master = component.master; if (!Object.op_Implicit((Object)(object)master)) { return; } Inventory inventory = master.inventory; if (!((ProcChainMask)(ref damageInfo.procChainMask)).HasProc((ProcType)1)) { int itemCount = inventory.GetItemCount(Items.TriggerEnemyDebuffs); if (itemCount > 0 && Util.CheckRoll(15f * damageInfo.procCoefficient, master)) { float num = 0.75f * (float)itemCount; float num2 = Util.OnHitProcDamage(damageInfo.damage, component.damage, num); Util.PlaySound("Play_elite_antiHeal_turret_shot", ((Component)component).gameObject); MissileUtils.FireMissile(component.corePosition, component, damageInfo.procChainMask, victim, num2, damageInfo.crit, blightedMissile, (DamageColorIndex)3, true); } } } } public class PrayerBeads { private ItemDef beadsDef = Addressables.LoadAssetAsync<ItemDef>((object)"RoR2/DLC2/Items/ExtraStatsOnLevelUp/ExtraStatsOnLevelUp.asset").WaitForCompletion(); public PrayerBeads() { //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_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Expected O, but got Unknown //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Expected O, but got Unknown //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Expected O, but got Unknown beadsDef.descriptionToken = "Grows in power by absorbing experience, storing <style=cIsUtility>5%</style> <style=cStack>(+5% per item stack)</style> of player stats per item level up."; beadsDef.pickupToken = "Stores experience and gives stats on item level up."; CharacterBody.RecalculateStats += new Manipulator(RemoveRemovalFunctionality); CharacterBody.prayerBeadCalculateAppliedStats += new Manipulator(ReduceBeadStats); CharacterBody.RecalculateStats += new hook_RecalculateStats(AddRemovalLogic); } private void AddRemovalLogic(orig_RecalculateStats orig, CharacterBody self) { //IL_003c: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self); if (Object.op_Implicit((Object)(object)self.inventory) && self.inventory.GetItemCount(Items.ExtraStatsOnLevelUp) <= 0 && self.GetBuffCount(Buffs.ExtraStatsOnLevelUpBuff) > 0) { self.SetBuffCount(Buffs.ExtraStatsOnLevelUpBuff.buffIndex, 0); } } private void ReduceBeadStats(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); if (val.TryGotoNext(new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchLdcR4(x, 0.2f) })) { val.Next.Operand = 0.05f; } else { Debug.LogError((object)"SOTSItemRework: Tweaking Beads stats hook failed."); } } private void RemoveRemovalFunctionality(ILContext il) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_003f: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); if (val.TryGotoNext(new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchLdsfld(x, typeof(Items), "ExtraStatsOnLevelUp") })) { val.Remove(); val.Emit<SOTSItemRework>(OpCodes.Ldsfld, "emptyItem"); } else { Debug.LogError((object)"SOTSItemRework: Removing vanilla Beads hook failed."); } } } public class UnstableTransmitter { private ItemDef transmitterDef = Addressables.LoadAssetAsync<ItemDef>((object)"RoR2/DLC2/Items/TeleportOnLowHealth/TeleportOnLowHealth.asset").WaitForCompletion(); private static EquipmentDef transmitterEquip; public UnstableTransmitter() { //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_0025: 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_0134: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Expected O, but got Unknown //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_014f: Expected O, but got Unknown //IL_0156: Unknown result type (might be due to invalid IL or missing references) //IL_0160: Expected O, but got Unknown //IL_0167: Unknown result type (might be due to invalid IL or missing references) //IL_0171: Expected O, but got Unknown transmitterDef.deprecatedTier = (ItemTier)5; transmitterDef.tier = (ItemTier)5; transmitterEquip = ScriptableObject.CreateInstance<EquipmentDef>(); transmitterEquip.appearsInMultiPlayer = true; transmitterEquip.appearsInSinglePlayer = true; transmitterEquip.canBeRandomlyTriggered = false; transmitterEquip.canDrop = false; transmitterEquip.colorIndex = (ColorIndex)5; transmitterEquip.cooldown = 20f; transmitterEquip.isLunar = false; transmitterEquip.isBoss = false; transmitterEquip.enigmaCompatible = false; transmitterEquip.pickupIconSprite = SOTSItemRework.transmitterEquipIcon; transmitterEquip.pickupModelPrefab = transmitterDef.pickupModelPrefab; transmitterEquip.nameToken = transmitterDef.nameToken; ((Object)transmitterEquip).name = "transmitter"; transmitterEquip.descriptionToken = "Enter a dimensional rift, teleporting forwards and damaging nearby enemies for <style=cIsUtility>400%</style> base damage when entering and exiting the rift."; transmitterEquip.pickupToken = "Enter a dimensional rift, teleporting forwards and damaging nearby enemies when entering and exiting the rift."; transmitterEquip.loreToken = transmitterDef.loreToken; ContentAddition.AddEquipmentDef(transmitterEquip); EquipmentSlot.PerformEquipmentAction += new hook_PerformEquipmentAction(PerformEquipmentAction); TeleportOnLowHealthBehavior.Start += new hook_Start(RemoveVanillaTransmitterStart); TeleportOnLowHealthBehavior.Update += new hook_Update(RemoveVanillaTransmitterUpdate); TeleportOnLowHealthBehavior.OnDisable += new hook_OnDisable(RemoveVanillaTransmitterDisable); } private bool PerformEquipmentAction(orig_PerformEquipmentAction orig, EquipmentSlot self, EquipmentDef equipmentDef) { if (!((Object)(object)equipmentDef == (Object)(object)transmitterEquip)) { return orig.Invoke(self, equipmentDef); } return ActivateEquipment(self); } protected bool ActivateEquipment(EquipmentSlot slot) { EntityStateMachine[] components = ((Component)slot.characterBody).GetComponents<EntityStateMachine>(); foreach (EntityStateMachine val in components) { if (val.customName == "Body") { val.SetInterruptState((EntityState)(object)new TransmitterBlink(), (InterruptPriority)5); } } return true; } private void RemoveVanillaTransmitterStart(orig_Start orig, TeleportOnLowHealthBehavior self) { } private void RemoveVanillaTransmitterUpdate(orig_Update orig, TeleportOnLowHealthBehavior self) { } private void RemoveVanillaTransmitterDisable(orig_OnDisable orig, TeleportOnLowHealthBehavior self) { } } }