diff --git a/src/game/OutdoorPvP/OutdoorPvPMgr.cpp b/src/game/OutdoorPvP/OutdoorPvPMgr.cpp index b166faf81..2bf1ff22a 100644 --- a/src/game/OutdoorPvP/OutdoorPvPMgr.cpp +++ b/src/game/OutdoorPvP/OutdoorPvPMgr.cpp @@ -15,3 +15,153 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#include "OutdoorPvPMgr.h" +#include "Policies/SingletonImp.h" +#include "OutdoorPvP.h" +#include "../GameObject.h" +#include "../World.h" +#include "Log.h" +#include "OutdoorPvPEP.h" +#include "OutdoorPvPGH.h" +#include "OutdoorPvPHP.h" +#include "OutdoorPvPNA.h" +#include "OutdoorPvPSI.h" +#include "OutdoorPvPTF.h" +#include "OutdoorPvPZM.h" + +INSTANTIATE_SINGLETON_1(OutdoorPvPMgr); + +OutdoorPvPMgr::OutdoorPvPMgr() +{ + m_updateTimer.SetInterval(TIMER_OPVP_MGR_UPDATE); + memset(&m_scripts, 0, sizeof(m_scripts)); +} + +OutdoorPvPMgr::~OutdoorPvPMgr() +{ + for (uint8 i = 0; i < MAX_OPVP_ID; ++i) + delete m_scripts[i]; +} + +/** + Function which loads all outdoor pvp scripts + */ +void OutdoorPvPMgr::InitOutdoorPvP() +{ + + sLog.outString(); + sLog.outString(">> Loaded %u Outdoor PvP zones", MAX_OPVP_ID); +} + +OutdoorPvP* OutdoorPvPMgr::GetScript(uint32 zoneId) +{ + switch (zoneId) + { + case ZONE_ID_SILITHUS: + return m_scripts[OPVP_ID_SI]; + case ZONE_ID_EASTERN_PLAGUELANDS: + return m_scripts[OPVP_ID_EP]; + case ZONE_ID_HELLFIRE_PENINSULA: + return m_scripts[OPVP_ID_HP]; + case ZONE_ID_ZANGARMARSH: + return m_scripts[OPVP_ID_ZM]; + case ZONE_ID_TEROKKAR_FOREST: + return m_scripts[OPVP_ID_TF]; + case ZONE_ID_NAGRAND: + return m_scripts[OPVP_ID_NA]; + case ZONE_ID_GRIZZLY_HILLS: + return m_scripts[OPVP_ID_GH]; + default: + return NULL; + } +} + +OutdoorPvP* OutdoorPvPMgr::GetScriptOfAffectedZone(uint32 zoneId) +{ + switch (zoneId) + { + case ZONE_ID_TEMPLE_OF_AQ: + case ZONE_ID_RUINS_OF_AQ: + case ZONE_ID_GATES_OF_AQ: + return m_scripts[OPVP_ID_SI]; + case ZONE_ID_STRATHOLME: + case ZONE_ID_SCHOLOMANCE: + return m_scripts[OPVP_ID_EP]; + case ZONE_ID_HELLFIRE_RAMPARTS: + case ZONE_ID_HELLFIRE_CITADEL: + case ZONE_ID_BLOOD_FURNACE: + case ZONE_ID_SHATTERED_HALLS: + case ZONE_ID_MAGTHERIDON_LAIR: + return m_scripts[OPVP_ID_HP]; + case ZONE_ID_SERPENTSHRINE_CAVERN: + case ZONE_ID_STREAMVAULT: + case ZONE_ID_UNDERBOG: + case ZONE_ID_SLAVE_PENS: + return m_scripts[OPVP_ID_ZM]; + case ZONE_ID_SHADOW_LABYRINTH: + case ZONE_ID_AUCHENAI_CRYPTS: + case ZONE_ID_SETHEKK_HALLS: + case ZONE_ID_MANA_TOMBS: + return m_scripts[OPVP_ID_TF]; + default: + return NULL; + } +} + +/** + Function that handles the players which enters a specific zone + + @param player to be handled in the event + @param zone id used for the current outdoor pvp script + */ +void OutdoorPvPMgr::HandlePlayerEnterZone(Player* player, uint32 zoneId) +{ + if (OutdoorPvP* script = GetScript(zoneId)) + script->HandlePlayerEnterZone(player, true); + else if (OutdoorPvP* script = GetScriptOfAffectedZone(zoneId)) + script->HandlePlayerEnterZone(player, false); +} + +/** + Function that handles the player who leaves a specific zone + + @param player to be handled in the event + @param zone id used for the current outdoor pvp script + */ +void OutdoorPvPMgr::HandlePlayerLeaveZone(Player* player, uint32 zoneId) +{ + // teleport: called once from Player::CleanupsBeforeDelete, once from Player::UpdateZone + if (OutdoorPvP* script = GetScript(zoneId)) + script->HandlePlayerLeaveZone(player, true); + else if (OutdoorPvP* script = GetScriptOfAffectedZone(zoneId)) + script->HandlePlayerLeaveZone(player, false); +} + +void OutdoorPvPMgr::Update(uint32 diff) +{ + m_updateTimer.Update(diff); + if (!m_updateTimer.Passed()) + return; + + for (uint8 i = 0; i < MAX_OPVP_ID; ++i) + (*m_scripts[i]).Update(m_updateTimer.GetCurrent()); + + m_updateTimer.Reset(); +} + +/** + Function that gets the capture point slider value + + @param capture point entry + */ +int8 OutdoorPvPMgr::GetCapturePointSliderValue(uint32 entry) +{ + std::map::iterator itr = m_capturePointSlider.find(entry); + + if (itr != m_capturePointSlider.end()) + return itr->second; + + // return default value if we can't find any + return CAPTURE_SLIDER_NEUTRAL; +} diff --git a/src/game/OutdoorPvP/OutdoorPvPMgr.h b/src/game/OutdoorPvP/OutdoorPvPMgr.h index 8b4d9a4ae..97d39c958 100644 --- a/src/game/OutdoorPvP/OutdoorPvPMgr.h +++ b/src/game/OutdoorPvP/OutdoorPvPMgr.h @@ -19,4 +19,105 @@ #ifndef WORLD_PVP_MGR_H #define WORLD_PVP_MGR_H +#include "Common.h" +#include "Policies/Singleton.h" +#include "Timer.h" + +enum +{ + TIMER_OPVP_MGR_UPDATE = MINUTE * IN_MILLISECONDS // 1 minute is enough for us but this might change with wintergrasp support +}; + +enum OutdoorPvPTypes +{ + OPVP_ID_SI = 0, + OPVP_ID_EP, + OPVP_ID_HP, + OPVP_ID_ZM, + OPVP_ID_TF, + OPVP_ID_NA, + OPVP_ID_GH, + + MAX_OPVP_ID +}; + +enum OutdoorPvPZones +{ + ZONE_ID_SILITHUS = 1377, + ZONE_ID_TEMPLE_OF_AQ = 3428, + ZONE_ID_RUINS_OF_AQ = 3429, + ZONE_ID_GATES_OF_AQ = 3478, + + ZONE_ID_EASTERN_PLAGUELANDS = 139, + ZONE_ID_STRATHOLME = 2017, + ZONE_ID_SCHOLOMANCE = 2057, + + ZONE_ID_HELLFIRE_PENINSULA = 3483, + ZONE_ID_HELLFIRE_RAMPARTS = 3562, + ZONE_ID_HELLFIRE_CITADEL = 3563, + ZONE_ID_BLOOD_FURNACE = 3713, + ZONE_ID_SHATTERED_HALLS = 3714, + ZONE_ID_MAGTHERIDON_LAIR = 3836, + + ZONE_ID_ZANGARMARSH = 3521, + ZONE_ID_SERPENTSHRINE_CAVERN = 3607, + ZONE_ID_STREAMVAULT = 3715, + ZONE_ID_UNDERBOG = 3716, + ZONE_ID_SLAVE_PENS = 3717, + + ZONE_ID_TEROKKAR_FOREST = 3519, + ZONE_ID_SHADOW_LABYRINTH = 3789, + ZONE_ID_AUCHENAI_CRYPTS = 3790, + ZONE_ID_SETHEKK_HALLS = 3791, + ZONE_ID_MANA_TOMBS = 3792, + + ZONE_ID_NAGRAND = 3518, + + ZONE_ID_GRIZZLY_HILLS = 394 +}; + +class Player; +class GameObject; +class Creature; +class OutdoorPvP; + +class OutdoorPvPMgr +{ + public: + OutdoorPvPMgr(); + ~OutdoorPvPMgr(); + + // load all outdoor pvp scripts + void InitOutdoorPvP(); + + // called when a player enters an outdoor pvp area + void HandlePlayerEnterZone(Player* player, uint32 zoneId); + + // called when player leaves an outdoor pvp area + void HandlePlayerLeaveZone(Player* player, uint32 zoneId); + + // return assigned outdoor pvp script + OutdoorPvP* GetScript(uint32 zoneId); + + void Update(uint32 diff); + + // Handle capture point stuff + int8 GetCapturePointSliderValue(uint32 entry); + void SetCapturePointSlider(uint32 entry, int8 value) { m_capturePointSlider[entry] = value; } + + private: + // return assigned outdoor pvp script + OutdoorPvP* GetScriptOfAffectedZone(uint32 zoneId); + + // contains all outdoor pvp scripts + OutdoorPvP* m_scripts[MAX_OPVP_ID]; + + std::map m_capturePointSlider; + + // update interval + ShortIntervalTimer m_updateTimer; +}; + +#define sOutdoorPvPMgr MaNGOS::Singleton::Instance() + #endif diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 54b824684..1382ad2ba 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "0127" + #define REVISION_NR "12098" #endif // __REVISION_NR_H__