*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:
tartalo
2009-11-02 16:18:30 +01:00
parent d357b45d0a
commit 46ebbdbba7
8 changed files with 440 additions and 67 deletions
+17
View File
@@ -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),
+26
View File
@@ -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).');
+12
View File
@@ -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 }
};
+7
View File
@@ -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
View File
@@ -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,
+134
View File
@@ -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
View File
@@ -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);
+8
View File
@@ -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);