geforkt von Mirrors/Paper
459987d69f
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
68 Zeilen
3.6 KiB
Diff
68 Zeilen
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
|
|
|