mirror of
https://github.com/mangosfour/server.git
synced 2025-12-16 04:37:00 +00:00
[12098] Add OutdoorPvPMgr class
This commit is contained in:
parent
c972606a0f
commit
dafd0adac1
3 changed files with 252 additions and 1 deletions
|
|
@ -15,3 +15,153 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
* 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;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,4 +19,105 @@
|
||||||
#ifndef WORLD_PVP_MGR_H
|
#ifndef WORLD_PVP_MGR_H
|
||||||
#define 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
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "0127"
|
#define REVISION_NR "12098"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue