rendered paste bodyIndex: src/game/OutdoorPvP.cpp===================================================================--- src/game/OutdoorPvP.cpp (revision 0)+++ src/game/OutdoorPvP.cpp (revision 0)@@ -0,0 +1,8 @@+#include "OutdoorPvP.h"+#include "OutdoorPvPMgr.h"++void OutdoorPvP::HandlePlayerLeaveZone(Player * plr, uint32 zone)+{+ for(OutdoorPvPObjectiveMap::iterator itr = m_OutdoorPvPObjectives.begin(); itr != m_OutdoorPvPObjectives.end(); ++itr)+ itr->second.HandlePlayerLeave(plr);+}\ No newline at end of fileIndex: src/game/OutdoorPvP.h===================================================================--- src/game/OutdoorPvP.h (revision 0)+++ src/game/OutdoorPvP.h (revision 0)@@ -0,0 +1,63 @@+#ifndef OUTDOOR_PVP_H_+#define OUTDOOR_PVP_H_++#include "Util.h"++#include <map>+#include <set>++// some class predefs+class Player;+class GameObject;++class OutdoorPvPObjective+{+public:+ // when a team takes over an objective area, spawn / despawn gos and creatures accordingly+ virtual void SpawnNPCsForTeam(uint32 team) {}+ virtual void SpawnGOsForTeam(uint32 team) {}+ virtual void DeSpawnNPCsForTeam(uint32 team) {}+ virtual void DeSpawnGOsForTeam(uint32 team) {}++ virtual void HandlePlayerEnter(Player * plr) {}+ virtual void HandlePlayerLeave(Player * plr) {}+protected:+ // players in the area of the objective+ // 0 for ally, 1 for horde+ std::set<uint64> m_PlayerGuids[2];+};++// base class for specific outdoor pvp handlers+class OutdoorPvP+{+public:+ // ctor+ OutdoorPvP() {}+ // dtor+ ~OutdoorPvP() {}++ typedef std::map<uint32 /*explore area id*/, OutdoorPvPObjective> OutdoorPvPObjectiveMap;++ // called from Player::UpdateArea and when stealth status changes+ virtual void HandlePlayerEnterAreaFlag(Player * plr, uint32 areaflag) {}+ virtual void HandlePlayerLeaveAreaFlag(Player * plr, uint32 areaflag) {}+ // called from Player::UpdateZone to add / remove buffs given by outdoor pvp events+ virtual void HandlePlayerEnterZone(Player * plr, uint32 zone) {}+ virtual void HandlePlayerLeaveZone(Player * plr, uint32 zone);+ // called when a player triggers an areatrigger+ virtual void HandleAreaTrigger(Player * plr, uint32 trigger) {}+ // called on go use+ virtual void HandleGOUse(Player * plr, GameObject * go) {}++ // setup stuff+ virtual bool SetupOutdoorPvP() {return true;}++ //+ virtual void TeamTakeOverArea() {}++ virtual void Update(uint32 diff) {}+protected:+ OutdoorPvPObjectiveMap m_OutdoorPvPObjectives;+};++#endif /*OUTDOOR_PVP_H_*/\ No newline at end of fileIndex: src/game/OutdoorPvPEPL.cpp===================================================================--- src/game/OutdoorPvPEPL.cpp (revision 0)+++ src/game/OutdoorPvPEPL.cpp (revision 0)@@ -0,0 +1,10 @@+#include "OutdoorPvPEPL.h"+#include "OutdoorPvP.h"+#include "OutdoorPvPMgr.h"++bool OutdoorPvPEPL::SetupOutdoorPvP()+{+ for(int i = 0; i < OutdoorPvPEPLBuffZonesNum; ++i)+ sOutdoorPvPMgr.AddZone(OutdoorPvPEPLBuffZones[i],this);+ return true;+}\ No newline at end of fileIndex: src/game/OutdoorPvPEPL.h===================================================================--- src/game/OutdoorPvPEPL.h (revision 0)+++ src/game/OutdoorPvPEPL.h (revision 0)@@ -0,0 +1,37 @@+#ifndef OUTDOOR_PVP_EPL_+#define OUTDOOR_PVP_EPL_++#include "OutdoorPvP.h"++#define OutdoorPvPEPLBuffZonesNum 3+ // EPL Stratholme Scholomance+const uint32 OutdoorPvPEPLBuffZones[OutdoorPvPEPLBuffZonesNum] = { 139, 2017, 2057 };++// crown guard tower+class OutdoorPvPObjectiveEPL_CGT : public OutdoorPvPObjective+{++};++// eastwall tower+class OutdoorPvPObjectiveEPL_EWT : public OutdoorPvPObjective+{+};++// northpass tower+class OutdoorPvPObjectiveEPL_NPT : public OutdoorPvPObjective+{+};++// plaguewood tower+class OutdoorPvPObjectiveEPL_PWT : public OutdoorPvPObjective+{+};++class OutdoorPvPEPL : public OutdoorPvP+{+public:+ virtual bool SetupOutdoorPvP();+};++#endif\ No newline at end of fileIndex: src/game/OutdoorPvPMgr.cpp===================================================================--- src/game/OutdoorPvPMgr.cpp (revision 0)+++ src/game/OutdoorPvPMgr.cpp (revision 0)@@ -0,0 +1,66 @@+#include "OutdoorPvPMgr.h"+#include "OutdoorPvPEPL.h"+#include "Player.h"+#include "Policies/SingletonImp.h"++INSTANTIATE_SINGLETON_1( OutdoorPvPMgr );++OutdoorPvPMgr::OutdoorPvPMgr()+{+}++OutdoorPvPMgr::~OutdoorPvPMgr()+{+}++void OutdoorPvPMgr::InitOutdoorPvP()+{+ OutdoorPvP * pOP = new OutdoorPvPEPL;+ if(!pOP->SetupOutdoorPvP())+ delete pOP;+ else+ m_OutdoorPvPSet.insert(pOP);+}++void OutdoorPvPMgr::AddZone(uint32 zoneid, OutdoorPvP *handle)+{+ m_OutdoorPvPMap[zoneid] = handle;+}+++void OutdoorPvPMgr::HandlePlayerEnterZone(Player *plr, uint32 zoneid)+{+ OutdoorPvPMap::iterator itr = m_OutdoorPvPMap.find(zoneid);+ if(itr == m_OutdoorPvPMap.end())+ {+ // no handle for this zone, return+ return;+ }+ plr->SetInOutdoorPvPArea(true);+ // add possibly beneficial buffs to plr for zone+ itr->second->HandlePlayerEnterZone(plr, zoneid);+}++void OutdoorPvPMgr::HandlePlayerLeaveZone(Player *plr, uint32 zoneid)+{+ OutdoorPvPMap::iterator itr = m_OutdoorPvPMap.find(zoneid);+ if(itr == m_OutdoorPvPMap.end())+ {+ // no handle for this zone, return+ return;+ }+ plr->SetInOutdoorPvPArea(false);+ // inform the OutdoorPvP class of the leaving, it should remove the player from all objectives+ itr->second->HandlePlayerLeaveZone(plr, zoneid);+}++OutdoorPvP * OutdoorPvPMgr::GetOutdoorPvPToZoneId(uint32 zoneid)+{+ OutdoorPvPMap::iterator itr = m_OutdoorPvPMap.find(zoneid);+ if(itr == m_OutdoorPvPMap.end())+ {+ // no handle for this zone, return+ return NULL;+ }+ return itr->second;+}\ No newline at end of fileIndex: src/game/OutdoorPvPMgr.h===================================================================--- src/game/OutdoorPvPMgr.h (revision 0)+++ src/game/OutdoorPvPMgr.h (revision 0)@@ -0,0 +1,40 @@+#ifndef OUTDOOR_PVP_MGR_H_+#define OUTDOOR_PVP_MGR_H_++#include "OutdoorPvP.h"+#include "Policies/Singleton.h"++// class to handle player enter / leave / areatrigger / GO use events+class OutdoorPvPMgr+{+public:+ // ctor+ OutdoorPvPMgr();+ // dtor+ ~OutdoorPvPMgr();++ // create outdoor pvp events+ void InitOutdoorPvP();+ // called when a player enters an outdoor pvp area+ void HandlePlayerEnterZone(Player * plr, uint32 areaflag);+ // called when player leaves an outdoor pvp area+ void HandlePlayerLeaveZone(Player * plr, uint32 areaflag);+ // return assigned outdoor pvp+ OutdoorPvP * GetOutdoorPvPToZoneId(uint32 zoneid);++ void AddZone(uint32 zoneid, OutdoorPvP * handle);++ typedef std::set<OutdoorPvP*> OutdoorPvPSet;+ typedef std::map<uint32 /* zoneid */, OutdoorPvP*> OutdoorPvPMap;+private:+ // contains all initiated outdoor pvp events+ // used when initing / cleaning up+ OutdoorPvPSet m_OutdoorPvPSet;+ // maps the zone ids to an outdoor pvp event+ // used in player event handling+ OutdoorPvPMap m_OutdoorPvPMap;+};++#define sOutdoorPvPMgr MaNGOS::Singleton<OutdoorPvPMgr>::Instance()++#endif /*OUTDOOR_PVP_MGR_H_*/\ No newline at end of fileIndex: src/game/Player.cpp===================================================================--- src/game/Player.cpp (revision 5157)+++ src/game/Player.cpp (working copy)@@ -53,6 +53,8 @@ #include "BattleGround.h" #include "BattleGroundMgr.h" #include "BattleGroundAB.h"+#include "OutdoorPvP.h"+#include "OutdoorPvPMgr.h" #include "ArenaTeam.h" #include "Chat.h" #include "Database/DatabaseImpl.h"@@ -118,6 +120,11 @@ m_dismountCost = 0; + m_areaFlagUpdateId = 0;+ m_areaFlagUpdateTimer = 0;++ m_InOutdoorPvPArea = false;+ m_nextSave = sWorld.getConfig(CONFIG_INTERVAL_SAVE); // randomize first save time in range [CONFIG_INTERVAL_SAVE] around [CONFIG_INTERVAL_SAVE]@@ -949,6 +956,20 @@ m_zoneUpdateTimer -= p_time; } + if (m_areaFlagUpdateTimer > 0)+ {+ if(p_time >= m_areaFlagUpdateTimer)+ {+ uint32 newareaflag = GetAreaFlag();+ if( m_areaFlagUpdateId != newareaflag )+ UpdateAreaFlag(newareaflag);+ else+ m_areaFlagUpdateTimer = ZONE_UPDATE_INTERVAL;+ }+ else+ m_areaFlagUpdateTimer -= p_time;+ }+ if (isAlive()) { RegenerateAll();@@ -4958,6 +4979,11 @@ GetSession()->SendPacket(data); } +uint32 Player::GetAreaFlag()+{+ return MapManager::Instance().GetBaseMap(GetMapId())->GetAreaFlag(GetPositionX(),GetPositionY());+}+ void Player::CheckExploreSystem() { if (!isAlive())@@ -5707,8 +5733,56 @@ return zone; } +void Player::UpdateAreaFlag(uint32 newAreaFlag)+{+ m_areaFlagUpdateTimer = ZONE_UPDATE_INTERVAL;++ AreaTableEntry const* oldarea = GetAreaEntryByAreaFlag(m_areaFlagUpdateId);+ AreaTableEntry const* newarea = GetAreaEntryByAreaFlag(newAreaFlag);++ // return if either area not found+ if(!oldarea || !newarea)+ {+ m_areaFlagUpdateId = newAreaFlag;+ return;+ }++ // notify of leaving old areaflag if in outdoor pvp+ if(oldarea->flags & 0x8000)+ {+ if(InOutdoorPvPArea())+ {+ OutdoorPvP * pvp = sOutdoorPvPMgr.GetOutdoorPvPToZoneId(GetZoneId());+ if(pvp)+ {+ pvp->HandlePlayerLeaveAreaFlag(this, m_areaFlagUpdateId);+ }+ }+ }++ // change after calling the leave () stuff+ m_areaFlagUpdateId = newAreaFlag;++ // notify of entering if on outdoor pvp+ if(newarea->flags & 0x8000)+ {+ if(InOutdoorPvPArea())+ {+ OutdoorPvP * pvp = sOutdoorPvPMgr.GetOutdoorPvPToZoneId(GetZoneId());+ if(pvp)+ {+ pvp->HandlePlayerEnterAreaFlag(this, m_areaFlagUpdateId);+ }+ }+ }+}+ void Player::UpdateZone(uint32 newZone) {+ AreaTableEntry const* oldzone = GetAreaEntryByAreaID(newZone);+ if(oldzone && oldzone->flags & 0x8000)+ sOutdoorPvPMgr.HandlePlayerLeaveZone(this, oldzone->ID);+ m_zoneUpdateId = newZone; m_zoneUpdateTimer = ZONE_UPDATE_INTERVAL; @@ -5716,6 +5790,13 @@ if(!zone) return; + if(zone->flags & 0x8000)+ sOutdoorPvPMgr.HandlePlayerEnterZone(this, zone->ID);++ uint32 areaFlag = GetAreaFlag();+ if(m_areaFlagUpdateId != areaFlag)+ UpdateAreaFlag(areaFlag);+ if (sWorld.getConfig(CONFIG_WEATHER)) { Weather *wth = sWorld.FindWeather(zone->ID);@@ -16159,3 +16240,8 @@ item->SendTimeUpdate(this); } }++OutdoorPvP * Player::GetOutdoorPvP() const+{+ return sOutdoorPvPMgr.GetOutdoorPvPToZoneId(GetZoneId());+}Index: src/game/Player.h===================================================================--- src/game/Player.h (revision 5157)+++ src/game/Player.h (working copy)@@ -45,6 +45,7 @@ class PlayerMenu; class Transport; class UpdateMask;+class OutdoorPvP; typedef std::deque<Mail*> PlayerMails; @@ -1532,6 +1533,9 @@ void SetDontMove(bool dontMove); bool GetDontMove() const { return m_dontMove; } + uint32 GetAreaFlag();+ void UpdateAreaFlag(uint32 areaFlag);+ void CheckExploreSystem(void); static uint32 TeamForRace(uint8 race);@@ -1713,6 +1717,14 @@ bool GetBGAccessByLevel(uint32 bgTypeId) const; /*********************************************************/+ /*** OUTDOOR PVP SYSTEM ***/+ /*********************************************************/++ bool InOutdoorPvPArea() { return m_InOutdoorPvPArea; }+ void SetInOutdoorPvPArea(bool in) { m_InOutdoorPvPArea = in; }+ OutdoorPvP * GetOutdoorPvP() const;++ /*********************************************************/ /*** REST SYSTEM ***/ /*********************************************************/ @@ -2014,6 +2026,11 @@ uint32 m_deathTimer; time_t m_resurrectingSicknessExpire; + uint32 m_areaFlagUpdateId;+ uint32 m_areaFlagUpdateTimer;++ bool m_InOutdoorPvPArea;+ uint32 m_restTime; uint32 m_WeaponProficiency;Index: win/VC90/game.vcproj===================================================================--- win/VC90/game.vcproj (revision 5157)+++ win/VC90/game.vcproj (working copy)@@ -467,6 +467,30 @@ > </File> <File+ RelativePath="..\..\src\game\OutdoorPvP.cpp"+ >+ </File>+ <File+ RelativePath="..\..\src\game\OutdoorPvP.h"+ >+ </File>+ <File+ RelativePath="..\..\src\game\OutdoorPvPEPL.cpp"+ >+ </File>+ <File+ RelativePath="..\..\src\game\OutdoorPvPEPL.h"+ >+ </File>+ <File+ RelativePath="..\..\src\game\OutdoorPvPMgr.cpp"+ >+ </File>+ <File+ RelativePath="..\..\src\game\OutdoorPvPMgr.h"+ >+ </File>+ <File RelativePath="..\..\src\game\Path.h" > </File>