summaryrefslogtreecommitdiffstats
path: root/source/Protocol
diff options
context:
space:
mode:
authormadmaxoft@gmail.com <madmaxoft@gmail.com@0a769ca7-a7f5-676a-18bf-c427514a06d6>2013-05-08 11:45:07 +0200
committermadmaxoft@gmail.com <madmaxoft@gmail.com@0a769ca7-a7f5-676a-18bf-c427514a06d6>2013-05-08 11:45:07 +0200
commit7cbf36bf17df70d325d03e4cd40859ac31b4c2e2 (patch)
tree09675adda6e35bab168cecb497849a870dfb4956 /source/Protocol
parentPlease keep the lists alpha-sorted (diff)
downloadcuberite-7cbf36bf17df70d325d03e4cd40859ac31b4c2e2.tar
cuberite-7cbf36bf17df70d325d03e4cd40859ac31b4c2e2.tar.gz
cuberite-7cbf36bf17df70d325d03e4cd40859ac31b4c2e2.tar.bz2
cuberite-7cbf36bf17df70d325d03e4cd40859ac31b4c2e2.tar.lz
cuberite-7cbf36bf17df70d325d03e4cd40859ac31b4c2e2.tar.xz
cuberite-7cbf36bf17df70d325d03e4cd40859ac31b4c2e2.tar.zst
cuberite-7cbf36bf17df70d325d03e4cd40859ac31b4c2e2.zip
Diffstat (limited to 'source/Protocol')
-rw-r--r--source/Protocol/Protocol125.cpp42
-rw-r--r--source/Protocol/Protocol15x.cpp78
-rw-r--r--source/Protocol/Protocol15x.h2
3 files changed, 121 insertions, 1 deletions
diff --git a/source/Protocol/Protocol125.cpp b/source/Protocol/Protocol125.cpp
index 4be4cb033..17def7c8a 100644
--- a/source/Protocol/Protocol125.cpp
+++ b/source/Protocol/Protocol125.cpp
@@ -1381,7 +1381,47 @@ int cProtocol125::ParseWindowClick(void)
{
return res;
}
- m_Client->HandleWindowClick(WindowID, SlotNum, IsRightClick, IsShiftPressed, HeldItem);
+
+ // Convert IsShiftPressed, IsRightClick, SlotNum and HeldItem into eClickAction used in the newer protocols:
+ eClickAction Action;
+ if (IsRightClick)
+ {
+ if (IsShiftPressed)
+ {
+ Action = caShiftRightClick;
+ }
+ else
+ {
+ if (SlotNum == -999)
+ {
+ Action = (HeldItem.IsEmpty()) ? caRightClickOutsideHoldNothing : caRightClickOutside;
+ }
+ else
+ {
+ Action = caRightClick;
+ }
+ }
+ }
+ else
+ {
+ // IsLeftClick
+ if (IsShiftPressed)
+ {
+ Action = caShiftLeftClick;
+ }
+ else
+ {
+ if (SlotNum == -999)
+ {
+ Action = (HeldItem.IsEmpty()) ? caLeftClickOutsideHoldNothing : caRightClickOutside;
+ }
+ else
+ {
+ Action = caLeftClick;
+ }
+ }
+ }
+ m_Client->HandleWindowClick(WindowID, SlotNum, Action, HeldItem);
return PARSE_OK;
}
diff --git a/source/Protocol/Protocol15x.cpp b/source/Protocol/Protocol15x.cpp
index 61358fcdb..78792af19 100644
--- a/source/Protocol/Protocol15x.cpp
+++ b/source/Protocol/Protocol15x.cpp
@@ -10,6 +10,23 @@ Implements the 1.5.x protocol classes:
#include "Globals.h"
#include "Protocol15x.h"
+#include "../ClientHandle.h"
+#include "../Item.h"
+
+
+
+
+
+#define HANDLE_PACKET_READ(Proc, Type, Var) \
+ Type Var; \
+ { \
+ if (!m_ReceivedData.Proc(Var)) \
+ { \
+ m_ReceivedData.CheckValid(); \
+ return PARSE_INCOMPLETE; \
+ } \
+ m_ReceivedData.CheckValid(); \
+ }
@@ -57,3 +74,64 @@ void cProtocol150::SendWindowOpen(char a_WindowID, char a_WindowType, const AStr
+
+int cProtocol150::ParseWindowClick(void)
+{
+ HANDLE_PACKET_READ(ReadChar, char, WindowID);
+ HANDLE_PACKET_READ(ReadBEShort, short, SlotNum);
+ HANDLE_PACKET_READ(ReadByte, Byte, Button);
+ HANDLE_PACKET_READ(ReadBEShort, short, TransactionID);
+ HANDLE_PACKET_READ(ReadByte, Byte, Mode);
+ cItem HeldItem;
+ int res = ParseItem(HeldItem);
+ if (res < 0)
+ {
+ return res;
+ }
+
+ // Convert Button, Mode, SlotNum and HeldItem into eClickAction:
+ eClickAction Action;
+ switch ((Mode << 8) | Button)
+ {
+ case 0x0000: Action = (SlotNum != -999) ? caLeftClick : caLeftClickOutside; break;
+ case 0x0001: Action = (SlotNum != -999) ? caRightClick : caRightClickOutside; break;
+ case 0x0100: Action = caShiftLeftClick; break;
+ case 0x0101: Action = caShiftRightClick; break;
+ case 0x0200: Action = caNumber1; break;
+ case 0x0201: Action = caNumber2; break;
+ case 0x0202: Action = caNumber3; break;
+ case 0x0203: Action = caNumber4; break;
+ case 0x0204: Action = caNumber5; break;
+ case 0x0205: Action = caNumber6; break;
+ case 0x0206: Action = caNumber7; break;
+ case 0x0207: Action = caNumber8; break;
+ case 0x0208: Action = caNumber9; break;
+ case 0x0300: Action = caMiddleClick; break;
+ case 0x0400: Action = (SlotNum == -999) ? caLeftClickOutsideHoldNothing : caDropKey; break;
+ case 0x0401: Action = (SlotNum == -999) ? caRightClickOutsideHoldNothing : caCtrlDropKey; break;
+ case 0x0500: Action = (SlotNum == -999) ? caLeftPaintBegin : caUnknown; break;
+ case 0x0501: Action = (SlotNum != -999) ? caLeftPaintProgress : caUnknown; break;
+ case 0x0502: Action = (SlotNum == -999) ? caLeftPaintEnd : caUnknown; break;
+ case 0x0504: Action = (SlotNum == -999) ? caRightPaintBegin : caUnknown; break;
+ case 0x0505: Action = (SlotNum != -999) ? caRightPaintProgress : caUnknown; break;
+ case 0x0506: Action = (SlotNum == -999) ? caRightPaintEnd : caUnknown; break;
+ case 0x0600: Action = caDblClick; break;
+ }
+
+ if (Action == caUnknown)
+ {
+ LOGWARNING("Received an unknown click action combination: Mode = %d, Button = %d, Slot = %d, HeldItem = %s. Ignoring packet.",
+ Mode, Button, SlotNum, ItemToFullString(HeldItem).c_str()
+ );
+ ASSERT(!"Unknown click action");
+ return PARSE_OK;
+ }
+
+ m_Client->HandleWindowClick(WindowID, SlotNum, Action, HeldItem);
+ return PARSE_OK;
+}
+
+
+
+
+
diff --git a/source/Protocol/Protocol15x.h b/source/Protocol/Protocol15x.h
index f09ba09d7..a1c665ab4 100644
--- a/source/Protocol/Protocol15x.h
+++ b/source/Protocol/Protocol15x.h
@@ -29,6 +29,8 @@ public:
cProtocol150(cClientHandle * a_Client);
virtual void SendWindowOpen(char a_WindowID, char a_WindowType, const AString & a_WindowTitle, char a_NumSlots) override;
+
+ virtual int ParseWindowClick(void);
} ;