68 lines
3.6 KiB
Diff
68 lines
3.6 KiB
Diff
From 87788b37febf210a1c7e65dfee02385c878e80cb Mon Sep 17 00:00:00 2001
|
|
From: Aikar <aikar@aikar.co>
|
|
Date: Thu, 20 Sep 2018 19:11:33 -0400
|
|
Subject: [PATCH] MC-134115: Fix Double Chest Conversion Error
|
|
|
|
A bug with double chest conversion would lead to data
|
|
loss from chunks if they crossed chunk boundries.
|
|
|
|
This fixes the issue.
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
|
|
index 4f72b1b184..1c4e892aad 100644
|
|
--- a/src/main/java/net/minecraft/server/Chunk.java
|
|
+++ b/src/main/java/net/minecraft/server/Chunk.java
|
|
@@ -515,6 +515,26 @@ public class Chunk implements IChunkAccess {
|
|
return this.a(blockposition, iblockdata, flag, true);
|
|
}
|
|
|
|
+ // Paper start
|
|
+ public void setTypeDirect(BlockPosition blockposition, IBlockData iblockdata) {
|
|
+ int i = blockposition.getX() & 15;
|
|
+ int j = blockposition.getY();
|
|
+ int k = blockposition.getZ() & 15;
|
|
+ ChunkSection section = this.sections[j >> 4];
|
|
+
|
|
+ if (section == Chunk.EMPTY_CHUNK_SECTION) {
|
|
+ if (iblockdata.isAir()) {
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ section = new ChunkSection(j >> 4 << 4, this.world.worldProvider.g(), this, this.world, true); // Paper - Anti-Xray
|
|
+ this.sections[j >> 4] = section;
|
|
+ }
|
|
+
|
|
+ section.setType(i, j & 15, k, iblockdata);
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
@Nullable
|
|
public IBlockData a(BlockPosition blockposition, IBlockData iblockdata, boolean flag, boolean doPlace) {
|
|
// CraftBukkit end
|
|
diff --git a/src/main/java/net/minecraft/server/ChunkConverter.java b/src/main/java/net/minecraft/server/ChunkConverter.java
|
|
index 65b2654de8..70c60d54e7 100644
|
|
--- a/src/main/java/net/minecraft/server/ChunkConverter.java
|
|
+++ b/src/main/java/net/minecraft/server/ChunkConverter.java
|
|
@@ -198,10 +198,15 @@ public class ChunkConverter {
|
|
EnumDirection enumdirection1 = (EnumDirection)iblockdata.get(BlockChest.FACING);
|
|
if (enumdirection.k() != enumdirection1.k() && enumdirection1 == iblockdata1.get(BlockChest.FACING)) {
|
|
BlockPropertyChestType blockpropertychesttype = enumdirection == enumdirection1.e() ? BlockPropertyChestType.LEFT : BlockPropertyChestType.RIGHT;
|
|
- generatoraccess.setTypeAndData(blockposition1, (IBlockData)iblockdata1.set(BlockChest.b, blockpropertychesttype.a()), 18);
|
|
+ // Paper start
|
|
+ Chunk chunk = ((World) generatoraccess.getMinecraftWorld()).getChunkAtWorldCoords(blockposition);
|
|
+ Chunk chunk1 = ((World) generatoraccess.getMinecraftWorld()).getChunkAtWorldCoords(blockposition1);
|
|
+ chunk1.setTypeDirect(blockposition1, (IBlockData)iblockdata1.set(BlockChest.b, blockpropertychesttype.a()));
|
|
+
|
|
if (enumdirection1 == EnumDirection.NORTH || enumdirection1 == EnumDirection.EAST) {
|
|
- TileEntity tileentity = generatoraccess.getTileEntity(blockposition);
|
|
- TileEntity tileentity1 = generatoraccess.getTileEntity(blockposition1);
|
|
+ TileEntity tileentity = chunk.getTileEntity(blockposition);
|
|
+ TileEntity tileentity1 = chunk1.getTileEntity(blockposition1);
|
|
+ // Paper end
|
|
if (tileentity instanceof TileEntityChest && tileentity1 instanceof TileEntityChest) {
|
|
TileEntityChest.a((TileEntityChest)tileentity, (TileEntityChest)tileentity1);
|
|
}
|
|
--
|
|
2.19.0
|
|
|