private void Awake() { _logger = Logger; Logger.LogDebug("Performing plugin setup..."); #if DEBUG Logger.LogWarning("Running test build with debug enabled! If you're seeing this after downloading the mod from Thunderstore, please panic."); #endif Logger.LogDebug("Loading assets..."); using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("ClassicItems.classicitems_assets")) { var bundle = AssetBundle.LoadFromStream(stream); var provider = new AssetBundleResourcesProvider("@ClassicItems", bundle); ResourcesAPI.AddProvider(provider); } cfgFile = new ConfigFile(Path.Combine(Paths.ConfigPath, ModGuid + ".cfg"), true); Logger.LogDebug("Loading global configs..."); globalConfig.BindAll(cfgFile, "ClassicItems", "Global"); globalConfig.ConfigEntryChanged += (sender, args) => { if (args.target.boundProperty.Name == nameof(globalConfig.hSV2NoStomp)) { var toBind = (bool)args.newValue == true; if (toBind && !globalConfig.hSV2Bound) { IL.EntityStates.Headstompers.HeadstompersIdle.FixedUpdate += IL_ESHeadstompersIdleFixedUpdate; } else if (!toBind) { IL.EntityStates.Headstompers.HeadstompersIdle.FixedUpdate -= IL_ESHeadstompersIdleFixedUpdate; } } }; Logger.LogDebug("Instantiating item classes..."); masterItemList = ItemBoilerplate.InitAll("ClassicItems"); Logger.LogDebug("Loading item configs..."); foreach (ItemBoilerplate x in masterItemList) { x.ConfigEntryChanged += (sender, args) => { if ((args.flags & (AutoUpdateEventFlags.InvalidateNameToken | (globalConfig.longDesc ? AutoUpdateEventFlags.InvalidateDescToken : AutoUpdateEventFlags.InvalidatePickupToken))) == 0) { return; } if (x.pickupDef != null) { var ctsf = x.pickupDef.displayPrefab?.transform; if (!ctsf) { return; } var cfront = ctsf.Find("cardfront"); if (!cfront) { return; } cfront.Find("carddesc").GetComponent <TextMeshPro>().text = Language.GetString(globalConfig.longDesc ? x.descToken : x.pickupToken); cfront.Find("cardname").GetComponent <TextMeshPro>().text = Language.GetString(x.nameToken); } if (x.logbookEntry != null) { x.logbookEntry.modelPrefab = x.pickupDef.displayPrefab; } }; x.SetupConfig(cfgFile); } Logger.LogDebug("Registering item attributes..."); int longestName = 0; foreach (ItemBoilerplate x in masterItemList) { string mpnOvr = null; if (x is Item item) { mpnOvr = "@ClassicItems:Assets/ClassicItems/models/" + modelNameMap[item.itemTier] + ".prefab"; } else if (x is Equipment eqp) { mpnOvr = "@ClassicItems:Assets/ClassicItems/models/" + (eqp.eqpIsLunar ? "LqpCard.prefab" : "EqpCard.prefab"); } var ipnOvr = "@ClassicItems:Assets/ClassicItems/icons/" + x.itemCodeName + "_icon.png"; if (mpnOvr != null) { typeof(ItemBoilerplate).GetProperty(nameof(ItemBoilerplate.modelPathName)).SetValue(x, mpnOvr); typeof(ItemBoilerplate).GetProperty(nameof(ItemBoilerplate.iconPathName)).SetValue(x, ipnOvr); } x.SetupAttributes("CLASSICITEMS", "CI"); if (x.itemCodeName.Length > longestName) { longestName = x.itemCodeName.Length; } } Logger.LogMessage("Index dump follows (pairs of name / index):"); foreach (ItemBoilerplate x in masterItemList) { if (x is Equipment eqp) { Logger.LogMessage("Equipment CI" + x.itemCodeName.PadRight(longestName) + " / " + ((int)eqp.regIndex).ToString()); } else if (x is Item item) { Logger.LogMessage(" Item CI" + x.itemCodeName.PadRight(longestName) + " / " + ((int)item.regIndex).ToString()); } else if (x is Artifact afct) { Logger.LogMessage(" Artifact CI" + x.itemCodeName.PadRight(longestName) + " / " + ((int)afct.regIndex).ToString()); } else { Logger.LogMessage(" Other CI" + x.itemCodeName.PadRight(longestName) + " / N/A"); } } Logger.LogDebug("Tweaking vanilla stuff..."); //Remove the H3AD-5T V2 state transition from idle to stomp, as Headstompers has similar functionality if (globalConfig.hSV2NoStomp && !globalConfig.hSV2Bound) { globalConfig.hSV2Bound = true; IL.EntityStates.Headstompers.HeadstompersIdle.FixedUpdate += IL_ESHeadstompersIdleFixedUpdate; } On.RoR2.PickupCatalog.Init += On_PickupCatalogInit; On.RoR2.UI.LogBook.LogBookController.BuildPickupEntries += On_LogbookBuildPickupEntries; if (globalConfig.spinMod) { IL.RoR2.PickupDisplay.Update += IL_PickupDisplayUpdate; } Logger.LogDebug("Registering shared buffs..."); //used only for purposes of Death Mark; applied by Permafrost and Snowglobe var freezeBuffDef = new CustomBuff(new BuffDef { buffColor = Color.cyan, canStack = false, isDebuff = true, name = "CIFreeze", iconPath = "@ClassicItems:Assets/ClassicItems/icons/permafrost_icon.png" }); freezeBuff = BuffAPI.Add(freezeBuffDef); var fearBuffDef = new CustomBuff(new BuffDef { buffColor = Color.red, canStack = false, isDebuff = true, name = "CIFear", iconPath = "textures/miscicons/texSprintIcon" }); fearBuff = BuffAPI.Add(fearBuffDef); IL.EntityStates.AI.Walker.Combat.UpdateAI += IL_ESAIWalkerCombatUpdateAI; Logger.LogDebug("Registering item behaviors..."); foreach (ItemBoilerplate x in masterItemList) { x.SetupBehavior(); } Logger.LogDebug("Initial setup done!"); }
private void Awake() { _logger = Logger; using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("ArtifactOfDoom.artifactofdoom")) { var bundle = AssetBundle.LoadFromStream(stream); var provider = new AssetBundleResourcesProvider("@ArtifactOfDoom", bundle); ResourcesAPI.AddProvider(provider); } cfgFile = new ConfigFile(Path.Combine(Paths.ConfigPath, ModGuid + ".cfg"), true); masterItemList = ItemBoilerplate.InitAll("ArtifactOfDoom"); foreach (ItemBoilerplate x in masterItemList) { x.SetupConfig(cfgFile); } averageItemsPerStage = cfgFile.Bind(new ConfigDefinition("Gameplay Settings", "averageItemsPerStage"), 3, new ConfigDescription( "Base chance in percent that enemys steal items from you ((totalItems - currentStage * averageItemsPerStage) ^ exponentTriggerItems; \nIf that value is lower you'll need to kill more enemies to get an item")); exponentTriggerItems = cfgFile.Bind(new ConfigDefinition("Gameplay Settings", "exponentTriggerItems"), 2.0, new ConfigDescription( "The exponent for calculation when you'll get an item. If it's 1 you have a linear increase. Default is 2")); minItemsPerStage = cfgFile.Bind(new ConfigDefinition("Gameplay Settings", "minItemsPerStage"), 2, new ConfigDescription( "The expected minimum item count per stage. If you have less Items than that you'll have a decreased chance that you lose items")); maxItemsPerStage = cfgFile.Bind(new ConfigDefinition("Gameplay Settings", "maxItemsPerStage"), 7, new ConfigDescription( "The expected maximum item count per stage. If you have more Items than that you'll have a chance to lose more than one item per hit")); exponentailFactorToCalculateSumOfLostItems = cfgFile.Bind(new ConfigDefinition("Gameplay Settings", "exponentailFactorToCalculateSumOfLostItems"), 1.5, new ConfigDescription( "The exponent to Calculate how many items you'll lose if you're over maxItemsPerStage")); exponentailFactorIfYouAreUnderAverageItemsPerStage = cfgFile.Bind(new ConfigDefinition("Gameplay Settings", "exponentailFactorIfYouAreUnderAverageItemsPerStage"), 0.0, new ConfigDescription( "The exponent to Calculate how many kills you'll need if you're under averageItemsPerStage. The formula is totalitems^exponentailFactorIfYouAreUnderAverageItemsPerStage. Default is 0 so you'll need always two kills.")); artifactOfSwarmNerf = cfgFile.Bind(new ConfigDefinition("Gameplay Settings", "artifactOfSwarmNerf"), false, new ConfigDescription( "Enable the nerf for Artifact of Swarm where you've to kill double as many enemies")); useArtifactOfSacrificeCalculation = cfgFile.Bind(new ConfigDefinition("Gameplay Settings", "useArtifactOfSacreficeCalculation"), false, new ConfigDescription( "Chance the item gain to a specific drop rate of enemys")); multiplayerForArtifactOfSacrificeDropRate = cfgFile.Bind(new ConfigDefinition("Gameplay Settings", "multiplayerForArtifactOfSacrificeDropRate"), 2.0, new ConfigDescription( "Multiplier for the drop rate (base Chance is 5)")); disableItemProgressBar = cfgFile.Bind(new ConfigDefinition("UI Settings", "disableItemProgressBar"), false, new ConfigDescription( "If true it disables the Progress bar in the bottom of the UI")); disableSideBars = cfgFile.Bind(new ConfigDefinition("UI Settings", "disableSideBars"), false, new ConfigDescription( "Disables the item Sidebars")); enableChatItemOutput = cfgFile.Bind(new ConfigDefinition("UI Settings", "enableChatItemOutput"), false, new ConfigDescription( "Enables the chat output for gained/lost Items. This setting is not synced.")); sizeOfSideBars = cfgFile.Bind(new ConfigDefinition("UI Settings", "sizeOfSideBars"), 0.02, new ConfigDescription( "Spezifies the size of the sidebars. 1 is whole window 0 is invisible (but for that plase use the disable setting).")); timeAfterHitToNotLoseItemDrizzly = cfgFile.Bind(new ConfigDefinition("Gameplay Settings", "timeAfterHitToNotLooseItemDrizzly"), 0.8, new ConfigDescription( "The time in seconds where you will not lose items after you lost one on drizzly")); timeAfterHitToNotLoseItemRainstorm = cfgFile.Bind(new ConfigDefinition("Gameplay Settings", "timeAfterHitToNotLooseItemRainstorm"), 0.2, new ConfigDescription( "The time in seconds where you will not lose items after you lost one on rainstorm")); timeAfterHitToNotLoseItemMonsoon = cfgFile.Bind(new ConfigDefinition("Gameplay Settings", "timeAfterHitToNotLooseItemMonsoon"), 0.05, new ConfigDescription( "The time in seconds where you will not lose items after you lost one on monsoon")); CommandoBonusItems = cfgFile.Bind(new ConfigDefinition("Character specific settings", "CommandoBonusItems"), 1.0, new ConfigDescription( "The count of items which you get if you kill enough enemies")); CommandoMultiplierForTimedBuff = cfgFile.Bind(new ConfigDefinition("Character specific settings", "commandoMultiplyerForTimedBuff"), 1.0, new ConfigDescription( "The Multiplier for that specific character for the length of timeAfterHitToNotLooseItems")); HuntressBonusItems = cfgFile.Bind(new ConfigDefinition("Character specific settings", "HuntressBonusItems"), 1.0, new ConfigDescription( "The count of items which you get if you kill enough enemies")); HuntressMultiplierForTimedBuff = cfgFile.Bind(new ConfigDefinition("Character specific settings", "HuntressMultiplierForTimedBuff"), 1.0, new ConfigDescription( "The Multiplier for that specific character for the length of timeAfterHitToNotLooseItems")); MULTBonusItems = cfgFile.Bind(new ConfigDefinition("Character specific settings", "MULTBonusItems"), 1.0, new ConfigDescription( "The count of items which you get if you kill enough enemies")); MULTMultiplierForTimedBuff = cfgFile.Bind(new ConfigDefinition("Character specific settings", "MULTMultiplierForTimedBuff"), 1.0, new ConfigDescription( "The Multiplier for that specific character for the length of timeAfterHitToNotLooseItems")); EngineerBonusItems = cfgFile.Bind(new ConfigDefinition("Character specific settings", "EngineerBonusItems"), 1.0, new ConfigDescription( "The count of items which you get if you kill enough enemies")); EngineerMultiplierForTimedBuff = cfgFile.Bind(new ConfigDefinition("Character specific settings", "EngineerMultiplierForTimedBuff"), 1.0, new ConfigDescription( "The Multiplier for that specific character for the length of timeAfterHitToNotLooseItems")); ArtificerBonusItems = cfgFile.Bind(new ConfigDefinition("Character specific settings", "ArtificerBonusItems"), 2.0, new ConfigDescription( "The count of items which you get if you kill enough enemies")); ArtificerMultiplierForTimedBuff = cfgFile.Bind(new ConfigDefinition("Character specific settings", "ArtificerMultiplierForTimedBuff"), 1.0, new ConfigDescription( "The Multiplier for that specific character for the length of timeAfterHitToNotLooseItems")); MercenaryBonusItems = cfgFile.Bind(new ConfigDefinition("Character specific settings", "MercenaryBonusItems"), 1.0, new ConfigDescription( "The count of items which you get if you kill enough enemies")); MercenaryMultiplierForTimedBuff = cfgFile.Bind(new ConfigDefinition("Character specific settings", "MercenaryMultiplierForTimedBuff"), 4.0, new ConfigDescription( "The Multiplier for that specific character for the length of timeAfterHitToNotLooseItems")); RexBonusItems = cfgFile.Bind(new ConfigDefinition("Character specific settings", "RexBonusItems"), 1.0, new ConfigDescription( "The count of items which you get if you kill enough enemies")); RexMultiplierForTimedBuff = cfgFile.Bind(new ConfigDefinition("Character specific settings", "RexMultiplierForTimedBuff"), 1.0, new ConfigDescription( "The Multiplier for that specific character for the length of timeAfterHitToNotLooseItems")); LoaderBonusItems = cfgFile.Bind(new ConfigDefinition("Character specific settings", "LoaderBonusItems"), 1.0, new ConfigDescription( "The count of items which you get if you kill enough enemies")); LoaderMultiplierForTimedBuff = cfgFile.Bind(new ConfigDefinition("Character specific settings", "LoaderMultiplierForTimedBuff"), 4.0, new ConfigDescription( "The Multiplier for that specific character for the length of timeAfterHitToNotLooseItems")); AcridBonusItems = cfgFile.Bind(new ConfigDefinition("Character specific settings", "AcridBonusItems"), 1.0, new ConfigDescription( "The count of items which you get if you kill enough enemies")); AcridMultiplierForTimedBuff = cfgFile.Bind(new ConfigDefinition("Character specific settings", "AcridMultiplierForTimedBuff"), 4.0, new ConfigDescription( "The Multiplier for that specific character for the length of timeAfterHitToNotLooseItems")); CaptainBonusItems = cfgFile.Bind(new ConfigDefinition("Character specific settings", "CaptainBonusItems"), 1.0, new ConfigDescription( "The count of items which you get if you kill enough enemies")); CaptainMultiplierForTimedBuff = cfgFile.Bind(new ConfigDefinition("Character specific settings", "CaptainMultiplierForTimedBuff"), 1.0, new ConfigDescription( "The Multiplier for that specific character for the length of timeAfterHitToNotLooseItems")); CustomSurvivorBonusItems = cfgFile.Bind(new ConfigDefinition("Character specific settings", "CustomSurvivorBonusItems"), 1.0, new ConfigDescription( "The count of items which you get if you kill enough enemies")); CustomSurvivorMultiplierForTimedBuff = cfgFile.Bind(new ConfigDefinition("Character specific settings", "CustomSurvivorMultiplierForTimedBuff"), 1.0, new ConfigDescription( "The Multiplier for that specific character for the length of timeAfterHitToNotLoseItems")); CustomChars = cfgFile.Bind(new ConfigDefinition("Character specific settings", "CustomCharacters"), "[{\"Name\": \"CUSTOM_CHAR_BODY_NAME1\", \"MultiplierForTimedBuff\": 1.0, \"BonusItems\": 1.0},{\"Name\": \"CUSTOM_CHAR_BODY_NAME2\", \"MultiplierForTimedBuff\": 2.0, \"BonusItems\": 2.0}]", new ConfigDescription( "The Multiplier for that specific character for the length of timeAfterHitToNotLoseItems")); int longestName = 0; foreach (ItemBoilerplate x in masterItemList) { x.SetupAttributes("ARTDOOM", "ADOOM"); if (x.itemCodeName.Length > longestName) { longestName = x.itemCodeName.Length; } } Logger.LogMessage("Index dump follows (pairs of name / index):"); foreach (ItemBoilerplate x in masterItemList) { if (x is Artifact afct) { Logger.LogMessage(" Artifact ADOOM" + x.itemCodeName.PadRight(longestName) + " / " + ((int)afct.regIndex).ToString()); } else { Logger.LogMessage("Other ADOOM" + x.itemCodeName.PadRight(longestName) + " / N/A"); } } var didLoseItem = new R2API.CustomBuff("didLoseItem", "", Color.black, false, false); buffIndexDidLoseItem = BuffAPI.Add(didLoseItem); foreach (ItemBoilerplate x in masterItemList) { x.SetupBehavior(); } //On.RoR2.UI.HUD.Awake +=myFunc // ArtifactOfDoomUI test = new ArtifactOfDoomUI(); }