using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using MinecraftClient.Protocol.Message;
namespace MinecraftClient.Inventory
{
///
/// Represents an item inside a Container
///
public class Item
{
///
/// Item Type
///
public ItemType Type;
///
/// Item Count
///
public int Count;
///
/// Item Metadata
///
public Dictionary? NBT;
///
/// Create an item with ItemType, Count and Metadata
///
/// Type of the item
/// Item Count
/// Item Metadata
public Item(ItemType itemType, int count, Dictionary? nbt)
{
Type = itemType;
Count = count;
NBT = nbt;
}
///
/// Check if the item slot is empty
///
/// TRUE if the item is empty
public bool IsEmpty
{
get
{
return Type == ItemType.Air || Count == 0;
}
}
///
/// Retrieve item display name from NBT properties. NULL if no display name is defined.
///
public string? DisplayName
{
get
{
if (NBT != null && NBT.ContainsKey("display"))
{
if (NBT["display"] is Dictionary displayProperties && displayProperties.ContainsKey("Name"))
{
string? displayName = displayProperties["Name"] as string;
if (!String.IsNullOrEmpty(displayName))
return ChatParser.ParseText(displayProperties["Name"].ToString() ?? string.Empty);
}
}
return null;
}
}
///
/// Retrieve item lores from NBT properties. Returns null if no lores is defined.
///
public string[]? Lores
{
get
{
List lores = new();
if (NBT != null && NBT.ContainsKey("display"))
{
if (NBT["display"] is Dictionary displayProperties && displayProperties.ContainsKey("Lore"))
{
object[] displayName = (object[])displayProperties["Lore"];
lores.AddRange(from string st in displayName
let str = ChatParser.ParseText(st.ToString())
select str);
return lores.ToArray();
}
}
return null;
}
}
///
/// Retrieve item damage from NBT properties. Returns 0 if no damage is defined.
///
public int Damage
{
get
{
if (NBT != null && NBT.ContainsKey("Damage"))
{
object damage = NBT["Damage"];
if (damage != null)
{
return int.Parse(damage.ToString() ?? string.Empty, NumberStyles.Any, CultureInfo.CurrentCulture);
}
}
return 0;
}
}
public static string GetTypeString(ItemType type)
{
string type_str = type.ToString();
string type_renamed = type_str.ToUnderscoreCase();
string? res1 = ChatParser.TranslateString("item.minecraft." + type_renamed);
if (!string.IsNullOrEmpty(res1))
return res1;
string? res2 = ChatParser.TranslateString("block.minecraft." + type_renamed);
if (!string.IsNullOrEmpty(res2))
return res2;
return type_str;
}
public string GetTypeString()
{
return GetTypeString(Type);
}
public string ToFullString()
{
StringBuilder sb = new();
sb.Append(ToString());
try
{
if (NBT != null && (NBT.TryGetValue("Enchantments", out object? enchantments) || NBT.TryGetValue("StoredEnchantments", out enchantments)))
{
foreach (Dictionary enchantment in (object[])enchantments)
{
short level = (short)enchantment["lvl"];
string id = ((string)enchantment["id"]).Replace(':', '.');
sb.AppendFormat(" | {0} {1}",
ChatParser.TranslateString("enchantment." + id) ?? id,
ChatParser.TranslateString("enchantment.level." + level) ?? level.ToString());
}
}
}
catch (Exception) { }
return sb.ToString();
}
public override string ToString()
{
StringBuilder sb = new();
sb.AppendFormat("x{0,-2} {1}", Count, GetTypeString());
string? displayName = DisplayName;
if (!String.IsNullOrEmpty(displayName))
sb.AppendFormat(" - {0}§8", displayName);
int damage = Damage;
if (damage != 0)
sb.AppendFormat(" | {0}: {1}", Translations.cmd_inventory_damage, damage);
return sb.ToString();
}
}
}