mirror of
https://github.com/PaperMC/Paper.git
synced 2025-01-05 02:22:12 +01:00
d8e07590e3
Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: 5dbedae1 PR-864: Fix Registry#match() failing namespaced inputs 49256865 PR-863: Fix boolean PersistentDataType 9f15450b SPIGOT-7195, SPIGOT-7197: Add DataPack API ebef5b6a Disable InterfaceIsType Checkstyle check 01d577f5 Slight tweak to boolean PersistentDataType javadoc d2b99e56 PR-857: Add boolean PersistentDataType CraftBukkit Changes: 2270366cd PR-1196: Test Registry instances more thoroughly 863dacb7a PR-1191: Do not start on pre-release Java 17 1f2dd8e12 SPIGOT-7362: Properly handle null in CraftBlock#blockFaceToNotch() dbc70bed5 SPIGOT-7195, SPIGOT-7197: Add DataPack API
80 lines
4.7 KiB
Diff
80 lines
4.7 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Mariell Hoversholm <proximyst@proximyst.com>
|
|
Date: Sun, 24 Oct 2021 16:20:31 -0400
|
|
Subject: [PATCH] Add Raw Byte Entity Serialization
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
|
|
index d2f93f6cf5ff5a0ee5de18d4e593c1423e191d14..c79f7de53d8d61044a756b2a973f71bb5af74bfc 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/Entity.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
|
|
@@ -2019,6 +2019,15 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
|
|
}
|
|
}
|
|
|
|
+ // Paper start - Entity serialization api
|
|
+ public boolean serializeEntity(CompoundTag compound) {
|
|
+ List<Entity> pass = new java.util.ArrayList<>(this.getPassengers());
|
|
+ this.passengers = ImmutableList.of();
|
|
+ boolean result = save(compound);
|
|
+ this.passengers = ImmutableList.copyOf(pass);
|
|
+ return result;
|
|
+ }
|
|
+ // Paper end
|
|
public boolean save(CompoundTag nbt) {
|
|
return this.isPassenger() ? false : this.saveAsPassenger(nbt);
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
|
|
index f5b199b3cdccbe7d8a3331555469c622c853fd03..b1a578f23a21303f79f443107e7a9bea903310f4 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
|
|
@@ -1367,5 +1367,15 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
|
|
}
|
|
return set;
|
|
}
|
|
+
|
|
+ @Override
|
|
+ public boolean spawnAt(Location location, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason reason) {
|
|
+ Preconditions.checkNotNull(location, "location cannot be null");
|
|
+ Preconditions.checkNotNull(reason, "reason cannot be null");
|
|
+ entity.level = ((CraftWorld) location.getWorld()).getHandle();
|
|
+ entity.setPos(location.getX(), location.getY(), location.getZ());
|
|
+ entity.setRot(location.getYaw(), location.getPitch());
|
|
+ return !entity.valid && entity.level.addFreshEntity(entity, reason);
|
|
+ }
|
|
// Paper end
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
|
|
index c47821a81b9367e1c59d8428384bfd4752d0303e..707f50536a3915a68ee8ac09a74ecfebbd5a94dd 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
|
|
@@ -493,6 +493,29 @@ public final class CraftMagicNumbers implements UnsafeValues {
|
|
return CraftItemStack.asCraftMirror(net.minecraft.world.item.ItemStack.of(ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.ITEM_STACK, compound, dataVersion, getDataVersion())));
|
|
}
|
|
|
|
+ @Override
|
|
+ public byte[] serializeEntity(org.bukkit.entity.Entity entity) {
|
|
+ Preconditions.checkNotNull(entity, "null cannot be serialized");
|
|
+ Preconditions.checkArgument(entity instanceof org.bukkit.craftbukkit.entity.CraftEntity, "only CraftEntities can be serialized");
|
|
+
|
|
+ CompoundTag compound = new CompoundTag();
|
|
+ ((org.bukkit.craftbukkit.entity.CraftEntity) entity).getHandle().serializeEntity(compound);
|
|
+ return serializeNbtToBytes(compound);
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public org.bukkit.entity.Entity deserializeEntity(byte[] data, org.bukkit.World world, boolean preserveUUID) {
|
|
+ Preconditions.checkNotNull(data, "null cannot be deserialized");
|
|
+ Preconditions.checkArgument(data.length > 0, "cannot deserialize nothing");
|
|
+
|
|
+ CompoundTag compound = deserializeNbtFromBytes(data);
|
|
+ int dataVersion = compound.getInt("DataVersion");
|
|
+ compound = ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.ENTITY, compound, dataVersion, getDataVersion());
|
|
+ if (!preserveUUID) compound.remove("UUID"); // Generate a new UUID so we don't have to worry about deserializing the same entity twice
|
|
+ return net.minecraft.world.entity.EntityType.create(compound, ((org.bukkit.craftbukkit.CraftWorld) world).getHandle())
|
|
+ .orElseThrow(() -> new IllegalArgumentException("An ID was not found for the data. Did you downgrade?")).getBukkitEntity();
|
|
+ }
|
|
+
|
|
private byte[] serializeNbtToBytes(CompoundTag compound) {
|
|
compound.putInt("DataVersion", getDataVersion());
|
|
java.io.ByteArrayOutputStream outputStream = new java.io.ByteArrayOutputStream();
|