diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/game/Chat.cpp | 12 | ||||
-rw-r--r-- | src/game/Chat.h | 7 | ||||
-rw-r--r-- | src/game/Language.h | 21 | ||||
-rw-r--r-- | src/game/Level2.cpp | 134 | ||||
-rw-r--r-- | src/game/Wintergrasp.cpp | 280 | ||||
-rw-r--r-- | src/game/Wintergrasp.h | 8 |
6 files changed, 396 insertions, 66 deletions
diff --git a/src/game/Chat.cpp b/src/game/Chat.cpp index 48ffb073327..93e1e8a85bb 100644 --- a/src/game/Chat.cpp +++ b/src/game/Chat.cpp @@ -603,6 +603,17 @@ ChatCommand * ChatHandler::getCommandTable() { NULL, 0, false, NULL, "", NULL } }; + static ChatCommand wintergraspCommandTable[] = + { + { "status", SEC_ADMINISTRATOR, false, &ChatHandler::HandleWintergraspStatusCommand, "", NULL }, + { "enable", SEC_ADMINISTRATOR, false, &ChatHandler::HandleWintergraspEnableCommand, "", NULL }, + { "start", SEC_ADMINISTRATOR, false, &ChatHandler::HandleWintergraspStartCommand, "", NULL }, + { "stop", SEC_ADMINISTRATOR, false, &ChatHandler::HandleWintergraspStopCommand, "", NULL }, + { "switch", SEC_ADMINISTRATOR, false, &ChatHandler::HandleWintergraspSwitchTeamCommand, "", NULL }, + { "timer", SEC_ADMINISTRATOR, false, &ChatHandler::HandleWintergraspTimerCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } + }; + static ChatCommand wpCommandTable[] = { { "show", SEC_GAMEMASTER, false, &ChatHandler::HandleWpShowCommand, "", NULL }, @@ -730,6 +741,7 @@ ChatCommand * ChatHandler::getCommandTable() { "bindsight", SEC_ADMINISTRATOR, false, &ChatHandler::HandleBindSightCommand, "", NULL }, { "unbindsight", SEC_ADMINISTRATOR, false, &ChatHandler::HandleUnbindSightCommand, "", NULL }, { "playall", SEC_ADMINISTRATOR, false, &ChatHandler::HandlePlayAllCommand, "", NULL }, + { "wg", SEC_ADMINISTRATOR, false, NULL, "", wintergraspCommandTable }, { NULL, 0, false, NULL, "", NULL } }; diff --git a/src/game/Chat.h b/src/game/Chat.h index 70a3c4149f9..820fa5771a7 100644 --- a/src/game/Chat.h +++ b/src/game/Chat.h @@ -468,6 +468,13 @@ class TRINITY_DLL_SPEC ChatHandler bool HandleWpShowCommand(const char* args); bool HandleReloadAllPaths(const char *args); + bool HandleWintergraspStatusCommand(const char *args); + bool HandleWintergraspStartCommand(const char *args); + bool HandleWintergraspStopCommand(const char *args); + bool HandleWintergraspEnableCommand(const char *args); + bool HandleWintergraspSwitchTeamCommand(const char *args); + bool HandleWintergraspTimerCommand(const char *args); + bool HandleHelpCommand(const char* args); bool HandleCommandsCommand(const char* args); bool HandleStartCommand(const char* args); diff --git a/src/game/Language.h b/src/game/Language.h index 432b456f1e1..0a4b2b1f383 100644 --- a/src/game/Language.h +++ b/src/game/Language.h @@ -693,9 +693,26 @@ enum TrinityStrings // LANG_BG_WS_START_TWO_MINUTES = 753, - defined above // LANG_BG_AB_START_TWO_MINUTES = 754, - defined above // LANG_BG_EY_START_TWO_MINUTES = 755, - defined above - // Room for batleground/arena strings 756-799 not used - // Room for BG/ARENA 751-769 not used + LANG_BG_WG_BATTLE_STARTS = 756, + LANG_BG_WG_DEFENDED = 757, + LANG_BG_WG_CAPTURED = 758, + LANG_BG_WG_WORKSHOP_DAMAGED = 759, + LANG_BG_WG_WORKSHOP_DESTROYED = 760, + LANG_BG_WG_TOWER_DAMAGED = 761, + LANG_BG_WG_TOWER_DESTROYED = 762, + LANG_BG_WG_FORTRESS_UNDER_ATTACK = 763, + LANG_BG_WG_SWITCH_FACTION = 764, + LANG_BG_WG_CHANGE_TIMER = 765, + LANG_BG_WG_BATTLE_FORCE_START = 766, + LANG_BG_WG_BATTLE_FORCE_STOP = 767, + LANG_BG_WG_STATUS = 768, + LANG_BG_WG_DISABLE = 769, + LANG_BG_WG_ENABLE = 770, + LANG_BG_WG_RANK1 = 771, + LANG_BG_WG_RANK2 = 772, + + // Room for BG/ARENA = 773-784, 788-799 not used LANG_ARENA_TESTING = 785, LANG_AUTO_ANN = 786, LANG_ANNOUNCE_COLOR = 787, diff --git a/src/game/Level2.cpp b/src/game/Level2.cpp index 2a82fc3cb97..c64f56c9c86 100644 --- a/src/game/Level2.cpp +++ b/src/game/Level2.cpp @@ -40,6 +40,8 @@ #include <fstream> #include <map> #include "GlobalEvents.h" +#include "Wintergrasp.h" +#include "OutdoorPvPMgr.h" #include "TargetedMovementGenerator.h" // for HandleNpcUnFollowCommand #include "CreatureGroups.h" @@ -4235,3 +4237,135 @@ bool ChatHandler::HandleNpcSetLinkCommand(const char* args) PSendSysMessage("LinkGUID '%u' added to creature with DBTableGUID: '%u'", linkguid, pCreature->GetDBTableGUIDLow()); return true; } + +bool ChatHandler::HandleWintergraspStatusCommand(const char* args) +{ + if(!*args) + return false; + + OPvPWintergrasp *pvpWG = (OPvPWintergrasp*)sOutdoorPvPMgr.GetOutdoorPvPToZoneId(4197); + + if (!pvpWG || !sWorld.getConfig(CONFIG_OUTDOORPVP_WINTERGRASP_ENABLED)) + { + SendSysMessage(LANG_BG_WG_DISABLE); + SetSentErrorMessage(true); + return false; + } + + PSendSysMessage(LANG_BG_WG_STATUS, pvpWG->GetTeam() ? "Horde" : "Alliance", secsToTimeString(pvpWG->GetTimer(), true), pvpWG->isWarTime() ? "Yes" : "No"); + return true; +} + +bool ChatHandler::HandleWintergraspStartCommand(const char* args) +{ + OPvPWintergrasp *pvpWG = (OPvPWintergrasp*)sOutdoorPvPMgr.GetOutdoorPvPToZoneId(4197); + + if (!pvpWG || !sWorld.getConfig(CONFIG_OUTDOORPVP_WINTERGRASP_ENABLED)) + { + SendSysMessage(LANG_BG_WG_DISABLE); + SetSentErrorMessage(true); + return false; + } + pvpWG->forceStartBattle(); + PSendSysMessage(LANG_BG_WG_BATTLE_FORCE_START); + return true; +} + +bool ChatHandler::HandleWintergraspStopCommand(const char* args) +{ + OPvPWintergrasp *pvpWG = (OPvPWintergrasp*)sOutdoorPvPMgr.GetOutdoorPvPToZoneId(4197); + + if (!pvpWG || !sWorld.getConfig(CONFIG_OUTDOORPVP_WINTERGRASP_ENABLED)) + { + SendSysMessage(LANG_BG_WG_DISABLE); + SetSentErrorMessage(true); + return false; + } + pvpWG->forceStopBattle(); + PSendSysMessage(LANG_BG_WG_BATTLE_FORCE_STOP); + return true; +} + +bool ChatHandler::HandleWintergraspEnableCommand(const char* args) +{ + if(!*args) + return false; + + OPvPWintergrasp *pvpWG = (OPvPWintergrasp*)sOutdoorPvPMgr.GetOutdoorPvPToZoneId(4197); + + if (!pvpWG || !sWorld.getConfig(CONFIG_OUTDOORPVP_WINTERGRASP_ENABLED)) + { + SendSysMessage(LANG_BG_WG_DISABLE); + SetSentErrorMessage(true); + return false; + } + + if (!strncmp(args, "on", 3)) + { + if (!sWorld.getConfig(CONFIG_OUTDOORPVP_WINTERGRASP_ENABLED)) + { + pvpWG->forceStopBattle(); + sWorld.setConfig(CONFIG_OUTDOORPVP_WINTERGRASP_ENABLED, true); + } + PSendSysMessage(LANG_BG_WG_ENABLE); + return true; + } + else if (!strncmp(args, "off", 4)) + { + if (sWorld.getConfig(CONFIG_OUTDOORPVP_WINTERGRASP_ENABLED)) + { + pvpWG->forceStopBattle(); + sWorld.setConfig(CONFIG_OUTDOORPVP_WINTERGRASP_ENABLED, false); + } + PSendSysMessage(LANG_BG_WG_DISABLE); + return true; + } + else + { + SendSysMessage(LANG_USE_BOL); + SetSentErrorMessage(true); + return false; + } +} + +bool ChatHandler::HandleWintergraspTimerCommand(const char* args) +{ + if(!*args) + return false; + + OPvPWintergrasp *pvpWG = (OPvPWintergrasp*)sOutdoorPvPMgr.GetOutdoorPvPToZoneId(4197); + + if (!pvpWG) + { + SendSysMessage(LANG_BG_WG_DISABLE); + SetSentErrorMessage(true); + return false; + } + + int32 time = atoi (args); + + if (time <= 0 || time > 60) + return false; + else + time *= MINUTE * IN_MILISECONDS; + + pvpWG->setTimer((uint32)time); + + PSendSysMessage(LANG_BG_WG_CHANGE_TIMER, secsToTimeString(pvpWG->GetTimer(), true).c_str()); + return true; +} + +bool ChatHandler::HandleWintergraspSwitchTeamCommand(const char* args) +{ + OPvPWintergrasp *pvpWG = (OPvPWintergrasp*)sOutdoorPvPMgr.GetOutdoorPvPToZoneId(4197); + + if (!pvpWG) + { + SendSysMessage(LANG_BG_WG_DISABLE); + SetSentErrorMessage(true); + return false; + } + pvpWG->forceChangeTeam(); + PSendSysMessage(LANG_BG_WG_SWITCH_FACTION, GetTrinityString(pvpWG->GetTeam() == TEAM_ALLIANCE ? LANG_BG_AB_ALLY : LANG_BG_AB_HORDE)); + return true; +} diff --git a/src/game/Wintergrasp.cpp b/src/game/Wintergrasp.cpp index 1226e294b90..65fa5dccada 100644 --- a/src/game/Wintergrasp.cpp +++ b/src/game/Wintergrasp.cpp @@ -21,6 +21,7 @@ #include "Vehicle.h" #include "ObjectMgr.h" #include "World.h" +#include "Chat.h" typedef uint32 TeamPair[2]; @@ -407,24 +408,90 @@ void OPvPWintergrasp::ProcessEvent(GameObject *obj, uint32 eventId) else if (obj->GetGoType() == GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING) { BuildingStateMap::const_iterator itr = m_buildingStates.find(obj->GetDBTableGUIDLow()); - if (itr != m_buildingStates.end()) + if (itr == m_buildingStates.end()) + return; + + std::string msgStr; + switch(eventId) + { // TODO - Localized msgs of GO names + case 19672: case 19675: // Flamewatch Tower + msgStr = "Flamewatch"; + break; + case 18553: case 19677: // Shadowsight Tower + msgStr = "Shadowsight"; + break; + case 19673: case 19676: // Winter's Edge Tower + msgStr = "Winter's Edge"; + break; + case 19776: case 19778: // E Workshop damaged + msgStr = "Sunken Ring"; + break; + case 19777: case 19779: // W Workshop damaged + msgStr = "Broken Temple"; + break; + case 19782: case 19786: // NW Workshop damaged + msgStr = "north-western"; + break; + case 19783: case 19787: // NE Workshop damaged + msgStr = "north-eastern"; + break; + case 19784: case 19788: // SW Workshop damaged + msgStr = "Westpark"; + break; + case 19785: case 19789: // SE Workshop damaged + msgStr = "Eastpark"; + break; + case 19657: case 19661: // NW Wintergrasp Keep Tower damaged + msgStr = "north-western"; + break; + case 19658: case 19663: // NE Wintergrasp Keep Tower damaged + msgStr = "north-eastern"; + break; + case 19659: case 19662: // SW Wintergrasp Keep Tower damaged + msgStr = "south-western"; + break; + case 19660: case 19664: // SE Wintergrasp Keep Tower damaged + msgStr = "south-eastern"; + break; + default: + msgStr = ""; + } + + BuildingState *state = itr->second; + if (eventId == obj->GetGOInfo()->building.damagedEvent) { - BuildingState *state = itr->second; - if (eventId == obj->GetGOInfo()->building.damagedEvent) + state->damageState = DAMAGE_DAMAGED; + switch(state->type) { - state->damageState = DAMAGE_DAMAGED; - - if (state->type == BUILDING_TOWER) + case BUILDING_WORKSHOP: + msgStr = fmtstring(objmgr.GetTrinityStringForDBCLocale(LANG_BG_WG_WORKSHOP_DAMAGED), msgStr.c_str(), objmgr.GetTrinityStringForDBCLocale(getDefenderTeam() == TEAM_ALLIANCE ? LANG_BG_AB_ALLY : LANG_BG_AB_HORDE)); + sWorld.SendZoneText(ZONE_WINTERGRASP, msgStr.c_str()); + break; + case BUILDING_WALL: + sWorld.SendZoneText(ZONE_WINTERGRASP, objmgr.GetTrinityStringForDBCLocale(LANG_BG_WG_FORTRESS_UNDER_ATTACK)); + break; + case BUILDING_TOWER: ++m_towerDamagedCount[state->GetTeam()]; + msgStr = fmtstring(objmgr.GetTrinityStringForDBCLocale(LANG_BG_WG_TOWER_DAMAGED), msgStr.c_str()); + sWorld.SendZoneText(ZONE_WINTERGRASP, msgStr.c_str()); + break; } - else if (eventId == obj->GetGOInfo()->building.destroyedEvent) - { - state->damageState = DAMAGE_DESTROYED; + } + else if (eventId == obj->GetGOInfo()->building.destroyedEvent) + { + state->damageState = DAMAGE_DESTROYED; - if (state->type == BUILDING_WORKSHOP) + switch(state->type) + { + case BUILDING_WORKSHOP: ModifyWorkshopCount(state->GetTeam(), false); - else if (state->type == BUILDING_TOWER) - { + msgStr = fmtstring(objmgr.GetTrinityStringForDBCLocale(LANG_BG_WG_WORKSHOP_DESTROYED), msgStr.c_str(), objmgr.GetTrinityStringForDBCLocale(getDefenderTeam() == TEAM_ALLIANCE ? LANG_BG_AB_ALLY : LANG_BG_AB_HORDE)); + sWorld.SendZoneText(ZONE_WINTERGRASP, msgStr.c_str()); + break; + case BUILDING_WALL: + sWorld.SendZoneText(ZONE_WINTERGRASP, objmgr.GetTrinityStringForDBCLocale(LANG_BG_WG_FORTRESS_UNDER_ATTACK)); + break; + case BUILDING_TOWER: --m_towerDamagedCount[state->GetTeam()]; ++m_towerDestroyedCount[state->GetTeam()]; if (state->GetTeam() == getAttackerTeam()) @@ -454,7 +521,9 @@ void OPvPWintergrasp::ProcessEvent(GameObject *obj, uint32 eventId) m_timer = m_timer - 600000; // - 10 mins } } - } + msgStr = fmtstring(objmgr.GetTrinityStringForDBCLocale(LANG_BG_WG_TOWER_DESTROYED), msgStr.c_str()); + sWorld.SendZoneText(ZONE_WINTERGRASP, msgStr.c_str()); + break; } BroadcastStateChange(state); } @@ -877,14 +946,33 @@ bool OPvPWintergrasp::UpdateGameObjectInfo(GameObject *go) const void OPvPWintergrasp::HandlePlayerEnterZone(Player * plr, uint32 zone) { + if (!sWorld.getConfig(CONFIG_OUTDOORPVP_WINTERGRASP_ENABLED)) + return; + if (!isWarTime()) { if (plr->GetTeamId() == getDefenderTeam()) plr->CastSpell(plr,SPELL_ESSENCE_OF_WG, true); } - else if (!plr->HasAura(SPELL_RECRUIT) && !plr->HasAura(SPELL_CORPORAL) - && !plr->HasAura(SPELL_LIEUTENANT)) - plr->CastSpell(plr, SPELL_RECRUIT, true); + else + { + if (plr->getLevel() > 69) + { + if (!plr->HasAura(SPELL_RECRUIT) && !plr->HasAura(SPELL_CORPORAL) + && !plr->HasAura(SPELL_LIEUTENANT)) + plr->CastSpell(plr, SPELL_RECRUIT, true); + if (plr->GetTeamId() == getAttackerTeam()) + { + if (m_towerDestroyedCount[getAttackerTeam()] < 3) + plr->SetAuraStack(SPELL_TOWER_CONTROL, plr, 3 - m_towerDestroyedCount[getAttackerTeam()]); + } + else + { + if (m_towerDestroyedCount[getAttackerTeam()]) + plr->SetAuraStack(SPELL_TOWER_CONTROL, plr, m_towerDestroyedCount[getAttackerTeam()]); + } + } + } SendInitWorldStatesTo(plr); OutdoorPvP::HandlePlayerEnterZone(plr, zone); @@ -894,6 +982,9 @@ void OPvPWintergrasp::HandlePlayerEnterZone(Player * plr, uint32 zone) // Reapply Auras if needed void OPvPWintergrasp::HandlePlayerResurrects(Player * plr, uint32 zone) { + if (!sWorld.getConfig(CONFIG_OUTDOORPVP_WINTERGRASP_ENABLED)) + return; + if (isWarTime()) { if (plr->getLevel() > 69) @@ -923,18 +1014,14 @@ void OPvPWintergrasp::HandlePlayerResurrects(Player * plr, uint32 zone) } } } - /* Essence is not removed in ghost form so no need to reapply - else // Essence of Wintergrasp - { - if (plr->GetTeamId() == getDefenderTeam()) - plr->CastSpell(plr, SPELL_ESSENCE_OF_WG, true); - } - */ OutdoorPvP::HandlePlayerResurrects(plr, zone); } void OPvPWintergrasp::HandlePlayerLeaveZone(Player * plr, uint32 zone) { + if (!sWorld.getConfig(CONFIG_OUTDOORPVP_WINTERGRASP_ENABLED)) + return; + if (!plr->GetSession()->PlayerLogout()) { if (plr->GetVehicle()) // dismiss in change zone case @@ -956,6 +1043,7 @@ void OPvPWintergrasp::PromotePlayer(Player *killer) const { killer->RemoveAura(SPELL_RECRUIT); killer->CastSpell(killer, SPELL_CORPORAL, true); + ChatHandler(killer).PSendSysMessage(LANG_BG_WG_RANK1); } else killer->CastSpell(killer, SPELL_RECRUIT, true); @@ -966,16 +1054,18 @@ void OPvPWintergrasp::PromotePlayer(Player *killer) const { killer->RemoveAura(SPELL_CORPORAL); killer->CastSpell(killer, SPELL_LIEUTENANT, true); + ChatHandler(killer).PSendSysMessage(LANG_BG_WG_RANK2); } else killer->CastSpell(killer, SPELL_CORPORAL, true); } - else if (killer->HasAura(SPELL_LIEUTENANT)) - killer->CastSpell(killer, SPELL_LIEUTENANT, true); } void OPvPWintergrasp::HandleKill(Player *killer, Unit *victim) { + if (!sWorld.getConfig(CONFIG_OUTDOORPVP_WINTERGRASP_ENABLED) || !isWarTime()) + return; + bool ok = false; if (victim->GetTypeId() == TYPEID_PLAYER) { @@ -1191,31 +1281,25 @@ bool OPvPWintergrasp::Update(uint32 diff) else { m_sendUpdate = false; + int32 entry = LANG_BG_WG_DEFENDED; - if (isWarTime()) + if (m_changeDefender) { - if (m_changeDefender) - { - m_changeDefender = false; - m_defender = getAttackerTeam(); - if (getDefenderTeam() == TEAM_ALLIANCE) - sWorld.SendZoneText(ZONE_WINTERGRASP, "Alliance has taken over the fortress!"); - else - sWorld.SendZoneText(ZONE_WINTERGRASP, "Horde has taken over the fortress!"); - } - else - { - if (getDefenderTeam() == TEAM_ALLIANCE) - sWorld.SendZoneText(ZONE_WINTERGRASP, "Alliance has successfully defended the fortress!"); - else - sWorld.SendZoneText(ZONE_WINTERGRASP, "Horde has successfully defended the fortress!"); - } + m_changeDefender = false; + m_defender = getAttackerTeam(); + entry = LANG_BG_WG_CAPTURED; + } + if (isWarTime()) + { + if (m_timer != 1) // 1 = forceStopBattle + sWorld.SendZoneText(ZONE_WINTERGRASP, fmtstring(objmgr.GetTrinityStringForDBCLocale(entry), objmgr.GetTrinityStringForDBCLocale(getDefenderTeam() == TEAM_ALLIANCE ? LANG_BG_AB_ALLY : LANG_BG_AB_HORDE))); EndBattle(); } else { - sWorld.SendZoneText(ZONE_WINTERGRASP, "Battle begins!"); + if (m_timer != 1) // 1 = forceStartBattle + sWorld.SendZoneText(ZONE_WINTERGRASP, objmgr.GetTrinityStringForDBCLocale(LANG_BG_WG_BATTLE_STARTS)); StartBattle(); } @@ -1229,28 +1313,86 @@ bool OPvPWintergrasp::Update(uint32 diff) return false; } +void OPvPWintergrasp::forceStartBattle() +{ // Uptime will do all the work + m_wartime = false; + + if (m_timer != 1) + { + m_timer = 1; + sWorld.SendZoneText(ZONE_WINTERGRASP, objmgr.GetTrinityStringForDBCLocale(LANG_BG_WG_BATTLE_FORCE_START)); + } +} + +void OPvPWintergrasp::forceStopBattle() +{ // Uptime will do all the work. + + if (!isWarTime()) + { + m_wartime = true; + if (m_changeDefender) + TeamCastSpell(getDefenderTeam(), -SPELL_ESSENCE_OF_WG); + } + + if (m_timer != 1) + { + m_timer = 1; + sWorld.SendZoneText(ZONE_WINTERGRASP, objmgr.GetTrinityStringForDBCLocale(LANG_BG_WG_BATTLE_FORCE_STOP)); + } +} + +void OPvPWintergrasp::forceChangeTeam() +{ + m_changeDefender = true; + m_timer = 1; + sWorld.SendZoneText(ZONE_WINTERGRASP, fmtstring(objmgr.GetTrinityStringForDBCLocale(LANG_BG_WG_SWITCH_FACTION), objmgr.GetTrinityStringForDBCLocale(getAttackerTeam() == TEAM_ALLIANCE ? LANG_BG_AB_ALLY : LANG_BG_AB_HORDE))); + if (isWarTime()) + forceStartBattle(); + else + forceStopBattle(); +} + +// Can be forced by gm's while in battle so have to reset in case it was wartime void OPvPWintergrasp::StartBattle() { m_wartime = true; m_timer = sWorld.getConfig(CONFIG_OUTDOORPVP_WINTERGRASP_BATTLE_TIME) * MINUTE * IN_MILISECONDS; - // Add recruit Aura, Add Tenacity - TeamCastSpell(getDefenderTeam(), SPELL_RECRUIT); - TeamCastSpell(getAttackerTeam(), SPELL_RECRUIT); - // Add Towert Control to attackers + // destroyed all vehicles + for (uint32 team = 0; team < 2; ++team) + { + while(!m_vehicles[team].empty()) + { + Creature *veh = *m_vehicles[team].begin(); + m_vehicles[team].erase(m_vehicles[team].begin()); + veh->setDeathState(JUST_DIED); + } + } + + // Remove All Wintergrasp auras. Add Recruit rank and Tower Control for (PlayerSet::iterator itr = m_players[getAttackerTeam()].begin(); itr != m_players[getAttackerTeam()].end(); ++itr) + { + REMOVE_WARTIME_AURAS(*itr); if ((*itr)->getLevel() > 69) + { (*itr)->SetAuraStack(SPELL_TOWER_CONTROL, (*itr), 3); + (*itr)->CastSpell(*itr, SPELL_RECRUIT, true); + } + } + + // Remove All Wintergrasp auras. Add Recruit rank + for (PlayerSet::iterator itr = m_players[getDefenderTeam()].begin(); itr != m_players[getDefenderTeam()].end(); ++itr) + { + REMOVE_WARTIME_AURAS(*itr); + (*itr)->RemoveAura(SPELL_ESSENCE_OF_WG); + if ((*itr)->getLevel() > 69) + (*itr)->CastSpell(*itr, SPELL_RECRUIT, true); + } UpdateTenacityStack(); - // Remove non wartime auras - TeamCastSpell(getDefenderTeam(),-SPELL_ESSENCE_OF_WG); } 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 @@ -1264,6 +1406,23 @@ void OPvPWintergrasp::EndBattle() if (m_players[team].empty()) continue; + for (PlayerSet::iterator itr = m_players[team].begin(); itr != m_players[team].end(); ++itr) + { + // When WG ends the zone is cleaned including corpses, revive all players if dead + if ((*itr)->isDead()) + { + (*itr)->ResurrectPlayer(1.0f); + ObjectAccessor::Instance().ConvertCorpseForPlayer((*itr)->GetGUID()); + } + REMOVE_WARTIME_AURAS(*itr); + REMOVE_TENACITY_AURA(*itr); + (*itr)->CombatStop(true); + (*itr)->getHostilRefManager().deleteReferences(); + } + + if (m_timer == 1) // Battle End was forced so no reward. + continue; + // calculate rewards uint32 intactNum = 0; uint32 damagedNum = 0; @@ -1279,6 +1438,7 @@ void OPvPWintergrasp::EndBattle() uint32 baseHonor = 0; uint32 marks = 0; uint32 playersWithRankNum = 0; + uint32 honor = 0; if (sWorld.getConfig(CONFIG_OUTDOORPVP_WINTERGRASP_CUSTOM_HONOR)) { @@ -1296,16 +1456,8 @@ void OPvPWintergrasp::EndBattle() baseHonor /= playersWithRankNum; } - // Revive players, remove auras and give rewards for (PlayerSet::iterator itr = m_players[team].begin(); itr != m_players[team].end(); ++itr) { - uint32 honor; - // When WG ends the zone is cleaned including corpses, revive all players if dead - if ((*itr)->isDead()) - { - (*itr)->ResurrectPlayer(1.0f); - ObjectAccessor::Instance().ConvertCorpseForPlayer((*itr)->GetGUID()); - } if ((*itr)->getLevel() < 70) continue; // No rewards for level <70 @@ -1354,6 +1506,7 @@ void OPvPWintergrasp::EndBattle() (*itr)->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, spellRewardId); } else + { if ((*itr)->HasAura(SPELL_LIEUTENANT) || (*itr)->HasAura(SPELL_CORPORAL)) { // TODO - Honor from SpellReward should be shared by team players @@ -1369,6 +1522,7 @@ void OPvPWintergrasp::EndBattle() for (uint32 i = 0; i < m_towerDestroyedCount[OTHER_TEAM(team)]; ++i) (*itr)->CastSpell(*itr, SPELL_DESTROYED_TOWER, true); } + } if (team == getDefenderTeam()) { if ((*itr)->HasAura(SPELL_LIEUTENANT) || (*itr)->HasAura(SPELL_CORPORAL)) @@ -1377,13 +1531,11 @@ void OPvPWintergrasp::EndBattle() (*itr)->AreaExploredOrEventHappens(H_VICTORY_IN_WG); } } - REMOVE_WARTIME_AURAS(*itr); - REMOVE_TENACITY_AURA(*itr); - (*itr)->CombatStop(true); - (*itr)->getHostilRefManager().deleteReferences(); } } + m_wartime = false; + m_timer = sWorld.getConfig(CONFIG_OUTDOORPVP_WINTERGRASP_INTERVAL) * MINUTE * IN_MILISECONDS; //3.2.0: TeamCastSpell(getAttackerTeam(), SPELL_TELEPORT_DALARAN); RemoveOfflinePlayerWGAuras(); TeamCastSpell(getDefenderTeam(), SPELL_ESSENCE_OF_WG); diff --git a/src/game/Wintergrasp.h b/src/game/Wintergrasp.h index 164685ca64b..6a07bc48fb0 100644 --- a/src/game/Wintergrasp.h +++ b/src/game/Wintergrasp.h @@ -201,6 +201,14 @@ class OPvPWintergrasp : public OutdoorPvP uint32 GetTimer() const { return m_timer / 1000; }; TeamId GetTeam() const { return m_defender; }; bool isWarTime() const { return m_wartime; }; + void setTimer(uint32 timer) + { + if (timer >= 0) + m_timer = timer; + }; + void forceChangeTeam(); + void forceStopBattle(); + void forceStartBattle(); // Temporal BG specific till 3.2 void SendAreaSpiritHealerQueryOpcode(Player *pl, const uint64& guid); |