aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/game/OutdoorPvP.cpp45
-rw-r--r--src/game/OutdoorPvP.h31
-rw-r--r--src/game/OutdoorPvPEP.cpp16
-rw-r--r--src/game/OutdoorPvPHP.cpp52
-rw-r--r--src/game/OutdoorPvPHP.h5
-rw-r--r--src/game/OutdoorPvPImpl.h3
-rw-r--r--src/game/OutdoorPvPMgr.cpp19
-rw-r--r--src/game/OutdoorPvPNA.cpp45
-rw-r--r--src/game/OutdoorPvPNA.h1
-rw-r--r--src/game/OutdoorPvPSI.cpp47
-rw-r--r--src/game/OutdoorPvPSI.h1
-rw-r--r--src/game/OutdoorPvPTF.cpp52
-rw-r--r--src/game/OutdoorPvPTF.h3
-rw-r--r--src/game/OutdoorPvPZM.cpp47
-rw-r--r--src/game/OutdoorPvPZM.h3
-rw-r--r--src/game/Player.cpp1
-rw-r--r--src/game/SpellAuras.cpp5
-rw-r--r--src/game/Unit.cpp12
-rw-r--r--src/game/Unit.h1
-rw-r--r--src/game/Wintergrasp.cpp45
-rw-r--r--src/game/Wintergrasp.h17
21 files changed, 159 insertions, 292 deletions
diff --git a/src/game/OutdoorPvP.cpp b/src/game/OutdoorPvP.cpp
index 0bfc8a6e084..bda04bf3799 100644
--- a/src/game/OutdoorPvP.cpp
+++ b/src/game/OutdoorPvP.cpp
@@ -411,10 +411,7 @@ OutdoorPvP::~OutdoorPvP()
void OutdoorPvP::HandlePlayerEnterZone(Player * plr, uint32 zone)
{
- if(plr->GetTeam()==ALLIANCE)
- m_PlayerGuids[0].insert(plr->GetGUID());
- else
- m_PlayerGuids[1].insert(plr->GetGUID());
+ m_players[TEAM_ID(plr->GetTeam())].insert(plr);
}
void OutdoorPvP::HandlePlayerLeaveZone(Player * plr, uint32 zone)
@@ -423,13 +420,10 @@ void OutdoorPvP::HandlePlayerLeaveZone(Player * plr, uint32 zone)
for(OutdoorPvPObjectiveSet::iterator itr = m_OutdoorPvPObjectives.begin(); itr != m_OutdoorPvPObjectives.end(); ++itr)
(*itr)->HandlePlayerLeave(plr);
// remove the world state information from the player (we can't keep everyone up to date, so leave out those who are not in the concerning zones)
- if(zone != plr->GetZoneId())
+ if(!plr->GetSession()->PlayerLogout())
SendRemoveWorldStates(plr);
- if(plr->GetTeam()==ALLIANCE)
- m_PlayerGuids[0].erase(plr->GetGUID());
- else
- m_PlayerGuids[1].erase(plr->GetGUID());
- sLog.outDebug("player left an outdoorpvp zone");
+ m_players[TEAM_ID(plr->GetTeam())].erase(plr);
+ sLog.outDebug("Player %s left an outdoorpvp zone");
}
bool OutdoorPvP::Update(uint32 diff)
@@ -570,14 +564,8 @@ void OutdoorPvP::SendUpdateWorldState(uint32 field, uint32 value)
for(int i = 0; i < 2; ++i)
{
// send to all players present in the area
- for(std::set<uint64>::iterator itr = m_PlayerGuids[i].begin(); itr != m_PlayerGuids[i].end(); ++itr)
- {
- Player * plr = objmgr.GetPlayer(*itr);
- if(plr)
- {
- plr->SendUpdateWorldState(field,value);
- }
- }
+ for(PlayerSet::iterator itr = m_players[i].begin(); itr != m_players[i].end(); ++itr)
+ (*itr)->SendUpdateWorldState(field,value);
}
}
@@ -781,3 +769,24 @@ void OutdoorPvP::RegisterZone(uint32 zoneId)
{
sOutdoorPvPMgr.AddZone(zoneId, this);
}
+
+bool OutdoorPvP::HasPlayer(Player *plr) const
+{
+ return m_players[TEAM_ID(plr->GetTeam())].find(plr) != m_players[TEAM_ID(plr->GetTeam())].end();
+}
+
+void OutdoorPvP::TeamCastSpell(TeamId team, int32 spellId)
+{
+ if(spellId > 0)
+ for(PlayerSet::iterator itr = m_players[team].begin(); itr != m_players[team].end(); ++itr)
+ (*itr)->CastSpell(*itr, (uint32)spellId, true);
+ else
+ for(PlayerSet::iterator itr = m_players[team].begin(); itr != m_players[team].end(); ++itr)
+ (*itr)->RemoveAura((uint32)-spellId); // by stack?
+}
+
+void OutdoorPvP::TeamApplyBuff(TeamId team, uint32 spellId, uint32 spellId2)
+{
+ TeamCastSpell(team, spellId);
+ TeamCastSpell(OTHER_TEAM(team), spellId2 ? -(int32)spellId2 : -(int32)spellId);
+}
diff --git a/src/game/OutdoorPvP.h b/src/game/OutdoorPvP.h
index 48a478b5549..e82873c951c 100644
--- a/src/game/OutdoorPvP.h
+++ b/src/game/OutdoorPvP.h
@@ -26,6 +26,13 @@
#define OPVP_TRIGGER_CREATURE_ENTRY 12999
+enum TeamId
+{
+ TEAM_ALLIANCE = 0,
+ TEAM_HORDE,
+ TEAM_NEUTRAL,
+};
+
enum OutdoorPvPTypes
{
OUTDOOR_PVP_HP = 1,
@@ -153,6 +160,7 @@ protected:
// base class for specific outdoor pvp handlers
class OutdoorPvP
{
+ friend class OutdoorPvPMgr;
public:
// ctor
OutdoorPvP();
@@ -163,9 +171,7 @@ public:
typedef std::vector<OutdoorPvPObjective *> OutdoorPvPObjectiveSet;
- // called from Player::UpdateZone to add / remove buffs given by outdoor pvp events
- virtual void HandlePlayerEnterZone(Player * plr, uint32 zone);
- virtual void HandlePlayerLeaveZone(Player * plr, uint32 zone);
+ virtual void FillInitialWorldStates(WorldPacket & data) {}
virtual void HandlePlayerActivityChanged(Player * plr);
// called when a player triggers an areatrigger
virtual bool HandleAreaTrigger(Player * plr, uint32 trigger);
@@ -179,10 +185,6 @@ public:
// setup stuff
virtual bool SetupOutdoorPvP() {return true;}
- // world state stuff
- virtual void SendRemoveWorldStates(Player * plr) {}
- virtual void FillInitialWorldStates(WorldPacket & data) {}
-
// send world state update to all players present
virtual void SendUpdateWorldState(uint32 field, uint32 value);
@@ -206,14 +208,25 @@ public:
virtual bool HandleGossipOption(Player *plr, uint64 guid, uint32 gossipid);
virtual bool CanTalkTo(Player * plr, Creature * c, GossipOption &gso);
+
+ void TeamApplyBuff(TeamId team, uint32 spellId, uint32 spellId2 = 0);
protected:
// the map of the objectives belonging to this outdoorpvp
OutdoorPvPObjectiveSet m_OutdoorPvPObjectives;
- // players in the zones of this outdoorpvp, 0 - alliance, 1 - horde
- std::set<uint64> m_PlayerGuids[2];
+
+ typedef std::set<Player*> PlayerSet;
+ PlayerSet m_players[2];
uint32 m_TypeId;
+ // world state stuff
+ virtual void SendRemoveWorldStates(Player * plr) {}
+
+ virtual void HandlePlayerEnterZone(Player * plr, uint32 zone);
+ virtual void HandlePlayerLeaveZone(Player * plr, uint32 zone);
+
void RegisterZone(uint32 zoneid);
+ bool HasPlayer(Player *plr) const;
+ void TeamCastSpell(TeamId team, int32 spellId);
};
#endif /*OUTDOOR_PVP_H_*/
diff --git a/src/game/OutdoorPvPEP.cpp b/src/game/OutdoorPvPEP.cpp
index 4eddab08a40..4d94ef07b62 100644
--- a/src/game/OutdoorPvPEP.cpp
+++ b/src/game/OutdoorPvPEP.cpp
@@ -853,24 +853,24 @@ void OutdoorPvPEP::HandlePlayerLeaveZone(Player * plr, uint32 zone)
void OutdoorPvPEP::BuffTeams()
{
- for(std::set<uint64>::iterator itr = m_PlayerGuids[0].begin(); itr != m_PlayerGuids[0].end(); ++itr)
+ for(PlayerSet::iterator itr = m_players[0].begin(); itr != m_players[0].end(); ++itr)
{
- if(Player * plr = objmgr.GetPlayer(*itr))
+ Player * plr = *itr;
{
for(int i = 0; i < 4; ++i)
- if(plr->IsInWorld()) plr->RemoveAurasDueToSpell(EP_AllianceBuffs[i]);
+ plr->RemoveAurasDueToSpell(EP_AllianceBuffs[i]);
if(m_AllianceTowersControlled && m_AllianceTowersControlled < 5)
- if(plr->IsInWorld()) plr->CastSpell(plr,EP_AllianceBuffs[m_AllianceTowersControlled-1],true);
+ plr->CastSpell(plr,EP_AllianceBuffs[m_AllianceTowersControlled-1],true);
}
}
- for(std::set<uint64>::iterator itr = m_PlayerGuids[1].begin(); itr != m_PlayerGuids[1].end(); ++itr)
+ for(PlayerSet::iterator itr = m_players[1].begin(); itr != m_players[1].end(); ++itr)
{
- if(Player * plr = objmgr.GetPlayer(*itr))
+ Player * plr = *itr;
{
for(int i = 0; i < 4; ++i)
- if(plr->IsInWorld()) plr->RemoveAurasDueToSpell(EP_HordeBuffs[i]);
+ plr->RemoveAurasDueToSpell(EP_HordeBuffs[i]);
if(m_HordeTowersControlled && m_HordeTowersControlled < 5)
- if(plr->IsInWorld()) plr->CastSpell(plr,EP_HordeBuffs[m_HordeTowersControlled-1],true);
+ plr->CastSpell(plr,EP_HordeBuffs[m_HordeTowersControlled-1],true);
}
}
}
diff --git a/src/game/OutdoorPvPHP.cpp b/src/game/OutdoorPvPHP.cpp
index 60ceb7f4e3c..c3855b4f90a 100644
--- a/src/game/OutdoorPvPHP.cpp
+++ b/src/game/OutdoorPvPHP.cpp
@@ -117,11 +117,14 @@ bool OutdoorPvPHP::Update(uint32 diff)
if(changed = OutdoorPvP::Update(diff))
{
if(m_AllianceTowersControlled == 3)
- BuffTeam(ALLIANCE);
+ TeamApplyBuff(TEAM_ALLIANCE, AllianceBuff, HordeBuff);
else if(m_HordeTowersControlled == 3)
- BuffTeam(HORDE);
+ TeamApplyBuff(TEAM_HORDE, HordeBuff, AllianceBuff);
else
- BuffTeam(0);
+ {
+ TeamCastSpell(TEAM_ALLIANCE, -AllianceBuff);
+ TeamCastSpell(TEAM_HORDE, -HordeBuff);
+ }
SendUpdateWorldState(HP_UI_TOWER_COUNT_A, m_AllianceTowersControlled);
SendUpdateWorldState(HP_UI_TOWER_COUNT_H, m_HordeTowersControlled);
}
@@ -328,49 +331,6 @@ void OutdoorPvPObjectiveHP::HandlePlayerLeave(Player *plr)
OutdoorPvPObjective::HandlePlayerLeave(plr);
}
-void OutdoorPvPHP::BuffTeam(uint32 team)
-{
- if(team == ALLIANCE)
- {
- for(std::set<uint64>::iterator itr = m_PlayerGuids[0].begin(); itr != m_PlayerGuids[0].end(); ++itr)
- {
- if(Player * plr = objmgr.GetPlayer(*itr))
- if(plr->IsInWorld()) plr->CastSpell(plr,AllianceBuff,true);
- }
- for(std::set<uint64>::iterator itr = m_PlayerGuids[1].begin(); itr != m_PlayerGuids[1].end(); ++itr)
- {
- if(Player * plr = objmgr.GetPlayer(*itr))
- if(plr->IsInWorld()) plr->RemoveAurasDueToSpell(HordeBuff);
- }
- }
- else if(team == HORDE)
- {
- for(std::set<uint64>::iterator itr = m_PlayerGuids[1].begin(); itr != m_PlayerGuids[1].end(); ++itr)
- {
- if(Player * plr = objmgr.GetPlayer(*itr))
- if(plr->IsInWorld()) plr->CastSpell(plr,HordeBuff,true);
- }
- for(std::set<uint64>::iterator itr = m_PlayerGuids[0].begin(); itr != m_PlayerGuids[0].end(); ++itr)
- {
- if(Player * plr = objmgr.GetPlayer(*itr))
- if(plr->IsInWorld()) plr->RemoveAurasDueToSpell(AllianceBuff);
- }
- }
- else
- {
- for(std::set<uint64>::iterator itr = m_PlayerGuids[0].begin(); itr != m_PlayerGuids[0].end(); ++itr)
- {
- if(Player * plr = objmgr.GetPlayer(*itr))
- if(plr->IsInWorld()) plr->RemoveAurasDueToSpell(AllianceBuff);
- }
- for(std::set<uint64>::iterator itr = m_PlayerGuids[1].begin(); itr != m_PlayerGuids[1].end(); ++itr)
- {
- if(Player * plr = objmgr.GetPlayer(*itr))
- if(plr->IsInWorld()) plr->RemoveAurasDueToSpell(HordeBuff);
- }
- }
-}
-
void OutdoorPvPHP::HandleKillImpl(Player *plr, Unit * killed)
{
if(killed->GetTypeId() != TYPEID_PLAYER)
diff --git a/src/game/OutdoorPvPHP.h b/src/game/OutdoorPvPHP.h
index 7ccccd2fa61..7d00b0a536d 100644
--- a/src/game/OutdoorPvPHP.h
+++ b/src/game/OutdoorPvPHP.h
@@ -25,9 +25,9 @@
// HP, citadel, ramparts, blood furnace, shattered halls, mag's lair
const uint32 OutdoorPvPHPBuffZones[OutdoorPvPHPBuffZonesNum] = { 3483, 3563, 3562, 3713, 3714, 3836 };
-const uint32 AllianceBuff = 32071;
+#define AllianceBuff 32071
-const uint32 HordeBuff = 32049;
+#define HordeBuff 32049
const uint32 AlliancePlayerKillReward = 32155;
@@ -108,7 +108,6 @@ public:
void FillInitialWorldStates(WorldPacket &data);
void SendRemoveWorldStates(Player * plr);
void HandleKillImpl(Player * plr, Unit * killed);
- void BuffTeam(uint32 team);
private:
// how many towers are controlled
uint32 m_AllianceTowersControlled;
diff --git a/src/game/OutdoorPvPImpl.h b/src/game/OutdoorPvPImpl.h
index 17602b07388..1bbd29435c5 100644
--- a/src/game/OutdoorPvPImpl.h
+++ b/src/game/OutdoorPvPImpl.h
@@ -22,7 +22,8 @@
#include "OutdoorPvP.h"
#include "Player.h"
-#define TEAM_ID(a) (a == ALLIANCE ? 0 : 1)
+#define TEAM_ID(a) (a == ALLIANCE ? TEAM_ALLIANCE : TEAM_HORDE)
+#define OTHER_TEAM(a) (a == TEAM_ALLIANCE ? TEAM_HORDE : TEAM_ALLIANCE)
enum ObjectiveStates
{
diff --git a/src/game/OutdoorPvPMgr.cpp b/src/game/OutdoorPvPMgr.cpp
index 4016b84a73a..ff0d1269447 100644
--- a/src/game/OutdoorPvPMgr.cpp
+++ b/src/game/OutdoorPvPMgr.cpp
@@ -151,24 +151,25 @@ void OutdoorPvPMgr::HandlePlayerEnterZone(Player *plr, uint32 zoneid)
{
OutdoorPvPMap::iterator itr = m_OutdoorPvPMap.find(zoneid);
if(itr == m_OutdoorPvPMap.end())
- {
- // no handle for this zone, return
return;
- }
- // add possibly beneficial buffs to plr for zone
+
+ if(itr->second->HasPlayer(plr))
+ return;
+
itr->second->HandlePlayerEnterZone(plr, zoneid);
- sLog.outDebug("Player %u entered outdoorpvp id %u",plr->GetGUIDLow(), itr->second->GetTypeId());
+ sLog.outDebug("Player %u entered outdoorpvp id %u", plr->GetGUIDLow(), itr->second->GetTypeId());
}
void OutdoorPvPMgr::HandlePlayerLeaveZone(Player *plr, uint32 zoneid)
{
OutdoorPvPMap::iterator itr = m_OutdoorPvPMap.find(zoneid);
if(itr == m_OutdoorPvPMap.end())
- {
- // no handle for this zone, return
return;
- }
- // inform the OutdoorPvP class of the leaving, it should remove the player from all objectives
+
+ // teleport: remove once in removefromworld, once in updatezone
+ if(!itr->second->HasPlayer(plr))
+ return;
+
itr->second->HandlePlayerLeaveZone(plr, zoneid);
sLog.outDebug("Player %u left outdoorpvp id %u",plr->GetGUIDLow(), itr->second->GetTypeId());
}
diff --git a/src/game/OutdoorPvPNA.cpp b/src/game/OutdoorPvPNA.cpp
index c46c92a6404..ef7e6b97e51 100644
--- a/src/game/OutdoorPvPNA.cpp
+++ b/src/game/OutdoorPvPNA.cpp
@@ -83,49 +83,6 @@ uint32 OutdoorPvPObjectiveNA::GetAliveGuardsCount()
return cnt;
}
-void OutdoorPvPNA::BuffTeam(uint32 team)
-{
- if(team == ALLIANCE)
- {
- for(std::set<uint64>::iterator itr = m_PlayerGuids[0].begin(); itr != m_PlayerGuids[0].end(); ++itr)
- {
- if(Player * plr = objmgr.GetPlayer(*itr))
- if(plr->IsInWorld()) plr->CastSpell(plr,NA_CAPTURE_BUFF,true);
- }
- for(std::set<uint64>::iterator itr = m_PlayerGuids[1].begin(); itr != m_PlayerGuids[1].end(); ++itr)
- {
- if(Player * plr = objmgr.GetPlayer(*itr))
- if(plr->IsInWorld()) plr->RemoveAurasDueToSpell(NA_CAPTURE_BUFF);
- }
- }
- else if(team == HORDE)
- {
- for(std::set<uint64>::iterator itr = m_PlayerGuids[1].begin(); itr != m_PlayerGuids[1].end(); ++itr)
- {
- if(Player * plr = objmgr.GetPlayer(*itr))
- if(plr->IsInWorld()) plr->CastSpell(plr,NA_CAPTURE_BUFF,true);
- }
- for(std::set<uint64>::iterator itr = m_PlayerGuids[0].begin(); itr != m_PlayerGuids[0].end(); ++itr)
- {
- if(Player * plr = objmgr.GetPlayer(*itr))
- if(plr->IsInWorld()) plr->RemoveAurasDueToSpell(NA_CAPTURE_BUFF);
- }
- }
- else
- {
- for(std::set<uint64>::iterator itr = m_PlayerGuids[0].begin(); itr != m_PlayerGuids[0].end(); ++itr)
- {
- if(Player * plr = objmgr.GetPlayer(*itr))
- if(plr->IsInWorld()) plr->RemoveAurasDueToSpell(NA_CAPTURE_BUFF);
- }
- for(std::set<uint64>::iterator itr = m_PlayerGuids[1].begin(); itr != m_PlayerGuids[1].end(); ++itr)
- {
- if(Player * plr = objmgr.GetPlayer(*itr))
- if(plr->IsInWorld()) plr->RemoveAurasDueToSpell(NA_CAPTURE_BUFF);
- }
- }
-}
-
void OutdoorPvPObjectiveNA::SpawnNPCsForTeam(uint32 team)
{
const creature_type * creatures = NULL;
@@ -222,7 +179,7 @@ void OutdoorPvPObjectiveNA::FactionTakeOver(uint32 team)
this->UpdateWyvernRoostWorldState(NA_ROOST_N);
this->UpdateWyvernRoostWorldState(NA_ROOST_W);
this->UpdateWyvernRoostWorldState(NA_ROOST_E);
- ((OutdoorPvPNA*)m_PvP)->BuffTeam(team);
+ m_PvP->TeamApplyBuff(TEAM_ID(team), NA_CAPTURE_BUFF);
}
bool OutdoorPvPObjectiveNA::HandlePlayerEnter(Player *plr)
diff --git a/src/game/OutdoorPvPNA.h b/src/game/OutdoorPvPNA.h
index 15b314d4e06..a9500eb5e27 100644
--- a/src/game/OutdoorPvPNA.h
+++ b/src/game/OutdoorPvPNA.h
@@ -289,7 +289,6 @@ public:
void FillInitialWorldStates(WorldPacket &data);
void SendRemoveWorldStates(Player * plr);
void HandleKillImpl(Player * plr, Unit * killed);
- void BuffTeam(uint32 team);
private:
OutdoorPvPObjectiveNA * m_obj;
};
diff --git a/src/game/OutdoorPvPSI.cpp b/src/game/OutdoorPvPSI.cpp
index 0f61e6c3fed..f9f04f676ff 100644
--- a/src/game/OutdoorPvPSI.cpp
+++ b/src/game/OutdoorPvPSI.cpp
@@ -81,49 +81,6 @@ void OutdoorPvPSI::HandlePlayerLeaveZone(Player * plr, uint32 zone)
OutdoorPvP::HandlePlayerLeaveZone(plr, zone);
}
-void OutdoorPvPSI::BuffTeam(uint32 team)
-{
- if(team == ALLIANCE)
- {
- for(std::set<uint64>::iterator itr = m_PlayerGuids[0].begin(); itr != m_PlayerGuids[0].end(); ++itr)
- {
- if(Player * plr = objmgr.GetPlayer(*itr))
- if(plr->IsInWorld()) plr->CastSpell(plr,SI_CENARION_FAVOR,true);
- }
- for(std::set<uint64>::iterator itr = m_PlayerGuids[1].begin(); itr != m_PlayerGuids[1].end(); ++itr)
- {
- if(Player * plr = objmgr.GetPlayer(*itr))
- if(plr->IsInWorld()) plr->RemoveAurasDueToSpell(SI_CENARION_FAVOR);
- }
- }
- else if(team == HORDE)
- {
- for(std::set<uint64>::iterator itr = m_PlayerGuids[1].begin(); itr != m_PlayerGuids[1].end(); ++itr)
- {
- if(Player * plr = objmgr.GetPlayer(*itr))
- if(plr->IsInWorld()) plr->CastSpell(plr,SI_CENARION_FAVOR,true);
- }
- for(std::set<uint64>::iterator itr = m_PlayerGuids[0].begin(); itr != m_PlayerGuids[0].end(); ++itr)
- {
- if(Player * plr = objmgr.GetPlayer(*itr))
- if(plr->IsInWorld()) plr->RemoveAurasDueToSpell(SI_CENARION_FAVOR);
- }
- }
- else
- {
- for(std::set<uint64>::iterator itr = m_PlayerGuids[0].begin(); itr != m_PlayerGuids[0].end(); ++itr)
- {
- if(Player * plr = objmgr.GetPlayer(*itr))
- if(plr->IsInWorld()) plr->RemoveAurasDueToSpell(SI_CENARION_FAVOR);
- }
- for(std::set<uint64>::iterator itr = m_PlayerGuids[1].begin(); itr != m_PlayerGuids[1].end(); ++itr)
- {
- if(Player * plr = objmgr.GetPlayer(*itr))
- if(plr->IsInWorld()) plr->RemoveAurasDueToSpell(SI_CENARION_FAVOR);
- }
- }
-}
-
bool OutdoorPvPSI::HandleAreaTrigger(Player *plr, uint32 trigger)
{
switch(trigger)
@@ -136,7 +93,7 @@ bool OutdoorPvPSI::HandleAreaTrigger(Player *plr, uint32 trigger)
++ m_Gathered_A;
if(m_Gathered_A >= SI_MAX_RESOURCES)
{
- BuffTeam(ALLIANCE);
+ TeamApplyBuff(TEAM_ALLIANCE, SI_CENARION_FAVOR);
sWorld.SendZoneText(OutdoorPvPSIBuffZones[0],objmgr.GetTrinityStringForDBCLocale(LANG_OPVP_SI_CAPTURE_A));
m_LastController = ALLIANCE;
m_Gathered_A = 0;
@@ -161,7 +118,7 @@ bool OutdoorPvPSI::HandleAreaTrigger(Player *plr, uint32 trigger)
++ m_Gathered_H;
if(m_Gathered_H >= SI_MAX_RESOURCES)
{
- BuffTeam(HORDE);
+ TeamApplyBuff(TEAM_HORDE, SI_CENARION_FAVOR);
sWorld.SendZoneText(OutdoorPvPSIBuffZones[0],objmgr.GetTrinityStringForDBCLocale(LANG_OPVP_SI_CAPTURE_H));
m_LastController = HORDE;
m_Gathered_A = 0;
diff --git a/src/game/OutdoorPvPSI.h b/src/game/OutdoorPvPSI.h
index 3b60cb525e3..2ef5822ba8e 100644
--- a/src/game/OutdoorPvPSI.h
+++ b/src/game/OutdoorPvPSI.h
@@ -64,7 +64,6 @@ public:
bool HandleAreaTrigger(Player * plr, uint32 trigger);
bool HandleDropFlag(Player * plr, uint32 spellId);
bool HandleCustomSpell(Player * plr, uint32 spellId, GameObject *go);
- void BuffTeam(uint32 team);
void UpdateWorldState();
private:
uint32 m_Gathered_A;
diff --git a/src/game/OutdoorPvPTF.cpp b/src/game/OutdoorPvPTF.cpp
index 5c4ed9dd7d4..2031dbc7521 100644
--- a/src/game/OutdoorPvPTF.cpp
+++ b/src/game/OutdoorPvPTF.cpp
@@ -133,49 +133,6 @@ bool OutdoorPvPObjectiveTF::HandleCapturePointEvent(Player *plr, uint32 eventId)
return false;
}
-void OutdoorPvPTF::BuffTeam(uint32 team)
-{
- if(team == ALLIANCE)
- {
- for(std::set<uint64>::iterator itr = m_PlayerGuids[0].begin(); itr != m_PlayerGuids[0].end(); ++itr)
- {
- if(Player * plr = objmgr.GetPlayer(*itr))
- if(plr->IsInWorld()) plr->CastSpell(plr,TF_CAPTURE_BUFF,true);
- }
- for(std::set<uint64>::iterator itr = m_PlayerGuids[1].begin(); itr != m_PlayerGuids[1].end(); ++itr)
- {
- if(Player * plr = objmgr.GetPlayer(*itr))
- if(plr->IsInWorld()) plr->RemoveAurasDueToSpell(TF_CAPTURE_BUFF);
- }
- }
- else if(team == HORDE)
- {
- for(std::set<uint64>::iterator itr = m_PlayerGuids[1].begin(); itr != m_PlayerGuids[1].end(); ++itr)
- {
- if(Player * plr = objmgr.GetPlayer(*itr))
- if(plr->IsInWorld()) plr->CastSpell(plr,TF_CAPTURE_BUFF,true);
- }
- for(std::set<uint64>::iterator itr = m_PlayerGuids[0].begin(); itr != m_PlayerGuids[0].end(); ++itr)
- {
- if(Player * plr = objmgr.GetPlayer(*itr))
- if(plr->IsInWorld()) plr->RemoveAurasDueToSpell(TF_CAPTURE_BUFF);
- }
- }
- else
- {
- for(std::set<uint64>::iterator itr = m_PlayerGuids[0].begin(); itr != m_PlayerGuids[0].end(); ++itr)
- {
- if(Player * plr = objmgr.GetPlayer(*itr))
- if(plr->IsInWorld()) plr->RemoveAurasDueToSpell(TF_CAPTURE_BUFF);
- }
- for(std::set<uint64>::iterator itr = m_PlayerGuids[1].begin(); itr != m_PlayerGuids[1].end(); ++itr)
- {
- if(Player * plr = objmgr.GetPlayer(*itr))
- if(plr->IsInWorld()) plr->RemoveAurasDueToSpell(TF_CAPTURE_BUFF);
- }
- }
-}
-
bool OutdoorPvPTF::Update(uint32 diff)
{
bool changed = false;
@@ -184,7 +141,7 @@ bool OutdoorPvPTF::Update(uint32 diff)
{
if(m_AllianceTowersControlled == TF_TOWER_NUM)
{
- BuffTeam(ALLIANCE);
+ TeamApplyBuff(TEAM_ALLIANCE, TF_CAPTURE_BUFF);
m_IsLocked = true;
SendUpdateWorldState(TF_UI_LOCKED_DISPLAY_NEUTRAL,uint32(0));
SendUpdateWorldState(TF_UI_LOCKED_DISPLAY_HORDE,uint32(0));
@@ -193,7 +150,7 @@ bool OutdoorPvPTF::Update(uint32 diff)
}
else if(m_HordeTowersControlled == TF_TOWER_NUM)
{
- BuffTeam(HORDE);
+ TeamApplyBuff(TEAM_HORDE, TF_CAPTURE_BUFF);
m_IsLocked = true;
SendUpdateWorldState(TF_UI_LOCKED_DISPLAY_NEUTRAL,uint32(0));
SendUpdateWorldState(TF_UI_LOCKED_DISPLAY_HORDE,uint32(1));
@@ -201,7 +158,10 @@ bool OutdoorPvPTF::Update(uint32 diff)
SendUpdateWorldState(TF_UI_TOWERS_CONTROLLED_DISPLAY, uint32(0));
}
else
- BuffTeam(NULL);
+ {
+ TeamCastSpell(TEAM_ALLIANCE, -TF_CAPTURE_BUFF);
+ TeamCastSpell(TEAM_HORDE, -TF_CAPTURE_BUFF);
+ }
SendUpdateWorldState(TF_UI_TOWER_COUNT_A, m_AllianceTowersControlled);
SendUpdateWorldState(TF_UI_TOWER_COUNT_H, m_HordeTowersControlled);
}
diff --git a/src/game/OutdoorPvPTF.h b/src/game/OutdoorPvPTF.h
index 2d99a93c7cf..c45a31e3d22 100644
--- a/src/game/OutdoorPvPTF.h
+++ b/src/game/OutdoorPvPTF.h
@@ -13,7 +13,7 @@ const uint32 TF_LOCK_TIME = 3600 * 6 * 1000;
const uint32 TF_LOCK_TIME_UPDATE = 15000;
// blessing of auchindoun
-const uint32 TF_CAPTURE_BUFF = 33377;
+#define TF_CAPTURE_BUFF 33377
const uint32 TF_ALLY_QUEST = 11505;
const uint32 TF_HORDE_QUEST = 11506;
@@ -104,7 +104,6 @@ public:
bool Update(uint32 diff);
void FillInitialWorldStates(WorldPacket &data);
void SendRemoveWorldStates(Player * plr);
- void BuffTeam(uint32 team);
private:
bool m_IsLocked;
uint32 m_LockTimer;
diff --git a/src/game/OutdoorPvPZM.cpp b/src/game/OutdoorPvPZM.cpp
index 15625177393..340c12c3ca6 100644
--- a/src/game/OutdoorPvPZM.cpp
+++ b/src/game/OutdoorPvPZM.cpp
@@ -224,49 +224,6 @@ void OutdoorPvPZM::HandleKillImpl(Player *plr, Unit * killed)
plr->CastSpell(plr,ZM_HordePlayerKillReward,true);
}
-void OutdoorPvPZM::BuffTeam(uint32 team)
-{
- if(team == ALLIANCE)
- {
- for(std::set<uint64>::iterator itr = m_PlayerGuids[0].begin(); itr != m_PlayerGuids[0].end(); ++itr)
- {
- if(Player * plr = objmgr.GetPlayer(*itr))
- if(plr->IsInWorld()) plr->CastSpell(plr,ZM_CAPTURE_BUFF,true);
- }
- for(std::set<uint64>::iterator itr = m_PlayerGuids[1].begin(); itr != m_PlayerGuids[1].end(); ++itr)
- {
- if(Player * plr = objmgr.GetPlayer(*itr))
- if(plr->IsInWorld()) plr->RemoveAurasDueToSpell(ZM_CAPTURE_BUFF);
- }
- }
- else if(team == HORDE)
- {
- for(std::set<uint64>::iterator itr = m_PlayerGuids[1].begin(); itr != m_PlayerGuids[1].end(); ++itr)
- {
- if(Player * plr = objmgr.GetPlayer(*itr))
- if(plr->IsInWorld()) plr->CastSpell(plr,ZM_CAPTURE_BUFF,true);
- }
- for(std::set<uint64>::iterator itr = m_PlayerGuids[0].begin(); itr != m_PlayerGuids[0].end(); ++itr)
- {
- if(Player * plr = objmgr.GetPlayer(*itr))
- if(plr->IsInWorld()) plr->RemoveAurasDueToSpell(ZM_CAPTURE_BUFF);
- }
- }
- else
- {
- for(std::set<uint64>::iterator itr = m_PlayerGuids[0].begin(); itr != m_PlayerGuids[0].end(); ++itr)
- {
- if(Player * plr = objmgr.GetPlayer(*itr))
- if(plr->IsInWorld()) plr->RemoveAurasDueToSpell(ZM_CAPTURE_BUFF);
- }
- for(std::set<uint64>::iterator itr = m_PlayerGuids[1].begin(); itr != m_PlayerGuids[1].end(); ++itr)
- {
- if(Player * plr = objmgr.GetPlayer(*itr))
- if(plr->IsInWorld()) plr->RemoveAurasDueToSpell(ZM_CAPTURE_BUFF);
- }
- }
-}
-
bool OutdoorPvPObjectiveZM_GraveYard::Update(uint32 diff)
{
bool retval = m_State != m_OldState;
@@ -288,7 +245,7 @@ int32 OutdoorPvPObjectiveZM_GraveYard::HandleOpenGo(Player *plr, uint64 guid)
AddObject(0,ZM_Banner_A.entry,ZM_Banner_A.map,ZM_Banner_A.x,ZM_Banner_A.y,ZM_Banner_A.z,ZM_Banner_A.o,ZM_Banner_A.rot0,ZM_Banner_A.rot1,ZM_Banner_A.rot2,ZM_Banner_A.rot3);
objmgr.RemoveGraveYardLink(ZM_GRAVEYARD_ID, ZM_GRAVEYARD_ZONE, HORDE); // rem gy
objmgr.AddGraveYardLink(ZM_GRAVEYARD_ID, ZM_GRAVEYARD_ZONE, ALLIANCE, false); // add gy
- ((OutdoorPvPZM*)m_PvP)->BuffTeam(ALLIANCE);
+ m_PvP->TeamApplyBuff(TEAM_ALLIANCE, ZM_CAPTURE_BUFF);
plr->RemoveAurasDueToSpell(ZM_BATTLE_STANDARD_A);
sWorld.SendZoneText(ZM_GRAVEYARD_ZONE,objmgr.GetTrinityStringForDBCLocale(LANG_OPVP_ZM_CAPTURE_GY_A));
}
@@ -301,7 +258,7 @@ int32 OutdoorPvPObjectiveZM_GraveYard::HandleOpenGo(Player *plr, uint64 guid)
AddObject(0,ZM_Banner_H.entry,ZM_Banner_H.map,ZM_Banner_H.x,ZM_Banner_H.y,ZM_Banner_H.z,ZM_Banner_H.o,ZM_Banner_H.rot0,ZM_Banner_H.rot1,ZM_Banner_H.rot2,ZM_Banner_H.rot3);
objmgr.RemoveGraveYardLink(ZM_GRAVEYARD_ID, ZM_GRAVEYARD_ZONE, ALLIANCE); // rem gy
objmgr.AddGraveYardLink(ZM_GRAVEYARD_ID, ZM_GRAVEYARD_ZONE, HORDE, false); // add gy
- ((OutdoorPvPZM*)m_PvP)->BuffTeam(HORDE);
+ m_PvP->TeamApplyBuff(TEAM_HORDE, ZM_CAPTURE_BUFF);
plr->RemoveAurasDueToSpell(ZM_BATTLE_STANDARD_H);
sWorld.SendZoneText(ZM_GRAVEYARD_ZONE,objmgr.GetTrinityStringForDBCLocale(LANG_OPVP_ZM_CAPTURE_GY_H));
}
diff --git a/src/game/OutdoorPvPZM.h b/src/game/OutdoorPvPZM.h
index f4a60f8c8f4..33e42209f41 100644
--- a/src/game/OutdoorPvPZM.h
+++ b/src/game/OutdoorPvPZM.h
@@ -26,7 +26,7 @@ const uint32 OutdoorPvPZMBuffZonesNum = 5;
// the buff is cast in these zones
const uint32 OutdoorPvPZMBuffZones[OutdoorPvPZMBuffZonesNum] = {3521,3607,3717,3715,3716};
// cast on the players of the controlling faction
-const uint32 ZM_CAPTURE_BUFF = 33779; // twin spire blessing
+#define ZM_CAPTURE_BUFF 33779 // twin spire blessing
// spell that the field scout casts on the player to carry the flag
const uint32 ZM_BATTLE_STANDARD_A = 32430;
// spell that the field scout casts on the player to carry the flag
@@ -204,7 +204,6 @@ public:
void FillInitialWorldStates(WorldPacket &data);
void SendRemoveWorldStates(Player * plr);
void HandleKillImpl(Player * plr, Unit * killed);
- void BuffTeam(uint32 team);
private:
OutdoorPvPObjectiveZM_GraveYard * m_GraveYard;
uint32 m_AllianceTowersControlled;
diff --git a/src/game/Player.cpp b/src/game/Player.cpp
index 910a1bf70be..88932020d38 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -1820,6 +1820,7 @@ void Player::RemoveFromWorld()
///- Release charmed creatures, unsummon totems and remove pets/guardians
StopCastingCharm();
StopCastingBindSight();
+ sOutdoorPvPMgr.HandlePlayerLeaveZone(this, m_zoneUpdateId);
}
for(int i = PLAYER_SLOT_START; i < PLAYER_SLOT_END; ++i)
diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp
index 12e409e9bcc..e66c33ea49b 100644
--- a/src/game/SpellAuras.cpp
+++ b/src/game/SpellAuras.cpp
@@ -6593,6 +6593,11 @@ void AuraEffect::PeriodicDummyTick()
// case 50493: break;
// // Love Rocket Barrage
// case 50530: break;
+ // Tenacity
+ case 58549:
+ case 59911:
+ GetParentAura()->RefreshAura();
+ break;
// Exist more after, need add later
default:
break;
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp
index 651d09d98a1..7b6b65bbb5a 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -13796,6 +13796,18 @@ void Unit::AddAura(uint32 spellId, Unit* target)
target->AddAura(Aur);
}
+void Unit::SetAuraStack(uint32 spellId, Unit *target, uint32 stack)
+{
+ Aura *aur = target->GetAura(spellId, GetGUID());
+ if(!aur)
+ {
+ AddAura(spellId, target);
+ aur = target->GetAura(spellId, GetGUID());
+ }
+ if(aur && stack)
+ aur->SetStackAmount(stack);
+}
+
Aura * Unit::AddAuraEffect(const SpellEntry * spellInfo, uint8 effIndex, Unit* caster, int32 * basePoints, Unit * source)
{
// can't do that for passive auras - they stack from same caster so there is no way to get exact aura which should get effect
diff --git a/src/game/Unit.h b/src/game/Unit.h
index f5502e130e0..f92c5335b5b 100644
--- a/src/game/Unit.h
+++ b/src/game/Unit.h
@@ -1189,6 +1189,7 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
void CastCustomSpell(uint32 spellId, CustomSpellValues const &value, Unit* Victim = NULL, bool triggered = true, Item *castItem = NULL, AuraEffect* triggeredByAura = NULL, uint64 originalCaster = 0);
void CastSpell(GameObject *go, uint32 spellId, bool triggered, Item *castItem = NULL, AuraEffect* triggeredByAura = NULL, uint64 originalCaster = 0);
void AddAura(uint32 spellId, Unit *target);
+ void SetAuraStack(uint32 spellId, Unit *target, uint32 stack);
void HandleAuraEffect(AuraEffect * aureff, bool apply);
Aura *AddAuraEffect(const SpellEntry * spellInfo, uint8 effIndex, Unit* caster, int32 * basePoints=NULL, Unit * source=NULL);
diff --git a/src/game/Wintergrasp.cpp b/src/game/Wintergrasp.cpp
index 5fe5a7bdbe6..0103b32b35d 100644
--- a/src/game/Wintergrasp.cpp
+++ b/src/game/Wintergrasp.cpp
@@ -32,7 +32,6 @@ bool OPvPWintergrasp::SetupOutdoorPvP()
}
m_defender = TeamId(rand()%2);
- m_attacker = (m_defender == TEAM_ALLIANCE ? TEAM_HORDE : TEAM_ALLIANCE);
return true;
}
@@ -45,18 +44,21 @@ void OPvPWintergrasp::HandlePlayerEnterZone(Player * plr, uint32 zone)
for(AreaPOIList::iterator itr = areaPOIs.begin(); itr != areaPOIs.end(); ++itr)
{
- TeamId team = ((*itr)->x > POS_X_CENTER ? m_defender : m_attacker);
+ TeamId team = ((*itr)->x > POS_X_CENTER ? m_defender : OTHER_TEAM(m_defender));
plr->SendUpdateWorldState((*itr)->worldState, AreaPOIIconId[team][DAMAGE_INTACT]);
}
OutdoorPvP::HandlePlayerEnterZone(plr, zone);
+ UpdateTenacityStack();
}
void OPvPWintergrasp::HandlePlayerLeaveZone(Player * plr, uint32 zone)
{
if(!plr->GetSession()->PlayerLogout() && plr->m_Vehicle) // dismiss in change zone case
plr->m_Vehicle->Dismiss();
+ plr->RemoveAura(SPELL_TENACITY);
OutdoorPvP::HandlePlayerLeaveZone(plr, zone);
+ UpdateTenacityStack();
}
void OPvPWintergrasp::HandleKill(Player *killer, Unit *victim)
@@ -91,3 +93,42 @@ void OPvPWintergrasp::HandleKill(Player *killer, Unit *victim)
}
}
}
+
+void OPvPWintergrasp::UpdateTenacityStack()
+{
+ uint32 allianceNum = m_players[TEAM_ALLIANCE].size();
+ uint32 hordeNum = m_players[TEAM_HORDE].size();
+
+ int32 newStack = 0;
+ if(allianceNum && hordeNum)
+ {
+ if(allianceNum > hordeNum)
+ newStack = allianceNum / hordeNum - 1;
+ else if(allianceNum < hordeNum)
+ newStack = 1 - int32(hordeNum / allianceNum);
+ }
+
+ if(newStack == m_tenacityStack)
+ return;
+
+ // Remove old buff
+ if(m_tenacityStack > 0)
+ {
+ if(newStack <= 0)
+ TeamCastSpell(TEAM_ALLIANCE, -SPELL_TENACITY);
+ }
+ else if(m_tenacityStack < 0)
+ {
+ if(newStack >= 0)
+ TeamCastSpell(TEAM_HORDE, -SPELL_TENACITY);
+ }
+ m_tenacityStack = newStack;
+
+ // Apply new buff
+ if(newStack)
+ {
+ TeamId team = newStack > 0 ? TEAM_ALLIANCE : TEAM_HORDE;
+ for(PlayerSet::iterator itr = m_players[team].begin(); itr != m_players[team].end(); ++itr)
+ (*itr)->SetAuraStack(SPELL_TENACITY, *itr, newStack);
+ }
+}
diff --git a/src/game/Wintergrasp.h b/src/game/Wintergrasp.h
index 40b908ea74d..e95b7884efb 100644
--- a/src/game/Wintergrasp.h
+++ b/src/game/Wintergrasp.h
@@ -29,15 +29,8 @@
#define SPELL_CORPORAL 33280
#define SPELL_LIEUTENANT 55629
-#define SPELL_TENICITY 58549
-#define SPELL_TENICITY_VEHICLE 59911
-
-enum TeamId
-{
- TEAM_ALLIANCE = 0,
- TEAM_HORDE,
- TEAM_NEUTRAL,
-};
+#define SPELL_TENACITY 58549
+#define SPELL_TENACITY_VEHICLE 59911
enum DamageState
{
@@ -65,14 +58,18 @@ class OPvPWintergrasp : public OutdoorPvP
typedef std::list<const AreaPOIEntry *> AreaPOIList;
typedef std::map<uint32, BuildingState *> BuildingStateMap;
public:
+ explicit OPvPWintergrasp() : m_tenacityStack(0) {}
bool SetupOutdoorPvP();
void HandlePlayerEnterZone(Player *plr, uint32 zone);
void HandlePlayerLeaveZone(Player *plr, uint32 zone);
void HandleKill(Player *killer, Unit *victim);
protected:
- TeamId m_defender, m_attacker;
+ TeamId m_defender;
+ int32 m_tenacityStack;
AreaPOIList areaPOIs;
BuildingStateMap buildingStates;
+
+ void UpdateTenacityStack();
};
#endif