// This will update the items odds for the interactables that utilize ExplicitPickupDropTable for specific boss items. private static void UpdateDropTableItemOdds(DropList dropList, ExplicitPickupDropTable dropTable, string interactableName) { if (!DropTableItemOdds.ContainsKey(interactableName)) { DropTableItemOdds.Add(interactableName, new List <float>()); foreach (ExplicitPickupDropTable.Entry entry in dropTable.entries) { DropTableItemOdds[interactableName].Add(entry.pickupWeight); } } if (DropTableItemOdds.ContainsKey(interactableName)) { for (int entryIndex = 0; entryIndex < dropTable.entries.Length; entryIndex++) { dropTable.entries[entryIndex].pickupWeight = DropTableItemOdds[interactableName][entryIndex]; } } for (int entryIndex = 0; entryIndex < dropTable.entries.Length; entryIndex++) { if (!dropList.AvailableBossDropList.Contains(PickupCatalog.FindPickupIndex(dropTable.entries[entryIndex].pickupName))) { dropTable.entries[entryIndex].pickupWeight = 0; } } //dropTable.GenerateWeightedSelection(); }
static public void UpdateDropTableItemOdds(ExplicitPickupDropTable dropTable, string interactableName) { if (InteractableCalculator.dropTableItemInteractables.Contains(interactableName)) { if (!ItemDropAPIFixes.playerInteractables.dropTableItemOdds.ContainsKey(interactableName)) { ItemDropAPIFixes.playerInteractables.dropTableItemOdds.Add(interactableName, new List <float>()); foreach (ExplicitPickupDropTable.Entry entry in dropTable.entries) { ItemDropAPIFixes.playerInteractables.dropTableItemOdds[interactableName].Add(entry.pickupWeight); } } if (ItemDropAPIFixes.playerInteractables.dropTableItemOdds.ContainsKey(interactableName)) { for (int entryIndex = 0; entryIndex < dropTable.entries.Length; entryIndex++) { dropTable.entries[entryIndex].pickupWeight = ItemDropAPIFixes.playerInteractables.dropTableItemOdds[interactableName][entryIndex]; } } for (int entryIndex = 0; entryIndex < dropTable.entries.Length; entryIndex++) { if (!ItemDropAPIFixes.playerItems.Contains(PickupCatalog.FindPickupIndex(dropTable.entries[entryIndex].pickupName))) { dropTable.entries[entryIndex].pickupWeight = 0; } } System.Type type = typeof(RoR2.ExplicitPickupDropTable); System.Reflection.MethodInfo method = type.GetMethod("GenerateWeightedSelection", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); method.Invoke(dropTable, new object[0]); } }
void PopulateScene(On.RoR2.SceneDirector.orig_PopulateScene orig, SceneDirector sceneDirector) { RoR2.InteractableSpawnCard[] allInteractables = UnityEngine.Resources.LoadAll <RoR2.InteractableSpawnCard>("SpawnCards/InteractableSpawnCard"); foreach (RoR2.InteractableSpawnCard spawnCard in allInteractables) { string interactableName = InteractableCalculator.GetSpawnCardName(spawnCard); if (interactableName == "Lockbox" || interactableName == "ScavBackpack") { DropOdds.UpdateChestTierOdds(spawnCard, interactableName); } else if (interactableName == "CasinoChest") { DropOdds.UpdateDropTableTierOdds(spawnCard, interactableName); } else if (interactableName == "ShrineCleanse") { ExplicitPickupDropTable dropTable = spawnCard.prefab.GetComponent <RoR2.ShopTerminalBehavior>().dropTable as ExplicitPickupDropTable; DropOdds.UpdateDropTableItemOdds(dropTable, interactableName); } } if (ClassicStageInfo.instance != null) { int categoriesLength = ClassicStageInfo.instance.interactableCategories.categories.Length; for (int categoryIndex = 0; categoryIndex < categoriesLength; categoryIndex++) { List <DirectorCard> directorCards = new List <DirectorCard>(); foreach (DirectorCard directorCard in ClassicStageInfo.instance.interactableCategories.categories[categoryIndex].cards) { string interactableName = InteractableCalculator.GetSpawnCardName(directorCard.spawnCard); if (new List <string>() { }.Contains(interactableName)) { } if (playerInteractables.interactablesInvalid.Contains(interactableName)) { } else { DropOdds.UpdateChestTierOdds(directorCard.spawnCard, interactableName); DropOdds.UpdateShrineTierOdds(directorCard, interactableName); directorCards.Add(directorCard); } } DirectorCard[] directorCardArray = new DirectorCard[directorCards.Count]; for (int cardIndex = 0; cardIndex < directorCards.Count; cardIndex++) { directorCardArray[cardIndex] = directorCards[cardIndex]; } if (directorCardArray.Length == 0) { ClassicStageInfo.instance.interactableCategories.categories[categoryIndex].selectionWeight = 0; } ClassicStageInfo.instance.interactableCategories.categories[categoryIndex].cards = directorCardArray; } } orig(sceneDirector); }