summaryrefslogtreecommitdiffstats
path: root/source/BlockEntities
diff options
context:
space:
mode:
authorDaniel O'Brien <marmot.daniel@gmail.com>2013-11-15 08:25:20 +0100
committerDaniel O'Brien <marmot.daniel@gmail.com>2013-11-15 08:25:20 +0100
commitaf17faac45f8ecbfc3af64231b65d66872af3301 (patch)
treea8864aef4d4a9036249170602164927b9ca99d58 /source/BlockEntities
parentcProtocol add SendExperience() and debugging (diff)
parentMerge pull request #349 from SamJBarney/master (diff)
downloadcuberite-af17faac45f8ecbfc3af64231b65d66872af3301.tar
cuberite-af17faac45f8ecbfc3af64231b65d66872af3301.tar.gz
cuberite-af17faac45f8ecbfc3af64231b65d66872af3301.tar.bz2
cuberite-af17faac45f8ecbfc3af64231b65d66872af3301.tar.lz
cuberite-af17faac45f8ecbfc3af64231b65d66872af3301.tar.xz
cuberite-af17faac45f8ecbfc3af64231b65d66872af3301.tar.zst
cuberite-af17faac45f8ecbfc3af64231b65d66872af3301.zip
Diffstat (limited to 'source/BlockEntities')
-rw-r--r--source/BlockEntities/BlockEntity.cpp44
-rw-r--r--source/BlockEntities/BlockEntity.h5
-rw-r--r--source/BlockEntities/JukeboxEntity.cpp34
-rw-r--r--source/BlockEntities/JukeboxEntity.h31
-rw-r--r--source/BlockEntities/NoteEntity.cpp27
-rw-r--r--source/BlockEntities/NoteEntity.h33
-rw-r--r--source/BlockEntities/SignEntity.cpp62
-rw-r--r--source/BlockEntities/SignEntity.h43
8 files changed, 186 insertions, 93 deletions
diff --git a/source/BlockEntities/BlockEntity.cpp b/source/BlockEntities/BlockEntity.cpp
new file mode 100644
index 000000000..41a488717
--- /dev/null
+++ b/source/BlockEntities/BlockEntity.cpp
@@ -0,0 +1,44 @@
+
+// BlockEntity.cpp
+
+// Implements the cBlockEntity class that is the common ancestor for all block entities
+
+#include "Globals.h"
+#include "BlockEntity.h"
+#include "ChestEntity.h"
+#include "DispenserEntity.h"
+#include "DropperEntity.h"
+#include "FurnaceEntity.h"
+#include "HopperEntity.h"
+#include "JukeboxEntity.h"
+#include "NoteEntity.h"
+#include "SignEntity.h"
+
+
+
+
+
+cBlockEntity * cBlockEntity::CreateByBlockType(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, int a_BlockX, int a_BlockY, int a_BlockZ, cWorld * a_World)
+{
+ switch (a_BlockType)
+ {
+ case E_BLOCK_CHEST: return new cChestEntity (a_BlockX, a_BlockY, a_BlockZ, a_World);
+ case E_BLOCK_DISPENSER: return new cDispenserEntity(a_BlockX, a_BlockY, a_BlockZ, a_World);
+ case E_BLOCK_DROPPER: return new cDropperEntity (a_BlockX, a_BlockY, a_BlockZ, a_World);
+ case E_BLOCK_LIT_FURNACE: return new cFurnaceEntity (a_BlockX, a_BlockY, a_BlockZ, a_BlockType, a_BlockMeta, a_World);
+ case E_BLOCK_FURNACE: return new cFurnaceEntity (a_BlockX, a_BlockY, a_BlockZ, a_BlockType, a_BlockMeta, a_World);
+ case E_BLOCK_HOPPER: return new cHopperEntity (a_BlockX, a_BlockY, a_BlockZ, a_World);
+ case E_BLOCK_SIGN_POST: return new cSignEntity (a_BlockType, a_BlockX, a_BlockY, a_BlockZ, a_World);
+ case E_BLOCK_WALLSIGN: return new cSignEntity (a_BlockType, a_BlockX, a_BlockY, a_BlockZ, a_World);
+ case E_BLOCK_NOTE_BLOCK: return new cNoteEntity (a_BlockX, a_BlockY, a_BlockZ, a_World);
+ case E_BLOCK_JUKEBOX: return new cJukeboxEntity (a_BlockX, a_BlockY, a_BlockZ, a_World);
+ }
+ LOGD("%s: Requesting creation of an unknown block entity - block type %d (%s)",
+ __FUNCTION__, a_BlockType, ItemTypeToString(a_BlockType).c_str()
+ );
+ return NULL;
+}
+
+
+
+
diff --git a/source/BlockEntities/BlockEntity.h b/source/BlockEntities/BlockEntity.h
index ab7d7f5dc..6a6ffb448 100644
--- a/source/BlockEntities/BlockEntity.h
+++ b/source/BlockEntities/BlockEntity.h
@@ -49,6 +49,11 @@ public:
// tolua_begin
+ /// Creates a new block entity for the specified block type
+ /// If a_World is valid, then the entity is created bound to that world
+ /// Returns NULL for unknown block types
+ static cBlockEntity * CreateByBlockType(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, int a_BlockX, int a_BlockY, int a_BlockZ, cWorld * a_World = NULL);
+
// Position, in absolute block coordinates:
int GetPosX(void) const { return m_PosX; }
int GetPosY(void) const { return m_PosY; }
diff --git a/source/BlockEntities/JukeboxEntity.cpp b/source/BlockEntities/JukeboxEntity.cpp
index 1288719f6..aca376dd3 100644
--- a/source/BlockEntities/JukeboxEntity.cpp
+++ b/source/BlockEntities/JukeboxEntity.cpp
@@ -9,9 +9,9 @@
-cJukeboxEntity::cJukeboxEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cWorld * a_World)
- : cBlockEntity(E_BLOCK_JUKEBOX, a_BlockX, a_BlockY, a_BlockZ, a_World)
- , m_Record( 0 )
+cJukeboxEntity::cJukeboxEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cWorld * a_World) :
+ super(E_BLOCK_JUKEBOX, a_BlockX, a_BlockY, a_BlockZ, a_World),
+ m_Record(0)
{
}
@@ -21,11 +21,7 @@ cJukeboxEntity::cJukeboxEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cWorld
cJukeboxEntity::~cJukeboxEntity()
{
- if (m_Record >= 2256 && m_Record <= 2267)
- {
- EjectRecord();
- m_Record = 0;
- }
+ EjectRecord();
}
@@ -44,10 +40,9 @@ void cJukeboxEntity::UsedBy(cPlayer * a_Player)
PlayRecord();
}
}
- else if (m_Record >= 2256 && m_Record <= 2267)
+ else
{
EjectRecord();
- m_Record = 0;
}
}
@@ -55,7 +50,7 @@ void cJukeboxEntity::UsedBy(cPlayer * a_Player)
-void cJukeboxEntity::PlayRecord( void )
+void cJukeboxEntity::PlayRecord(void)
{
m_World->BroadcastSoundParticleEffect(1005, m_PosX, m_PosY, m_PosZ, m_Record);
}
@@ -64,19 +59,26 @@ void cJukeboxEntity::PlayRecord( void )
-void cJukeboxEntity::EjectRecord( void )
+void cJukeboxEntity::EjectRecord(void)
{
+ if ((m_Record < E_ITEM_FIRST_DISC) || (m_Record > E_ITEM_LAST_DISC))
+ {
+ // There's no record here
+ return;
+ }
+
cItems Drops;
Drops.push_back(cItem(m_Record, 1, 0));
m_World->SpawnItemPickups(Drops, m_PosX + 0.5, m_PosY + 1, m_PosZ + 0.5, 8);
m_World->BroadcastSoundParticleEffect(1005, m_PosX, m_PosY, m_PosZ, 0);
+ m_Record = 0;
}
-int cJukeboxEntity::GetRecord( void )
+int cJukeboxEntity::GetRecord(void)
{
return m_Record;
}
@@ -85,7 +87,7 @@ int cJukeboxEntity::GetRecord( void )
-void cJukeboxEntity::SetRecord( int a_Record )
+void cJukeboxEntity::SetRecord(int a_Record)
{
m_Record = a_Record;
}
@@ -94,7 +96,7 @@ void cJukeboxEntity::SetRecord( int a_Record )
-bool cJukeboxEntity::LoadFromJson( const Json::Value & a_Value )
+bool cJukeboxEntity::LoadFromJson(const Json::Value & a_Value)
{
m_PosX = a_Value.get("x", 0).asInt();
m_PosY = a_Value.get("y", 0).asInt();
@@ -109,7 +111,7 @@ bool cJukeboxEntity::LoadFromJson( const Json::Value & a_Value )
-void cJukeboxEntity::SaveToJson( Json::Value & a_Value )
+void cJukeboxEntity::SaveToJson(Json::Value & a_Value)
{
a_Value["x"] = m_PosX;
a_Value["y"] = m_PosY;
diff --git a/source/BlockEntities/JukeboxEntity.h b/source/BlockEntities/JukeboxEntity.h
index 38574c945..fcafdc479 100644
--- a/source/BlockEntities/JukeboxEntity.h
+++ b/source/BlockEntities/JukeboxEntity.h
@@ -17,26 +17,39 @@ namespace Json
+// tolua_begin
+
class cJukeboxEntity :
public cBlockEntity
{
+ typedef cBlockEntity super;
public:
+
+ // tolua_end
+
cJukeboxEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cWorld * a_World);
virtual ~cJukeboxEntity();
- bool LoadFromJson( const Json::Value& a_Value );
- virtual void SaveToJson( Json::Value& a_Value ) override;
-
- int GetRecord( void );
- void SetRecord( int a_Record );
- void PlayRecord( void );
- void EjectRecord( void );
- virtual void UsedBy( cPlayer * a_Player ) override;
+ bool LoadFromJson(const Json::Value & a_Value);
+ virtual void SaveToJson(Json::Value & a_Value) override;
+
+ // tolua_begin
+
+ int GetRecord(void);
+ void SetRecord(int a_Record);
+ void PlayRecord(void);
+
+ /// Ejects the currently held record as a pickup. Does nothing when no record inserted.
+ void EjectRecord(void);
+
+ // tolua_end
+
+ virtual void UsedBy(cPlayer * a_Player) override;
virtual void SendTo(cClientHandle & a_Client) override { };
private:
int m_Record;
-};
+} ; // tolua_end
diff --git a/source/BlockEntities/NoteEntity.cpp b/source/BlockEntities/NoteEntity.cpp
index 6dc0e20a1..1b0620299 100644
--- a/source/BlockEntities/NoteEntity.cpp
+++ b/source/BlockEntities/NoteEntity.cpp
@@ -6,17 +6,12 @@
#include <json/json.h>
-cNoteEntity::cNoteEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cWorld * a_World)
- : cBlockEntity(E_BLOCK_NOTE_BLOCK, a_BlockX, a_BlockY, a_BlockZ, a_World)
- , m_Pitch( 0 )
-{
-}
-
-
-cNoteEntity::~cNoteEntity()
+cNoteEntity::cNoteEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cWorld * a_World) :
+ super(E_BLOCK_NOTE_BLOCK, a_BlockX, a_BlockY, a_BlockZ, a_World),
+ m_Pitch(0)
{
}
@@ -24,7 +19,7 @@ cNoteEntity::~cNoteEntity()
-void cNoteEntity::UsedBy( cPlayer * a_Player )
+void cNoteEntity::UsedBy(cPlayer * a_Player)
{
IncrementPitch();
MakeSound();
@@ -34,7 +29,7 @@ void cNoteEntity::UsedBy( cPlayer * a_Player )
-void cNoteEntity::MakeSound( void )
+void cNoteEntity::MakeSound(void)
{
char instrument;
AString sampleName;
@@ -102,7 +97,7 @@ void cNoteEntity::MakeSound( void )
-char cNoteEntity::GetPitch( void )
+char cNoteEntity::GetPitch(void)
{
return m_Pitch;
}
@@ -111,7 +106,7 @@ char cNoteEntity::GetPitch( void )
-void cNoteEntity::SetPitch( char a_Pitch )
+void cNoteEntity::SetPitch(char a_Pitch)
{
m_Pitch = a_Pitch % 25;
}
@@ -120,16 +115,16 @@ void cNoteEntity::SetPitch( char a_Pitch )
-void cNoteEntity::IncrementPitch( void )
+void cNoteEntity::IncrementPitch(void)
{
- SetPitch( m_Pitch + 1 );
+ SetPitch(m_Pitch + 1);
}
-bool cNoteEntity::LoadFromJson( const Json::Value & a_Value )
+bool cNoteEntity::LoadFromJson(const Json::Value & a_Value)
{
m_PosX = a_Value.get("x", 0).asInt();
@@ -145,7 +140,7 @@ bool cNoteEntity::LoadFromJson( const Json::Value & a_Value )
-void cNoteEntity::SaveToJson( Json::Value & a_Value )
+void cNoteEntity::SaveToJson(Json::Value & a_Value)
{
a_Value["x"] = m_PosX;
a_Value["y"] = m_PosY;
diff --git a/source/BlockEntities/NoteEntity.h b/source/BlockEntities/NoteEntity.h
index 385591df6..e2d088f44 100644
--- a/source/BlockEntities/NoteEntity.h
+++ b/source/BlockEntities/NoteEntity.h
@@ -26,26 +26,37 @@ enum ENUM_NOTE_INSTRUMENTS
+// tolua_begin
+
class cNoteEntity :
public cBlockEntity
{
+ typedef cBlockEntity super;
public:
- cNoteEntity(int a_X, int a_Y, int a_Z, cWorld * a_World);
- virtual ~cNoteEntity();
- bool LoadFromJson( const Json::Value& a_Value );
- virtual void SaveToJson( Json::Value& a_Value ) override;
+ // tolua_end
- char GetPitch( void );
- void SetPitch( char a_Pitch );
- void IncrementPitch( void );
- void MakeSound( void );
- virtual void UsedBy( cPlayer * a_Player ) override;
+ /// Creates a new note entity. a_World may be NULL
+ cNoteEntity(int a_X, int a_Y, int a_Z, cWorld * a_World);
+
+ bool LoadFromJson(const Json::Value & a_Value);
+ virtual void SaveToJson(Json::Value & a_Value) override;
+
+ // tolua_begin
+
+ char GetPitch(void);
+ void SetPitch(char a_Pitch);
+ void IncrementPitch(void);
+ void MakeSound(void);
+
+ // tolua_end
+
+ virtual void UsedBy(cPlayer * a_Player) override;
virtual void SendTo(cClientHandle & a_Client) override { };
private:
- unsigned char m_Pitch;
-};
+ char m_Pitch;
+} ; // tolua_export
diff --git a/source/BlockEntities/SignEntity.cpp b/source/BlockEntities/SignEntity.cpp
index 2c160e603..8b335651d 100644
--- a/source/BlockEntities/SignEntity.cpp
+++ b/source/BlockEntities/SignEntity.cpp
@@ -1,21 +1,19 @@
-#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules
+// SignEntity.cpp
-#include "SignEntity.h"
-
-#include "../Entities/Player.h"
-// #include "ClientHandle.h"
-// #include "World.h"
-// #include "Root.h"
+// Implements the cSignEntity class representing a single sign in the world
+#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules
#include <json/json.h>
+#include "SignEntity.h"
+#include "../Entities/Player.h"
-cSignEntity::cSignEntity(BLOCKTYPE a_BlockType, int a_X, int a_Y, int a_Z, cWorld * a_World)
- : cBlockEntity(a_BlockType, a_X, a_Y, a_Z, a_World)
+cSignEntity::cSignEntity(BLOCKTYPE a_BlockType, int a_BlockX, int a_BlockY, int a_BlockZ) :
+ super(a_BlockType, a_BlockX, a_BlockY, a_BlockZ, NULL)
{
}
@@ -23,7 +21,8 @@ cSignEntity::cSignEntity(BLOCKTYPE a_BlockType, int a_X, int a_Y, int a_Z, cWorl
-cSignEntity::~cSignEntity()
+cSignEntity::cSignEntity(BLOCKTYPE a_BlockType, int a_X, int a_Y, int a_Z, cWorld * a_World) :
+ super(a_BlockType, a_X, a_Y, a_Z, a_World)
{
}
@@ -32,16 +31,16 @@ cSignEntity::~cSignEntity()
// It don't do anything when 'used'
-void cSignEntity::UsedBy( cPlayer * a_Player )
+void cSignEntity::UsedBy(cPlayer * a_Player)
{
- (void)a_Player;
+ UNUSED(a_Player);
}
-void cSignEntity::SetLines( const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4 )
+void cSignEntity::SetLines(const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4)
{
m_Line[0] = a_Line1;
m_Line[1] = a_Line2;
@@ -53,25 +52,28 @@ void cSignEntity::SetLines( const AString & a_Line1, const AString & a_Line2, co
-void cSignEntity::SetLine( int a_Index, const AString & a_Line )
+void cSignEntity::SetLine(int a_Index, const AString & a_Line)
{
- if( a_Index < 4 && a_Index > -1 )
+ if ((a_Index < 0) || (a_Index >= ARRAYCOUNT(m_Line)))
{
- m_Line[a_Index] = a_Line;
+ LOGWARNING("%s: setting a non-existent line %d (value \"%s\"", __FUNCTION__, a_Index, a_Line.c_str());
+ return;
}
+ m_Line[a_Index] = a_Line;
}
-AString cSignEntity::GetLine( int a_Index ) const
+AString cSignEntity::GetLine(int a_Index) const
{
- if( a_Index < 4 && a_Index > -1 )
+ if ((a_Index < 0) || (a_Index >= ARRAYCOUNT(m_Line)))
{
- return m_Line[a_Index];
+ LOGWARNING("%s: requesting a non-existent line %d", __FUNCTION__, a_Index);
+ return "";
}
- return "";
+ return m_Line[a_Index];
}
@@ -87,19 +89,7 @@ void cSignEntity::SendTo(cClientHandle & a_Client)
-#define READ(File, Var) \
- if (File.Read(&Var, sizeof(Var)) != sizeof(Var)) \
- { \
- LOGERROR("ERROR READING cSignEntity %s FROM FILE (line %d)", #Var, __LINE__); \
- return false; \
- }
-
-
-
-
-
-
-bool cSignEntity::LoadFromJson( const Json::Value & a_Value )
+bool cSignEntity::LoadFromJson(const Json::Value & a_Value)
{
m_PosX = a_Value.get("x", 0).asInt();
m_PosY = a_Value.get("y", 0).asInt();
@@ -113,7 +103,11 @@ bool cSignEntity::LoadFromJson( const Json::Value & a_Value )
return true;
}
-void cSignEntity::SaveToJson( Json::Value & a_Value )
+
+
+
+
+void cSignEntity::SaveToJson(Json::Value & a_Value)
{
a_Value["x"] = m_PosX;
a_Value["y"] = m_PosY;
diff --git a/source/BlockEntities/SignEntity.h b/source/BlockEntities/SignEntity.h
index b4e7a141f..50706bdfe 100644
--- a/source/BlockEntities/SignEntity.h
+++ b/source/BlockEntities/SignEntity.h
@@ -1,4 +1,12 @@
+// SignEntity.h
+
+// Declares the cSignEntity class representing a single sign in the world
+
+
+
+
+
#pragma once
#include "BlockEntity.h"
@@ -13,28 +21,49 @@ namespace Json
}
+
+
+
+// tolua_begin
+
class cSignEntity :
public cBlockEntity
{
+ typedef cBlockEntity super;
+
public:
+
+ /// Creates a new empty sign entity at the specified block coords and block type (wall or standing)
+ /// Used mainly by plugins while generating chunks
+ cSignEntity(BLOCKTYPE a_BlockType, int a_BlockX, int a_BlockY, int a_BlockZ);
+
+ // tolua_end
+
cSignEntity(BLOCKTYPE a_BlockType, int a_X, int a_Y, int a_Z, cWorld * a_World);
- virtual ~cSignEntity();
bool LoadFromJson( const Json::Value& a_Value );
virtual void SaveToJson(Json::Value& a_Value ) override;
- void SetLines( const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4 );
- void SetLine( int a_Index, const AString & a_Line );
-
- AString GetLine( int a_Index ) const;
+ // tolua_begin
+
+ /// Sets all the sign's lines
+ void SetLines(const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4);
+
+ /// Sets individual line (zero-based index)
+ void SetLine(int a_Index, const AString & a_Line);
- virtual void UsedBy( cPlayer * a_Player ) override;
+ /// Retrieves individual line (zero-based index)
+ AString GetLine(int a_Index) const;
+
+ // tolua_end
+
+ virtual void UsedBy(cPlayer * a_Player) override;
virtual void SendTo(cClientHandle & a_Client) override;
private:
AString m_Line[4];
-};
+} ; // tolua_export