summaryrefslogtreecommitdiffstats
path: root/src/Blocks/BlockBigFlower.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/Blocks/BlockBigFlower.h')
-rw-r--r--src/Blocks/BlockBigFlower.h128
1 files changed, 40 insertions, 88 deletions
diff --git a/src/Blocks/BlockBigFlower.h b/src/Blocks/BlockBigFlower.h
index defe57d99..ae4b2500a 100644
--- a/src/Blocks/BlockBigFlower.h
+++ b/src/Blocks/BlockBigFlower.h
@@ -42,106 +42,53 @@ public:
);
}
- 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) override
- {
- Vector3i Pos(a_BlockX, a_BlockY, a_BlockZ);
- NIBBLETYPE Meta = a_ChunkInterface.GetBlockMeta(Pos);
- int AlternateY = a_BlockY;
- int BottomY = a_BlockY;
- if (Meta & 0x8)
- {
- --AlternateY;
- --BottomY;
- }
- else
- {
- ++AlternateY;
- }
- // also destroy the other block if it has a valid height and is a big flower
- if (cChunkDef::IsValidHeight(AlternateY) && a_ChunkInterface.GetBlock({Pos.x, AlternateY, Pos.z}) == E_BLOCK_BIG_FLOWER)
- {
- super::DropBlock(a_ChunkInterface, a_WorldInterface, a_BlockPluginInterface, a_Digger, a_BlockX, BottomY, a_BlockZ, a_CanDrop);
- a_ChunkInterface.FastSetBlock(a_BlockX, AlternateY, a_BlockZ, E_BLOCK_AIR, 0);
- }
- }
- virtual void ConvertToPickups(cItems & a_Pickups, NIBBLETYPE a_BlockMeta) override
+
+
+ virtual cItems ConvertToPickups(NIBBLETYPE a_BlockMeta, cBlockEntity * a_BlockEntity, const cEntity * a_Digger, const cItem * a_Tool) override
{
if (IsMetaTopPart(a_BlockMeta))
{
- return; // No way to tell flower type
+ return {}; // No drops from the top part
}
- NIBBLETYPE Meta = a_BlockMeta & 0x7;
- if (Meta == E_META_BIG_FLOWER_DOUBLE_TALL_GRASS)
+ // With shears, drop self (even tall grass and fern):
+ if ((a_Tool != nullptr) && (a_Tool->m_ItemType == E_ITEM_SHEARS))
+ {
+ // Bit 0x08 specifies whether this is a top part or bottom; cut it off from the pickup:
+ return cItem(m_BlockType, 1, a_BlockMeta & 0x07);
+ }
+
+ // Tall grass drops seeds, large fern drops nothing, others drop self:
+ auto flowerType = a_BlockMeta & 0x07;
+ if (flowerType == E_META_BIG_FLOWER_DOUBLE_TALL_GRASS)
{
if (GetRandomProvider().RandBool(1.0 / 24.0))
{
- a_Pickups.push_back(cItem(E_ITEM_SEEDS));
+ return cItem(E_ITEM_SEEDS);
}
}
- else if (Meta != E_META_BIG_FLOWER_LARGE_FERN)
+ else if (flowerType != E_META_BIG_FLOWER_LARGE_FERN)
{
- a_Pickups.push_back(cItem(E_BLOCK_BIG_FLOWER, 1, Meta));
+ return cItem(m_BlockType, 1, static_cast<short>(flowerType));
}
+ return {};
}
- virtual void OnDestroyedByPlayer(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ) override
- {
- Vector3i BlockPos(a_BlockX, a_BlockY, a_BlockZ);
- NIBBLETYPE Meta = a_ChunkInterface.GetBlockMeta(BlockPos);
- if (Meta & 0x8)
- {
- Meta = a_ChunkInterface.GetBlockMeta(BlockPos - Vector3i(0, 1, 0));
- }
- NIBBLETYPE FlowerMeta = Meta & 0x7;
- if (!a_Player.IsGameModeCreative())
- {
- if (
- (a_Player.GetEquippedItem().m_ItemType == E_ITEM_SHEARS) &&
- (
- (FlowerMeta == E_META_BIG_FLOWER_DOUBLE_TALL_GRASS) ||
- (FlowerMeta == E_META_BIG_FLOWER_LARGE_FERN)
- )
- )
- {
- if (GetRandomProvider().RandBool(0.10))
- {
- cItems Pickups;
- if (FlowerMeta == E_META_BIG_FLOWER_DOUBLE_TALL_GRASS)
- {
- Pickups.Add(E_BLOCK_TALL_GRASS, 2, 1);
- }
- else if (FlowerMeta == E_META_BIG_FLOWER_LARGE_FERN)
- {
- Pickups.Add(E_BLOCK_TALL_GRASS, 2, 2);
- }
- a_WorldInterface.SpawnItemPickups(Pickups, BlockPos.x, BlockPos.y, BlockPos.z);
- }
- a_Player.UseEquippedItem();
- }
- }
- if (
- (a_Player.GetEquippedItem().m_ItemType != E_ITEM_SHEARS) &&
- (
- (FlowerMeta == E_META_BIG_FLOWER_DOUBLE_TALL_GRASS) ||
- (FlowerMeta == E_META_BIG_FLOWER_LARGE_FERN)
- )
- )
- {
- a_ChunkInterface.SetBlock(BlockPos.x, BlockPos.y, BlockPos.z, 0, 0);
- a_Player.UseEquippedItem(cItemHandler::dlaBreakBlockInstant);
- }
- }
+
bool IsMetaTopPart(NIBBLETYPE a_Meta)
{
- return (a_Meta & 0x08) != 0;
+ return ((a_Meta & 0x08) != 0);
}
+
+
+
+
virtual bool CanBeAt(cChunkInterface & a_ChunkInterface, int a_RelX, int a_RelY, int a_RelZ, const cChunk & a_Chunk) override
{
if (a_RelY <= 0)
@@ -155,31 +102,36 @@ public:
return IsBlockTypeOfDirt(BlockType) || ((BlockType == E_BLOCK_BIG_FLOWER) && !IsMetaTopPart(BlockMeta));
}
- virtual void OnDestroyed(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, int a_BlockX, int a_BlockY, int a_BlockZ) override
- {
- Vector3i BlockPos(a_BlockX, a_BlockY, a_BlockZ);
- NIBBLETYPE OldMeta = a_ChunkInterface.GetBlockMeta(BlockPos);
- if (OldMeta & 0x8)
+
+
+
+ virtual void OnBroken(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, Vector3i a_BlockPos, BLOCKTYPE a_OldBlockType, NIBBLETYPE a_OldBlockMeta) override
+ {
+ if ((a_OldBlockMeta & 0x8) != 0)
{
// Was upper part of flower
- Vector3i LowerPart = BlockPos - Vector3i(0, 1, 0);
- if (a_ChunkInterface.GetBlock(LowerPart) == m_BlockType)
+ auto lowerPartPos = a_BlockPos - Vector3i(0, 1, 0);
+ if (a_ChunkInterface.GetBlock(lowerPartPos) == a_OldBlockType)
{
- a_ChunkInterface.FastSetBlock(LowerPart, E_BLOCK_AIR, 0);
+ a_ChunkInterface.DropBlockAsPickups(lowerPartPos);
}
}
else
{
// Was lower part
- Vector3i UpperPart = BlockPos + Vector3i(0, 1, 0);
- if (a_ChunkInterface.GetBlock(UpperPart) == m_BlockType)
+ auto upperPartPos = a_BlockPos + Vector3i(0, 1, 0);
+ if (a_ChunkInterface.GetBlock(upperPartPos) == a_OldBlockType)
{
- a_ChunkInterface.FastSetBlock(UpperPart, E_BLOCK_AIR, 0);
+ a_ChunkInterface.DropBlockAsPickups(upperPartPos);
}
}
}
+
+
+
+
virtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) override
{
UNUSED(a_Meta);