diff options
author | maximius <none@none> | 2009-10-18 21:17:09 -0700 |
---|---|---|
committer | maximius <none@none> | 2009-10-18 21:17:09 -0700 |
commit | 14f043bbde1334eb9197ccf5985177e9693ecfc5 (patch) | |
tree | 13e17c0ccc80e78e8556dfd8bbb8403951b7f5dc /src | |
parent | d22768a6b5aa3eae1c58a418425eca08905cd677 (diff) |
*Wintergrasp: Implementation of Spell TowerControl, by Spp
*Wintergrasp: Fix to Wintergrasp Essence, by Spp
*Wintergrasp: Fix to Custom Honor (bad memory access), by Spp
*Wintergrasp: Outside workshops belong to attackers, by Spp
--HG--
branch : trunk
Diffstat (limited to 'src')
-rw-r--r-- | src/game/Wintergrasp.cpp | 75 | ||||
-rw-r--r-- | src/game/Wintergrasp.h | 13 |
2 files changed, 53 insertions, 35 deletions
diff --git a/src/game/Wintergrasp.cpp b/src/game/Wintergrasp.cpp index 52292dcfeb4..34febbbbcad 100644 --- a/src/game/Wintergrasp.cpp +++ b/src/game/Wintergrasp.cpp @@ -78,7 +78,8 @@ void LoadTeamPair(TeamPairMap &pairMap, const TeamPair *pair) } #define REMOVE_WARTIME_AURAS(p) (p)->RemoveAura(SPELL_RECRUIT);\ - (p)->RemoveAura(SPELL_CORPORAL);(p)->RemoveAura(SPELL_LIEUTENANT) + (p)->RemoveAura(SPELL_CORPORAL);(p)->RemoveAura(SPELL_LIEUTENANT);\ + (p)->RemoveAura(SPELL_TOWER_CONTROL);(p)->RemoveAura(SPELL_RULLERS_OF_WG) #define REMOVE_TENACITY_AURA(p) CastTenacity(p, 0) // Visual defines, easier to understand code @@ -308,12 +309,10 @@ bool OPvPWintergrasp::SetupOutdoorPvP() m_wartime = false; m_timer = sWorld.getConfig(CONFIG_OUTDOORPVP_WINTERGRASP_START_TIME) * MINUTE * IN_MILISECONDS; - m_towerCount[getDefenderTeam()][DAMAGE_INTACT] = 4; - m_towerCount[getAttackerTeam()][DAMAGE_INTACT] = 3; - m_towerCount[TEAM_ALLIANCE][DAMAGE_DAMAGED] = 0; - m_towerCount[TEAM_HORDE][DAMAGE_DAMAGED] = 0; - m_towerCount[TEAM_ALLIANCE][DAMAGE_DESTROYED] = 0; - m_towerCount[TEAM_HORDE][DAMAGE_DESTROYED] = 0; + m_towerDamagedCount[TEAM_ALLIANCE] = 0; + m_towerDestroyedCount[TEAM_ALLIANCE] = 0; + m_towerDamagedCount[TEAM_HORDE] = 0; + m_towerDestroyedCount[TEAM_HORDE] = 0; // Load custom rewards if (sWorld.getConfig(CONFIG_OUTDOORPVP_WINTERGRASP_CUSTOM_HONOR)) @@ -353,7 +352,7 @@ void OPvPWintergrasp::ProcessEvent(GameObject *obj, uint32 eventId) state->damageState = DAMAGE_DAMAGED; if (state->type == BUILDING_TOWER) - ++m_towerCount[state->GetTeam()][DAMAGE_DAMAGED]; + ++m_towerDamagedCount[state->GetTeam()]; } else if (eventId == obj->GetGOInfo()->building.destroyedEvent) { @@ -363,8 +362,27 @@ void OPvPWintergrasp::ProcessEvent(GameObject *obj, uint32 eventId) ModifyWorkshopCount(state->GetTeam(), false); else if (state->type == BUILDING_TOWER) { - --m_towerCount[state->GetTeam()][DAMAGE_DAMAGED]; - ++m_towerCount[state->GetTeam()][DAMAGE_DESTROYED]; + --m_towerDamagedCount[state->GetTeam()]; + ++m_towerDestroyedCount[state->GetTeam()]; + if (state->GetTeam() == getAttackerTeam()) + { + TeamCastSpell(getAttackerTeam(), -SPELL_TOWER_CONTROL); + uint32 newStack = 3 -m_towerDestroyedCount[getAttackerTeam()]; + if (newStack > 0) + { + for (PlayerSet::iterator itr = m_players[getAttackerTeam()].begin(); itr != m_players[getAttackerTeam()].end(); ++itr) + if ((*itr)->getLevel() > 69) + (*itr)->SetAuraStack(SPELL_TOWER_CONTROL, (*itr), newStack); + } + else + { + TeamCastSpell(getDefenderTeam(), SPELL_RULLERS_OF_WG); + if (m_timer < 600000) + m_timer = 0; + else + m_timer = m_timer - 600000; // - 10 mins + } + } } } BroadcastStateChange(state); @@ -375,8 +393,9 @@ void OPvPWintergrasp::ProcessEvent(GameObject *obj, uint32 eventId) void OPvPWintergrasp::RemoveOfflinePlayerWGAuras() { // if server crashed while in battle there could be players with rank or tenacity - CharacterDatabase.PExecute("DELETE FROM character_aura WHERE spell IN (%u,%u,%u, %u)", - SPELL_RECRUIT, SPELL_CORPORAL, SPELL_LIEUTENANT, SPELL_TENACITY); + CharacterDatabase.PExecute("DELETE FROM character_aura WHERE spell IN (%u, %u, %u, %u, %u, %u, %u)", + SPELL_RECRUIT, SPELL_CORPORAL, SPELL_LIEUTENANT, SPELL_TENACITY, + SPELL_RULLERS_OF_WG, SPELL_ESSENCE_OF_WG, SPELL_TOWER_CONTROL); } void OPvPWintergrasp::ModifyWorkshopCount(TeamId team, bool add) @@ -604,13 +623,10 @@ void OPvPWintergrasp::RebuildAllBuildings() itr->second->damageState = DAMAGE_INTACT; itr->second->SetTeam(getDefenderTeam() == TEAM_ALLIANCE ? OTHER_TEAM(itr->second->defaultTeam) : itr->second->defaultTeam); } - - m_towerCount[getDefenderTeam()][DAMAGE_INTACT] = 4; - m_towerCount[getAttackerTeam()][DAMAGE_INTACT] = 3; - m_towerCount[TEAM_ALLIANCE][DAMAGE_DAMAGED] = 0; - m_towerCount[TEAM_HORDE][DAMAGE_DAMAGED] = 0; - m_towerCount[TEAM_ALLIANCE][DAMAGE_DESTROYED] = 0; - m_towerCount[TEAM_HORDE][DAMAGE_DESTROYED] = 0; + m_towerDamagedCount[TEAM_ALLIANCE] = 0; + m_towerDestroyedCount[TEAM_ALLIANCE] = 0; + m_towerDamagedCount[TEAM_HORDE] = 0; + m_towerDestroyedCount[TEAM_HORDE] = 0; } void OPvPWintergrasp::SendInitWorldStatesTo(Player *player) const @@ -756,9 +772,7 @@ bool OPvPWintergrasp::UpdateGameObjectInfo(GameObject *go) const void OPvPWintergrasp::HandlePlayerEnterZone(Player * plr, uint32 zone) { if(plr->GetTeamId() == getDefenderTeam() && !isWarTime()) - { plr->CastSpell(plr,SPELL_ESSENCE_OF_WG,true); - } if (isWarTime() && !plr->HasAura(SPELL_RECRUIT) && !plr->HasAura(SPELL_CORPORAL) && !plr->HasAura(SPELL_LIEUTENANT)) @@ -772,8 +786,9 @@ void OPvPWintergrasp::HandlePlayerEnterZone(Player * plr, uint32 zone) // Reapply Tenacity if needed void OPvPWintergrasp::HandlePlayerResurrects(Player * plr, uint32 zone) { - if (isWarTime() && m_tenacityStack && !plr->HasAura(SPELL_TENACITY) && plr->getLevel() > 69 && - (plr->GetTeam() == TEAM_ALLIANCE && m_tenacityStack > 0 || plr->GetTeam() == TEAM_HORDE && m_tenacityStack < 0)) + if (isWarTime() && !plr->HasAura(SPELL_TENACITY) && plr->getLevel() > 69 && + (plr->GetTeamId() == TEAM_ALLIANCE && m_tenacityStack > 0 || + plr->GetTeamId() == TEAM_HORDE && m_tenacityStack < 0)) { int32 newStack = m_tenacityStack < 0 ? -m_tenacityStack : m_tenacityStack; if (newStack > 20) @@ -1042,7 +1057,11 @@ void OPvPWintergrasp::StartBattle() // Add recruit Aura, Add Tenacity TeamCastSpell(getDefenderTeam(), SPELL_RECRUIT); TeamCastSpell(getAttackerTeam(), SPELL_RECRUIT); + for (PlayerSet::iterator itr = m_players[getAttackerTeam()].begin(); itr != m_players[getAttackerTeam()].end(); ++itr) + if ((*itr)->getLevel() > 69) + (*itr)->SetAuraStack(SPELL_TOWER_CONTROL, (*itr), 3); UpdateTenacityStack(); + TeamCastSpell(getDefenderTeam(),-SPELL_ESSENCE_OF_WG); } void OPvPWintergrasp::EndBattle() @@ -1087,8 +1106,8 @@ void OPvPWintergrasp::EndBattle() ++playersWithRankNum; baseHonor = m_customHonorReward[(team == getDefenderTeam()) ? WIN_BATTLE : LOSE_BATTLE]; - baseHonor += (m_customHonorReward[DAMAGED_TOWER] * m_towerCount[OTHER_TEAM(team)][DAMAGED_TOWER]); - baseHonor += (m_customHonorReward[DESTROYED_TOWER] * m_towerCount[OTHER_TEAM(team)][DESTROYED_TOWER]); + baseHonor += (m_customHonorReward[DAMAGED_TOWER] * m_towerDamagedCount[OTHER_TEAM(team)]); + baseHonor += (m_customHonorReward[DESTROYED_TOWER] * m_towerDestroyedCount[OTHER_TEAM(team)]); baseHonor += (m_customHonorReward[INTACT_BUILDING] * intactNum); baseHonor += (m_customHonorReward[DAMAGED_BUILDING] * damagedNum); } @@ -1161,9 +1180,9 @@ void OPvPWintergrasp::EndBattle() (*itr)->CastSpell(*itr, SPELL_INTACT_BUILDING, true); for (uint32 i = 0; i < damagedNum; ++i) (*itr)->CastSpell(*itr, SPELL_DAMAGED_BUILDING, true); - for (uint32 i = 0; i < m_towerCount[OTHER_TEAM(team)][DAMAGE_DAMAGED]; ++i) + for (uint32 i = 0; i < m_towerDamagedCount[OTHER_TEAM(team)]; ++i) (*itr)->CastSpell(*itr, SPELL_DAMAGED_TOWER, true); - for (uint32 i = 0; i < m_towerCount[OTHER_TEAM(team)][DAMAGE_DESTROYED]; ++i) + for (uint32 i = 0; i < m_towerDestroyedCount[OTHER_TEAM(team)]; ++i) (*itr)->CastSpell(*itr, SPELL_DESTROYED_TOWER, true); } if (team == getDefenderTeam()) @@ -1182,7 +1201,7 @@ void OPvPWintergrasp::EndBattle() //3.2.0: TeamCastSpell(getAttackerTeam(), SPELL_TELEPORT_DALARAN); RemoveOfflinePlayerWGAuras(); - TeamCastSpell(getDefenderTeam(),SPELL_ESSENCE_OF_WG); + TeamCastSpell(getDefenderTeam(), SPELL_ESSENCE_OF_WG); } void OPvPWintergrasp::SetData(uint32 id, uint32 value) diff --git a/src/game/Wintergrasp.h b/src/game/Wintergrasp.h index 2d00c14764c..121d8afd0f6 100644 --- a/src/game/Wintergrasp.h +++ b/src/game/Wintergrasp.h @@ -22,7 +22,7 @@ #include "OutdoorPvPImpl.h" #define ZONE_WINTERGRASP 4197 -#define POS_X_CENTER 4700 +#define POS_X_CENTER 5100 #define MAX_VEHICLE_PER_WORKSHOP 4 const uint32 WintergraspFaction[3] = {1732, 1735, 35}; @@ -43,18 +43,16 @@ enum WintergraspSpell SPELL_TELEPORT_DALARAN = 53360, SPELL_TOWER_CONTROL = 62064, + SPELL_RULLERS_OF_WG = 52108, 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_ESSENCE_OF_WG = 58045, - // Unused: Not implemented // SPELL_VICTORY_AURA = 60044, -// SPELL_RULERS_OF_WG = 52108, }; enum WintergraspRewardEvent @@ -117,10 +115,10 @@ enum BuildingType }; enum DamageState -{ +{ // Do not change order DAMAGE_INTACT, DAMAGE_DAMAGED, - DAMAGE_DESTROYED, + DAMAGE_DESTROYED, }; const uint32 AreaPOIIconId[3][3] = {{7,8,9},{4,5,6},{1,2,3}}; @@ -218,7 +216,8 @@ class OPvPWintergrasp : public OutdoorPvP uint32 m_timer; uint32 m_clock[5]; uint32 m_workshopCount[2]; - uint32 m_towerCount[2][2]; + uint32 m_towerDestroyedCount[2]; + uint32 m_towerDamagedCount[2]; uint32 m_customHonorReward[WG_REWARD_EVENT_MAX]; |