diff options
author | Zach DeCook <zachdecook@gmail.com> | 2018-01-03 17:33:31 +0100 |
---|---|---|
committer | peterbell10 <peterbell10@live.co.uk> | 2018-01-03 17:33:31 +0100 |
commit | 68fc28857fce6fdc4ebde6fa8ec4760e4a68e86e (patch) | |
tree | ec87e0e5cb3a5fe18b6c4053273589acec67ba41 /src/Blocks | |
parent | cLuaState: Update `Push` for entities. (#4128) (diff) | |
download | cuberite-68fc28857fce6fdc4ebde6fa8ec4760e4a68e86e.tar cuberite-68fc28857fce6fdc4ebde6fa8ec4760e4a68e86e.tar.gz cuberite-68fc28857fce6fdc4ebde6fa8ec4760e4a68e86e.tar.bz2 cuberite-68fc28857fce6fdc4ebde6fa8ec4760e4a68e86e.tar.lz cuberite-68fc28857fce6fdc4ebde6fa8ec4760e4a68e86e.tar.xz cuberite-68fc28857fce6fdc4ebde6fa8ec4760e4a68e86e.tar.zst cuberite-68fc28857fce6fdc4ebde6fa8ec4760e4a68e86e.zip |
Diffstat (limited to 'src/Blocks')
-rw-r--r-- | src/Blocks/BlockConcretePowder.h | 106 | ||||
-rw-r--r-- | src/Blocks/BlockHandler.cpp | 2 | ||||
-rw-r--r-- | src/Blocks/CMakeLists.txt | 1 |
3 files changed, 109 insertions, 0 deletions
diff --git a/src/Blocks/BlockConcretePowder.h b/src/Blocks/BlockConcretePowder.h new file mode 100644 index 000000000..4b2a81b2a --- /dev/null +++ b/src/Blocks/BlockConcretePowder.h @@ -0,0 +1,106 @@ + +#pragma once + +#include "BlockHandler.h" + + + + + +class cBlockConcretePowderHandler : + public cBlockHandler +{ +public: + cBlockConcretePowderHandler(BLOCKTYPE a_BlockType): + cBlockHandler(a_BlockType) + { + } + + + + + + virtual void Check(cChunkInterface & a_ChunkInterface, cBlockPluginInterface & a_PluginInterface, int a_RelX, int a_RelY, int a_RelZ, cChunk & a_Chunk) override + { + if (GetSoaked(Vector3i(a_RelX, a_RelY, a_RelZ), a_Chunk)) + { + return; + } + cBlockHandler::Check(a_ChunkInterface, a_PluginInterface, a_RelX, a_RelY, a_RelZ, a_Chunk); + } + + + + + + /** Check blocks above and around to see if they are water. If one is, convert this into concrete block. + Returns TRUE if the block was changed. */ + bool GetSoaked(Vector3i a_Rel, cChunk & a_Chunk) + { + static const std::array<Vector3i, 5> WaterCheck + { + { + { 1, 0, 0}, + {-1, 0, 0}, + { 0, 0, 1}, + { 0, 0, -1}, + { 0, 1, 0}, + } + }; + + bool ShouldSoak = std::any_of(WaterCheck.cbegin(), WaterCheck.cend(), [a_Rel, & a_Chunk](Vector3i a_Offset) + { + BLOCKTYPE NeighborType; + return ( + a_Chunk.UnboundedRelGetBlockType(a_Rel.x + a_Offset.x, a_Rel.y + a_Offset.y, a_Rel.z + a_Offset.z, NeighborType) + && IsBlockWater(NeighborType) + ); + } + ); + + if (ShouldSoak) + { + NIBBLETYPE BlockMeta; + BlockMeta = a_Chunk.GetMeta(a_Rel.x, a_Rel.y, a_Rel.z); + a_Chunk.SetBlock(a_Rel.x, a_Rel.y, a_Rel.z, E_BLOCK_CONCRETE, BlockMeta); + return true; + } + return false; + } + + + + + + virtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) override + { + switch (a_Meta) + { + case E_META_CONCRETE_POWDER_WHITE: return 8; + case E_META_CONCRETE_POWDER_ORANGE: return 15; + case E_META_CONCRETE_POWDER_MAGENTA: return 16; + case E_META_CONCRETE_POWDER_LIGHTBLUE: return 17; + case E_META_CONCRETE_POWDER_YELLOW: return 18; + case E_META_CONCRETE_POWDER_LIGHTGREEN: return 19; + case E_META_CONCRETE_POWDER_PINK: return 20; + case E_META_CONCRETE_POWDER_GRAY: return 21; + case E_META_CONCRETE_POWDER_LIGHTGRAY: return 22; + case E_META_CONCRETE_POWDER_CYAN: return 23; + case E_META_CONCRETE_POWDER_PURPLE: return 24; + case E_META_CONCRETE_POWDER_BLUE: return 25; + case E_META_CONCRETE_POWDER_BROWN: return 26; + case E_META_CONCRETE_POWDER_GREEN: return 27; + case E_META_CONCRETE_POWDER_RED: return 28; + case E_META_CONCRETE_POWDER_BLACK: return 29; + default: + { + ASSERT(!"Unhandled meta in concrete powder handler!"); + return 0; + } + } + } +}; + + + + diff --git a/src/Blocks/BlockHandler.cpp b/src/Blocks/BlockHandler.cpp index 9fc41de76..fb097c395 100644 --- a/src/Blocks/BlockHandler.cpp +++ b/src/Blocks/BlockHandler.cpp @@ -20,6 +20,7 @@ #include "BlockCocoaPod.h" #include "BlockCommandBlock.h" #include "BlockComparator.h" +#include "BlockConcretePowder.h" #include "BlockCrops.h" #include "BlockDeadBush.h" #include "BlockDirt.h" @@ -210,6 +211,7 @@ cBlockHandler * cBlockHandler::CreateBlockHandler(BLOCKTYPE a_BlockType) case E_BLOCK_COCOA_POD: return new cBlockCocoaPodHandler (a_BlockType); case E_BLOCK_COMMAND_BLOCK: return new cBlockCommandBlockHandler (a_BlockType); case E_BLOCK_ACTIVE_COMPARATOR: return new cBlockComparatorHandler (a_BlockType); + case E_BLOCK_CONCRETE_POWDER: return new cBlockConcretePowderHandler (a_BlockType); case E_BLOCK_COBBLESTONE: return new cBlockStoneHandler (a_BlockType); case E_BLOCK_COBBLESTONE_STAIRS: return new cBlockStairsHandler (a_BlockType); case E_BLOCK_COBWEB: return new cBlockCobWebHandler (a_BlockType); diff --git a/src/Blocks/CMakeLists.txt b/src/Blocks/CMakeLists.txt index bc1b62290..496ec69e4 100644 --- a/src/Blocks/CMakeLists.txt +++ b/src/Blocks/CMakeLists.txt @@ -26,6 +26,7 @@ SET (HDRS BlockCocoaPod.h BlockCommandBlock.h BlockComparator.h + BlockConcretePowder.h BlockCrops.h BlockDeadBush.h BlockDirt.h |