Esempio n. 1
0
        public static string GetNameForItem(ItemDrop.ItemData item, MagicItem magicItem)
        {
            var baseName = item.m_shared.m_name;

            if (!EpicLoot.UseGeneratedMagicItemNames.Value || magicItem == null)
            {
                return(null);
            }

            var rarity = magicItem.Rarity;

            switch (rarity)
            {
            case ItemRarity.Magic:
                return($"{EpicLoot.GetRarityDisplayName(ItemRarity.Magic)} {baseName}");

            case ItemRarity.Rare:
                var prefix = GetPrefix(magicItem);
                var suffix = GetSuffix(magicItem);
                return($"{prefix}{TranslateAndCapitalize(baseName)}{suffix}");

            case ItemRarity.Epic:
                return(BuildEpicName(item, magicItem));

            case ItemRarity.Legendary:
                return(GetLegendaryName(item, magicItem));

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
Esempio n. 2
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();
                }
            }
        }
Esempio n. 3
0
        public static string GetAdjectivePartForItem(ItemDrop.ItemData item, MagicItem magicItem)
        {
            var adjectives    = GetAllowedNamesFromList(Config.Epic.Adjectives, item, magicItem);
            var adjectivePart = GetRandomStringFromList(adjectives);

            return(string.IsNullOrEmpty(adjectivePart) ? EpicLoot.GetRarityDisplayName(ItemRarity.Epic) : adjectivePart);
        }
Esempio n. 4
0
 public static void Postfix(CharacterDrop __instance)
 {
     if (__instance.m_dropsEnabled)
     {
         EpicLoot.OnCharacterDeath(__instance);
     }
 }
Esempio n. 5
0
        public static void AddLootTable([NotNull] LootTable lootTable)
        {
            var key = lootTable.Object;

            if (string.IsNullOrEmpty(key))
            {
                EpicLoot.LogError("Loot table missing Object name!");
                return;
            }

            EpicLoot.Log($"Added LootTable: {key}");
            if (!LootTables.ContainsKey(key))
            {
                LootTables.Add(key, new List <LootTable>());
            }

            var refKey = lootTable.RefObject;

            if (string.IsNullOrEmpty(refKey))
            {
                LootTables[key].Add(lootTable);
            }
            else
            {
                if (!LootTables.ContainsKey(refKey))
                {
                    EpicLoot.LogError("Loot table missing RefObject name!");
                    return;
                }
                else
                {
                    LootTables[key] = LootTables[refKey];
                }
            }
        }
Esempio n. 6
0
        public static List <MagicItemEffect> RollAugmentEffects(ExtendedItemData item, MagicItem magicItem, int effectIndex)
        {
            var results = new List <MagicItemEffect>();

            var rarity        = magicItem.Rarity;
            var currentEffect = magicItem.Effects[effectIndex];

            results.Add(currentEffect);

            var valuelessEffect  = MagicItemEffectDefinitions.IsValuelessEffect(currentEffect.EffectType, rarity);
            var availableEffects = MagicItemEffectDefinitions.GetAvailableEffects(item, magicItem, valuelessEffect ? -1 : effectIndex);

            for (var i = 0; i < 2 && i < availableEffects.Count; i++)
            {
                var newEffect = RollEffects(availableEffects, rarity, 1, false).FirstOrDefault();
                if (newEffect == null)
                {
                    EpicLoot.LogError($"Rolled a null effect: item:{item.m_shared.m_name}, index:{effectIndex}");
                    continue;
                }

                results.Add(newEffect);

                var newEffectIsValueless = MagicItemEffectDefinitions.IsValuelessEffect(newEffect.EffectType, rarity);
                if (newEffectIsValueless)
                {
                    availableEffects.RemoveAll(x => x.Type == newEffect.EffectType);
                }
            }

            return(results);
        }
