From cdd22626b47973f9ad8b2ebfa69fbd0616051b11 Mon Sep 17 00:00:00 2001 From: Eric Robinson <68359262+kphoenix137@users.noreply.github.com> Date: Sun, 22 Sep 2024 20:46:33 -0400 Subject: [PATCH] Fix Knockback direction (#7093) --- Source/missiles.cpp | 6 +++--- Source/monster.cpp | 8 ++++---- Source/monster.h | 2 +- Source/msg.cpp | 2 +- Source/player.cpp | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 2d5bc48b6b3..b171138a71c 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -203,7 +203,7 @@ int ProjectileTrapDamage() return currlevel + GenerateRnd(2 * currlevel); } -bool MonsterMHit(const Player &player, int monsterId, int mindam, int maxdam, int dist, MissileID t, DamageType damageType, bool shift) +bool MonsterMHit(const Player &player, int monsterId, int mindam, int maxdam, int dist, MissileID t, WorldTilePosition startPos, DamageType damageType, bool shift) { Monster &monster = Monsters[monsterId]; @@ -268,7 +268,7 @@ bool MonsterMHit(const Player &player, int monsterId, int mindam, int maxdam, in PlayEffect(monster, MonsterSound::Hit); } else { if (monster.mode != MonsterMode::Petrified && missileData.isArrow() && HasAnyOf(player._pIFlags, ItemSpecialEffect::Knockback)) - M_GetKnockback(monster); + M_GetKnockback(monster, startPos); if (monster.type().type != MT_GOLEM) M_StartHit(monster, player, dam); } @@ -422,7 +422,7 @@ void CheckMissileCol(Missile &missile, DamageType damageType, int minDamage, int // then the missile can potentially hit this target isMonsterHit = MonsterTrapHit(mid, minDamage, maxDamage, missile._midist, missile._mitype, damageType, isDamageShifted); } else if (IsAnyOf(missile._micaster, TARGET_BOTH, TARGET_MONSTERS)) { - isMonsterHit = MonsterMHit(*missile.sourcePlayer(), mid, minDamage, maxDamage, missile._midist, missile._mitype, damageType, isDamageShifted); + isMonsterHit = MonsterMHit(*missile.sourcePlayer(), mid, minDamage, maxDamage, missile._midist, missile._mitype, missile.position.start, damageType, isDamageShifted); } } diff --git a/Source/monster.cpp b/Source/monster.cpp index ab6adf8762d..60e8cfb96bb 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -3734,9 +3734,9 @@ void M_ClearSquares(const Monster &monster) } } -void M_GetKnockback(Monster &monster) +void M_GetKnockback(Monster &monster, WorldTilePosition attackerStartPos) { - Direction dir = Opposite(monster.direction); + Direction dir = GetDirection(attackerStartPos, monster.position.tile); if (!IsRelativeMoveOK(monster, monster.position.old, dir)) { return; } @@ -4449,7 +4449,7 @@ void MissToMonst(Missile &missile, Point position) if (player->_pmode != PM_GOTHIT && player->_pmode != PM_DEATH) StartPlrHit(*player, 0, true); - Point newPosition = oldPosition + monster.direction; + Point newPosition = oldPosition + GetDirection(missile.position.start, oldPosition); if (PosOkPlayer(*player, newPosition)) { player->position.tile = newPosition; FixPlayerLocation(*player, player->_pdir); @@ -4470,7 +4470,7 @@ void MissToMonst(Missile &missile, Point position) if (IsAnyOf(monster.type().type, MT_NSNAKE, MT_RSNAKE, MT_BSNAKE, MT_GSNAKE)) return; - Point newPosition = oldPosition + monster.direction; + Point newPosition = oldPosition + GetDirection(missile.position.start, oldPosition); if (IsTileAvailable(*target, newPosition)) { monster.occupyTile(newPosition, false); dMonster[oldPosition.x][oldPosition.y] = 0; diff --git a/Source/monster.h b/Source/monster.h index 44d46ed31a5..a4d72243135 100644 --- a/Source/monster.h +++ b/Source/monster.h @@ -514,7 +514,7 @@ void ApplyMonsterDamage(DamageType damageType, Monster &monster, int damage); bool M_Talker(const Monster &monster); void M_StartStand(Monster &monster, Direction md); void M_ClearSquares(const Monster &monster); -void M_GetKnockback(Monster &monster); +void M_GetKnockback(Monster &monster, WorldTilePosition attackerStartPos); void M_StartHit(Monster &monster, int dam); void M_StartHit(Monster &monster, const Player &player, int dam); void StartMonsterDeath(Monster &monster, const Player &player, bool sendmsg); diff --git a/Source/msg.cpp b/Source/msg.cpp index 0a6e2e445bd..cbcfd6bcb31 100644 --- a/Source/msg.cpp +++ b/Source/msg.cpp @@ -1659,7 +1659,7 @@ size_t OnKnockback(const TCmd *pCmd, Player &player) if (gbBufferMsgs != 1 && player.isOnActiveLevel() && monsterIdx < MaxMonsters) { Monster &monster = Monsters[monsterIdx]; - M_GetKnockback(monster); + M_GetKnockback(monster, player.position.tile); M_StartHit(monster, player, 0); } diff --git a/Source/player.cpp b/Source/player.cpp index 2489fc473e1..a4e26c81f44 100644 --- a/Source/player.cpp +++ b/Source/player.cpp @@ -679,7 +679,7 @@ bool PlrHitMonst(Player &player, Monster &monster, bool adjacentDamage = false) M_StartKill(monster, player); } else { if (monster.mode != MonsterMode::Petrified && HasAnyOf(player._pIFlags, ItemSpecialEffect::Knockback)) - M_GetKnockback(monster); + M_GetKnockback(monster, player.position.tile); M_StartHit(monster, player, dam); } return true;