diff options
author | Treeston <treeston.mmoc@gmail.com> | 2019-07-08 13:04:35 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2021-12-14 23:31:56 +0100 |
commit | a5d8807af8cb0f257f81fa5cf3ac70769b677575 (patch) | |
tree | cc78c859fbfa24c727d91ae6b1e234775a491fcd /src | |
parent | 3ad5bc1e15574e1534fe60e06772d4b293cdf13c (diff) |
Entities/Player: Properly restore PvP-enabled state on login
(cherry picked from commit 671052575a36624b06379ee5e13a7fea26870194)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 38 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 1 | ||||
-rw-r--r-- | src/server/game/Handlers/MiscHandler.cpp | 4 |
3 files changed, 29 insertions, 14 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 838c57edf19..d79ba16d24c 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -18357,11 +18357,10 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder* holder) // set value, including drunk invisibility detection // calculate sobering. after 15 minutes logged out, the player will be sober again - uint8 newDrunkValue = 0; if (time_diff < uint32(GetDrunkValue()) * 9) - newDrunkValue = GetDrunkValue() - time_diff / 9; - - SetDrunkValue(newDrunkValue); + SetDrunkValue(GetDrunkValue() - time_diff / 9); + else + SetDrunkValue(0); m_createTime = fields.createTime; m_createMode = fields.createMode; @@ -18602,6 +18601,8 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder* holder) } } + InitPvP(); + // RaF stuff. if (GetSession()->IsARecruiter() || (GetSession()->GetRecruiterId() != 0)) AddDynamicFlag(UNIT_DYNFLAG_REFER_A_FRIEND); @@ -21875,13 +21876,14 @@ void Player::ResetContestedPvP() void Player::UpdatePvPFlag(time_t currTime) { - if (!IsPvP()) - return; - - if (!pvpInfo.EndTimer || currTime < (pvpInfo.EndTimer + 300) || pvpInfo.IsHostile) - return; + if (pvpInfo.EndTimer && pvpInfo.EndTimer <= currTime) + { + pvpInfo.EndTimer = 0; + RemovePlayerFlag(PLAYER_FLAGS_PVP_TIMER); + } - UpdatePvP(false); + if (IsPvP() && !pvpInfo.IsHostile && !HasPlayerFlag(PlayerFlags(PLAYER_FLAGS_IN_PVP | PLAYER_FLAGS_PVP_TIMER))) + UpdatePvP(false); } void Player::UpdateDuelFlag(time_t currTime) @@ -23553,6 +23555,18 @@ void Player::UpdateHomebindTime(uint32 time) } } +void Player::InitPvP() +{ + if (HasPlayerFlag(PLAYER_FLAGS_IN_PVP)) + UpdatePvP(true, true); + else if (HasPlayerFlag(PLAYER_FLAGS_PVP_TIMER)) + { + UpdatePvP(true, true); + if (!pvpInfo.IsHostile) + pvpInfo.EndTimer = GameTime::GetGameTime() + 300; + } +} + void Player::UpdatePvPState(bool onlyFFA) { /// @todo should we always synchronize UNIT_FIELD_BYTES_2, 1 of controller and controlled? @@ -23585,7 +23599,7 @@ void Player::UpdatePvPState(bool onlyFFA) else // in friendly area { if (IsPvP() && !HasPlayerFlag(PLAYER_FLAGS_IN_PVP) && !pvpInfo.EndTimer) - pvpInfo.EndTimer = GameTime::GetGameTime(); // start toggle-off + pvpInfo.EndTimer = GameTime::GetGameTime() + 300; // start toggle-off } } @@ -23605,7 +23619,7 @@ void Player::UpdatePvP(bool state, bool _override) } else { - pvpInfo.EndTimer = GameTime::GetGameTime(); + pvpInfo.EndTimer = GameTime::GetGameTime() + 300; SetPvP(state); } } diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 7aba4547820..2b228b45421 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1891,6 +1891,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> void SetMultiActionBars(uint8 mask) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::MultiActionBars), mask); } PvPInfo pvpInfo; + void InitPvP(); void UpdatePvPState(bool onlyFFA = false); void SetPvP(bool state) override; void UpdatePvP(bool state, bool override = false); diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 3769220bc3e..0c7f5582ba1 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -318,7 +318,7 @@ void WorldSession::HandleTogglePvP(WorldPackets::Misc::TogglePvP& /*packet*/) GetPlayer()->RemovePlayerFlag(PLAYER_FLAGS_IN_PVP); GetPlayer()->AddPlayerFlag(PLAYER_FLAGS_PVP_TIMER); if (!GetPlayer()->pvpInfo.IsHostile && GetPlayer()->IsPvP()) - GetPlayer()->pvpInfo.EndTimer = GameTime::GetGameTime(); // start toggle-off + GetPlayer()->pvpInfo.EndTimer = GameTime::GetGameTime() + 300; // start toggle-off } else { @@ -336,7 +336,7 @@ void WorldSession::HandleSetPvP(WorldPackets::Misc::SetPvP& packet) GetPlayer()->RemovePlayerFlag(PLAYER_FLAGS_IN_PVP); GetPlayer()->AddPlayerFlag(PLAYER_FLAGS_PVP_TIMER); if (!GetPlayer()->pvpInfo.IsHostile && GetPlayer()->IsPvP()) - GetPlayer()->pvpInfo.EndTimer = GameTime::GetGameTime(); // start toggle-off + GetPlayer()->pvpInfo.EndTimer = GameTime::GetGameTime() + 300; // start toggle-off } else { |