Esempio n. 7
0
        private static void SetItemFx(GameObject __result, ItemDrop.ItemData equippedItem, Player player)
        {
            var equipFx = GetEquipFxName(equippedItem, out var mode);

            if (!string.IsNullOrEmpty(equipFx))
            {
                var asset = EpicLoot.LoadAsset <GameObject>(equipFx);
                if (asset != null)
                {
                    var attachObject = mode == FxAttachMode.Player ? player.transform : __result?.transform;
                    if (attachObject == null)
                    {
                        EpicLoot.LogError($"Tried to attach FX to item that did not exist. item={equippedItem.m_shared.m_name}, equipFx={equipFx}, mode={mode}");
                        return;
                    }

                    var equipEffects = attachObject.Find("equiped");
                    if (equipEffects != null && mode == FxAttachMode.EquipRoot)
                    {
                        attachObject = equipEffects;
                    }

                    AttachFx(attachObject, equipFx, asset);
                }
            }
        }
Esempio n. 8
0
        private static bool IsLootTableRefence(string lootDropItem, out LootDrop[] lootList)
        {
            lootList = null;
            var parts = lootDropItem.Split('.');

            if (parts.Length != 2)
            {
                return(false);
            }

            var objectName = parts[0];
            var levelText  = parts[1];

            if (!int.TryParse(levelText, out var level))
            {
                EpicLoot.LogError($"Tried to get a loot table reference from '{lootDropItem}' but could not parse the level value ({levelText})!");
                return(false);
            }

            if (LootTables.ContainsKey(objectName))
            {
                var lootTable = LootTables[objectName].FirstOrDefault();
                if (lootTable != null)
                {
                    lootList = GetLootForLevel(lootTable, level);
                    return(true);
                }

                EpicLoot.LogError($"UNLIKELY: LootTables contains entry for {objectName} but no valid loot tables! Weird!");
            }

            return(false);
        }
