aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortartalo <none@none>2009-11-02 16:18:30 +0100
committertartalo <none@none>2009-11-02 16:18:30 +0100
commit46ebbdbba7c46c82625c13a86ac755e7cf512f94 (patch)
tree07284b275cb656dd4874f07201f8a3e2c49a53a2 /src
parentd357b45d0a5d1e3fbb94de4056f3a7c46daa8bb6 (diff)
*Wintergrasp: Tower Control was not applied when entering zone, by Spp
*Wintergrasp: Announce tower and workshops being damaged/destroyed, by Spp *Wintergrasp: Announce when a player gets rank, by Spp *Wintergrasp: Implementation of custom commands (.wg for more info), by Spp Note: enable on/off will stop timer, it's not a real disable --HG-- branch : trunk
Diffstat (limited to 'src')
-rw-r--r--src/game/Chat.cpp12
-rw-r--r--src/game/Chat.h7
-rw-r--r--src/game/Language.h21
-rw-r--r--src/game/Level2.cpp134
-rw-r--r--src/game/Wintergrasp.cpp280
-rw-r--r--src/game/Wintergrasp.h8
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);