diff options
author | megamage <none@none> | 2009-08-21 16:12:30 -0500 |
---|---|---|
committer | megamage <none@none> | 2009-08-21 16:12:30 -0500 |
commit | 054e4cecebeee2f49a895e630611ef31ba793f06 (patch) | |
tree | 2bb157233dff2a0d1ae48cadafd0436005ef8869 /src | |
parent | 7bb18efbbe5bb17887e9127f3a0e2e3ea681fcde (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.cpp | 3 | ||||
-rw-r--r-- | src/game/Wintergrasp.cpp | 64 | ||||
-rw-r--r-- | src/game/Wintergrasp.h | 32 |
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; |