Esempio n. 9
0
        public static void AddTreasureAndBountiesPage(TextsDialog textsDialog, Player player)
        {
            var t = new StringBuilder();

            var saveData = player.GetAdventureSaveData();

            t.AppendLine("<color=orange><size=30>$mod_epicloot_merchant_treasuremaps</size></color>");
            t.AppendLine();

            var sortedTreasureMaps = saveData.TreasureMaps.Where(x => x.State == TreasureMapState.Purchased).OrderBy(x => GetBiomeOrder(x.Biome));

            foreach (var treasureMap in sortedTreasureMaps)
            {
                t.AppendLine(Localization.instance.Localize($"$mod_epicloot_merchant_treasuremaps: <color={GetBiomeColor(treasureMap.Biome)}>$biome_{treasureMap.Biome.ToString().ToLower()} #{treasureMap.Interval + 1}</color>"));
            }

            t.AppendLine();
            t.AppendLine();
            t.AppendLine("<color=orange><size=30>$mod_epicloot_activebounties</size></color>");
            t.AppendLine();

            var sortedBounties = saveData.Bounties.OrderBy(x => x.State);

            foreach (var bounty in sortedBounties)
            {
                if (bounty.State == BountyState.Claimed)
                {
                    continue;
                }

                var targetName = AdventureDataManager.GetBountyName(bounty);
                t.AppendLine($"<size=24>{targetName}</size>");
                t.Append($"  <color=silver>$mod_epicloot_activebounties_classification: <color=#d66660>{AdventureDataManager.GetMonsterName(bounty.Target.MonsterID)}</color>, ");
                t.AppendLine($" $mod_epicloot_activebounties_biome: <color={GetBiomeColor(bounty.Biome)}>$biome_{bounty.Biome.ToString().ToLower()}</color></color>");

                var status = "";
                switch (bounty.State)
                {
                case BountyState.InProgress:
                    status = ("<color=#00f0ff>$mod_epicloot_bounties_tooltip_inprogress</color>");
                    break;

                case BountyState.Complete:
                    status = ("<color=#70f56c>$mod_epicloot_bounties_tooltip_vanquished</color>");
                    break;
                }

                t.Append($"  <color=silver>$mod_epicloot_bounties_tooltip_status {status}");

                var iron = bounty.RewardIron;
                var gold = bounty.RewardGold;
                t.AppendLine($", $mod_epicloot_bounties_tooltip_rewards {(iron > 0 ? $"<color=white>{MerchantPanel.GetIronBountyTokenName()} x{iron}</color>" : "")}{(iron > 0 && gold > 0 ? ", " : "")}{(gold > 0 ? $"<color=#f5da53>{MerchantPanel.GetGoldBountyTokenName()} x{gold}</color>" : "")}</color>");
                t.AppendLine();
            }

            textsDialog.m_texts.Insert(EpicLoot.HasAuga ? 2 : 4,
                                       new TextsDialog.TextInfo(
                                           Localization.instance.Localize($"{EpicLoot.GetMagicEffectPip(false)} $mod_epicloot_adventure_title"),
                                           Localization.instance.Localize(t.ToString())));
        }
Esempio n. 10
0
        public static List <ItemDrop.ItemData> GetSetPieces(this ObjectDB objectDB, string setName)
        {
            List <ItemDrop.ItemData> list = new List <ItemDrop.ItemData>();

            foreach (var itemPrefab in objectDB.m_items)
            {
                if (itemPrefab == null)
                {
                    EpicLoot.LogError("Null Item left in ObjectDB! (This means that a prefab was deleted and not an instance)");
                    continue;
                }

                var itemDrop = itemPrefab.GetComponent <ItemDrop>();
                if (itemDrop == null)
                {
                    EpicLoot.LogError($"Item in ObjectDB missing ItemDrop: ({itemPrefab.name})");
                    continue;
                }

                if (itemDrop.m_itemData.m_shared.m_setName == setName)
                {
                    list.Add(itemPrefab.GetComponent <ItemDrop>().m_itemData);
                }
            }

            return(list);
        }
        public static void Postfix(ref string __result, ItemDrop.ItemData item)
        {
            if (item != null && (item.IsMagicCraftingMaterial() || item.IsRunestone()))
            {
                var rarityDisplay = EpicLoot.GetRarityDisplayName(item.GetCraftingMaterialRarity());
                __result = $"<color={item.GetCraftingMaterialRarityColor()}>{rarityDisplay} crafting material\n</color>" + __result;
            }

            if (item != null && !item.IsMagic())
            {
                var text = new StringBuilder();

                // Set stuff
                if (!string.IsNullOrEmpty(item.m_shared.m_setName))
                {
                    // Remove old set stuff
                    var index = __result.IndexOf("\n\n$item_seteffect", StringComparison.InvariantCulture);
                    if (index >= 0)
                    {
                        __result = __result.Remove(index);
                    }

                    // Create new
                    AddSetTooltip(item, text);
                }

                __result += text.ToString();
            }

            __result = __result.Replace("<color=orange>", "<color=lightblue>");
            __result = __result.Replace("<color=yellow>", "<color=lightblue>");
        }
Esempio n. 12
0
        private static string GetLegendaryName(ItemDrop.ItemData item, MagicItem magicItem)
        {
            var allowedNames = GetAllowedNamesFromListAllRequired(Config.Legendary, item, magicItem);
            var name         = GetRandomStringFromList(allowedNames);

            return(string.IsNullOrEmpty(name) ? $"{EpicLoot.GetRarityDisplayName(ItemRarity.Legendary)} {TranslateAndCapitalize(item.m_shared.m_name)}" : name);
        }
Esempio n. 13
0
        public static void Humanoid_UnequipItem_Prefix(Humanoid __instance, ItemDrop.ItemData item)
        {
            if (item == null || !item.m_equiped)
            {
                return;
            }

            var equipFx = GetEquipFxName(item, out var mode);

            if (OtherItemsUseThisEffect(__instance, equipFx, item, mode))
            {
                return;
            }

            if (!string.IsNullOrEmpty(equipFx) && mode == FxAttachMode.Player)
            {
                var effect = __instance.transform.Find(equipFx);
                if (effect == null)
                {
                    EpicLoot.LogError($"Unequipped item ({item.m_shared.m_name}) from player that had fx, but could not find fx ({equipFx})!");
                    return;
                }

                Object.Destroy(effect.gameObject);
            }
        }
Esempio n. 14
0
 public static void AddDebugMagicEffects(MagicItem item)
 {
     if (!string.IsNullOrEmpty(ForcedMagicEffect) && !item.HasEffect(ForcedMagicEffect))
     {
         EpicLoot.Log($"AddDebugMagicEffect {ForcedMagicEffect}");
         item.Effects.Add(RollEffect(MagicItemEffectDefinitions.Get(ForcedMagicEffect), item.Rarity));
     }
 }
Esempio n. 15
0
        public static void Postfix(Game __instance)
        {
            if (__instance.IsShuttingDown())
            {
                return;
            }

            EpicLoot.OnGameShutdown();
        }
Esempio n. 16
0
        public static void Postfix(Ragdoll __instance, Vector3 center)
        {
            var characterName = __instance.m_nview.m_zdo.GetString("characterName");
            var level         = __instance.m_nview.m_zdo.GetInt("level");

            if (!string.IsNullOrEmpty(characterName))
            {
                EpicLoot.OnCharacterDeath(characterName, level, center + Vector3.up * 0.75f);
            }
        }
        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);
        }
        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);
        }
