Cuberite
A lightweight, fast and extensible game server for Minecraft
BlockHandler.h
Go to the documentation of this file.
1 
2 #pragma once
3 
4 #include "../Defines.h"
5 #include "../Item.h"
6 #include "../BoundingBox.h"
7 
8 
9 
10 
11 
12 // fwd:
13 class cPlayer;
14 class cChunk;
16 class cChunkInterface;
17 class cWorld;
18 class cWorldInterface;
19 class cItems;
20 
21 
22 
23 
24 
26 {
27 public:
28 
29  constexpr cBlockHandler(BLOCKTYPE a_BlockType) :
30  m_BlockType(a_BlockType)
31  {
32  }
33 
36  virtual void OnUpdate(
37  cChunkInterface & a_ChunkInterface,
38  cWorldInterface & a_WorldInterface,
39  cBlockPluginInterface & a_BlockPluginInterface,
40  cChunk & a_Chunk,
41  const Vector3i a_RelPos
42  ) const;
43 
47  virtual cBoundingBox GetPlacementCollisionBox(BLOCKTYPE a_XM, BLOCKTYPE a_XP, BLOCKTYPE a_YM, BLOCKTYPE a_YP, BLOCKTYPE a_ZM, BLOCKTYPE a_ZP) const;
48 
50  virtual void OnPlaced(
51  cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface,
52  Vector3i a_BlockPos,
53  BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta
54  ) const {}
55 
60  virtual void OnBroken(
61  cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface,
62  Vector3i a_BlockPos,
63  BLOCKTYPE a_OldBlockType, NIBBLETYPE a_OldBlockMeta,
64  const cEntity * a_Digger
65  ) const {}
66 
71  virtual void OnNeighborChanged(cChunkInterface & a_ChunkInterface, Vector3i a_BlockPos, eBlockFace a_WhichNeighbor) const;
72 
78  static void NeighborChanged(cChunkInterface & a_ChunkInterface, Vector3i a_NeighborPos, eBlockFace a_WhichNeighbor);
79 
81  virtual void OnDigging(
82  cChunkInterface & a_ChunkInterface,
83  cWorldInterface & a_WorldInterface,
84  cPlayer & a_Player,
85  const Vector3i a_BlockPos
86  ) const
87  {
88  }
89 
93  virtual bool OnUse(
94  cChunkInterface & a_ChunkInterface,
95  cWorldInterface & a_WorldInterface,
96  cPlayer & a_Player,
97  const Vector3i a_BlockPos,
98  eBlockFace a_BlockFace,
99  const Vector3i a_CursorPos
100  ) const
101  {
102  return false;
103  }
104 
107  virtual void OnCancelRightClick(
108  cChunkInterface & a_ChunkInterface,
109  cWorldInterface & a_WorldInterface,
110  cPlayer & a_Player,
111  const Vector3i a_BlockPos,
112  eBlockFace a_BlockFace
113  ) const
114  {
115  }
116 
122  virtual cItems ConvertToPickups(NIBBLETYPE a_BlockMeta, const cItem * a_Tool = nullptr) const;
123 
125  virtual bool CanBeAt(const cChunk & a_Chunk, Vector3i a_Position, NIBBLETYPE a_Meta) const;
126 
128  virtual bool CanSustainPlant(BLOCKTYPE a_Plant) const { return false; }
129 
132  virtual bool IsUseable(void) const;
133 
139  virtual bool DoesIgnoreBuildCollision(const cWorld & a_World, const cItem & a_HeldItem, Vector3i a_Position, NIBBLETYPE a_Meta, eBlockFace a_ClickedBlockFace, bool a_ClickedDirectly) const;
140 
143  virtual bool IsInsideBlock(const Vector3d a_RelPosition, const NIBBLETYPE a_BlockMeta) const;
144 
148  void Check(
149  cChunkInterface & ChunkInterface, cBlockPluginInterface & a_PluginInterface,
150  Vector3i a_RelPos,
151  cChunk & a_Chunk
152  ) const;
153 
155  virtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const;
156 
159  virtual NIBBLETYPE MetaRotateCCW(NIBBLETYPE a_Meta) const { return a_Meta; }
160 
163  virtual NIBBLETYPE MetaRotateCW(NIBBLETYPE a_Meta) const { return a_Meta; }
164 
167  virtual NIBBLETYPE MetaMirrorXY(NIBBLETYPE a_Meta) const { return a_Meta; }
168 
171  virtual NIBBLETYPE MetaMirrorXZ(NIBBLETYPE a_Meta) const { return a_Meta; }
172 
175  virtual NIBBLETYPE MetaMirrorYZ(NIBBLETYPE a_Meta) const { return a_Meta; }
176 
179  virtual int Grow(cChunk & a_Chunk, Vector3i a_RelPos, int a_NumStages = 1) const { return 0; }
180 
183  static bool ToolHasSilkTouch(const cItem * a_Tool);
184 
187  static unsigned char ToolFortuneLevel(const cItem * a_Tool);
188 
196  static char FortuneDiscreteRandom(char a_MinDrop, char a_DefaultMax, unsigned char a_BonusMax, char a_DropCap = 25);
197 
198  // Gets the blockhandler for the given block type.
199  static const cBlockHandler & For(BLOCKTYPE a_BlockType);
200 
201 protected:
202 
203  ~cBlockHandler() = default;
204 
206 };
cBlockHandler::OnDigging
virtual void OnDigging(cChunkInterface &a_ChunkInterface, cWorldInterface &a_WorldInterface, cPlayer &a_Player, const Vector3i a_BlockPos) const
Called when the player starts digging the block.
Definition: BlockHandler.h:81
cBlockHandler::ToolHasSilkTouch
static bool ToolHasSilkTouch(const cItem *a_Tool)
Returns true if the specified tool is valid and has a non-zero silk-touch enchantment.
Definition: BlockHandler.cpp:593
cBlockHandler::m_BlockType
const BLOCKTYPE m_BlockType
Definition: BlockHandler.h:205
cBlockHandler::ConvertToPickups
virtual cItems ConvertToPickups(NIBBLETYPE a_BlockMeta, const cItem *a_Tool=nullptr) const
Returns the pickups that would result if the block was mined by a_Digger using a_Tool.
Definition: BlockHandler.cpp:501
cBoundingBox
Represents two sets of coords, minimum and maximum for each direction.
Definition: BoundingBox.h:23
cBlockHandler::IsUseable
virtual bool IsUseable(void) const
Called to check whether this block supports a rclk action.
Definition: BlockHandler.cpp:522
cBlockHandler::MetaMirrorXY
virtual NIBBLETYPE MetaMirrorXY(NIBBLETYPE a_Meta) const
Mirrors a given block meta around the XY plane.
Definition: BlockHandler.h:167
cBlockHandler::GetMapBaseColourID
virtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) const
Returns the base colour ID of the block, as will be represented on a map, as per documentation: https...
Definition: BlockHandler.cpp:583
cBlockHandler::~cBlockHandler
~cBlockHandler()=default
cBlockHandler
Definition: BlockHandler.h:25
ColourID
Byte ColourID
Definition: Globals.h:159
cWorldInterface
Definition: WorldInterface.h:19
cBlockHandler::CanBeAt
virtual bool CanBeAt(const cChunk &a_Chunk, Vector3i a_Position, NIBBLETYPE a_Meta) const
Checks if the block can stay at the specified relative coords in the chunk.
Definition: BlockHandler.cpp:513
cBlockHandler::OnCancelRightClick
virtual void OnCancelRightClick(cChunkInterface &a_ChunkInterface, cWorldInterface &a_WorldInterface, cPlayer &a_Player, const Vector3i a_BlockPos, eBlockFace a_BlockFace) const
Called when a right click to this block is cancelled.
Definition: BlockHandler.h:107
NIBBLETYPE
unsigned char NIBBLETYPE
The datatype used by nibbledata (meta, light, skylight)
Definition: ChunkDef.h:44
cBlockHandler::OnUse
virtual bool OnUse(cChunkInterface &a_ChunkInterface, cWorldInterface &a_WorldInterface, cPlayer &a_Player, const Vector3i a_BlockPos, eBlockFace a_BlockFace, const Vector3i a_CursorPos) const
Called when the user right clicks the block and the block is useable.
Definition: BlockHandler.h:93
cBlockHandler::For
static const cBlockHandler & For(BLOCKTYPE a_BlockType)
Definition: BlockHandler.cpp:631
cBlockHandler::FortuneDiscreteRandom
static char FortuneDiscreteRandom(char a_MinDrop, char a_DefaultMax, unsigned char a_BonusMax, char a_DropCap=25)
Returns a random number of drops taking into account fortune.
Definition: BlockHandler.cpp:618
cChunkInterface
Definition: ChunkInterface.h:21
cBlockHandler::OnUpdate
virtual void OnUpdate(cChunkInterface &a_ChunkInterface, cWorldInterface &a_WorldInterface, cBlockPluginInterface &a_BlockPluginInterface, cChunk &a_Chunk, const Vector3i a_RelPos) const
Called when the block gets ticked either by a random tick or by a queued tick.
Definition: BlockHandler.cpp:459
cWorld
Definition: World.h:47
cBlockPluginInterface
This interface is used to decouple block handlers from the cPluginManager dependency through cWorld.
Definition: BlockPluginInterface.h:27
cBlockHandler::MetaMirrorYZ
virtual NIBBLETYPE MetaMirrorYZ(NIBBLETYPE a_Meta) const
Mirros a given block meta around the YZ plane.
Definition: BlockHandler.h:175
cItem
Definition: Item.h:36
cBlockHandler::MetaRotateCCW
virtual NIBBLETYPE MetaRotateCCW(NIBBLETYPE a_Meta) const
Rotates a given block meta counter-clockwise.
Definition: BlockHandler.h:159
cBlockHandler::NeighborChanged
static void NeighborChanged(cChunkInterface &a_ChunkInterface, Vector3i a_NeighborPos, eBlockFace a_WhichNeighbor)
Notifies the specified neighbor that the current block has changed.
Definition: BlockHandler.cpp:487
cBlockHandler::DoesIgnoreBuildCollision
virtual bool DoesIgnoreBuildCollision(const cWorld &a_World, const cItem &a_HeldItem, Vector3i a_Position, NIBBLETYPE a_Meta, eBlockFace a_ClickedBlockFace, bool a_ClickedDirectly) const
Checks if the player can build "inside" this block.
Definition: BlockHandler.cpp:531
cBlockHandler::OnBroken
virtual void OnBroken(cChunkInterface &a_ChunkInterface, cWorldInterface &a_WorldInterface, Vector3i a_BlockPos, BLOCKTYPE a_OldBlockType, NIBBLETYPE a_OldBlockMeta, const cEntity *a_Digger) const
Called after a block gets broken (replaced with air), by natural means.
Definition: BlockHandler.h:60
cBlockHandler::OnPlaced
virtual void OnPlaced(cChunkInterface &a_ChunkInterface, cWorldInterface &a_WorldInterface, Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) const
Called by cWorld::SetBlock() after the block has been set.
Definition: BlockHandler.h:50
cItems
This class bridges a vector of cItem for safe access via Lua.
Definition: Item.h:213
BLOCKTYPE
unsigned char BLOCKTYPE
The datatype used by blockdata.
Definition: ChunkDef.h:41
cBlockHandler::Check
void Check(cChunkInterface &ChunkInterface, cBlockPluginInterface &a_PluginInterface, Vector3i a_RelPos, cChunk &a_Chunk) const
Called when one of the neighbors gets set; equivalent to MC block update.
Definition: BlockHandler.cpp:564
eBlockFace
eBlockFace
Block face constants, used in PlayerDigging and PlayerBlockPlacement packets and bbox collision calc.
Definition: Defines.h:37
cChunk
Definition: Chunk.h:35
cEntity
Definition: Entity.h:75
cPlayer
Definition: Player.h:27
cBlockHandler::MetaRotateCW
virtual NIBBLETYPE MetaRotateCW(NIBBLETYPE a_Meta) const
Rotates a given block meta clockwise.
Definition: BlockHandler.h:163
cBlockHandler::OnNeighborChanged
virtual void OnNeighborChanged(cChunkInterface &a_ChunkInterface, Vector3i a_BlockPos, eBlockFace a_WhichNeighbor) const
Called when a direct neighbor of this block has been changed.
Definition: BlockHandler.cpp:473
cBlockHandler::MetaMirrorXZ
virtual NIBBLETYPE MetaMirrorXZ(NIBBLETYPE a_Meta) const
Mirros a given block meta around the XZ plane.
Definition: BlockHandler.h:171
cBlockHandler::CanSustainPlant
virtual bool CanSustainPlant(BLOCKTYPE a_Plant) const
Checks whether the block has an effect on growing the plant.
Definition: BlockHandler.h:128
cBlockHandler::GetPlacementCollisionBox
virtual cBoundingBox GetPlacementCollisionBox(BLOCKTYPE a_XM, BLOCKTYPE a_XP, BLOCKTYPE a_YM, BLOCKTYPE a_YP, BLOCKTYPE a_ZM, BLOCKTYPE a_ZP) const
Returns the relative bounding box that must be entity-free in order for the block to be placed.
Definition: BlockHandler.cpp:550
Vector3
Definition: Vector3.h:10
cBlockHandler::Grow
virtual int Grow(cChunk &a_Chunk, Vector3i a_RelPos, int a_NumStages=1) const
Grows this block, if it supports growing, by the specified amount of stages (at most).
Definition: BlockHandler.h:179
cBlockHandler::ToolFortuneLevel
static unsigned char ToolFortuneLevel(const cItem *a_Tool)
Returns the fortune level of a tool, if it is a valid tool.
Definition: BlockHandler.cpp:602
cBlockHandler::cBlockHandler
constexpr cBlockHandler(BLOCKTYPE a_BlockType)
Definition: BlockHandler.h:29
cBlockHandler::IsInsideBlock
virtual bool IsInsideBlock(const Vector3d a_RelPosition, const NIBBLETYPE a_BlockMeta) const
Tests if a_RelPosition is inside the block, where a_RelPosition is relative to the origin of the bloc...
Definition: BlockHandler.cpp:540