diff options
author | Kudlaty <none@none> | 2009-11-27 03:16:49 +0100 |
---|---|---|
committer | Kudlaty <none@none> | 2009-11-27 03:16:49 +0100 |
commit | 223d7d81166f4b8899be865631b3b0f0e0331065 (patch) | |
tree | eff4cac0bda929e6f373bde0412a93d61e409908 | |
parent | 353a9f37405cc54b9f3a7d6d47f09ec801b1ad65 (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.cpp | 20 | ||||
-rw-r--r-- | src/game/Wintergrasp.cpp | 31 | ||||
-rw-r--r-- | src/game/Wintergrasp.h | 37 | ||||
-rw-r--r-- | src/game/World.cpp | 11 | ||||
-rw-r--r-- | src/game/World.h | 32 |
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 |