private static void Durability(int qualityLevel, bool crafting) { if (crafting) { float maxDurability = _item.GetMaxDurability(qualityLevel); if (qualityLevel <= 1) { // Just creating item. Show base values. _sb.AppendFormat("\n$item_durability: <color=orange>{0}</color>", maxDurability); } else if (qualityLevel > _item.m_shared.m_maxQuality) { // No room to upgrade, game still shows upgraded values, so lets show the durability 1 lvl lower. float oldDurability = _item.GetMaxDurability(qualityLevel - 1); _sb.AppendFormat("\n$item_durability: <color=orange>{0}</color>", oldDurability); } else { float oldDurability = _item.GetMaxDurability(qualityLevel - 1); _sb.AppendFormat("\n$item_durability: <color=silver>{0}</color> {1} <color=orange>{2}</color>", oldDurability, arrow, maxDurability); } } else { float maxDurability2 = _item.GetMaxDurability(qualityLevel); float durability = _item.m_durability; //_sb.AppendFormat("\n$item_durability: <color=orange>{0}%</color> <color=yellow>({1}/{2})</color>", (_item.GetDurabilityPercentage() * 100f).ToString("0"), durability.ToString("0"), maxDurability2.ToString("0")); _sb.AppendFormat("\n$item_durability: {0} / {1}", durability.ToString("0"), maxDurability2.ToString("0")); } }
private static Recipe RepairRecipe(ItemDrop.ItemData item) { float percent = (item.GetMaxDurability() - item.m_durability) / item.GetMaxDurability(); Recipe fullRecipe = ObjectDB.instance.GetRecipe(item); var fullReqs = fullRecipe.m_resources.ToList(); bool isMagic = false; if (epicLootAssembly != null) { isMagic = (bool)epicLootAssembly.GetType("EpicLoot.ItemDataExtensions").GetMethod("IsMagic", BindingFlags.Public | BindingFlags.Static, null, new Type[] { typeof(ItemDrop.ItemData) }, null).Invoke(null, new[] { item }); } if (isMagic) { int rarity = (int)epicLootAssembly.GetType("EpicLoot.ItemDataExtensions").GetMethod("GetRarity", BindingFlags.Public | BindingFlags.Static).Invoke(null, new[] { item }); List <KeyValuePair <ItemDrop, int> > magicReqs = (List <KeyValuePair <ItemDrop, int> >)epicLootAssembly.GetType("EpicLoot.Crafting.EnchantTabController").GetMethod("GetEnchantCosts", BindingFlags.Public | BindingFlags.Static).Invoke(null, new object[] { item, rarity }); foreach (var kvp in magicReqs) { fullReqs.Add(new Piece.Requirement() { m_amount = kvp.Value, m_resItem = kvp.Key }); } } List <Piece.Requirement> reqs = new List <Piece.Requirement>(); Recipe recipe = ScriptableObject.CreateInstance <Recipe>(); for (int i = 0; i < fullReqs.Count; i++) { var req = new Piece.Requirement() { m_resItem = fullReqs[i].m_resItem, m_amountPerLevel = Mathf.FloorToInt(fullReqs[i].m_amountPerLevel * percent * materialRequirementMult.Value), m_amount = Mathf.FloorToInt(fullReqs[i].m_amount * percent * materialRequirementMult.Value), }; int amount = 0; for (int j = item.m_quality; j > 0; j--) { amount += req.GetAmount(j); } if (amount > 0) { reqs.Add(req); } } recipe.m_resources = reqs.ToArray(); if (!reqs.Any()) { return(null); } return(recipe); }
private static Recipe RepairRecipe(ItemDrop.ItemData item, bool log = false) { float percent = (item.GetMaxDurability() - item.m_durability) / item.GetMaxDurability(); Recipe fullRecipe = ObjectDB.instance.GetRecipe(item); if (log) { Dbgl($"{Localization.instance.Localize(item.m_shared.m_name)}, quality {item.m_quality} is {percent * 10000 / 100}% broken"); } Recipe recipe = ScriptableObject.CreateInstance <Recipe>(); List <Piece.Requirement> reqs = new List <Piece.Requirement>(); for (int i = 0; i < fullRecipe.m_resources.Length; i++) { var req = new Piece.Requirement() { m_resItem = fullRecipe.m_resources[i].m_resItem, m_amountPerLevel = Mathf.FloorToInt(fullRecipe.m_resources[i].m_amountPerLevel * percent * materialRequirementMult.Value), m_amount = Mathf.FloorToInt(fullRecipe.m_resources[i].m_amount * percent * materialRequirementMult.Value), }; if (log) { Dbgl($"full required amounts of {Localization.instance.Localize(fullRecipe.m_resources[i].m_resItem.m_itemData.m_shared.m_name)}: {fullRecipe.m_resources[i].m_amount} {fullRecipe.m_resources[i].m_amountPerLevel}; repair amounts: {req.m_amount} {req.m_amountPerLevel}"); } int amount = 0; for (int j = item.m_quality; j > 0; j--) { amount += req.GetAmount(j); } if (amount > 0) { if (log) { Dbgl($"required amount of {Localization.instance.Localize(fullRecipe.m_resources[i].m_resItem.m_itemData.m_shared.m_name)} is {amount}"); } reqs.Add(req); } } recipe.m_resources = reqs.ToArray(); if (!reqs.Any()) { if (log) { Dbgl($"no resources required"); } return(null); } return(recipe); }
private static void RepairClickedItem(InventoryGrid grid, UIInputHandler element, Inventory inventory) { Vector2i buttonPos = Traverse.Create(grid).Method("GetButtonPos", new object[] { element.gameObject }).GetValue <Vector2i>(); ItemDrop.ItemData itemData = inventory.GetItemAt(buttonPos.x, buttonPos.y); if (itemData == null) { return; } if (Traverse.Create(InventoryGui.instance).Method("CanRepair", new object[] { itemData }).GetValue <bool>()) { CraftingStation currentCraftingStation = Player.m_localPlayer.GetCurrentCraftingStation(); itemData.m_durability = itemData.GetMaxDurability(); if (currentCraftingStation) { currentCraftingStation.m_repairItemDoneEffects.Create(currentCraftingStation.transform.position, Quaternion.identity, null, 1f); } Player.m_localPlayer.Message(MessageHud.MessageType.Center, Localization.instance.Localize("$msg_repaired", new string[] { itemData.m_shared.m_name }), 0, null); } }
private static string ReplaceLine(ItemDrop.ItemData item, int qualityLevel, bool crafting, string line) { return(line .Replace("{itemDescription}", item.m_shared.m_description) .Replace("{itemSpawnName}", GetSpawnName(item)) .Replace("{itemCrafterName}", item.m_crafterName.ToString()) .Replace("{itemValue}", item.GetValue().ToString()) .Replace("{itemBaseValue}", item.m_shared.m_value.ToString()) .Replace("{itemWeight}", item.GetWeight().ToString()) .Replace("{itemQuality}", qualityLevel.ToString()) .Replace("{itemMaxDurability}", item.GetMaxDurability(qualityLevel).ToString()) .Replace("{itemPercentDurability}", (item.GetDurabilityPercentage() * 100f).ToString("0")) .Replace("{itemDurability}", item.m_durability.ToString("0")) .Replace("{itemStationLevel}", ObjectDB.instance.GetRecipe(item)?.m_minStationLevel.ToString()) .Replace("{itemMovementMod}", (item.m_shared.m_movementModifier * 100f).ToString("+0;-0")) .Replace("{totalMovementMod}", (Player.m_localPlayer.GetEquipmentMovementModifier() * 100).ToString("+0;-0")) .Replace("{itemSetSize}", item.m_shared.m_setSize.ToString()) .Replace("{itemDamage}", GetDamageString(item, qualityLevel)) .Replace("{itemBaseBlock}", item.GetBaseBlockPower(qualityLevel).ToString()) .Replace("{itemBlock}", item.GetBlockPowerTooltip(qualityLevel).ToString("0")) .Replace("{itemDeflection}", item.GetDeflectionForce(qualityLevel).ToString()) .Replace("{itemBlockBonus}", item.m_shared.m_timedBlockBonus.ToString()) .Replace("{itemAttackForce}", item.m_shared.m_attackForce.ToString()) .Replace("{itemBackstab}", item.m_shared.m_backstabBonus.ToString()) .Replace("{itemArmor}", item.GetArmor(qualityLevel).ToString()) .Replace("{itemFoodHealth}", item.m_shared.m_food.ToString()) .Replace("{itemSetSize}", item.m_shared.m_setSize.ToString()) .Replace("{itemFoodStamina}", item.m_shared.m_foodStamina.ToString()) .Replace("{itemFoodDuration}", item.m_shared.m_foodBurnTime.ToString()) .Replace("{itemFoodRegen}", item.m_shared.m_foodRegen.ToString()) .Replace("\\n", "\n")); }
private static void RepairItem(Player player, Inventory inventory, ItemDrop.ItemData repairKitItem, ItemDrop.ItemData equippedItem, int repairKitLevel) { //Name of the equipped item string equippedName = equippedItem.m_shared.m_name; //Max durability of the item with its current quality (star) level float equippedMaxDurability = equippedItem.GetMaxDurability(equippedItem.m_quality); //Minimum crafting station level for repair. I use this to determine repair kit quality needed to repair the item. int minRepairLevel = ObjectDB.instance.GetRecipe(equippedItem).m_minStationLevel; if (minRepairLevel == 0) { player.Message(MessageHud.MessageType.Center, "Can't repair item."); //Log a warning since it shouldn't get this far without having a repair level. Whetstone.logger.LogWarning("Whetstone: Can't repair " + equippedName); } else if (minRepairLevel > repairKitLevel) { player.Message(MessageHud.MessageType.Center, Localization.instance.Localize(equippedName) + " needs a higher quality repair kit."); } else if (equippedItem.m_durability >= equippedMaxDurability) { player.Message(MessageHud.MessageType.Center, Localization.instance.Localize(equippedName) + " can't be repaired further."); } else if (equippedItem.m_durability < equippedMaxDurability && minRepairLevel <= repairKitLevel) { //If repairing would make the item go above the max durability, repair it to the max instead. if (equippedItem.m_durability + equippedMaxDurability * Whetstone.repairAmount.Value >= equippedMaxDurability) { equippedItem.m_durability = equippedMaxDurability; } else { //Adds % durability to equipped item. % value is taken from config float value (default is 0.25f) equippedItem.m_durability += equippedItem.GetMaxDurability(equippedItem.m_quality) * Whetstone.repairAmount.Value; player.Message(MessageHud.MessageType.Center, Localization.instance.Localize(equippedName) + " repaired."); } //Delete the repair kit from player's inventory. inventory.RemoveOneItem(repairKitItem); } }
static void Postfix(ItemDrop.ItemData item, ref bool __result) { if (modEnabled.Value && requireMatsForRepair.Value && Environment.StackTrace.Contains("RepairOneItem") && !Environment.StackTrace.Contains("HaveRepairableItems") && __result == true) { float percent = (item.GetMaxDurability() - item.m_durability) / item.GetMaxDurability(); Recipe fullRecipe = ObjectDB.instance.GetRecipe(item); Dbgl($"{item.m_shared.m_name}, quality {item.m_quality} is {percent * 10000 / 100}% broken"); Recipe recipe = ScriptableObject.CreateInstance <Recipe>(); recipe.m_resources = new Piece.Requirement[fullRecipe.m_resources.Length]; for (int i = 0; i < fullRecipe.m_resources.Length; i++) { Dbgl($"full amount of {fullRecipe.m_resources[i].m_resItem.name} is {fullRecipe.m_resources[i].GetAmount(item.m_quality)}"); int amount = Mathf.FloorToInt(fullRecipe.m_resources[i].m_amount * percent); recipe.m_resources[i] = new Piece.Requirement() { m_resItem = fullRecipe.m_resources[i].m_resItem, m_amountPerLevel = fullRecipe.m_resources[i].m_amountPerLevel, m_amount = amount, }; Dbgl($"required amount of {recipe.m_resources[i].m_resItem.name} is {recipe.m_resources[i].GetAmount(item.m_quality)}"); } List <string> reqstring = new List <string>(); foreach (Piece.Requirement req in recipe.m_resources) { reqstring.Add($"{req.GetAmount(item.m_quality)}/{Player.m_localPlayer.GetInventory().CountItems(req.m_resItem.m_itemData.m_shared.m_name)} {req.m_resItem.name}"); } string outstring = ""; if (HaveRequirements(recipe.m_resources, item.m_quality)) { //Player.m_localPlayer.ConsumeResources(recipe.m_resources, item.m_quality); outstring = $"Used {string.Join(", ", reqstring)} to repair {item.m_shared.m_name}"; __result = true; } else { outstring = $"Require {string.Join(", ", reqstring)} to repair {item.m_shared.m_name}"; __result = false; } Player.m_localPlayer.Message(MessageHud.MessageType.TopLeft, outstring, 0, null); Dbgl(outstring); } }
// Token: 0x0600114C RID: 4428 RVA: 0x00077F18 File Offset: 0x00076118 public static string GetTooltip(ItemDrop.ItemData item, int qualityLevel, bool crafting) { Player localPlayer = Player.m_localPlayer; StringBuilder stringBuilder = new StringBuilder(256); stringBuilder.Append(item.m_shared.m_description); stringBuilder.Append("\n\n"); if (item.m_shared.m_dlc.Length > 0) { stringBuilder.Append("\n<color=aqua>$item_dlc</color>"); } ItemDrop.ItemData.AddHandedTip(item, stringBuilder); if (item.m_crafterID != 0L) { stringBuilder.AppendFormat("\n$item_crafter: <color=orange>{0}</color>", item.m_crafterName); } if (!item.m_shared.m_teleportable) { stringBuilder.Append("\n<color=orange>$item_noteleport</color>"); } if (item.m_shared.m_value > 0) { stringBuilder.AppendFormat("\n$item_value: <color=orange>{0} ({1})</color>", item.GetValue(), item.m_shared.m_value); } stringBuilder.AppendFormat("\n$item_weight: <color=orange>{0}</color>", item.GetWeight().ToString("0.0")); if (item.m_shared.m_maxQuality > 1) { stringBuilder.AppendFormat("\n$item_quality: <color=orange>{0}</color>", qualityLevel); } if (item.m_shared.m_useDurability) { if (crafting) { float maxDurability = item.GetMaxDurability(qualityLevel); stringBuilder.AppendFormat("\n$item_durability: <color=orange>{0}</color>", maxDurability); } else { float maxDurability2 = item.GetMaxDurability(qualityLevel); float durability = item.m_durability; stringBuilder.AppendFormat("\n$item_durability: <color=orange>{0}%</color> <color=yellow>({1}/{2})</color>", (item.GetDurabilityPercentage() * 100f).ToString("0"), durability.ToString("0"), maxDurability2.ToString("0")); } if (item.m_shared.m_canBeReparied) { Recipe recipe = ObjectDB.instance.GetRecipe(item); if (recipe != null) { int minStationLevel = recipe.m_minStationLevel; stringBuilder.AppendFormat("\n$item_repairlevel: <color=orange>{0}</color>", minStationLevel.ToString()); } } } switch (item.m_shared.m_itemType) { case ItemDrop.ItemData.ItemType.Consumable: { if (item.m_shared.m_food > 0f) { stringBuilder.AppendFormat("\n$item_food_health: <color=orange>{0}</color>", item.m_shared.m_food); stringBuilder.AppendFormat("\n$item_food_stamina: <color=orange>{0}</color>", item.m_shared.m_foodStamina); stringBuilder.AppendFormat("\n$item_food_duration: <color=orange>{0}s</color>", item.m_shared.m_foodBurnTime); stringBuilder.AppendFormat("\n$item_food_regen: <color=orange>{0} hp/tick</color>", item.m_shared.m_foodRegen); } string statusEffectTooltip = item.GetStatusEffectTooltip(); if (statusEffectTooltip.Length > 0) { stringBuilder.Append("\n\n"); stringBuilder.Append(statusEffectTooltip); } break; } case ItemDrop.ItemData.ItemType.OneHandedWeapon: case ItemDrop.ItemData.ItemType.Bow: case ItemDrop.ItemData.ItemType.TwoHandedWeapon: case ItemDrop.ItemData.ItemType.Torch: { stringBuilder.Append(item.GetDamage(qualityLevel).GetTooltipString(item.m_shared.m_skillType)); stringBuilder.AppendFormat("\n$item_blockpower: <color=orange>{0}</color> <color=yellow>({1})</color>", item.GetBaseBlockPower(qualityLevel), item.GetBlockPowerTooltip(qualityLevel).ToString("0")); if (item.m_shared.m_timedBlockBonus > 1f) { stringBuilder.AppendFormat("\n$item_deflection: <color=orange>{0}</color>", item.GetDeflectionForce(qualityLevel)); stringBuilder.AppendFormat("\n$item_parrybonus: <color=orange>{0}x</color>", item.m_shared.m_timedBlockBonus); } stringBuilder.AppendFormat("\n$item_knockback: <color=orange>{0}</color>", item.m_shared.m_attackForce); stringBuilder.AppendFormat("\n$item_backstab: <color=orange>{0}x</color>", item.m_shared.m_backstabBonus); string projectileTooltip = item.GetProjectileTooltip(qualityLevel); if (projectileTooltip.Length > 0) { stringBuilder.Append("\n\n"); stringBuilder.Append(projectileTooltip); } string statusEffectTooltip2 = item.GetStatusEffectTooltip(); if (statusEffectTooltip2.Length > 0) { stringBuilder.Append("\n\n"); stringBuilder.Append(statusEffectTooltip2); } break; } case ItemDrop.ItemData.ItemType.Shield: stringBuilder.AppendFormat("\n$item_blockpower: <color=orange>{0}</color> <color=yellow>({1})</color>", item.GetBaseBlockPower(qualityLevel), item.GetBlockPowerTooltip(qualityLevel).ToString("0")); if (item.m_shared.m_timedBlockBonus > 1f) { stringBuilder.AppendFormat("\n$item_deflection: <color=orange>{0}</color>", item.GetDeflectionForce(qualityLevel)); stringBuilder.AppendFormat("\n$item_parrybonus: <color=orange>{0}x</color>", item.m_shared.m_timedBlockBonus); } break; case ItemDrop.ItemData.ItemType.Helmet: case ItemDrop.ItemData.ItemType.Chest: case ItemDrop.ItemData.ItemType.Legs: case ItemDrop.ItemData.ItemType.Shoulder: { stringBuilder.AppendFormat("\n$item_armor: <color=orange>{0}</color>", item.GetArmor(qualityLevel)); string damageModifiersTooltipString = SE_Stats.GetDamageModifiersTooltipString(item.m_shared.m_damageModifiers); if (damageModifiersTooltipString.Length > 0) { stringBuilder.Append(damageModifiersTooltipString); } string statusEffectTooltip3 = item.GetStatusEffectTooltip(); if (statusEffectTooltip3.Length > 0) { stringBuilder.Append("\n\n"); stringBuilder.Append(statusEffectTooltip3); } break; } case ItemDrop.ItemData.ItemType.Ammo: stringBuilder.Append(item.GetDamage(qualityLevel).GetTooltipString(item.m_shared.m_skillType)); stringBuilder.AppendFormat("\n$item_knockback: <color=orange>{0}</color>", item.m_shared.m_attackForce); break; } if (item.m_shared.m_movementModifier != 0f && localPlayer != null) { float equipmentMovementModifier = localPlayer.GetEquipmentMovementModifier(); stringBuilder.AppendFormat("\n$item_movement_modifier: <color=orange>{0}%</color> ($item_total:<color=yellow>{1}%</color>)", (item.m_shared.m_movementModifier * 100f).ToString("+0;-0"), (equipmentMovementModifier * 100f).ToString("+0;-0")); } string setStatusEffectTooltip = item.GetSetStatusEffectTooltip(); if (setStatusEffectTooltip.Length > 0) { stringBuilder.AppendFormat("\n\n$item_seteffect (<color=orange>{0}</color> $item_parts):<color=orange>{1}</color>", item.m_shared.m_setSize, setStatusEffectTooltip); } return(stringBuilder.ToString()); }
private static bool Prefix(ref string __result, ItemDrop.ItemData item, int qualityLevel, bool crafting) { if (!item.IsMagic()) { return(true); } Player localPlayer = Player.m_localPlayer; StringBuilder text = new StringBuilder(256); var magicItem = item.GetMagicItem(); var magicColor = magicItem.GetColorString(); var displayName = magicItem.GetDisplayName(item.Extended()); text.Append($"<color={magicColor}>{magicItem.GetRarityDisplay()} {displayName}</color>\n"); text.Append(item.m_shared.m_description); text.Append("\n"); if (item.m_shared.m_dlc.Length > 0) { text.Append("\n<color=aqua>$item_dlc</color>"); } ItemDrop.ItemData.AddHandedTip(item, text); if (item.m_crafterID != 0L) { text.AppendFormat("\n$item_crafter: <color=orange>{0}</color>", item.m_crafterName); } if (!item.m_shared.m_teleportable) { text.Append("\n<color=orange>$item_noteleport</color>"); } if (item.m_shared.m_value > 0) { text.AppendFormat("\n$item_value: <color=orange>{0} ({1})</color>", item.GetValue(), item.m_shared.m_value); } var weightColor = magicItem.HasEffect(MagicEffectType.ReduceWeight) || magicItem.HasEffect(MagicEffectType.Weightless) ? magicColor : "orange"; text.Append($"\n$item_weight: <color={weightColor}>{item.GetWeight():0.0}</color>"); if (item.m_shared.m_maxQuality > 1) { text.AppendFormat("\n$item_quality: <color=orange>{0}</color>", qualityLevel); } var indestructible = magicItem.HasEffect(MagicEffectType.Indestructible); if (!indestructible && item.m_shared.m_useDurability) { var maxDurabilityColor1 = magicItem.HasEffect(MagicEffectType.ModifyDurability) ? magicColor : "orange"; var maxDurabilityColor2 = magicItem.HasEffect(MagicEffectType.ModifyDurability) ? magicColor : "yellow"; float maxDurability = item.GetMaxDurability(qualityLevel); float durability = item.m_durability; float currentDurabilityPercentage = item.GetDurabilityPercentage() * 100f; string durabilityPercentageString = currentDurabilityPercentage.ToString("0"); string durabilityValueString = durability.ToString("0"); string durabilityMaxString = maxDurability.ToString("0"); text.Append($"\n$item_durability: <color={maxDurabilityColor1}>{durabilityPercentageString}%</color> <color={maxDurabilityColor2}>({durabilityValueString}/{durabilityMaxString})</color>"); if (item.m_shared.m_canBeReparied) { Recipe recipe = ObjectDB.instance.GetRecipe(item); if (recipe != null) { int minStationLevel = recipe.m_minStationLevel; text.AppendFormat("\n$item_repairlevel: <color=orange>{0}</color>", minStationLevel.ToString()); } } } else if (indestructible) { text.Append($"\n$item_durability: <color={magicColor}>Indestructible</color>"); } var magicBlockPower = magicItem.HasEffect(MagicEffectType.ModifyBlockPower); var magicBlockColor1 = magicBlockPower ? magicColor : "orange"; var magicBlockColor2 = magicBlockPower ? magicColor : "yellow"; var magicParry = magicItem.HasEffect(MagicEffectType.ModifyParry); var totalParryBonusMod = magicItem.GetTotalEffectValue(MagicEffectType.ModifyParry, 0.01f); var magicParryColor = magicParry ? magicColor : "orange"; switch (item.m_shared.m_itemType) { case ItemDrop.ItemData.ItemType.Consumable: if (item.m_shared.m_food > 0.0) { text.AppendFormat("\n$item_food_health: <color=orange>{0}</color>", item.m_shared.m_food); text.AppendFormat("\n$item_food_stamina: <color=orange>{0}</color>", item.m_shared.m_foodStamina); text.AppendFormat("\n$item_food_duration: <color=orange>{0}s</color>", item.m_shared.m_foodBurnTime); text.AppendFormat("\n$item_food_regen: <color=orange>{0} hp/tick</color>", item.m_shared.m_foodRegen); } string consumeStatusEffectTooltip = item.GetStatusEffectTooltip(); if (consumeStatusEffectTooltip.Length > 0) { text.Append("\n\n"); text.Append(consumeStatusEffectTooltip); } break; case ItemDrop.ItemData.ItemType.OneHandedWeapon: case ItemDrop.ItemData.ItemType.Bow: case ItemDrop.ItemData.ItemType.TwoHandedWeapon: case ItemDrop.ItemData.ItemType.Torch: text.Append(GetDamageTooltipString(magicItem, item.GetDamage(qualityLevel), item.m_shared.m_skillType, magicColor)); float baseBlockPower1 = item.GetBaseBlockPower(qualityLevel); float blockPowerTooltipValue = item.GetBlockPowerTooltip(qualityLevel); string blockPowerPercentageString = blockPowerTooltipValue.ToString("0"); text.Append($"\n$item_blockpower: <color={magicBlockColor1}>{baseBlockPower1}</color> <color={magicBlockColor2}>({blockPowerPercentageString})</color>"); if (item.m_shared.m_timedBlockBonus > 1.0) { text.Append($"\n$item_deflection: <color={magicParryColor}>{item.GetDeflectionForce(qualityLevel)}</color>"); var timedBlockBonus = item.m_shared.m_timedBlockBonus; if (magicParry) { timedBlockBonus *= 1.0f + totalParryBonusMod; } text.Append($"\n$item_parrybonus: <color={magicParryColor}>{timedBlockBonus:0.#}x</color>"); } text.AppendFormat("\n$item_knockback: <color=orange>{0}</color>", item.m_shared.m_attackForce); var magicBackstab = magicItem.HasEffect(MagicEffectType.ModifyBackstab); var totalBackstabBonusMod = magicItem.GetTotalEffectValue(MagicEffectType.ModifyBackstab, 0.01f); var magicBackstabColor = magicBackstab ? magicColor : "orange"; var backstabValue = item.m_shared.m_backstabBonus * (1.0f + totalBackstabBonusMod); text.Append($"\n$item_backstab: <color={magicBackstabColor}>{backstabValue:0.#}x</color>"); string projectileTooltip = item.GetProjectileTooltip(qualityLevel); if (projectileTooltip.Length > 0) { text.Append("\n\n"); text.Append(projectileTooltip); } string statusEffectTooltip2 = item.GetStatusEffectTooltip(); if (statusEffectTooltip2.Length > 0) { text.Append("\n\n"); text.Append(statusEffectTooltip2); } break; case ItemDrop.ItemData.ItemType.Shield: float baseBlockPower2 = item.GetBaseBlockPower(qualityLevel); blockPowerTooltipValue = item.GetBlockPowerTooltip(qualityLevel); string str5 = blockPowerTooltipValue.ToString("0"); text.Append($"\n$item_blockpower: <color={magicBlockColor1}>{baseBlockPower2}</color> <color={magicBlockColor2}>({str5})</color>"); if (item.m_shared.m_timedBlockBonus > 1.0) { text.Append($"\n$item_deflection: <color={magicParryColor}>{item.GetDeflectionForce(qualityLevel)}</color>"); var timedBlockBonus = item.m_shared.m_timedBlockBonus; if (magicParry) { timedBlockBonus *= 1.0f + totalParryBonusMod; } text.Append($"\n$item_parrybonus: <color={magicParryColor}>{timedBlockBonus:0.#}x</color>"); } break; case ItemDrop.ItemData.ItemType.Helmet: case ItemDrop.ItemData.ItemType.Chest: case ItemDrop.ItemData.ItemType.Legs: case ItemDrop.ItemData.ItemType.Shoulder: var magicArmorColor = magicItem.HasEffect(MagicEffectType.ModifyArmor) ? magicColor : "orange"; text.Append($"\n$item_armor: <color={magicArmorColor}>{item.GetArmor(qualityLevel):0.#}</color>"); string modifiersTooltipString = SE_Stats.GetDamageModifiersTooltipString(item.m_shared.m_damageModifiers); if (modifiersTooltipString.Length > 0) { text.Append(modifiersTooltipString); } string statusEffectTooltip3 = item.GetStatusEffectTooltip(); if (statusEffectTooltip3.Length > 0) { text.Append("\n"); text.Append(statusEffectTooltip3); } break; case ItemDrop.ItemData.ItemType.Ammo: text.Append(item.GetDamage(qualityLevel).GetTooltipString(item.m_shared.m_skillType)); text.AppendFormat("\n$item_knockback: <color=orange>{0}</color>", item.m_shared.m_attackForce); break; } var magicMovement = magicItem.HasEffect(MagicEffectType.ModifyMovementSpeed); if ((magicMovement || item.m_shared.m_movementModifier != 0) && localPlayer != null) { var removePenalty = magicItem.HasEffect(MagicEffectType.RemoveSpeedPenalty); var itemMovementModifier = removePenalty ? 0 : item.m_shared.m_movementModifier * 100f; if (magicMovement) { itemMovementModifier += magicItem.GetTotalEffectValue(MagicEffectType.ModifyMovementSpeed); } var itemMovementModDisplay = (itemMovementModifier == 0) ? "0%" : $"{itemMovementModifier:+0;-0}%"; float movementModifier = localPlayer.GetEquipmentMovementModifier(); var totalMovementModifier = movementModifier * 100f; var color = (removePenalty || magicMovement) ? magicColor : "orange"; text.Append($"\n$item_movement_modifier: <color={color}>{itemMovementModDisplay}</color> ($item_total:<color=yellow>{totalMovementModifier:+0;-0}%</color>)"); } // Add magic item effects here text.Append(magicItem.GetTooltip()); // Set stuff if (!string.IsNullOrEmpty(item.m_shared.m_setName)) { AddSetTooltip(item, text); } __result = text.ToString(); return(false); }
public static string GetTooltip(ItemDrop.ItemData item, int qualityLevel, bool crafting) { Player localPlayer = Player.m_localPlayer; StringBuilder text = new StringBuilder(256); text.Append(item.m_shared.m_description); text.Append("\n\n"); if (item.m_shared.m_dlc.Length > 0) { text.Append("\n<color=aqua>$item_dlc</color>"); } ItemDrop.ItemData.AddHandedTip(item, text); if (item.m_crafterID != 0L) { text.AppendFormat("\n$item_crafter: <color=orange>{0}</color>", (object)item.m_crafterName); } if (!item.m_shared.m_teleportable) { text.Append("\n<color=orange>$item_noteleport</color>"); } if (item.m_shared.m_value > 0) { text.AppendFormat("\n$item_value: <color=orange>{0} ({1})</color>", (object)item.GetValue(), (object)item.m_shared.m_value); } text.AppendFormat("\n$item_weight: <color=orange>{0}</color>", (object)item.GetWeight().ToString("0.0")); if (item.m_shared.m_maxQuality > 1) { text.AppendFormat("\n$item_quality: <color=orange>{0}</color>", (object)qualityLevel); } float num; if (item.m_shared.m_useDurability) { if (crafting) { float maxDurability = item.GetMaxDurability(qualityLevel); text.AppendFormat("\n$item_durability: <color=orange>{0}</color>", (object)maxDurability); } else { float maxDurability = item.GetMaxDurability(qualityLevel); float durability = item.m_durability; StringBuilder stringBuilder = text; num = item.GetDurabilityPercentage() * 100f; string str1 = num.ToString("0"); string str2 = durability.ToString("0"); string str3 = maxDurability.ToString("0"); stringBuilder.AppendFormat("\n$item_durability: <color=orange>{0}%</color> <color=yellow>({1}/{2})</color>", (object)str1, (object)str2, (object)str3); } if (item.m_shared.m_canBeReparied) { Recipe recipe = ObjectDB.instance.GetRecipe(item); if ((UnityEngine.Object)recipe != (UnityEngine.Object)null) { int minStationLevel = recipe.m_minStationLevel; text.AppendFormat("\n$item_repairlevel: <color=orange>{0}</color>", (object)minStationLevel.ToString()); } } } switch (item.m_shared.m_itemType) { case ItemDrop.ItemData.ItemType.Consumable: if ((double)item.m_shared.m_food > 0.0) { text.AppendFormat("\n$item_food_health: <color=orange>{0}</color>", (object)item.m_shared.m_food); text.AppendFormat("\n$item_food_stamina: <color=orange>{0}</color>", (object)item.m_shared.m_foodStamina); text.AppendFormat("\n$item_food_duration: <color=orange>{0}s</color>", (object)item.m_shared.m_foodBurnTime); text.AppendFormat("\n$item_food_regen: <color=orange>{0} hp/tick</color>", (object)item.m_shared.m_foodRegen); } string statusEffectTooltip1 = item.GetStatusEffectTooltip(); if (statusEffectTooltip1.Length > 0) { text.Append("\n\n"); text.Append(statusEffectTooltip1); break; } break; case ItemDrop.ItemData.ItemType.OneHandedWeapon: case ItemDrop.ItemData.ItemType.Bow: case ItemDrop.ItemData.ItemType.TwoHandedWeapon: case ItemDrop.ItemData.ItemType.Torch: text.Append(item.GetDamage(qualityLevel).GetTooltipString(item.m_shared.m_skillType)); StringBuilder stringBuilder1 = text; // ISSUE: variable of a boxed type __Boxed <float> baseBlockPower1 = (ValueType)item.GetBaseBlockPower(qualityLevel); num = item.GetBlockPowerTooltip(qualityLevel); string str4 = num.ToString("0"); stringBuilder1.AppendFormat("\n$item_blockpower: <color=orange>{0}</color> <color=yellow>({1})</color>", (object)baseBlockPower1, (object)str4); if ((double)item.m_shared.m_timedBlockBonus > 1.0) { text.AppendFormat("\n$item_deflection: <color=orange>{0}</color>", (object)item.GetDeflectionForce(qualityLevel)); text.AppendFormat("\n$item_parrybonus: <color=orange>{0}x</color>", (object)item.m_shared.m_timedBlockBonus); } text.AppendFormat("\n$item_knockback: <color=orange>{0}</color>", (object)item.m_shared.m_attackForce); text.AppendFormat("\n$item_backstab: <color=orange>{0}x</color>", (object)item.m_shared.m_backstabBonus); string projectileTooltip = item.GetProjectileTooltip(qualityLevel); if (projectileTooltip.Length > 0) { text.Append("\n\n"); text.Append(projectileTooltip); } string statusEffectTooltip2 = item.GetStatusEffectTooltip(); if (statusEffectTooltip2.Length > 0) { text.Append("\n\n"); text.Append(statusEffectTooltip2); break; } break; case ItemDrop.ItemData.ItemType.Shield: StringBuilder stringBuilder2 = text; // ISSUE: variable of a boxed type __Boxed <float> baseBlockPower2 = (ValueType)item.GetBaseBlockPower(qualityLevel); num = item.GetBlockPowerTooltip(qualityLevel); string str5 = num.ToString("0"); stringBuilder2.AppendFormat("\n$item_blockpower: <color=orange>{0}</color> <color=yellow>({1})</color>", (object)baseBlockPower2, (object)str5); if ((double)item.m_shared.m_timedBlockBonus > 1.0) { text.AppendFormat("\n$item_deflection: <color=orange>{0}</color>", (object)item.GetDeflectionForce(qualityLevel)); text.AppendFormat("\n$item_parrybonus: <color=orange>{0}x</color>", (object)item.m_shared.m_timedBlockBonus); break; } break; case ItemDrop.ItemData.ItemType.Helmet: case ItemDrop.ItemData.ItemType.Chest: case ItemDrop.ItemData.ItemType.Legs: case ItemDrop.ItemData.ItemType.Shoulder: text.AppendFormat("\n$item_armor: <color=orange>{0}</color>", (object)item.GetArmor(qualityLevel)); string modifiersTooltipString = SE_Stats.GetDamageModifiersTooltipString(item.m_shared.m_damageModifiers); if (modifiersTooltipString.Length > 0) { text.Append(modifiersTooltipString); } string statusEffectTooltip3 = item.GetStatusEffectTooltip(); if (statusEffectTooltip3.Length > 0) { text.Append("\n\n"); text.Append(statusEffectTooltip3); break; } break; case ItemDrop.ItemData.ItemType.Ammo: text.Append(item.GetDamage(qualityLevel).GetTooltipString(item.m_shared.m_skillType)); text.AppendFormat("\n$item_knockback: <color=orange>{0}</color>", (object)item.m_shared.m_attackForce); break; } if ((double)item.m_shared.m_movementModifier != 0.0 && (UnityEngine.Object)localPlayer != (UnityEngine.Object)null) { float movementModifier = localPlayer.GetEquipmentMovementModifier(); StringBuilder stringBuilder3 = text; num = item.m_shared.m_movementModifier * 100f; string str1 = num.ToString("+0;-0"); num = movementModifier * 100f; string str2 = num.ToString("+0;-0"); stringBuilder3.AppendFormat("\n$item_movement_modifier: <color=orange>{0}%</color> ($item_total:<color=yellow>{1}%</color>)", (object)str1, (object)str2); } string statusEffectTooltip4 = item.GetSetStatusEffectTooltip(); if (statusEffectTooltip4.Length > 0) { text.AppendFormat("\n\n$item_seteffect (<color=orange>{0}</color> $item_parts):<color=orange>{1}</color>", (object)item.m_shared.m_setSize, (object)statusEffectTooltip4); } return(text.ToString()); }