diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 053d5b4e3..842bfd574 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -5484,6 +5484,18 @@ Corpse* Player::CreateCorpse() return corpse; } +void Player::RemoveCorpse() +{ + if (GetCorpse()) + { + GetCorpse()->RemoveFromWorld(); + } + + SQLTransaction trans = CharacterDatabase.BeginTransaction(); + Corpse::DeleteFromDB(GetGUID(), trans); + CharacterDatabase.CommitTransaction(trans); +} + void Player::SpawnCorpseBones(bool triggerSave /*= true*/) { _corpseLocation.WorldRelocate(); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 8cad98ef4..0128371cb 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2030,6 +2030,7 @@ public: [[nodiscard]] Corpse* GetCorpse() const; void SpawnCorpseBones(bool triggerSave = true); Corpse* CreateCorpse(); + void RemoveCorpse(); void KillPlayer(); static void OfflineResurrect(ObjectGuid const guid, SQLTransaction& trans); bool HasCorpse() const { return _corpseLocation.GetMapId() != MAPID_INVALID; } diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index 9905b6ed0..e83745d52 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -190,6 +190,17 @@ void WorldSession::HandleMoveWorldportAck() } } + if (!corpse && mEntry->IsDungeon()) + { + // resurrect character upon entering instance when the corpse is not available anymore + if (GetPlayer()->GetCorpseLocation().GetMapId() == mEntry->MapID) + { + GetPlayer()->ResurrectPlayer(0.5f, false); + GetPlayer()->RemoveCorpse(); + } + } + + bool allowMount = !mEntry->IsDungeon() || mEntry->IsBattlegroundOrArena(); if (mInstance) {