aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Player
diff options
context:
space:
mode:
authorRochet2 <tqbattlenet@gmail.com>2015-08-10 18:12:22 +0200
committerCarbenium <carbenium@outlook.com>2015-09-24 20:29:55 +0200
commitc3c7ab6ec765833e98799956a44ee9e59bf0af87 (patch)
tree714be793debee7ea30d1acdb7bfc1e0b979ed3f8 /src/server/game/Entities/Player
parentbfb373ef22ba69b61caf174ec2c987d403ca805f (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.cpp55
-rw-r--r--src/server/game/Entities/Player/Player.h13
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/////////////////////