aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/bindings/scripts/scripts/zone/wintergrasp/wintergrasp.cpp6
-rw-r--r--src/game/SpellEffects.cpp3
-rw-r--r--src/game/Vehicle.cpp5
-rw-r--r--src/game/Wintergrasp.cpp72
-rw-r--r--src/game/Wintergrasp.h8
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