Paper/Spigot-Server-Patches/0306-Prevent-chunk-loading-from-Fluid-Flowing.patch
Spottedleaf 89a1469d3f Resolve memory leak involving TileEntities
Their chunk is set to null before removal, so we kept them around.
2019-05-14 17:19:58 -05:00

80 lines
4.3 KiB
Diff

From 2cededad82edc0d12c8b78ddd01dde479630f6ad 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 c76fa0b4bf..5f15143603 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.p();
if (fluid.getType().a((FluidType) this) && this.a(enumdirection, (IBlockAccess) iworldreader, blockposition, iblockdata, blockposition1, iblockdata1)) {
@@ -322,11 +324,19 @@ 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.p());
- });
+ pair = Pair.of(iblockdatax, iblockdatax.p());
+ short2objectmap.put(short0, pair);
+
+ }
+ // Paper end
IBlockData iblockdata1 = (IBlockData) pair.getFirst();
Fluid fluid = (Fluid) pair.getSecond();
@@ -398,11 +408,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.p());
- });
+ // 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.p());
+ short2objectmap.put(short0, pair);
+ }
+ // Paper end
IBlockData iblockdata1 = (IBlockData) pair.getFirst();
Fluid fluid = (Fluid) pair.getSecond();
Fluid fluid1 = this.a(iworldreader, blockposition1, iblockdata1);
--
2.21.0