Index: src/game/Player.cpp =================================================================== --- src/game/Player.cpp (revision 5176) +++ src/game/Player.cpp (working copy) @@ -116,6 +116,9 @@ m_zoneUpdateId = 0; m_zoneUpdateTimer = 0; + m_areaUpdateId = 0; + m_areaUpdateTimer = 0; + m_dismountCost = 0; m_nextSave = sWorld.getConfig(CONFIG_INTERVAL_SAVE); @@ -949,6 +952,22 @@ m_zoneUpdateTimer -= p_time; } + // use area updates as well + // needed for free far all arenas for example + if (m_areaUpdateTimer > 0) + { + if(p_time >= m_areaUpdateTimer) + { + uint32 newarea = GetAreaId(); + if( m_areaUpdateId != newarea ) + UpdateArea(newarea); + else + m_areaUpdateTimer = ZONE_UPDATE_INTERVAL; + } + else + m_areaUpdateTimer -= p_time; + } + if (isAlive()) { RegenerateAll(); @@ -5675,8 +5694,32 @@ return zone; } +void Player::UpdateArea(uint32 newArea) +{ + // FFA_PVP flags are area and not zone id dependent + // so apply them accordingly + m_areaUpdateId = newArea; + m_areaUpdateTimer = ZONE_UPDATE_INTERVAL; + + AreaTableEntry const* area = GetAreaEntryByAreaID(newArea); + + if(area && (area->flags & 0x80)) + { + SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_FFA_PVP); + } + else + { + // remove ffa flag only if not ffapvp realm + // removal in sanctuaries and capitals is handled in zone update + if(HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_FFA_PVP) && !sWorld.IsFFAPvPRealm()) + RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_FFA_PVP); + } +} + void Player::UpdateZone(uint32 newZone) { + // zone changed, so area changed as well, update it + UpdateArea(GetAreaId()); m_zoneUpdateId = newZone; m_zoneUpdateTimer = ZONE_UPDATE_INTERVAL; Index: src/game/Player.h =================================================================== --- src/game/Player.h (revision 5176) +++ src/game/Player.h (working copy) @@ -1376,6 +1376,7 @@ PvPInfo pvpInfo; void UpdatePvP(bool state, bool ovrride=false); void UpdateZone(uint32 newZone); + void UpdateArea(uint32 newArea); void UpdatePvPFlag(time_t currTime); /** todo: -maybe move UpdateDuelFlag+DuelComplete to independent DuelHandler.. **/ @@ -2013,6 +2014,9 @@ uint32 m_zoneUpdateId; uint32 m_zoneUpdateTimer; + uint32 m_areaUpdateId; + uint32 m_areaUpdateTimer; + uint32 m_deathTimer; time_t m_resurrectingSicknessExpire;