Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of 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); } } }