mirror of
https://github.com/PaperMC/Paper.git
synced 2025-07-26 09:42:06 -07:00
Some initial adoption of ValueInput/Output
This commit is contained in:
@@ -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
|
||||
|
@@ -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);
|
||||
|
@@ -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) {
|
||||
|
@@ -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
|
||||
|
@@ -71,7 +71,7 @@
|
||||
+ // Paper end
|
||||
}
|
||||
|
||||
private void saveId(ValueOutput output) {
|
||||
public void saveId(ValueOutput output) {
|
||||
@@ -287,6 +_,12 @@
|
||||
}
|
||||
|
||||
|
@@ -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<LivingEntity> entityReference = updateDestroyTarget(blockEntity.destroyTarget, level, pos, canDestroy);
|
||||
LivingEntity livingEntity = EntityReference.get(entityReference, level, LivingEntity.class);
|
||||
|
@@ -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
|
||||
+
|
||||
|
@@ -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;
|
||||
+ }
|
||||
|
@@ -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());
|
||||
}
|
@@ -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<T extends BlockEntity> 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<T extends BlockEntity> 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
|
||||
|
||||
|
@@ -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<ConduitBlockEntity> impl
|
||||
return false;
|
||||
}
|
||||
|
||||
net.minecraft.world.entity.LivingEntity currentTarget = conduit.destroyTarget;
|
||||
EntityReference<net.minecraft.world.entity.LivingEntity> currentTarget = conduit.destroyTarget;
|
||||
|
||||
if (target == null) {
|
||||
if (currentTarget == null) {
|
||||
@@ -91,17 +93,22 @@ public class CraftConduit extends CraftBlockEntityState<ConduitBlockEntity> 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<ConduitBlockEntity> impl
|
||||
return null;
|
||||
}
|
||||
|
||||
net.minecraft.world.entity.LivingEntity nmsEntity = conduit.destroyTarget;
|
||||
return (nmsEntity != null) ? (LivingEntity) nmsEntity.getBukkitEntity() : null;
|
||||
final EntityReference<net.minecraft.world.entity.LivingEntity> 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
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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));
|
||||
}
|
||||
|
@@ -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<String, Object> 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<net.minecraft.world.entity.Entity> 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
|
||||
|
@@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user