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; } }
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); }
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); }
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); }