Ejemplo n.º 1
0
        public static void Postfix(HotkeyBar __instance, List <HotkeyBar.ElementData> ___m_elements, List <ItemDrop.ItemData> ___m_items, Player player)
        {
            if (player == null || player.IsDead())
            {
                return;
            }

            for (var index = 0; index < ___m_elements.Count; index++)
            {
                var element   = ___m_elements[index];
                var magicItem = ItemBackgroundHelper.CreateAndGetMagicItemBackgroundImage(element.m_go, element.m_equiped, false);
                magicItem.enabled = false;
            }

            for (var index = 0; index < ___m_items.Count; ++index)
            {
                var itemData = ___m_items[index];
                var element  = GetElementForItem(___m_elements, itemData);
                if (element == null)
                {
                    EpicLoot.LogWarning($"Tried to get element for {itemData.m_shared.m_name} at {itemData.m_gridPos}, but element was null (total elements = {___m_elements.Count})");
                    continue;
                }

                var magicItem = ItemBackgroundHelper.CreateAndGetMagicItemBackgroundImage(element.m_go, element.m_equiped, false);
                if (itemData.UseMagicBackground())
                {
                    magicItem.enabled = true;
                    magicItem.sprite  = EpicLoot.GetMagicItemBgSprite();
                    magicItem.color   = itemData.GetRarityColor();
                }
            }
        }
        public static void Add(MagicItemEffectDefinition effectDef)
        {
            if (AllDefinitions.ContainsKey(effectDef.Type))
            {
                EpicLoot.LogWarning($"Removed previously existing magic effect type: {effectDef.Type}");
                AllDefinitions.Remove(effectDef.Type);
            }

            EpicLoot.Log($"Added MagicItemEffect: {effectDef.Type}");
            AllDefinitions.Add(effectDef.Type, effectDef);
        }
Ejemplo n.º 3
0
        private static void OnTreasureChestSpawnComplete(bool success, Vector3 spawnPoint)
        {
            var output = "> Failed to spawn treasure map chest";

            if (success)
            {
                output = $"> Spawning Treasure Map Chest at <{spawnPoint.x:0.#}, {spawnPoint.z:0.#}> (height:{spawnPoint.y:0.#})";
            }

            Console.instance.AddString(output);
            EpicLoot.LogWarning(output);
        }
        public static bool IsValuelessEffect(string effectType, ItemRarity rarity)
        {
            var effectDef = Get(effectType);

            if (effectDef == null)
            {
                EpicLoot.LogWarning($"Checking if unknown effect is valuless ({effectType}/{rarity})");
                return(false);
            }

            return(effectDef.GetValuesForRarity(rarity) == null);
        }
Ejemplo n.º 5
0
        public static LootDrop[] GetLootForLevel([NotNull] LootTable lootTable, int level, bool useNextHighestIfNotPresent = true)
        {
            if (level == 3 && !ArrayUtils.IsNullOrEmpty(lootTable.Loot3))
            {
                if (lootTable.LeveledLoot.Any(x => x.Level == level))
                {
                    EpicLoot.LogWarning($"Duplicated leveled loot for ({lootTable.Object} lvl {level}), using 'Loot{level}'");
                }
                return(lootTable.Loot3.ToArray());
            }

            if ((level == 2 || level == 3) && !ArrayUtils.IsNullOrEmpty(lootTable.Loot2))
            {
                if (lootTable.LeveledLoot.Any(x => x.Level == level))
                {
                    EpicLoot.LogWarning($"Duplicated leveled loot for ({lootTable.Object} lvl {level}), using 'Loot{level}'");
                }
                return(lootTable.Loot2.ToArray());
            }

            if (level <= 3 && !ArrayUtils.IsNullOrEmpty(lootTable.Loot))
            {
                if (lootTable.LeveledLoot.Any(x => x.Level == level))
                {
                    EpicLoot.LogWarning($"Duplicated leveled loot for ({lootTable.Object} lvl {level}), using 'Loot'");
                }
                return(lootTable.Loot.ToArray());
            }

            for (var lvl = level; lvl >= 1; --lvl)
            {
                var found = lootTable.LeveledLoot.Find(x => x.Level == lvl);
                if (found != null && !ArrayUtils.IsNullOrEmpty(found.Loot))
                {
                    return(found.Loot.ToArray());
                }

                if (!useNextHighestIfNotPresent)
                {
                    return(null);
                }
            }

            EpicLoot.LogError($"Could not find any leveled loot for ({lootTable.Object} lvl {level}), but a loot table exists for this object!");
            return(null);
        }
