diff --git a/build-data/paper.at b/build-data/paper.at index b86bf069b2..f42afed8e5 100644 --- a/build-data/paper.at +++ b/build-data/paper.at @@ -439,6 +439,7 @@ public net.minecraft.world.entity.projectile.Arrow updateColor()V public net.minecraft.world.entity.projectile.EvokerFangs warmupDelayTicks public net.minecraft.world.entity.projectile.EyeOfEnder life public net.minecraft.world.entity.projectile.EyeOfEnder surviveAfterDeath +public net.minecraft.world.entity.projectile.EyeOfEnder target public net.minecraft.world.entity.projectile.FireworkRocketEntity DATA_ATTACHED_TO_TARGET public net.minecraft.world.entity.projectile.FireworkRocketEntity DATA_ID_FIREWORKS_ITEM public net.minecraft.world.entity.projectile.FireworkRocketEntity DATA_SHOT_AT_ANGLE @@ -601,6 +602,7 @@ public net.minecraft.world.level.block.entity.BedBlockEntity color public net.minecraft.world.level.block.entity.BeehiveBlockEntity savedFlowerPos public net.minecraft.world.level.block.entity.BellBlockEntity resonating public net.minecraft.world.level.block.entity.BellBlockEntity resonationTicks +public net.minecraft.world.level.block.entity.BlockEntity saveId(Lnet/minecraft/world/level/storage/ValueOutput;)V public net.minecraft.world.level.block.entity.BlockEntityType validBlocks public net.minecraft.world.level.block.entity.BrewingStandBlockEntity brewTime public net.minecraft.world.level.block.entity.BrewingStandBlockEntity fuel @@ -612,9 +614,11 @@ public net.minecraft.world.level.block.entity.CampfireBlockEntity cookingTime public net.minecraft.world.level.block.entity.ChestBlockEntity openersCounter public net.minecraft.world.level.block.entity.ChestBlockEntity playSound(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/sounds/SoundEvent;)V public net.minecraft.world.level.block.entity.ChiseledBookShelfBlockEntity lastInteractedSlot +public net.minecraft.world.level.block.entity.ConduitBlockEntity MIN_KILL_SIZE public net.minecraft.world.level.block.entity.ConduitBlockEntity destroyTarget public net.minecraft.world.level.block.entity.ConduitBlockEntity effectBlocks public net.minecraft.world.level.block.entity.ConduitBlockEntity getDestroyRangeAABB(Lnet/minecraft/core/BlockPos;)Lnet/minecraft/world/phys/AABB; +public net.minecraft.world.level.block.entity.ConduitBlockEntity updateDestroyTarget(Lnet/minecraft/world/entity/EntityReference;Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/core/BlockPos;Z)Lnet/minecraft/world/entity/EntityReference; public net.minecraft.world.level.block.entity.CrafterBlockEntity craftingTicksRemaining public net.minecraft.world.level.block.entity.DecoratedPotBlockEntity decorations public net.minecraft.world.level.block.entity.EnderChestBlockEntity openersCounter diff --git a/paper-generator/src/main/java/io/papermc/generator/types/goal/MobGoalNames.java b/paper-generator/src/main/java/io/papermc/generator/types/goal/MobGoalNames.java index 46f5f48c82..832fe65673 100644 --- a/paper-generator/src/main/java/io/papermc/generator/types/goal/MobGoalNames.java +++ b/paper-generator/src/main/java/io/papermc/generator/types/goal/MobGoalNames.java @@ -46,7 +46,6 @@ public final class MobGoalNames { // todo sync with MobGoalHelper ideally this s bukkitMap.put(net.minecraft.world.entity.monster.Evoker.class, Evoker.class); bukkitMap.put(net.minecraft.world.entity.animal.AbstractFish.class, Fish.class); bukkitMap.put(net.minecraft.world.entity.animal.AbstractSchoolingFish.class, SchoolableFish.class); - bukkitMap.put(net.minecraft.world.entity.FlyingMob.class, Flying.class); bukkitMap.put(net.minecraft.world.entity.animal.Fox.class, Fox.class); bukkitMap.put(net.minecraft.world.entity.monster.Ghast.class, Ghast.class); bukkitMap.put(net.minecraft.world.entity.monster.Giant.class, Giant.class); diff --git a/paper-server/patches/sources/net/minecraft/world/entity/Entity.java.patch b/paper-server/patches/sources/net/minecraft/world/entity/Entity.java.patch index a1b4f242f0..0ca3ece5b7 100644 --- a/paper-server/patches/sources/net/minecraft/world/entity/Entity.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/entity/Entity.java.patch @@ -721,7 +721,7 @@ public void saveWithoutId(ValueOutput output) { + // CraftBukkit start - allow excluding certain data when saving + // Paper start - Raw entity serialization API -+ return this.saveWithoutId(output, true, false, false); ++ this.saveWithoutId(output, true, false, false); + } + + public void saveWithoutId(ValueOutput output, boolean includeAll, boolean includeNonSaveable, boolean forceSerialization) { diff --git a/paper-server/patches/sources/net/minecraft/world/entity/ExperienceOrb.java.patch b/paper-server/patches/sources/net/minecraft/world/entity/ExperienceOrb.java.patch index 15356ef54e..5e51d5ea00 100644 --- a/paper-server/patches/sources/net/minecraft/world/entity/ExperienceOrb.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/entity/ExperienceOrb.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/ExperienceOrb.java +++ b/net/minecraft/world/entity/ExperienceOrb.java -@@ -44,13 +_,54 @@ +@@ -44,13 +_,59 @@ @Nullable private Player followingPlayer; private final InterpolationHandler interpolation = new InterpolationHandler(this); @@ -36,7 +36,13 @@ + // Paper end + @Deprecated @io.papermc.paper.annotation.DoNotUse // Paper - overload ctor public ExperienceOrb(Level level, double x, double y, double z, int value) { - this(level, new Vec3(x, y, z), Vec3.ZERO, value); +- this(level, new Vec3(x, y, z), Vec3.ZERO, value); ++ // Paper start - add reasons for orbs ++ this(level, x, y, z, value, null, null, null); ++ } ++ public ExperienceOrb(Level level, double x, double y, double z, int value, @Nullable org.bukkit.entity.ExperienceOrb.SpawnReason reason, @Nullable Entity triggerId, @Nullable Entity sourceId) { ++ this(level, new Vec3(x, y, z), Vec3.ZERO, value, reason, triggerId, sourceId); ++ // Paper end - add reasons for orbs } + @Deprecated @io.papermc.paper.annotation.DoNotUse // Paper - overload ctor diff --git a/paper-server/patches/sources/net/minecraft/world/level/block/entity/BlockEntity.java.patch b/paper-server/patches/sources/net/minecraft/world/level/block/entity/BlockEntity.java.patch index 7516dc4ee3..462a2e2c90 100644 --- a/paper-server/patches/sources/net/minecraft/world/level/block/entity/BlockEntity.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/level/block/entity/BlockEntity.java.patch @@ -71,7 +71,7 @@ + // Paper end } - private void saveId(ValueOutput output) { + public void saveId(ValueOutput output) { @@ -287,6 +_,12 @@ } diff --git a/paper-server/patches/sources/net/minecraft/world/level/block/entity/ConduitBlockEntity.java.patch b/paper-server/patches/sources/net/minecraft/world/level/block/entity/ConduitBlockEntity.java.patch index bd89359de2..2990193cfd 100644 --- a/paper-server/patches/sources/net/minecraft/world/level/block/entity/ConduitBlockEntity.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/level/block/entity/ConduitBlockEntity.java.patch @@ -36,7 +36,7 @@ + // CraftBukkit start - add "damageTarget" boolean + updateAndAttackTarget(level, pos, state, blockEntity, canDestroy, true); + } -+ private static void updateAndAttackTarget(ServerLevel level, BlockPos pos, BlockState state, ConduitBlockEntity blockEntity, boolean canDestroy, boolean damageTarget) { ++ public static void updateAndAttackTarget(ServerLevel level, BlockPos pos, BlockState state, ConduitBlockEntity blockEntity, boolean canDestroy, boolean damageTarget) { + // CraftBukkit end - add "damageTarget" boolean EntityReference entityReference = updateDestroyTarget(blockEntity.destroyTarget, level, pos, canDestroy); LivingEntity livingEntity = EntityReference.get(entityReference, level, LivingEntity.class); diff --git a/paper-server/patches/sources/net/minecraft/world/level/chunk/storage/SerializableChunkData.java.patch b/paper-server/patches/sources/net/minecraft/world/level/chunk/storage/SerializableChunkData.java.patch index cace6fd267..51d6def59c 100644 --- a/paper-server/patches/sources/net/minecraft/world/level/chunk/storage/SerializableChunkData.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/level/chunk/storage/SerializableChunkData.java.patch @@ -26,7 +26,7 @@ + // Paper end - guard against serializing mismatching coordinates + + // Paper start - Do not let the server load chunks from newer versions -+ private static final int CURRENT_DATA_VERSION = net.minecraft.SharedConstants.getCurrentVersion().dataVersion().getVersion(); ++ private static final int CURRENT_DATA_VERSION = net.minecraft.SharedConstants.getCurrentVersion().dataVersion().version(); + private static final boolean JUST_CORRUPT_IT = Boolean.getBoolean("Paper.ignoreWorldDataVersion"); + // Paper end - Do not let the server load chunks from newer versions + diff --git a/paper-server/patches/sources/net/minecraft/world/level/levelgen/structure/StructurePiece.java.patch b/paper-server/patches/sources/net/minecraft/world/level/levelgen/structure/StructurePiece.java.patch index 9f34fb9376..ddf9087f7c 100644 --- a/paper-server/patches/sources/net/minecraft/world/level/levelgen/structure/StructurePiece.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/level/levelgen/structure/StructurePiece.java.patch @@ -25,7 +25,7 @@ + boolean result = levelAccessor.setBlock(pos, craftBlockEntityState.getHandle(), flags); + BlockEntity blockEntity = levelAccessor.getBlockEntity(pos); + if (blockEntity != null) { -+ blockEntity.loadWithComponents(craftBlockEntityState.getSnapshotNBT(), levelAccessor.registryAccess()); ++ blockEntity.loadWithComponents(net.minecraft.world.level.storage.TagValueInput.createDiscarding(levelAccessor.registryAccess(), craftBlockEntityState.getSnapshotNBT())); + } + return result; + } diff --git a/paper-server/patches/sources/net/minecraft/world/level/storage/TagValueOutput.java.patch b/paper-server/patches/sources/net/minecraft/world/level/storage/TagValueOutput.java.patch new file mode 100644 index 0000000000..75e98dc6fe --- /dev/null +++ b/paper-server/patches/sources/net/minecraft/world/level/storage/TagValueOutput.java.patch @@ -0,0 +1,27 @@ +--- a/net/minecraft/world/level/storage/TagValueOutput.java ++++ b/net/minecraft/world/level/storage/TagValueOutput.java +@@ -24,6 +_,24 @@ + this.output = tag; + } + ++ // Paper start - utility methods ++ public static TagValueOutput createDiscarding() { ++ return createWithoutContext(ProblemReporter.DISCARDING); ++ } ++ ++ public static TagValueOutput createDiscardingWithContext(final HolderLookup.Provider lookup) { ++ return createWithContext(ProblemReporter.DISCARDING, lookup); ++ } ++ ++ public static TagValueOutput createDiscarding(final CompoundTag wrapping) { ++ return new TagValueOutput(ProblemReporter.DISCARDING, NbtOps.INSTANCE, wrapping); ++ } ++ ++ public static TagValueOutput createDiscardingWithContext(final CompoundTag wrapping, final HolderLookup.Provider lookup) { ++ return new TagValueOutput(ProblemReporter.DISCARDING, lookup.createSerializationContext(NbtOps.INSTANCE), wrapping); ++ } ++ // Paper end - utility methods ++ + public static TagValueOutput createWithContext(ProblemReporter problemReporter, HolderLookup.Provider lookup) { + return new TagValueOutput(problemReporter, lookup.createSerializationContext(NbtOps.INSTANCE), new CompoundTag()); + } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java b/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java index 3422970353..11a04c3e8d 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java @@ -11,6 +11,8 @@ import net.minecraft.network.protocol.game.ClientGamePacketListener; import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.storage.TagValueInput; +import net.minecraft.world.level.storage.TagValueOutput; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.block.TileState; @@ -97,14 +99,14 @@ public abstract class CraftBlockEntityState extends Craft // Loads the specified data into the snapshot BlockEntity. public void loadData(CompoundTag tag) { - this.snapshot.loadWithComponents(tag, this.getRegistryAccess()); + this.snapshot.loadWithComponents(TagValueInput.createDiscarding(this.getRegistryAccess(), tag)); this.load(this.snapshot); } // copies the BlockEntity-specific data, retains the position private void copyData(T from, T to) { CompoundTag tag = from.saveWithFullMetadata(this.getRegistryAccess()); - to.loadWithComponents(tag, this.getRegistryAccess()); + to.loadWithComponents(TagValueInput.createDiscarding(this.getRegistryAccess(), tag)); } // gets the wrapped BlockEntity @@ -143,13 +145,13 @@ public abstract class CraftBlockEntityState extends Craft // Paper start - properly save blockentity itemstacks public CompoundTag getSnapshotCustomNbtOnly() { this.applyTo(this.snapshot); - final CompoundTag nbt = this.snapshot.saveCustomOnly(this.getRegistryAccess()); - this.snapshot.removeComponentsFromTag(nbt); - if (!nbt.isEmpty()) { + final TagValueOutput output = TagValueOutput.createDiscardingWithContext(this.snapshot.saveCustomOnly(this.getRegistryAccess()), this.getRegistryAccess()); + this.snapshot.removeComponentsFromTag(output); + if (!output.isEmpty()) { // have to include the "id" if it's going to have block entity data - this.snapshot.saveId(nbt); + this.snapshot.saveId(output); } - return nbt; + return output.buildResult(); } // Paper end diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftConduit.java b/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftConduit.java index b7352ab040..f38992f1eb 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftConduit.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftConduit.java @@ -2,7 +2,9 @@ package org.bukkit.craftbukkit.block; import java.util.ArrayList; import java.util.Collection; +import net.minecraft.Optionull; import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.EntityReference; import net.minecraft.world.level.block.entity.ConduitBlockEntity; import net.minecraft.world.phys.AABB; import org.bukkit.Location; @@ -83,7 +85,7 @@ public class CraftConduit extends CraftBlockEntityState impl return false; } - net.minecraft.world.entity.LivingEntity currentTarget = conduit.destroyTarget; + EntityReference currentTarget = conduit.destroyTarget; if (target == null) { if (currentTarget == null) { @@ -91,17 +93,22 @@ public class CraftConduit extends CraftBlockEntityState impl } conduit.destroyTarget = null; - conduit.destroyTargetUUID = null; } else { if (currentTarget != null && target.getUniqueId().equals(currentTarget.getUUID())) { return false; } - conduit.destroyTarget = ((CraftLivingEntity) target).getHandle(); - conduit.destroyTargetUUID = target.getUniqueId(); + conduit.destroyTarget = new EntityReference<>(((CraftLivingEntity) target).getHandle()); } - ConduitBlockEntity.updateDestroyTarget(conduit.getLevel(), this.getPosition(), this.data, conduit.effectBlocks, conduit, false); + ConduitBlockEntity.updateAndAttackTarget( + conduit.getLevel().getMinecraftWorld(), + this.getPosition(), + this.data, + conduit, + conduit.effectBlocks.size() >= ConduitBlockEntity.MIN_KILL_SIZE, + false + ); return true; } @@ -112,14 +119,23 @@ public class CraftConduit extends CraftBlockEntityState impl return null; } - net.minecraft.world.entity.LivingEntity nmsEntity = conduit.destroyTarget; - return (nmsEntity != null) ? (LivingEntity) nmsEntity.getBukkitEntity() : null; + final EntityReference entityReference = conduit.destroyTarget; + if (entityReference == null) return null; + + final net.minecraft.world.entity.LivingEntity resolvedTarget = entityReference.getEntity(this.getWorldHandle().getMinecraftWorld(), net.minecraft.world.entity.LivingEntity.class); + return resolvedTarget == null ? null : resolvedTarget.getBukkitLivingEntity(); } @Override public boolean hasTarget() { ConduitBlockEntity conduit = (ConduitBlockEntity) this.getBlockEntityFromWorld(); - return conduit != null && conduit.destroyTarget != null && conduit.destroyTarget.isAlive(); + return conduit != null + && conduit.destroyTarget != null + && Optionull.mapOrDefault( + conduit.destroyTarget.getEntity(this.getWorldHandle().getMinecraftWorld(), net.minecraft.world.entity.LivingEntity.class), + net.minecraft.world.entity.LivingEntity::isAlive, + false + ); } @Override diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderSignal.java b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderSignal.java index 7feea819b2..acee0fb580 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderSignal.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderSignal.java @@ -22,7 +22,7 @@ public class CraftEnderSignal extends CraftEntity implements EnderSignal { @Override public Location getTargetLocation() { - return new Location(this.getWorld(), this.getHandle().tx, this.getHandle().ty, this.getHandle().tz, this.getHandle().getYRot(), this.getHandle().getXRot()); + return CraftLocation.toBukkit(this.getHandle().target, this.getWorld(), this.getHandle().getYRot(), this.getHandle().getXRot()); } @Override @@ -35,7 +35,7 @@ public class CraftEnderSignal extends CraftEntity implements EnderSignal { public void setTargetLocation(Location location, boolean update) { // Paper end - Change EnderEye target without changing other things Preconditions.checkArgument(this.getWorld().equals(location.getWorld()), "Cannot target EnderSignal across worlds"); - this.getHandle().signalTo(CraftLocation.toBlockPosition(location), update); // Paper - Change EnderEye target without changing other things + this.getHandle().signalTo(CraftLocation.toVec3(location), update); // Paper - Change EnderEye target without changing other things } @Override diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java index 3b41a37f85..6765df24fd 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java @@ -30,6 +30,9 @@ import net.minecraft.world.entity.boss.EnderDragonPart; import net.minecraft.world.entity.boss.enderdragon.EnderDragon; import net.minecraft.world.entity.projectile.AbstractArrow; import net.minecraft.world.level.portal.TeleportTransition; +import net.minecraft.world.level.storage.TagValueOutput; +import net.minecraft.world.level.storage.ValueInput; +import net.minecraft.world.level.storage.ValueOutput; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; import org.bukkit.EntityEffect; @@ -979,12 +982,12 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { @Override public String getAsString() { - CompoundTag tag = new CompoundTag(); - if (!this.getHandle().saveAsPassenger(tag, false, true, true)) { + final TagValueOutput output = TagValueOutput.createDiscardingWithContext(this.getHandle().registryAccess()); + if (!this.getHandle().saveAsPassenger(output, false, true, true)) { return null; } - return tag.toString(); + return output.buildResult().toString(); } @Override @@ -1012,32 +1015,29 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { } private Entity copy(net.minecraft.world.level.Level level) { - CompoundTag compoundTag = new CompoundTag(); - this.getHandle().saveAsPassenger(compoundTag, false, true, true); + final TagValueOutput output = TagValueOutput.createDiscardingWithContext(level.registryAccess()); + this.getHandle().saveAsPassenger(output, false, true, true); - return net.minecraft.world.entity.EntityType.loadEntityRecursive(compoundTag, level, EntitySpawnReason.LOAD, java.util.function.Function.identity()); + return net.minecraft.world.entity.EntityType.loadEntityRecursive(output.buildResult(), level, EntitySpawnReason.LOAD, java.util.function.Function.identity()); } - public void storeBukkitValues(CompoundTag c) { + public void storeBukkitValues(ValueOutput c) { if (!this.persistentDataContainer.isEmpty()) { - c.put("BukkitValues", this.persistentDataContainer.toTagCompound()); + c.store("BukkitValues", CompoundTag.CODEC, this.persistentDataContainer.toTagCompound()); } } - public void readBukkitValues(CompoundTag c) { - Tag base = c.get("BukkitValues"); - if (base instanceof CompoundTag) { - this.persistentDataContainer.putAll((CompoundTag) base); - } + public void readBukkitValues(ValueInput c) { + c.read("BukkitValues", CompoundTag.CODEC).ifPresent(this.persistentDataContainer::putAll); } protected CompoundTag save() { - CompoundTag tag = new CompoundTag(); + final TagValueOutput tagValueOutput = TagValueOutput.createDiscardingWithContext(this.getHandle().registryAccess()); - tag.putString(Entity.ID_TAG, this.getHandle().getEncodeId()); // todo NPE? - this.getHandle().saveWithoutId(tag); + tagValueOutput.putString(Entity.TAG_ID, this.getHandle().getEncodeId()); // todo NPE? + this.getHandle().saveWithoutId(tagValueOutput); - return tag; + return tagValueOutput.buildResult(); } // re-sends the spawn entity packet to updated values which cannot be updated otherwise diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityFactory.java b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityFactory.java index 2575f068dc..36b8abb8e6 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityFactory.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityFactory.java @@ -5,6 +5,7 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.TagParser; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.storage.TagValueInput; import org.bukkit.entity.EntityFactory; import org.bukkit.entity.EntitySnapshot; @@ -30,7 +31,7 @@ public class CraftEntityFactory implements EntityFactory { throw new IllegalArgumentException("Could not parse Entity: " + input, e); } - EntityType type = EntityType.by(tag).orElse(null); + EntityType type = EntityType.by(TagValueInput.createGlobalDiscarding(tag)).orElse(null); if (type == null) { throw new IllegalArgumentException("Could not parse Entity: " + input); } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java index 5dc0895627..2af88d1888 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -106,6 +106,7 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.ServerGamePacketListenerImpl; import net.minecraft.server.players.UserWhiteListEntry; import net.minecraft.sounds.SoundEvent; +import net.minecraft.util.ProblemReporter; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.ai.attributes.AttributeInstance; import net.minecraft.world.entity.ai.attributes.Attributes; @@ -1532,7 +1533,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @Override public void loadData() { - this.server.getHandle().playerIo.load(this.getHandle()); + this.server.getHandle().playerIo.load(this.getHandle(), ProblemReporter.DISCARDING); } @Override diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/generator/CraftLimitedRegion.java b/paper-server/src/main/java/org/bukkit/craftbukkit/generator/CraftLimitedRegion.java index 3d3bf355b0..4306ec7a93 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/generator/CraftLimitedRegion.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/generator/CraftLimitedRegion.java @@ -17,6 +17,7 @@ import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.ProtoChunk; import net.minecraft.world.level.chunk.status.ChunkStatus; +import net.minecraft.world.level.storage.TagValueInput; import org.bukkit.HeightMap; import org.bukkit.Location; import org.bukkit.Material; @@ -271,7 +272,9 @@ public class CraftLimitedRegion extends CraftRegionAccessor implements LimitedRe if (!state.getBlockData().matches(getHandle().getBlockState(pos).createCraftBlockData())) { throw new IllegalArgumentException("BlockData does not match! Expected " + state.getBlockData().getAsString(false) + ", got " + getHandle().getBlockState(pos).createCraftBlockData().getAsString(false)); } - getHandle().getBlockEntity(pos).loadWithComponents(((org.bukkit.craftbukkit.block.CraftBlockEntityState) state).getSnapshotNBT(), this.getHandle().registryAccess()); + getHandle().getBlockEntity(pos).loadWithComponents(TagValueInput.createDiscarding( + this.getHandle().registryAccess(), ((org.bukkit.craftbukkit.block.CraftBlockEntityState) state).getSnapshotNBT() + )); } @Override diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBlockState.java b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBlockState.java index 3b693cd8b1..c64422ae1c 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBlockState.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBlockState.java @@ -17,8 +17,10 @@ import net.minecraft.core.component.TypedDataComponent; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.Tag; +import net.minecraft.server.MinecraftServer; import net.minecraft.world.item.component.CustomData; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.storage.TagValueOutput; import org.bukkit.DyeColor; import org.bukkit.Material; import org.bukkit.block.BlockState; @@ -144,12 +146,13 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta final BlockVector legacyPosition = SerializableMeta.getObject(BlockVector.class, map, "blockPosition", true); if (legacyPosition != null) { this.blockEntityTag = this.blockEntityTag.update(blockEntityTag -> { + final TagValueOutput output = TagValueOutput.createDiscardingWithContext(blockEntityTag, CraftRegistry.getMinecraftRegistry()); if (blockEntityTag.isEmpty()) { - BlockEntity.addEntityType(blockEntityTag, java.util.Objects.requireNonNull(CraftBlockStates.getBlockEntityType(this.materialForBlockEntityType()))); + BlockEntity.addEntityType(output, java.util.Objects.requireNonNull(CraftBlockStates.getBlockEntityType(this.materialForBlockEntityType()))); } - blockEntityTag.putInt("x", legacyPosition.getBlockX()); - blockEntityTag.putInt("y", legacyPosition.getBlockY()); - blockEntityTag.putInt("z", legacyPosition.getBlockZ()); + output.putInt("x", legacyPosition.getBlockX()); + output.putInt("y", legacyPosition.getBlockY()); + output.putInt("z", legacyPosition.getBlockZ()); }); } // Paper end - general item meta fixes - parse spigot legacy position and merge into block entity tag @@ -164,7 +167,7 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta final CompoundTag nbt = this.blockEntityTag.copyTag(); if (!nbt.isEmpty()) { if (nbt.getString("id").isEmpty()) { - BlockEntity.addEntityType(nbt, java.util.Objects.requireNonNull(CraftBlockStates.getBlockEntityType(this.materialForBlockEntityType()))); + BlockEntity.addEntityType(TagValueOutput.createDiscardingWithContext(nbt, CraftRegistry.getMinecraftRegistry()), java.util.Objects.requireNonNull(CraftBlockStates.getBlockEntityType(this.materialForBlockEntityType()))); } tag.put(CraftMetaBlockState.BLOCK_ENTITY_TAG, CustomData.of(nbt)); } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/paper-server/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java index a287ad5cce..5508b1a4ec 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java @@ -50,6 +50,7 @@ import net.minecraft.world.item.alchemy.Potion; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.storage.LevelResource; +import net.minecraft.world.level.storage.TagValueOutput; import org.bukkit.Bukkit; import org.bukkit.Keyed; import org.bukkit.Material; @@ -280,7 +281,7 @@ public final class CraftMagicNumbers implements UnsafeValues { @Override public int getDataVersion() { - return SharedConstants.getCurrentVersion().getDataVersion().getVersion(); + return SharedConstants.getCurrentVersion().dataVersion().getVersion(); } @Override @@ -492,8 +493,14 @@ public final class CraftMagicNumbers implements UnsafeValues { public byte[] serializeItem(ItemStack item) { Preconditions.checkNotNull(item, "null cannot be serialized"); Preconditions.checkArgument(item.getType() != Material.AIR, "air cannot be serialized"); + Preconditions.checkArgument(!item.isEmpty(), "Empty itemstack cannot be serialised"); - return serializeNbtToBytes((CompoundTag) (item instanceof CraftItemStack ? ((CraftItemStack) item).handle : CraftItemStack.asNMSCopy(item)).save(MinecraftServer.getServer().registryAccess())); + return serializeNbtToBytes( + (CompoundTag) net.minecraft.world.item.ItemStack.CODEC.encodeStart( + MinecraftServer.getServer().registryAccess().createSerializationContext(NbtOps.INSTANCE), + CraftItemStack.unwrap(item) + ).getOrThrow() + ); } @Override @@ -511,7 +518,9 @@ public final class CraftMagicNumbers implements UnsafeValues { if (compound.getStringOr("id", "minecraft:air").equals("minecraft:air")) { return CraftItemStack.asCraftMirror(net.minecraft.world.item.ItemStack.EMPTY); } - return CraftItemStack.asCraftMirror(net.minecraft.world.item.ItemStack.parse(CraftRegistry.getMinecraftRegistry(), compound).orElseThrow()); + return CraftItemStack.asCraftMirror(net.minecraft.world.item.ItemStack.CODEC.parse( + MinecraftServer.getServer().registryAccess().createSerializationContext(NbtOps.INSTANCE), compound + ).getOrThrow()); } @Override @@ -519,7 +528,10 @@ public final class CraftMagicNumbers implements UnsafeValues { if (itemStack.isEmpty()) { return Map.of("id", "minecraft:air", SharedConstants.DATA_VERSION_TAG, this.getDataVersion(), "schema_version", 1); } - final CompoundTag tag = CraftItemStack.asNMSCopy(itemStack).save(CraftRegistry.getMinecraftRegistry()).asCompound().orElseThrow(); + final CompoundTag tag = (CompoundTag) net.minecraft.world.item.ItemStack.CODEC.encodeStart( + CraftRegistry.getMinecraftRegistry().createSerializationContext(NbtOps.INSTANCE), + CraftItemStack.asNMSCopy(itemStack) + ).getOrThrow(); NbtUtils.addCurrentDataVersion(tag); final Map ret = new LinkedHashMap<>(); @@ -677,21 +689,21 @@ public final class CraftMagicNumbers implements UnsafeValues { } }); - CompoundTag compound = new CompoundTag(); + final TagValueOutput output = TagValueOutput.createDiscardingWithContext(nmsEntity.registryAccess()); if (serializePassangers) { - if (!nmsEntity.saveAsPassenger(compound, true, includeNonSaveable, forceSerialization)) { + if (!nmsEntity.saveAsPassenger(output, true, includeNonSaveable, forceSerialization)) { throw new IllegalArgumentException("Couldn't serialize entity"); } } else { List pass = new ArrayList<>(nmsEntity.getPassengers()); nmsEntity.passengers = com.google.common.collect.ImmutableList.of(); - boolean serialized = nmsEntity.saveAsPassenger(compound, true, includeNonSaveable, forceSerialization); + boolean serialized = nmsEntity.saveAsPassenger(output, true, includeNonSaveable, forceSerialization); nmsEntity.passengers = com.google.common.collect.ImmutableList.copyOf(pass); if (!serialized) { throw new IllegalArgumentException("Couldn't serialize entity"); } } - return serializeNbtToBytes(compound); + return serializeNbtToBytes(output.buildResult()); } @Override @@ -768,7 +780,7 @@ public final class CraftMagicNumbers implements UnsafeValues { @Override public int getProtocolVersion() { - return net.minecraft.SharedConstants.getCurrentVersion().getProtocolVersion(); + return net.minecraft.SharedConstants.getCurrentVersion().protocolVersion(); } @Override diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/util/TransformerGeneratorAccess.java b/paper-server/src/main/java/org/bukkit/craftbukkit/util/TransformerGeneratorAccess.java index d62940ba24..e06737b180 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/util/TransformerGeneratorAccess.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/util/TransformerGeneratorAccess.java @@ -7,6 +7,7 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.structure.StructurePiece; import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.storage.TagValueInput; import org.bukkit.craftbukkit.block.CraftBlockEntityState; import org.bukkit.craftbukkit.block.CraftBlockState; import org.bukkit.craftbukkit.block.CraftBlockStates; @@ -60,7 +61,9 @@ public class TransformerGeneratorAccess extends DelegatedGeneratorAccess { } BlockEntity blockEntity = this.getBlockEntity(position); if (blockEntity != null && craftBlockState instanceof CraftBlockEntityState craftEntityState) { - blockEntity.loadWithComponents(craftEntityState.getSnapshotNBT(), this.registryAccess()); + blockEntity.loadWithComponents(TagValueInput.createDiscarding( + this.registryAccess(), craftEntityState.getSnapshotNBT() + )); } return result; }