Add ItemStack#copyDataFrom (#12224)

This commit is contained in:
TonytheMacaroni
2025-03-23 20:12:57 -04:00
committed by GitHub
parent 5a6ab97be6
commit c467df95a2
3 changed files with 54 additions and 8 deletions

View File

@@ -7,6 +7,7 @@ import java.util.Collections;
import java.util.Map;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Predicate;
import net.kyori.adventure.text.Component;
import net.minecraft.advancements.critereon.ItemPredicate;
import net.minecraft.advancements.critereon.MinMaxBounds;
@@ -15,6 +16,7 @@ import net.minecraft.core.HolderSet;
import net.minecraft.core.component.DataComponentMap;
import net.minecraft.core.component.DataComponentPatch;
import net.minecraft.core.component.DataComponentPredicate;
import net.minecraft.core.component.DataComponentType;
import net.minecraft.core.component.DataComponents;
import net.minecraft.core.component.PatchedDataComponentMap;
import net.minecraft.nbt.CompoundTag;
@@ -54,7 +56,7 @@ public final class CraftItemStack extends ItemStack {
if (bukkit instanceof final CraftItemStack craftItemStack) {
return craftItemStack;
} else {
return (CraftItemStack) API_ITEM_STACK_CRAFT_DELEGATE_FIELD.get(bukkit);
return (CraftItemStack) API_ITEM_STACK_CRAFT_DELEGATE_FIELD.get(bukkit);
}
}
@@ -71,12 +73,12 @@ public final class CraftItemStack extends ItemStack {
@Override
public boolean equals(final Object obj) {
if (!(obj instanceof final org.bukkit.inventory.ItemStack bukkit)) return false;
if (!(obj instanceof final ItemStack bukkit)) return false;
final CraftItemStack craftStack = getCraftStack(bukkit);
if (this.handle == craftStack.handle) return true;
else if (this.handle == null || craftStack.handle == null) return false;
else if (this.handle.isEmpty() && craftStack.handle.isEmpty()) return true;
else return net.minecraft.world.item.ItemStack.matches(this.handle, craftStack.handle);
if (this.handle == null || craftStack.handle == null) return false;
if (this.handle.isEmpty() && craftStack.handle.isEmpty()) return true;
return net.minecraft.world.item.ItemStack.matches(this.handle, craftStack.handle);
}
// Paper end
@@ -648,14 +650,32 @@ public final class CraftItemStack extends ItemStack {
this.handle.set(nms, nmsValue);
}
@Override
public void copyDataFrom(final ItemStack source, final Predicate<io.papermc.paper.datacomponent.DataComponentType> filter) {
Preconditions.checkArgument(source != null, "source cannot be null");
Preconditions.checkArgument(filter != null, "filter cannot be null");
if (this.isEmpty() || source.isEmpty()) {
return;
}
final Predicate<DataComponentType<?>> nmsFilter = nms -> filter.test(io.papermc.paper.datacomponent.PaperDataComponentType.minecraftToBukkit(nms));
net.minecraft.world.item.ItemStack sourceNmsStack = getCraftStack(source).handle;
this.handle.applyComponents(sourceNmsStack.getPrototype().filter(nmsType -> {
return !sourceNmsStack.hasNonDefault(nmsType) && nmsFilter.test(nmsType);
}));
final DataComponentPatch.SplitResult split = sourceNmsStack.getComponentsPatch().split();
this.handle.applyComponents(split.added().filter(nmsFilter));
split.removed().stream().filter(nmsFilter).forEach(this.handle::remove);
}
@Override
public boolean isDataOverridden(final io.papermc.paper.datacomponent.DataComponentType type) {
if (this.isEmpty()) {
return false;
}
final net.minecraft.core.component.DataComponentType<?> nms = io.papermc.paper.datacomponent.PaperDataComponentType.bukkitToMinecraft(type);
// maybe a more efficient way is to expose the "patch" map in PatchedDataComponentMap and just check if the type exists as a key
return !java.util.Objects.equals(this.handle.get(nms), this.handle.getPrototype().get(nms));
return this.handle.hasNonDefault(nms);
}
@Override