aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/game/OutdoorPvP.cpp4
-rw-r--r--src/game/OutdoorPvP.h1
-rw-r--r--src/game/OutdoorPvPMgr.cpp10
-rw-r--r--src/game/OutdoorPvPMgr.h2
-rw-r--r--src/game/Player.cpp1
-rw-r--r--src/game/Wintergrasp.cpp40
-rw-r--r--src/game/Wintergrasp.h3
7 files changed, 55 insertions, 6 deletions
diff --git a/src/game/OutdoorPvP.cpp b/src/game/OutdoorPvP.cpp
index ada95b8c683..de9eb1f0cb5 100644
--- a/src/game/OutdoorPvP.cpp
+++ b/src/game/OutdoorPvP.cpp
@@ -251,6 +251,10 @@ void OutdoorPvP::HandlePlayerLeaveZone(Player * plr, uint32 zone)
sLog.outDebug("Player %s left an outdoorpvp zone", plr->GetName());
}
+void OutdoorPvP::HandlePlayerResurrects(Player * plr, uint32 zone)
+{
+}
+
bool OutdoorPvP::Update(uint32 diff)
{
bool objective_changed = false;
diff --git a/src/game/OutdoorPvP.h b/src/game/OutdoorPvP.h
index e48356633c3..0b9614144ae 100644
--- a/src/game/OutdoorPvP.h
+++ b/src/game/OutdoorPvP.h
@@ -235,6 +235,7 @@ protected:
virtual void HandlePlayerEnterZone(Player * plr, uint32 zone);
virtual void HandlePlayerLeaveZone(Player * plr, uint32 zone);
+ virtual void HandlePlayerResurrects(Player * plr, uint32 zone);
void AddCapturePoint(OPvPCapturePoint* cp)
{
diff --git a/src/game/OutdoorPvPMgr.cpp b/src/game/OutdoorPvPMgr.cpp
index bf94d686f88..4df07914b36 100644
--- a/src/game/OutdoorPvPMgr.cpp
+++ b/src/game/OutdoorPvPMgr.cpp
@@ -249,3 +249,13 @@ void OutdoorPvPMgr::HandleDropFlag(Player *plr, uint32 spellId)
return;
}
}
+
+void OutdoorPvPMgr::HandlePlayerResurrects(Player *plr, uint32 zoneid)
+{
+ OutdoorPvPMap::iterator itr = m_OutdoorPvPMap.find(zoneid);
+ if(itr == m_OutdoorPvPMap.end())
+ return;
+
+ if(itr->second->HasPlayer(plr))
+ itr->second->HandlePlayerResurrects(plr, zoneid);
+}
diff --git a/src/game/OutdoorPvPMgr.h b/src/game/OutdoorPvPMgr.h
index 6ecf129165a..5fcbf5a849e 100644
--- a/src/game/OutdoorPvPMgr.h
+++ b/src/game/OutdoorPvPMgr.h
@@ -45,6 +45,8 @@ public:
void HandlePlayerEnterZone(Player * plr, uint32 areaflag);
// called when player leaves an outdoor pvp area
void HandlePlayerLeaveZone(Player * plr, uint32 areaflag);
+ // called when player resurrects
+ void HandlePlayerResurrects(Player * plr, uint32 areaflag);
// return assigned outdoor pvp
OutdoorPvP * GetOutdoorPvPToZoneId(uint32 zoneid);
// handle custom (non-exist in dbc) spell if registered
diff --git a/src/game/Player.cpp b/src/game/Player.cpp
index 2abac550ca9..83c99679b2f 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -4411,6 +4411,7 @@ void Player::ResurrectPlayer(float restore_percent, bool applySickness)
uint32 newzone, newarea;
GetZoneAndAreaId(newzone,newarea);
UpdateZone(newzone,newarea);
+ sOutdoorPvPMgr.HandlePlayerResurrects(this, newzone);
// update visibility
//ObjectAccessor::UpdateVisibilityForPlayer(this);
diff --git a/src/game/Wintergrasp.cpp b/src/game/Wintergrasp.cpp
index 4e7e507787b..d98f8d11511 100644
--- a/src/game/Wintergrasp.cpp
+++ b/src/game/Wintergrasp.cpp
@@ -33,14 +33,15 @@ enum WintergraspQuest
NO_MERCY_MERCILESS_1 = 13179, //Alliance Quest
A_VICTORY_IN_WG = 13181,
- H_VICTORY_IN_WG = 13183
+ H_VICTORY_IN_WG = 13183,
};
enum CreatureEntry
{
CRE_ENG_A = 30499,
CRE_ENG_H = 30400,
- CRE_PVP_KILL = 31086 //Quest Objective
+ CRE_PVP_KILL = 31086, //Quest Objective
+ SPIRIT_HEALER = 6491,
};
const TeamPair CreatureEntryPair[] =
@@ -86,6 +87,11 @@ void LoadTeamPair(TeamPairMap &pairMap, const TeamPair *pair)
typedef std::list<const AreaPOIEntry *> AreaPOIList;
+OPvPWintergrasp::OPvPWintergrasp()
+{
+ m_TypeId = OPVP_WINTERGRASP;
+}
+
bool OPvPWintergrasp::SetupOutdoorPvP()
{
if(!sWorld.getConfig(CONFIG_OUTDOORPVP_WINTERGRASP_ENABLED))
@@ -95,6 +101,8 @@ bool OPvPWintergrasp::SetupOutdoorPvP()
m_changeDefender = false;
m_workshopCount[TEAM_ALLIANCE] = 0;
m_workshopCount[TEAM_HORDE] = 0;
+ m_tenacityStack = 0;
+ m_gate = NULL;
// Select POI
AreaPOIList areaPOIs;
@@ -433,6 +441,7 @@ WintergraspCreType OPvPWintergrasp::GetCreatureType(uint32 entry) const
case 32296:case 32294: // Quartermaster
case 30870:case 30869: // Flight Masters
case 31841:case 31842: // Spirit Guides
+ case SPIRIT_HEALER: // Spirit Healers
return CREATURE_SPECIAL;
default:
return CREATURE_OTHER; // Revenants, Elementals, etc
@@ -753,6 +762,19 @@ void OPvPWintergrasp::HandlePlayerEnterZone(Player * plr, uint32 zone)
UpdateTenacityStack();
}
+// Reapply Tenacity if needed
+void OPvPWintergrasp::HandlePlayerResurrects(Player * plr, uint32 zone)
+{
+ if (isWarTime() && m_tenacityStack && !plr->HasAura(SPELL_TENACITY) && plr->getLevel() > 69)
+ {
+ int32 newStack = m_tenacityStack < 0 ? -m_tenacityStack : m_tenacityStack;
+ if (newStack > 20)
+ newStack = 20;
+ CastTenacity(plr, newStack);
+ }
+ OutdoorPvP::HandlePlayerResurrects(plr, zone);
+}
+
void OPvPWintergrasp::HandlePlayerLeaveZone(Player * plr, uint32 zone)
{
if (!plr->GetSession()->PlayerLogout())
@@ -852,10 +874,18 @@ void OPvPWintergrasp::UpdateTenacityStack()
return;
TeamId team = TEAM_NEUTRAL;
- uint32 allianceNum = m_players[TEAM_ALLIANCE].size();;
- uint32 hordeNum = m_players[TEAM_HORDE].size();;
+ uint32 allianceNum = 0;
+ uint32 hordeNum = 0;
int32 newStack = 0;
+ for (PlayerSet::iterator itr = m_players[TEAM_ALLIANCE].begin(); itr != m_players[TEAM_ALLIANCE].end(); ++itr)
+ if ((*itr)->getLevel() > 69)
+ ++allianceNum;
+
+ for (PlayerSet::iterator itr = m_players[TEAM_HORDE].begin(); itr != m_players[TEAM_HORDE].end(); ++itr)
+ if ((*itr)->getLevel() > 69)
+ ++hordeNum;
+
if (allianceNum && hordeNum)
{
if (allianceNum < hordeNum)
@@ -1049,7 +1079,7 @@ void OPvPWintergrasp::EndBattle()
baseHonor = m_customHonorReward[(team == getDefenderTeam()) ? WIN_BATTLE : LOSE_BATTLE];
baseHonor += (m_customHonorReward[DAMAGED_TOWER] * m_towerCount[OTHER_TEAM(team)][DAMAGED_TOWER]);
- baseHonor += (m_customHonorReward[DESTROYED_TOWER] * m_towerCount[OTHER_TEAM(team)][DAMAGED_TOWER]);
+ baseHonor += (m_customHonorReward[DESTROYED_TOWER] * m_towerCount[OTHER_TEAM(team)][DESTROYED_TOWER]);
baseHonor += (m_customHonorReward[INTACT_BUILDING] * intactNum);
baseHonor += (m_customHonorReward[DAMAGED_BUILDING] * damagedNum);
}
diff --git a/src/game/Wintergrasp.h b/src/game/Wintergrasp.h
index 7db42e759e2..d6a127952b8 100644
--- a/src/game/Wintergrasp.h
+++ b/src/game/Wintergrasp.h
@@ -171,7 +171,7 @@ class OPvPWintergrasp : public OutdoorPvP
typedef std::set<Creature*> CreatureSet;
typedef std::set<GameObject*> GameObjectSet;
public:
- explicit OPvPWintergrasp() : m_tenacityStack(0), m_gate(NULL) {}
+ OPvPWintergrasp();
bool SetupOutdoorPvP();
uint32 GetCreatureEntry(uint32 guidlow, const CreatureData *data);
@@ -184,6 +184,7 @@ class OPvPWintergrasp : public OutdoorPvP
void HandlePlayerEnterZone(Player *plr, uint32 zone);
void HandlePlayerLeaveZone(Player *plr, uint32 zone);
+ void HandlePlayerResurrects(Player * plr, uint32 zone);
void HandleKill(Player *killer, Unit *victim);
bool Update(uint32 diff);