diff options
| author | Rochet2 <tqbattlenet@gmail.com> | 2015-08-10 18:12:22 +0200 |
|---|---|---|
| committer | Carbenium <carbenium@outlook.com> | 2015-09-24 20:29:55 +0200 |
| commit | c3c7ab6ec765833e98799956a44ee9e59bf0af87 (patch) | |
| tree | 714be793debee7ea30d1acdb7bfc1e0b979ed3f8 /src/server/game/Entities/Player | |
| parent | bfb373ef22ba69b61caf174ec2c987d403ca805f (diff) | |
Core/RestState: Check area trigger radius instead of 1.0f distance
Closes #15016
Closes #15052
Signed-off-by: jackpoz <giacomopoz@gmail.com>
(cherry picked from commit 12931f4762d2592e4b28c6e6bf137b3348230c45)
Conflicts:
src/server/game/Entities/Player/Player.h
src/server/game/Handlers/MiscHandler.cpp
Diffstat (limited to 'src/server/game/Entities/Player')
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 55 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.h | 13 |
2 files changed, 46 insertions, 22 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 049db9251f5..5d84f587648 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -635,10 +635,7 @@ Player::Player(WorldSession* session) : Unit(true) ////////////////////Rest System///////////////////// time_inn_enter = 0; - inn_pos_mapid = 0; - inn_pos_x = 0.0f; - inn_pos_y = 0.0f; - inn_pos_z = 0.0f; + inn_triggerId = 0; m_rest_bonus = 0; rest_type = REST_TYPE_NO; ////////////////////Rest System///////////////////// @@ -1597,6 +1594,17 @@ void Player::Update(uint32 p_time) { if (p_time >= m_zoneUpdateTimer) { + // On zone update tick check if we are still in an inn if we are supposed to be in one + if (HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING) && GetRestType() == REST_TYPE_IN_TAVERN) + { + AreaTriggerEntry const* atEntry = sAreaTriggerStore.LookupEntry(GetInnTriggerId()); + if (!atEntry || !IsInAreaTriggerRadius(atEntry)) + { + RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING); + SetRestType(REST_TYPE_NO); + } + } + uint32 newzone, newarea; GetZoneAndAreaId(newzone, newarea); @@ -1787,12 +1795,9 @@ void Player::setDeathState(DeathState s) SetUInt32Value(PLAYER_SELF_RES_SPELL, 0); } -void Player::InnEnter(time_t time, uint32 mapid, float x, float y, float z) +void Player::InnEnter(time_t time, uint32 triggerId) { - inn_pos_mapid = mapid; - inn_pos_x = x; - inn_pos_y = y; - inn_pos_z = z; + inn_triggerId = triggerId; time_inn_enter = time; } @@ -2573,6 +2578,28 @@ void Player::SetInWater(bool apply) getHostileRefManager().updateThreatTables(); } +bool Player::IsInAreaTriggerRadius(const AreaTriggerEntry* trigger) const +{ + if (!trigger || GetMapId() != trigger->MapID) + return false; + + if (trigger->Radius > 0.f) + { + // if we have radius check it + float dist = GetDistance(trigger->Pos.X, trigger->Pos.Y, trigger->Pos.Z); + if (dist > trigger->Radius) + return false; + } + else + { + Position center(trigger->Pos.X, trigger->Pos.Y, trigger->Pos.Z, trigger->BoxYaw); + if (!IsWithinBox(center, trigger->BoxLength / 2.f, trigger->BoxWidth / 2.f, trigger->BoxHeight / 2.f)) + return false; + } + + return true; +} + void Player::SetGameMaster(bool on) { if (on) @@ -7214,7 +7241,7 @@ void Player::UpdateArea(uint32 newArea) { SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING); SetRestType(REST_TYPE_IN_FACTION_AREA); - InnEnter(time(0), GetMapId(), 0, 0, 0); + InnEnter(time(nullptr), 0); } else if (HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING) && GetRestType() == REST_TYPE_IN_FACTION_AREA) { @@ -7293,7 +7320,7 @@ void Player::UpdateZone(uint32 newZone, uint32 newArea) { SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING); SetRestType(REST_TYPE_IN_CITY); - InnEnter(time(0), GetMapId(), 0, 0, 0); + InnEnter(time(nullptr), 0); } pvpInfo.IsInNoPvPArea = true; } @@ -7303,8 +7330,10 @@ void Player::UpdateZone(uint32 newZone, uint32 newArea) { if (GetRestType() == REST_TYPE_IN_TAVERN) // Still inside a tavern or has recently left { - // Remove rest state if we have recently left a tavern. - if (GetMapId() != GetInnPosMapId() || GetExactDist(GetInnPosX(), GetInnPosY(), GetInnPosZ()) > 1.0f) + // check that we are still inside the tavern (in areatrigger radius) + + AreaTriggerEntry const* atEntry = sAreaTriggerStore.LookupEntry(GetInnTriggerId()); + if (!atEntry || !IsInAreaTriggerRadius(atEntry)) { RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING); SetRestType(REST_TYPE_NO); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index d16fc7a1fc1..db8a6170e9b 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1306,6 +1306,7 @@ class Player : public Unit, public GridObject<Player> bool IsInWater() const override { return m_isInWater; } bool IsUnderWater() const override; + bool IsInAreaTriggerRadius(const AreaTriggerEntry* trigger) const; void SendInitialPacketsBeforeAddToMap(); void SendInitialPacketsAfterAddToMap(); @@ -1367,7 +1368,7 @@ class Player : public Unit, public GridObject<Player> void setDeathState(DeathState s) override; // overwrite Unit::setDeathState - void InnEnter(time_t time, uint32 mapid, float x, float y, float z); + void InnEnter(time_t time, uint32 triggerId); float GetRestBonus() const { return m_rest_bonus; } void SetRestBonus(float rest_bonus_new); @@ -1375,10 +1376,7 @@ class Player : public Unit, public GridObject<Player> RestType GetRestType() const { return rest_type; } void SetRestType(RestType n_r_type) { rest_type = n_r_type; } - uint32 GetInnPosMapId() const { return inn_pos_mapid; } - float GetInnPosX() const { return inn_pos_x; } - float GetInnPosY() const { return inn_pos_y; } - float GetInnPosZ() const { return inn_pos_z; } + uint32 GetInnTriggerId() const { return inn_triggerId; } time_t GetTimeInnEnter() const { return time_inn_enter; } void UpdateInnerTime (time_t time) { time_inn_enter = time; } @@ -2823,10 +2821,7 @@ class Player : public Unit, public GridObject<Player> ////////////////////Rest System///////////////////// time_t time_inn_enter; - uint32 inn_pos_mapid; - float inn_pos_x; - float inn_pos_y; - float inn_pos_z; + uint32 inn_triggerId; float m_rest_bonus; RestType rest_type; ////////////////////Rest System///////////////////// |
