aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormegamage <none@none>2009-08-21 16:12:30 -0500
committermegamage <none@none>2009-08-21 16:12:30 -0500
commit054e4cecebeee2f49a895e630611ef31ba793f06 (patch)
tree2bb157233dff2a0d1ae48cadafd0436005ef8869 /src
parent7bb18efbbe5bb17887e9127f3a0e2e3ea681fcde (diff)
*Wintergrasp: give honor for every captured workshops in the end of the battle.
--HG-- branch : trunk
Diffstat (limited to 'src')
-rw-r--r--src/game/GameObject.cpp3
-rw-r--r--src/game/Wintergrasp.cpp64
-rw-r--r--src/game/Wintergrasp.h32
3 files changed, 78 insertions, 21 deletions
diff --git a/src/game/GameObject.cpp b/src/game/GameObject.cpp
index 7a10843af8c..8ca1b97ae2b 100644
--- a/src/game/GameObject.cpp
+++ b/src/game/GameObject.cpp
@@ -1490,7 +1490,7 @@ void GameObject::TakenDamage(uint32 damage)
SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED);
SetUInt32Value(GAMEOBJECT_DISPLAYID, m_goInfo->building.damagedDisplayId);
- EventInform(m_goInfo->building.intactEvent);
+ EventInform(m_goInfo->building.destroyedEvent);
}
}
}
@@ -1500,6 +1500,7 @@ void GameObject::Rebuild()
RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED + GO_FLAG_DESTROYED);
SetUInt32Value(GAMEOBJECT_DISPLAYID, m_goInfo->displayId);
m_goValue->building.health = m_goInfo->building.intactNumHits + m_goInfo->building.damagedNumHits;
+ EventInform(m_goInfo->building.rebuildingEvent);
}
void GameObject::EventInform(uint32 eventId)
diff --git a/src/game/Wintergrasp.cpp b/src/game/Wintergrasp.cpp
index ea79c7f47b7..161018d1b77 100644
--- a/src/game/Wintergrasp.cpp
+++ b/src/game/Wintergrasp.cpp
@@ -79,6 +79,7 @@ bool OPvPWintergrasp::SetupOutdoorPvP()
m_workshopCount[TEAM_ALLIANCE] = 0;
m_workshopCount[TEAM_HORDE] = 0;
+ m_towerCount = 3;
// Load buildings
AreaPOIList areaPOIs;
@@ -259,22 +260,37 @@ void OPvPWintergrasp::ProcessEvent(GameObject *obj, uint32 eventId)
BuildingStateMap::const_iterator itr = m_buildingStates.find(obj->GetDBTableGUIDLow());
if(itr != m_buildingStates.end())
{
- if(obj->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED))
- itr->second->damageState = DAMAGE_DAMAGED;
- else if(obj->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_DESTROYED)
- && itr->second->damageState != DAMAGE_DESTROYED)
+ BuildingState *state = itr->second;
+ if(eventId == obj->GetGOInfo()->building.damagedEvent)
{
- itr->second->damageState = DAMAGE_DESTROYED;
+ state->damageState = DAMAGE_DAMAGED;
- if(itr->second->type == BUILDING_WORKSHOP)
+ if(state->type == BUILDING_TOWER)
+ LieutenantCastSpell(m_defender, SPELL_DAMAGED_TOWER);
+ }
+ else if(eventId == obj->GetGOInfo()->building.destroyedEvent)
+ {
+ state->damageState = DAMAGE_DESTROYED;
+
+ if(state->type == BUILDING_WORKSHOP)
{
//if(SiegeWorkshop *workshop = GetWorkshop(obj->GetDBTableGUIDLow()))
// workshop->DespawnAllVehicles();
- ModifyWorkshopCount(itr->second->team, false);
+ ModifyWorkshopCount(state->team, false);
+ }
+ else if(state->type == BUILDING_TOWER)
+ {
+ if(!m_towerCount)
+ sLog.outError("OPvPWintergrasp::ProcessEvent: negative tower count!");
+ else
+ {
+ --m_towerCount;
+ LieutenantCastSpell(m_defender, SPELL_DESTROYED_TOWER);
+ }
}
}
- BroadcastStateChange(itr->second);
+ BroadcastStateChange(state);
}
}
}
@@ -457,6 +473,8 @@ void OPvPWintergrasp::RebuildAllBuildings()
itr->second->damageState = DAMAGE_INTACT;
itr->second->team = m_defender == TEAM_ALLIANCE ? OTHER_TEAM(itr->second->defaultTeam) : itr->second->defaultTeam;
}
+
+ m_towerCount = 3;
}
void OPvPWintergrasp::SendInitWorldStatesTo(Player *player) const
@@ -650,6 +668,13 @@ void OPvPWintergrasp::VehicleCastSpell(TeamId team, int32 spellId) const
(*itr)->RemoveAura((uint32)-spellId); // by stack?
}
+void OPvPWintergrasp::LieutenantCastSpell(TeamId team, int32 spellId) const
+{
+ for(PlayerSet::const_iterator itr = m_players[team].begin(); itr != m_players[team].end(); ++itr)
+ if((*itr)->HasAura(SPELL_LIEUTENANT))
+ (*itr)->CastSpell(*itr, (uint32)spellId, true);
+}
+
void OPvPWintergrasp::UpdateClockDigit(uint32 &timer, uint32 digit, uint32 mod)
{
uint32 value = timer%mod;
@@ -743,9 +768,10 @@ void OPvPWintergrasp::EndBattle()
{
m_wartime = false;
m_timer = sWorld.getConfig(CONFIG_OUTDOORPVP_WINTERGRASP_INTERVAL) * MINUTE * IN_MILISECONDS;
-
+
for(uint32 team = 0; team < 2; ++team)
{
+ // destroyed all vehicles
while(!m_vehicles[team].empty())
{
Vehicle *veh = *m_vehicles[team].begin();
@@ -753,10 +779,30 @@ void OPvPWintergrasp::EndBattle()
veh->CastSpell(veh, SPELL_SHUTDOWN_VEHICLE, true);
}
+ // calculate rewards
+ uint32 intactNum = 0;
+ uint32 damagedNum = 0;
+ for(OutdoorPvP::OPvPCapturePointMap::const_iterator itr = m_capturePoints.begin(); itr != m_capturePoints.end(); ++itr)
+ {
+ if(SiegeWorkshop *workshop = dynamic_cast<SiegeWorkshop*>(itr->second))
+ if(workshop->m_buildingState->team == team)
+ if(workshop->m_buildingState->damageState == DAMAGE_DAMAGED)
+ ++damagedNum;
+ else if(workshop->m_buildingState->damageState == DAMAGE_INTACT)
+ ++intactNum;
+ }
+
+ // give rewards
for(PlayerSet::iterator itr = m_players[team].begin(); itr != m_players[team].end(); ++itr)
{
if((*itr)->HasAura(SPELL_LIEUTENANT))
+ {
(*itr)->CastSpell(*itr, team == m_defender ? SPELL_VICTORY_REWARD : SPELL_DEFEAT_REWARD, true);
+ for(uint32 i = 0; i < intactNum; ++i)
+ (*itr)->CastSpell(*itr, SPELL_INTACT_BUILDING, true);
+ for(uint32 i = 0; i < damagedNum; ++i)
+ (*itr)->CastSpell(*itr, SPELL_DAMAGED_BUILDING, true);
+ }
REMOVE_RANK_AURAS(*itr);
}
}
diff --git a/src/game/Wintergrasp.h b/src/game/Wintergrasp.h
index be8c8cdda22..a6b0cc85911 100644
--- a/src/game/Wintergrasp.h
+++ b/src/game/Wintergrasp.h
@@ -28,17 +28,25 @@ const uint32 WintergraspFaction[2] = {1732, 1735};
#define POS_X_CENTER 4700
-#define SPELL_RECRUIT 37795
-#define SPELL_CORPORAL 33280
-#define SPELL_LIEUTENANT 55629
-
-#define SPELL_TENACITY 58549
-#define SPELL_TENACITY_VEHICLE 59911
-
-#define SPELL_VICTORY_REWARD 56902
-#define SPELL_DEFEAT_REWARD 58494
-
-#define SPELL_SHUTDOWN_VEHICLE 21247
+enum WintergraspSpell
+{
+ SPELL_RECRUIT = 37795,
+ SPELL_CORPORAL = 33280,
+ SPELL_LIEUTENANT = 55629,
+
+ SPELL_TENACITY = 58549,
+ SPELL_TENACITY_VEHICLE = 59911,
+ SPELL_TOWER_CONTROL = 62064,
+
+ SPELL_VICTORY_REWARD = 56902,
+ SPELL_DEFEAT_REWARD = 58494,
+ SPELL_DAMAGED_TOWER = 59135,
+ SPELL_DESTROYED_TOWER = 59136,
+ SPELL_DAMAGED_BUILDING = 59201,
+ SPELL_INTACT_BUILDING = 59203,
+
+ SPELL_SHUTDOWN_VEHICLE = 21247,
+};
#define MAX_VEHICLE_PER_WORKSHOP 4
@@ -172,6 +180,7 @@ class OPvPWintergrasp : public OutdoorPvP
uint32 m_timer;
uint32 m_clock[5];
uint32 m_workshopCount[2];
+ uint32 m_towerCount;
SiegeWorkshop *GetWorkshop(uint32 lowguid) const;
SiegeWorkshop *GetWorkshopByEngGuid(uint32 lowguid) const;
@@ -191,6 +200,7 @@ class OPvPWintergrasp : public OutdoorPvP
void RebuildAllBuildings();
+ void LieutenantCastSpell(TeamId team, int32 spellId) const;
void VehicleCastSpell(TeamId team, int32 spellId) const;
void SendInitWorldStatesTo(Player *player = NULL) const;