From 8e06e237e00b80f2e807faf182937432a413f471 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Mon, 27 Dec 2021 16:33:10 -0500 Subject: [PATCH] Entities/Player: Properly restore PvP-enabled state on login Port From (https://github.com/TrinityCore/TrinityCore/commit/a5d8807af8cb0f257f81fa5cf3ac70769b677575) --- Source/Game/Entities/Player/Player.Combat.cs | 29 ++++++++++++++------ Source/Game/Entities/Player/Player.DB.cs | 9 +++--- Source/Game/Handlers/MiscHandler.cs | 4 +-- 3 files changed, 28 insertions(+), 14 deletions(-) diff --git a/Source/Game/Entities/Player/Player.Combat.cs b/Source/Game/Entities/Player/Player.Combat.cs index eed907c1d..4043df08d 100644 --- a/Source/Game/Entities/Player/Player.Combat.cs +++ b/Source/Game/Entities/Player/Player.Combat.cs @@ -613,13 +613,14 @@ namespace Game.Entities public void UpdatePvPFlag(long currTime) { - if (!IsPvP()) - return; + if (pvpInfo.EndTimer != 0 && pvpInfo.EndTimer <= currTime) + { + pvpInfo.EndTimer = 0; + RemovePlayerFlag(PlayerFlags.PVPTimer); + } - if (pvpInfo.EndTimer == 0 || currTime < (pvpInfo.EndTimer + 300) || pvpInfo.IsHostile) - return; - - UpdatePvP(false); + if (IsPvP() && !pvpInfo.IsHostile && !HasPlayerFlag(PlayerFlags.InPVP | PlayerFlags.PVPTimer)) + UpdatePvP(false); } public void UpdatePvP(bool state, bool Override = false) @@ -631,11 +632,23 @@ namespace Game.Entities } else { - pvpInfo.EndTimer = GameTime.GetGameTime(); + pvpInfo.EndTimer = GameTime.GetGameTime() + 300; SetPvP(state); } } + void InitPvP() + { + if (HasPlayerFlag(PlayerFlags.InPVP)) + UpdatePvP(true, true); + else if (HasPlayerFlag(PlayerFlags.PVPTimer)) + { + UpdatePvP(true, true); + if (!pvpInfo.IsHostile) + pvpInfo.EndTimer = GameTime.GetGameTime() + 300; + } + } + public void UpdatePvPState(bool onlyFFA = false) { // @todo should we always synchronize UNIT_FIELD_BYTES_2, 1 of controller and controlled? @@ -668,7 +681,7 @@ namespace Game.Entities else // in friendly area { if (IsPvP() && !HasPlayerFlag(PlayerFlags.InPVP) && pvpInfo.EndTimer == 0) - pvpInfo.EndTimer = GameTime.GetGameTime(); // start toggle-off + pvpInfo.EndTimer = GameTime.GetGameTime() + 300; // start toggle-off } } diff --git a/Source/Game/Entities/Player/Player.DB.cs b/Source/Game/Entities/Player/Player.DB.cs index 083720e81..88c24078d 100644 --- a/Source/Game/Entities/Player/Player.DB.cs +++ b/Source/Game/Entities/Player/Player.DB.cs @@ -3056,11 +3056,10 @@ namespace Game.Entities // set value, including drunk invisibility detection // calculate sobering. after 15 minutes logged out, the player will be sober again - byte newDrunkValue = 0; if (time_diff < (uint)GetDrunkValue() * 9) - newDrunkValue = (byte)(GetDrunkValue() - time_diff / 9); - - SetDrunkValue(newDrunkValue); + SetDrunkValue((byte)(GetDrunkValue() - time_diff / 9)); + else + SetDrunkValue(0); m_createTime = createTime; m_createMode = createMode; @@ -3297,6 +3296,8 @@ namespace Game.Entities } } + InitPvP(); + // RaF stuff. if (GetSession().IsARecruiter() || (GetSession().GetRecruiterId() != 0)) AddDynamicFlag(UnitDynFlags.ReferAFriend); diff --git a/Source/Game/Handlers/MiscHandler.cs b/Source/Game/Handlers/MiscHandler.cs index b59c725f1..540aef0f9 100644 --- a/Source/Game/Handlers/MiscHandler.cs +++ b/Source/Game/Handlers/MiscHandler.cs @@ -511,7 +511,7 @@ namespace Game GetPlayer().RemovePlayerFlag(PlayerFlags.InPVP); GetPlayer().AddPlayerFlag(PlayerFlags.PVPTimer); if (!GetPlayer().pvpInfo.IsHostile && GetPlayer().IsPvP()) - GetPlayer().pvpInfo.EndTimer = GameTime.GetGameTime(); // start toggle-off + GetPlayer().pvpInfo.EndTimer = GameTime.GetGameTime() + 300; // start toggle-off } else { @@ -530,7 +530,7 @@ namespace Game GetPlayer().RemovePlayerFlag(PlayerFlags.InPVP); GetPlayer().AddPlayerFlag(PlayerFlags.PVPTimer); if (!GetPlayer().pvpInfo.IsHostile && GetPlayer().IsPvP()) - GetPlayer().pvpInfo.EndTimer = GameTime.GetGameTime(); // start toggle-off + GetPlayer().pvpInfo.EndTimer = GameTime.GetGameTime() + 300; // start toggle-off } else {