aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/scripts')
-rw-r--r--src/server/scripts/CMakeLists.txt2
-rw-r--r--src/server/scripts/Commands/cs_bf.cpp180
-rw-r--r--src/server/scripts/Northrend/CMakeLists.txt1
-rwxr-xr-xsrc/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp1
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp2
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp2
-rw-r--r--src/server/scripts/Northrend/wintergrasp.cpp561
-rw-r--r--src/server/scripts/Spells/spell_paladin.cpp36
-rw-r--r--src/server/scripts/World/item_scripts.cpp12
-rw-r--r--src/server/scripts/World/npc_professions.cpp2
10 files changed, 788 insertions, 11 deletions
diff --git a/src/server/scripts/CMakeLists.txt b/src/server/scripts/CMakeLists.txt
index 6d0d8ec8189..3dfb5b39c24 100644
--- a/src/server/scripts/CMakeLists.txt
+++ b/src/server/scripts/CMakeLists.txt
@@ -79,6 +79,8 @@ include_directories(
${CMAKE_SOURCE_DIR}/src/server/game/AI/ScriptedAI
${CMAKE_SOURCE_DIR}/src/server/game/AI/SmartScripts
${CMAKE_SOURCE_DIR}/src/server/game/AuctionHouse
+ ${CMAKE_SOURCE_DIR}/src/server/game/Battlefield
+ ${CMAKE_SOURCE_DIR}/src/server/game/Battlefield/Zones
${CMAKE_SOURCE_DIR}/src/server/game/Battlegrounds
${CMAKE_SOURCE_DIR}/src/server/game/Battlegrounds/Zones
${CMAKE_SOURCE_DIR}/src/server/game/Calendar
diff --git a/src/server/scripts/Commands/cs_bf.cpp b/src/server/scripts/Commands/cs_bf.cpp
new file mode 100644
index 00000000000..7284e6ad6b7
--- /dev/null
+++ b/src/server/scripts/Commands/cs_bf.cpp
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2008-2011 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* ScriptData
+Name: bf_commandscript
+%Complete: 100
+Comment: All bf related commands
+Category: commandscripts
+EndScriptData */
+
+#include "ScriptMgr.h"
+#include "Chat.h"
+#include "BattlefieldMgr.h"
+
+class bf_commandscript : public CommandScript
+{
+public:
+ bf_commandscript() : CommandScript("bf_commandscript") { }
+
+ ChatCommand* GetCommands() const
+ {
+ static ChatCommand battlefieldcommandTable[] =
+ {
+ { "start", SEC_ADMINISTRATOR, false, &HandleBattlefieldStart, "", NULL },
+ { "stop", SEC_ADMINISTRATOR, false, &HandleBattlefieldEnd, "", NULL },
+ { "switch", SEC_ADMINISTRATOR, false, &HandleBattlefieldSwitch, "", NULL },
+ { "timer", SEC_ADMINISTRATOR, false, &HandleBattlefieldTimer, "", NULL },
+ { "enable", SEC_ADMINISTRATOR, false, &HandleBattlefieldEnable, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
+ };
+ static ChatCommand commandTable[] =
+ {
+ { "bf", SEC_ADMINISTRATOR, false, NULL, "", battlefieldcommandTable },
+ { NULL, 0, false, NULL, "", NULL }
+ };
+ return commandTable;
+ }
+
+ static bool HandleBattlefieldStart(ChatHandler* handler, const char* args)
+ {
+ uint32 battleid = 0;
+ char* battleid_str = strtok((char*)args, " ");
+ if (!battleid_str)
+ return false;
+
+ battleid = atoi(battleid_str);
+
+ Battlefield* bf = sBattlefieldMgr->GetBattlefieldByBattleId(battleid);
+
+ if (!bf)
+ return false;
+
+ bf->StartBattle();
+
+ if (battleid == 1)
+ handler->SendGlobalGMSysMessage("Wintergrasp (Command start used)");
+
+ return true;
+ }
+
+ static bool HandleBattlefieldEnd(ChatHandler* handler, const char* args)
+ {
+ uint32 battleid = 0;
+ char* battleid_str = strtok((char*)args, " ");
+ if (!battleid_str)
+ return false;
+
+ battleid = atoi(battleid_str);
+
+ Battlefield* bf = sBattlefieldMgr->GetBattlefieldByBattleId(battleid);
+
+ if (!bf)
+ return false;
+
+ bf->EndBattle(true);
+
+ if (battleid == 1)
+ handler->SendGlobalGMSysMessage("Wintergrasp (Command stop used)");
+
+ return true;
+ }
+
+ static bool HandleBattlefieldEnable(ChatHandler* handler, const char* args)
+ {
+ uint32 battleid = 0;
+ char* battleid_str = strtok((char*)args, " ");
+ if (!battleid_str)
+ return false;
+
+ battleid = atoi(battleid_str);
+
+ Battlefield* bf = sBattlefieldMgr->GetBattlefieldByBattleId(battleid);
+
+ if (!bf)
+ return false;
+
+ if (bf->IsEnabled())
+ {
+ bf->ToggleBattlefield(false);
+ if (battleid == 1)
+ handler->SendGlobalGMSysMessage("Wintergrasp is disabled");
+ }
+ else
+ {
+ bf->ToggleBattlefield(true);
+ if (battleid == 1)
+ handler->SendGlobalGMSysMessage("Wintergrasp is enabled");
+ }
+
+ return true;
+ }
+
+ static bool HandleBattlefieldSwitch(ChatHandler* handler, const char* args)
+ {
+ uint32 battleid = 0;
+ char* battleid_str = strtok((char*)args, " ");
+ if (!battleid_str)
+ return false;
+
+ battleid = atoi(battleid_str);
+
+ Battlefield* bf = sBattlefieldMgr->GetBattlefieldByBattleId(battleid);
+
+ if (!bf)
+ return false;
+
+ bf->EndBattle(false);
+ if (battleid == 1)
+ handler->SendGlobalGMSysMessage("Wintergrasp (Command switch used)");
+
+ return true;
+ }
+
+ static bool HandleBattlefieldTimer(ChatHandler* handler, const char* args)
+ {
+ uint32 battleid = 0;
+ uint32 time = 0;
+ char* battleid_str = strtok((char*)args, " ");
+ if (!battleid_str)
+ return false;
+ char* time_str = strtok(NULL, " ");
+ if (!time_str)
+ return false;
+
+ battleid = atoi(battleid_str);
+
+ time = atoi(time_str);
+
+ Battlefield* bf = sBattlefieldMgr->GetBattlefieldByBattleId(battleid);
+
+ if (!bf)
+ return false;
+
+ bf->SetTimer(time * IN_MILLISECONDS);
+ bf->SendInitWorldStatesToAll();
+ if (battleid == 1)
+ handler->SendGlobalGMSysMessage("Wintergrasp (Command timer used)");
+
+ return true;
+ }
+};
+
+void AddSC_bf_commandscript()
+{
+ new bf_commandscript();
+}
diff --git a/src/server/scripts/Northrend/CMakeLists.txt b/src/server/scripts/Northrend/CMakeLists.txt
index 3502e7fb104..dd8dd17c947 100644
--- a/src/server/scripts/Northrend/CMakeLists.txt
+++ b/src/server/scripts/Northrend/CMakeLists.txt
@@ -10,6 +10,7 @@
set(scripts_STAT_SRCS
${scripts_STAT_SRCS}
+ Northrend/wintergrasp.cpp
Northrend/isle_of_conquest.cpp
Northrend/storm_peaks.cpp
Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp
index 479d234e27c..89a26bde6ff 100755
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp
@@ -303,7 +303,6 @@ class npc_coldflame : public CreatureScript
{
Position const* ownerPos = marrowgarAI->GetLastColdflamePosition();
float ang = me->GetAngle(ownerPos) - static_cast<float>(M_PI);
- ang = MapManager::NormalizeOrientation(ang);
me->SetOrientation(ang);
owner->GetNearPosition(pos, 2.5f, 0.0f);
}
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp
index 6d9450daf21..aab54785213 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp
@@ -121,7 +121,7 @@ public:
coreEnergizeOrientation = me->GetOrientation();
firstCoreEnergize = true;
} else
- coreEnergizeOrientation = MapManager::NormalizeOrientation(coreEnergizeOrientation - 2.0f);
+ coreEnergizeOrientation = Position::NormalizeOrientation(coreEnergizeOrientation - 2.0f);
DoCast(me, SPELL_ENERGIZE_CORES_VISUAL);
events.ScheduleEvent(EVENT_ENERGIZE_CORES_VISUAL, 5000);
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp
index 24a9171e29f..b414a3fcdcb 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp
@@ -488,7 +488,7 @@ class spell_ulduar_squeezed_lifeless : public SpellScriptLoader
pos.m_positionX = 1756.25f + irand(-3, 3);
pos.m_positionY = -8.3f + irand(-3, 3);
pos.m_positionZ = 448.8f;
- pos.m_orientation = M_PI;
+ pos.SetOrientation(M_PI);
GetHitPlayer()->DestroyForNearbyPlayers();
GetHitPlayer()->ExitVehicle(&pos);
GetHitPlayer()->UpdateObjectVisibility(false);
diff --git a/src/server/scripts/Northrend/wintergrasp.cpp b/src/server/scripts/Northrend/wintergrasp.cpp
new file mode 100644
index 00000000000..eba5b7f69d4
--- /dev/null
+++ b/src/server/scripts/Northrend/wintergrasp.cpp
@@ -0,0 +1,561 @@
+/* Copyright (C) 2008 - 2009 Trinity <http://www.trinitycore.org/>
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "BattlefieldMgr.h"
+#include "BattlefieldWG.h"
+#include "Battlefield.h"
+#include "ScriptSystem.h"
+#include "WorldSession.h"
+#include "ObjectMgr.h"
+#include "Vehicle.h"
+#include "GameObjectAI.h"
+
+#define GOSSIP_HELLO_DEMO1 "Build catapult."
+#define GOSSIP_HELLO_DEMO2 "Build demolisher."
+#define GOSSIP_HELLO_DEMO3 "Build siege engine."
+#define GOSSIP_HELLO_DEMO4 "I cannot build more!"
+
+enum eWGqueuenpctext
+{
+ WG_NPCQUEUE_TEXT_H_NOWAR = 14775,
+ WG_NPCQUEUE_TEXT_H_QUEUE = 14790,
+ WG_NPCQUEUE_TEXT_H_WAR = 14777,
+ WG_NPCQUEUE_TEXT_A_NOWAR = 14782,
+ WG_NPCQUEUE_TEXT_A_QUEUE = 14791,
+ WG_NPCQUEUE_TEXT_A_WAR = 14781,
+ WG_NPCQUEUE_TEXTOPTION_JOIN = -1850507,
+};
+
+enum Spells
+{
+ // Demolisher engineers spells
+ SPELL_BUILD_SIEGE_VEHICLE_FORCE_HORDE = 61409,
+ SPELL_BUILD_SIEGE_VEHICLE_FORCE_ALLIANCE = 56662,
+ SPELL_BUILD_CATAPULT_FORCE = 56664,
+ SPELL_BUILD_DEMOLISHER_FORCE = 56659,
+ SPELL_ACTIVATE_CONTROL_ARMS = 49899,
+ SPELL_RIDE_WG_VEHICLE = 60968,
+
+ SPELL_VEHICLE_TELEPORT = 49759,
+
+ // Spirit guide
+ SPELL_CHANNEL_SPIRIT_HEAL = 22011,
+};
+
+enum CreatureIds
+{
+ NPC_GOBLIN_MECHANIC = 30400,
+ NPC_GNOMISH_ENGINEER = 30499,
+
+ NPC_WINTERGRASP_CONTROL_ARMS = 27852,
+
+ NPC_WORLD_TRIGGER_LARGE_AOI_NOT_IMMUNE_PC_NPC = 23472,
+};
+
+enum QuestIds
+{
+ QUEST_BONES_AND_ARROWS_HORDE_ATT = 13193,
+ QUEST_JINXING_THE_WALLS_HORDE_ATT = 13202,
+ QUEST_SLAY_THEM_ALL_HORDE_ATT = 13180,
+ QUEST_FUELING_THE_DEMOLISHERS_HORDE_ATT = 13200,
+ QUEST_HEALING_WITH_ROSES_HORDE_ATT = 13201,
+ QUEST_DEFEND_THE_SIEGE_HORDE_ATT = 13223,
+
+ QUEST_BONES_AND_ARROWS_HORDE_DEF = 13199,
+ QUEST_WARDING_THE_WALLS_HORDE_DEF = 13192,
+ QUEST_SLAY_THEM_ALL_HORDE_DEF = 13178,
+ QUEST_FUELING_THE_DEMOLISHERS_HORDE_DEF = 13191,
+ QUEST_HEALING_WITH_ROSES_HORDE_DEF = 13194,
+ QUEST_TOPPLING_THE_TOWERS_HORDE_DEF = 13539,
+ QUEST_STOP_THE_SIEGE_HORDE_DEF = 13185,
+
+ QUEST_BONES_AND_ARROWS_ALLIANCE_ATT = 13196,
+ QUEST_WARDING_THE_WARRIORS_ALLIANCE_ATT = 13198,
+ QUEST_NO_MERCY_FOR_THE_MERCILESS_ALLIANCE_ATT = 13179,
+ QUEST_DEFEND_THE_SIEGE_ALLIANCE_ATT = 13222,
+ QUEST_A_RARE_HERB_ALLIANCE_ATT = 13195,
+
+ QUEST_BONES_AND_ARROWS_ALLIANCE_DEF = 13154,
+ QUEST_WARDING_THE_WARRIORS_ALLIANCE_DEF = 13153,
+ QUEST_NO_MERCY_FOR_THE_MERCILESS_ALLIANCE_DEF = 13177,
+ QUEST_SHOUTHERN_SABOTAGE_ALLIANCE_DEF = 13538,
+ QUEST_STOP_THE_SIEGE_ALLIANCE_DEF = 13186,
+ QUEST_A_RARE_HERB_ALLIANCE_DEF = 13156,
+};
+
+uint8 const MAX_WINTERGRASP_VEHICLES = 4;
+
+uint32 const vehiclesList[MAX_WINTERGRASP_VEHICLES] = {
+ NPC_WINTERGRASP_CATAPULT,
+ NPC_WINTERGRASP_DEMOLISHER,
+ NPC_WINTERGRASP_SIEGE_ENGINE_ALLIANCE,
+ NPC_WINTERGRASP_SIEGE_ENGINE_HORDE
+};
+
+class npc_wg_demolisher_engineer : public CreatureScript
+{
+ public:
+ npc_wg_demolisher_engineer() : CreatureScript("npc_wg_demolisher_engineer") { }
+
+ bool OnGossipHello(Player* player, Creature* creature)
+ {
+ if (creature->isQuestGiver())
+ player->PrepareQuestMenu(creature->GetGUID());
+
+ Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
+
+ if (canBuild(creature))
+ {
+ if (player->HasAura(SPELL_CORPORAL))
+ player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
+ else if (player->HasAura(SPELL_LIEUTENANT))
+ {
+ player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
+ player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
+ }
+ }
+ else
+ player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 9);
+
+ player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
+ return true;
+ }
+
+ bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender */ , uint32 action)
+ {
+ player->CLOSE_GOSSIP_MENU();
+
+ Battlefield* wintergrasp= sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
+
+ if (canBuild(creature))
+ {
+ switch (action - GOSSIP_ACTION_INFO_DEF)
+ {
+ case 0:
+ creature->CastSpell(player, SPELL_BUILD_CATAPULT_FORCE, true);
+ break;
+ case 1:
+ creature->CastSpell(player, SPELL_BUILD_DEMOLISHER_FORCE, true);
+ break;
+ case 2:
+ creature->CastSpell(player, player->GetTeamId() == TEAM_ALLIANCE ? SPELL_BUILD_SIEGE_VEHICLE_FORCE_ALLIANCE : SPELL_BUILD_SIEGE_VEHICLE_FORCE_HORDE, true);
+ break;
+ }
+ if (Creature* controlArms = creature->FindNearestCreature(NPC_WINTERGRASP_CONTROL_ARMS, 30.0f, true))
+ creature->CastSpell(controlArms, SPELL_ACTIVATE_CONTROL_ARMS, true);
+ }
+ return true;
+ }
+
+ private:
+ bool canBuild(Creature* creature)
+ {
+ Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
+
+ if (!wintergrasp)
+ return false;
+ switch (creature->GetEntry())
+ {
+ case NPC_GOBLIN_MECHANIC:
+ return (wintergrasp->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_H) > wintergrasp->GetData(BATTLEFIELD_WG_DATA_VEHICLE_H));
+ case NPC_GNOMISH_ENGINEER:
+ return (wintergrasp->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_A) > wintergrasp->GetData(BATTLEFIELD_WG_DATA_VEHICLE_A));
+ default:
+ return false;
+ }
+ }
+};
+
+class npc_wg_spirit_guide : public CreatureScript
+{
+ public:
+ npc_wg_spirit_guide() : CreatureScript("npc_wg_spirit_guide") { }
+
+ bool OnGossipHello(Player* player, Creature* creature)
+ {
+ if (creature->isQuestGiver())
+ player->PrepareQuestMenu(creature->GetGUID());
+
+ Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
+ if (!wintergrasp)
+ return true;
+
+ GraveyardVect graveyard = wintergrasp->GetGraveyardVector();
+ for (uint8 i = 0; i < graveyard.size(); i++)
+ if (graveyard[i]->GetControlTeamId() == player->GetTeamId())
+ player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, sObjectMgr->GetTrinityStringForDBCLocale(((BfGraveyardWG*)graveyard[i])->GetTextId()), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + i);
+
+ player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
+ return true;
+ }
+
+ bool OnGossipSelect(Player* player, Creature* /*creature */ , uint32 /*sender */ , uint32 action)
+ {
+ player->CLOSE_GOSSIP_MENU();
+
+ Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
+ if (wintergrasp)
+ {
+ GraveyardVect gy = wintergrasp->GetGraveyardVector();
+ for (uint8 i = 0; i < gy.size(); i++)
+ if (action - GOSSIP_ACTION_INFO_DEF == i && gy[i]->GetControlTeamId() == player->GetTeamId())
+ if (WorldSafeLocsEntry const* safeLoc = sWorldSafeLocsStore.LookupEntry(gy[i]->GetGraveyardId()))
+ player->TeleportTo(safeLoc->map_id, safeLoc->x, safeLoc->y, safeLoc->z, 0);
+ }
+ return true;
+ }
+
+ struct npc_wg_spirit_guideAI : public ScriptedAI
+ {
+ npc_wg_spirit_guideAI(Creature* creature) : ScriptedAI(creature)
+ { }
+
+ void UpdateAI(const uint32 /* diff */)
+ {
+ if (!me->HasUnitState(UNIT_STATE_CASTING))
+ DoCast(me, SPELL_CHANNEL_SPIRIT_HEAL);
+ }
+ };
+
+ CreatureAI *GetAI(Creature* creature) const
+ {
+ return new npc_wg_spirit_guideAI(creature);
+ }
+};
+
+class npc_wg_queue : public CreatureScript
+{
+ public:
+ npc_wg_queue() : CreatureScript("npc_wg_queue") { }
+
+ bool OnGossipHello(Player* player, Creature* creature)
+ {
+ if (creature->isQuestGiver())
+ player->PrepareQuestMenu(creature->GetGUID());
+
+ Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
+ if (!wintergrasp)
+ return true;
+
+ if (wintergrasp->IsWarTime())
+ {
+ player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, sObjectMgr->GetTrinityStringForDBCLocale(WG_NPCQUEUE_TEXTOPTION_JOIN), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
+ player->SEND_GOSSIP_MENU(wintergrasp->GetDefenderTeam()? WG_NPCQUEUE_TEXT_H_WAR : WG_NPCQUEUE_TEXT_A_WAR, creature->GetGUID());
+ }
+ else
+ {
+ uint32 timer = wintergrasp->GetTimer() / 1000;
+ player->SendUpdateWorldState(4354, time(NULL) + timer);
+ if (timer < 15 * MINUTE)
+ {
+ player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, sObjectMgr->GetTrinityStringForDBCLocale(WG_NPCQUEUE_TEXTOPTION_JOIN), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
+ player->SEND_GOSSIP_MENU(wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_QUEUE : WG_NPCQUEUE_TEXT_A_QUEUE, creature->GetGUID());
+ }
+ else
+ player->SEND_GOSSIP_MENU(wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_NOWAR : WG_NPCQUEUE_TEXT_A_NOWAR, creature->GetGUID());
+ }
+ return true;
+ }
+
+ bool OnGossipSelect(Player* player, Creature* /*creature */ , uint32 /*sender */ , uint32 /*action*/)
+ {
+ player->CLOSE_GOSSIP_MENU();
+
+ Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
+ if (!wintergrasp)
+ return true;
+
+ if (wintergrasp->IsWarTime())
+ wintergrasp->InvitePlayerToWar(player);
+ else
+ {
+ uint32 timer = wintergrasp->GetTimer() / 1000;
+ if (timer < 15 * MINUTE)
+ wintergrasp->InvitePlayerToQueue(player);
+ }
+ return true;
+ }
+};
+
+class go_wg_vehicle_teleporter : public GameObjectScript
+{
+ public:
+ go_wg_vehicle_teleporter() : GameObjectScript("go_wg_vehicle_teleporter") { }
+
+ struct go_wg_vehicle_teleporterAI : public GameObjectAI
+ {
+ go_wg_vehicle_teleporterAI(GameObject* gameObject) : GameObjectAI(gameObject),
+ _checkTimer(1000)
+ { }
+
+ void UpdateAI(uint32 diff)
+ {
+ if (_checkTimer <= diff)
+ {
+ // Tabulation madness in the hole!
+ for (uint8 i = 0; i < MAX_WINTERGRASP_VEHICLES; i++)
+ if (Creature* vehicleCreature = go->FindNearestCreature(vehiclesList[i], 3.0f, true))
+ if (!vehicleCreature->HasAura(SPELL_VEHICLE_TELEPORT))
+ if (Vehicle* vehicle = vehicleCreature->GetVehicle())
+ if (Unit* passenger = vehicle->GetPassenger(0))
+ if (go->GetUInt32Value(GAMEOBJECT_FACTION) == passenger->getFaction())
+ if (Creature* teleportTrigger = vehicleCreature->FindNearestCreature(NPC_WORLD_TRIGGER_LARGE_AOI_NOT_IMMUNE_PC_NPC, 100.0f, true))
+ teleportTrigger->CastSpell(vehicleCreature, SPELL_VEHICLE_TELEPORT, true);
+
+ _checkTimer = 1000;
+ }
+ else _checkTimer -= diff;
+ }
+ private:
+ uint32 _checkTimer;
+ };
+
+ GameObjectAI* GetGameObjectAI(GameObject* go) const
+ {
+ return new go_wg_vehicle_teleporterAI(go);
+ }
+};
+
+class npc_wg_quest_giver : public CreatureScript
+{
+ public:
+ npc_wg_quest_giver() : CreatureScript("npc_wg_quest_giver") { }
+
+ bool OnGossipHello(Player* player, Creature* creature)
+ {
+ if (creature->isQuestGiver())
+ player->PrepareQuestMenu(creature->GetGUID());
+
+ Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
+ if (!wintergrasp)
+ return true;
+
+ if (creature->isQuestGiver())
+ {
+ QuestRelationBounds objectQR = sObjectMgr->GetCreatureQuestRelationBounds(creature->GetEntry());
+ QuestRelationBounds objectQIR = sObjectMgr->GetCreatureQuestInvolvedRelationBounds(creature->GetEntry());
+
+ QuestMenu& qm = player->PlayerTalkClass->GetQuestMenu();
+ qm.ClearMenu();
+
+ for (QuestRelations::const_iterator i = objectQIR.first; i != objectQIR.second; ++i)
+ {
+ uint32 quest_id = i->second;
+ QuestStatus status = player->GetQuestStatus(quest_id);
+ if (status == QUEST_STATUS_COMPLETE)
+ qm.AddMenuItem(quest_id, 4);
+ else if (status == QUEST_STATUS_INCOMPLETE)
+ qm.AddMenuItem(quest_id, 4);
+ //else if (status == QUEST_STATUS_AVAILABLE)
+ // qm.AddMenuItem(quest_id, 2);
+ }
+
+ for (QuestRelations::const_iterator i = objectQR.first; i != objectQR.second; ++i)
+ {
+ uint32 questId = i->second;
+ Quest const* quest = sObjectMgr->GetQuestTemplate(questId);
+ if (!quest)
+ continue;
+
+ switch (questId)
+ {
+ // Horde attacker
+ case QUEST_BONES_AND_ARROWS_HORDE_ATT:
+ case QUEST_JINXING_THE_WALLS_HORDE_ATT:
+ case QUEST_SLAY_THEM_ALL_HORDE_ATT:
+ case QUEST_FUELING_THE_DEMOLISHERS_HORDE_ATT:
+ case QUEST_HEALING_WITH_ROSES_HORDE_ATT:
+ case QUEST_DEFEND_THE_SIEGE_HORDE_ATT:
+ if (wintergrasp->GetAttackerTeam() == TEAM_HORDE)
+ {
+ QuestStatus status = player->GetQuestStatus(questId);
+
+ if (quest->IsAutoComplete() && player->CanTakeQuest(quest, false))
+ qm.AddMenuItem(questId, 4);
+ else if (status == QUEST_STATUS_NONE && player->CanTakeQuest(quest, false))
+ qm.AddMenuItem(questId, 2);
+ }
+ break;
+ // Horde defender
+ case QUEST_BONES_AND_ARROWS_HORDE_DEF:
+ case QUEST_WARDING_THE_WALLS_HORDE_DEF:
+ case QUEST_SLAY_THEM_ALL_HORDE_DEF:
+ case QUEST_FUELING_THE_DEMOLISHERS_HORDE_DEF:
+ case QUEST_HEALING_WITH_ROSES_HORDE_DEF:
+ case QUEST_TOPPLING_THE_TOWERS_HORDE_DEF:
+ case QUEST_STOP_THE_SIEGE_HORDE_DEF:
+ if (wintergrasp->GetDefenderTeam() == TEAM_HORDE)
+ {
+ QuestStatus status = player->GetQuestStatus(questId);
+
+ if (quest->IsAutoComplete() && player->CanTakeQuest(quest, false))
+ qm.AddMenuItem(questId, 4);
+ else if (status == QUEST_STATUS_NONE && player->CanTakeQuest(quest, false))
+ qm.AddMenuItem(questId, 2);
+ }
+ break;
+ // Alliance attacker
+ case QUEST_BONES_AND_ARROWS_ALLIANCE_ATT:
+ case QUEST_WARDING_THE_WARRIORS_ALLIANCE_ATT:
+ case QUEST_NO_MERCY_FOR_THE_MERCILESS_ALLIANCE_ATT:
+ case QUEST_DEFEND_THE_SIEGE_ALLIANCE_ATT:
+ case QUEST_A_RARE_HERB_ALLIANCE_ATT:
+ if (wintergrasp->GetAttackerTeam() == TEAM_ALLIANCE)
+ {
+ QuestStatus status = player->GetQuestStatus(questId);
+
+ if (quest->IsAutoComplete() && player->CanTakeQuest(quest, false))
+ qm.AddMenuItem(questId, 4);
+ else if (status == QUEST_STATUS_NONE && player->CanTakeQuest(quest, false))
+ qm.AddMenuItem(questId, 2);
+ }
+ break;
+ // Alliance defender
+ case QUEST_BONES_AND_ARROWS_ALLIANCE_DEF:
+ case QUEST_WARDING_THE_WARRIORS_ALLIANCE_DEF:
+ case QUEST_NO_MERCY_FOR_THE_MERCILESS_ALLIANCE_DEF:
+ case QUEST_SHOUTHERN_SABOTAGE_ALLIANCE_DEF:
+ case QUEST_STOP_THE_SIEGE_ALLIANCE_DEF:
+ case QUEST_A_RARE_HERB_ALLIANCE_DEF:
+ if (wintergrasp->GetDefenderTeam() == TEAM_ALLIANCE)
+ {
+ QuestStatus status = player->GetQuestStatus(questId);
+
+ if (quest->IsAutoComplete() && player->CanTakeQuest(quest, false))
+ qm.AddMenuItem(questId, 4);
+ else if (status == QUEST_STATUS_NONE && player->CanTakeQuest(quest, false))
+ qm.AddMenuItem(questId, 2);
+ }
+ break;
+ default:
+ QuestStatus status = player->GetQuestStatus(questId);
+
+ if (quest->IsAutoComplete() && player->CanTakeQuest(quest, false))
+ qm.AddMenuItem(questId, 4);
+ else if (status == QUEST_STATUS_NONE && player->CanTakeQuest(quest, false))
+ qm.AddMenuItem(questId, 2);
+ break;
+ }
+ }
+ }
+ player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
+ return true;
+ }
+};
+
+class spell_wintergrasp_force_building : public SpellScriptLoader
+{
+ public:
+ spell_wintergrasp_force_building() : SpellScriptLoader("spell_wintergrasp_force_building") { }
+
+ class spell_wintergrasp_force_building_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_wintergrasp_force_building_SpellScript);
+
+ bool Validate(SpellInfo const* /*spell*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_BUILD_CATAPULT_FORCE)
+ || !sSpellMgr->GetSpellInfo(SPELL_BUILD_DEMOLISHER_FORCE)
+ || !sSpellMgr->GetSpellInfo(SPELL_BUILD_SIEGE_VEHICLE_FORCE_HORDE)
+ || !sSpellMgr->GetSpellInfo(SPELL_BUILD_SIEGE_VEHICLE_FORCE_ALLIANCE))
+ return false;
+ return true;
+ }
+
+ void HandleScript(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+ GetHitUnit()->CastSpell(GetHitUnit(), GetEffectValue(), false);
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_wintergrasp_force_building_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_wintergrasp_force_building_SpellScript();
+ }
+};
+
+class spell_wintergrasp_grab_passenger : public SpellScriptLoader
+{
+ public:
+ spell_wintergrasp_grab_passenger() : SpellScriptLoader("spell_wintergrasp_grab_passenger") { }
+
+ class spell_wintergrasp_grab_passenger_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_wintergrasp_grab_passenger_SpellScript);
+
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ if (Player* target = GetHitPlayer())
+ target->CastSpell(GetCaster(), SPELL_RIDE_WG_VEHICLE, true);
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_wintergrasp_grab_passenger_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_wintergrasp_grab_passenger_SpellScript();
+ }
+};
+
+class achievement_wg_didnt_stand_a_chance : public AchievementCriteriaScript
+{
+public:
+ achievement_wg_didnt_stand_a_chance() : AchievementCriteriaScript("achievement_wg_didnt_stand_a_chance") { }
+
+ bool OnCheck(Player* source, Unit* target)
+ {
+ if (!target)
+ return false;
+
+ if (Player* victim = target->ToPlayer())
+ {
+ if (!victim->IsMounted())
+ return false;
+
+ if (Vehicle* vehicle = source->GetVehicle())
+ if (vehicle->GetVehicleInfo()->m_ID == 244) // Wintergrasp Tower Cannon
+ return true;
+ }
+
+ return false;
+ }
+};
+
+
+
+void AddSC_wintergrasp()
+{
+ new npc_wg_queue();
+ new npc_wg_spirit_guide();
+ new npc_wg_demolisher_engineer();
+ new npc_wg_quest_giver();
+ new achievement_wg_didnt_stand_a_chance();
+ new spell_wintergrasp_force_building();
+ new spell_wintergrasp_grab_passenger();
+
+ new go_wg_vehicle_teleporter();
+}
diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp
index 7d248b35853..0bf2e5664a0 100644
--- a/src/server/scripts/Spells/spell_paladin.cpp
+++ b/src/server/scripts/Spells/spell_paladin.cpp
@@ -531,6 +531,41 @@ class spell_pal_righteous_defense : public SpellScriptLoader
}
};
+class spell_pal_exorcism_and_holy_wrath_damage : public SpellScriptLoader
+{
+ public:
+ spell_pal_exorcism_and_holy_wrath_damage() : SpellScriptLoader("spell_pal_exorcism_and_holy_wrath_damage") { }
+
+ class spell_pal_exorcism_and_holy_wrath_damage_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_pal_exorcism_and_holy_wrath_damage_AuraScript);
+
+ void HandleEffectCalcSpellMod(AuraEffect const* aurEff, SpellModifier*& spellMod)
+ {
+ if (!spellMod)
+ {
+ spellMod = new SpellModifier(aurEff->GetBase());
+ spellMod->op = SPELLMOD_DAMAGE;
+ spellMod->type = SPELLMOD_FLAT;
+ spellMod->spellId = GetId();
+ spellMod->mask[1] = 0x200002;
+ }
+
+ spellMod->value = aurEff->GetAmount();
+ }
+
+ void Register()
+ {
+ DoEffectCalcSpellMod += AuraEffectCalcSpellModFn(spell_pal_exorcism_and_holy_wrath_damage_AuraScript::HandleEffectCalcSpellMod, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_pal_exorcism_and_holy_wrath_damage_AuraScript();
+ }
+};
+
void AddSC_paladin_spell_scripts()
{
new spell_pal_ardent_defender();
@@ -543,4 +578,5 @@ void AddSC_paladin_spell_scripts()
new spell_pal_divine_storm_dummy();
new spell_pal_lay_on_hands();
new spell_pal_righteous_defense();
+ new spell_pal_exorcism_and_holy_wrath_damage();
}
diff --git a/src/server/scripts/World/item_scripts.cpp b/src/server/scripts/World/item_scripts.cpp
index d888e6cb56b..e7883f4f11f 100644
--- a/src/server/scripts/World/item_scripts.cpp
+++ b/src/server/scripts/World/item_scripts.cpp
@@ -75,7 +75,7 @@ public:
return false;
// error
- player->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, item, NULL);
+ player->SendEquipError(EQUIP_ERR_CLIENT_LOCKED_OUT, item, NULL);
return true;
}
};
@@ -118,7 +118,7 @@ public:
targets.GetUnitTarget()->GetEntry() == 20748 && !targets.GetUnitTarget()->HasAura(32578))
return false;
- player->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, item, NULL);
+ player->SendEquipError(EQUIP_ERR_CLIENT_LOCKED_OUT, item, NULL);
return true;
}
};
@@ -267,15 +267,13 @@ class item_petrov_cluster_bombs : public ItemScript
public:
item_petrov_cluster_bombs() : ItemScript("item_petrov_cluster_bombs") { }
- bool OnUse(Player* player, Item* item, const SpellCastTargets & /*targets*/)
+ bool OnUse(Player* player, Item* /*item*/, const SpellCastTargets & /*targets*/)
{
if (player->GetZoneId() != ZONE_ID_HOWLING)
return false;
if (!player->GetTransport() || player->GetAreaId() != AREA_ID_SHATTERED_STRAITS)
{
- player->SendEquipError(EQUIP_ERR_NONE, item, NULL);
-
if (const SpellInfo* spellInfo = sSpellMgr->GetSpellInfo(SPELL_PETROV_BOMB))
Spell::SendCastResult(player, spellInfo, 1, SPELL_FAILED_NOT_HERE);
@@ -380,7 +378,7 @@ public:
} else
player->SendEquipError(EQUIP_ERR_OUT_OF_RANGE, item, NULL);
} else
- player->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, item, NULL);
+ player->SendEquipError(EQUIP_ERR_CLIENT_LOCKED_OUT, item, NULL);
return true;
}
};
@@ -406,7 +404,7 @@ public:
player->SendEquipError(EQUIP_ERR_OUT_OF_RANGE, item, NULL);
}
else
- player->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, item, NULL);
+ player->SendEquipError(EQUIP_ERR_CLIENT_LOCKED_OUT, item, NULL);
return true;
}
};
diff --git a/src/server/scripts/World/npc_professions.cpp b/src/server/scripts/World/npc_professions.cpp
index 74f615a87d1..e6ac4a3a2a1 100644
--- a/src/server/scripts/World/npc_professions.cpp
+++ b/src/server/scripts/World/npc_professions.cpp
@@ -361,7 +361,7 @@ void ProcessUnlearnAction(Player* player, Creature* creature, uint32 spellId, ui
player->SendBuyError(BUY_ERR_NOT_ENOUGHT_MONEY, creature, 0, 0);
}
else
- player->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, NULL, NULL);
+ player->SendEquipError(EQUIP_ERR_CLIENT_LOCKED_OUT, NULL, NULL);
player->CLOSE_GOSSIP_MENU();
}