コード例 #1
0
        public static List <string> GetSetPieces(string setName)
        {
            if (UniqueLegendaryHelper.TryGetLegendarySetInfo(setName, out var setInfo))
            {
                return(setInfo.LegendaryIDs);
            }

            return(GetMundaneSetPieces(ObjectDB.instance, setName));
        }
コード例 #2
0
ファイル: MagicItem.cs プロジェクト: sbtoonz/ValheimMods
        public LegendaryInfo GetLegendaryInfo()
        {
            if (IsUniqueLegendary())
            {
                UniqueLegendaryHelper.TryGetLegendaryInfo(LegendaryID, out var legendaryInfo);
                return(legendaryInfo);
            }

            return(null);
        }
コード例 #3
0
 public static string GetDescription(this ItemDrop.ItemData itemData)
 {
     if (itemData.IsMagic())
     {
         var magicItem = itemData.GetMagicItem();
         if (magicItem.IsUniqueLegendary() && UniqueLegendaryHelper.TryGetLegendaryInfo(magicItem.LegendaryID, out var legendaryInfo))
         {
             return(legendaryInfo.Description);
         }
     }
     return(itemData.m_shared.m_description);
 }
コード例 #4
0
        private static string GetSetItemDisplayName(string setItemName, bool isMundane)
        {
            if (isMundane)
            {
                return(setItemName);
            }
            else if (UniqueLegendaryHelper.TryGetLegendaryInfo(setItemName, out var legendaryInfo))
            {
                return(legendaryInfo.Name);
            }

            return(setItemName);
        }
コード例 #5
0
        public static HashSet <LegendarySetInfo> GetEquippedSets(this Player player)
        {
            var sets = new HashSet <LegendarySetInfo>();

            foreach (var itemData in player.GetEquipment())
            {
                if (itemData.IsMagic(out var magicItem) && magicItem.IsLegendarySetItem())
                {
                    if (UniqueLegendaryHelper.TryGetLegendarySetInfo(magicItem.SetID, out var setInfo))
                    {
                        sets.Add(setInfo);
                    }
                }
            }

            return(sets);
        }
コード例 #6
0
        public static int GetSetSize(this ItemDrop.ItemData itemData)
        {
            var setID = itemData.GetSetID(out var isMundane);

            if (!string.IsNullOrEmpty(setID))
            {
                if (isMundane)
                {
                    return(itemData.m_shared.m_setSize);
                }
                else if (UniqueLegendaryHelper.TryGetLegendarySetInfo(setID, out var setInfo))
                {
                    return(setInfo.LegendaryIDs.Count);
                }
            }

            return(0);
        }
コード例 #7
0
ファイル: Terminal_Patch.cs プロジェクト: sbtoonz/ValheimMods
        private static void SpawnMagicItemSet(Terminal terminal, string[] args)
        {
            if (args.Length < 2)
            {
                terminal.AddString("> Specify Set ID");
                return;
            }

            var setID = args[1];

            terminal.AddString($"magicitemset - setID:{setID}");

            if (!UniqueLegendaryHelper.TryGetLegendarySetInfo(setID, out var setInfo))
            {
                terminal.AddString($"> Could not find set info for setID: ({setID})");
                return;
            }

            foreach (var legendaryID in setInfo.LegendaryIDs)
            {
                SpawnLegendaryItemHelper(legendaryID, null, terminal);
            }
        }
コード例 #8
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);
        }
コード例 #9
0
ファイル: LootRoller.cs プロジェクト: sbtoonz/ValheimMods
        public static MagicItem RollMagicItem(ItemRarity rarity, ExtendedItemData baseItem, float luckFactor)
        {
            var cheatLegendary = !string.IsNullOrEmpty(CheatForceLegendary);

            if (cheatLegendary)
            {
                rarity = ItemRarity.Legendary;
            }

            var magicItem = new MagicItem {
                Rarity = rarity
            };

            var effectCount = CheatEffectCount >= 1 ? CheatEffectCount : RollEffectCountPerRarity(magicItem.Rarity);

            if (rarity == ItemRarity.Legendary)
            {
                LegendaryInfo legendary = null;
                if (cheatLegendary)
                {
                    UniqueLegendaryHelper.TryGetLegendaryInfo(CheatForceLegendary, out legendary);
                }

                if (legendary == null)
                {
                    var roll        = Random.Range(0.0f, 1.0f);
                    var rollSetItem = roll < EpicLoot.SetItemDropChance.Value;
                    Debug.LogWarning($"Rolling Legendary: set={rollSetItem} ({roll}/{EpicLoot.SetItemDropChance.Value})");
                    var availableLegendaries = UniqueLegendaryHelper.GetAvailableLegendaries(baseItem, magicItem, rollSetItem);
                    Debug.LogWarning($"Available Legendaries: {string.Join(", ", availableLegendaries.Select(x => x.ID))}");
                    _weightedLegendaryTable.Setup(availableLegendaries, x => x.SelectionWeight);
                    legendary = _weightedLegendaryTable.Roll();
                }

                if (legendary.IsSetItem)
                {
                    var setID = UniqueLegendaryHelper.GetSetForLegendaryItem(legendary);
                    magicItem.SetID = setID;
                }

                if (!UniqueLegendaryHelper.IsGenericLegendary(legendary))
                {
                    magicItem.LegendaryID = legendary.ID;
                    magicItem.DisplayName = legendary.Name;

                    if (legendary.GuaranteedEffectCount > 0)
                    {
                        effectCount = legendary.GuaranteedEffectCount;
                    }

                    foreach (var guaranteedMagicEffect in legendary.GuaranteedMagicEffects)
                    {
                        var effectDef = MagicItemEffectDefinitions.Get(guaranteedMagicEffect.Type);
                        if (effectDef == null)
                        {
                            EpicLoot.LogError($"Could not find magic effect (Type={guaranteedMagicEffect.Type}) while creating legendary item (ID={legendary.ID})");
                            continue;
                        }

                        var effect = RollEffect(effectDef, ItemRarity.Legendary, guaranteedMagicEffect.Values);
                        magicItem.Effects.Add(effect);
                        effectCount--;
                    }
                }
            }

            for (var i = 0; i < effectCount; i++)
            {
                var availableEffects = MagicItemEffectDefinitions.GetAvailableEffects(baseItem, magicItem);
                if (availableEffects.Count == 0)
                {
                    EpicLoot.LogWarning($"Tried to add more effects to magic item ({baseItem.m_shared.m_name}) but there were no more available effects. " +
                                        $"Current Effects: {(string.Join(", ", magicItem.Effects.Select(x => x.EffectType.ToString())))}");
                    break;
                }

                _weightedEffectTable.Setup(availableEffects, x => x.SelectionWeight);
                var effectDef = _weightedEffectTable.Roll();

                var effect = RollEffect(effectDef, magicItem.Rarity);
                magicItem.Effects.Add(effect);
            }

            if (string.IsNullOrEmpty(magicItem.DisplayName))
            {
                magicItem.DisplayName = MagicItemNames.GetNameForItem(baseItem, magicItem);
            }

            return(magicItem);
        }
コード例 #10
0
ファイル: Terminal_Patch.cs プロジェクト: sbtoonz/ValheimMods
        private static void SpawnLegendaryItemHelper(string legendaryID, string itemType, Terminal context)
        {
            if (!UniqueLegendaryHelper.TryGetLegendaryInfo(legendaryID, out var legendaryInfo))
            {
                if (context != null)
                {
                    context.AddString($"> Could not find info for legendaryID: ({legendaryID})");
                }
                return;
            }

            if (string.IsNullOrEmpty(itemType))
            {
                var dummyMagicItem = new MagicItem {
                    Rarity = ItemRarity.Legendary
                };
                var allowedItems = new List <ItemDrop>();
                foreach (var itemName in GatedItemTypeHelper.ItemInfoByID.Keys)
                {
                    var itemPrefab = ObjectDB.instance.GetItemPrefab(itemName);
                    if (itemPrefab == null)
                    {
                        continue;
                    }

                    var itemDrop = itemPrefab.GetComponent <ItemDrop>();
                    if (itemDrop == null)
                    {
                        continue;
                    }

                    var itemData = itemDrop.m_itemData;
                    if (legendaryInfo.Requirements.CheckRequirements(itemData, dummyMagicItem))
                    {
                        allowedItems.Add(itemDrop);
                    }
                }

                itemType = allowedItems.LastOrDefault()?.name;
            }

            if (string.IsNullOrEmpty(itemType))
            {
                itemType = "Club";
            }

            var loot = new LootTable
            {
                Object = "Console",
                Drops  = new[] { new float[] { 1, 1 } },
                Loot   = new[]
                {
                    new LootDrop
                    {
                        Item   = itemType,
                        Rarity = new float[] { 0, 0, 0, 1 }
                    }
                }
            };

            LootRoller.CheatForceLegendary = legendaryID;
            var previousDisableGatingState = LootRoller.CheatDisableGating;

            LootRoller.CheatDisableGating = true;

            var randomOffset = UnityEngine.Random.insideUnitSphere;
            var dropPoint    = Player.m_localPlayer.transform.position + Player.m_localPlayer.transform.forward * 3 + Vector3.up * 1.5f + randomOffset;

            LootRoller.RollLootTableAndSpawnObjects(loot, 1, loot.Object, dropPoint);

            LootRoller.CheatForceLegendary = null;
            LootRoller.CheatDisableGating  = previousDisableGatingState;
        }
コード例 #11
0
 public static LegendarySetInfo GetLegendarySetInfo(this ItemDrop.ItemData itemData)
 {
     UniqueLegendaryHelper.TryGetLegendarySetInfo(itemData.GetSetID(), out var setInfo);
     return(setInfo);
 }
コード例 #12
0
ファイル: MagicItem.cs プロジェクト: sbtoonz/ValheimMods
        public static string GetEffectText(MagicItemEffect effect, ItemRarity rarity, bool showRange, string legendaryID, MagicItemEffectDefinition.ValueDef valuesOverride)
        {
            var effectDef = MagicItemEffectDefinitions.Get(effect.EffectType);
            var result    = GetEffectText(effectDef, effect.EffectValue);
            var values    = valuesOverride ?? (string.IsNullOrEmpty(legendaryID) ? effectDef.GetValuesForRarity(rarity) : UniqueLegendaryHelper.GetLegendaryEffectValues(legendaryID, effect.EffectType));

            if (showRange && values != null)
            {
                if (!Mathf.Approximately(values.MinValue, values.MaxValue))
                {
                    result += $" [{values.MinValue}-{values.MaxValue}]";
                }
            }
            return(result);
        }