public void Modify(ref ItemDrop.ItemData drop, DropTemplate template, Vector3 position)
        {
            EpicLootItemConfiguration config = GetConfig(template);

            if (config is null)
            {
#if DEBUG
                Log.LogDebug("Found no config for drop template.");
#endif

                return;
            }

            if (drop is null)
            {
                return;
            }

#if DEBUG
            Log.LogDebug("Adding magic modifiers.");
#endif

            var magicItemData = ItemRoller.Roll(
                drop,
                position,
                config);

            if (magicItemData is not null)
            {
#if DEBUG
                Log.LogTrace($"Assigning magickified drop '{drop.m_shared.m_name}'.");
#endif
                drop = magicItemData;
            }
        }
        public void Modify(DropModificationContext context)
        {
            EpicLootItemConfiguration config = GetConfig(context.Template);

            if (config is null)
            {
#if DEBUG
                Log.LogDebug("Found no config for drop template.");
#endif
                return;
            }

            ItemDrop itemDrop = context.ItemDrop;

            if (itemDrop is null)
            {
                return;
            }

#if DEBUG
            Log.LogDebug("Adding magic modifiers.");
#endif

            var magicItemData = ItemRoller.Roll(
                itemDrop.m_itemData,
                context.Drop.transform.position,
                config);

            if (magicItemData is not null)
            {
                itemDrop.m_itemData = magicItemData;
            }
        }
Beispiel #3
0
        public static Rarity RollRarity(EpicLootItemConfiguration config)
        {
            var sumWeight =
                config.RarityWeightNone +
                config.RarityWeightMagic +
                config.RarityWeightRare +
                config.RarityWeightEpic +
                config.RarityWeightLegendary +
                config.RarityWeightUnique;

            var random = Random.Range(0, sumWeight);

            float ongoingSum = 0;

            ongoingSum += config.RarityWeightUnique;
            if (config.RarityWeightUnique > 0 && random <= ongoingSum)
            {
                return(Rarity.Unique);
            }

            ongoingSum += config.RarityWeightLegendary;
            if (config.RarityWeightLegendary > 0 && random <= ongoingSum)
            {
                return(Rarity.Legendary);
            }

            ongoingSum += config.RarityWeightEpic;
            if (config.RarityWeightEpic > 0 && random <= ongoingSum)
            {
                return(Rarity.Epic);
            }

            ongoingSum += config.RarityWeightRare;
            if (config.RarityWeightRare > 0 && random <= ongoingSum)
            {
                return(Rarity.Rare);
            }

            ongoingSum += config.RarityWeightMagic;
            if (config.RarityWeightMagic > 0 && random <= ongoingSum)
            {
                return(Rarity.Magic);
            }

            return(Rarity.None);
        }
        protected override Config InstantiateSubsection(string subsectionName)
        {
            Config newModConfig = null;

            if (subsectionName == EpicLootItemConfiguration.ModName)
            {
                newModConfig = new EpicLootItemConfiguration();
            }
            else if (subsectionName == DropTableModConfigSpawnThat.ModName)
            {
                newModConfig = new DropTableModConfigSpawnThat();
            }
            else if (subsectionName == DropTableModConfigCLLC.ModName)
            {
                newModConfig = new DropTableModConfigCLLC();
            }

            return(newModConfig);
        }
