Browse Source

Only send and consume object location for location based messages

Co-authored-by: Anders Jenbo <anders@jenbo.dk>
pull/5064/head
ephphatha 4 years ago committed by Anders Jenbo
parent
commit
3a7fd8da2d
  1. 4
      Source/controls/plrctrls.cpp
  2. 2
      Source/diablo.cpp
  3. 2
      Source/missiles.cpp
  4. 30
      Source/msg.cpp
  5. 6
      Source/msg.h
  6. 3
      Source/track.cpp

4
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) {

2
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;

2
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);
}

30
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<const TCmdLocParam1 *>(pCmd);
const auto &message = reinterpret_cast<const TCmdLoc &>(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<const TCmdLocParam1 *>(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:

6
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.
//

3
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:

Loading…
Cancel
Save