diff options
-rw-r--r-- | src/BlockInfo.cpp | 1 | ||||
-rw-r--r-- | src/Blocks/BlockBigFlower.h | 23 | ||||
-rw-r--r-- | src/Blocks/BlockButton.h | 6 | ||||
-rw-r--r-- | src/Blocks/BlockDoor.cpp | 6 | ||||
-rw-r--r-- | src/Blocks/BlockDoor.h | 23 | ||||
-rw-r--r-- | src/Blocks/BlockFlowerPot.h | 7 | ||||
-rw-r--r-- | src/Blocks/BlockHandler.cpp | 37 | ||||
-rw-r--r-- | src/Blocks/BlockHandler.h | 6 | ||||
-rw-r--r-- | src/Blocks/BlockLever.h | 11 | ||||
-rw-r--r-- | src/Blocks/BlockSnow.h | 19 | ||||
-rw-r--r-- | src/Blocks/BlockTorch.h | 6 | ||||
-rw-r--r-- | src/Blocks/BlockTrapdoor.h | 6 | ||||
-rw-r--r-- | src/Blocks/BlockTripwireHook.h | 11 | ||||
-rw-r--r-- | src/Blocks/BlockVine.h | 20 | ||||
-rw-r--r-- | src/Blocks/BlockWallSign.h | 17 | ||||
-rw-r--r-- | src/ClientHandle.cpp | 10 | ||||
-rw-r--r-- | src/Simulator/FluidSimulator.cpp | 3 | ||||
-rw-r--r-- | src/Simulator/SandSimulator.cpp | 5 |
18 files changed, 180 insertions, 37 deletions
diff --git a/src/BlockInfo.cpp b/src/BlockInfo.cpp index bcab21e77..5bcf4da50 100644 --- a/src/BlockInfo.cpp +++ b/src/BlockInfo.cpp @@ -774,6 +774,7 @@ void cBlockInfo::Initialize(cBlockInfoArray & a_Info) a_Info[E_BLOCK_JUNGLE_DOOR ].m_PlaceSound = "dig.wood"; a_Info[E_BLOCK_ACACIA_DOOR ].m_PlaceSound = "dig.wood"; a_Info[E_BLOCK_DARK_OAK_DOOR ].m_PlaceSound = "dig.wood"; + a_Info[E_BLOCK_BED ].m_PlaceSound = "dig.wood"; } diff --git a/src/Blocks/BlockBigFlower.h b/src/Blocks/BlockBigFlower.h index 3577bdd40..a73633cd0 100644 --- a/src/Blocks/BlockBigFlower.h +++ b/src/Blocks/BlockBigFlower.h @@ -81,7 +81,28 @@ public: virtual bool CanBeAt(cChunkInterface & a_ChunkInterface, int a_RelX, int a_RelY, int a_RelZ, const cChunk & a_Chunk) override { - return ((a_RelY > 0) && (a_Chunk.GetBlock(a_RelX, a_RelY - 1, a_RelZ) != E_BLOCK_AIR) && (a_RelY < cChunkDef::Height) && ((a_Chunk.GetBlock(a_RelX, a_RelY + 1, a_RelZ) == E_BLOCK_AIR) || (a_Chunk.GetBlock(a_RelX, a_RelY + 1, a_RelZ) == E_BLOCK_BIG_FLOWER))); + if (a_Chunk.GetBlock(a_RelX, a_RelY, a_RelZ) != m_BlockType) + { + // In placing + return (cBlockInfo::FullyOccupiesVoxel(a_Chunk.GetBlock(a_RelX, a_RelY - 1, a_RelZ))); + } + + if ((a_RelY <= 0) || (a_RelY >= cChunkDef::Height)) + { + return false; + } + + NIBBLETYPE Meta = a_Chunk.GetMeta(a_RelX, a_RelY, a_RelZ); + if ((Meta & 0x08) != 0) + { + // The coords are pointing at the top part of the flower + return (a_Chunk.GetBlock(a_RelX, a_RelY - 1, a_RelZ) == m_BlockType); + } + else + { + // The coords are pointing at the bottom part of the flower + return IsBlockTypeOfDirt(a_Chunk.GetBlock(a_RelX, a_RelY - 1, a_RelZ)); + } } diff --git a/src/Blocks/BlockButton.h b/src/Blocks/BlockButton.h index 8e4f04740..63582977a 100644 --- a/src/Blocks/BlockButton.h +++ b/src/Blocks/BlockButton.h @@ -91,6 +91,12 @@ public: virtual bool CanBeAt(cChunkInterface & a_ChunkInterface, int a_RelX, int a_RelY, int a_RelZ, const cChunk & a_Chunk) override { + if (a_Chunk.GetBlock(a_RelX, a_RelY, a_RelZ) != m_BlockType) + { + // In placing + return true; + } + NIBBLETYPE Meta; a_Chunk.UnboundedRelGetBlockMeta(a_RelX, a_RelY, a_RelZ, Meta); diff --git a/src/Blocks/BlockDoor.cpp b/src/Blocks/BlockDoor.cpp index 96345a2df..ffb72a680 100644 --- a/src/Blocks/BlockDoor.cpp +++ b/src/Blocks/BlockDoor.cpp @@ -20,9 +20,9 @@ void cBlockDoorHandler::OnDestroyed(cChunkInterface & a_ChunkInterface, cWorldIn { NIBBLETYPE OldMeta = a_ChunkInterface.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ); - if (OldMeta & 8) + if ((OldMeta & 0x08) != 0) { - // Was upper part of door + // The coords are pointing at the top part of the door if (IsDoor(a_ChunkInterface.GetBlock(a_BlockX, a_BlockY - 1, a_BlockZ))) { a_ChunkInterface.FastSetBlock(a_BlockX, a_BlockY - 1, a_BlockZ, E_BLOCK_AIR, 0); @@ -30,7 +30,7 @@ void cBlockDoorHandler::OnDestroyed(cChunkInterface & a_ChunkInterface, cWorldIn } else { - // Was lower part + // The coords are pointing at the bottom part of the door if (IsDoor(a_ChunkInterface.GetBlock(a_BlockX, a_BlockY + 1, a_BlockZ))) { a_ChunkInterface.FastSetBlock(a_BlockX, a_BlockY + 1, a_BlockZ, E_BLOCK_AIR, 0); diff --git a/src/Blocks/BlockDoor.h b/src/Blocks/BlockDoor.h index 92ad8da12..74e608da8 100644 --- a/src/Blocks/BlockDoor.h +++ b/src/Blocks/BlockDoor.h @@ -117,7 +117,28 @@ public: virtual bool CanBeAt(cChunkInterface & a_ChunkInterface, int a_RelX, int a_RelY, int a_RelZ, const cChunk & a_Chunk) override { - return ((a_RelY > 0) && (a_Chunk.GetBlock(a_RelX, a_RelY - 1, a_RelZ) != E_BLOCK_AIR)); + if (a_Chunk.GetBlock(a_RelX, a_RelY, a_RelZ) != m_BlockType) + { + // In placing + return (cBlockInfo::FullyOccupiesVoxel(a_Chunk.GetBlock(a_RelX, a_RelY - 1, a_RelZ))); + } + + if ((a_RelY <= 0) || (a_RelY >= cChunkDef::Height)) + { + return false; + } + + NIBBLETYPE Meta = a_Chunk.GetMeta(a_RelX, a_RelY, a_RelZ); + if ((Meta & 0x08) != 0) + { + // The coords are pointing at the top part of the door + return (a_Chunk.GetBlock(a_RelX, a_RelY - 1, a_RelZ) == m_BlockType); + } + else + { + // The coords are pointing at the bottom part of the door + return cBlockInfo::FullyOccupiesVoxel(a_Chunk.GetBlock(a_RelX, a_RelY - 1, a_RelZ)); + } } diff --git a/src/Blocks/BlockFlowerPot.h b/src/Blocks/BlockFlowerPot.h index fc75ef638..ff31cf4ae 100644 --- a/src/Blocks/BlockFlowerPot.h +++ b/src/Blocks/BlockFlowerPot.h @@ -17,10 +17,17 @@ public: { } + virtual void ConvertToPickups(cItems & a_Pickups, NIBBLETYPE a_BlockMeta) override { a_Pickups.push_back(cItem(E_ITEM_FLOWER_POT, 1, 0)); } + + + virtual bool CanBeAt(cChunkInterface & a_ChunkInterface, int a_RelX, int a_RelY, int a_RelZ, const cChunk & a_Chunk) override + { + return ((a_RelY > 0) && cBlockInfo::FullyOccupiesVoxel(a_Chunk.GetBlock(a_RelX, a_RelY - 1, a_RelZ))); + } } ; diff --git a/src/Blocks/BlockHandler.cpp b/src/Blocks/BlockHandler.cpp index 60f13a747..7f1d72159 100644 --- a/src/Blocks/BlockHandler.cpp +++ b/src/Blocks/BlockHandler.cpp @@ -500,6 +500,43 @@ void cBlockHandler::DropBlock(cChunkInterface & a_ChunkInterface, cWorldInterfac +bool cBlockHandler::CanBeAt(cWorld * a_World, int a_BlockX, int a_BlockY, int a_BlockZ) +{ + class cCallback : public cChunkCallback + { + public: + cCallback(cChunkInterface & a_ChunkInterface, int a_RelX, int a_RelY, int a_RelZ, cBlockHandler * a_BlockHandler) : + m_ChunkInterface(a_ChunkInterface), + m_RelX(a_RelX), + m_RelY(a_RelY), + m_RelZ(a_RelZ), + m_Handler(a_BlockHandler) + { + } + + virtual bool Item(cChunk * a_Chunk) + { + return m_Handler->CanBeAt(m_ChunkInterface, m_RelX, m_RelY, m_RelZ, *a_Chunk); + } + + protected: + cChunkInterface & m_ChunkInterface; + int m_RelX, m_RelY, m_RelZ; + cBlockHandler * m_Handler; + }; + + int ChunkX, ChunkZ; + cChunkDef::AbsoluteToRelative(a_BlockX, a_BlockY, a_BlockZ, ChunkX, ChunkZ); + cChunkInterface ChunkInterface(a_World->GetChunkMap()); + + cCallback Callback(ChunkInterface, a_BlockX, a_BlockY, a_BlockZ, this); + return a_World->GetChunkMap()->DoWithChunk(ChunkX, ChunkZ, Callback); +} + + + + + bool cBlockHandler::CanBeAt(cChunkInterface & a_ChunkInterface, int a_BlockX, int a_BlockY, int a_BlockZ, const cChunk & a_Chunk) { return true; diff --git a/src/Blocks/BlockHandler.h b/src/Blocks/BlockHandler.h index f2298afb5..6c782da8c 100644 --- a/src/Blocks/BlockHandler.h +++ b/src/Blocks/BlockHandler.h @@ -14,6 +14,7 @@ class cBlockPluginInterface; class cChunkInterface; class cWorldInterface; class cItems; +class cWorld; @@ -83,7 +84,10 @@ public: @param a_DropVerbatim Calls ConvertToVerbatimPickups() instead of its counterpart, meaning the block itself is dropped by default (due to a speical tool or enchantment) */ virtual void DropBlock(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cBlockPluginInterface & a_BlockPluginInterface, cEntity * a_Digger, int a_BlockX, int a_BlockY, int a_BlockZ, bool a_CanDrop = true); - + + /** Checks if the block can stay at the specified absolute coords */ + bool CanBeAt(cWorld * a_World, int a_BlockX, int a_BlockY, int a_BlockZ); + /// Checks if the block can stay at the specified relative coords in the chunk virtual bool CanBeAt(cChunkInterface & a_ChunkInterface, int a_RelX, int a_RelY, int a_RelZ, const cChunk & a_Chunk); diff --git a/src/Blocks/BlockLever.h b/src/Blocks/BlockLever.h index f5bedea6c..347c8ff72 100644 --- a/src/Blocks/BlockLever.h +++ b/src/Blocks/BlockLever.h @@ -93,13 +93,17 @@ public: virtual bool CanBeAt(cChunkInterface & a_ChunkInterface, int a_RelX, int a_RelY, int a_RelZ, const cChunk & a_Chunk) override { + if (a_Chunk.GetBlock(a_RelX, a_RelY, a_RelZ) != m_BlockType) + { + // In placing + return true; + } + NIBBLETYPE Meta = a_Chunk.GetMeta(a_RelX, a_RelY, a_RelZ); - eBlockFace Face = BlockMetaDataToBlockFace(Meta); - AddFaceDirection(a_RelX, a_RelY, a_RelZ, Face, true); - if ((a_RelY < 0) || (a_RelY >= cChunkDef::Height -1)) + if ((a_RelY < 0) || (a_RelY >= cChunkDef::Height)) { return false; } @@ -107,7 +111,6 @@ public: BLOCKTYPE BlockIsOn; a_Chunk.UnboundedRelGetBlock(a_RelX, a_RelY, a_RelZ, BlockIsOn, Meta); - if (cBlockInfo::FullyOccupiesVoxel(BlockIsOn)) { return true; diff --git a/src/Blocks/BlockSnow.h b/src/Blocks/BlockSnow.h index 7b6094c9f..4f1712974 100644 --- a/src/Blocks/BlockSnow.h +++ b/src/Blocks/BlockSnow.h @@ -67,19 +67,16 @@ public: virtual bool CanBeAt(cChunkInterface & a_ChunkInterface, int a_RelX, int a_RelY, int a_RelZ, const cChunk & a_Chunk) override { - if (a_RelY > 0) + if (a_RelY <= 0) { - BLOCKTYPE BlockBelow = a_Chunk.GetBlock(a_RelX, a_RelY - 1, a_RelZ); - NIBBLETYPE MetaBelow = a_Chunk.GetMeta(a_RelX, a_RelY - 1, a_RelZ); - - if (cBlockInfo::IsSnowable(BlockBelow) || ((BlockBelow == E_BLOCK_SNOW) && (MetaBelow == 7))) - { - // If block below is snowable, or it is a thin slow block and has a meta of 7 (full thin snow block), say yay - return true; - } + return false; } - - return false; + + BLOCKTYPE BlockBelow = a_Chunk.GetBlock(a_RelX, a_RelY - 1, a_RelZ); + NIBBLETYPE MetaBelow = a_Chunk.GetMeta(a_RelX, a_RelY - 1, a_RelZ); + + // If block below is snowable, or it is a thin slow block and has a meta of 7 (full thin snow block), say yay + return (cBlockInfo::IsSnowable(BlockBelow) || ((BlockBelow == E_BLOCK_SNOW) && (MetaBelow == 7))); } diff --git a/src/Blocks/BlockTorch.h b/src/Blocks/BlockTorch.h index e77bbd1b8..0218aa6ea 100644 --- a/src/Blocks/BlockTorch.h +++ b/src/Blocks/BlockTorch.h @@ -153,6 +153,12 @@ public: virtual bool CanBeAt(cChunkInterface & a_ChunkInterface, int a_RelX, int a_RelY, int a_RelZ, const cChunk & a_Chunk) override { + if (a_Chunk.GetBlock(a_RelX, a_RelY, a_RelZ) != m_BlockType) + { + // In placing + return true; + } + eBlockFace Face = MetaDataToDirection(a_Chunk.GetMeta(a_RelX, a_RelY, a_RelZ)); AddFaceDirection(a_RelX, a_RelY, a_RelZ, Face, true); diff --git a/src/Blocks/BlockTrapdoor.h b/src/Blocks/BlockTrapdoor.h index 8c96de0f1..55a644288 100644 --- a/src/Blocks/BlockTrapdoor.h +++ b/src/Blocks/BlockTrapdoor.h @@ -100,6 +100,12 @@ public: virtual bool CanBeAt(cChunkInterface & a_ChunkInterface, int a_RelX, int a_RelY, int a_RelZ, const cChunk & a_Chunk) override { + if (a_Chunk.GetBlock(a_RelX, a_RelY, a_RelZ) != m_BlockType) + { + // In placing + return true; + } + NIBBLETYPE Meta; a_Chunk.UnboundedRelGetBlockMeta(a_RelX, a_RelY, a_RelZ, Meta); diff --git a/src/Blocks/BlockTripwireHook.h b/src/Blocks/BlockTripwireHook.h index 88d389711..d7121f65c 100644 --- a/src/Blocks/BlockTripwireHook.h +++ b/src/Blocks/BlockTripwireHook.h @@ -61,14 +61,19 @@ public: virtual bool CanBeAt(cChunkInterface & a_ChunkInterface, int a_RelX, int a_RelY, int a_RelZ, const cChunk & a_Chunk) override { - NIBBLETYPE Meta; - a_Chunk.UnboundedRelGetBlockMeta(a_RelX, a_RelY, a_RelZ, Meta); + if (a_Chunk.GetBlock(a_RelX, a_RelY, a_RelZ) != m_BlockType) + { + // In placing + return true; + } + + NIBBLETYPE Meta = a_Chunk.GetMeta(a_RelX, a_RelY, a_RelZ); AddFaceDirection(a_RelX, a_RelY, a_RelZ, MetadataToDirection(Meta), true); BLOCKTYPE BlockIsOn; a_Chunk.UnboundedRelGetBlockType(a_RelX, a_RelY, a_RelZ, BlockIsOn); - return ((a_RelY > 0) && cBlockInfo::FullyOccupiesVoxel(BlockIsOn)); + return cBlockInfo::FullyOccupiesVoxel(BlockIsOn); } }; diff --git a/src/Blocks/BlockVine.h b/src/Blocks/BlockVine.h index 00d7a69b8..8032bc753 100644 --- a/src/Blocks/BlockVine.h +++ b/src/Blocks/BlockVine.h @@ -24,19 +24,25 @@ public: ) override { // TODO: Disallow placement where the vine doesn't attach to something properly - BLOCKTYPE BlockType = 0; + BLOCKTYPE BlockType; NIBBLETYPE BlockMeta; a_ChunkInterface.GetBlockTypeMeta(a_BlockX, a_BlockY, a_BlockZ, BlockType, BlockMeta); - if (BlockType == m_BlockType) + + NIBBLETYPE DirectionMeta = DirectionToMetaData(a_BlockFace); + + if ((BlockType == E_BLOCK_AIR) || IsBlockLiquid(BlockType)) { - a_BlockMeta = BlockMeta | DirectionToMetaData(a_BlockFace); + a_BlockType = m_BlockType; + a_BlockMeta = DirectionMeta; + return true; } - else + else if ((BlockType == m_BlockType) && ((BlockMeta & DirectionMeta) == 0)) { - a_BlockMeta = DirectionToMetaData(a_BlockFace); + a_BlockType = m_BlockType; + a_BlockMeta = BlockMeta | DirectionMeta; + return true; } - a_BlockType = m_BlockType; - return true; + return false; } diff --git a/src/Blocks/BlockWallSign.h b/src/Blocks/BlockWallSign.h index 0abe9c52c..ab280c1e0 100644 --- a/src/Blocks/BlockWallSign.h +++ b/src/Blocks/BlockWallSign.h @@ -40,12 +40,19 @@ public: virtual bool CanBeAt(cChunkInterface & a_ChunkInterface, int a_RelX, int a_RelY, int a_RelZ, const cChunk & a_Chunk) override { - int BlockX = (a_Chunk.GetPosX() * cChunkDef::Width) + a_RelX; - int BlockZ = (a_Chunk.GetPosZ() * cChunkDef::Width) + a_RelZ; - GetBlockCoordsBehindTheSign(a_Chunk.GetMeta(a_RelX, a_RelY, a_RelZ), BlockX, BlockZ); - BLOCKTYPE Type = a_ChunkInterface.GetBlock(BlockX, a_RelY, BlockZ); + if (a_Chunk.GetBlock(a_RelX, a_RelY, a_RelZ) != m_BlockType) + { + // In placing + return true; + } + + NIBBLETYPE Meta = a_Chunk.GetMeta(a_RelX, a_RelY, a_RelZ); + GetBlockCoordsBehindTheSign(Meta, a_RelX, a_RelZ); + + BLOCKTYPE BehindBlock; + a_Chunk.UnboundedRelGetBlockType(a_RelX, a_RelY, a_RelZ, BehindBlock); - return ((Type == E_BLOCK_WALLSIGN) || (Type == E_BLOCK_SIGN_POST) || cBlockInfo::IsSolid(Type)); + return ((BehindBlock == E_BLOCK_WALLSIGN) || (BehindBlock == E_BLOCK_SIGN_POST) || cBlockInfo::IsSolid(BehindBlock)); } diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index a6cbad32a..aefff9aa7 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -1493,6 +1493,15 @@ void cClientHandle::HandlePlaceBlock(int a_BlockX, int a_BlockY, int a_BlockZ, e } cBlockHandler * NewBlock = BlockHandler(BlockType); + cChunkInterface ChunkInterface(World->GetChunkMap()); + + if (!NewBlock->CanBeAt(World, a_BlockX, a_BlockY, a_BlockZ)) + { + // Handler refused the placement, send that information back to the client: + World->SendBlockTo(a_BlockX, a_BlockY, a_BlockZ, m_Player); + m_Player->GetInventory().SendEquippedSlot(); + return; + } if (cRoot::Get()->GetPluginManager()->CallHookPlayerPlacingBlock(*m_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_CursorX, a_CursorY, a_CursorZ, BlockType, BlockMeta)) { @@ -1509,7 +1518,6 @@ void cClientHandle::HandlePlaceBlock(int a_BlockX, int a_BlockY, int a_BlockZ, e m_Player->GetInventory().RemoveOneEquippedItem(); } - cChunkInterface ChunkInterface(World->GetChunkMap()); NewBlock->OnPlacedByPlayer(ChunkInterface, *World, m_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_CursorX, a_CursorY, a_CursorZ, BlockType, BlockMeta); AString PlaceSound = cBlockInfo::GetPlaceSound(BlockType); diff --git a/src/Simulator/FluidSimulator.cpp b/src/Simulator/FluidSimulator.cpp index 9c8453d04..38508323f 100644 --- a/src/Simulator/FluidSimulator.cpp +++ b/src/Simulator/FluidSimulator.cpp @@ -46,8 +46,11 @@ bool cFluidSimulator::CanWashAway(BLOCKTYPE a_BlockType) case E_BLOCK_SNOW: case E_BLOCK_SUGARCANE: case E_BLOCK_TALL_GRASS: + case E_BLOCK_TRIPWIRE: + case E_BLOCK_TRIPWIRE_HOOK: case E_BLOCK_TORCH: case E_BLOCK_YELLOW_FLOWER: + case E_BLOCK_VINES: { return true; } diff --git a/src/Simulator/SandSimulator.cpp b/src/Simulator/SandSimulator.cpp index dfbd3e458..955b68717 100644 --- a/src/Simulator/SandSimulator.cpp +++ b/src/Simulator/SandSimulator.cpp @@ -153,6 +153,7 @@ bool cSandSimulator::CanContinueFallThrough(BLOCKTYPE a_BlockType) { case E_BLOCK_AIR: case E_BLOCK_BROWN_MUSHROOM: + case E_BLOCK_CARROTS: case E_BLOCK_COBWEB: case E_BLOCK_CROPS: case E_BLOCK_DEAD_BUSH: @@ -166,6 +167,7 @@ bool cSandSimulator::CanContinueFallThrough(BLOCKTYPE a_BlockType) case E_BLOCK_LIGHT_WEIGHTED_PRESSURE_PLATE: case E_BLOCK_MINECART_TRACKS: case E_BLOCK_MELON_STEM: + case E_BLOCK_POTATOES: case E_BLOCK_POWERED_RAIL: case E_BLOCK_PUMPKIN_STEM: case E_BLOCK_REDSTONE_REPEATER_OFF: @@ -181,11 +183,13 @@ bool cSandSimulator::CanContinueFallThrough(BLOCKTYPE a_BlockType) case E_BLOCK_STATIONARY_WATER: case E_BLOCK_STONE_BUTTON: case E_BLOCK_STONE_PRESSURE_PLATE: + case E_BLOCK_SUGARCANE: case E_BLOCK_TALL_GRASS: case E_BLOCK_TORCH: case E_BLOCK_TRAPDOOR: case E_BLOCK_TRIPWIRE: case E_BLOCK_TRIPWIRE_HOOK: + case E_BLOCK_VINES: case E_BLOCK_WALLSIGN: case E_BLOCK_WATER: case E_BLOCK_WOODEN_BUTTON: @@ -215,6 +219,7 @@ bool cSandSimulator::IsReplacedOnRematerialization(BLOCKTYPE a_BlockType) case E_BLOCK_STATIONARY_LAVA: case E_BLOCK_STATIONARY_WATER: case E_BLOCK_TALL_GRASS: + case E_BLOCK_VINES: case E_BLOCK_WATER: { return true; |