Cuberite
A lightweight, fast and extensible game server for Minecraft
Minecart.h
Go to the documentation of this file.
1 
2 // Minecart.h
3 
4 // Declares the cMinecart class representing a minecart in the world
5 
6 
7 
8 
9 
10 #pragma once
11 
12 #include "Entity.h"
13 #include "../World.h"
14 #include "../UI/WindowOwner.h"
15 
16 
17 
18 
19 
20 class cMinecart :
21  public cEntity
22 {
23  using super = cEntity;
24 
25 public:
27 
28 
29  enum ePayload
30  {
31  mpNone = 0, // Empty minecart, ridable by player or mobs
32  mpChest = 1, // Minecart-with-chest, can store a grid of 3 * 8 items
33  mpFurnace = 2, // Minecart-with-furnace, can be powered
34  mpTNT = 3, // Minecart-with-TNT, can be blown up with activator rail
35  mpHopper = 5, // Minecart-with-hopper, can be hopper
36  // TODO: Spawner minecarts, (and possibly any block in a minecart with NBT editing)
37  } ;
38 
39  // cEntity overrides:
40  virtual void SpawnOn(cClientHandle & a_ClientHandle) override;
41  virtual void HandlePhysics(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;
42  virtual bool DoTakeDamage(TakeDamageInfo & TDI) override;
43  virtual void Destroyed() override;
44 
45  int LastDamage(void) const { return m_LastDamage; }
46  ePayload GetPayload(void) const { return m_Payload; }
47 
48 
49 protected:
50 
55 
57  void ApplyAcceleration(Vector3d a_ForwardDirection, double a_Acceleration);
58 
59  // Overwrite to enforce speed limit
60  virtual void DoSetSpeed(double a_SpeedX, double a_SpeedY, double a_SpeedZ) override;
61 
62  cMinecart(ePayload a_Payload, Vector3d a_Pos);
63 
66  void HandleRailPhysics(NIBBLETYPE a_RailMeta, std::chrono::milliseconds a_Dt);
67 
71  void HandlePoweredRailPhysics(NIBBLETYPE a_RailMeta);
72 
76  void HandleDetectorRailPhysics(NIBBLETYPE a_RailMeta, std::chrono::milliseconds a_Dt);
77 
79  void HandleActivatorRailPhysics(NIBBLETYPE a_RailMeta, std::chrono::milliseconds a_Dt);
80 
83  void SnapToRail(NIBBLETYPE a_RailMeta);
85  bool TestBlockCollision(NIBBLETYPE a_RailMeta);
87  bool IsSolidBlockAtOffset(int a_XOffset, int a_YOffset, int a_ZOffset);
89  bool TestEntityCollision(NIBBLETYPE a_RailMeta);
90 
91 } ;
92 
93 
94 
95 
96 
98  public cMinecart
99 {
100  using super = cMinecart;
101 
102 public:
103 
105 
106  cRideableMinecart(Vector3d a_Pos, const cItem & a_Content, int a_Height);
107 
108  const cItem & GetContent(void) const {return m_Content;}
109  int GetBlockHeight(void) const {return m_Height;}
110 
111  // cEntity overrides:
112  virtual void OnRightClicked(cPlayer & a_Player) override;
113 
114 protected:
115 
116 
118  int m_Height;
119 } ;
120 
121 
122 
123 
124 
126  public cMinecart,
127  public cItemGrid::cListener,
128  public cEntityWindowOwner
129 {
130  using super = cMinecart;
131 
132 public:
133 
135 
137 
138  enum
139  {
140  ContentsHeight = 3,
141  ContentsWidth = 9,
142  };
143 
144  const cItem & GetSlot(int a_Idx) const { return m_Contents.GetSlot(a_Idx); }
145  void SetSlot(int a_Idx, const cItem & a_Item) { m_Contents.SetSlot(a_Idx, a_Item); }
146 
147 
148 protected:
149 
151  void OpenNewWindow(void);
152  virtual void Destroyed() override;
153 
154  // cItemGrid::cListener overrides:
155  virtual void OnSlotChanged(cItemGrid * a_Grid, int a_SlotNum) override
156  {
157  UNUSED(a_SlotNum);
158  ASSERT(a_Grid == &m_Contents);
159  if (m_World != nullptr)
160  {
161  if (GetWindow() != nullptr)
162  {
163  GetWindow()->BroadcastWholeWindow();
164  }
165 
167  }
168  }
169 
170  // cEntity overrides:
171  virtual void OnRightClicked(cPlayer & a_Player) override;
172 } ;
173 
174 
175 
176 
177 
179  public cMinecart
180 {
181  using super = cMinecart;
182 
183 public:
184 
186 
188 
189  // cEntity overrides:
190  virtual void OnRightClicked(cPlayer & a_Player) override;
191  virtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;
192 
193  // Set functions.
194  void SetIsFueled(bool a_IsFueled, int a_FueledTimeLeft = -1) {m_IsFueled = a_IsFueled; m_FueledTimeLeft = a_FueledTimeLeft;}
195 
196  // Get functions.
197  int GetFueledTimeLeft(void) const {return m_FueledTimeLeft; }
198  bool IsFueled (void) const {return m_IsFueled;}
199 
200 private:
201 
204 
205 } ;
206 
207 
208 
209 
210 
212  public cMinecart
213 {
214  using super = cMinecart;
215 
216 public:
218 
219  cMinecartWithTNT(Vector3d a_Pos);
220 } ;
221 
222 
223 
224 
225 
227  public cMinecart
228 {
229  using super = cMinecart;
230 
231 public:
232 
234 
236 } ;
int GetChunkZ(void) const
Definition: Entity.h:219
Definition: FastNBT.h:131
virtual void DoSetSpeed(double a_SpeedX, double a_SpeedY, double a_SpeedZ) override
Does the actual speed-setting.
Definition: Minecart.cpp:1120
bool TestBlockCollision(NIBBLETYPE a_RailMeta)
Tests if a solid block is in front of a cart, and stops the cart (and returns true) if so; returns fa...
Definition: Minecart.cpp:740
virtual void HandlePhysics(std::chrono::milliseconds a_Dt, cChunk &a_Chunk) override
Handles the physics of the entity - updates position based on speed, updates speed based on environme...
Definition: Minecart.cpp:126
const cItem & GetSlot(int a_Idx) const
Definition: Minecart.h:144
virtual void OnSlotChanged(cItemGrid *a_Grid, int a_SlotNum) override
Called whenever a slot changes.
Definition: Minecart.h:155
ePayload GetPayload(void) const
Definition: Minecart.h:46
int m_LastDamage
Definition: Minecart.h:52
cWorld * m_World
Definition: Entity.h:620
Definition: Player.h:27
void HandlePoweredRailPhysics(NIBBLETYPE a_RailMeta)
Handles powered rail physics Each tick, speed up or slow down cart, depending on metadata of rail (po...
Definition: Minecart.cpp:410
virtual void SpawnOn(cClientHandle &a_ClientHandle) override
Descendants override this function to send a command to the specified client to spawn the entity on t...
Definition: Minecart.cpp:116
int LastDamage(void) const
Definition: Minecart.h:45
unsigned char NIBBLETYPE
The datatype used by nibbledata (meta, light, skylight)
Definition: ChunkDef.h:45
void HandleDetectorRailPhysics(NIBBLETYPE a_RailMeta, std::chrono::milliseconds a_Dt)
Handles detector rail activation Activates detector rails when a minecart is on them.
Definition: Minecart.cpp:576
This class is used as a callback for when a slot changes.
Definition: ItemGrid.h:25
Definition: Chunk.h:49
cMinecart(ePayload a_Payload, Vector3d a_Pos)
Definition: Minecart.cpp:96
void MarkChunkDirty(int a_ChunkX, int a_ChunkZ)
Definition: World.cpp:2260
int GetFueledTimeLeft(void) const
Definition: Minecart.h:197
double m_Height
Height of the entity (Y axis)
Definition: Entity.h:724
void SnapToRail(NIBBLETYPE a_RailMeta)
Snaps a mincecart to a rail's axis, resetting its speed For curved rails, it changes the cart's direc...
Definition: Minecart.cpp:597
int GetBlockHeight(void) const
Definition: Minecart.h:109
ePayload
Minecart payload, values correspond to packet subtype.
Definition: Minecart.h:29
bool TestEntityCollision(NIBBLETYPE a_RailMeta)
Tests if this mincecart's bounding box is intersecting another entity's bounding box (collision) and ...
Definition: Minecart.cpp:878
void HandleActivatorRailPhysics(NIBBLETYPE a_RailMeta, std::chrono::milliseconds a_Dt)
Handles activator rails - placeholder for future implementation.
Definition: Minecart.cpp:588
virtual bool DoTakeDamage(TakeDamageInfo &TDI) override
Makes this entity take damage specified in the a_TDI.
Definition: Minecart.cpp:1039
#define ASSERT(x)
Definition: Globals.h:335
#define UNUSED
Definition: Globals.h:152
virtual void OnRightClicked(cPlayer &a_Player)
Called when the specified player right-clicks this entity.
Definition: Entity.h:523
bool IsSolidBlockAtOffset(int a_XOffset, int a_YOffset, int a_ZOffset)
Tests if a solid block is at a specific offset of the minecart position.
Definition: Minecart.cpp:726
int GetChunkX(void) const
Definition: Entity.h:218
bool IsFueled(void) const
Definition: Minecart.h:198
void ApplyAcceleration(Vector3d a_ForwardDirection, double a_Acceleration)
Applies an acceleration to the minecart parallel to a_ForwardDirection but without allowing backward ...
Definition: Minecart.cpp:1100
Definition: Entity.h:73
cEntity(eEntityType a_EntityType, Vector3d a_Pos, double a_Width, double a_Height)
Definition: Entity.cpp:35
virtual void Destroyed() override
Definition: Minecart.cpp:1154
bool m_bIsOnDetectorRail
Definition: Minecart.h:54
Vector3i m_DetectorRailPosition
Definition: Minecart.h:53
#define CLASS_PROTODEF(classname)
Definition: Entity.h:11
void SetSlot(int a_Idx, const cItem &a_Item)
Definition: Minecart.h:145
Definition: Item.h:36
Window owner that is associated with an entity (chest minecart etc.)
Definition: WindowOwner.h:80
cItemGrid m_Contents
Definition: Minecart.h:150
virtual void Tick(std::chrono::milliseconds a_Dt, cChunk &a_Chunk)
Definition: Entity.cpp:841
ePayload m_Payload
Definition: Minecart.h:51
void HandleRailPhysics(NIBBLETYPE a_RailMeta, std::chrono::milliseconds a_Dt)
Handles physics on normal rails For each tick, slow down on flat rails, speed up or slow down on asce...
Definition: Minecart.cpp:216