aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTreeston <treeston.mmoc@gmail.com>2019-07-08 13:04:35 +0200
committerTreeston <treeston.mmoc@gmail.com>2019-07-08 14:09:57 +0200
commit671052575a36624b06379ee5e13a7fea26870194 (patch)
tree58c0a83ab97c78f724ac7d41456bd05099e391e9 /src
parent574a7c8d3d5f5a5660295deb70e905cf4dd756c4 (diff)
Entities/Player: Properly restore PvP-enabled state on login
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Player/Player.cpp38
-rw-r--r--src/server/game/Entities/Player/Player.h1
-rw-r--r--src/server/game/Handlers/MiscHandler.cpp2
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())