BF/Wintergrasp: Implemented better support for Wintergrasp phasing. It has been done by checking player's distance to the Caputre Point on every tick. Now it is performed using spell_area.

P.D: Reverted my last commit, it was wrong (my apologies)
This commit is contained in:
Manuel Carrasco
2012-08-20 13:36:38 -04:00
committed by Kandera
parent efcfdc4c39
commit 1f6eec4754
4 changed files with 69 additions and 14 deletions
@@ -1,3 +1,24 @@
SET @SPELL_HORDE := 56618;
SET @SPELL_ALLIANCE := 56617;
SET @AREA_SUNKEN_RING := 4538;
SET @AREA_BROKEN_TEMPLE := 4539;
SET @AREA_W_WORKSHOP := 4611;
SET @AREA_E_WORKSHOP := 4612;
DELETE FROM `spell_area` WHERE `spell` IN (@SPELL_HORDE, @SPELL_ALLIANCE);
INSERT INTO `spell_area` (`spell`,`area`,`autocast`) VALUES
(@SPELL_HORDE, @AREA_SUNKEN_RING, 1),
(@SPELL_ALLIANCE, @AREA_SUNKEN_RING, 1),
(@SPELL_HORDE, @AREA_BROKEN_TEMPLE, 1),
(@SPELL_ALLIANCE, @AREA_BROKEN_TEMPLE, 1),
(@SPELL_HORDE, @AREA_W_WORKSHOP, 1),
(@SPELL_ALLIANCE, @AREA_W_WORKSHOP, 1),
(@SPELL_HORDE, @AREA_E_WORKSHOP, 1),
(@SPELL_ALLIANCE, @AREA_E_WORKSHOP, 1);
/*
Spell 56617 "Alliance Controls Factory Phase Shift" Adds Phase 32 Spell 56617 "Alliance Controls Factory Phase Shift" Adds Phase 32
Spell 56618 "Horde Controls Factory Phase Shift" Adds Phase 16 Spell 56618 "Horde Controls Factory Phase Shift" Adds Phase 16
@@ -26,4 +47,6 @@ Spells cast on vehicle as auras... or something (PET_SPELLS cooldowns):
61178 (Grab Passenger) (Catapult, Siege Engine... NOT tower cannons) 61178 (Grab Passenger) (Catapult, Siege Engine... NOT tower cannons)
56866 (-Unknown-) (Catapult, Siege Engine.... NOT tower cannons) 56866 (-Unknown-) (Catapult, Siege Engine.... NOT tower cannons)
14268 (Alliance Flag) (Catapult, Siege Engine... NOT tower cannons) 14268 (Alliance Flag) (Catapult, Siege Engine... NOT tower cannons)
14267 (Horde Flag) 14267 (Horde Flag)
*/
@@ -238,19 +238,6 @@ bool BattlefieldWG::Update(uint32 diff)
} }
for (uint8 team = 0; team < 2; ++team)
for (GuidSet::const_iterator itr = m_players[team].begin(); itr != m_players[team].end(); ++itr)
if (Player* player = sObjectAccessor->FindPlayer(*itr))
for (BfCapturePointMap::iterator cp_itr = m_capturePoints.begin(); cp_itr != m_capturePoints.end(); ++cp_itr)
{
if ((*cp_itr).second->GetCapturePointGo()->GetExactDist2dSq(player) < 22500.0f) // 150*150
{
player->AddAura((*cp_itr).second->GetTeamId() == TEAM_HORDE ? SPELL_HORDE_CONTROLS_FACTORY_PHASE_SHIFT : SPELL_ALLIANCE_CONTROLS_FACTORY_PHASE_SHIFT, player);
player->RemoveAurasDueToSpell((*cp_itr).second->GetTeamId() == TEAM_ALLIANCE ? SPELL_HORDE_CONTROLS_FACTORY_PHASE_SHIFT : SPELL_ALLIANCE_CONTROLS_FACTORY_PHASE_SHIFT);
break;
}
}
return m_return; return m_return;
} }
@@ -862,6 +849,7 @@ void BattlefieldWG::OnPlayerLeaveWar(Player* player)
player->RemoveAurasDueToSpell(SPELL_CORPORAL); player->RemoveAurasDueToSpell(SPELL_CORPORAL);
player->RemoveAurasDueToSpell(SPELL_LIEUTENANT); player->RemoveAurasDueToSpell(SPELL_LIEUTENANT);
player->RemoveAurasDueToSpell(SPELL_TOWER_CONTROL); player->RemoveAurasDueToSpell(SPELL_TOWER_CONTROL);
player->RemoveAurasDueToSpell(SPELL_SPIRITUAL_IMMUNITY);
player->RemoveAurasDueToSpell(SPELL_TENACITY); player->RemoveAurasDueToSpell(SPELL_TENACITY);
player->RemoveAurasDueToSpell(SPELL_WINTERGRASP_RESTRICTED_FLIGHT_AREA); player->RemoveAurasDueToSpell(SPELL_WINTERGRASP_RESTRICTED_FLIGHT_AREA);
player->RemoveAurasDueToSpell(SPELL_ESSENCE_OF_WINTERGRASP); player->RemoveAurasDueToSpell(SPELL_ESSENCE_OF_WINTERGRASP);
@@ -882,6 +870,7 @@ void BattlefieldWG::OnPlayerLeaveZone(Player* player)
player->RemoveAurasDueToSpell(SPELL_CORPORAL); player->RemoveAurasDueToSpell(SPELL_CORPORAL);
player->RemoveAurasDueToSpell(SPELL_LIEUTENANT); player->RemoveAurasDueToSpell(SPELL_LIEUTENANT);
player->RemoveAurasDueToSpell(SPELL_TOWER_CONTROL); player->RemoveAurasDueToSpell(SPELL_TOWER_CONTROL);
player->RemoveAurasDueToSpell(SPELL_SPIRITUAL_IMMUNITY);
player->RemoveAurasDueToSpell(SPELL_TENACITY); player->RemoveAurasDueToSpell(SPELL_TENACITY);
player->RemoveAurasDueToSpell(SPELL_WINTERGRASP_RESTRICTED_FLIGHT_AREA); player->RemoveAurasDueToSpell(SPELL_WINTERGRASP_RESTRICTED_FLIGHT_AREA);
player->RemoveAurasDueToSpell(SPELL_TOWER_CONTROL); player->RemoveAurasDueToSpell(SPELL_TOWER_CONTROL);
@@ -901,6 +890,7 @@ void BattlefieldWG::OnPlayerEnterZone(Player* player)
player->RemoveAurasDueToSpell(SPELL_CORPORAL); player->RemoveAurasDueToSpell(SPELL_CORPORAL);
player->RemoveAurasDueToSpell(SPELL_LIEUTENANT); player->RemoveAurasDueToSpell(SPELL_LIEUTENANT);
player->RemoveAurasDueToSpell(SPELL_TOWER_CONTROL); player->RemoveAurasDueToSpell(SPELL_TOWER_CONTROL);
player->RemoveAurasDueToSpell(SPELL_SPIRITUAL_IMMUNITY);
player->RemoveAurasDueToSpell(SPELL_TENACITY); player->RemoveAurasDueToSpell(SPELL_TENACITY);
player->RemoveAurasDueToSpell(SPELL_WINTERGRASP_RESTRICTED_FLIGHT_AREA); player->RemoveAurasDueToSpell(SPELL_WINTERGRASP_RESTRICTED_FLIGHT_AREA);
player->RemoveAurasDueToSpell(SPELL_TOWER_CONTROL); player->RemoveAurasDueToSpell(SPELL_TOWER_CONTROL);
@@ -913,6 +903,24 @@ void BattlefieldWG::OnPlayerEnterZone(Player* player)
SendInitWorldStatesTo(player); SendInitWorldStatesTo(player);
} }
uint32 BattlefieldWG::GetData(uint32 data)
{
switch (data)
{
// Used to determine when the phasing spells must be casted
// See: SpellArea::IsFitToRequirements
case AREA_THE_SUNKEN_RING:
case AREA_THE_BROKEN_TEMPLATE:
case AREA_WESTPARK_WORKSHOP:
case AREA_EASTPARK_WORKSHOP:
// Graveyards and Workshops are controlled by the same team.
if (m_GraveYardList[GetSpiritGraveyardId(data)])
return m_GraveYardList[GetSpiritGraveyardId(data)]->GetControlTeamId();
}
return 0;
}
// Method sending worldsate to player // Method sending worldsate to player
WorldPacket BattlefieldWG::BuildInitWorldStates() WorldPacket BattlefieldWG::BuildInitWorldStates()
{ {
@@ -428,6 +428,8 @@ class BattlefieldWG : public Battlefield
// returns the graveyardId in the specified area. // returns the graveyardId in the specified area.
uint8 GetSpiritGraveyardId(uint32 areaId); uint8 GetSpiritGraveyardId(uint32 areaId);
uint32 GetData(uint32 data);
protected: protected:
bool m_CanClickOnOrb; bool m_CanClickOnOrb;
GameObject* m_relic; GameObject* m_relic;
+22
View File
@@ -30,6 +30,8 @@
#include "CreatureAI.h" #include "CreatureAI.h"
#include "MapManager.h" #include "MapManager.h"
#include "BattlegroundIC.h" #include "BattlegroundIC.h"
#include "BattlefieldWG.h"
#include "BattlefieldMgr.h"
bool IsPrimaryProfessionSkill(uint32 skill) bool IsPrimaryProfessionSkill(uint32 skill)
{ {
@@ -1145,6 +1147,26 @@ bool SpellArea::IsFitToRequirements(Player const* player, uint32 newZone, uint32
return false; return false;
} }
case 56618: // Horde Controls Factory Phase Shift
case 56617: // Alliance Controls Factory Phase Shift
{
if (!player)
return false;
Battlefield* bf = sBattlefieldMgr.GetBattlefieldToZoneId(player->GetZoneId());
if (!bf || bf->GetTypeId() != BATTLEFIELD_WG)
return false;
// team that controls the workshop in the specified area
uint32 team = bf->GetData(newArea);
if (team == TEAM_HORDE)
return spellId == 56618;
else if (team == TEAM_ALLIANCE)
return spellId == 56617;
}
break;
} }
return true; return true;