diff options
author | madmaxoft@gmail.com <madmaxoft@gmail.com@0a769ca7-a7f5-676a-18bf-c427514a06d6> | 2013-03-02 20:57:09 +0100 |
---|---|---|
committer | madmaxoft@gmail.com <madmaxoft@gmail.com@0a769ca7-a7f5-676a-18bf-c427514a06d6> | 2013-03-02 20:57:09 +0100 |
commit | 6744738a85c60238585dcf72af211f852fd7e4c6 (patch) | |
tree | 47f36786b377a69097dc479ea9ab8991b35eb9d5 /source/Simulator/SandSimulator.h | |
parent | Added the anvil block (diff) | |
download | cuberite-6744738a85c60238585dcf72af211f852fd7e4c6.tar cuberite-6744738a85c60238585dcf72af211f852fd7e4c6.tar.gz cuberite-6744738a85c60238585dcf72af211f852fd7e4c6.tar.bz2 cuberite-6744738a85c60238585dcf72af211f852fd7e4c6.tar.lz cuberite-6744738a85c60238585dcf72af211f852fd7e4c6.tar.xz cuberite-6744738a85c60238585dcf72af211f852fd7e4c6.tar.zst cuberite-6744738a85c60238585dcf72af211f852fd7e4c6.zip |
Diffstat (limited to 'source/Simulator/SandSimulator.h')
-rw-r--r-- | source/Simulator/SandSimulator.h | 58 |
1 files changed, 44 insertions, 14 deletions
diff --git a/source/Simulator/SandSimulator.h b/source/Simulator/SandSimulator.h index ebd154f2d..571258049 100644 --- a/source/Simulator/SandSimulator.h +++ b/source/Simulator/SandSimulator.h @@ -2,32 +2,62 @@ #pragma once #include "Simulator.h" -#include "../BlockEntity.h" -#include "../Vector3i.h" -class cSandSimulator : public cSimulator +/// Despite the class name, this simulator takes care of all blocks that fall when suspended in the air. +class cSandSimulator : + public cSimulator { public: - cSandSimulator(cWorld & a_World); - ~cSandSimulator(); - - virtual void Simulate( float a_Dt ) override; - - virtual bool IsAllowedBlock( BLOCKTYPE a_BlockType ) override; - virtual bool IsPassable( BLOCKTYPE a_BlockType ); + cSandSimulator(cWorld & a_World, cIniFile & a_IniFile); + + // cSimulator overrides: + virtual void Simulate(float a_Dt) override {} // Unused in this simulator + virtual void SimulateChunk(float a_Dt, int a_ChunkX, int a_ChunkZ, cChunk * a_Chunk) override; + virtual bool IsAllowedBlock(BLOCKTYPE a_BlockType) override; + + /// Returns true if a falling-able block can start falling through the specified block type + static bool CanStartFallingThrough(BLOCKTYPE a_BlockType); + + /// Returns true if an already-falling block can pass through the specified block type (e. g. torch) + static bool CanContinueFallThrough(BLOCKTYPE a_BlockType); + + /// Returns true if the falling block rematerializing will replace the specified block type (e. g. tall grass) + static bool IsReplacedOnRematerialization(BLOCKTYPE a_BlockType); + + /// Returns true if the specified block breaks falling blocks while they fall through it (e. g. halfslabs) + static bool DoesBreakFallingThrough(BLOCKTYPE a_BlockType); + + /** Called when a block finishes falling at the specified coords, either by insta-fall, + or through cFallingBlock entity. + It either rematerializes the block (a_FallingBlockType) at the specified coords, or creates a pickup, + based on the block currently present in the world at the dest specified coords + */ + static void FinishFalling( + cWorld * a_World, int a_BlockX, int a_BlockY, int a_BlockZ, + BLOCKTYPE a_FallingBlockType, NIBBLETYPE a_FallingBlockMeta + ); protected: + bool m_IsInstantFall; // If set to true, blocks don't fall using cFallingBlock entity, but instantly instead + + int m_TotalBlocks; // Total number of blocks currently in the queue for simulating + virtual void AddBlock(int a_BlockX, int a_BlockY, int a_BlockZ, cChunk * a_Chunk) override; - - typedef std::list <Vector3i> BlockList; - BlockList * m_Blocks; - BlockList * m_Buffer; + + /// Performs the instant fall of the block - removes it from top, Finishes it at the bottom + void DoInstantFall(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ); }; +/// Per-chunk data for the simulator, specified individual chunks to simulate; Data is not used +typedef cCoordWithIntList cSandSimulatorChunkData; + + + + |