aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Player/Player.cpp12
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp16
2 files changed, 16 insertions, 12 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index cbd361d2e04..1f0cc2b8911 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -4505,6 +4505,7 @@ void Player::BuildPlayerRepop()
GetMap()->AddToMap(corpse);
// convert player body to ghost
+ setDeathState(DEAD);
SetHealth(1);
SetMovement(MOVE_WATER_WALK);
@@ -17613,6 +17614,10 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder)
GetSpellHistory()->LoadFromDB<Player>(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_SPELL_COOLDOWNS));
+ uint32 savedHealth = fields[55].GetUInt32();
+ 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())
@@ -17625,7 +17630,6 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder)
UpdateAllStats();
// restore remembered power/health values (but not more max values)
- uint32 savedHealth = fields[55].GetUInt32();
SetHealth(savedHealth);
for (uint8 i = 0; i < MAX_POWERS; ++i)
{
@@ -17902,14 +17906,14 @@ 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());
ApplyModByteFlag(PLAYER_FIELD_BYTES, PLAYER_FIELD_BYTES_OFFSET_FLAGS, PLAYER_FIELD_BYTE_RELEASE_TIMER, !sMapStore.LookupEntry(_corpseLocation.GetMapId())->Instanceable());
}
- 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 1756fa8e967..a762a0a6aae 100644
--- a/src/server/game/Handlers/CharacterHandler.cpp
+++ b/src/server/game/Handlers/CharacterHandler.cpp
@@ -857,15 +857,8 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder)
pCurrChar->LoadCorpse(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_CORPSE_LOCATION));
// setting Ghost+speed if dead
- if (pCurrChar->m_deathState != ALIVE)
- {
- // not blizz like, we must correctly save and load player instead...
- if (pCurrChar->getRace() == RACE_NIGHTELF)
- pCurrChar->CastSpell(pCurrChar, 20584, true);// auras SPELL_AURA_INCREASE_SPEED(+speed in wisp form), SPELL_AURA_INCREASE_SWIM_SPEED(+swim speed in wisp form), SPELL_AURA_TRANSFORM (to wisp form)
- pCurrChar->CastSpell(pCurrChar, 8326, true); // auras SPELL_AURA_GHOST, SPELL_AURA_INCREASE_SPEED(why?), SPELL_AURA_INCREASE_SWIM_SPEED(why?)
-
+ if (pCurrChar->m_deathState == DEAD)
pCurrChar->SetMovement(MOVE_WATER_WALK);
- }
pCurrChar->ContinueTaxiFlight();
@@ -998,6 +991,13 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder)
// Handle Login-Achievements (should be handled after loading)
_player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN, 1);
+ // if we're loading a dead player, repop them to the GY after the load is finished
+ if (pCurrChar->getDeathState() == CORPSE)
+ {
+ pCurrChar->BuildPlayerRepop();
+ pCurrChar->RepopAtGraveyard();
+ }
+
sScriptMgr->OnPlayerLogin(pCurrChar, firstLogin);
TC_METRIC_EVENT("player_events", "Login", pCurrChar->GetName());