mirror of
https://github.com/PaperMC/Paper.git
synced 2024-09-12 06:58:11 +02:00
This enables us a fast reference to the entities current chunk instead of having to look it up by hashmap lookups. We also store counts by type to further enable other performance optimizations in later patches.
114 lines
5.3 KiB
Diff
114 lines
5.3 KiB
Diff
From 4b300fd41621071f122933ad9400521cb46228a0 Mon Sep 17 00:00:00 2001
|
|
From: Byteflux <byte@byteflux.net>
|
|
Date: Wed, 2 Mar 2016 12:20:52 -0600
|
|
Subject: [PATCH] Fast draining
|
|
|
|
|
|
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
|
index 15675efbf..dbd82d5a9 100644
|
|
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
|
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
|
@@ -183,4 +183,11 @@ public class PaperWorldConfig {
|
|
optimizeExplosions = getBoolean("optimize-explosions", false);
|
|
log("Optimize explosions: " + optimizeExplosions);
|
|
}
|
|
+
|
|
+ public boolean fastDrainLava;
|
|
+ public boolean fastDrainWater;
|
|
+ private void fastDrain() {
|
|
+ fastDrainLava = getBoolean("fast-drain.lava", false);
|
|
+ fastDrainWater = getBoolean("fast-drain.water", false);
|
|
+ }
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/server/BlockFlowing.java b/src/main/java/net/minecraft/server/BlockFlowing.java
|
|
index 3b47253a4..3aaa19b2f 100644
|
|
--- a/src/main/java/net/minecraft/server/BlockFlowing.java
|
|
+++ b/src/main/java/net/minecraft/server/BlockFlowing.java
|
|
@@ -69,7 +69,7 @@ public class BlockFlowing extends BlockFluids {
|
|
}
|
|
}
|
|
|
|
- if (this.material == Material.LAVA && i < 8 && i1 < 8 && i1 > i && random.nextInt(4) != 0) {
|
|
+ if (!world.paperConfig.fastDrainLava && this.material == Material.LAVA && i < 8 && i1 < 8 && i1 > i && random.nextInt(4) != 0) { // Paper
|
|
j *= 4;
|
|
}
|
|
|
|
@@ -77,7 +77,7 @@ public class BlockFlowing extends BlockFluids {
|
|
this.f(world, blockposition, iblockdata);
|
|
} else {
|
|
i = i1;
|
|
- if (i1 < 0) {
|
|
+ if (i1 < 0 || canFastDrain(world, blockposition)) { // Paper - Fast draining
|
|
world.setAir(blockposition);
|
|
} else {
|
|
iblockdata = iblockdata.set(BlockFlowing.LEVEL, Integer.valueOf(i1));
|
|
@@ -267,6 +267,7 @@ public class BlockFlowing extends BlockFluids {
|
|
|
|
}
|
|
|
|
+ // Paper start
|
|
/**
|
|
* Paper - Get flow speed. Throttle if its water and flowing adjacent to lava
|
|
*/
|
|
@@ -280,4 +281,57 @@ public class BlockFlowing extends BlockFluids {
|
|
}
|
|
return super.a(world);
|
|
}
|
|
+
|
|
+ private int getFluidLevel(IBlockAccess iblockaccess, BlockPosition blockposition) {
|
|
+ return iblockaccess.getType(blockposition).getMaterial() == this.material ? iblockaccess.getType(blockposition).get(BlockFluids.LEVEL) : -1;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Paper - Data check method for fast draining
|
|
+ */
|
|
+ public int getData(World world, BlockPosition position) {
|
|
+ int data = this.getFluidLevel((IBlockAccess) world, position);
|
|
+ return data < 8 ? data : 0;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Paper - Checks surrounding blocks to determine if block can be fast drained
|
|
+ */
|
|
+ public boolean canFastDrain(World world, BlockPosition position) {
|
|
+ boolean result = false;
|
|
+ int data = getData(world, position);
|
|
+ if (this.material == Material.WATER) {
|
|
+ if (world.paperConfig.fastDrainWater) {
|
|
+ result = true;
|
|
+ if (getData(world, position.down()) < 0) {
|
|
+ result = false;
|
|
+ } else if (world.getType(position.north()).getBlock().getBlockData().getMaterial() == Material.WATER && getData(world, position.north()) < data) {
|
|
+ result = false;
|
|
+ } else if (world.getType(position.south()).getBlock().getBlockData().getMaterial() == Material.WATER && getData(world, position.south()) < data) {
|
|
+ result = false;
|
|
+ } else if (world.getType(position.west()).getBlock().getBlockData().getMaterial() == Material.WATER && getData(world, position.west()) < data) {
|
|
+ result = false;
|
|
+ } else if (world.getType(position.east()).getBlock().getBlockData().getMaterial() == Material.WATER && getData(world, position.east()) < data) {
|
|
+ result = false;
|
|
+ }
|
|
+ }
|
|
+ } else if (this.material == Material.LAVA) {
|
|
+ if (world.paperConfig.fastDrainLava) {
|
|
+ result = true;
|
|
+ if (getData(world, position.down()) < 0 || world.getType(position.up()).getBlock().getBlockData().getMaterial() != Material.AIR) {
|
|
+ result = false;
|
|
+ } else if (world.getType(position.north()).getBlock().getBlockData().getMaterial() == Material.LAVA && getData(world, position.north()) < data) {
|
|
+ result = false;
|
|
+ } else if (world.getType(position.south()).getBlock().getBlockData().getMaterial() == Material.LAVA && getData(world, position.south()) < data) {
|
|
+ result = false;
|
|
+ } else if (world.getType(position.west()).getBlock().getBlockData().getMaterial() == Material.LAVA && getData(world, position.west()) < data) {
|
|
+ result = false;
|
|
+ } else if (world.getType(position.east()).getBlock().getBlockData().getMaterial() == Material.LAVA && getData(world, position.east()) < data) {
|
|
+ result = false;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ return result;
|
|
+ }
|
|
+ // Paper end
|
|
}
|
|
--
|
|
2.18.0
|
|
|