Beispiel #5
0
        public static ItemDrop.ItemData Roll(ItemDrop.ItemData itemData, Vector3 dropPos, EpicLootItemConfiguration config)
        {
            if (!EpicLoot.EpicLoot.CanBeMagicItem(itemData))
            {
#if DEBUG
                Log.LogTrace($"Item '{itemData.m_shared.m_name}' can't be made magic.");
#endif
                return(null);
            }

            var extendedItemData = new ExtendedItemData(itemData);

            var rarity = ItemService.RollRarity(config);

#if DEBUG
            Log.LogTrace($"Item '{itemData.m_shared.m_name}' rolled rarity '{rarity}'.");
#endif

            if (rarity is Rarity.None)
            {
                return(null);
            }

            ItemDrop.ItemData magicItemData = null;

            if (rarity is Rarity.Unique)
            {
                magicItemData = ItemService.MakeUnique(itemData, extendedItemData, config);
            }
            else
            {
                //Make magic.
                var epicLootRarity = ItemService.RarityToItemRarity(rarity);
                if (epicLootRarity is not null)
                {
                    magicItemData = ItemService.MakeMagic(
                        epicLootRarity.Value,
                        itemData,
                        extendedItemData,
                        dropPos);
                }
            }

            return(magicItemData);
        }
Beispiel #6
0
        public static ItemDrop.ItemData MakeUnique(ItemDrop.ItemData itemDrop, ExtendedItemData itemData, EpicLootItemConfiguration config)
        {
            var uniqueIds = config.UniqueIDs.Value.SplitByComma();

            if (uniqueIds.Count > 0)
            {
                var randomId = uniqueIds[Random.Range(0, uniqueIds.Count)];

                if (UniqueLegendaryHelper.TryGetLegendaryInfo(randomId, out LegendaryInfo legendaryInfo))
                {
                    MagicItem magicItem = new MagicItem
                    {
                        Rarity      = ItemRarity.Legendary,
                        LegendaryID = legendaryInfo.ID,
                        DisplayName = legendaryInfo.Name,
                    };

                    if (!legendaryInfo.Requirements.CheckRequirements(itemDrop, magicItem))
                    {
                        Log.LogWarning($"Attempted to roll Epic Loot unique legendary with id '{randomId}' for Drop That config entry '{config.SectionKey}' but requirements were not met. Skipping.");
                        return(null);
                    }

                    if (legendaryInfo.IsSetItem)
                    {
                        magicItem.SetID = UniqueLegendaryHelper.GetSetForLegendaryItem(legendaryInfo);
                    }

                    if ((legendaryInfo.GuaranteedMagicEffects?.Count ?? 0) > 0)
                    {
                        foreach (var effect in legendaryInfo.GuaranteedMagicEffects)
                        {
                            if (MagicItemEffectDefinitions.AllDefinitions.TryGetValue(effect.Type, out MagicItemEffectDefinition effectDefinition))
                            {
                                MagicItemEffect itemEffect = LootRoller.RollEffect(effectDefinition, ItemRarity.Legendary, effect.Values);
                                magicItem.Effects.Add(itemEffect);
                            }
                            else
                            {
                                Log.LogWarning($"Unable to find a guaranteed Epic Loot magic effect '{effect.Type}' while rolling unique legendary with id '{randomId}'. Skipping effect.");
                            }
                        }
                    }

                    var randomEffectCount = LootRoller.RollEffectCountPerRarity(ItemRarity.Legendary) - magicItem.Effects.Count;

                    if (randomEffectCount > 0)
                    {
                        List <MagicItemEffectDefinition> availableEffects = MagicItemEffectDefinitions.GetAvailableEffects(itemData, magicItem, -1);

                        for (int i = 0; i < randomEffectCount; ++i)
                        {
                            MagicItemEffectDefinition effectDefinition = RollWeightedEffect(availableEffects, false);
                            MagicItemEffect           itemEffect       = LootRoller.RollEffect(effectDefinition, ItemRarity.Legendary);
                            magicItem.Effects.Add(itemEffect);
                        }
                    }

                    MagicItemComponent magicComponent = itemData.AddComponent <MagicItemComponent>();

                    magicComponent.SetMagicItem(magicItem);

                    InitializeMagicItem.Invoke(null, new[] { itemData });

                    return(itemData);
                }
                else
                {
                    Log.LogWarning($"Attempted to roll Epic Loot unique legendary with id '{randomId}' but was unable to find matching info registered in Epic Loot.");
                }
            }

            return(null);
        }