diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 12 | ||||
-rw-r--r-- | src/server/game/Handlers/CharacterHandler.cpp | 16 |
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()); |