Skip to content

Commit

Permalink
#1405: Add a tool component to ItemMeta
Browse files Browse the repository at this point in the history
Co-authored-by: md_5 <git@md-5.net>
  • Loading branch information
2008Choco and md-5 committed May 28, 2024
1 parent 5d7d675 commit 3ec31ca
Show file tree
Hide file tree
Showing 5 changed files with 406 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import org.bukkit.craftbukkit.entity.CraftEntity;
import org.bukkit.craftbukkit.entity.CraftEntityType;
import org.bukkit.craftbukkit.inventory.components.CraftFoodComponent;
import org.bukkit.craftbukkit.inventory.components.CraftToolComponent;
import org.bukkit.craftbukkit.util.CraftLegacy;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
Expand All @@ -36,6 +37,8 @@ public final class CraftItemFactory implements ItemFactory {
ConfigurationSerialization.registerClass(SerializableMeta.class);
ConfigurationSerialization.registerClass(CraftFoodComponent.class);
ConfigurationSerialization.registerClass(CraftFoodComponent.CraftFoodEffect.class);
ConfigurationSerialization.registerClass(CraftToolComponent.class);
ConfigurationSerialization.registerClass(CraftToolComponent.CraftToolRule.class);
}

private CraftItemFactory() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@
import net.minecraft.world.item.component.CustomModelData;
import net.minecraft.world.item.component.ItemAttributeModifiers;
import net.minecraft.world.item.component.ItemLore;
import net.minecraft.world.item.component.Tool;
import net.minecraft.world.item.component.Unbreakable;
import net.minecraft.world.item.enchantment.ItemEnchantments;
import net.minecraft.world.level.block.state.IBlockData;
Expand All @@ -85,6 +86,7 @@
import org.bukkit.craftbukkit.enchantments.CraftEnchantment;
import org.bukkit.craftbukkit.inventory.CraftMetaItem.ItemMetaKey.Specific;
import org.bukkit.craftbukkit.inventory.components.CraftFoodComponent;
import org.bukkit.craftbukkit.inventory.components.CraftToolComponent;
import org.bukkit.craftbukkit.inventory.tags.DeprecatedCustomTagContainer;
import org.bukkit.craftbukkit.persistence.CraftPersistentDataContainer;
import org.bukkit.craftbukkit.persistence.CraftPersistentDataTypeRegistry;
Expand All @@ -100,6 +102,7 @@
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.Repairable;
import org.bukkit.inventory.meta.components.FoodComponent;
import org.bukkit.inventory.meta.components.ToolComponent;
import org.bukkit.inventory.meta.tags.CustomItemTagContainer;
import org.bukkit.persistence.PersistentDataContainer;

