summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/BlockInfo.cpp1
-rw-r--r--src/Blocks/BlockBigFlower.h23
-rw-r--r--src/Blocks/BlockButton.h6
-rw-r--r--src/Blocks/BlockDoor.cpp6
-rw-r--r--src/Blocks/BlockDoor.h23
-rw-r--r--src/Blocks/BlockFlowerPot.h7
-rw-r--r--src/Blocks/BlockHandler.cpp37
-rw-r--r--src/Blocks/BlockHandler.h6
-rw-r--r--src/Blocks/BlockLever.h11
-rw-r--r--src/Blocks/BlockSnow.h19
-rw-r--r--src/Blocks/BlockTorch.h6
-rw-r--r--src/Blocks/BlockTrapdoor.h6
-rw-r--r--src/Blocks/BlockTripwireHook.h11
-rw-r--r--src/Blocks/BlockVine.h20
-rw-r--r--src/Blocks/BlockWallSign.h17
-rw-r--r--src/ClientHandle.cpp10
-rw-r--r--src/Simulator/FluidSimulator.cpp3
-rw-r--r--src/Simulator/SandSimulator.cpp5
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;