Esempio n. 19
0
        public static void Postfix(InventoryGrid __instance, Player player, ItemDrop.ItemData dragItem)
        {
            foreach (var element in __instance.m_elements)
            {
                var magicItemTransform = element.m_go.transform.Find("magicItem");
                if (magicItemTransform != null)
                {
                    var magicItem = magicItemTransform.GetComponent <Image>();
                    if (magicItem != null)
                    {
                        magicItem.enabled = false;
                    }
                }

                var setItemTransform = element.m_go.transform.Find("setItem");
                if (setItemTransform != null)
                {
                    var setItem = setItemTransform.GetComponent <Image>();
                    if (setItem != null)
                    {
                        setItem.enabled = false;
                    }
                }
            }

            foreach (var item in __instance.m_inventory.m_inventory)
            {
                var element = __instance.GetElement(item.m_gridPos.x, item.m_gridPos.y, __instance.m_inventory.GetWidth());
                if (element == null)
                {
                    EpicLoot.LogError($"Could not find element for item ({item.m_shared.m_name}: {item.m_gridPos}) in inventory: {__instance.m_inventory.m_name}");
                    continue;
                }

                var magicItem = ItemBackgroundHelper.CreateAndGetMagicItemBackgroundImage(element.m_go, element.m_equiped.gameObject, true);
                if (item.UseMagicBackground())
                {
                    magicItem.enabled = true;
                    magicItem.sprite  = EpicLoot.GetMagicItemBgSprite();
                    magicItem.color   = item.GetRarityColor();
                }

                var setItemTransform = element.m_go.transform.Find("setItem");
                if (setItemTransform != null)
                {
                    var setItem = setItemTransform.GetComponent <Image>();
                    if (setItem != null)
                    {
                        setItem.enabled = item.IsSetItem();
                    }
                }
            }
        }
Esempio n. 20
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);
        }
Esempio n. 21
0
        public void ReplaceEffect(int index, MagicItemEffect newEffect)
        {
            if (index < 0 || index >= Effects.Count)
            {
                EpicLoot.LogError("Tried to replace effect on magic item outside of the range of the effects list!");
                return;
            }

            SetEffectAsAugmented(index);

            Effects[index] = newEffect;
        }
Esempio n. 22
0
 public override void Deserialize(string data)
 {
     try
     {
         MagicItem = JSON.ToObject <MagicItem>(data, _saveParams);
     }
     catch (Exception)
     {
         EpicLoot.LogError($"[{nameof(MagicItemComponent)}] Could not deserialize MagicItem json data! ({ItemData?.m_shared?.m_name})");
         throw;
     }
 }
