diff --git a/Source/controls/plrctrls.cpp b/Source/controls/plrctrls.cpp index c4ec5092f..fceb6c35f 100644 --- a/Source/controls/plrctrls.cpp +++ b/Source/controls/plrctrls.cpp @@ -524,9 +524,13 @@ void Interact() position = Monsters[pcursmonst].position.tile; } - NetSendCmdLoc(MyPlayerId, true, myPlayer.UsesRangedWeapon() ? CMD_RATTACKXY : CMD_SATTACKXY, position); - LastPlayerAction = PlayerActionType::Attack; - return; + bool bNear = myPlayer.position.tile.WalkingDistance(position) < 2; + + if (!(bNear && (pcursmonst != -1 || PlayerUnderCursor != nullptr))) { + NetSendCmdLoc(MyPlayerId, true, myPlayer.UsesRangedWeapon() ? CMD_RATTACKXY : CMD_SATTACKXY, position); + LastPlayerAction = PlayerActionType::Attack; + return; + } } if (pcursmonst != -1) { diff --git a/Source/diablo.cpp b/Source/diablo.cpp index b14da41cb..fe4dc5646 100644 --- a/Source/diablo.cpp +++ b/Source/diablo.cpp @@ -246,8 +246,6 @@ bool ProcessInput() void LeftMouseCmd(bool bShift) { - bool bNear; - assert(!GetMainPanel().contains(MousePosition)); if (leveltype == DTYPE_TOWN) { @@ -265,17 +263,14 @@ void LeftMouseCmd(bool bShift) } const Player &myPlayer = *MyPlayer; - bNear = myPlayer.position.tile.WalkingDistance(cursPosition) < 2; + bool bNear = myPlayer.position.tile.WalkingDistance(cursPosition) < 2; if (pcursitem != -1 && pcurs == CURSOR_HAND && !bShift) { NetSendCmdLocParam1(true, invflag ? CMD_GOTOGETITEM : CMD_GOTOAGETITEM, cursPosition, pcursitem); } else if (ObjectUnderCursor != nullptr && !ObjectUnderCursor->IsDisabled() && (!bShift || (bNear && ObjectUnderCursor->_oBreak == 1))) { LastPlayerAction = PlayerActionType::OperateObject; NetSendCmdLoc(MyPlayerId, true, pcurs == CURSOR_DISARM ? CMD_DISARMXY : CMD_OPOBJXY, cursPosition); } else if (myPlayer.UsesRangedWeapon()) { - if (bShift) { - LastPlayerAction = PlayerActionType::Attack; - NetSendCmdLoc(MyPlayerId, true, CMD_RATTACKXY, cursPosition); - } else if (pcursmonst != -1) { + if (pcursmonst != -1) { if (CanTalkToMonst(Monsters[pcursmonst])) { NetSendCmdParam1(true, CMD_ATTACKID, pcursmonst); } else { @@ -285,20 +280,18 @@ void LeftMouseCmd(bool bShift) } else if (PlayerUnderCursor != nullptr && !PlayerUnderCursor->hasNoLife() && !myPlayer.friendlyMode) { LastPlayerAction = PlayerActionType::AttackPlayerTarget; NetSendCmdParam1(true, CMD_RATTACKPID, PlayerUnderCursor->getId()); + } else if (bShift) { + LastPlayerAction = PlayerActionType::Attack; + NetSendCmdLoc(MyPlayerId, true, CMD_RATTACKXY, cursPosition); } } else { - if (bShift) { - if (pcursmonst != -1) { - if (CanTalkToMonst(Monsters[pcursmonst])) { - NetSendCmdParam1(true, CMD_ATTACKID, pcursmonst); - } else { - LastPlayerAction = PlayerActionType::Attack; - NetSendCmdLoc(MyPlayerId, true, CMD_SATTACKXY, cursPosition); - } - } else { - LastPlayerAction = PlayerActionType::Attack; - NetSendCmdLoc(MyPlayerId, true, CMD_SATTACKXY, cursPosition); + if (bShift && !(bNear && (pcursmonst != -1 || PlayerUnderCursor != nullptr))) { + if (pcursmonst != -1 && CanTalkToMonst(Monsters[pcursmonst])) { + NetSendCmdParam1(true, CMD_ATTACKID, pcursmonst); + return; } + LastPlayerAction = PlayerActionType::Attack; + NetSendCmdLoc(MyPlayerId, true, CMD_SATTACKXY, cursPosition); } else if (pcursmonst != -1) { LastPlayerAction = PlayerActionType::AttackMonsterTarget; NetSendCmdParam1(true, CMD_ATTACKID, pcursmonst); diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 912eb495e..de13224d9 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -9,6 +9,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Features +#### Gameplay + +- Stand ground attacks nearby targets instead of nearby tiles to improve accuracy + #### Graphics / Audio - Better use of colors to differentiate players in multiplayer