From b5410c718ece106a3b25fab4a5c37815715df275 Mon Sep 17 00:00:00 2001 From: 12xx12 <44411062+12xx12@users.noreply.github.com> Date: Thu, 24 Sep 2020 14:53:49 +0200 Subject: [PATCH] Fix ice behaviour in world (#4927) + Added proper ice melting under light influence Co-authored-by: Tiger Wang --- src/Blocks/BlockHandler.cpp | 3 ++- src/Blocks/BlockIce.h | 51 +++++++++++++++++++++++++++++++++++-- src/Blocks/BlockPackedIce.h | 37 +++++++++++++++++++++++++++ src/Blocks/CMakeLists.txt | 1 + 4 files changed, 89 insertions(+), 3 deletions(-) create mode 100644 src/Blocks/BlockPackedIce.h 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) { - return {}; + 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 Adjacents + { + { + { 1, 0, 0 }, { -1, 0, 0 }, + { 0, 1, 0 }, { 0, -1, 0 }, + { 0, 0, 1 }, { 0, 0, -1 } + } + }; + + for (const auto Offset : Adjacents) + { + 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