Ejemplo n.º 6
0
        public static List <KeyValuePair <int, float> > GetDropsForLevel([NotNull] LootTable lootTable, int level, bool useNextHighestIfNotPresent = true)
        {
            if (level == 3 && !ArrayUtils.IsNullOrEmpty(lootTable.Drops3))
            {
                if (lootTable.LeveledLoot.Any(x => x.Level == level))
                {
                    EpicLoot.LogWarning($"Duplicated leveled drops for ({lootTable.Object} lvl {level}), using 'Drops{level}'");
                }
                return(ToDropList(lootTable.Drops3));
            }

            if ((level == 2 || level == 3) && !ArrayUtils.IsNullOrEmpty(lootTable.Drops2))
            {
                if (lootTable.LeveledLoot.Any(x => x.Level == level))
                {
                    EpicLoot.LogWarning($"Duplicated leveled drops for ({lootTable.Object} lvl {level}), using 'Drops{level}'");
                }
                return(ToDropList(lootTable.Drops2));
            }

            if (level <= 3 && !ArrayUtils.IsNullOrEmpty(lootTable.Drops))
            {
                if (lootTable.LeveledLoot.Any(x => x.Level == level))
                {
                    EpicLoot.LogWarning($"Duplicated leveled drops for ({lootTable.Object} lvl {level}), using 'Drops'");
                }
                return(ToDropList(lootTable.Drops));
            }

            for (var lvl = level; lvl >= 1; --lvl)
            {
                var found = lootTable.LeveledLoot.Find(x => x.Level == lvl);
                if (found != null && !ArrayUtils.IsNullOrEmpty(found.Drops))
                {
                    return(ToDropList(found.Drops));
                }

                if (!useNextHighestIfNotPresent)
                {
                    return(null);
                }
            }

            EpicLoot.LogError($"Could not find any leveled drops for ({lootTable.Object} lvl {level}), but a loot table exists for this object!");
            return(null);
        }
Ejemplo n.º 7
0
        public static void UpdatePlayerZDOForEquipment(Player player, ItemDrop.ItemData item, bool equip)
        {
            if (!(player?.m_nview?.GetZDO() is ZDO zdo))
            {
                return;
            }

            var magicItem = item.GetMagicItem();
            var data      = equip ? (magicItem != null && magicItem.IsUniqueLegendary() ? magicItem.LegendaryID : "") : "";

            var itemType = item.m_shared.m_itemType;

            switch (itemType)
            {
            case ItemDrop.ItemData.ItemType.Bow:
            case ItemDrop.ItemData.ItemType.OneHandedWeapon:
            case ItemDrop.ItemData.ItemType.TwoHandedWeapon:
            case ItemDrop.ItemData.ItemType.Shield:
                if (player.m_leftItem?.m_dropPrefab.name == item.m_dropPrefab.name)
                {
                    zdo.Set("lf-ell", data);
                }
                if (player.m_rightItem?.m_dropPrefab.name == item.m_dropPrefab.name)
                {
                    zdo.Set("ri-ell", data);
                }
                break;

            case ItemDrop.ItemData.ItemType.Chest: zdo.Set("ch-ell", data); break;

            case ItemDrop.ItemData.ItemType.Legs: zdo.Set("lg-ell", data); break;

            case ItemDrop.ItemData.ItemType.Helmet: zdo.Set("hl-ell", data); break;

            case ItemDrop.ItemData.ItemType.Shoulder: zdo.Set("sh-ell", data); break;

            case ItemDrop.ItemData.ItemType.Utility: zdo.Set("ut-ell", data); break;
            }

            EpicLoot.LogWarning($"Setting Equipment ZDO: {itemType}='{data}'");
        }
