aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTreeston <treeston.mmoc@gmail.com>2018-09-12 15:28:03 +0200
committerShauren <shauren.trinity@gmail.com>2021-10-27 00:28:50 +0200
commitfdb3f4159e5e7865429e5b7212fba1ef602e6839 (patch)
tree26e1c8c3ff4313c5ac55c388ab44699df6036aab
parentc8b11f7e3db8b40a0c02a759d722dff0f7c55fe8 (diff)
Core/Unit: Erm, so it turns out that releasing your spirit actually never set your death state to DEAD. It stayed as CORPSE. That's wrong, of course, but we didn't notice because zombie corpses (see f50a8e5).
Zombie corpses are gone, so now it caused a bug. That's fixed too. Closes #21873. (Finally.) (cherry picked from commit 7bc16e2ee6ace39588a991537ff28811000a16c2)
-rw-r--r--src/server/game/Entities/Player/Player.cpp12
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp2
2 files changed, 9 insertions, 5 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 46353a48817..150693ce2e8 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -4297,6 +4297,7 @@ void Player::BuildPlayerRepop()
GetMap()->AddToMap(corpse);
// convert player body to ghost
+ setDeathState(DEAD);
SetHealth(1);
SetWaterWalking(true);
@@ -18415,6 +18416,10 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder* holder)
GetSpellHistory()->LoadFromDB<Player>(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_SPELL_COOLDOWNS), holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_SPELL_CHARGES));
+ uint32 savedHealth = fields.health;
+ if (!savedHealth)
+ m_deathState = CORPSE;
+
// Spell code allow apply any auras to dead character in load time in aura/spell/item loading
// Do now before stats re-calculation cleanup for ghost state unexpected auras
if (!IsAlive())
@@ -18427,7 +18432,6 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder* holder)
UpdateAllStats();
// restore remembered power/health values (but not more max values)
- uint32 savedHealth = fields.health;
SetHealth(savedHealth > GetMaxHealth() ? GetMaxHealth() : savedHealth);
uint32 loadedPowers = 0;
for (uint32 i = 0; i < MAX_POWERS; ++i)
@@ -18797,7 +18801,9 @@ void Player::LoadCorpse(PreparedQueryResult result)
if (!IsAlive())
{
- if (result && !HasAtLoginFlag(AT_LOGIN_RESURRECT))
+ if (HasAtLoginFlag(AT_LOGIN_RESURRECT))
+ ResurrectPlayer(0.5f);
+ else if (result)
{
Field* fields = result->Fetch();
_corpseLocation.WorldRelocate(fields[0].GetUInt16(), fields[1].GetFloat(), fields[2].GetFloat(), fields[3].GetFloat(), fields[4].GetFloat());
@@ -18806,8 +18812,6 @@ void Player::LoadCorpse(PreparedQueryResult result)
else
RemovePlayerLocalFlag(PLAYER_LOCAL_FLAG_RELEASE_TIMER);
}
- else
- ResurrectPlayer(0.5f);
}
RemoveAtLoginFlag(AT_LOGIN_RESURRECT);
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp
index 5412042cdc7..66b93bb0a39 100644
--- a/src/server/game/Handlers/CharacterHandler.cpp
+++ b/src/server/game/Handlers/CharacterHandler.cpp
@@ -1236,7 +1236,7 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder)
});
// setting Ghost+speed if dead
- if (pCurrChar->m_deathState != ALIVE)
+ if (pCurrChar->m_deathState == DEAD)
{
// not blizz like, we must correctly save and load player instead...
if (pCurrChar->getRace() == RACE_NIGHTELF && !pCurrChar->HasAura(20584))