diff options
-rw-r--r-- | sql/FULL/world_trinity_string_full.sql | 19 | ||||
-rw-r--r-- | sql/updates/6166_world.sql | 26 | ||||
-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 |
8 files changed, 440 insertions, 67 deletions
diff --git a/sql/FULL/world_trinity_string_full.sql b/sql/FULL/world_trinity_string_full.sql index f93440316bf..6ac81f93144 100644 --- a/sql/FULL/world_trinity_string_full.sql +++ b/sql/FULL/world_trinity_string_full.sql @@ -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);
\ No newline at end of file diff --git a/sql/updates/6166_world.sql b/sql/updates/6166_world.sql new file mode 100644 index 00000000000..fc59c68e22f --- /dev/null +++ b/sql/updates/6166_world.sql @@ -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).'); 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); |