Esempio n. 23
0
        public static void Postfix(Ragdoll __instance, CharacterDrop characterDrop)
        {
            if (characterDrop == null || characterDrop.m_character == null || characterDrop.m_character.IsPlayer())
            {
                return;
            }

            var characterName = EpicLoot.GetCharacterCleanName(characterDrop.m_character);
            var level         = characterDrop.m_character.GetLevel();

            __instance.m_nview.m_zdo.Set("characterName", characterName);
            __instance.m_nview.m_zdo.Set("level", level);
        }
Esempio n. 24
0
        private static List <GameObject> RollLootTableInternal(LootTable lootTable, string objectName, Vector3 dropPoint, bool initializeObject)
        {
            var results = new List <GameObject>();

            _weightedDropCountTable.Setup(lootTable.Drops, dropPair => dropPair.Length == 2 ? dropPair[1] : 1);
            var dropCountRollResult = _weightedDropCountTable.Roll();
            var dropCount           = dropCountRollResult.Length >= 1 ? dropCountRollResult[0] : 0;

            if (dropCount == 0)
            {
                return(results);
            }

            _weightedLootTable.Setup(lootTable.Loot, x => x.Weight);
            var selectedDrops = _weightedLootTable.Roll(dropCount);

            foreach (var ld in selectedDrops)
            {
                var lootDrop = ResolveLootDrop(ld, ld.Rarity);

                var itemPrefab = ObjectDB.instance.GetItemPrefab(lootDrop.Item);
                if (itemPrefab == null)
                {
                    Debug.LogError($"Tried to spawn loot ({lootDrop.Item}) for ({objectName}), but the item prefab was not found!");
                    continue;
                }

                var randomRotation = Quaternion.Euler(0.0f, Random.Range(0.0f, 360.0f), 0.0f);
                ZNetView.m_forceDisableInit = !initializeObject;
                var item = Object.Instantiate(itemPrefab, dropPoint, randomRotation);
                ZNetView.m_forceDisableInit = false;
                var itemDrop = item.GetComponent <ItemDrop>();
                if (EpicLoot.CanBeMagicItem(itemDrop.m_itemData) && !ArrayUtils.IsNullOrEmpty(lootDrop.Rarity))
                {
                    var itemData           = new ExtendedItemData(itemDrop.m_itemData);
                    var magicItemComponent = itemData.AddComponent <MagicItemComponent>();
                    var magicItem          = RollMagicItem(lootDrop, itemData);
                    magicItemComponent.SetMagicItem(magicItem);

                    itemDrop.m_itemData = itemData;
                    InitializeMagicItem(itemData);
                    MagicItemGenerated?.Invoke(itemData, magicItem);
                }

                results.Add(item);
            }

            return(results);
        }
Esempio n. 25
0
        public static Image CreateAndGetMagicItemBackgroundImage(GameObject elementGo, GameObject equipped, bool addSetItem)
        {
            var magicItemTransform = elementGo.transform.Find("magicItem");

            if (magicItemTransform == null)
            {
                var magicItemObject = Object.Instantiate(equipped, equipped.transform.parent);
                magicItemObject.transform.SetSiblingIndex(equipped.transform.GetSiblingIndex() + 1);
                magicItemObject.name = "magicItem";
                magicItemObject.SetActive(true);
                magicItemTransform = magicItemObject.transform;
                var magicItemInit = magicItemTransform.GetComponent <Image>();
                magicItemInit.color         = Color.white;
                magicItemInit.raycastTarget = false;
            }

            // Also add set item marker
            if (addSetItem)
            {
                var setItemTransform = elementGo.transform.Find("setItem");
                if (setItemTransform == null)
                {
                    var setItemObject = Object.Instantiate(equipped, equipped.transform.parent);
                    setItemObject.transform.SetAsLastSibling();
                    setItemObject.name = "setItem";
                    setItemObject.SetActive(true);
                    setItemTransform = setItemObject.transform;
                    var setItemInit = setItemTransform.GetComponent <Image>();
                    setItemInit.raycastTarget = false;
                    setItemInit.sprite        = EpicLoot.Assets.GenericSetItemSprite;
                    setItemInit.color         = ColorUtility.TryParseHtmlString(EpicLoot.GetSetItemColor(), out var color) ? color : Color.white;
                }
            }

            // Also change equipped image
            var equippedImage = equipped.GetComponent <Image>();

            if (equippedImage != null)
            {
                equippedImage.sprite        = EpicLoot.Assets.EquippedSprite;
                equippedImage.color         = Color.white;
                equippedImage.raycastTarget = false;
                var rectTransform = equipped.RectTransform();
                rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, equippedImage.sprite.texture.width);
                rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, equippedImage.sprite.texture.height);
            }

            return(magicItemTransform.GetComponent <Image>());
        }
