PaperMC/Spigot-Server-Patches/0295-Prevent-chunk-loading-from-Fluid-Flowing.patch
Aikar e4d10a6d67
Updated Upstream (Bukkit/CraftBukkit)
Upstream has released updates that appears 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:
122289ff Add FaceAttachable interface to handle Grindstone facing in common with Switches
a6db750e SPIGOT-5647: ZombieVillager entity should have getVillagerType()

CraftBukkit Changes:
bbe3d58e SPIGOT-5650: Lectern.setPage(int) causes a NullPointerException
3075579f Add FaceAttachable interface to handle Grindstone facing in common with Switches
95bd4238 SPIGOT-5647: ZombieVillager entity should have getVillagerType()
4d975ac3 SPIGOT-5617: setBlockData does not work when NotPlayEvent is called by redstone current
2020-04-02 17:09:17 -04:00

78 lines
4.3 KiB
Diff

From 9c33f37c35626da82ad4810afee694f7a6512d81 Mon Sep 17 00:00:00 2001
From: Aikar <aikar@aikar.co>
Date: Mon, 10 Sep 2018 23:36:16 -0400
Subject: [PATCH] Prevent chunk loading from Fluid Flowing
diff --git a/src/main/java/net/minecraft/server/FluidTypeFlowing.java b/src/main/java/net/minecraft/server/FluidTypeFlowing.java
index 3099a5e654..376dca1889 100644
--- a/src/main/java/net/minecraft/server/FluidTypeFlowing.java
+++ b/src/main/java/net/minecraft/server/FluidTypeFlowing.java
@@ -178,7 +178,8 @@ public abstract class FluidTypeFlowing extends FluidType {
EnumDirection enumdirection = (EnumDirection) entry.getKey();
Fluid fluid1 = (Fluid) entry.getValue();
BlockPosition blockposition1 = blockposition.shift(enumdirection);
- IBlockData iblockdata1 = generatoraccess.getType(blockposition1);
+ IBlockData iblockdata1 = generatoraccess.getTypeIfLoaded(blockposition1); // Paper
+ if (iblockdata1 == null) continue; // Paper
if (this.a(generatoraccess, blockposition, iblockdata, enumdirection, blockposition1, iblockdata1, generatoraccess.getFluid(blockposition1), fluid1.getType())) {
// CraftBukkit start
@@ -205,7 +206,8 @@ public abstract class FluidTypeFlowing extends FluidType {
while (iterator.hasNext()) {
EnumDirection enumdirection = (EnumDirection) iterator.next();
BlockPosition blockposition1 = blockposition.shift(enumdirection);
- IBlockData iblockdata1 = iworldreader.getType(blockposition1);
+ IBlockData iblockdata1 = iworldreader.getTypeIfLoaded(blockposition1); // Paper
+ if (iblockdata1 == null) continue; // Paper
Fluid fluid = iblockdata1.getFluid();
if (fluid.getType().a((FluidType) this) && this.a(enumdirection, (IBlockAccess) iworldreader, blockposition, iblockdata, blockposition1, iblockdata1)) {
@@ -322,11 +324,18 @@ public abstract class FluidTypeFlowing extends FluidType {
if (enumdirection1 != enumdirection) {
BlockPosition blockposition2 = blockposition.shift(enumdirection1);
short short0 = a(blockposition1, blockposition2);
- Pair<IBlockData, Fluid> pair = (Pair) short2objectmap.computeIfAbsent(short0, (k) -> {
- IBlockData iblockdata1 = iworldreader.getType(blockposition2);
+ // Paper start - avoid loading chunks
+ Pair<IBlockData, Fluid> pair = short2objectmap.get(short0);
+ if (pair == null) {
+ IBlockData iblockdatax = iworldreader.getTypeIfLoaded(blockposition2);
+ if (iblockdatax == null) {
+ continue;
+ }
- return Pair.of(iblockdata1, iblockdata1.getFluid());
- });
+ pair = Pair.of(iblockdatax, iblockdatax.getFluid());
+ short2objectmap.put(short0, pair);
+ }
+ // Paper end
IBlockData iblockdata1 = (IBlockData) pair.getFirst();
Fluid fluid = (Fluid) pair.getSecond();
@@ -398,11 +407,16 @@ public abstract class FluidTypeFlowing extends FluidType {
EnumDirection enumdirection = (EnumDirection) iterator.next();
BlockPosition blockposition1 = blockposition.shift(enumdirection);
short short0 = a(blockposition, blockposition1);
- Pair<IBlockData, Fluid> pair = (Pair) short2objectmap.computeIfAbsent(short0, (j) -> {
- IBlockData iblockdata1 = iworldreader.getType(blockposition1);
-
- return Pair.of(iblockdata1, iblockdata1.getFluid());
- });
+ // Paper start
+ Pair pair = (Pair) short2objectmap.get(short0);
+ if (pair == null) {
+ IBlockData iblockdatax = iworldreader.getTypeIfLoaded(blockposition1);
+ if (iblockdatax == null) continue;
+
+ pair = Pair.of(iblockdatax, iblockdatax.getFluid());
+ short2objectmap.put(short0, pair);
+ }
+ // Paper end
IBlockData iblockdata1 = (IBlockData) pair.getFirst();
Fluid fluid = (Fluid) pair.getSecond();
Fluid fluid1 = this.a(iworldreader, blockposition1, iblockdata1);
--
2.25.1