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(); } }
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 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); }
public static void Postfix(CharacterDrop __instance) { if (__instance.m_dropsEnabled) { EpicLoot.OnCharacterDeath(__instance); } }
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]; } } }
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); }
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); } } }
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); }
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()))); }
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>"); }
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); }
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); } }
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)); } }
public static void Postfix(Game __instance) { if (__instance.IsShuttingDown()) { return; } EpicLoot.OnGameShutdown(); }
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); }
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(); } } } }
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 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; }
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; } }
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); }
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); }
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>()); }
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()))); }
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"); } }
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}"); } }
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); }
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()); }