From 3a7fd8da2d031bbfb9d5819fb68963295c1c17f1 Mon Sep 17 00:00:00 2001 From: ephphatha Date: Wed, 13 Jul 2022 21:47:11 +1000 Subject: [PATCH] Only send and consume object location for location based messages Co-authored-by: Anders Jenbo --- Source/controls/plrctrls.cpp | 4 ++-- Source/diablo.cpp | 2 +- Source/missiles.cpp | 2 +- Source/msg.cpp | 30 +++++++++--------------------- Source/msg.h | 6 ++---- Source/track.cpp | 3 ++- 6 files changed, 17 insertions(+), 30 deletions(-) diff --git a/Source/controls/plrctrls.cpp b/Source/controls/plrctrls.cpp index 9973a9a39..981654efe 100644 --- a/Source/controls/plrctrls.cpp +++ b/Source/controls/plrctrls.cpp @@ -522,7 +522,7 @@ void Interact() } if (pcursobj != -1) { - NetSendCmdLocParam1(true, CMD_OPOBJXY, cursPosition, pcursobj); + NetSendCmdLoc(MyPlayerId, true, CMD_OPOBJXY, cursPosition); LastMouseButtonAction = MouseActionType::OperateObject; return; } @@ -1973,7 +1973,7 @@ void PerformSecondaryAction() if (pcursitem != -1) { NetSendCmdLocParam1(true, CMD_GOTOAGETITEM, cursPosition, pcursitem); } else if (pcursobj != -1) { - NetSendCmdLocParam1(true, CMD_OPOBJXY, cursPosition, pcursobj); + NetSendCmdLoc(MyPlayerId, true, CMD_OPOBJXY, cursPosition); LastMouseButtonAction = MouseActionType::OperateObject; } else { if (pcursmissile != nullptr) { diff --git a/Source/diablo.cpp b/Source/diablo.cpp index b2e8a4fed..0e56018fe 100644 --- a/Source/diablo.cpp +++ b/Source/diablo.cpp @@ -240,7 +240,7 @@ void LeftMouseCmd(bool bShift) NetSendCmdLocParam1(true, invflag ? CMD_GOTOGETITEM : CMD_GOTOAGETITEM, cursPosition, pcursitem); } else if (pcursobj != -1 && !Objects[pcursobj].IsDisabled() && (!bShift || (bNear && Objects[pcursobj]._oBreak == 1))) { LastMouseButtonAction = MouseActionType::OperateObject; - NetSendCmdLocParam1(true, pcurs == CURSOR_DISARM ? CMD_DISARMXY : CMD_OPOBJXY, cursPosition, pcursobj); + NetSendCmdLoc(MyPlayerId, true, pcurs == CURSOR_DISARM ? CMD_DISARMXY : CMD_OPOBJXY, cursPosition); } else if (myPlayer.UsesRangedWeapon()) { if (bShift) { LastMouseButtonAction = MouseActionType::Attack; diff --git a/Source/missiles.cpp b/Source/missiles.cpp index c9869ad2d..c73e9067d 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -2395,7 +2395,7 @@ void AddDisarm(Missile &missile, const AddMissileParameter & /*parameter*/) NewCursor(CURSOR_DISARM); if (ControlMode != ControlTypes::KeyboardAndMouse) { if (pcursobj != -1) - NetSendCmdLocParam1(true, CMD_DISARMXY, cursPosition, pcursobj); + NetSendCmdLoc(MyPlayerId, true, CMD_DISARMXY, cursPosition); else NewCursor(CURSOR_HAND); } diff --git a/Source/msg.cpp b/Source/msg.cpp index ac04ca4ff..267746b47 100644 --- a/Source/msg.cpp +++ b/Source/msg.cpp @@ -1215,29 +1215,17 @@ size_t OnTargetSpellTile(const TCmd *pCmd, Player &player) return sizeof(message); } -size_t OnOperateObjectTile(const TCmd *pCmd, Player &player) +size_t OnObjectTileAction(const TCmd &cmd, Player &player, action_id action) { - const auto &message = *reinterpret_cast(pCmd); + const auto &message = reinterpret_cast(cmd); const Point position { message.x, message.y }; + const Object *object = ObjectAtPosition(position); - if (gbBufferMsgs != 1 && player.isOnActiveLevel() && InDungeonBounds(position) && message.wParam1 < MAXOBJECTS) { - MakePlrPath(player, position, !Objects[message.wParam1]._oSolidFlag && !Objects[message.wParam1]._oDoorFlag); - player.destAction = ACTION_OPERATE; - player.destParam1 = message.wParam1; - } - - return sizeof(message); -} + if (gbBufferMsgs != 1 && player.isOnActiveLevel() && object != nullptr) { + MakePlrPath(player, position, !object->_oSolidFlag && !object->_oDoorFlag); -size_t OnDisarm(const TCmd *pCmd, Player &player) -{ - const auto &message = *reinterpret_cast(pCmd); - const Point position { message.x, message.y }; - - if (gbBufferMsgs != 1 && player.isOnActiveLevel() && InDungeonBounds(position) && message.wParam1 < MAXOBJECTS) { - MakePlrPath(player, position, !Objects[message.wParam1]._oSolidFlag && !Objects[message.wParam1]._oDoorFlag); - player.destAction = ACTION_DISARM; - player.destParam1 = message.wParam1; + player.destAction = action; + player.destParam1 = object->GetId(); } return sizeof(message); @@ -3013,9 +3001,9 @@ size_t ParseCmd(int pnum, const TCmd *pCmd) case CMD_TSPELLXY: return OnTargetSpellTile(pCmd, player); case CMD_OPOBJXY: - return OnOperateObjectTile(pCmd, player); + return OnObjectTileAction(*pCmd, player, ACTION_OPERATE); case CMD_DISARMXY: - return OnDisarm(pCmd, player); + return OnObjectTileAction(*pCmd, player, ACTION_DISARM); case CMD_OPOBJT: return OnOperateObjectTelekinesis(pCmd, player); case CMD_ATTACKID: diff --git a/Source/msg.h b/Source/msg.h index f9abd2fe2..feb204a38 100644 --- a/Source/msg.h +++ b/Source/msg.h @@ -99,17 +99,15 @@ enum _cmd_id : uint8_t { CMD_TSPELLXY, // Operate object at location. // - // body (TCmdLocParam1): + // body (TCmdLoc): // int8_t x // int8_t y - // int16_t object_num CMD_OPOBJXY, // Disarm trap at location. // - // body (TCmdLocParam1): + // body (TCmdLoc): // int8_t x // int8_t y - // int16_t object_num CMD_DISARMXY, // Attack target monster. // diff --git a/Source/track.cpp b/Source/track.cpp index 85be226e1..0caecaad2 100644 --- a/Source/track.cpp +++ b/Source/track.cpp @@ -115,7 +115,8 @@ void RepeatMouseAction() auto &object = Objects[pcursobj]; if (object.IsDoor()) break; - NetSendCmdLocParam1(true, CMD_OPOBJXY, object.position, pcursobj); + // This should probably be cursPosition so paths to large objects are consistent + NetSendCmdLoc(MyPlayerId, true, CMD_OPOBJXY, object.position); } break; case MouseActionType::Walk: