/* Copyright (C) 2008 - 2009 Trinity * 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" #include "ScriptedCreature.h" #include "ScriptedGossip.h" #include "SpellScript.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 WGqueuenpctext { 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()); 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(); 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(uint32 const /*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) { if (Battlefield* wg = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG)) // 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) && vehicleCreature->getFaction() == WintergraspFaction[wg->GetDefenderTeam()]) 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* GetAI(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 questId = i->second; QuestStatus status = player->GetQuestStatus(questId); if (status == QUEST_STATUS_COMPLETE) qm.AddMenuItem(questId, 4); else if (status == QUEST_STATUS_INCOMPLETE) qm.AddMenuItem(questId, 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, false); } 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; } }; enum WgTeleport { SPELL_WINTERGRASP_TELEPORT_TRIGGER = 54643, }; class spell_wintergrasp_defender_teleport : public SpellScriptLoader { public: spell_wintergrasp_defender_teleport() : SpellScriptLoader("spell_wintergrasp_defender_teleport") { } class spell_wintergrasp_defender_teleport_SpellScript : public SpellScript { PrepareSpellScript(spell_wintergrasp_defender_teleport_SpellScript); SpellCastResult CheckCast() { if (Battlefield* wg = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG)) if (Player* target = GetExplTargetUnit()->ToPlayer()) // check if we are in Wintergrasp at all, SotA uses same teleport spells if ((target->GetZoneId() == 4197 && target->GetTeamId() != wg->GetDefenderTeam()) || target->HasAura(SPELL_WINTERGRASP_TELEPORT_TRIGGER)) return SPELL_FAILED_BAD_TARGETS; return SPELL_CAST_OK; } void Register() { OnCheckCast += SpellCheckCastFn(spell_wintergrasp_defender_teleport_SpellScript::CheckCast); } }; SpellScript* GetSpellScript() const { return new spell_wintergrasp_defender_teleport_SpellScript(); } }; class spell_wintergrasp_defender_teleport_trigger : public SpellScriptLoader { public: spell_wintergrasp_defender_teleport_trigger() : SpellScriptLoader("spell_wintergrasp_defender_teleport_trigger") { } class spell_wintergrasp_defender_teleport_trigger_SpellScript : public SpellScript { PrepareSpellScript(spell_wintergrasp_defender_teleport_trigger_SpellScript); void HandleDummy(SpellEffIndex /*effindex*/) { if (Unit* target = GetHitUnit()) { WorldLocation loc; target->GetPosition(&loc); SetExplTargetDest(loc); } } void Register() { OnEffectHitTarget += SpellEffectFn(spell_wintergrasp_defender_teleport_trigger_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; SpellScript* GetSpellScript() const { return new spell_wintergrasp_defender_teleport_trigger_SpellScript(); } }; void AddSC_wintergrasp() { new npc_wg_queue(); new npc_wg_spirit_guide(); new npc_wg_demolisher_engineer(); new go_wg_vehicle_teleporter(); new npc_wg_quest_giver(); new spell_wintergrasp_force_building(); new spell_wintergrasp_grab_passenger(); new achievement_wg_didnt_stand_a_chance(); new spell_wintergrasp_defender_teleport(); new spell_wintergrasp_defender_teleport_trigger(); }