示例#1
0
        //  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);
            }