PaperMC/Spigot-Server-Patches/0371-MC-134115-Fix-Double-Chest-Conversion-Error.patch
Aikar 459987d69f
More improvements to activation range, improve turtles
improved the water code so that immunity wont trigger if the entity
has the water pathfinder system active, so this improves support
for all entities that know how to behave in water.

Merged 2 EAR patches together, and removed an MCUtil method that
doesnt have a purpose anymore
2018-10-04 23:18:46 -04:00

67 lines
3.6 KiB
Diff

From 2c5daacb9fc24c9a32b96d1e1d1201b6f04b5d01 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 f81985a847..9162151e2a 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