Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of Rockery v0.1.6
plugins/Rockery/RockeryPlugin.dll
Decompiled 2 years 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 BepInEx.Logging; using EntityStates; using EntityStates.Bandit2.Weapon; using HG; using Microsoft.CodeAnalysis; using On.EntityStates; using On.RoR2; using On.RoR2.Items; using R2API; using RoR2; using RoR2.Skills; using RockeryPlugin.Artifacts; using RockeryPlugin.AssetBundles; using RockeryPlugin.Buffs; using RockeryPlugin.Equipment; using RockeryPlugin.Items; using RockeryPlugin.Skills; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.Networking; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")] [assembly: AssemblyCompany("RockeryPlugin")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("RockeryPlugin")] [assembly: AssemblyTitle("RockeryPlugin")] [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 RockeryPlugin { internal static class Log { private static ManualLogSource _logSource; internal static void Init(ManualLogSource logSource) { _logSource = logSource; } internal static void Debug(object data) { _logSource.LogDebug(data); } internal static void Error(object data) { _logSource.LogError(data); } internal static void Fatal(object data) { _logSource.LogFatal(data); } internal static void Info(object data) { _logSource.LogInfo(data); } internal static void Message(object data) { _logSource.LogMessage(data); } internal static void Warning(object data) { _logSource.LogWarning(data); } } [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("RobRocke.RockeryPlugin", "RockeryPlugin", "0.1.6")] public class RockeryPlugin : BaseUnityPlugin { public const string PluginGUID = "RobRocke.RockeryPlugin"; public const string PluginAuthor = "RobRocke"; public const string PluginName = "RockeryPlugin"; public const string PluginVersion = "0.1.6"; public List<ArtifactBase> Artifacts = new List<ArtifactBase>(); public List<BuffBase> Buffs = new List<BuffBase>(); public List<ItemBase> Items = new List<ItemBase>(); public List<EquipmentBase> Equipment = new List<EquipmentBase>(); public static PluginInfo PInfo { get; private set; } public void Awake() { Log.Init(((BaseUnityPlugin)this).Logger); PInfo = ((BaseUnityPlugin)this).Info; Assets.Init(); DesertEagle desertEagle = new DesertEagle(); desertEagle.Init(((BaseUnityPlugin)this).Config); IEnumerable<Type> enumerable = from type in Assembly.GetExecutingAssembly().GetTypes() where !type.IsAbstract && type.IsSubclassOf(typeof(BuffBase)) select type; foreach (Type item in enumerable) { BuffBase buffBase = (BuffBase)Activator.CreateInstance(item); if (ValidateBuff(buffBase, Buffs)) { buffBase.Init(((BaseUnityPlugin)this).Config); } } IEnumerable<Type> enumerable2 = from type in Assembly.GetExecutingAssembly().GetTypes() where !type.IsAbstract && type.IsSubclassOf(typeof(ItemBase)) select type; foreach (Type item2 in enumerable2) { ItemBase itemBase = (ItemBase)Activator.CreateInstance(item2); if (ValidateItem(itemBase, Items)) { itemBase.Init(((BaseUnityPlugin)this).Config); } } IEnumerable<Type> enumerable3 = from type in Assembly.GetExecutingAssembly().GetTypes() where !type.IsAbstract && type.IsSubclassOf(typeof(EquipmentBase)) select type; foreach (Type item3 in enumerable3) { EquipmentBase equipmentBase = (EquipmentBase)Activator.CreateInstance(item3); if (ValidateEquipment(equipmentBase, Equipment)) { equipmentBase.Init(((BaseUnityPlugin)this).Config); } } IEnumerable<Type> enumerable4 = from type in Assembly.GetExecutingAssembly().GetTypes() where !type.IsAbstract && type.IsSubclassOf(typeof(ArtifactBase)) select type; foreach (Type item4 in enumerable4) { ArtifactBase artifactBase = (ArtifactBase)Activator.CreateInstance(item4); if (ValidateArtifact(artifactBase, Artifacts)) { artifactBase.Init(((BaseUnityPlugin)this).Config); } } } private void Update() { if (Input.GetKeyDown((KeyCode)283)) { Log.Info("Player pressed F2. Spawning items..."); PlayerCharacterMasterController.instances[0].master.inventory.GiveItemString("ITEM_RETROVIRUS"); PlayerCharacterMasterController.instances[0].master.inventory.GiveItemString("BleedOnHit"); PlayerCharacterMasterController.instances[0].master.inventory.GiveItemString("BleedOnHit"); PlayerCharacterMasterController.instances[0].master.inventory.GiveItemString("BleedOnHit"); PlayerCharacterMasterController.instances[0].master.inventory.GiveItemString("BleedOnHit"); PlayerCharacterMasterController.instances[0].master.inventory.GiveItemString("BleedOnHit"); PlayerCharacterMasterController.instances[0].master.inventory.GiveItemString("BleedOnHit"); PlayerCharacterMasterController.instances[0].master.inventory.GiveItemString("BleedOnHit"); PlayerCharacterMasterController.instances[0].master.inventory.GiveItemString("BleedOnHit"); PlayerCharacterMasterController.instances[0].master.inventory.GiveItemString("BleedOnHit"); PlayerCharacterMasterController.instances[0].master.inventory.GiveItemString("BleedOnHit"); } } public bool ValidateArtifact(ArtifactBase artifact, List<ArtifactBase> artifactList) { bool value = ((BaseUnityPlugin)this).Config.Bind<bool>("Artifact: " + artifact.ArtifactName, "Enable Artifact?", true, "Should this artifact appear for selection?").Value; if (value) { artifactList.Add(artifact); } return value; } public bool ValidateBuff(BuffBase buff, List<BuffBase> buffList) { bool value = ((BaseUnityPlugin)this).Config.Bind<bool>("Buff: " + buff.BuffName, "Enable Buff?", true, "Should this buff be registered for use in the game?").Value; if (value) { buffList.Add(buff); } return value; } public bool ValidateEquipment(EquipmentBase equipment, List<EquipmentBase> equipmentList) { bool value = ((BaseUnityPlugin)this).Config.Bind<bool>("Equpment: " + equipment.EquipmentName, "Enable Equipment?", true, "Should this equipment be registered for use in the game?").Value; if (value) { equipmentList.Add(equipment); } return value; } public bool ValidateItem(ItemBase item, List<ItemBase> itemList) { bool value = ((BaseUnityPlugin)this).Config.Bind<bool>("Item: " + item.ItemName, "Enable Item?", true, "Should this item appear in runs?").Value; bool value2 = ((BaseUnityPlugin)this).Config.Bind<bool>("Item: " + item.ItemName, "Blacklist Item from AI Use?", false, "Should the AI not be able to obtain this item?").Value; if (value) { itemList.Add(item); if (value2) { item.AIBlacklisted = true; } } return value; } } } namespace RockeryPlugin.Skills { public class DesertEagle : SkillBase { public class PrepSidearmEagleRevolver : BasePrepSidearmRevolverState { public PrepSidearmEagleRevolver() { //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) ((BaseSidearmState)this).baseDuration = 0.7f; ((BaseSidearmState)this).crosshairOverridePrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Bandit2/Bandit2CrosshairPrepRevolverFire.prefab").WaitForCompletion(); base.enterSoundString = "Play_bandit2_R_load"; } public override EntityState GetNextState() { return (EntityState)(object)new FireSidearmEagleRevolver(); } } public class FireSidearmEagleRevolver : BaseFireSidearmRevolverState { public FireSidearmEagleRevolver() { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002b: 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_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) base.effectPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Bandit2/MuzzleflashBandit2.prefab").WaitForCompletion(); base.hitEffectPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Bandit2/HitsparkBandit2Pistol.prefab").WaitForCompletion(); base.tracerEffectPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Bandit2/TracerBanditPistol.prefab").WaitForCompletion(); base.damageCoefficient = 6f; base.force = 1500f; base.minSpread = 0f; base.maxSpread = 0f; base.attackSoundString = "Play_bandit2_R_fire"; base.recoilAmplitude = 1f; base.bulletRadius = 1f; ((BaseSidearmState)this).baseDuration = 1f; ((BaseSidearmState)this).crosshairOverridePrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Bandit2/Bandit2CrosshairPrepRevolverFire.prefab").WaitForCompletion(); } public override void ModifyBullet(BulletAttack bulletAttack) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) DamageAPI.AddModdedDamageType(bulletAttack, GiveEagleOnKill); } } public override string SkillName => "Desert Eagle"; public override string SkillLangTokenName => "DESERT_EAGLE"; public override string SkillDescription => "Kills provide a perminent increase to base damage."; public override string Survivor => "BANDIT2"; public override string SkillType => "SPECIAL"; public override SerializableEntityStateType ActivationState => new SerializableEntityStateType(typeof(PrepSidearmEagleRevolver)); public override float BaseRechargeInterval => 4f; public override InterruptPriority InterruptPriority => (InterruptPriority)1; public override bool CanceledFromSprinting => true; public override bool MustKeyPress => true; public override SkillFamily SkillFamily => Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Bandit2/Bandit2Body.prefab").WaitForCompletion().GetComponent<SkillLocator>() .special.skillFamily; public override Sprite SkillIcon => Assets.mainBundle.LoadAsset<Sprite>("Assets/Textures/Icons/Skill/texDesertEagleIcon.png"); public static ModdedDamageType GiveEagleOnKill { get; set; } public override void Init(ConfigFile config) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Expected O, but got Unknown CreateLang(); CreateSkill(); GiveEagleOnKill = DamageAPI.ReserveDamageType(); GlobalEventManager.OnCharacterDeath += new hook_OnCharacterDeath(GlobalEventManager_OnCharacterDeath); } private void GlobalEventManager_OnCharacterDeath(orig_OnCharacterDeath orig, GlobalEventManager self, DamageReport damageReport) { //IL_0025: 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_0055: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Expected O, but got Unknown if (NetworkServer.active && damageReport != null) { DamageInfo damageInfo = damageReport.damageInfo; CharacterBody attackerBody = damageReport.attackerBody; if (DamageAPI.HasModdedDamageType(damageInfo, GiveEagleOnKill) && Object.op_Implicit((Object)(object)damageReport.victimMaster)) { EffectManager.SpawnEffect(LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/ImpactEffects/Bandit2KillEffect"), new EffectData { origin = damageInfo.position }, true); attackerBody.inventory.GiveItemString("ITEM_SPENT_CASING"); } orig.Invoke(self, damageReport); } } } public abstract class SkillBase { public abstract string SkillName { get; } public abstract string SkillLangTokenName { get; } public abstract string SkillDescription { get; } public abstract string Survivor { get; } public abstract string SkillType { get; } public abstract SerializableEntityStateType ActivationState { get; } public virtual string ActivationStateMachineName { get; } = "Weapon"; public virtual int BaseMaxStock { get; } = 1; public virtual float BaseRechargeInterval { get; } = 0f; public virtual bool BeginSkillCooldownOnSkillEnd { get; } = true; public virtual bool CanceledFromSprinting { get; } = false; public virtual bool CancelSprintingOnActivation { get; } = true; public virtual bool FullRestockOnAssign { get; } = true; public virtual InterruptPriority InterruptPriority { get; } = (InterruptPriority)0; public virtual bool IsCombatSkill { get; } = true; public virtual bool MustKeyPress { get; } = false; public virtual int RechargeStock { get; } = 1; public virtual int RequiredStock { get; } = 1; public virtual int StockToConsume { get; } = 1; public abstract SkillFamily SkillFamily { get; } public abstract Sprite SkillIcon { get; } public abstract void Init(ConfigFile config); protected void CreateLang() { LanguageAPI.Add(Survivor + "_" + SkillType + "_" + SkillLangTokenName + "_" + SkillName + "_NAME", SkillName); LanguageAPI.Add(Survivor + "_" + SkillType + "_" + SkillLangTokenName + "_DESCRIPTION", SkillDescription); } protected void CreateSkill() { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_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_01ec: Unknown result type (might be due to invalid IL or missing references) //IL_0204: Unknown result type (might be due to invalid IL or missing references) //IL_020e: Expected O, but got Unknown //IL_020f: Unknown result type (might be due to invalid IL or missing references) //IL_0210: Unknown result type (might be due to invalid IL or missing references) SkillDef val = ScriptableObject.CreateInstance<SkillDef>(); val.activationState = ActivationState; val.activationStateMachineName = ActivationStateMachineName; val.baseMaxStock = BaseMaxStock; val.baseRechargeInterval = BaseRechargeInterval; val.beginSkillCooldownOnSkillEnd = BeginSkillCooldownOnSkillEnd; val.canceledFromSprinting = CanceledFromSprinting; val.cancelSprintingOnActivation = CancelSprintingOnActivation; val.fullRestockOnAssign = FullRestockOnAssign; val.interruptPriority = InterruptPriority; val.isCombatSkill = IsCombatSkill; val.mustKeyPress = MustKeyPress; val.rechargeStock = RechargeStock; val.requiredStock = RequiredStock; val.stockToConsume = StockToConsume; val.icon = SkillIcon; val.skillDescriptionToken = Survivor + "_" + SkillType + "_" + SkillLangTokenName + "_DESCRIPTION"; val.skillName = Survivor + "_" + SkillType + "_" + SkillLangTokenName + "_" + SkillName + "_NAME"; val.skillNameToken = Survivor + "_" + SkillType + "_" + SkillLangTokenName + "_" + SkillName + "_NAME"; ContentAddition.AddSkillDef(val); Array.Resize(ref SkillFamily.variants, SkillFamily.variants.Length + 1); Variant[] variants = SkillFamily.variants; int num = SkillFamily.variants.Length - 1; Variant val2 = new Variant { skillDef = val }; ((Variant)(ref val2)).viewableNode = new Node(val.skillNameToken, false, (Node)null); variants[num] = val2; } } } namespace RockeryPlugin.Items { public class BirthdayBalloon : ItemBase { public override string ItemName => "BirthdayBalloon"; public override string ItemLangTokenName => "BIRTHDAY_BALLOON"; public override string ItemPickupDesc => "Slightly increase jump power."; public override string ItemFullDescription => "Increases jump power by <style=cIsDamage>15%</style> <style=cStack>(<style=cIsDamage>15%</style> per stack)</style>."; public override string ItemLore => "Suprise!!"; public override ItemTierDef ItemTierDef => Addressables.LoadAssetAsync<ItemTierDef>((object)"RoR2/Base/Common/Tier1Def.asset").WaitForCompletion(); public override ItemTier Tier => (ItemTier)0; public override Sprite ItemIcon => Assets.mainBundle.LoadAsset<Sprite>("Assets/Textures/Icons/Item/texBirthdayBalloonIcon.png"); public override GameObject ItemModel => Assets.mainBundle.LoadAsset<GameObject>("Assets/Models/Prefabs/Items/BirthdayBalloon.fbx"); public override ItemTag[] ItemTags => (ItemTag[])(object)new ItemTag[1] { (ItemTag)3 }; public override void Init(ConfigFile config) { CreateLang(); CreateItem(); Hooks(); } public override void Hooks() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown RecalculateStatsAPI.GetStatCoefficients += new StatHookEventHandler(RecalculateStatsAPI_GetStatCoefficients); } private void RecalculateStatsAPI_GetStatCoefficients(CharacterBody sender, StatHookEventArgs args) { if (GetItemCount(sender, out var items) > 0) { args.jumpPowerMultAdd += 0.15f * (float)items; } } } public class InertiaSink : ItemBase { public override string ItemName => "InertiaSink"; public override string ItemLangTokenName => "INERTIA_SINK"; public override string ItemPickupDesc => "Greatly decrease damage taken, but immensely increase knockback taken."; public override string ItemFullDescription => "Increase armor by <style=cIsDamage>100</style> <style=cStack>(<style=cIsDamage>+100</style> per stack)</style>, but increase knockback revieced by <style=cIsDamage>500%</style> <style=cStack>(<style=cIsDamage>500%</style> per stack)</style>."; public override string ItemLore => "Cool to the touch"; public override ItemTierDef ItemTierDef => Addressables.LoadAssetAsync<ItemTierDef>((object)"RoR2/Base/Common/LunarTierDef.asset").WaitForCompletion(); public override ItemTier Tier => (ItemTier)3; public override Sprite ItemIcon => Assets.mainBundle.LoadAsset<Sprite>("Assets/Textures/Icons/Item/texInertiaSinkIcon.png"); public override GameObject ItemModel => Assets.mainBundle.LoadAsset<GameObject>("Assets/Models/Prefabs/Items/InertiaSink.fbx"); public override bool CanRemove => false; public override void Init(ConfigFile config) { CreateLang(); CreateItem(); Hooks(); } public override void Hooks() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown HealthComponent.TakeDamage += new hook_TakeDamage(HealthComponent_TakeDamage); RecalculateStatsAPI.GetStatCoefficients += new StatHookEventHandler(RecalculateStatsAPI_GetStatCoefficients); } private void RecalculateStatsAPI_GetStatCoefficients(CharacterBody sender, StatHookEventArgs args) { if (GetItemCount(sender, out var items) > 0) { args.armorAdd += (float)(100 * items); } } private void HealthComponent_TakeDamage(orig_TakeDamage orig, HealthComponent self, DamageInfo damageInfo) { //IL_0029: 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) if (Object.op_Implicit((Object)(object)self.body) && GetItemCount(self.body, out var items) > 0) { damageInfo.force *= 5f * (float)items; } orig.Invoke(self, damageInfo); } private float HyperScaling(float value, int times) { if (times <= 0) { return value; } return value * HyperScaling(value, times - 1); } } public abstract class ItemBase { public ItemDef ItemDef; public abstract string ItemName { get; } public abstract string ItemLangTokenName { get; } public abstract string ItemPickupDesc { get; } public abstract string ItemFullDescription { get; } public abstract string ItemLore { get; } public abstract ItemTierDef ItemTierDef { get; } public abstract ItemTier Tier { get; } public abstract GameObject ItemModel { get; } public abstract Sprite ItemIcon { get; } public virtual bool Hidden { get; } = false; public virtual bool CanRemove { get; } = true; public virtual bool AIBlacklisted { get; set; } = false; public virtual ItemTag[] ItemTags { get; set; } = (ItemTag[])(object)new ItemTag[0]; public abstract void Init(ConfigFile config); protected void CreateLang() { LanguageAPI.Add("ITEM_" + ItemLangTokenName + "_NAME", ItemName); LanguageAPI.Add("ITEM_" + ItemLangTokenName + "_PICKUP", ItemPickupDesc); LanguageAPI.Add("ITEM_" + ItemLangTokenName + "_DESCRIPTION", ItemFullDescription); LanguageAPI.Add("ITEM_" + ItemLangTokenName + "_LORE", ItemLore); } protected void CreateItem() { //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Unknown result type (might be due to invalid IL or missing references) //IL_0150: Unknown result type (might be due to invalid IL or missing references) //IL_015a: Expected O, but got Unknown //IL_0155: Unknown result type (might be due to invalid IL or missing references) //IL_015f: Expected O, but got Unknown if (AIBlacklisted) { ItemTags = new List<ItemTag>(ItemTags) { (ItemTag)4 }.ToArray(); } ItemDef = ScriptableObject.CreateInstance<ItemDef>(); ((Object)ItemDef).name = "ITEM_" + ItemLangTokenName; ItemDef.nameToken = "ITEM_" + ItemLangTokenName + "_NAME"; ItemDef.pickupToken = "ITEM_" + ItemLangTokenName + "_PICKUP"; ItemDef.descriptionToken = "ITEM_" + ItemLangTokenName + "_DESCRIPTION"; ItemDef.loreToken = "ITEM_" + ItemLangTokenName + "_LORE"; ItemDef.deprecatedTier = Tier; ItemDef.pickupModelPrefab = ItemModel; ItemDef.pickupIconSprite = ItemIcon; ItemDef.hidden = Hidden; ItemDef.canRemove = CanRemove; if (ItemTags.Length != 0) { ItemDef.tags = ItemTags; } ItemAPI.Add(new CustomItem(ItemDef, new ItemDisplayRuleDict((ItemDisplayRule[])null))); } public abstract void Hooks(); protected int MaxItems(int items, int max) { return (items > max) ? max : items; } protected int GetItemCount(CharacterBody body, out int items) { items = 0; if (Object.op_Implicit((Object)(object)body.inventory)) { items = body.inventory.GetItemCount(ItemDef); } return items; } protected T Store<T>(T input, out T store) { store = input; return store; } } public class MoonBoots : ItemBase { public override string ItemName => "MoonBoots"; public override string ItemLangTokenName => "MOON_BOOTS"; public override string ItemPickupDesc => "Crits give you extra jumps."; public override string ItemFullDescription => "Critical hits give you a buff up to a max of <style=cIsDamage>10</style> <style=cStack>(<style=cIsDamage>+10</style> max per stack)</style> upon jumping 1 instance of the buff is consumed to reset your jump cooldown."; public override string ItemLore => "Shoot for the moon (TM)"; public override ItemTierDef ItemTierDef => Addressables.LoadAssetAsync<ItemTierDef>((object)"RoR2/Base/Common/Tier3Def.asset").WaitForCompletion(); public override ItemTier Tier => (ItemTier)2; public override Sprite ItemIcon => Assets.mainBundle.LoadAsset<Sprite>("Assets/Textures/Icons/Item/texMoonBootsIcon.png"); public override GameObject ItemModel => Assets.mainBundle.LoadAsset<GameObject>("Assets/Models/Prefabs/Items/MoonBoots.fbx"); public override ItemTag[] ItemTags => (ItemTag[])(object)new ItemTag[2] { (ItemTag)4, (ItemTag)3 }; public override void Init(ConfigFile config) { CreateLang(); CreateItem(); Hooks(); } public override void Hooks() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown GlobalEventManager.OnCrit += new hook_OnCrit(GlobalEventManager_OnCrit); CharacterMotor.FixedUpdate += new hook_FixedUpdate(CharacterMotor_FixedUpdate); } private void CharacterMotor_FixedUpdate(orig_FixedUpdate orig, CharacterMotor self) { //IL_0024: 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) if (((ButtonState)(ref self.body.inputBank.jump)).justReleased && Store(self.body.GetBuffCount(BuffCatalog.FindBuffIndex("bdMoonJump")), out var store) > 0) { self.body.SetBuffCount(BuffCatalog.FindBuffIndex("bdMoonJump"), store - 1); self.jumpCount--; } orig.Invoke(self); } private void GlobalEventManager_OnCrit(orig_OnCrit orig, GlobalEventManager self, CharacterBody body, DamageInfo damageInfo, CharacterMaster master, float procCoefficient, ProcChainMask procChainMask) { //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) if (GetItemCount(body, out var items) > 0) { int buffCount = body.GetBuffCount(BuffCatalog.FindBuffIndex("bdMoonJump")); body.SetBuffCount(BuffCatalog.FindBuffIndex("bdMoonJump"), MaxItems(buffCount + items, items * 10)); } orig.Invoke(self, body, damageInfo, master, procCoefficient, procChainMask); } } public class PrismaticCrystal : ItemBase { public override string ItemName => "PrismaticCrystal"; public override string ItemLangTokenName => "PRISMATIC_CRYSTAL"; public override string ItemPickupDesc => "The farther away an enemy is the more damage you do. <style=cIsVoid>Corrupts all Focus Crystals</style>."; public override string ItemFullDescription => "Increase damage to enemies at least 13m away by <style=cIsDamage>1%</style> per meter away <style=cStack>(<style=cIsDamage>+1%</style> per meter per stack)</style>. <style=cIsVoid>Corrupts all Focus Crystals</style>."; public override string ItemLore => "When you shine light through it only wiggling shadows are refracted out."; public override ItemTierDef ItemTierDef => Addressables.LoadAssetAsync<ItemTierDef>((object)"RoR2/DLC1/Common/VoidTier1Def.asset").WaitForCompletion(); public override ItemTier Tier => (ItemTier)6; public override Sprite ItemIcon => Assets.mainBundle.LoadAsset<Sprite>("Assets/Textures/Icons/Item/texPrismaticCrystalIcon.png"); public override GameObject ItemModel => Assets.mainBundle.LoadAsset<GameObject>("Assets/Models/Prefabs/Items/PrismaticCrystal/PrismaticCrystal.fbx"); public override bool CanRemove => false; public override ItemTag[] ItemTags => (ItemTag[])(object)new ItemTag[1] { (ItemTag)1 }; public override void Init(ConfigFile config) { CreateLang(); CreateItem(); Hooks(); } public override void Hooks() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown ContagiousItemManager.Init += new hook_Init(ContagiousItemManager_Init); HealthComponent.TakeDamage += new hook_TakeDamage(HealthComponent_TakeDamage); } private void HealthComponent_TakeDamage(orig_TakeDamage orig, HealthComponent self, DamageInfo damageInfo) { //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_002b: 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) CharacterBody body = default(CharacterBody); if (Object.op_Implicit((Object)(object)damageInfo.attacker) && damageInfo.attacker.TryGetComponent<CharacterBody>(ref body) && GetItemCount(body, out var items) > 0 && Store(Vector3.Distance(damageInfo.position, damageInfo.attacker.transform.position), out var store) >= 13f) { damageInfo.damageColorIndex = (DamageColorIndex)9; damageInfo.damage *= 1f + store * ((float)items / 100f); } orig.Invoke(self, damageInfo); } private void ContagiousItemManager_Init(orig_Init orig) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) List<Pair> list = ItemCatalog.itemRelationships[ItemRelationshipTypes.ContagiousItem].ToList(); list.Add(new Pair { itemDef1 = ItemCatalog.GetItemDef(ItemCatalog.FindItemIndex("NearbyDamageBonus")), itemDef2 = ItemDef }); ItemCatalog.itemRelationships[ItemRelationshipTypes.ContagiousItem] = list.ToArray(); orig.Invoke(); } } public class SpentCasing : ItemBase { public override string ItemName => "Spent Casing"; public override string ItemLangTokenName => "SPENT_CASING"; public override string ItemPickupDesc => "Increase Bandit's base damage."; public override string ItemFullDescription => "Increase Bandit's base damage by <style=cIsDamage>1%</style> <style=cStack>(<style=cIsDamage>1%</style> per stack)</style>."; public override string ItemLore => "A spent casing from Bandit's Desert Eagle."; public override ItemTierDef ItemTierDef => Addressables.LoadAssetAsync<ItemTierDef>((object)"RoR2/Base/Common/NoTierDef.asset").WaitForCompletion(); public override ItemTier Tier => (ItemTier)5; public override Sprite ItemIcon => Assets.mainBundle.LoadAsset<Sprite>("Assets/Textures/Icons/Item/texSpentCasingIcon.png"); public override GameObject ItemModel => Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Mystery/PickupMystery.prefab").WaitForCompletion(); public override bool CanRemove => false; public override bool AIBlacklisted => false; public override void Init(ConfigFile config) { CreateLang(); CreateItem(); Hooks(); } public override void Hooks() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown RecalculateStatsAPI.GetStatCoefficients += new StatHookEventHandler(RecalculateStatsAPI_GetStatCoefficients); } public void RecalculateStatsAPI_GetStatCoefficients(CharacterBody sender, StatHookEventArgs args) { if (Object.op_Implicit((Object)(object)sender.inventory)) { args.damageMultAdd += 0.01f * (float)sender.inventory.GetItemCount(ItemDef); } } } public class SpringLoadedHammer : ItemBase { public override string ItemName => "SpringLoadedHammer"; public override string ItemLangTokenName => "SPRING_LOADED_HAMMER"; public override string ItemPickupDesc => "Increases your knockback."; public override string ItemFullDescription => "Increases knockback by <style=cIsDamage>150%</style> <style=cStack>(<style=cIsDamage>150%</style> per stack)</style>."; public override string ItemLore => "BONK!"; public override ItemTierDef ItemTierDef => Addressables.LoadAssetAsync<ItemTierDef>((object)"RoR2/Base/Common/Tier2Def.asset").WaitForCompletion(); public override ItemTier Tier => (ItemTier)1; public override Sprite ItemIcon => Assets.mainBundle.LoadAsset<Sprite>("Assets/Textures/Icons/Item/texSpringLoadedHammerIcon.png"); public override GameObject ItemModel => Assets.mainBundle.LoadAsset<GameObject>("Assets/Models/Prefabs/Items/SpringLoadedHammer.fbx"); public override ItemTag[] ItemTags => (ItemTag[])(object)new ItemTag[1] { (ItemTag)3 }; public override void Init(ConfigFile config) { CreateLang(); CreateItem(); Hooks(); } public override void Hooks() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown HealthComponent.TakeDamage += new hook_TakeDamage(HealthComponent_TakeDamage); } private void HealthComponent_TakeDamage(orig_TakeDamage orig, HealthComponent self, DamageInfo damageInfo) { //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) CharacterBody body = default(CharacterBody); if (Object.op_Implicit((Object)(object)damageInfo.attacker) && damageInfo.attacker.TryGetComponent<CharacterBody>(ref body) && GetItemCount(body, out var items) > 0) { damageInfo.force *= 1f + 1.5f * (float)items; } orig.Invoke(self, damageInfo); } } } namespace RockeryPlugin.Equipment { public abstract class EquipmentBase { public EquipmentDef EquipmentDef; public abstract string EquipmentName { get; } public abstract string EquipmentLangTokenName { get; } public abstract string EquipmentPickupDesc { get; } public abstract string EquipmentFullDescription { get; } public abstract string EquipmentLore { get; } public abstract GameObject EquipmentModel { get; } public abstract Sprite EquipmentIcon { get; } public virtual bool AppearsInSinglePlayer { get; } = true; public virtual bool AppearsInMultiPlayer { get; } = true; public virtual bool CanDrop { get; } = true; public virtual float Cooldown { get; } = 60f; public virtual bool EnigmaCompatible { get; } = true; public virtual bool IsBoss { get; } = false; public virtual bool IsLunar { get; } = false; public abstract void Init(ConfigFile config); protected void CreateLang() { LanguageAPI.Add("EQUIPMENT_" + EquipmentLangTokenName + "_NAME", EquipmentName); LanguageAPI.Add("EQUIPMENT_" + EquipmentLangTokenName + "_PICKUP", EquipmentPickupDesc); LanguageAPI.Add("EQUIPMENT_" + EquipmentLangTokenName + "_DESCRIPTION", EquipmentFullDescription); LanguageAPI.Add("EQUIPMENT_" + EquipmentLangTokenName + "_LORE", EquipmentLore); } protected void CreateEquipment() { //IL_0148: Unknown result type (might be due to invalid IL or missing references) //IL_0152: Expected O, but got Unknown //IL_014d: Unknown result type (might be due to invalid IL or missing references) //IL_0157: Expected O, but got Unknown //IL_015f: Unknown result type (might be due to invalid IL or missing references) //IL_0169: Expected O, but got Unknown EquipmentDef = ScriptableObject.CreateInstance<EquipmentDef>(); ((Object)EquipmentDef).name = "EQUIPMENT_" + EquipmentLangTokenName; EquipmentDef.nameToken = "EQUIPMENT_" + EquipmentLangTokenName + "_NAME"; EquipmentDef.pickupToken = "EQUIPMENT_" + EquipmentLangTokenName + "_PICKUP"; EquipmentDef.descriptionToken = "EQUIPMENT_" + EquipmentLangTokenName + "_DESCRIPTION"; EquipmentDef.loreToken = "EQUIPMENT_" + EquipmentLangTokenName + "_LORE"; EquipmentDef.pickupModelPrefab = EquipmentModel; EquipmentDef.pickupIconSprite = EquipmentIcon; EquipmentDef.appearsInSinglePlayer = AppearsInSinglePlayer; EquipmentDef.appearsInMultiPlayer = AppearsInMultiPlayer; EquipmentDef.canDrop = CanDrop; EquipmentDef.cooldown = Cooldown; EquipmentDef.enigmaCompatible = EnigmaCompatible; EquipmentDef.isBoss = IsBoss; EquipmentDef.isLunar = IsLunar; ItemAPI.Add(new CustomEquipment(EquipmentDef, new ItemDisplayRuleDict((ItemDisplayRule[])null))); EquipmentSlot.PerformEquipmentAction += new hook_PerformEquipmentAction(EquipmentSlot_PerformEquipmentAction); } private bool EquipmentSlot_PerformEquipmentAction(orig_PerformEquipmentAction orig, EquipmentSlot self, EquipmentDef equipmentDef) { if ((Object)(object)equipmentDef == (Object)(object)EquipmentDef) { return ActivateEquipment(self); } return orig.Invoke(self, equipmentDef); } protected abstract bool ActivateEquipment(EquipmentSlot slot); } public class ProjectileAccelerator : EquipmentBase { public override string EquipmentName => "Projectile Accelerator"; public override string EquipmentLangTokenName => "PROJECTILE_ACCELERATOR"; public override string EquipmentPickupDesc => "Go pew pew."; public override string EquipmentFullDescription => "Increase Base Damage by <style=cIsDamage>50%</style>, double range, and reduce all bullet spread for <style=cIsDamage>8 seconds</style>."; public override string EquipmentLore => "Pew Pew"; public override Sprite EquipmentIcon => Assets.mainBundle.LoadAsset<Sprite>("Assets/Textures/Icons/Equipment/texProjectileAcceleratorIcon.png"); public override GameObject EquipmentModel => Assets.mainBundle.LoadAsset<GameObject>("Assets/Models/Prefabs/Equipment/ProjectileAccelerator.fbx"); public override float Cooldown => 70f; public override void Init(ConfigFile config) { CreateLang(); CreateEquipment(); } protected override bool ActivateEquipment(EquipmentSlot slot) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) slot.characterBody.AddTimedBuff(BuffCatalog.FindBuffIndex("bdProjectileAcceleration"), 8f); return true; } } } namespace RockeryPlugin.Buffs { public abstract class BuffBase { public BuffDef BuffDef; public abstract string BuffName { get; } public abstract Color Color { get; } public virtual bool CanStack { get; set; } = false; public virtual bool IsDebuff { get; set; } = false; public abstract Sprite BuffIcon { get; } public abstract void Init(ConfigFile config); public void CreateBuff() { //IL_0025: 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) BuffDef = ScriptableObject.CreateInstance<BuffDef>(); ((Object)BuffDef).name = BuffName; BuffDef.buffColor = Color; BuffDef.canStack = CanStack; BuffDef.isDebuff = IsDebuff; BuffDef.iconSprite = BuffIcon; ContentAddition.AddBuffDef(BuffDef); } public abstract void Hooks(); protected T Store<T>(T input, out T store) { store = input; return store; } } public class MoonJump : BuffBase { public override string BuffName => "bdMoonJump"; public override Color Color => Color.blue; public override bool CanStack => true; public override Sprite BuffIcon => Assets.mainBundle.LoadAsset<Sprite>("Assets/Textures/Icons/Buff/texMoonJumpIcon.png"); public override void Init(ConfigFile config) { CreateBuff(); } public override void Hooks() { } } public class ProjectileAcceleration : BuffBase { public override string BuffName => "bdProjectileAcceleration"; public override Color Color => Color.red; public override bool CanStack => true; public override Sprite BuffIcon => Assets.mainBundle.LoadAsset<Sprite>("Assets/Textures/Icons/Buff/texProjectileAccelerationIcon.png"); public override void Init(ConfigFile config) { CreateBuff(); Hooks(); } public override void Hooks() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown RecalculateStatsAPI.GetStatCoefficients += new StatHookEventHandler(RecalculateStatsAPI_GetStatCoefficients); GenericBulletBaseState.ModifyBullet += new hook_ModifyBullet(GenericBulletBaseState_ModifyBullet); } private void RecalculateStatsAPI_GetStatCoefficients(CharacterBody sender, StatHookEventArgs args) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) if (Store(sender.GetBuffCount(BuffCatalog.FindBuffIndex("bdProjectileAcceleration")), out var _) > 0) { args.damageMultAdd += 0.5f; } } public void GenericBulletBaseState_ModifyBullet(orig_ModifyBullet orig, GenericBulletBaseState self, BulletAttack bulletAttack) { //IL_000d: 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) if (Store(((EntityState)self).characterBody.GetBuffCount(BuffCatalog.FindBuffIndex("bdProjectileAcceleration")), out var _) > 0) { bulletAttack.spreadPitchScale = 0f; bulletAttack.spreadYawScale = 0f; bulletAttack.maxSpread = 0f; bulletAttack.minSpread = 0f; bulletAttack.falloffModel = (FalloffModel)0; bulletAttack._maxDistance *= 1.5f; } orig.Invoke(self, bulletAttack); } } } namespace RockeryPlugin.AssetBundles { public static class Assets { public static AssetBundle mainBundle; public const string bundleName = "rockery"; public const string assetBundleFolder = "AssetBundles"; public static string AssetBundlePath => Path.Combine(Path.GetDirectoryName(RockeryPlugin.PInfo.Location), "AssetBundles", "rockery"); public static void Init() { mainBundle = AssetBundle.LoadFromFile(AssetBundlePath); if ((Object)(object)mainBundle != (Object)null) { Log.Debug("Assets loaded"); } else { Log.Debug("Assets failed to load"); } } } } namespace RockeryPlugin.Artifacts { public abstract class ArtifactBase { public ArtifactDef ArtifactDef; public abstract string ArtifactName { get; } public abstract string ArtifactLangTokenName { get; } public abstract string ArtifactDescription { get; } public abstract Sprite ArtifactEnabledIcon { get; } public abstract Sprite ArtifactDisabledIcon { get; } public bool ArtifactEnabled => RunArtifactManager.instance.IsArtifactEnabled(ArtifactDef); public abstract void Init(ConfigFile config); protected void CreateLang() { LanguageAPI.Add("ARTIFACT_" + ArtifactLangTokenName + "_NAME", ArtifactName); LanguageAPI.Add("ARTIFACT_" + ArtifactLangTokenName + "_DESCRIPTION", ArtifactDescription); } protected void CreateArtifact() { ArtifactDef = ScriptableObject.CreateInstance<ArtifactDef>(); ArtifactDef.cachedName = "ARTIFACT_" + ArtifactLangTokenName; ArtifactDef.nameToken = "ARTIFACT_" + ArtifactLangTokenName + "_NAME"; ArtifactDef.descriptionToken = "ARTIFACT_" + ArtifactLangTokenName + "_DESCRIPTION"; ArtifactDef.smallIconSelectedSprite = ArtifactEnabledIcon; ArtifactDef.smallIconDeselectedSprite = ArtifactDisabledIcon; ContentAddition.AddArtifactDef(ArtifactDef); } public abstract void Hooks(); } public class ArtifactOfGreed : ArtifactBase { public class GreedBehavior : MonoBehaviour { private const int delayBalanceCycle = 6; private const float secondsPerBalance = 60f; private int previousBalanceCycle; private Run run; private Xoroshiro128Plus greedRng; private void Awake() { Chat.AddMessage("Greedy!"); } private void Update() { int currentBalanceCycle = GetCurrentBalanceCycle(); if (previousBalanceCycle < currentBalanceCycle - 6) { previousBalanceCycle = currentBalanceCycle; PerformBalance(); } } private void PerformBalance() { //IL_013c: 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_0129: Expected O, but got Unknown //IL_0157: Unknown result type (might be due to invalid IL or missing references) //IL_015c: Unknown result type (might be due to invalid IL or missing references) //IL_015f: 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_0179: Invalid comparison between Unknown and I4 //IL_01a8: Unknown result type (might be due to invalid IL or missing references) //IL_01aa: Invalid comparison between Unknown and I4 //IL_01c6: Unknown result type (might be due to invalid IL or missing references) //IL_0205: Unknown result type (might be due to invalid IL or missing references) //IL_0213: Unknown result type (might be due to invalid IL or missing references) //IL_0188: Unknown result type (might be due to invalid IL or missing references) //IL_018a: Unknown result type (might be due to invalid IL or missing references) CharacterBody val = null; CharacterBody val2 = null; foreach (PlayerCharacterMasterController instance in PlayerCharacterMasterController.instances) { if (!Object.op_Implicit((Object)(object)instance.master) || !Object.op_Implicit((Object)(object)instance.master.inventory)) { return; } if (!Object.op_Implicit((Object)(object)((val != null) ? val.inventory : null)) || ItemScore(val.inventory) < ItemScore(instance.master.inventory)) { val = instance.master.GetBody(); } if (!Object.op_Implicit((Object)(object)((val2 != null) ? val2.inventory : null)) || ItemScore(val2.inventory) > ItemScore(instance.master.inventory)) { val2 = instance.master.GetBody(); } } if (greedRng == null) { greedRng = new Xoroshiro128Plus(Run.instance.seed); } List<ItemIndex> list = new List<ItemIndex>(val.inventory.itemAcquisitionOrder); ItemIndex val3 = (ItemIndex)(-1); Util.ShuffleList<ItemIndex>(list, greedRng); foreach (ItemIndex item in list) { ItemDef itemDef = ItemCatalog.GetItemDef(item); if (Object.op_Implicit((Object)(object)itemDef) && (int)itemDef.tier != 5) { val3 = item; break; } } if ((int)val3 != -1) { Chat.AddMessage("Moving " + ((Object)ItemCatalog.GetItemDef(val3)).name + " from " + ((Object)val).name + " to " + ((Object)val2).name); val.inventory.RemoveItem(val3, 1); val2.inventory.GiveItem(val3, 1); } } private int GetCurrentBalanceCycle() { return Mathf.FloorToInt(run.GetRunStopwatch() / 60f); } private int ItemScore(Inventory inventory) { return inventory.GetTotalItemCountOfTier((ItemTier)0) + inventory.GetTotalItemCountOfTier((ItemTier)1) * 3 + inventory.GetTotalItemCountOfTier((ItemTier)2) * 12 + inventory.GetTotalItemCountOfTier((ItemTier)3) * 4 + inventory.GetTotalItemCountOfTier((ItemTier)6) + inventory.GetTotalItemCountOfTier((ItemTier)7) * 3 + inventory.GetTotalItemCountOfTier((ItemTier)8) * 12 + inventory.GetTotalItemCountOfTier((ItemTier)4) * 4 + inventory.GetTotalItemCountOfTier((ItemTier)9) * 4; } } public override string ArtifactName => "Artifact of Greed"; public override string ArtifactLangTokenName => "ARTIFACT_OF_GREED"; public override string ArtifactDescription => "Every 30s the player with the highest item score will have a random item transfered to the player with the lowest item score."; public override Sprite ArtifactEnabledIcon => Assets.mainBundle.LoadAsset<Sprite>("Assets/Textures/Icons/Artifact/texArtifactGreedEnabled.png"); public override Sprite ArtifactDisabledIcon => Assets.mainBundle.LoadAsset<Sprite>("Assets/Textures/Icons/Artifact/texArtifactGreedDisabled.png"); public override void Init(ConfigFile config) { CreateConfig(config); CreateLang(); CreateArtifact(); Hooks(); } private void CreateConfig(ConfigFile config) { } public override void Hooks() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown Run.Start += new hook_Start(Run_Start); } private void Run_Start(orig_Start orig, Run self) { if (NetworkServer.active && base.ArtifactEnabled) { ((Component)self).gameObject.AddComponent<GreedBehavior>(); } orig.Invoke(self); } } public class ArtifactOfRobbery : ArtifactBase { private Xoroshiro128Plus robberyRng; public override string ArtifactName => "Artifact of Rob Rockery"; public override string ArtifactLangTokenName => "ARTIFACT_OF_ROBBERY"; public override string ArtifactDescription => "Scrap a random stack of items on death."; public override Sprite ArtifactEnabledIcon => Assets.mainBundle.LoadAsset<Sprite>("Assets/Textures/Icons/Artifact/texArtifactRobberyEnabled.png"); public override Sprite ArtifactDisabledIcon => Assets.mainBundle.LoadAsset<Sprite>("Assets/Textures/Icons/Artifact/texArtifactRobberyDisabled.png"); public override void Init(ConfigFile config) { CreateConfig(config); CreateLang(); CreateArtifact(); Hooks(); } private void CreateConfig(ConfigFile config) { } public override void Hooks() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown GlobalEventManager.OnPlayerCharacterDeath += new hook_OnPlayerCharacterDeath(GlobalEventManager_OnPlayerCharacterDeath); } private void GlobalEventManager_OnPlayerCharacterDeath(orig_OnPlayerCharacterDeath orig, GlobalEventManager self, DamageReport damageReport, NetworkUser victimNetworkUser) { //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Expected O, but got Unknown //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_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Invalid comparison between Unknown and I4 //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Invalid comparison between Unknown and I4 //IL_00dd: 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_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_0100: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_013a: Expected I4, but got Unknown //IL_00a0: 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) if (base.ArtifactEnabled) { if (robberyRng == null) { robberyRng = new Xoroshiro128Plus(Run.instance.seed); } List<ItemIndex> list = new List<ItemIndex>(victimNetworkUser.GetCurrentBody().inventory.itemAcquisitionOrder); ItemIndex val = (ItemIndex)(-1); Util.ShuffleList<ItemIndex>(list, robberyRng); foreach (ItemIndex item in list) { ItemDef itemDef = ItemCatalog.GetItemDef(item); if (Object.op_Implicit((Object)(object)itemDef) && (int)itemDef.tier != 5 && !itemDef.ContainsTag((ItemTag)10)) { val = item; break; } } if ((int)val != -1) { int itemCount = victimNetworkUser.GetCurrentBody().inventory.GetItemCount(val); victimNetworkUser.GetCurrentBody().inventory.RemoveItem(val, itemCount); ItemTier tier = ItemCatalog.GetItemDef(val).tier; ItemTier val2 = tier; switch ((int)val2) { case 3: victimNetworkUser.GetCurrentBody().inventory.GiveItemString("Pearl", itemCount); break; case 4: case 9: victimNetworkUser.GetCurrentBody().inventory.GiveItemString("ScrapYellow", itemCount); break; case 2: case 8: victimNetworkUser.GetCurrentBody().inventory.GiveItemString("ScrapRed", itemCount); break; case 1: case 7: victimNetworkUser.GetCurrentBody().inventory.GiveItemString("ScrapGreen", itemCount); break; default: victimNetworkUser.GetCurrentBody().inventory.GiveItemString("ScrapWhite", itemCount); break; } } } orig.Invoke(self, damageReport, victimNetworkUser); } } public class ArtifactOfTheSlayer : ArtifactBase { public override string ArtifactName => "Artifact of The Slayer"; public override string ArtifactLangTokenName => "ARTIFACT_OF_THE_SLAYER"; public override string ArtifactDescription => "Only spawn champions."; public override Sprite ArtifactEnabledIcon => Assets.mainBundle.LoadAsset<Sprite>("Assets/Textures/Icons/Artifact/texArtifactSlayerEnabled.png"); public override Sprite ArtifactDisabledIcon => Assets.mainBundle.LoadAsset<Sprite>("Assets/Textures/Icons/Artifact/texArtifactSlayerDisabled.png"); public override void Init(ConfigFile config) { CreateConfig(config); CreateLang(); CreateArtifact(); Hooks(); } private void CreateConfig(ConfigFile config) { } public override void Hooks() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Expected O, but got Unknown Run.Start += new hook_Start(Run_Start); CombatDirector.Awake += new hook_Awake(CombatDirector_Awake); ClassicStageInfo.HandleMixEnemyArtifact += new hook_HandleMixEnemyArtifact(ClassicStageInfo_HandleMixEnemyArtifact); } private void ClassicStageInfo_HandleMixEnemyArtifact(orig_HandleMixEnemyArtifact orig, DirectorCardCategorySelection monsterCategories, Xoroshiro128Plus rng) { monsterCategories.CopyFrom(RoR2Content.mixEnemyMonsterCards); if (monsterCategories.categories.Length == 0) { Debug.LogError((object)"MixEnemy monster cards are size 0!"); } if (base.ArtifactEnabled) { TrimCategory("Basic Monsters", 0); TrimCategory("Minibosses", 0); TrimCategory("Champions", 9); } else { TrimCategory("Basic Monsters", 3); TrimCategory("Minibosses", 3); TrimCategory("Champions", 3); } void TrimCategory(string categoryName, int requiredCount) { Category[] categories = monsterCategories.categories; for (int j = 0; j < categories.Length; j++) { if (string.CompareOrdinal(categoryName, categories[j].name) == 0) { Debug.LogFormat("Trimming {0} from {1} to {2}", new object[3] { categoryName, categories[j].cards.Length, requiredCount }); TrimSelection(ref categories[j].cards, requiredCount); } } } void TrimSelection(ref DirectorCard[] cards, int requiredCount) { if (cards.Length > requiredCount) { DirectorCard[] array = ArrayUtils.Clone<DirectorCard>(cards); Util.ShuffleArray<DirectorCard>(array, rng); int num = array.Length - 1; while (num >= 0 && array.Length > requiredCount) { if (!array[num].IsAvailable()) { ArrayUtils.ArrayRemoveAtAndResize<DirectorCard>(ref array, num, 1); } num--; } if (array.Length > requiredCount) { Array.Resize(ref array, requiredCount); } cards = array; DirectorCard[] array2 = cards; DirectorCard[] array3 = array2; foreach (DirectorCard val in array3) { Debug.LogFormat("Selected {0}", new object[1] { ((Object)val.spawnCard).name }); } } } } private void CombatDirector_Awake(orig_Awake orig, CombatDirector self) { if (base.ArtifactEnabled) { self.monsterCredit = 1000f; self.creditMultiplier += 0.5f; self.maxConsecutiveCheapSkips = 4; } orig.Invoke(self); } private void Run_Start(orig_Start orig, Run self) { if (NetworkServer.active && base.ArtifactEnabled) { List<string> list = new List<string>(); list.Add(MonsterNames.AlloyVulture); list.Add(MonsterNames.AlphaConstruct); list.Add(MonsterNames.Beetle); list.Add(MonsterNames.BeetleGuard); list.Add(MonsterNames.BighornBison); list.Add(MonsterNames.BlindPest); list.Add(MonsterNames.BlindPestSnowy); list.Add(MonsterNames.BlindVermin); list.Add(MonsterNames.BlindVerminSnowy); list.Add(MonsterNames.BrassContraption); list.Add(MonsterNames.ClayApothecary); list.Add(MonsterNames.ClayTemplar); list.Add(MonsterNames.ElderLemurian); list.Add(MonsterNames.Geep); list.Add(MonsterNames.Gip); list.Add(MonsterNames.GreaterWisp); list.Add(MonsterNames.Gup); list.Add(MonsterNames.HermitCrab); list.Add(MonsterNames.Imp); list.Add(MonsterNames.Jellyfish); list.Add(MonsterNames.Larva); list.Add(MonsterNames.Lemurian); list.Add(MonsterNames.LesserWisp); list.Add(MonsterNames.LunarChimeraExploder); list.Add(MonsterNames.LunarChimeraGolem); list.Add(MonsterNames.LunarChimeraWisp); list.Add(MonsterNames.MiniMushrum); list.Add(MonsterNames.Parent); list.Add(MonsterNames.SolusProbe); list.Add(MonsterNames.StoneGolem); list.Add(MonsterNames.StoneGolem + "nature"); list.Add(MonsterNames.StoneGolem + "snowy"); list.Add(MonsterNames.VoidBarnacle); list.Add(MonsterNames.VoidInfestor); list.Add(MonsterNames.VoidJailer); list.Add(MonsterNames.VoidReaver); list.ForEach((Action<string>)Helpers.RemoveExistingMonster); } orig.Invoke(self); } } }