SPIGOT-7654: ItemStack#isSimilar does not work with empty BlockStateMeta
By: md_5 <git@md-5.net>
This commit is contained in:
@@ -1,8 +1,10 @@
|
||||
package org.bukkit.craftbukkit.block;
|
||||
|
||||
import java.util.Set;
|
||||
import net.minecraft.core.IRegistryCustom;
|
||||
import net.minecraft.core.component.DataComponentMap;
|
||||
import net.minecraft.core.component.DataComponentPatch;
|
||||
import net.minecraft.core.component.DataComponentType;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.network.protocol.Packet;
|
||||
import net.minecraft.network.protocol.game.PacketListenerPlayOut;
|
||||
@@ -60,9 +62,10 @@ public class CraftBlockEntityState<T extends TileEntity> extends CraftBlockState
|
||||
return snapshot;
|
||||
}
|
||||
|
||||
public void applyComponents(DataComponentMap datacomponentmap, DataComponentPatch datacomponentpatch) {
|
||||
snapshot.applyComponents(datacomponentmap, datacomponentpatch);
|
||||
public Set<DataComponentType<?>> applyComponents(DataComponentMap datacomponentmap, DataComponentPatch datacomponentpatch) {
|
||||
Set<DataComponentType<?>> result = snapshot.applyComponentsSet(datacomponentmap, datacomponentpatch);
|
||||
load(snapshot);
|
||||
return result;
|
||||
}
|
||||
|
||||
public DataComponentMap collectComponents() {
|
||||
|
||||
@@ -4,8 +4,6 @@ import com.google.common.base.Objects;
|
||||
import com.google.common.base.Preconditions;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.common.collect.Sets;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import net.minecraft.core.BlockPosition;
|
||||
@@ -137,32 +135,6 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta
|
||||
Material.VAULT
|
||||
);
|
||||
|
||||
private static final class TrackedDataComponentMap implements DataComponentMap {
|
||||
|
||||
private final Set<DataComponentType<?>> seen = new HashSet<>();
|
||||
private final DataComponentMap handle;
|
||||
|
||||
public TrackedDataComponentMap(DataComponentMap map) {
|
||||
this.handle = map;
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> T get(DataComponentType<? extends T> type) {
|
||||
seen.add(type);
|
||||
return handle.get(type);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<DataComponentType<?>> keySet() {
|
||||
return handle.keySet();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterator<TypedDataComponent<?>> iterator() {
|
||||
return handle.iterator();
|
||||
}
|
||||
}
|
||||
|
||||
static {
|
||||
// Add shulker boxes to the list of block state materials too
|
||||
BLOCK_STATE_MATERIALS.addAll(SHULKER_BOX_MATERIALS);
|
||||
@@ -198,6 +170,7 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta
|
||||
});
|
||||
|
||||
if (!tag.isEmpty()) {
|
||||
CraftBlockEntityState<?> blockEntityTag = this.blockEntityTag;
|
||||
if (blockEntityTag == null) {
|
||||
blockEntityTag = getBlockState(material, null);
|
||||
}
|
||||
@@ -205,14 +178,16 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta
|
||||
// Convert to map
|
||||
PatchedDataComponentMap map = new PatchedDataComponentMap(DataComponentMap.EMPTY);
|
||||
map.applyPatch(tag);
|
||||
// Setup tracking
|
||||
TrackedDataComponentMap track = new TrackedDataComponentMap(map);
|
||||
// Apply
|
||||
blockEntityTag.applyComponents(track, tag);
|
||||
Set<DataComponentType<?>> applied = blockEntityTag.applyComponents(map, tag);
|
||||
// Mark applied components as handled
|
||||
for (DataComponentType<?> seen : track.seen) {
|
||||
for (DataComponentType<?> seen : applied) {
|
||||
unhandledTags.clear(seen);
|
||||
}
|
||||
// Only set blockEntityTag if something was applied
|
||||
if (!applied.isEmpty()) {
|
||||
this.blockEntityTag = blockEntityTag;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user