Esempio n. 26
0
        public static void AddMagicEffectsPage(TextsDialog textsDialog, Player player)
        {
            var magicEffects = new Dictionary <string, List <KeyValuePair <MagicItemEffect, ItemDrop.ItemData> > >();

            var allEquipment = player.GetEquipment();

            foreach (var item in allEquipment)
            {
                if (item.IsMagic())
                {
                    foreach (var effect in item.GetMagicItem().Effects)
                    {
                        if (!magicEffects.TryGetValue(effect.EffectType, out var effectList))
                        {
                            effectList = new List <KeyValuePair <MagicItemEffect, ItemDrop.ItemData> >();
                            magicEffects.Add(effect.EffectType, effectList);
                        }

                        effectList.Add(new KeyValuePair <MagicItemEffect, ItemDrop.ItemData>(effect, item));
                    }
                }
            }

            var t = new StringBuilder();

            foreach (var entry in magicEffects)
            {
                var effectType      = entry.Key;
                var effectDef       = MagicItemEffectDefinitions.Get(effectType);
                var sum             = entry.Value.Sum(x => x.Key.EffectValue);
                var totalEffectText = MagicItem.GetEffectText(effectDef, sum);
                var highestRarity   = (ItemRarity)entry.Value.Max(x => (int)x.Value.GetRarity());

                t.AppendLine($"<size=20><color={EpicLoot.GetRarityColor(highestRarity)}>{totalEffectText}</color></size>");
                foreach (var entry2 in entry.Value)
                {
                    var effect = entry2.Key;
                    var item   = entry2.Value;
                    t.AppendLine($" <color=silver>- {MagicItem.GetEffectText(effect, item.GetRarity(), false)} ({item.GetDecoratedName()})</color>");
                }

                t.AppendLine();
            }

            textsDialog.m_texts.Insert(EpicLoot.HasAuga ? 0 : 2,
                                       new TextsDialog.TextInfo(
                                           Localization.instance.Localize($"{EpicLoot.GetMagicEffectPip(false)} $mod_epicloot_active_magic_effects"),
                                           Localization.instance.Localize(t.ToString())));
        }
Esempio n. 27
0
        public static void AddLootTables([NotNull] IEnumerable <LootTable> lootTables)
        {
            // Add loottables for mobs or objects that do not reference another template
            foreach (var lootTable in lootTables.Where(x => x.RefObject == null || x.RefObject == ""))
            {
                AddLootTable(lootTable);
                EpicLoot.Log($"Added loottable for {lootTable.Object}");
            }

            // Add loottables that are based off mob or object templates
            foreach (var lootTable in lootTables.Where(x => x.RefObject != null && x.RefObject != ""))
            {
                AddLootTable(lootTable);
                EpicLoot.Log($"Added loottable for {lootTable.Object} using {lootTable.RefObject} as reference");
            }
        }
Esempio n. 28
0
        private static void SetMainTextureOnRenderers(IEnumerable <Renderer> renderers, string mainTexture)
        {
            var mainTextureAsset = EpicLoot.LoadAsset <Texture>(mainTexture);

            if (mainTextureAsset != null)
            {
                foreach (var renderer in renderers)
                {
                    renderer.material.mainTexture = mainTextureAsset;
                }
            }
            else
            {
                EpicLoot.LogError($"Missing Texture Override Asset: MainTexture={mainTexture}");
            }
        }
