From a355b4d27c197c8945b71a8eaad8fff00990e3b5 Mon Sep 17 00:00:00 2001 From: Axel Cocat Date: Sat, 29 May 2021 15:37:34 +0200 Subject: [PATCH] fix(Core): fix instance portal not resurrecting when corpse is not spawned (#6106) --- src/server/game/Entities/Player/Player.cpp | 12 ++++++++++++ src/server/game/Entities/Player/Player.h | 1 + src/server/game/Handlers/MovementHandler.cpp | 11 +++++++++++ 3 files changed, 24 insertions(+) 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) {