aboutsummaryrefslogtreecommitdiff
path: root/src/game/Wintergrasp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/Wintergrasp.cpp')
-rw-r--r--src/game/Wintergrasp.cpp119
1 files changed, 86 insertions, 33 deletions
diff --git a/src/game/Wintergrasp.cpp b/src/game/Wintergrasp.cpp
index 42f5e6f4e2f..37ff0f6607f 100644
--- a/src/game/Wintergrasp.cpp
+++ b/src/game/Wintergrasp.cpp
@@ -84,6 +84,7 @@ bool OPvPWintergrasp::SetupOutdoorPvP()
m_workshopCount[TEAM_ALLIANCE] = 0;
m_workshopCount[TEAM_HORDE] = 0;
m_towerCount = 3;
+ m_towerDamagedCount = 0;
// Select POI
AreaPOIList areaPOIs;
@@ -321,16 +322,7 @@ void OPvPWintergrasp::ProcessEvent(GameObject *obj, uint32 eventId)
state->damageState = DAMAGE_DAMAGED;
if (state->type == BUILDING_TOWER)
- {
- if (sWorld.getConfig(CONFIG_OUTDOORPVP_WINTERGRASP_CUSTOM_HONOR))
- {
- for (PlayerSet::const_iterator itr = m_players[m_defender].begin(); itr != m_players[m_defender].end(); ++itr)
- if ((*itr)->HasAura(SPELL_LIEUTENANT) && ((*itr)->getLevel() > 69))
- (*itr)->ModifyHonorPoints(m_customHonorReward[DAMAGED_TOWER]);
- }
- else
- LieutenantCastSpell(m_defender, SPELL_DAMAGED_TOWER);
- }
+ ++m_towerDamagedCount;
}
else if (eventId == obj->GetGOInfo()->building.destroyedEvent)
{
@@ -339,20 +331,13 @@ void OPvPWintergrasp::ProcessEvent(GameObject *obj, uint32 eventId)
if (state->type == BUILDING_WORKSHOP)
ModifyWorkshopCount(state->GetTeam(), false);
else if (state->type == BUILDING_TOWER)
- {
if (!m_towerCount)
sLog.outError("OPvPWintergrasp::ProcessEvent: negative tower count!");
else
{
--m_towerCount;
- if (sWorld.getConfig(CONFIG_OUTDOORPVP_WINTERGRASP_CUSTOM_HONOR))
- for (PlayerSet::const_iterator itr = m_players[m_defender].begin(); itr != m_players[m_defender].end(); ++itr)
- if ((*itr)->HasAura(SPELL_LIEUTENANT) && ((*itr)->getLevel() > 69))
- (*itr)->ModifyHonorPoints(m_customHonorReward[DESTROYED_TOWER]);
- else
- LieutenantCastSpell(m_defender, SPELL_DESTROYED_TOWER);
+ --m_towerDamagedCount;
}
- }
}
BroadcastStateChange(state);
}
@@ -493,7 +478,9 @@ void OPvPWintergrasp::OnCreatureCreate(Creature *creature, bool add)
}
break;
case CREATURE_TURRET:
- creature->setFaction(WintergraspFaction[m_defender]);
+ if (add) m_turrets.insert(creature);
+ else m_turrets.erase(creature);
+ UpdateCreatureInfo(creature);
break;
default:
if (m_creEntryPair.find(entry) != m_creEntryPair.end()) // guards and npc
@@ -542,6 +529,8 @@ void OPvPWintergrasp::UpdateAllWorldObject()
UpdateGameObjectInfo(*itr);
for (CreatureSet::iterator itr = m_creatures.begin(); itr != m_creatures.end(); ++itr)
UpdateCreatureInfo(*itr);
+ for (CreatureSet::iterator itr = m_turrets.begin(); itr != m_turrets.end(); ++itr)
+ UpdateCreatureInfo(*itr);
// rebuild and update building states
RebuildAllBuildings();
@@ -615,14 +604,24 @@ void OPvPWintergrasp::BroadcastStateChange(BuildingState *state) const
state->SendUpdate(*p_itr);
}
+// Called at Start and Battle End
bool OPvPWintergrasp::UpdateCreatureInfo(Creature *creature) const
{
if (GetCreatureType(creature->GetEntry()) == CREATURE_TURRET)
{
if (!creature->isAlive())
- creature->Respawn(true);
- creature->setFaction(WintergraspFaction[m_defender]);
- return true;
+ creature->Respawn(true);
+ if (m_wartime)
+ {
+ creature->SetVisibility(VISIBILITY_ON);
+ creature->setFaction(WintergraspFaction[m_defender]);
+ }
+ else
+ {
+ creature->SetVisibility(VISIBILITY_OFF);
+ creature->setFaction(35);
+ }
+ return false;
}
TeamPairMap::const_iterator itr = m_creEntryPair.find(creature->GetCreatureData()->id);
@@ -953,25 +952,42 @@ void OPvPWintergrasp::EndBattle()
veh->setDeathState(JUST_DIED);
}
+ if (m_players[team].empty())
+ continue;
+
// 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->GetTeam() == team)
if (workshop->m_buildingState->damageState == DAMAGE_DAMAGED)
++damagedNum;
else if (workshop->m_buildingState->damageState == DAMAGE_INTACT)
++intactNum;
- }
- // give rewards
- uint32 honor = ( team == m_defender ? m_customHonorReward[WIN_BATTLE] : m_customHonorReward[LOSE_BATTLE] );
- for (uint32 i = 0; i < intactNum; ++i)
- honor += m_customHonorReward[INTACT_BUILDING];
- for (uint32 i = 0; i < damagedNum; ++i)
- honor += m_customHonorReward[DAMAGED_BUILDING];
+ uint32 spellRewardId = (team == m_defender) ? SPELL_VICTORY_REWARD : SPELL_DEFEAT_REWARD;
+ int32 honor;
+ uint32 marks;
+
+ if (sWorld.getConfig(CONFIG_OUTDOORPVP_WINTERGRASP_CUSTOM_HONOR))
+ {
+ if (team == m_defender)
+ {
+ honor = m_customHonorReward[WIN_BATTLE];
+ marks = m_customHonorReward[WIN_BATTLE_MARKS];
+ honor += (m_customHonorReward[DAMAGED_TOWER] * m_towerDamagedCount);
+ honor += (m_customHonorReward[DESTROYED_TOWER] * (3 - m_towerCount));
+ }
+ else
+ {
+ honor = m_customHonorReward[LOSE_BATTLE];
+ marks = m_customHonorReward[LOSE_BATTLE_MARKS];;
+ }
+ honor += (m_customHonorReward[INTACT_BUILDING] * intactNum);
+ honor += (m_customHonorReward[DAMAGED_BUILDING] * damagedNum);
+ honor = int32(honor / m_players[team].size());
+ }
for (PlayerSet::iterator itr = m_players[team].begin(); itr != m_players[team].end(); ++itr)
{
@@ -981,18 +997,31 @@ void OPvPWintergrasp::EndBattle()
(*itr)->ResurrectPlayer(1.0f);
ObjectAccessor::Instance().ConvertCorpseForPlayer((*itr)->GetGUID());
}
- if ((*itr)->HasAura(SPELL_LIEUTENANT))
+
+ // give rewards
+ if ((*itr)->HasAura(SPELL_LIEUTENANT) && (*itr)->getLevel() > 69)
{
if (!sWorld.getConfig(CONFIG_OUTDOORPVP_WINTERGRASP_CUSTOM_HONOR))
{
- (*itr)->CastSpell(*itr, team == m_defender ? SPELL_VICTORY_REWARD : SPELL_DEFEAT_REWARD, true);
+ (*itr)->CastSpell(*itr, spellRewardId, 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);
+ if (team == m_defender)
+ {
+ for (uint32 i = 0; i < m_towerDamagedCount; ++i)
+ (*itr)->CastSpell(*itr, SPELL_DAMAGED_TOWER, true);
+ for (uint32 i = 3; i > m_towerCount; --i)
+ (*itr)->CastSpell(*itr, SPELL_DESTROYED_TOWER, true);
+ }
}
- else if (sWorld.getConfig(CONFIG_OUTDOORPVP_WINTERGRASP_CUSTOM_HONOR))
+ else
+ {
(*itr)->ModifyHonorPoints(honor);
+ (*itr)->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, spellRewardId);
+ RewardMarkOfHonor(*itr, marks);
+ }
}
REMOVE_WARTIME_AURAS(*itr);
REMOVE_TENACITY_AURA(*itr);
@@ -1031,6 +1060,30 @@ uint32 OPvPWintergrasp::GetData(uint32 id)
return 0;
}
+void OPvPWintergrasp::RewardMarkOfHonor(Player *plr, uint32 count)
+{
+ // 'Inactive' this aura prevents the player from gaining honor points and battleground tokens
+ if (plr->HasAura(SPELL_AURA_PLAYER_INACTIVE))
+ return;
+
+ ItemPosCountVec dest;
+ uint32 no_space_count = 0;
+ uint8 msg = plr->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, WG_MARK_OF_HONOR, count, &no_space_count);
+
+ if (msg == EQUIP_ERR_ITEM_NOT_FOUND)
+ {
+ sLog.outErrorDb("Wintergrasp reward item (Entry %u) not exist in `item_template`.", WG_MARK_OF_HONOR);
+ return;
+ }
+
+ if (msg != EQUIP_ERR_OK) // convert to possible store amount
+ count -= no_space_count;
+
+ if (count != 0 && !dest.empty()) // can add some
+ if (Item* item = plr->StoreNewItem(dest, WG_MARK_OF_HONOR, true, 0))
+ plr->SendNewItem(item, count, true, false);
+}
+
SiegeWorkshop *OPvPWintergrasp::GetWorkshop(uint32 lowguid) const
{
if (OPvPCapturePoint *cp = GetCapturePoint(lowguid))