mirror of
https://github.com/mangosfour/server.git
synced 2025-12-15 10:37:02 +00:00
Implement Eastern Plaguelands Outdoor PvP script
This commit is contained in:
parent
71527025e6
commit
1583aea453
3 changed files with 590 additions and 1 deletions
|
|
@ -15,3 +15,344 @@
|
||||||
* 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 "OutdoorPvPEP.h"
|
||||||
|
#include "WorldPacket.h"
|
||||||
|
#include "../World.h"
|
||||||
|
#include "../ObjectMgr.h"
|
||||||
|
#include "../Object.h"
|
||||||
|
#include "../Creature.h"
|
||||||
|
#include "../GameObject.h"
|
||||||
|
#include "../Player.h"
|
||||||
|
|
||||||
|
OutdoorPvPEP::OutdoorPvPEP() : OutdoorPvP(),
|
||||||
|
m_towersAlliance(0),
|
||||||
|
m_towersHorde(0)
|
||||||
|
{
|
||||||
|
m_towerWorldState[0] = WORLD_STATE_EP_NORTHPASS_NEUTRAL;
|
||||||
|
m_towerWorldState[1] = WORLD_STATE_EP_CROWNGUARD_NEUTRAL;
|
||||||
|
m_towerWorldState[2] = WORLD_STATE_EP_EASTWALL_NEUTRAL;
|
||||||
|
m_towerWorldState[3] = WORLD_STATE_EP_PLAGUEWOOD_NEUTRAL;
|
||||||
|
|
||||||
|
for (uint8 i = 0; i < MAX_EP_TOWERS; ++i)
|
||||||
|
m_towerOwner[i] = TEAM_NONE;
|
||||||
|
|
||||||
|
// initially set graveyard owner to neither faction
|
||||||
|
sObjectMgr.SetGraveYardLinkTeam(GRAVEYARD_ID_EASTERN_PLAGUE, GRAVEYARD_ZONE_EASTERN_PLAGUE, TEAM_INVALID);
|
||||||
|
}
|
||||||
|
|
||||||
|
void OutdoorPvPEP::FillInitialWorldStates(WorldPacket& data, uint32& count)
|
||||||
|
{
|
||||||
|
FillInitialWorldState(data, count, WORLD_STATE_EP_TOWER_COUNT_ALLIANCE, m_towersAlliance);
|
||||||
|
FillInitialWorldState(data, count, WORLD_STATE_EP_TOWER_COUNT_HORDE, m_towersHorde);
|
||||||
|
|
||||||
|
for (uint8 i = 0; i < MAX_EP_TOWERS; ++i)
|
||||||
|
FillInitialWorldState(data, count, m_towerWorldState[i], WORLD_STATE_ADD);
|
||||||
|
}
|
||||||
|
|
||||||
|
void OutdoorPvPEP::SendRemoveWorldStates(Player* player)
|
||||||
|
{
|
||||||
|
for (uint8 i = 0; i < MAX_EP_TOWERS; ++i)
|
||||||
|
player->SendUpdateWorldState(m_towerWorldState[i], WORLD_STATE_REMOVE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void OutdoorPvPEP::HandlePlayerEnterZone(Player* player, bool isMainZone)
|
||||||
|
{
|
||||||
|
OutdoorPvP::HandlePlayerEnterZone(player, isMainZone);
|
||||||
|
|
||||||
|
// remove the buff from the player first; Sometimes on relog players still have the aura
|
||||||
|
for (uint8 i = 0; i < MAX_EP_TOWERS; ++i)
|
||||||
|
player->RemoveAurasDueToSpell(player->GetTeam() == ALLIANCE ? plaguelandsTowerBuffs[i].spellIdAlliance : plaguelandsTowerBuffs[i].spellIdHorde);
|
||||||
|
|
||||||
|
// buff the player
|
||||||
|
switch (player->GetTeam())
|
||||||
|
{
|
||||||
|
case ALLIANCE:
|
||||||
|
if (m_towersAlliance > 0)
|
||||||
|
player->CastSpell(player, plaguelandsTowerBuffs[m_towersAlliance - 1].spellIdAlliance, true);
|
||||||
|
break;
|
||||||
|
case HORDE:
|
||||||
|
if (m_towersHorde > 0)
|
||||||
|
player->CastSpell(player, plaguelandsTowerBuffs[m_towersHorde - 1].spellIdHorde, true);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void OutdoorPvPEP::HandlePlayerLeaveZone(Player* player, bool isMainZone)
|
||||||
|
{
|
||||||
|
// remove the buff from the player
|
||||||
|
for (uint8 i = 0; i < MAX_EP_TOWERS; ++i)
|
||||||
|
player->RemoveAurasDueToSpell(player->GetTeam() == ALLIANCE ? plaguelandsTowerBuffs[i].spellIdAlliance : plaguelandsTowerBuffs[i].spellIdHorde);
|
||||||
|
|
||||||
|
OutdoorPvP::HandlePlayerLeaveZone(player, isMainZone);
|
||||||
|
}
|
||||||
|
|
||||||
|
void OutdoorPvPEP::HandleCreatureCreate(Creature* creature)
|
||||||
|
{
|
||||||
|
switch (creature->GetEntry())
|
||||||
|
{
|
||||||
|
case NPC_SPECTRAL_FLIGHT_MASTER:
|
||||||
|
m_flightMaster = creature->GetObjectGuid();
|
||||||
|
creature->setFaction(m_towerOwner[TOWER_ID_PLAGUEWOOD] == ALLIANCE ? FACTION_FLIGHT_MASTER_ALLIANCE : FACTION_FLIGHT_MASTER_HORDE);
|
||||||
|
creature->CastSpell(creature, m_towerOwner[TOWER_ID_PLAGUEWOOD] == ALLIANCE ? SPELL_SPIRIT_PARTICLES_BLUE : SPELL_SPIRIT_PARTICLES_RED, true);
|
||||||
|
break;
|
||||||
|
case NPC_LORDAERON_COMMANDER:
|
||||||
|
case NPC_LORDAERON_SOLDIER:
|
||||||
|
case NPC_LORDAERON_VETERAN:
|
||||||
|
case NPC_LORDAERON_FIGHTER:
|
||||||
|
m_soldiers.push_back(creature->GetObjectGuid());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void OutdoorPvPEP::HandleGameObjectCreate(GameObject* go)
|
||||||
|
{
|
||||||
|
switch (go->GetEntry())
|
||||||
|
{
|
||||||
|
case GO_TOWER_BANNER_NORTHPASS:
|
||||||
|
InitBanner(go, TOWER_ID_NORTHPASS);
|
||||||
|
break;
|
||||||
|
case GO_TOWER_BANNER_CROWNGUARD:
|
||||||
|
InitBanner(go, TOWER_ID_CROWNGUARD);
|
||||||
|
break;
|
||||||
|
case GO_TOWER_BANNER_EASTWALL:
|
||||||
|
InitBanner(go, TOWER_ID_EASTWALL);
|
||||||
|
break;
|
||||||
|
case GO_TOWER_BANNER_PLAGUEWOOD:
|
||||||
|
InitBanner(go, TOWER_ID_PLAGUEWOOD);
|
||||||
|
break;
|
||||||
|
case GO_TOWER_BANNER:
|
||||||
|
// sort banners
|
||||||
|
if (go->IsWithinDist2d(plaguelandsTowerLocations[TOWER_ID_NORTHPASS][0], plaguelandsTowerLocations[TOWER_ID_NORTHPASS][1], 50.0f))
|
||||||
|
InitBanner(go, TOWER_ID_NORTHPASS);
|
||||||
|
else if (go->IsWithinDist2d(plaguelandsTowerLocations[TOWER_ID_CROWNGUARD][0], plaguelandsTowerLocations[TOWER_ID_CROWNGUARD][1], 50.0f))
|
||||||
|
InitBanner(go, TOWER_ID_CROWNGUARD);
|
||||||
|
else if (go->IsWithinDist2d(plaguelandsTowerLocations[TOWER_ID_EASTWALL][0], plaguelandsTowerLocations[TOWER_ID_EASTWALL][1], 50.0f))
|
||||||
|
InitBanner(go, TOWER_ID_EASTWALL);
|
||||||
|
else if (go->IsWithinDist2d(plaguelandsTowerLocations[TOWER_ID_PLAGUEWOOD][0], plaguelandsTowerLocations[TOWER_ID_PLAGUEWOOD][1], 50.0f))
|
||||||
|
InitBanner(go, TOWER_ID_PLAGUEWOOD);
|
||||||
|
break;
|
||||||
|
case GO_LORDAERON_SHRINE_ALLIANCE:
|
||||||
|
m_lordaeronShrineAlliance = go->GetObjectGuid();
|
||||||
|
break;
|
||||||
|
case GO_LORDAERON_SHRINE_HORDE:
|
||||||
|
m_lordaeronShrineHorde = go->GetObjectGuid();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void OutdoorPvPEP::HandleObjectiveComplete(uint32 eventId, std::list<Player*> players, Team team)
|
||||||
|
{
|
||||||
|
uint32 credit = 0;
|
||||||
|
|
||||||
|
switch (eventId)
|
||||||
|
{
|
||||||
|
case EVENT_CROWNGUARD_PROGRESS_ALLIANCE:
|
||||||
|
case EVENT_CROWNGUARD_PROGRESS_HORDE:
|
||||||
|
credit = NPC_CROWNGUARD_TOWER_QUEST_DOODAD;
|
||||||
|
break;
|
||||||
|
case EVENT_EASTWALL_PROGRESS_ALLIANCE:
|
||||||
|
case EVENT_EASTWALL_PROGRESS_HORDE:
|
||||||
|
credit = NPC_EASTWALL_TOWER_QUEST_DOODAD;
|
||||||
|
break;
|
||||||
|
case EVENT_NORTHPASS_PROGRESS_ALLIANCE:
|
||||||
|
case EVENT_NORTHPASS_PROGRESS_HORDE:
|
||||||
|
credit = NPC_NORTHPASS_TOWER_QUEST_DOODAD;
|
||||||
|
break;
|
||||||
|
case EVENT_PLAGUEWOOD_PROGRESS_ALLIANCE:
|
||||||
|
case EVENT_PLAGUEWOOD_PROGRESS_HORDE:
|
||||||
|
credit = NPC_PLAGUEWOOD_TOWER_QUEST_DOODAD;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (std::list<Player*>::iterator itr = players.begin(); itr != players.end(); ++itr)
|
||||||
|
{
|
||||||
|
if ((*itr) && (*itr)->GetTeam() == team)
|
||||||
|
{
|
||||||
|
(*itr)->KilledMonsterCredit(credit);
|
||||||
|
(*itr)->RewardHonor(NULL, 1, HONOR_REWARD_PLAGUELANDS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// process the capture events
|
||||||
|
bool OutdoorPvPEP::HandleEvent(uint32 eventId, GameObject* go)
|
||||||
|
{
|
||||||
|
for (uint8 i = 0; i < MAX_EP_TOWERS; ++i)
|
||||||
|
{
|
||||||
|
if (plaguelandsBanners[i] == go->GetEntry())
|
||||||
|
{
|
||||||
|
for (uint8 j = 0; j < 4; ++j)
|
||||||
|
{
|
||||||
|
if (plaguelandsTowerEvents[i][j].eventEntry == eventId)
|
||||||
|
{
|
||||||
|
// prevent processing if the owner did not change (happens if progress event is called after contest event)
|
||||||
|
if (plaguelandsTowerEvents[i][j].team != m_towerOwner[i])
|
||||||
|
{
|
||||||
|
if (plaguelandsTowerEvents[i][j].defenseMessage)
|
||||||
|
sWorld.SendDefenseMessage(ZONE_ID_EASTERN_PLAGUELANDS, plaguelandsTowerEvents[i][j].defenseMessage);
|
||||||
|
|
||||||
|
return ProcessCaptureEvent(go, i, plaguelandsTowerEvents[i][j].team, plaguelandsTowerEvents[i][j].worldState);
|
||||||
|
}
|
||||||
|
// no need to iterate other events or towers
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// no need to iterate other towers
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool OutdoorPvPEP::ProcessCaptureEvent(GameObject* go, uint32 towerId, Team team, uint32 newWorldState)
|
||||||
|
{
|
||||||
|
if (team == ALLIANCE)
|
||||||
|
{
|
||||||
|
// update banner
|
||||||
|
for (GuidList::const_iterator itr = m_towerBanners[towerId].begin(); itr != m_towerBanners[towerId].end(); ++itr)
|
||||||
|
SetBannerVisual(go, (*itr), CAPTURE_ARTKIT_ALLIANCE, CAPTURE_ANIM_ALLIANCE);
|
||||||
|
|
||||||
|
// update counter
|
||||||
|
++m_towersAlliance;
|
||||||
|
SendUpdateWorldState(WORLD_STATE_EP_TOWER_COUNT_ALLIANCE, m_towersAlliance);
|
||||||
|
|
||||||
|
// buff players
|
||||||
|
BuffTeam(ALLIANCE, plaguelandsTowerBuffs[m_towersAlliance - 1].spellIdAlliance);
|
||||||
|
}
|
||||||
|
else if (team == HORDE)
|
||||||
|
{
|
||||||
|
// update banner
|
||||||
|
for (GuidList::const_iterator itr = m_towerBanners[towerId].begin(); itr != m_towerBanners[towerId].end(); ++itr)
|
||||||
|
SetBannerVisual(go, (*itr), CAPTURE_ARTKIT_HORDE, CAPTURE_ANIM_HORDE);
|
||||||
|
|
||||||
|
// update counter
|
||||||
|
++m_towersHorde;
|
||||||
|
SendUpdateWorldState(WORLD_STATE_EP_TOWER_COUNT_HORDE, m_towersHorde);
|
||||||
|
|
||||||
|
// buff players
|
||||||
|
BuffTeam(HORDE, plaguelandsTowerBuffs[m_towersHorde - 1].spellIdHorde);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// update banner
|
||||||
|
for (GuidList::const_iterator itr = m_towerBanners[towerId].begin(); itr != m_towerBanners[towerId].end(); ++itr)
|
||||||
|
SetBannerVisual(go, (*itr), CAPTURE_ARTKIT_NEUTRAL, CAPTURE_ANIM_NEUTRAL);
|
||||||
|
|
||||||
|
if (m_towerOwner[towerId] == ALLIANCE)
|
||||||
|
{
|
||||||
|
// update counter
|
||||||
|
--m_towersAlliance;
|
||||||
|
SendUpdateWorldState(WORLD_STATE_EP_TOWER_COUNT_ALLIANCE, m_towersAlliance);
|
||||||
|
|
||||||
|
if (m_towersAlliance == 0)
|
||||||
|
BuffTeam(ALLIANCE, plaguelandsTowerBuffs[0].spellIdAlliance, true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// update counter
|
||||||
|
--m_towersHorde;
|
||||||
|
SendUpdateWorldState(WORLD_STATE_EP_TOWER_COUNT_HORDE, m_towersHorde);
|
||||||
|
|
||||||
|
if (m_towersHorde == 0)
|
||||||
|
BuffTeam(HORDE, plaguelandsTowerBuffs[0].spellIdHorde, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool eventHandled = true;
|
||||||
|
|
||||||
|
if (team != TEAM_NONE)
|
||||||
|
{
|
||||||
|
// update capture point owner before rewards are applied
|
||||||
|
m_towerOwner[towerId] = team;
|
||||||
|
|
||||||
|
// apply rewards of changed tower
|
||||||
|
switch (towerId)
|
||||||
|
{
|
||||||
|
case TOWER_ID_NORTHPASS:
|
||||||
|
RespawnGO(go, team == ALLIANCE ? m_lordaeronShrineAlliance : m_lordaeronShrineHorde, true);
|
||||||
|
break;
|
||||||
|
case TOWER_ID_CROWNGUARD:
|
||||||
|
sObjectMgr.SetGraveYardLinkTeam(GRAVEYARD_ID_EASTERN_PLAGUE, GRAVEYARD_ZONE_EASTERN_PLAGUE, team);
|
||||||
|
break;
|
||||||
|
case TOWER_ID_EASTWALL:
|
||||||
|
// Return false - allow the DB to handle summons
|
||||||
|
if (m_towerOwner[TOWER_ID_NORTHPASS] != team)
|
||||||
|
eventHandled = false;
|
||||||
|
break;
|
||||||
|
case TOWER_ID_PLAGUEWOOD:
|
||||||
|
// Return false - allow the DB to handle summons
|
||||||
|
eventHandled = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// remove rewards of changed tower
|
||||||
|
switch (towerId)
|
||||||
|
{
|
||||||
|
case TOWER_ID_NORTHPASS:
|
||||||
|
RespawnGO(go, m_towerOwner[TOWER_ID_NORTHPASS] == ALLIANCE ? m_lordaeronShrineAlliance : m_lordaeronShrineHorde, false);
|
||||||
|
break;
|
||||||
|
case TOWER_ID_CROWNGUARD:
|
||||||
|
sObjectMgr.SetGraveYardLinkTeam(GRAVEYARD_ID_EASTERN_PLAGUE, GRAVEYARD_ZONE_EASTERN_PLAGUE, TEAM_INVALID);
|
||||||
|
break;
|
||||||
|
case TOWER_ID_EASTWALL:
|
||||||
|
UnsummonSoldiers(go);
|
||||||
|
break;
|
||||||
|
case TOWER_ID_PLAGUEWOOD:
|
||||||
|
UnsummonFlightMaster(go);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// update capture point owner after rewards have been removed
|
||||||
|
m_towerOwner[towerId] = team;
|
||||||
|
}
|
||||||
|
|
||||||
|
// update tower state
|
||||||
|
SendUpdateWorldState(m_towerWorldState[towerId], WORLD_STATE_REMOVE);
|
||||||
|
m_towerWorldState[towerId] = newWorldState;
|
||||||
|
SendUpdateWorldState(m_towerWorldState[towerId], WORLD_STATE_ADD);
|
||||||
|
|
||||||
|
// there are some events which required further DB script
|
||||||
|
return eventHandled;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool OutdoorPvPEP::HandleGameObjectUse(Player* /*player*/, GameObject* go)
|
||||||
|
{
|
||||||
|
// prevent despawning after go use
|
||||||
|
if (go->GetEntry() == GO_LORDAERON_SHRINE_ALLIANCE || go->GetEntry() == GO_LORDAERON_SHRINE_HORDE)
|
||||||
|
go->SetRespawnTime(0);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void OutdoorPvPEP::InitBanner(GameObject* go, uint32 towerId)
|
||||||
|
{
|
||||||
|
m_towerBanners[towerId].push_back(go->GetObjectGuid());
|
||||||
|
go->SetGoArtKit(GetBannerArtKit(m_towerOwner[towerId]));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle the unsummon of the spectral flight master when the Plaguewood tower is lost
|
||||||
|
void OutdoorPvPEP::UnsummonFlightMaster(const WorldObject* objRef)
|
||||||
|
{
|
||||||
|
if (Creature* flightMaster = objRef->GetMap()->GetCreature(m_flightMaster))
|
||||||
|
flightMaster->ForcedDespawn();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle the unsummon of the soldiers when the Eastwall tower is lost
|
||||||
|
void OutdoorPvPEP::UnsummonSoldiers(const WorldObject* objRef)
|
||||||
|
{
|
||||||
|
for (GuidList::const_iterator itr = m_soldiers.begin(); itr != m_soldiers.end(); ++itr)
|
||||||
|
{
|
||||||
|
if (Creature* soldier = objRef->GetMap()->GetCreature(*itr))
|
||||||
|
soldier->ForcedDespawn();
|
||||||
|
}
|
||||||
|
|
||||||
|
m_soldiers.clear();
|
||||||
|
}
|
||||||
|
|
@ -19,4 +19,251 @@
|
||||||
#ifndef WORLD_PVP_EP
|
#ifndef WORLD_PVP_EP
|
||||||
#define WORLD_PVP_EP
|
#define WORLD_PVP_EP
|
||||||
|
|
||||||
|
#include "Common.h"
|
||||||
|
#include "OutdoorPvP.h"
|
||||||
|
#include "../Language.h"
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
TOWER_ID_NORTHPASS = 0,
|
||||||
|
TOWER_ID_CROWNGUARD = 1,
|
||||||
|
TOWER_ID_EASTWALL = 2,
|
||||||
|
TOWER_ID_PLAGUEWOOD = 3,
|
||||||
|
MAX_EP_TOWERS = 4,
|
||||||
|
|
||||||
|
// spells
|
||||||
|
SPELL_ECHOES_OF_LORDAERON_ALLIANCE_1 = 11413,
|
||||||
|
SPELL_ECHOES_OF_LORDAERON_ALLIANCE_2 = 11414,
|
||||||
|
SPELL_ECHOES_OF_LORDAERON_ALLIANCE_3 = 11415,
|
||||||
|
SPELL_ECHOES_OF_LORDAERON_ALLIANCE_4 = 1386,
|
||||||
|
|
||||||
|
SPELL_ECHOES_OF_LORDAERON_HORDE_1 = 30880,
|
||||||
|
SPELL_ECHOES_OF_LORDAERON_HORDE_2 = 30683,
|
||||||
|
SPELL_ECHOES_OF_LORDAERON_HORDE_3 = 30682,
|
||||||
|
SPELL_ECHOES_OF_LORDAERON_HORDE_4 = 29520,
|
||||||
|
|
||||||
|
// graveyards
|
||||||
|
GRAVEYARD_ZONE_EASTERN_PLAGUE = 139,
|
||||||
|
GRAVEYARD_ID_EASTERN_PLAGUE = 927,
|
||||||
|
|
||||||
|
// misc
|
||||||
|
HONOR_REWARD_PLAGUELANDS = 18,
|
||||||
|
|
||||||
|
// npcs
|
||||||
|
NPC_SPECTRAL_FLIGHT_MASTER = 17209,
|
||||||
|
|
||||||
|
// flight master factions
|
||||||
|
FACTION_FLIGHT_MASTER_ALLIANCE = 774,
|
||||||
|
FACTION_FLIGHT_MASTER_HORDE = 775,
|
||||||
|
|
||||||
|
SPELL_SPIRIT_PARTICLES_BLUE = 17327,
|
||||||
|
SPELL_SPIRIT_PARTICLES_RED = 31309,
|
||||||
|
|
||||||
|
// quest
|
||||||
|
NPC_CROWNGUARD_TOWER_QUEST_DOODAD = 17689,
|
||||||
|
NPC_EASTWALL_TOWER_QUEST_DOODAD = 17690,
|
||||||
|
NPC_NORTHPASS_TOWER_QUEST_DOODAD = 17696,
|
||||||
|
NPC_PLAGUEWOOD_TOWER_QUEST_DOODAD = 17698,
|
||||||
|
|
||||||
|
// alliance
|
||||||
|
NPC_LORDAERON_COMMANDER = 17635,
|
||||||
|
NPC_LORDAERON_SOLDIER = 17647,
|
||||||
|
|
||||||
|
// horde
|
||||||
|
NPC_LORDAERON_VETERAN = 17995,
|
||||||
|
NPC_LORDAERON_FIGHTER = 17996,
|
||||||
|
|
||||||
|
// gameobjects
|
||||||
|
GO_LORDAERON_SHRINE_ALLIANCE = 181682,
|
||||||
|
GO_LORDAERON_SHRINE_HORDE = 181955,
|
||||||
|
GO_TOWER_FLAG = 182106,
|
||||||
|
|
||||||
|
// possible shrine auras - not used
|
||||||
|
//GO_ALLIANCE_BANNER_AURA = 180100,
|
||||||
|
//GO_HORDE_BANNER_AURA = 180101,
|
||||||
|
|
||||||
|
// capture points
|
||||||
|
GO_TOWER_BANNER_NORTHPASS = 181899,
|
||||||
|
GO_TOWER_BANNER_CROWNGUARD = 182096,
|
||||||
|
GO_TOWER_BANNER_EASTWALL = 182097,
|
||||||
|
GO_TOWER_BANNER_PLAGUEWOOD = 182098,
|
||||||
|
|
||||||
|
GO_TOWER_BANNER = 182106, // tower banners around
|
||||||
|
|
||||||
|
// events
|
||||||
|
//EVENT_NORTHPASS_WIN_ALLIANCE = 10568,
|
||||||
|
//EVENT_NORTHPASS_WIN_HORDE = 10556,
|
||||||
|
//EVENT_NORTHPASS_CONTEST_ALLIANCE = 10697,
|
||||||
|
//EVENT_NORTHPASS_CONTEST_HORDE = 10696,
|
||||||
|
EVENT_NORTHPASS_PROGRESS_ALLIANCE = 10699,
|
||||||
|
EVENT_NORTHPASS_PROGRESS_HORDE = 10698,
|
||||||
|
EVENT_NORTHPASS_NEUTRAL_ALLIANCE = 11151,
|
||||||
|
EVENT_NORTHPASS_NEUTRAL_HORDE = 11150,
|
||||||
|
|
||||||
|
//EVENT_CROWNGUARD_WIN_ALLIANCE = 10570,
|
||||||
|
//EVENT_CROWNGUARD_WIN_HORDE = 10566,
|
||||||
|
//EVENT_CROWNGUARD_CONTEST_ALLIANCE = 10703,
|
||||||
|
//EVENT_CROWNGUARD_CONTEST_HORDE = 10702,
|
||||||
|
EVENT_CROWNGUARD_PROGRESS_ALLIANCE = 10705,
|
||||||
|
EVENT_CROWNGUARD_PROGRESS_HORDE = 10704,
|
||||||
|
EVENT_CROWNGUARD_NEUTRAL_ALLIANCE = 11155,
|
||||||
|
EVENT_CROWNGUARD_NEUTRAL_HORDE = 11154,
|
||||||
|
|
||||||
|
//EVENT_EASTWALL_WIN_ALLIANCE = 10569,
|
||||||
|
//EVENT_EASTWALL_WIN_HORDE = 10565,
|
||||||
|
//EVENT_EASTWALL_CONTEST_ALLIANCE = 10689,
|
||||||
|
//EVENT_EASTWALL_CONTEST_HORDE = 10690,
|
||||||
|
EVENT_EASTWALL_PROGRESS_ALLIANCE = 10691,
|
||||||
|
EVENT_EASTWALL_PROGRESS_HORDE = 10692,
|
||||||
|
EVENT_EASTWALL_NEUTRAL_ALLIANCE = 11149,
|
||||||
|
EVENT_EASTWALL_NEUTRAL_HORDE = 11148,
|
||||||
|
|
||||||
|
//EVENT_PLAGUEWOOD_WIN_ALLIANCE = 10567,
|
||||||
|
//EVENT_PLAGUEWOOD_WIN_HORDE = 10564,
|
||||||
|
//EVENT_PLAGUEWOOD_CONTEST_ALLIANCE = 10687,
|
||||||
|
//EVENT_PLAGUEWOOD_CONTEST_HORDE = 10688,
|
||||||
|
EVENT_PLAGUEWOOD_PROGRESS_ALLIANCE = 10701,
|
||||||
|
EVENT_PLAGUEWOOD_PROGRESS_HORDE = 10700,
|
||||||
|
EVENT_PLAGUEWOOD_NEUTRAL_ALLIANCE = 11153,
|
||||||
|
EVENT_PLAGUEWOOD_NEUTRAL_HORDE = 11152,
|
||||||
|
|
||||||
|
// world states
|
||||||
|
WORLD_STATE_EP_TOWER_COUNT_ALLIANCE = 2327,
|
||||||
|
WORLD_STATE_EP_TOWER_COUNT_HORDE = 2328,
|
||||||
|
|
||||||
|
//WORLD_STATE_EP_PLAGUEWOOD_CONTEST_ALLIANCE = 2366,
|
||||||
|
//WORLD_STATE_EP_PLAGUEWOOD_CONTEST_HORDE = 2367,
|
||||||
|
//WORLD_STATE_EP_PLAGUEWOOD_PROGRESS_ALLIANCE = 2368,
|
||||||
|
//WORLD_STATE_EP_PLAGUEWOOD_PROGRESS_HORDE = 2369,
|
||||||
|
WORLD_STATE_EP_PLAGUEWOOD_ALLIANCE = 2370,
|
||||||
|
WORLD_STATE_EP_PLAGUEWOOD_HORDE = 2371,
|
||||||
|
WORLD_STATE_EP_PLAGUEWOOD_NEUTRAL = 2353,
|
||||||
|
|
||||||
|
//WORLD_STATE_EP_NORTHPASS_CONTEST_ALLIANCE = 2362,
|
||||||
|
//WORLD_STATE_EP_NORTHPASS_CONTEST_HORDE = 2363,
|
||||||
|
//WORLD_STATE_EP_NORTHPASS_PROGRESS_ALLIANCE = 2364,
|
||||||
|
//WORLD_STATE_EP_NORTHPASS_PROGRESS_HORDE = 2365,
|
||||||
|
WORLD_STATE_EP_NORTHPASS_ALLIANCE = 2372,
|
||||||
|
WORLD_STATE_EP_NORTHPASS_HORDE = 2373,
|
||||||
|
WORLD_STATE_EP_NORTHPASS_NEUTRAL = 2352,
|
||||||
|
|
||||||
|
//WORLD_STATE_EP_EASTWALL_CONTEST_ALLIANCE = 2359,
|
||||||
|
//WORLD_STATE_EP_EASTWALL_CONTEST_HORDE = 2360,
|
||||||
|
//WORLD_STATE_EP_EASTWALL_PROGRESS_ALLIANCE = 2357,
|
||||||
|
//WORLD_STATE_EP_EASTWALL_PROGRESS_HORDE = 2358,
|
||||||
|
WORLD_STATE_EP_EASTWALL_ALLIANCE = 2354,
|
||||||
|
WORLD_STATE_EP_EASTWALL_HORDE = 2356,
|
||||||
|
WORLD_STATE_EP_EASTWALL_NEUTRAL = 2361,
|
||||||
|
|
||||||
|
//WORLD_STATE_EP_CROWNGUARD_CONTEST_ALLIANCE = 2374,
|
||||||
|
//WORLD_STATE_EP_CROWNGUARD_CONTEST_HORDE = 2375,
|
||||||
|
//WORLD_STATE_EP_CROWNGUARD_PROGRESS_ALLIANCE = 2376,
|
||||||
|
//WORLD_STATE_EP_CROWNGUARD_PROGRESS_HORDE = 2377,
|
||||||
|
WORLD_STATE_EP_CROWNGUARD_ALLIANCE = 2378,
|
||||||
|
WORLD_STATE_EP_CROWNGUARD_HORDE = 2379,
|
||||||
|
WORLD_STATE_EP_CROWNGUARD_NEUTRAL = 2355
|
||||||
|
};
|
||||||
|
|
||||||
|
struct PlaguelandsTowerBuff
|
||||||
|
{
|
||||||
|
uint32 spellIdAlliance, spellIdHorde;
|
||||||
|
};
|
||||||
|
|
||||||
|
static const PlaguelandsTowerBuff plaguelandsTowerBuffs[MAX_EP_TOWERS] =
|
||||||
|
{
|
||||||
|
{SPELL_ECHOES_OF_LORDAERON_ALLIANCE_1, SPELL_ECHOES_OF_LORDAERON_HORDE_1},
|
||||||
|
{SPELL_ECHOES_OF_LORDAERON_ALLIANCE_2, SPELL_ECHOES_OF_LORDAERON_HORDE_2},
|
||||||
|
{SPELL_ECHOES_OF_LORDAERON_ALLIANCE_3, SPELL_ECHOES_OF_LORDAERON_HORDE_3},
|
||||||
|
{SPELL_ECHOES_OF_LORDAERON_ALLIANCE_4, SPELL_ECHOES_OF_LORDAERON_HORDE_4}
|
||||||
|
};
|
||||||
|
|
||||||
|
// capture points coordinates to sort the banners
|
||||||
|
static const float plaguelandsTowerLocations[MAX_EP_TOWERS][2] =
|
||||||
|
{
|
||||||
|
{3181.08f, -4379.36f}, // Northpass
|
||||||
|
{1860.85f, -3731.23f}, // Crownguard
|
||||||
|
{2574.51f, -4794.89f}, // Eastwall
|
||||||
|
{2962.71f, -3042.31f} // Plaguewood
|
||||||
|
};
|
||||||
|
|
||||||
|
struct PlaguelandsTowerEvent
|
||||||
|
{
|
||||||
|
uint32 eventEntry;
|
||||||
|
Team team;
|
||||||
|
uint32 defenseMessage;
|
||||||
|
uint32 worldState;
|
||||||
|
};
|
||||||
|
|
||||||
|
static const PlaguelandsTowerEvent plaguelandsTowerEvents[MAX_EP_TOWERS][4] =
|
||||||
|
{
|
||||||
|
{
|
||||||
|
{EVENT_NORTHPASS_PROGRESS_ALLIANCE, ALLIANCE, LANG_OPVP_EP_CAPTURE_NPT_A, WORLD_STATE_EP_NORTHPASS_ALLIANCE},
|
||||||
|
{EVENT_NORTHPASS_PROGRESS_HORDE, HORDE, LANG_OPVP_EP_CAPTURE_NPT_H, WORLD_STATE_EP_NORTHPASS_HORDE},
|
||||||
|
{EVENT_NORTHPASS_NEUTRAL_HORDE, TEAM_NONE, 0, WORLD_STATE_EP_NORTHPASS_NEUTRAL},
|
||||||
|
{EVENT_NORTHPASS_NEUTRAL_ALLIANCE, TEAM_NONE, 0, WORLD_STATE_EP_NORTHPASS_NEUTRAL},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{EVENT_CROWNGUARD_PROGRESS_ALLIANCE, ALLIANCE, LANG_OPVP_EP_CAPTURE_CGT_A, WORLD_STATE_EP_CROWNGUARD_ALLIANCE},
|
||||||
|
{EVENT_CROWNGUARD_PROGRESS_HORDE, HORDE, LANG_OPVP_EP_CAPTURE_CGT_H, WORLD_STATE_EP_CROWNGUARD_HORDE},
|
||||||
|
{EVENT_CROWNGUARD_NEUTRAL_HORDE, TEAM_NONE, 0, WORLD_STATE_EP_CROWNGUARD_NEUTRAL},
|
||||||
|
{EVENT_CROWNGUARD_NEUTRAL_ALLIANCE, TEAM_NONE, 0, WORLD_STATE_EP_CROWNGUARD_NEUTRAL},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{EVENT_EASTWALL_PROGRESS_ALLIANCE, ALLIANCE, LANG_OPVP_EP_CAPTURE_EWT_A, WORLD_STATE_EP_EASTWALL_ALLIANCE},
|
||||||
|
{EVENT_EASTWALL_PROGRESS_HORDE, HORDE, LANG_OPVP_EP_CAPTURE_EWT_H, WORLD_STATE_EP_EASTWALL_HORDE},
|
||||||
|
{EVENT_EASTWALL_NEUTRAL_HORDE, TEAM_NONE, 0, WORLD_STATE_EP_EASTWALL_NEUTRAL},
|
||||||
|
{EVENT_EASTWALL_NEUTRAL_ALLIANCE, TEAM_NONE, 0, WORLD_STATE_EP_EASTWALL_NEUTRAL},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{EVENT_PLAGUEWOOD_PROGRESS_ALLIANCE, ALLIANCE, LANG_OPVP_EP_CAPTURE_PWT_A, WORLD_STATE_EP_PLAGUEWOOD_ALLIANCE},
|
||||||
|
{EVENT_PLAGUEWOOD_PROGRESS_HORDE, HORDE, LANG_OPVP_EP_CAPTURE_PWT_H, WORLD_STATE_EP_PLAGUEWOOD_HORDE},
|
||||||
|
{EVENT_PLAGUEWOOD_NEUTRAL_HORDE, TEAM_NONE, 0, WORLD_STATE_EP_PLAGUEWOOD_NEUTRAL},
|
||||||
|
{EVENT_PLAGUEWOOD_NEUTRAL_ALLIANCE, TEAM_NONE, 0, WORLD_STATE_EP_PLAGUEWOOD_NEUTRAL},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint32 plaguelandsBanners[MAX_EP_TOWERS] = {GO_TOWER_BANNER_NORTHPASS, GO_TOWER_BANNER_CROWNGUARD, GO_TOWER_BANNER_EASTWALL, GO_TOWER_BANNER_PLAGUEWOOD};
|
||||||
|
|
||||||
|
class OutdoorPvPEP : public OutdoorPvP
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
OutdoorPvPEP();
|
||||||
|
|
||||||
|
void HandlePlayerEnterZone(Player* player, bool isMainZone) override;
|
||||||
|
void HandlePlayerLeaveZone(Player* player, bool isMainZone) override;
|
||||||
|
void FillInitialWorldStates(WorldPacket& data, uint32& count) override;
|
||||||
|
void SendRemoveWorldStates(Player* player) override;
|
||||||
|
|
||||||
|
bool HandleEvent(uint32 eventId, GameObject* go) override;
|
||||||
|
void HandleObjectiveComplete(uint32 eventId, std::list<Player*> players, Team team) override;
|
||||||
|
|
||||||
|
void HandleCreatureCreate(Creature* creature) override;
|
||||||
|
void HandleGameObjectCreate(GameObject* go) override;
|
||||||
|
bool HandleGameObjectUse(Player* player, GameObject* go) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
// process capture events
|
||||||
|
bool ProcessCaptureEvent(GameObject* go, uint32 towerId, Team team, uint32 newWorldState);
|
||||||
|
|
||||||
|
void InitBanner(GameObject* go, uint32 towerId);
|
||||||
|
|
||||||
|
// Plaguewood bonus - flight master
|
||||||
|
void UnsummonFlightMaster(const WorldObject* objRef);
|
||||||
|
// Eastwall bonus - soldiers
|
||||||
|
void UnsummonSoldiers(const WorldObject* objRef);
|
||||||
|
|
||||||
|
Team m_towerOwner[MAX_EP_TOWERS];
|
||||||
|
uint32 m_towerWorldState[MAX_EP_TOWERS];
|
||||||
|
uint8 m_towersAlliance;
|
||||||
|
uint8 m_towersHorde;
|
||||||
|
|
||||||
|
ObjectGuid m_flightMaster;
|
||||||
|
ObjectGuid m_lordaeronShrineAlliance;
|
||||||
|
ObjectGuid m_lordaeronShrineHorde;
|
||||||
|
|
||||||
|
GuidList m_soldiers;
|
||||||
|
|
||||||
|
GuidList m_towerBanners[MAX_EP_TOWERS];
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -50,6 +50,7 @@ OutdoorPvPMgr::~OutdoorPvPMgr()
|
||||||
void OutdoorPvPMgr::InitOutdoorPvP()
|
void OutdoorPvPMgr::InitOutdoorPvP()
|
||||||
{
|
{
|
||||||
m_scripts[OPVP_ID_SI] = new OutdoorPvPSI();
|
m_scripts[OPVP_ID_SI] = new OutdoorPvPSI();
|
||||||
|
m_scripts[OPVP_ID_EP] = new OutdoorPvPEP();
|
||||||
|
|
||||||
sLog.outString();
|
sLog.outString();
|
||||||
sLog.outString(">> Loaded %u Outdoor PvP zones", MAX_OPVP_ID);
|
sLog.outString(">> Loaded %u Outdoor PvP zones", MAX_OPVP_ID);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue