diff options
author | megamage <none@none> | 2009-06-05 14:21:25 -0500 |
---|---|---|
committer | megamage <none@none> | 2009-06-05 14:21:25 -0500 |
commit | 13fd9ea601e666ea0381d6cfafc20e316fa3f90e (patch) | |
tree | fe9774a33b917171f5525e15611dfdd071e25740 | |
parent | afd79d7ebfc9db0045e74b56a4ecd4ae520552a7 (diff) |
*Apply tenacity buff on vehicles of wintergrasp.
*Fix the bug that tenacity is not applied on horde players.
--HG--
branch : trunk
-rw-r--r-- | src/bindings/scripts/scripts/zone/wintergrasp/wintergrasp.cpp | 6 | ||||
-rw-r--r-- | src/game/SpellEffects.cpp | 3 | ||||
-rw-r--r-- | src/game/Vehicle.cpp | 5 | ||||
-rw-r--r-- | src/game/Wintergrasp.cpp | 72 | ||||
-rw-r--r-- | src/game/Wintergrasp.h | 8 |
5 files changed, 80 insertions, 14 deletions
diff --git a/src/bindings/scripts/scripts/zone/wintergrasp/wintergrasp.cpp b/src/bindings/scripts/scripts/zone/wintergrasp/wintergrasp.cpp index 57cd2c92d77..67830d78a10 100644 --- a/src/bindings/scripts/scripts/zone/wintergrasp/wintergrasp.cpp +++ b/src/bindings/scripts/scripts/zone/wintergrasp/wintergrasp.cpp @@ -40,9 +40,9 @@ bool GossipSelect_npc_demolisher_engineerer(Player* player, Creature* me, uint32 player->CLOSE_GOSSIP_MENU(); switch(uiAction - GOSSIP_ACTION_INFO_DEF) { - case 0: player->CastSpell(player, 56663, false); break; - case 1: player->CastSpell(player, 56575, false); break; - case 2: player->CastSpell(player, player->GetTeamId() ? 61408 : 56661, false); break; + case 0: player->CastSpell(player, 56663, false, NULL, NULL, me->GetGUID()); break; + case 1: player->CastSpell(player, 56575, false, NULL, NULL, me->GetGUID()); break; + case 2: player->CastSpell(player, player->GetTeamId() ? 61408 : 56661, false, NULL, NULL, me->GetGUID()); break; } return true; diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index c69069b82a9..4ec6a30ae3d 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -3295,7 +3295,8 @@ void Spell::EffectSummonType(uint32 i) return; //vehicle->SetUInt64Value(UNIT_FIELD_SUMMONEDBY, m_caster->GetGUID()); - vehicle->setFaction(m_caster->getFaction()); + if(m_originalCaster) + vehicle->setFaction(m_originalCaster->getFaction()); vehicle->SetUInt32Value(UNIT_CREATED_BY_SPELL, m_spellInfo->Id); break; } diff --git a/src/game/Vehicle.cpp b/src/game/Vehicle.cpp index 94f828bfaf6..3efe735a5b5 100644 --- a/src/game/Vehicle.cpp +++ b/src/game/Vehicle.cpp @@ -26,6 +26,7 @@ #include "Chat.h" #include "CreatureAI.h" +#include "ZoneScript.h" Vehicle::Vehicle() : Creature(), m_vehicleInfo(NULL), m_usableSeatNum(0) { @@ -41,6 +42,8 @@ void Vehicle::AddToWorld() { if(!IsInWorld()) { + if(m_zoneScript) + m_zoneScript->OnCreatureCreate(this, true); ObjectAccessor::Instance().AddObject(this); Unit::AddToWorld(); AIM_Initialize(); @@ -58,6 +61,8 @@ void Vehicle::RemoveFromWorld() { if(IsInWorld()) { + if(m_zoneScript) + m_zoneScript->OnCreatureCreate(this, false); RemoveAllPassengers(); ///- Don't call the function for Creature, normal mobs + totems go in a different storage Unit::RemoveFromWorld(); diff --git a/src/game/Wintergrasp.cpp b/src/game/Wintergrasp.cpp index f3ab2f98975..782ec4ab537 100644 --- a/src/game/Wintergrasp.cpp +++ b/src/game/Wintergrasp.cpp @@ -171,7 +171,43 @@ uint32 OPvPWintergrasp::GetCreatureEntry(uint32 guidlow, const CreatureData *dat void OPvPWintergrasp::OnCreatureCreate(Creature *creature, bool add) { - if(m_creEntryPair.find(creature->GetEntry()) != m_creEntryPair.end()) + if(creature->isVehicle()) + { + TeamId team; + if(creature->getFaction() == WintergraspFaction[TEAM_ALLIANCE]) + team = TEAM_ALLIANCE; + else if(creature->getFaction() == WintergraspFaction[TEAM_HORDE]) + team = TEAM_HORDE; + else + return; + + switch(creature->GetEntry()) + { + case 27881: + case 28094: + case 28312: + case 32627: + //case 28366: tower + if(add) + { + m_vehicles[team].insert((Vehicle*)creature); + if(m_tenacityStack > 0) + { + if(team == TEAM_ALLIANCE) + creature->SetAuraStack(SPELL_TENACITY_VEHICLE, creature, m_tenacityStack); + } + else if(m_tenacityStack < 0) + { + if(team == TEAM_HORDE) + creature->SetAuraStack(SPELL_TENACITY_VEHICLE, creature, -m_tenacityStack); + } + } + else + m_vehicles[team].erase((Vehicle*)creature); + break; + } + } + else if(m_creEntryPair.find(creature->GetEntry()) != m_creEntryPair.end()) { if(add) m_creatures.insert(creature); else m_creatures.erase(creature); @@ -367,12 +403,18 @@ void OPvPWintergrasp::UpdateTenacityStack() if(m_tenacityStack > 0) { if(newStack <= 0) + { TeamCastSpell(TEAM_ALLIANCE, -SPELL_TENACITY); + VehicleCastSpell(TEAM_ALLIANCE, -SPELL_TENACITY_VEHICLE); + } } else if(m_tenacityStack < 0) { if(newStack >= 0) + { TeamCastSpell(TEAM_HORDE, -SPELL_TENACITY); + VehicleCastSpell(TEAM_HORDE, -SPELL_TENACITY_VEHICLE); + } } m_tenacityStack = newStack; @@ -380,11 +422,24 @@ void OPvPWintergrasp::UpdateTenacityStack() if(newStack) { TeamId team = newStack > 0 ? TEAM_ALLIANCE : TEAM_HORDE; + if(newStack < 0) newStack = -newStack; for(PlayerSet::iterator itr = m_players[team].begin(); itr != m_players[team].end(); ++itr) (*itr)->SetAuraStack(SPELL_TENACITY, *itr, newStack); + for(VehicleSet::iterator itr = m_vehicles[team].begin(); itr != m_vehicles[team].end(); ++itr) + (*itr)->SetAuraStack(SPELL_TENACITY_VEHICLE, *itr, newStack); } } +void OPvPWintergrasp::VehicleCastSpell(TeamId team, int32 spellId) +{ + if(spellId > 0) + for(VehicleSet::iterator itr = m_vehicles[team].begin(); itr != m_vehicles[team].end(); ++itr) + (*itr)->CastSpell(*itr, (uint32)spellId, true); + else + for(VehicleSet::iterator itr = m_vehicles[team].begin(); itr != m_vehicles[team].end(); ++itr) + (*itr)->RemoveAura((uint32)-spellId); // by stack? +} + bool OPvPWintergrasp::Update(uint32 diff) { if(m_timer > diff) @@ -393,8 +448,6 @@ bool OPvPWintergrasp::Update(uint32 diff) { if(m_wartime) { - m_wartime = false; - m_timer = sWorld.getConfig(CONFIG_OUTDOORPVP_WINTERGRASP_INTERVAL) * MINUTE * IN_MILISECONDS; if(m_defender == TEAM_ALLIANCE) sWorld.SendZoneText(ZONE_WINTERGRASP, "Alliance has successfully defended the fortress!"); else @@ -404,8 +457,6 @@ bool OPvPWintergrasp::Update(uint32 diff) } else { - m_wartime = true; - m_timer = sWorld.getConfig(CONFIG_OUTDOORPVP_WINTERGRASP_BATTLE_TIME) * MINUTE * IN_MILISECONDS; sWorld.SendZoneText(ZONE_WINTERGRASP, "Battle begins!"); UpdateAllWorldObject(); StartBattle(); @@ -416,9 +467,6 @@ bool OPvPWintergrasp::Update(uint32 diff) void OPvPWintergrasp::ChangeDefender() { - m_wartime = false; - m_timer = sWorld.getConfig(CONFIG_OUTDOORPVP_WINTERGRASP_INTERVAL) * MINUTE * IN_MILISECONDS; - m_defender = OTHER_TEAM(m_defender); if(m_defender == TEAM_ALLIANCE) sWorld.SendZoneText(ZONE_WINTERGRASP, "Alliance has taken over the fortress!"); @@ -440,6 +488,9 @@ void OPvPWintergrasp::GiveReward() void OPvPWintergrasp::StartBattle() { + m_wartime = true; + m_timer = sWorld.getConfig(CONFIG_OUTDOORPVP_WINTERGRASP_BATTLE_TIME) * MINUTE * IN_MILISECONDS; + for(uint32 team = 0; team < 2; ++team) { for(PlayerSet::iterator itr = m_players[team].begin(); itr != m_players[team].end(); ++itr) @@ -454,8 +505,13 @@ void OPvPWintergrasp::StartBattle() void OPvPWintergrasp::EndBattle() { + m_wartime = false; + m_timer = sWorld.getConfig(CONFIG_OUTDOORPVP_WINTERGRASP_INTERVAL) * MINUTE * IN_MILISECONDS; + for(uint32 team = 0; team < 2; ++team) { + VehicleCastSpell(TeamId(team), SPELL_SHUTDOWN_VEHICLE); + for(PlayerSet::iterator itr = m_players[team].begin(); itr != m_players[team].end(); ++itr) { (*itr)->RemoveAura(SPELL_RECRUIT); diff --git a/src/game/Wintergrasp.h b/src/game/Wintergrasp.h index e98201ea04c..11f9865f72b 100644 --- a/src/game/Wintergrasp.h +++ b/src/game/Wintergrasp.h @@ -38,13 +38,13 @@ const uint32 WintergraspFaction[2] = {1732, 1735}; #define SPELL_VICTORY_REWARD 56902 #define SPELL_DEFEAT_REWARD 58494 +#define SPELL_SHUTDOWN_VEHICLE 21247 + const uint32 WG_KEEP_CM = 0; //Need data const uint32 WG_RULERS_BUFF = 52108; //some cosmetics :D const uint32 WG_VICTORY_AURA = 60044; -const uint32 WG_SHUTDOWN_CAST = 21247; - enum OutdoorPvP_WG_Sounds { /*TODO OutdoorPvP_WG_SOUND_KEEP_CLAIMED = 8192, @@ -107,6 +107,7 @@ class OPvPWintergrasp : public OutdoorPvP protected: typedef std::map<uint32, BuildingState *> BuildingStateMap; typedef std::set<Creature*> CreatureSet; + typedef std::set<Vehicle*> VehicleSet; typedef std::set<GameObject*> GameObjectSet; public: explicit OPvPWintergrasp() : m_tenacityStack(0) {} @@ -134,6 +135,7 @@ class OPvPWintergrasp : public OutdoorPvP BuildingStateMap m_buildingStates; CreatureSet m_creatures; + VehicleSet m_vehicles[2]; GameObjectSet m_gobjects; TeamPairMap m_creEntryPair, m_goDisplayPair; @@ -152,6 +154,8 @@ class OPvPWintergrasp : public OutdoorPvP void StartBattle(); void EndBattle(); void GiveReward(); + + void VehicleCastSpell(TeamId team, int32 spellId); }; #endif |