7
7
import java .util .Map ;
8
8
import java .util .Optional ;
9
9
import java .util .function .Consumer ;
10
+ import java .util .function .Predicate ;
10
11
import net .kyori .adventure .text .Component ;
11
12
import net .minecraft .advancements .critereon .ItemPredicate ;
12
13
import net .minecraft .advancements .critereon .MinMaxBounds ;
15
16
import net .minecraft .core .component .DataComponentMap ;
16
17
import net .minecraft .core .component .DataComponentPatch ;
17
18
import net .minecraft .core .component .DataComponentPredicate ;
19
+ import net .minecraft .core .component .DataComponentType ;
18
20
import net .minecraft .core .component .DataComponents ;
19
21
import net .minecraft .core .component .PatchedDataComponentMap ;
20
22
import net .minecraft .nbt .CompoundTag ;
@@ -54,7 +56,7 @@ private static CraftItemStack getCraftStack(final ItemStack bukkit) {
54
56
if (bukkit instanceof final CraftItemStack craftItemStack ) {
55
57
return craftItemStack ;
56
58
} else {
57
- return (CraftItemStack ) API_ITEM_STACK_CRAFT_DELEGATE_FIELD .get (bukkit );
59
+ return (CraftItemStack ) API_ITEM_STACK_CRAFT_DELEGATE_FIELD .get (bukkit );
58
60
}
59
61
}
60
62
@@ -71,12 +73,12 @@ public int hashCode() {
71
73
72
74
@ Override
73
75
public boolean equals (final Object obj ) {
74
- if (!(obj instanceof final org . bukkit . inventory . ItemStack bukkit )) return false ;
76
+ if (!(obj instanceof final ItemStack bukkit )) return false ;
75
77
final CraftItemStack craftStack = getCraftStack (bukkit );
76
78
if (this .handle == craftStack .handle ) return true ;
77
- else if (this .handle == null || craftStack .handle == null ) return false ;
78
- else if (this .handle .isEmpty () && craftStack .handle .isEmpty ()) return true ;
79
- else return net .minecraft .world .item .ItemStack .matches (this .handle , craftStack .handle );
79
+ if (this .handle == null || craftStack .handle == null ) return false ;
80
+ if (this .handle .isEmpty () && craftStack .handle .isEmpty ()) return true ;
81
+ return net .minecraft .world .item .ItemStack .matches (this .handle , craftStack .handle );
80
82
}
81
83
// Paper end
82
84
@@ -648,14 +650,32 @@ private <M> void resetData(final io.papermc.paper.datacomponent.PaperDataCompone
648
650
this .handle .set (nms , nmsValue );
649
651
}
650
652
653
+ @ Override
654
+ public void copyDataFrom (final ItemStack source , final Predicate <io .papermc .paper .datacomponent .DataComponentType > filter ) {
655
+ Preconditions .checkArgument (source != null , "source cannot be null" );
656
+ Preconditions .checkArgument (filter != null , "filter cannot be null" );
657
+ if (this .isEmpty () || source .isEmpty ()) {
658
+ return ;
659
+ }
660
+
661
+ final Predicate <DataComponentType <?>> nmsFilter = nms -> filter .test (io .papermc .paper .datacomponent .PaperDataComponentType .minecraftToBukkit (nms ));
662
+ net .minecraft .world .item .ItemStack sourceNmsStack = getCraftStack (source ).handle ;
663
+ this .handle .applyComponents (sourceNmsStack .getPrototype ().filter (nmsType -> {
664
+ return !sourceNmsStack .hasNonDefault (nmsType ) && nmsFilter .test (nmsType );
665
+ }));
666
+
667
+ final DataComponentPatch .SplitResult split = sourceNmsStack .getComponentsPatch ().split ();
668
+ this .handle .applyComponents (split .added ().filter (nmsFilter ));
669
+ split .removed ().stream ().filter (nmsFilter ).forEach (this .handle ::remove );
670
+ }
671
+
651
672
@ Override
652
673
public boolean isDataOverridden (final io .papermc .paper .datacomponent .DataComponentType type ) {
653
674
if (this .isEmpty ()) {
654
675
return false ;
655
676
}
656
677
final net .minecraft .core .component .DataComponentType <?> nms = io .papermc .paper .datacomponent .PaperDataComponentType .bukkitToMinecraft (type );
657
- // maybe a more efficient way is to expose the "patch" map in PatchedDataComponentMap and just check if the type exists as a key
658
- return !java .util .Objects .equals (this .handle .get (nms ), this .handle .getPrototype ().get (nms ));
678
+ return this .handle .hasNonDefault (nms );
659
679
}
660
680
661
681
@ Override
0 commit comments