diff --git a/Source/missiles.cpp b/Source/missiles.cpp index adc0736dd..793b98481 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -245,7 +245,7 @@ bool MonsterMHit(int pnum, int monsterId, int mindam, int maxdam, int dist, miss monster.flags |= MFLAG_NOHEAL; if (monster.hitPoints >> 6 <= 0) { - M_StartKill(monsterId, pnum); + M_StartKill(monster, pnum); } else if (resist) { PlayEffect(monster, 1); } else { @@ -2156,13 +2156,14 @@ void AddGolem(Missile &missile, const AddMissileParameter ¶meter) int playerId = missile._misource; Player &player = Players[playerId]; + Monster &golem = Monsters[playerId]; - if (Monsters[playerId].position.tile != GolemHoldingCell && &player == MyPlayer) - M_StartKill(playerId, playerId); + if (golem.position.tile != GolemHoldingCell && &player == MyPlayer) + M_StartKill(golem, playerId); UseMana(player, SPL_GOLEM); - if (Monsters[playerId].position.tile == GolemHoldingCell) { + if (golem.position.tile == GolemHoldingCell) { std::optional spawnPosition = FindClosestValidPosition( [start = missile.position.start](Point target) { return !IsTileOccupied(target) && LineClearMissile(start, target); diff --git a/Source/monster.cpp b/Source/monster.cpp index 91117b1a7..60e415525 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -1300,7 +1300,7 @@ void CheckReflect(int monsterId, int pnum, int dam) monster.hitPoints -= mdam; dam = std::max(dam - mdam, 0); if (monster.hitPoints >> 6 <= 0) - M_StartKill(monsterId, pnum); + M_StartKill(monster, pnum); else M_StartHit(monster, pnum, mdam); } @@ -1388,10 +1388,11 @@ void MonsterAttackPlayer(int monsterId, int pnum, int hit, int minDam, int maxDa int mdam = (GenerateRnd(3) + 1) << 6; monster.hitPoints -= mdam; if (monster.hitPoints >> 6 <= 0) - M_StartKill(monsterId, pnum); + M_StartKill(monster, pnum); else M_StartHit(monster, pnum, mdam); } + if ((monster.flags & MFLAG_NOLIFESTEAL) == 0 && monster.type().type == MT_SKING && gbIsMultiplayer) monster.hitPoints += dam; if (player._pHitPoints >> 6 <= 0) { @@ -3924,15 +3925,12 @@ void StartMonsterDeath(Monster &monster, int pnum, bool sendmsg) MonsterDeath(monster, pnum, md, sendmsg); } -void M_StartKill(int monsterId, int pnum) +void M_StartKill(Monster &monster, int pnum) { - assert(static_cast(monsterId) < MaxMonsters); - Monster &monster = Monsters[monsterId]; - if (pnum == MyPlayerId) { delta_kill_monster(monster, monster.position.tile, *MyPlayer); - if (monsterId != pnum) { - NetSendCmdLocParam1(false, CMD_MONSTDEATH, monster.position.tile, monsterId); + if (&monster != &Monsters[pnum]) { + NetSendCmdLocParam1(false, CMD_MONSTDEATH, monster.position.tile, monster.getId()); } else { NetSendCmdLoc(MyPlayerId, false, CMD_KILLGOLEM, monster.position.tile); } diff --git a/Source/monster.h b/Source/monster.h index ff0c09d6d..73b9ce4ee 100644 --- a/Source/monster.h +++ b/Source/monster.h @@ -350,7 +350,7 @@ void M_GetKnockback(Monster &monster); void M_StartHit(Monster &monster, int dam); void M_StartHit(Monster &monster, int pnum, int dam); void StartMonsterDeath(Monster &monster, int pnum, bool sendmsg); -void M_StartKill(int monsterId, int pnum); +void M_StartKill(Monster &monster, int pnum); void M_SyncStartKill(int monsterId, Point position, int pnum); void M_UpdateRelations(const Monster &monster); void DoEnding(); diff --git a/Source/player.cpp b/Source/player.cpp index 62b6836de..eb8193adb 100644 --- a/Source/player.cpp +++ b/Source/player.cpp @@ -957,7 +957,7 @@ bool PlrHitMonst(int pnum, size_t monsterId, bool adjacentDamage = false) } #endif if ((monster.hitPoints >> 6) <= 0) { - M_StartKill(monsterId, pnum); + M_StartKill(monster, pnum); } else { if (monster.mode != MonsterMode::Petrified && HasAnyOf(player._pIFlags, ItemSpecialEffect::Knockback)) M_GetKnockback(monster); @@ -3139,9 +3139,9 @@ void SyncPlrKill(Player &player, int earflag) void RemovePlrMissiles(const Player &player) { if (leveltype != DTYPE_TOWN && &player == MyPlayer) { - auto &golem = Monsters[MyPlayerId]; + Monster &golem = Monsters[MyPlayerId]; if (golem.position.tile.x != 1 || golem.position.tile.y != 0) { - M_StartKill(MyPlayerId, MyPlayerId); + M_StartKill(golem, MyPlayerId); AddCorpse(golem.position.tile, golem.type().corpseId, golem.direction); int mx = golem.position.tile.x; int my = golem.position.tile.y;