diff options
author | Treeston <treeston.mmoc@gmail.com> | 2019-07-08 13:04:35 +0200 |
---|---|---|
committer | Treeston <treeston.mmoc@gmail.com> | 2019-07-08 14:09:57 +0200 |
commit | 671052575a36624b06379ee5e13a7fea26870194 (patch) | |
tree | 58c0a83ab97c78f724ac7d41456bd05099e391e9 /src | |
parent | 574a7c8d3d5f5a5660295deb70e905cf4dd756c4 (diff) |
Entities/Player: Properly restore PvP-enabled state on login
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 | 2 |
3 files changed, 28 insertions, 13 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 83f5bddcba0..452f84c4d91 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -17550,11 +17550,10 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *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_cinematic = fields[23].GetUInt8(); m_Played_time[PLAYED_TIME_TOTAL] = fields[24].GetUInt32(); @@ -17787,6 +17786,8 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) } } + InitPvP(); + // RaF stuff. m_grantableLevels = fields[71].GetUInt8(); if (GetSession()->IsARecruiter() || (GetSession()->GetRecruiterId() != 0)) @@ -20499,13 +20500,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; + RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_PVP_TIMER); + } - UpdatePvP(false); + if (IsPvP() && !pvpInfo.IsHostile && !HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP | PLAYER_FLAGS_PVP_TIMER)) + UpdatePvP(false); } void Player::UpdateDuelFlag(time_t currTime) @@ -21812,6 +21814,18 @@ void Player::UpdateHomebindTime(uint32 time) } } +void Player::InitPvP() +{ + if (HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP)) + UpdatePvP(true, true); + else if (HasFlag(PLAYER_FLAGS, 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? @@ -21844,7 +21858,7 @@ void Player::UpdatePvPState(bool onlyFFA) else // in friendly area { if (IsPvP() && !HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP) && !pvpInfo.EndTimer) - pvpInfo.EndTimer = GameTime::GetGameTime(); // start toggle-off + pvpInfo.EndTimer = GameTime::GetGameTime() + 300; // start toggle-off } } @@ -21864,7 +21878,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 5145206a6db..98622df90cc 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1516,6 +1516,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> bool IsActionButtonDataValid(uint8 button, uint32 action, uint8 type) const; 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 63d27951c7f..97e0cb2bdac 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -466,7 +466,7 @@ void WorldSession::HandleTogglePvP(WorldPacket& recvData) else { if (!GetPlayer()->pvpInfo.IsHostile && GetPlayer()->IsPvP()) - GetPlayer()->pvpInfo.EndTimer = GameTime::GetGameTime(); // start toggle-off + GetPlayer()->pvpInfo.EndTimer = GameTime::GetGameTime() + 300; // start toggle-off } //if (OutdoorPvP* pvp = _player->GetOutdoorPvP()) |