summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/ClientHandle.cpp5
-rw-r--r--src/ClientHandle.h4
-rw-r--r--src/Protocol/Protocol_1_8.cpp22
3 files changed, 23 insertions, 8 deletions
diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp
index e5f001116..d36f27d8c 100644
--- a/src/ClientHandle.cpp
+++ b/src/ClientHandle.cpp
@@ -940,6 +940,11 @@ void cClientHandle::HandleCommandBlockBlockChange(int a_BlockX, int a_BlockY, in
Kick("Command block string unexpectedly empty - hacked client?");
return;
}
+ if ((m_Player == nullptr) || !m_Player->HasPermission("comandblock.set"))
+ {
+ SendChat("You cannot edit command blocks on this server", mtFailure);
+ return;
+ }
cWorld * World = m_Player->GetWorld();
if (World->AreCommandBlocksEnabled())
diff --git a/src/ClientHandle.h b/src/ClientHandle.h
index c33bd7fe0..1a48e0458 100644
--- a/src/ClientHandle.h
+++ b/src/ClientHandle.h
@@ -310,11 +310,11 @@ public: // tolua_export
/** Called when the protocol detects a chat packet. */
void HandleChat(const AString & a_Message);
- /** Called when the protocol receives a MC|AdvCdm plugin message, indicating that the player set a new
+ /** Called when the protocol receives a message, indicating that the player set a new
command in the command block UI, for a block-based commandblock. */
void HandleCommandBlockBlockChange(int a_BlockX, int a_BlockY, int a_BlockZ, const AString & a_NewCommand);
- /** Called when the protocol receives a MC|AdvCdm plugin message, indicating that the player set a new
+ /** Called when the protocol receives a message, indicating that the player set a new
command in the command block UI, for an entity-based commandblock (minecart?). */
void HandleCommandBlockEntityChange(UInt32 a_EntityID, const AString & a_NewCommand);
diff --git a/src/Protocol/Protocol_1_8.cpp b/src/Protocol/Protocol_1_8.cpp
index 02b76ccae..e7e110296 100644
--- a/src/Protocol/Protocol_1_8.cpp
+++ b/src/Protocol/Protocol_1_8.cpp
@@ -2805,27 +2805,37 @@ void cProtocol_1_8_0::HandlePacketWindowClose(cByteBuffer & a_ByteBuffer)
void cProtocol_1_8_0::HandleVanillaPluginMessage(cByteBuffer & a_ByteBuffer, const AString & a_Channel)
{
- if (a_Channel == "MC|AdvCdm")
+ if ((a_Channel == "MC|AdvCdm") || (a_Channel == "MC|AdvCmd")) // Spelling was fixed in 15w34
{
- HANDLE_READ(a_ByteBuffer, ReadBEUInt8, UInt8, Mode);
+ // https://wiki.vg/index.php?title=Plugin_channels&oldid=14089#MC.7CAdvCmd
+ HANDLE_READ(a_ByteBuffer, ReadBEUInt8, UInt8, Dest);
- switch (Mode)
+ switch (Dest)
{
case 0x00:
{
+ // Editing a command-block
HANDLE_READ(a_ByteBuffer, ReadBEInt32, Int32, BlockX);
HANDLE_READ(a_ByteBuffer, ReadBEInt32, Int32, BlockY);
HANDLE_READ(a_ByteBuffer, ReadBEInt32, Int32, BlockZ);
HANDLE_READ(a_ByteBuffer, ReadVarUTF8String, AString, Command);
-
m_Client->HandleCommandBlockBlockChange(BlockX, BlockY, BlockZ, Command);
break;
}
+ case 0x01:
+ {
+ // Editing a command-block-minecart
+ HANDLE_READ(a_ByteBuffer, ReadBEUInt32, UInt32, EntityID);
+ HANDLE_READ(a_ByteBuffer, ReadVarUTF8String, AString, Command);
+ m_Client->HandleCommandBlockEntityChange(EntityID, Command);
+ break;
+ }
+
default:
{
- m_Client->SendChat(Printf("Failure setting command block command; unhandled mode %u (0x%02x)", Mode, Mode), mtFailure);
- LOG("Unhandled MC|AdvCdm packet mode.");
+ m_Client->SendChat(Printf("Failure setting command block command; unhandled destination %u (0x%02x)", Dest, Dest), mtFailure);
+ LOG("Unhandled MC|AdvCmd packet destination.");
return;
}
} // switch (Mode)