summaryrefslogtreecommitdiffstats
path: root/src/Blocks
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/Blocks/BlockHandler.cpp3
-rw-r--r--src/Blocks/BlockIce.h51
-rw-r--r--src/Blocks/BlockPackedIce.h37
-rw-r--r--src/Blocks/CMakeLists.txt1
4 files changed, 89 insertions, 3 deletions
diff --git a/src/Blocks/BlockHandler.cpp b/src/Blocks/BlockHandler.cpp
index 274460e50..f2eb4f966 100644
--- a/src/Blocks/BlockHandler.cpp
+++ b/src/Blocks/BlockHandler.cpp
@@ -59,6 +59,7 @@
#include "BlockNetherWart.h"
#include "BlockObserver.h"
#include "BlockOre.h"
+#include "BlockPackedIce.h"
#include "BlockPiston.h"
#include "BlockPlanks.h"
#include "BlockPortal.h"
@@ -354,7 +355,7 @@ namespace
constexpr cBlockHandler BlockObsidianHandler (E_BLOCK_OBSIDIAN);
constexpr cBlockGlazedTerracottaHandler BlockOrangeGlazedTerracottaHandler(E_BLOCK_ORANGE_GLAZED_TERRACOTTA);
constexpr cBlockHandler BlockOrangeShulkerBoxHandler (E_BLOCK_ORANGE_SHULKER_BOX);
- constexpr cBlockIceHandler BlockPackedIceHandler (E_BLOCK_PACKED_ICE);
+ constexpr cBlockPackedIceHandler BlockPackedIceHandler (E_BLOCK_PACKED_ICE);
constexpr cBlockGlazedTerracottaHandler BlockPinkGlazedTerracottaHandler (E_BLOCK_PINK_GLAZED_TERRACOTTA);
constexpr cBlockHandler BlockPinkShulkerBoxHandler (E_BLOCK_PINK_SHULKER_BOX);
constexpr cBlockPistonHandler BlockPistonHandler (E_BLOCK_PISTON);
diff --git a/src/Blocks/BlockIce.h b/src/Blocks/BlockIce.h
index e20ce6daa..10cd71b8a 100644
--- a/src/Blocks/BlockIce.h
+++ b/src/Blocks/BlockIce.h
@@ -25,9 +25,56 @@ private:
{
return cItem(m_BlockType);
}
- else
+
+ return {};
+ }
+
+ virtual void OnUpdate(
+ cChunkInterface & a_ChunkInterface,
+ cWorldInterface & a_WorldInterface,
+ cBlockPluginInterface & a_PluginInterface,
+ cChunk & a_Chunk,
+ const Vector3i a_RelPos
+ ) const override
+ {
+ // Disappears instantly in nether:
+ if (a_WorldInterface.GetDimension() == dimNether)
+ {
+ a_Chunk.SetBlock(a_RelPos, E_BLOCK_AIR, 0);
+ return;
+ }
+
+ // Artificial light on any of the surrounding block > 11 leads to melting the ice.
+ static const std::array<Vector3i, 7> Adjacents
+ {
+ {
+ { 1, 0, 0 }, { -1, 0, 0 },
+ { 0, 1, 0 }, { 0, -1, 0 },
+ { 0, 0, 1 }, { 0, 0, -1 }
+ }
+ };
+
+ for (const auto Offset : Adjacents)
{
- return {};
+ auto Position = a_RelPos + Offset;
+ const auto Chunk = a_Chunk.GetRelNeighborChunkAdjustCoords(Position);
+
+ if ((Chunk == nullptr) || !Chunk->IsValid())
+ {
+ continue;
+ }
+
+ if (!Chunk->IsLightValid())
+ {
+ Chunk->GetWorld()->QueueLightChunk(Chunk->GetPosX(), Chunk->GetPosZ());
+ continue;
+ }
+
+ if (Chunk->GetBlockLight(Position) > 11)
+ {
+ a_Chunk.SetBlock(a_RelPos, E_BLOCK_STATIONARY_WATER, 0);
+ return;
+ }
}
}
diff --git a/src/Blocks/BlockPackedIce.h b/src/Blocks/BlockPackedIce.h
new file mode 100644
index 000000000..e344b2a19
--- /dev/null
+++ b/src/Blocks/BlockPackedIce.h
@@ -0,0 +1,37 @@
+
+#pragma once
+
+#include "BlockHandler.h"
+
+
+
+
+
+class cBlockPackedIceHandler :
+ public cBlockHandler
+{
+ using Super = cBlockHandler;
+
+public:
+
+ using Super::Super;
+
+private:
+
+ virtual cItems ConvertToPickups(NIBBLETYPE a_BlockMeta, cBlockEntity * a_BlockEntity, const cEntity * a_Digger, const cItem * a_Tool) const override
+ {
+ // Only drop self when using silk-touch:
+ if (ToolHasSilkTouch(a_Tool))
+ {
+ return cItem(m_BlockType);
+ }
+
+ return {};
+ }
+
+ virtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const override
+ {
+ UNUSED(a_Meta);
+ return 5;
+ }
+} ;
diff --git a/src/Blocks/CMakeLists.txt b/src/Blocks/CMakeLists.txt
index a3d1e5cb2..167e11da0 100644
--- a/src/Blocks/CMakeLists.txt
+++ b/src/Blocks/CMakeLists.txt
@@ -61,6 +61,7 @@ target_sources(
BlockNetherWart.h
BlockObserver.h
BlockOre.h
+ BlockPackedIce.h
BlockPiston.h
BlockPlanks.h
BlockPlant.h