aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKudlaty <none@none>2009-11-27 03:16:49 +0100
committerKudlaty <none@none>2009-11-27 03:16:49 +0100
commit223d7d81166f4b8899be865631b3b0f0e0331065 (patch)
treeeff4cac0bda929e6f373bde0412a93d61e409908
parent353a9f37405cc54b9f3a7d6d47f09ec801b1ad65 (diff)
Apply #456
Removed Essence of Wintergrasp from OutdoorPvP and implementation using the spell system. This will affect Wintergrasp and all Northrend zones, dungeons and raids. Note: need database support. Patch by Spp --HG-- branch : trunk
-rw-r--r--src/game/SpellMgr.cpp20
-rw-r--r--src/game/Wintergrasp.cpp31
-rw-r--r--src/game/Wintergrasp.h37
-rw-r--r--src/game/World.cpp11
-rw-r--r--src/game/World.h32
5 files changed, 81 insertions, 50 deletions
diff --git a/src/game/SpellMgr.cpp b/src/game/SpellMgr.cpp
index 21e9b4e8702..447a6059777 100644
--- a/src/game/SpellMgr.cpp
+++ b/src/game/SpellMgr.cpp
@@ -3030,17 +3030,21 @@ bool SpellArea::IsFitToRequirements(Player const* player, uint32 newZone, uint32
return false;
}
- if(auraSpell)
+ if (auraSpell)
{
// not have expected aura
- if(!player)
+ if (!player || auraSpell > 0 && !player->HasAura(auraSpell) || auraSpell < 0 && player->HasAura(-auraSpell))
return false;
- if(auraSpell > 0)
- // have expected aura
- return player->HasAura(auraSpell);
- else
- // not have expected aura
- return !player->HasAura(-auraSpell);
+ }
+
+ // Extra conditions
+ switch(spellId)
+ {
+ case 58045: // Essence of Wintergrasp - Wintergrasp
+ case 57940: // Essence of Wintergrasp - Northrend
+ if (!player || player->GetTeamId() != sWorld.getState(WORLDSTATE_WINTERGRASP_CONTROLING_FACTION))
+ return false;
+ break;
}
return true;
diff --git a/src/game/Wintergrasp.cpp b/src/game/Wintergrasp.cpp
index dcc27a3fb11..edc9158f84e 100644
--- a/src/game/Wintergrasp.cpp
+++ b/src/game/Wintergrasp.cpp
@@ -100,9 +100,13 @@ OPvPWintergrasp::OPvPWintergrasp()
bool OPvPWintergrasp::SetupOutdoorPvP()
{
if (!sWorld.getConfig(CONFIG_OUTDOORPVP_WINTERGRASP_ENABLED))
+ {
+ sWorld.setState(WORLDSTATE_WINTERGRASP_CONTROLING_FACTION, TEAM_NEUTRAL);
return false;
+ }
m_defender = TeamId(rand()%2);
+ sWorld.setState(WORLDSTATE_WINTERGRASP_CONTROLING_FACTION, getDefenderTeam());
m_changeDefender = false;
m_workshopCount[TEAM_ALLIANCE] = 0;
m_workshopCount[TEAM_HORDE] = 0;
@@ -598,9 +602,8 @@ void OPvPWintergrasp::ProcessEvent(GameObject *obj, uint32 eventId)
void OPvPWintergrasp::RemoveOfflinePlayerWGAuras()
{
// if server crashed while in battle there could be players with rank or tenacity
- CharacterDatabase.PExecute("DELETE FROM character_aura WHERE spell IN (%u, %u, %u, %u, %u, %u)",
- SPELL_RECRUIT, SPELL_CORPORAL, SPELL_LIEUTENANT, SPELL_TENACITY,
- SPELL_ESSENCE_OF_WG, SPELL_TOWER_CONTROL);
+ CharacterDatabase.PExecute("DELETE FROM character_aura WHERE spell IN (%u, %u, %u, %u, %u)",
+ SPELL_RECRUIT, SPELL_CORPORAL, SPELL_LIEUTENANT, SPELL_TENACITY, SPELL_TOWER_CONTROL);
}
void OPvPWintergrasp::ModifyWorkshopCount(TeamId team, bool add)
@@ -1058,12 +1061,7 @@ void OPvPWintergrasp::HandlePlayerEnterZone(Player * plr, uint32 zone)
plr->GetSession()->SendNotification(LANG_ZONE_NOFLYZONE);
}
- if (!isWarTime())
- {
- if (plr->GetTeamId() == getDefenderTeam())
- plr->CastSpell(plr,SPELL_ESSENCE_OF_WG, true);
- }
- else
+ if (isWarTime())
{
if (plr->getLevel() > 69)
{
@@ -1141,7 +1139,6 @@ void OPvPWintergrasp::HandlePlayerLeaveZone(Player * plr, uint32 zone)
plr->RemoveAurasDueToSpell(SPELL_TENACITY);
OutdoorPvP::HandlePlayerLeaveZone(plr, zone);
UpdateTenacityStack();
- plr->RemoveAura(SPELL_ESSENCE_OF_WG);
plr->RemoveAura(SPELL_NOFLYZONE_WG);
}
@@ -1425,11 +1422,7 @@ void OPvPWintergrasp::forceStopBattle()
{ // Uptime will do all the work.
if (!isWarTime())
- {
m_wartime = true;
- if (m_changeDefender)
- TeamCastSpell(getDefenderTeam(), -SPELL_ESSENCE_OF_WG);
- }
if (m_timer != 1)
{
@@ -1455,6 +1448,10 @@ void OPvPWintergrasp::StartBattle()
m_wartime = true;
m_timer = sWorld.getConfig(CONFIG_OUTDOORPVP_WINTERGRASP_BATTLE_TIME) * MINUTE * IN_MILISECONDS;
+ // Remove Essence of Wintergrasp to all players
+ sWorld.setState(WORLDSTATE_WINTERGRASP_CONTROLING_FACTION, TEAM_NEUTRAL);
+ sWorld.UpdateAreaDependentAuras();
+
// destroyed all vehicles
for (uint32 team = 0; team < 2; ++team)
{
@@ -1481,7 +1478,6 @@ void OPvPWintergrasp::StartBattle()
for (PlayerSet::iterator itr = m_players[getDefenderTeam()].begin(); itr != m_players[getDefenderTeam()].end(); ++itr)
{
REMOVE_WARTIME_AURAS(*itr);
- (*itr)->RemoveAura(SPELL_ESSENCE_OF_WG);
if ((*itr)->getLevel() > 69)
(*itr)->CastSpell(*itr, SPELL_RECRUIT, true);
}
@@ -1490,6 +1486,10 @@ void OPvPWintergrasp::StartBattle()
void OPvPWintergrasp::EndBattle()
{
+ // Cast Essence of Wintergrasp to all players (CheckCast will determine who to cast)
+ sWorld.setState(WORLDSTATE_WINTERGRASP_CONTROLING_FACTION, getDefenderTeam());
+ sWorld.UpdateAreaDependentAuras();
+
for (uint32 team = 0; team < 2; ++team)
{
// destroyed all vehicles
@@ -1641,7 +1641,6 @@ void OPvPWintergrasp::EndBattle()
m_timer = sWorld.getConfig(CONFIG_OUTDOORPVP_WINTERGRASP_INTERVAL) * MINUTE * IN_MILISECONDS;
//3.2.0: TeamCastSpell(getAttackerTeam(), SPELL_TELEPORT_DALARAN);
RemoveOfflinePlayerWGAuras();
- TeamCastSpell(getDefenderTeam(), SPELL_ESSENCE_OF_WG);
}
void OPvPWintergrasp::SetData(uint32 id, uint32 value)
diff --git a/src/game/Wintergrasp.h b/src/game/Wintergrasp.h
index a06f585d21a..ac4ff638eaf 100644
--- a/src/game/Wintergrasp.h
+++ b/src/game/Wintergrasp.h
@@ -34,31 +34,28 @@ const uint32 ClockWorldState[5] = {3785,3784,3782,3976,3975};
enum WintergraspSpell
{
// Wartime auras
- SPELL_RECRUIT = 37795,
- SPELL_CORPORAL = 33280,
- SPELL_LIEUTENANT = 55629,
- SPELL_TENACITY = 58549,
- SPELL_TENACITY_VEHICLE = 59911,
- SPELL_TOWER_CONTROL = 62064,
- SPELL_SPIRITUAL_IMMUNITY = 58729,
+ SPELL_RECRUIT = 37795,
+ SPELL_CORPORAL = 33280,
+ SPELL_LIEUTENANT = 55629,
+ SPELL_TENACITY = 58549,
+ SPELL_TENACITY_VEHICLE = 59911,
+ SPELL_TOWER_CONTROL = 62064,
+ SPELL_SPIRITUAL_IMMUNITY = 58729,
// Reward spells
- SPELL_VICTORY_REWARD = 56902,
- SPELL_DEFEAT_REWARD = 58494,
- SPELL_DAMAGED_TOWER = 59135,
- SPELL_DESTROYED_TOWER = 59136,
- SPELL_DAMAGED_BUILDING = 59201,
- SPELL_INTACT_BUILDING = 59203,
-
- // No Wartime auras
- SPELL_ESSENCE_OF_WG = 58045,
+ SPELL_VICTORY_REWARD = 56902,
+ SPELL_DEFEAT_REWARD = 58494,
+ SPELL_DAMAGED_TOWER = 59135,
+ SPELL_DESTROYED_TOWER = 59136,
+ SPELL_DAMAGED_BUILDING = 59201,
+ SPELL_INTACT_BUILDING = 59203,
// other
- SPELL_NOFLYZONE_WG = 58730,
- SPELL_PARACHUTE_WG = 61243,
+ SPELL_NOFLYZONE_WG = 58730,
+ SPELL_PARACHUTE_WG = 61243,
-// SPELL_TELEPORT_DALARAN = 53360,
-// SPELL_VICTORY_AURA = 60044,
+// SPELL_TELEPORT_DALARAN = 53360,
+// SPELL_VICTORY_AURA = 60044,
};
enum WintergraspRewardEvent
diff --git a/src/game/World.cpp b/src/game/World.cpp
index c376a5cb57d..ae692c3494a 100644
--- a/src/game/World.cpp
+++ b/src/game/World.cpp
@@ -2575,3 +2575,14 @@ void World::LoadDBVersion()
if (m_CreatureEventAIVersion.empty())
m_CreatureEventAIVersion = "Unknown creature EventAI.";
}
+
+void World::UpdateAreaDependentAuras()
+{
+ SessionMap::const_iterator itr;
+ for (itr = m_sessions.begin(); itr != m_sessions.end(); ++itr)
+ if (itr->second && itr->second->GetPlayer() && itr->second->GetPlayer()->IsInWorld())
+ {
+ itr->second->GetPlayer()->UpdateAreaDependentAuras(itr->second->GetPlayer()->GetAreaId());
+ itr->second->GetPlayer()->UpdateZoneDependentAuras(itr->second->GetPlayer()->GetZoneId());
+ }
+}
diff --git a/src/game/World.h b/src/game/World.h
index cbfc5a9a36d..fb73d4ed08c 100644
--- a/src/game/World.h
+++ b/src/game/World.h
@@ -84,6 +84,13 @@ enum WorldTimers
WUPDATE_COUNT = 9
};
+// States than may change after server started
+enum WorldStates
+{
+ WORLDSTATE_WINTERGRASP_CONTROLING_FACTION,
+ WORLDSTATE_VALUE_COUNT,
+};
+
/// Configuration elements
enum WorldConfigs
{
@@ -554,17 +561,27 @@ class World
/// Set a server configuration element (see #WorldConfigs)
void setConfig(uint32 index,uint32 value)
{
- if(index<CONFIG_VALUE_COUNT)
- m_configs[index]=value;
+ if (index < CONFIG_VALUE_COUNT)
+ m_configs[index] = value;
}
/// Get a server configuration element (see #WorldConfigs)
uint32 getConfig(uint32 index) const
{
- if(index<CONFIG_VALUE_COUNT)
- return m_configs[index];
- else
- return 0;
+ return index < CONFIG_VALUE_COUNT ? m_configs[index] : 0;
+ }
+
+ // Set a server state - Those general values that can change after server have been setup
+ void setState(uint32 index, uint32 value)
+ {
+ if (index < WORLDSTATE_VALUE_COUNT)
+ m_states[index] = value;
+ }
+
+ // Get a server state element
+ uint32 getState(uint32 index) const
+ {
+ return index < WORLDSTATE_VALUE_COUNT ? m_states[index] : 0;
}
/// Are we on a "Player versus Player" server?
@@ -619,6 +636,8 @@ class World
void RecordTimeDiff(const char * text, ...);
void LoadAutobroadcasts();
+
+ void UpdateAreaDependentAuras();
protected:
void _UpdateGameTime();
// callback for UpdateRealmCharacters
@@ -661,6 +680,7 @@ class World
float rate_values[MAX_RATES];
uint32 m_configs[CONFIG_VALUE_COUNT];
+ uint32 m_states[WORLDSTATE_VALUE_COUNT];
int32 m_playerLimit;
AccountTypes m_allowedSecurityLevel;
LocaleConstant m_defaultDbcLocale; // from config for one from loaded DBC locales