From 3c048e89df0608e4a5187df2ddc1c36956b11df5 Mon Sep 17 00:00:00 2001 From: Shane Freeder 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 list; + // Paper start + private final TickList fluidTickList = new TickList() { + @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 blockTickList = new TickList() { + @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 I() { + return fluidTickList; + } + + @Override + public TickList J() { + return blockTickList; + } + + // paper end } -- 2.19.1