*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
This commit is contained in:
@@ -592,6 +592,23 @@ INSERT INTO `trinity_string` (`entry`, `content_default`, `content_loc1`, `conte
|
||||
(753, 'The battle for Warsong Gulch begins in 2 minutes.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(754, 'The battle for Arathi Basin begins in 2 minutes.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(755, 'The battle for Eye of the Storm begins in 2 minutes.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(756, 'Battle begins!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(757, '%s has successfully defended the fortress!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(758, '%s has taken over the fortress!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(759, 'The %s siege workshop has been damaged by the %s!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(760, 'The %s siege workshop has been destroyed by the %s!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(761, 'The %s tower has been damaged!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(762, 'The %s tower has been destroyed!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(763, 'Wintergrasp fortress is under attack!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(764, 'Wintergrasp is now under the control of the %s.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(765, 'Wintergrasp timer set to %s.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(766, 'Wintergrasp battle started.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(767, 'Wintergrasp battle finished.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(768, 'Wintergrasp info: %s controled. Timer: %s. Wartime: %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(769, 'Wintergrasp outdoorPvP is disabled.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(770, 'Wintergrasp outdoorPvP is enabled.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(771, 'You have reached Rank 1: Corporal', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(772, 'You have reached Rank 2: First Lieutenant', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(785, 'Arena testing turned %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(786, '|cffff0000[Automatic]:|r', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(787, '|cffffff00[|c1f40af20Announce by|r |cffff0000%s|cffffff00]:|r %s|r', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
@@ -798,4 +815,4 @@ INSERT INTO `trinity_string` (`entry`, `content_default`, `content_loc1`, `conte
|
||||
(10053, 'Take me to Crown Guard Tower.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(10054, 'Give me the flag, I''ll take it to the central beacon for the glory of the Alliance!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(10055, 'Give me the flag, I''ll take it to the central beacon for the glory of the Horde!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(11000, '|cffffff00[|c00077766Autobroadcast|cffffff00]: |cFFF222FF%s|r', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||
(11000, '|cffffff00[|c00077766Autobroadcast|cffffff00]: |cFFF222FF%s|r', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||
@@ -0,0 +1,26 @@
|
||||
INSERT INTO `trinity_string` (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES
|
||||
(756, 'Battle begins!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(757, '%s has successfully defended the fortress!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(758, '%s has taken over the fortress!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(759, 'The %s siege workshop has been damaged by the %s!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(760, 'The %s siege workshop has been destroyed by the %s!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(761, 'The %s tower has been damaged!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(762, 'The %s tower has been destroyed!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(763, 'Wintergrasp fortress is under attack!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(764, 'Wintergrasp is now under the control of the %s.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(765, 'Wintergrasp timer set to %s.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(766, 'Wintergrasp battle started.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(767, 'Wintergrasp battle finished.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(768, 'Wintergrasp info: %s controled. Timer: %s. Wartime: %s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(769, 'Wintergrasp outdoorPvP is disabled.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(770, 'Wintergrasp outdoorPvP is enabled.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(771, 'You have reached Rank 1: Corporal', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
|
||||
(772, 'You have reached Rank 2: First Lieutenant', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||
INSERT INTO command (name, security, help) VALUES
|
||||
('wg', 3, 'Syntax: .wg $subcommand.'),
|
||||
('wg enable', 3, 'Syntax: .wg enable [on/off] Enable/Disable Wintergrasp outdoorPvP.'),
|
||||
('wg start', 3, 'Syntax: .wg start\r\nForce Wintergrasp battle start.'),
|
||||
('wg status', 3, 'Syntax: .wg status\r\nWintergrasp info, defender, timer, wartime.'),
|
||||
('wg stop', 3, 'Syntax: .wg stop\r\nForce Wintergrasp battle stop (No rewards).'),
|
||||
('wg switch', 3, 'Syntax: .wg switch\r\nSwitchs Wintergrasp defender team.'),
|
||||
('wg timer', 3, 'Syntax: .wg timer\r\nChange Wintergrasp current timer (in secs).');
|
||||
@@ -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 }
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
|
||||
+19
-2
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
+216
-64
@@ -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 (m_changeDefender)
|
||||
{
|
||||
m_changeDefender = false;
|
||||
m_defender = getAttackerTeam();
|
||||
entry = LANG_BG_WG_CAPTURED;
|
||||
}
|
||||
|
||||
if (isWarTime())
|
||||
{
|
||||
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!");
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user