Esempio n. 29
0
        private static LootDrop ResolveLootDrop(LootDrop lootDrop)
        {
            var result = new LootDrop {
                Item = lootDrop.Item, Rarity = ArrayUtils.Copy(lootDrop.Rarity), Weight = lootDrop.Weight
            };
            var needsResolve = true;

            while (needsResolve)
            {
                if (ItemSets.TryGetValue(result.Item, out var itemSet))
                {
                    if (itemSet.Loot.Length == 0)
                    {
                        EpicLoot.LogError($"Tried to roll using ItemSet ({itemSet.Name}) but its loot list was empty!");
                    }
                    _weightedLootTable.Setup(itemSet.Loot, x => x.Weight);
                    var itemSetResult = _weightedLootTable.Roll();
                    result.Item   = itemSetResult.Item;
                    result.Weight = itemSetResult.Weight;
                    if (ArrayUtils.IsNullOrEmpty(result.Rarity))
                    {
                        result.Rarity = ArrayUtils.Copy(itemSetResult.Rarity);
                    }
                }
                else if (IsLootTableRefence(result.Item, out var lootList))
                {
                    if (lootList.Length == 0)
                    {
                        EpicLoot.LogError($"Tried to roll using loot table reference ({result.Item}) but its loot list was empty!");
                    }
                    _weightedLootTable.Setup(lootList, x => x.Weight);
                    var referenceResult = _weightedLootTable.Roll();
                    result.Item   = referenceResult.Item;
                    result.Weight = referenceResult.Weight;
                    if (ArrayUtils.IsNullOrEmpty(result.Rarity))
                    {
                        result.Rarity = ArrayUtils.Copy(referenceResult.Rarity);
                    }
                }
                else
                {
                    needsResolve = false;
                }
            }

            return(result);
        }
Esempio n. 30
0
        public static string GetSetTooltip(this ItemDrop.ItemData item)
        {
            var text    = new StringBuilder();
            var setID   = item.GetSetID(out var isMundane);
            var setSize = item.GetSetSize();

            var setPieces          = ItemDataExtensions.GetSetPieces(setID);
            var currentSetEquipped = Player.m_localPlayer.GetEquippedSetPieces(setID);

            var setDisplayName = GetSetDisplayName(item, isMundane);

            text.Append($"\n\n<color={EpicLoot.GetSetItemColor()}> $mod_epicloot_set: {setDisplayName} ({currentSetEquipped.Count}/{setSize}):</color>");

            foreach (var setItemName in setPieces)
            {
                var isEquipped  = IsSetItemEquipped(currentSetEquipped, setItemName, isMundane);
                var color       = isEquipped ? "white" : "grey";
                var displayName = GetSetItemDisplayName(setItemName, isMundane);
                text.Append($"\n  <color={color}>{displayName}</color>");
            }

            if (isMundane)
            {
                var setEffectColor = currentSetEquipped.Count == setSize?EpicLoot.GetSetItemColor() : "grey";

                text.Append($"\n<color={setEffectColor}>({setSize}) ‣ {item.GetSetStatusEffectTooltip().Replace("\n", " ")}</color>");
            }
            else
            {
                var setInfo = item.GetLegendarySetInfo();
                foreach (var setBonusInfo in setInfo.SetBonuses.OrderBy(x => x.Count))
                {
                    var hasEquipped = currentSetEquipped.Count >= setBonusInfo.Count;
                    var effectDef   = MagicItemEffectDefinitions.Get(setBonusInfo.Effect.Type);
                    if (effectDef == null)
                    {
                        EpicLoot.LogError($"Set Tooltip: Could not find effect ({setBonusInfo.Effect.Type}) for set ({setInfo.ID}) bonus ({setBonusInfo.Count})!");
                        continue;
                    }

                    var display = MagicItem.GetEffectText(effectDef, setBonusInfo.Effect.Values?.MinValue ?? 0);
                    text.Append($"\n<color={(hasEquipped ? EpicLoot.GetSetItemColor() : "grey")}>({setBonusInfo.Count}) ‣ {display}</color>");
                }
            }

            return(text.ToString());
        }