Expand Down Expand Up @@ -221,6 +224,8 @@ DataComponentPatch build() {
@Specific(Specific.To.NBT)
static final ItemMetaKeyType<FoodInfo> FOOD = new ItemMetaKeyType<>(DataComponents.FOOD, "food");
@Specific(Specific.To.NBT)
static final ItemMetaKeyType<Tool> TOOL = new ItemMetaKeyType<>(DataComponents.TOOL, "tool");
@Specific(Specific.To.NBT)
static final ItemMetaKeyType<Integer> DAMAGE = new ItemMetaKeyType<>(DataComponents.DAMAGE, "Damage");
@Specific(Specific.To.NBT)
static final ItemMetaKeyType<Integer> MAX_DAMAGE = new ItemMetaKeyType<>(DataComponents.MAX_DAMAGE, "max-damage");
Expand Down Expand Up @@ -249,6 +254,7 @@ DataComponentPatch build() {
private Integer maxStackSize;
private ItemRarity rarity;
private CraftFoodComponent food;
private CraftToolComponent tool;
private int damage;
private Integer maxDamage;

Expand Down Expand Up @@ -295,6 +301,9 @@ DataComponentPatch build() {
if (meta.hasFood()) {
this.food = new CraftFoodComponent(meta.food);
}
if (meta.hasTool()) {
this.tool = new CraftToolComponent(meta.tool);
}
this.damage = meta.damage;
this.maxDamage = meta.maxDamage;
this.unhandledTags = meta.unhandledTags;
Expand Down Expand Up @@ -373,6 +382,9 @@ DataComponentPatch build() {
getOrEmpty(tag, FOOD).ifPresent((foodInfo) -> {
food = new CraftFoodComponent(foodInfo);
});
getOrEmpty(tag, TOOL).ifPresent((toolInfo) -> {
tool = new CraftToolComponent(toolInfo);
});
getOrEmpty(tag, DAMAGE).ifPresent((i) -> {
damage = i;
});
Expand Down Expand Up @@ -551,6 +563,11 @@ static Multimap<Attribute, AttributeModifier> buildModifiers(ItemAttributeModifi
setFood(food);
}

CraftToolComponent tool = SerializableMeta.getObject(CraftToolComponent.class, map, TOOL.BUKKIT, true);
if (tool != null) {
setTool(tool);
}

Integer damage = SerializableMeta.getObject(Integer.class, map, DAMAGE.BUKKIT, true);
if (damage != null) {
setDamage(damage);
Expand Down Expand Up @@ -779,6 +796,10 @@ void applyToItem(CraftMetaItem.Applicator itemTag) {
itemTag.put(FOOD, food.getHandle());
}

if (hasTool()) {
itemTag.put(TOOL, tool.getHandle());
}

if (hasDamage()) {
itemTag.put(DAMAGE, damage);
}
Expand Down Expand Up @@ -861,7 +882,7 @@ boolean applicableTo(Material type) {

@Overridden
boolean isEmpty() {
return !(hasDisplayName() || hasItemName() || hasLocalizedName() || hasEnchants() || (lore != null) || hasCustomModelData() || hasBlockData() || hasRepairCost() || !unhandledTags.build().isEmpty() || !persistentDataContainer.isEmpty() || hideFlag != 0 || isHideTooltip() || isUnbreakable() || hasEnchantmentGlintOverride() || isFireResistant() || hasMaxStackSize() || hasRarity() || hasFood() || hasDamage() || hasMaxDamage() || hasAttributeModifiers() || customTag != null);
return !(hasDisplayName() || hasItemName() || hasLocalizedName() || hasEnchants() || (lore != null) || hasCustomModelData() || hasBlockData() || hasRepairCost() || !unhandledTags.build().isEmpty() || !persistentDataContainer.isEmpty() || hideFlag != 0 || isHideTooltip() || isUnbreakable() || hasEnchantmentGlintOverride() || isFireResistant() || hasMaxStackSize() || hasRarity() || hasFood() || hasTool() || hasDamage() || hasMaxDamage() || hasAttributeModifiers() || customTag != null);
}

@Override
Expand Down Expand Up @@ -1174,6 +1195,21 @@ public void setFood(FoodComponent food) {
this.food = (food == null) ? null : new CraftFoodComponent((CraftFoodComponent) food);
}

@Override
public boolean hasTool() {
return this.tool != null;
}

@Override
public ToolComponent getTool() {
return (this.hasTool()) ? new CraftToolComponent(this.tool) : new CraftToolComponent(new Tool(Collections.emptyList(), 1.0F, 0));
}

@Override
public void setTool(ToolComponent tool) {
this.tool = (tool == null) ? null : new CraftToolComponent((CraftToolComponent) tool);
}

@Override
public boolean hasAttributeModifiers() {
return attributeModifiers != null && !attributeModifiers.isEmpty();
Expand Down Expand Up @@ -1425,6 +1461,7 @@ boolean equalsCommon(CraftMetaItem that) {
&& (this.hasMaxStackSize() ? that.hasMaxStackSize() && this.maxStackSize.equals(that.maxStackSize) : !that.hasMaxStackSize())
&& (this.rarity == that.rarity)
&& (this.hasFood() ? that.hasFood() && this.food.equals(that.food) : !that.hasFood())
&& (this.hasTool() ? that.hasTool() && this.tool.equals(that.tool) : !that.hasTool())
&& (this.hasDamage() ? that.hasDamage() && this.damage == that.damage : !that.hasDamage())
&& (this.hasMaxDamage() ? that.hasMaxDamage() && this.maxDamage.equals(that.maxDamage) : !that.hasMaxDamage())
&& (this.version == that.version);
Expand Down Expand Up @@ -1466,6 +1503,7 @@ int applyHash() {
hash = 61 * hash + (hasMaxStackSize() ? this.maxStackSize.hashCode() : 0);
hash = 61 * hash + (hasRarity() ? this.rarity.hashCode() : 0);
hash = 61 * hash + (hasFood() ? this.food.hashCode() : 0);
hash = 61 * hash + (hasTool() ? this.tool.hashCode() : 0);
hash = 61 * hash + (hasDamage() ? this.damage : 0);
hash = 61 * hash + (hasMaxDamage() ? 1231 : 1237);
hash = 61 * hash + (hasAttributeModifiers() ? this.attributeModifiers.hashCode() : 0);
Expand Down Expand Up @@ -1503,6 +1541,9 @@ public CraftMetaItem clone() {
if (this.hasFood()) {
clone.food = new CraftFoodComponent(food);
}
if (this.hasTool()) {
clone.tool = new CraftToolComponent(tool);
}
clone.damage = this.damage;
clone.maxDamage = this.maxDamage;
clone.version = this.version;
Expand Down Expand Up @@ -1591,6 +1632,10 @@ ImmutableMap.Builder<String, Object> serialize(ImmutableMap.Builder<String, Obje
builder.put(FOOD.BUKKIT, food);
}

if (hasTool()) {
builder.put(TOOL.BUKKIT, tool);
}

if (hasDamage()) {
builder.put(DAMAGE.BUKKIT, damage);
}
Expand Down Expand Up @@ -1757,6 +1802,7 @@ public static Set<DataComponentType> getHandledTags() {
MAX_STACK_SIZE.TYPE,
RARITY.TYPE,
FOOD.TYPE,
TOOL.TYPE,
DAMAGE.TYPE,
MAX_DAMAGE.TYPE,
CUSTOM_DATA.TYPE,
Expand Down
Loading

0 comments on commit 3ec31ca

Please sign in to comment.