[12098] Add OutdoorPvPMgr class

This commit is contained in:
stfx 2012-08-17 14:06:46 +02:00 committed by Antz
parent c972606a0f
commit dafd0adac1
3 changed files with 252 additions and 1 deletions

View file

@ -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<uint32, int8>::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;
}

View file

@ -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<uint32 /*capture point entry*/, int8 /*slider value*/> m_capturePointSlider;
// update interval
ShortIntervalTimer m_updateTimer;
};
#define sOutdoorPvPMgr MaNGOS::Singleton<OutdoorPvPMgr>::Instance()
#endif

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__
#define __REVISION_NR_H__
#define REVISION_NR "0127"
#define REVISION_NR "12098"
#endif // __REVISION_NR_H__