summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorandrew <xdotftw@gmail.com>2014-01-18 18:58:46 +0100
committerandrew <xdotftw@gmail.com>2014-01-18 18:58:46 +0100
commit02c9aa2b1e86974df4ef8ea152465719169bdac5 (patch)
treef5e8ba8560b0939e4f3bfb0fefd9e4e5e55262e2 /src
parentCommand blocks: Execute() (diff)
downloadcuberite-02c9aa2b1e86974df4ef8ea152465719169bdac5.tar
cuberite-02c9aa2b1e86974df4ef8ea152465719169bdac5.tar.gz
cuberite-02c9aa2b1e86974df4ef8ea152465719169bdac5.tar.bz2
cuberite-02c9aa2b1e86974df4ef8ea152465719169bdac5.tar.lz
cuberite-02c9aa2b1e86974df4ef8ea152465719169bdac5.tar.xz
cuberite-02c9aa2b1e86974df4ef8ea152465719169bdac5.tar.zst
cuberite-02c9aa2b1e86974df4ef8ea152465719169bdac5.zip
Diffstat (limited to 'src')
-rw-r--r--src/BlockEntities/CommandBlockEntity.cpp2
-rw-r--r--src/ClientHandle.cpp64
-rw-r--r--src/ClientHandle.h3
-rw-r--r--src/WorldStorage/NBTChunkSerializer.cpp2
4 files changed, 70 insertions, 1 deletions
diff --git a/src/BlockEntities/CommandBlockEntity.cpp b/src/BlockEntities/CommandBlockEntity.cpp
index e70e259aa..c29e3dff8 100644
--- a/src/BlockEntities/CommandBlockEntity.cpp
+++ b/src/BlockEntities/CommandBlockEntity.cpp
@@ -212,6 +212,8 @@ void cCommandBlockEntity::Execute()
}
} CmdBlockOutCb(this);
+ LOGD("cCommandBlockEntity: Executing command %s", m_Command.c_str());
+
cServer* Server = cRoot::Get()->GetServer();
Server->ExecuteConsoleCommand(m_Command, CmdBlockOutCb);
diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp
index c8513d516..0a97ba6c8 100644
--- a/src/ClientHandle.cpp
+++ b/src/ClientHandle.cpp
@@ -8,6 +8,7 @@
#include "Entities/Player.h"
#include "Inventory.h"
#include "BlockEntities/ChestEntity.h"
+#include "BlockEntities/CommandBlockEntity.h"
#include "BlockEntities/SignEntity.h"
#include "UI/Window.h"
#include "Item.h"
@@ -545,6 +546,15 @@ void cClientHandle::HandlePlayerPos(double a_PosX, double a_PosY, double a_PosZ,
void cClientHandle::HandlePluginMessage(const AString & a_Channel, const AString & a_Message)
{
+ if (a_Channel == "MC|AdvCdm") // Command block
+ {
+ const char* Data = a_Message.c_str();
+
+ HandleCommandBlockMessage(Data, a_Message.size());
+
+ return;
+ }
+
cPluginManager::Get()->CallHookPluginMessage(*this, a_Channel, a_Message);
}
@@ -552,6 +562,60 @@ void cClientHandle::HandlePluginMessage(const AString & a_Channel, const AString
+void cClientHandle::HandleCommandBlockMessage(const char* a_Data, unsigned int a_Length)
+{
+ if (a_Length < 14)
+ {
+ LOGD("Malformed MC|AdvCdm packet.");
+ return;
+ }
+
+ int BlockX, BlockY, BlockZ;
+
+ AString Command;
+
+ switch (a_Data[0])
+ {
+ case 0x00:
+ {
+ BlockX = GetBEInt(a_Data + 1);
+ BlockY = GetBEInt(a_Data + 5);
+ BlockZ = GetBEInt(a_Data + 9);
+
+ Command = AString(a_Data + 14, (int)a_Data[13]);
+ break;
+ }
+
+ default:
+ {
+ LOGD("Unhandled MC|AdvCdm packet mode.");
+ return;
+ }
+ }
+
+ class cUpdateCommandBlock :
+ public cCommandBlockCallback
+ {
+ AString m_Command;
+ public:
+ cUpdateCommandBlock(const AString & a_Command) : m_Command(a_Command) {}
+
+ virtual bool Item(cCommandBlockEntity * a_CommandBlock) override
+ {
+ a_CommandBlock->SetCommand(m_Command);
+ return false;
+ }
+ } CmdBlockCB (Command);
+
+ cWorld * World = m_Player->GetWorld();
+
+ World->DoWithCommandBlockAt(BlockX, BlockY, BlockZ, CmdBlockCB);
+}
+
+
+
+
+
void cClientHandle::HandleLeftClick(int a_BlockX, int a_BlockY, int a_BlockZ, char a_BlockFace, char a_Status)
{
LOGD("HandleLeftClick: {%i, %i, %i}; Face: %i; Stat: %i",
diff --git a/src/ClientHandle.h b/src/ClientHandle.h
index da2704b72..373ca9e2e 100644
--- a/src/ClientHandle.h
+++ b/src/ClientHandle.h
@@ -324,6 +324,9 @@ private:
/// Handles the DIG_FINISHED dig packet:
void HandleBlockDigFinished(int a_BlockX, int a_BlockY, int a_BlockZ, char a_BlockFace, BLOCKTYPE a_OldBlock, NIBBLETYPE a_OldMeta);
+
+ /// Handles the "MC|AdvCdm" plugin message
+ void HandleCommandBlockMessage(const char* a_Data, unsigned int a_Length);
// cSocketThreads::cCallback overrides:
virtual void DataReceived (const char * a_Data, int a_Size) override; // Data is received from the client
diff --git a/src/WorldStorage/NBTChunkSerializer.cpp b/src/WorldStorage/NBTChunkSerializer.cpp
index b5b5e555b..447296c7f 100644
--- a/src/WorldStorage/NBTChunkSerializer.cpp
+++ b/src/WorldStorage/NBTChunkSerializer.cpp
@@ -236,7 +236,7 @@ void cNBTChunkSerializer::AddCommandBlockEntity(cCommandBlockEntity * a_CmdBlock
m_Writer.AddString("Command", a_CmdBlock->GetCommand());
m_Writer.AddInt ("SuccessCount", a_CmdBlock->GetResult());
m_Writer.AddString("LastOutput", a_CmdBlock->GetLastOutput());
- m_Writer.AddByte ("TrackOutput", 1); // Unknown (?)
+ m_Writer.AddByte ("TrackOutput", 1); // TODO 2014-01-18 xdot: Figure out what TrackOutput is and save it.
m_Writer.EndCompound();
}