Mirror von
https://github.com/PaperMC/Paper.git
synchronisiert 2024-12-18 04:20:08 +01:00
7e59b6e18e
Upon "real world testing", there was needed and unimplemented methods on BlockStateListPopulator; This commit (which should fix #1663) aims to improve the coverage of this class. We should aim to look into expanding this class down the line, or aim to improve the servers ability to capture these changes
135 Zeilen
5.1 KiB
Diff
135 Zeilen
5.1 KiB
Diff
From 3c048e89df0608e4a5187df2ddc1c36956b11df5 Mon Sep 17 00:00:00 2001
|
|
From: Shane Freeder <theboyetronic@gmail.com>
|
|
Date: Thu, 8 Nov 2018 04:53:00 +0000
|
|
Subject: [PATCH] Extend BlockStateListPopulator
|
|
|
|
extends BlockStateListPopulator to suppport checking block types in the
|
|
physical world it's representing, allowing for blocks making modifications
|
|
to the world to maintain proper state.
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/BlockSponge.java b/src/main/java/net/minecraft/server/BlockSponge.java
|
|
index 987af9c3de..6e52d46952 100644
|
|
--- a/src/main/java/net/minecraft/server/BlockSponge.java
|
|
+++ b/src/main/java/net/minecraft/server/BlockSponge.java
|
|
@@ -68,7 +68,7 @@ public class BlockSponge extends Block {
|
|
linkedlist.add(new Tuple(blockposition2, Integer.valueOf(j + 1)));
|
|
}
|
|
} else if (material == Material.WATER_PLANT || material == Material.REPLACEABLE_WATER_PLANT) {
|
|
- // iblockdata.a(world, blockposition2, 0);
|
|
+ iblockdata.a(blockList, blockposition2, 0); // Paper
|
|
blockList.setTypeAndData(blockposition2, Blocks.AIR.getBlockData(), 3); // CraftBukkit
|
|
++i;
|
|
if (j < 6) {
|
|
@@ -96,12 +96,14 @@ public class BlockSponge extends Block {
|
|
|
|
for (CraftBlockState block : blocks) {
|
|
BlockPosition blockposition2 = new BlockPosition(block.getX(), block.getY(), block.getZ());
|
|
+ /* // Paper start
|
|
IBlockData iblockdata = world.getType(blockposition2);
|
|
Material material = iblockdata.getMaterial();
|
|
|
|
if (material == Material.WATER_PLANT || material == Material.REPLACEABLE_WATER_PLANT) {
|
|
iblockdata.a(world, blockposition2, 0);
|
|
}
|
|
+ */ // Paper end
|
|
|
|
world.setTypeAndData(blockposition2, block.getHandle(), block.getFlag());
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/util/BlockStateListPopulator.java b/src/main/java/org/bukkit/craftbukkit/util/BlockStateListPopulator.java
|
|
index 165843ddfe..8482abd054 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/util/BlockStateListPopulator.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/util/BlockStateListPopulator.java
|
|
@@ -4,8 +4,12 @@ import java.util.ArrayList;
|
|
import java.util.LinkedHashMap;
|
|
import java.util.List;
|
|
|
|
+import net.minecraft.server.Block;
|
|
import net.minecraft.server.BlockPosition;
|
|
+import net.minecraft.server.FluidType;
|
|
import net.minecraft.server.IBlockData;
|
|
+import net.minecraft.server.TickList;
|
|
+import net.minecraft.server.TickListPriority;
|
|
import net.minecraft.server.World;
|
|
|
|
import org.bukkit.block.BlockState;
|
|
@@ -14,6 +18,41 @@ import org.bukkit.craftbukkit.block.CraftBlockState;
|
|
public class BlockStateListPopulator extends DummyGeneratorAccess {
|
|
private final World world;
|
|
private final LinkedHashMap<BlockPosition, CraftBlockState> list;
|
|
+ // Paper start
|
|
+ private final TickList<FluidType> fluidTickList = new TickList<FluidType>() {
|
|
+ @Override
|
|
+ public boolean a(BlockPosition var1, FluidType var2) {
|
|
+ return BlockStateListPopulator.super.I().a(var1, var2);
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void a(BlockPosition var1, FluidType var2, int var3, TickListPriority var4) {
|
|
+
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public boolean b(BlockPosition var1, FluidType var2) {
|
|
+ return false;
|
|
+ }
|
|
+ };
|
|
+
|
|
+ private TickList<Block> blockTickList = new TickList<Block>() {
|
|
+ @Override
|
|
+ public boolean a(BlockPosition var1, Block var2) {
|
|
+ return BlockStateListPopulator.super.J().a(var1, var2);
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void a(BlockPosition var1, Block var2, int var3, TickListPriority var4) {
|
|
+
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public boolean b(BlockPosition var1, Block var2) {
|
|
+ return false;
|
|
+ }
|
|
+ };
|
|
+ // Paper end
|
|
|
|
public BlockStateListPopulator(World world) {
|
|
this(world, new LinkedHashMap<>());
|
|
@@ -45,4 +84,34 @@ public class BlockStateListPopulator extends DummyGeneratorAccess {
|
|
public World getWorld() {
|
|
return world;
|
|
}
|
|
+
|
|
+ // Paper start
|
|
+ @Override
|
|
+ public IBlockData getType(BlockPosition bp) {
|
|
+ CraftBlockState craftState = list.get(bp);
|
|
+ if (craftState != null) {
|
|
+ return craftState.getHandle();
|
|
+ } else {
|
|
+ return world.getType(bp);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ // Do nothing, this will be ran when the block is actually placed into the world
|
|
+ @Override
|
|
+ public void update(BlockPosition bp, Block block) {}
|
|
+
|
|
+ // Dumb tick lists, we rely upon block placement into the world updating this info
|
|
+ // no obfhelpers intentional, design of these classes do not favor them, and easier
|
|
+ // to just rework on upgrade...
|
|
+ @Override
|
|
+ public TickList<FluidType> I() {
|
|
+ return fluidTickList;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public TickList<Block> J() {
|
|
+ return blockTickList;
|
|
+ }
|
|
+
|
|
+ // paper end
|
|
}
|
|
--
|
|
2.19.1
|
|
|