diff --git a/Source/msg.cpp b/Source/msg.cpp index 47cf3c5c6..0cb56dde6 100644 --- a/Source/msg.cpp +++ b/Source/msg.cpp @@ -1905,21 +1905,41 @@ size_t OnKnockback(const TCmdParam1 &message, Player &player) return sizeof(message); } -size_t OnResurrect(const TCmdParam1 &message, Player &player) +size_t OnResurrect(const TCmdParam1 &message, Player &caster) { const uint16_t playerIdx = Swap16LE(message.wParam1); if (gbBufferMsgs == 1) { - BufferMessage(player, &message, sizeof(message)); - } else if (playerIdx < Players.size()) { - DoResurrect(player, Players[playerIdx]); - if (&player == MyPlayer) - pfile_update(true); + BufferMessage(caster, &message, sizeof(message)); + return sizeof(message); + } + + if (playerIdx >= Players.size()) + return sizeof(message); + + Player &target = Players[playerIdx]; + + SpawnResurrectBeam(caster, target); + + if (&target == MyPlayer && target._pHitPoints <= 0) { + NetSendCmd(true, CMD_PLRALIVE); } return sizeof(message); } +size_t OnPlayerAlive(const TCmd &message, Player &target) +{ + if (gbBufferMsgs == 1) { + BufferMessage(target, &message, sizeof(message)); + return sizeof(message); + } + + ApplyResurrect(target); + + return sizeof(message); +} + size_t OnHealOther(const TCmdParam1 &message, const Player &caster) { const uint16_t playerIdx = Swap16LE(message.wParam1); @@ -3390,6 +3410,8 @@ size_t ParseCmd(uint8_t pnum, const TCmd *pCmd, size_t maxCmdSize) return HandleCmd(OnMonstDamage, player, pCmd, maxCmdSize); case CMD_PLRDEAD: return HandleCmd(OnPlayerDeath, player, pCmd, maxCmdSize); + case CMD_PLRALIVE: + return HandleCmd(OnPlayerAlive, player, pCmd, maxCmdSize); case CMD_PLRDAMAGE: return HandleCmd(OnPlayerDamage, player, pCmd, maxCmdSize); case CMD_OPENDOOR: diff --git a/Source/msg.h b/Source/msg.h index 124f14bb4..d0b51ad81 100644 --- a/Source/msg.h +++ b/Source/msg.h @@ -205,6 +205,10 @@ enum _cmd_id : uint8_t { // body (TCmdParam1): // int16_t ear_flag CMD_PLRDEAD, + // Player resurrection. + // + // body (TCmd) + CMD_PLRALIVE, // Lift item to hand request. // // body (TCmdGItem) diff --git a/Source/spells.cpp b/Source/spells.cpp index 06e4ec23a..9304f5b85 100644 --- a/Source/spells.cpp +++ b/Source/spells.cpp @@ -232,13 +232,21 @@ void CastSpell(Player &player, SpellID spl, WorldTilePosition src, WorldTilePosi } } -void DoResurrect(Player &player, Player &target) +void SpawnResurrectBeam(Player &caster, Player &target) { - AddMissile(target.position.tile, target.position.tile, Direction::South, MissileID::ResurrectBeam, TARGET_MONSTERS, player, 0, 0); - - if (!target.hasNoLife()) - return; + AddMissile( + target.position.tile, + target.position.tile, + Direction::South, + MissileID::ResurrectBeam, + TARGET_MONSTERS, + caster.getId(), + 0, + 0); +} +void ApplyResurrect(Player &target) +{ if (&target == MyPlayer) { MyPlayerIsDead = false; gamemenu_off(); diff --git a/Source/spells.h b/Source/spells.h index 81064f9a6..01b72e8b4 100644 --- a/Source/spells.h +++ b/Source/spells.h @@ -36,12 +36,8 @@ SpellCheckResult CheckSpell(const Player &player, SpellID sn, SpellType st, bool */ void EnsureValidReadiedSpell(Player &player); void CastSpell(Player &player, SpellID spl, WorldTilePosition src, WorldTilePosition dst, int spllvl); - -/** - * @param pnum player index - * @param rid target player index - */ -void DoResurrect(Player &player, Player &target); +void SpawnResurrectBeam(Player &caster, Player &target); +void ApplyResurrect(Player &target); void DoHealOther(const Player &caster, Player &target); int GetSpellBookLevel(SpellID s); int GetSpellStaffLevel(SpellID s);