Ejemplo n.º 8
0
            public static void ForceResetVisEquipment(Humanoid humanoid, ItemDrop.ItemData item)
            {
                if (humanoid == null || humanoid.m_visEquipment == null || item == null)
                {
                    return;
                }

                EpicLoot.LogWarning($"Force Reset VisEquip: {item.m_shared.m_itemType}");
                switch (item.m_shared.m_itemType)
                {
                case ItemDrop.ItemData.ItemType.OneHandedWeapon:
                    if (humanoid.m_rightItem != null && humanoid.m_rightItem.m_shared.m_itemType == ItemDrop.ItemData.ItemType.Torch && humanoid.m_leftItem == null)
                    {
                        humanoid.m_visEquipment.m_currentLeftItemHash = -1;
                    }
                    humanoid.m_visEquipment.m_currentRightItemHash = -1;
                    break;

                case ItemDrop.ItemData.ItemType.Shield:
                case ItemDrop.ItemData.ItemType.Bow:
                    humanoid.m_visEquipment.m_currentLeftItemHash = -1;
                    break;

                case ItemDrop.ItemData.ItemType.TwoHandedWeapon:    humanoid.m_visEquipment.m_currentRightItemHash = -1;    break;

                case ItemDrop.ItemData.ItemType.Chest:              humanoid.m_visEquipment.m_currentChestItemHash = -1;    break;

                case ItemDrop.ItemData.ItemType.Legs:               humanoid.m_visEquipment.m_currentLegItemHash = -1;      break;

                case ItemDrop.ItemData.ItemType.Helmet:             humanoid.m_visEquipment.m_currentHelmetItemHash = -1;   break;

                case ItemDrop.ItemData.ItemType.Shoulder:           humanoid.m_visEquipment.m_currentShoulderItemHash = -1; break;

                case ItemDrop.ItemData.ItemType.Utility:            humanoid.m_visEquipment.m_currentUtilityItemHash = -1;  break;

                case ItemDrop.ItemData.ItemType.Tool:               humanoid.m_visEquipment.m_currentRightItemHash = -1;    break;
                }
            }
Ejemplo n.º 9
0
        public static void Postfix(HotkeyBar __instance, List <HotkeyBar.ElementData> ___m_elements, List <ItemDrop.ItemData> ___m_items, Player player)
        {
            if (player == null || player.IsDead())
            {
                return;
            }

            Dictionary <int, ItemDrop.ItemData> itemPosition = new Dictionary <int, ItemDrop.ItemData>();

            foreach (ItemDrop.ItemData itemData in ___m_items)
            {
                if (GetElementIndexForItem(___m_elements, itemData) is int elementIndex)
                {
                    itemPosition[elementIndex] = itemData;
                }
                else
                {
                    EpicLoot.LogWarning($"Tried to get element for {itemData.m_shared.m_name} at {itemData.m_gridPos}, but element was null (total elements = {___m_elements.Count})");
                }
            }

            for (var index = 0; index < ___m_elements.Count; index++)
            {
                var element = ___m_elements[index];

                var magicItem = ItemBackgroundHelper.CreateAndGetMagicItemBackgroundImage(element.m_go, element.m_equiped, false);
                if (itemPosition.TryGetValue(index, out ItemDrop.ItemData itemData) && itemData.UseMagicBackground())
                {
                    magicItem.enabled = true;
                    magicItem.sprite  = EpicLoot.GetMagicItemBgSprite();
                    magicItem.color   = itemData.GetRarityColor();
                }
                else
                {
                    magicItem.enabled = false;
                }
            }
        }
Ejemplo n.º 10
0
        public static void Initialize(LootConfig lootConfig)
        {
            Config = lootConfig;

            var random = new System.Random();

            _weightedDropCountTable   = new WeightedRandomCollection <int[]>(random);
            _weightedLootTable        = new WeightedRandomCollection <LootDrop>(random);
            _weightedEffectTable      = new WeightedRandomCollection <MagicItemEffectDefinition>(random);
            _weightedEffectCountTable = new WeightedRandomCollection <KeyValuePair <int, int> >(random);
            _weightedRarityTable      = new WeightedRandomCollection <KeyValuePair <ItemRarity, int> >(random);

            ItemSets.Clear();
            LootTables.Clear();
            if (Config == null)
            {
                EpicLoot.LogWarning("Initialized LootRoller with null");
                return;
            }

            AddItemSets(lootConfig.ItemSets);
            AddLootTables(lootConfig.LootTables);
        }
Ejemplo n.º 11
0
        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);
        }