Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
zone_wintergrasp.cpp
Go to the documentation of this file.
1/*
2* This file is part of Project SkyFire https://www.projectskyfire.org.
3* See LICENSE.md file for Copyright information
4*/
5
6#include "BattlefieldMgr.h"
7#include "BattlefieldWG.h"
8#include "Battlefield.h"
9#include "ScriptSystem.h"
10#include "WorldSession.h"
11#include "ObjectMgr.h"
12#include "Vehicle.h"
13#include "GameObjectAI.h"
14#include "ScriptedCreature.h"
15#include "ScriptedGossip.h"
16#include "SpellScript.h"
17#include "Player.h"
18
19#define GOSSIP_HELLO_DEMO1 "Build catapult."
20#define GOSSIP_HELLO_DEMO2 "Build demolisher."
21#define GOSSIP_HELLO_DEMO3 "Build siege engine."
22#define GOSSIP_HELLO_DEMO4 "I cannot build more!"
23
34
50
60
91
93
101
103{
104 public:
105 npc_wg_demolisher_engineer() : CreatureScript("npc_wg_demolisher_engineer") { }
106
107 bool OnGossipHello(Player* player, Creature* creature) OVERRIDE
108 {
109 if (creature->IsQuestGiver())
110 player->PrepareQuestMenu(creature->GetGUID());
111
112 if (CanBuild(creature))
113 {
114 if (player->HasAura(SPELL_CORPORAL))
116 else if (player->HasAura(SPELL_LIEUTENANT))
117 {
121 }
122 }
123 else
125
126 player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
127 return true;
128 }
129
130 bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) OVERRIDE
131 {
132 player->CLOSE_GOSSIP_MENU();
133
134 if (CanBuild(creature))
135 {
136 switch (action - GOSSIP_ACTION_INFO_DEF)
137 {
138 case 0:
139 creature->CastSpell(player, SPELL_BUILD_CATAPULT_FORCE, true);
140 break;
141 case 1:
142 creature->CastSpell(player, SPELL_BUILD_DEMOLISHER_FORCE, true);
143 break;
144 case 2:
145 creature->CastSpell(player, player->GetTeamId() == TEAM_ALLIANCE ? SPELL_BUILD_SIEGE_VEHICLE_FORCE_ALLIANCE : SPELL_BUILD_SIEGE_VEHICLE_FORCE_HORDE, true);
146 break;
147 }
148 if (Creature* controlArms = creature->FindNearestCreature(NPC_WINTERGRASP_CONTROL_ARMS, 30.0f, true))
149 creature->CastSpell(controlArms, SPELL_ACTIVATE_CONTROL_ARMS, true);
150 }
151 return true;
152 }
153
154 private:
155 bool CanBuild(Creature* creature)
156 {
157 Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
158 if (!wintergrasp)
159 return false;
160
161 switch (creature->GetEntry())
162 {
167 default:
168 return false;
169 }
170 }
171};
172
174{
175 public:
176 npc_wg_spirit_guide() : CreatureScript("npc_wg_spirit_guide") { }
177
178 bool OnGossipHello(Player* player, Creature* creature) OVERRIDE
179 {
180 if (creature->IsQuestGiver())
181 player->PrepareQuestMenu(creature->GetGUID());
182
183 Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
184 if (!wintergrasp)
185 return true;
186
187 GraveyardVect graveyard = wintergrasp->GetGraveyardVector();
188 for (uint8 i = 0; i < graveyard.size(); i++)
189 if (graveyard[i]->GetControlTeamId() == player->GetTeamId())
190 player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, sObjectMgr->GetSkyFireStringForDBCLocale(((BfGraveyardWG*)graveyard[i])->GetTextId()), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + i);
191
192 player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
193 return true;
194 }
195
196 bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) OVERRIDE
197 {
198 player->CLOSE_GOSSIP_MENU();
199
200 Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
201 if (wintergrasp)
202 {
203 GraveyardVect gy = wintergrasp->GetGraveyardVector();
204 for (uint8 i = 0; i < gy.size(); i++)
205 if (action - GOSSIP_ACTION_INFO_DEF == i && gy[i]->GetControlTeamId() == player->GetTeamId())
206 if (WorldSafeLocsEntry const* safeLoc = sWorldSafeLocsStore.LookupEntry(gy[i]->GetGraveyardId()))
207 player->TeleportTo(safeLoc->map_id, safeLoc->x, safeLoc->y, safeLoc->z, 0);
208 }
209 return true;
210 }
211
213 {
214 npc_wg_spirit_guideAI(Creature* creature) : ScriptedAI(creature) { }
215
216 void UpdateAI(uint32 /*diff*/) OVERRIDE
217 {
218 if (!me->HasUnitState(UNIT_STATE_CASTING))
220 }
221 };
222
224 {
225 return new npc_wg_spirit_guideAI(creature);
226 }
227};
228
230{
231 public:
232 npc_wg_queue() : CreatureScript("npc_wg_queue") { }
233
234 bool OnGossipHello(Player* player, Creature* creature) OVERRIDE
235 {
236 if (creature->IsQuestGiver())
237 player->PrepareQuestMenu(creature->GetGUID());
238
239 Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
240 if (!wintergrasp)
241 return true;
242
243 if (wintergrasp->IsWarTime())
244 {
245 player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, sObjectMgr->GetSkyFireStringForDBCLocale(WG_NPCQUEUE_TEXTOPTION_JOIN), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
246 player->SEND_GOSSIP_MENU(wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_WAR : WG_NPCQUEUE_TEXT_A_WAR, creature->GetGUID());
247 }
248 else
249 {
250 uint32 timer = wintergrasp->GetTimer() / 1000;
251 player->SendUpdateWorldState(4354, time(NULL) + timer);
252 if (timer < 15 * MINUTE)
253 {
254 player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, sObjectMgr->GetSkyFireStringForDBCLocale(WG_NPCQUEUE_TEXTOPTION_JOIN), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
255 player->SEND_GOSSIP_MENU(wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_QUEUE : WG_NPCQUEUE_TEXT_A_QUEUE, creature->GetGUID());
256 }
257 else
258 player->SEND_GOSSIP_MENU(wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_NOWAR : WG_NPCQUEUE_TEXT_A_NOWAR, creature->GetGUID());
259 }
260 return true;
261 }
262
263 bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 /*action*/) OVERRIDE
264 {
265 player->CLOSE_GOSSIP_MENU();
266
267 Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
268 if (!wintergrasp)
269 return true;
270
271 if (wintergrasp->IsWarTime())
272 wintergrasp->InvitePlayerToWar(player);
273 else
274 {
275 uint32 timer = wintergrasp->GetTimer() / 1000;
276 if (timer < 15 * MINUTE)
277 wintergrasp->InvitePlayerToQueue(player);
278 }
279 return true;
280 }
281};
282
284{
285 public:
286 go_wg_vehicle_teleporter() : GameObjectScript("go_wg_vehicle_teleporter") { }
287
289 {
290 go_wg_vehicle_teleporterAI(GameObject* gameObject) : GameObjectAI(gameObject), _checkTimer(1000) { }
291
293 {
294 if (_checkTimer <= diff)
295 {
296 if (Battlefield* wg = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG))
297 // Tabulation madness in the hole!
298 for (uint8 i = 0; i < MAX_WINTERGRASP_VEHICLES; i++)
299 if (Creature* vehicleCreature = go->FindNearestCreature(vehiclesList[i], 3.0f, true))
300 if (!vehicleCreature->HasAura(SPELL_VEHICLE_TELEPORT) && vehicleCreature->getFaction() == WintergraspFaction[wg->GetDefenderTeam()])
301 if (Creature* teleportTrigger = vehicleCreature->FindNearestCreature(NPC_WORLD_TRIGGER_LARGE_AOI_NOT_IMMUNE_PC_NPC, 100.0f, true))
302 teleportTrigger->CastSpell(vehicleCreature, SPELL_VEHICLE_TELEPORT, true);
303
304 _checkTimer = 1000;
305 }
306 else _checkTimer -= diff;
307 }
308
309 private:
311 };
312
314 {
315 return new go_wg_vehicle_teleporterAI(go);
316 }
317};
318
320{
321 public:
322 npc_wg_quest_giver() : CreatureScript("npc_wg_quest_giver") { }
323
324 bool OnGossipHello(Player* player, Creature* creature) OVERRIDE
325 {
326 Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
327 if (!wintergrasp)
328 return true;
329
330 if (creature->IsVendor())
331 {
332 player->ADD_GOSSIP_ITEM_DB(Player::GetDefaultGossipMenuForSource(creature), 0, GOSSIP_SENDER_MAIN, GOSSIP_OPTION_VENDOR);
333 player->PlayerTalkClass->GetGossipMenu().AddGossipMenuItemData(0, 0, 0);
334 }
335
337
338 // Player::PrepareQuestMenu(guid)
339 if (creature->IsQuestGiver())
340 {
341 QuestRelationBounds objectQR = sObjectMgr->GetCreatureQuestRelationBounds(creature->GetEntry());
342 QuestRelationBounds objectQIR = sObjectMgr->GetCreatureQuestInvolvedRelationBounds(creature->GetEntry());
343
344 QuestMenu& qm = player->PlayerTalkClass->GetQuestMenu();
345 qm.ClearMenu();
346
347 for (QuestRelations::const_iterator i = objectQIR.first; i != objectQIR.second; ++i)
348 {
349 uint32 questId = i->second;
350 QuestStatus status = player->GetQuestStatus(questId);
351 if (status == QUEST_STATUS_COMPLETE)
352 qm.AddMenuItem(questId, 4);
353 else if (status == QUEST_STATUS_INCOMPLETE)
354 qm.AddMenuItem(questId, 4);
355 //else if (status == QUEST_STATUS_AVAILABLE)
356 // qm.AddMenuItem(quest_id, 2);
357 }
358
359 for (QuestRelations::const_iterator i = objectQR.first; i != objectQR.second; ++i)
360 {
361 uint32 questId = i->second;
362 Quest const* quest = sObjectMgr->GetQuestTemplate(questId);
363 if (!quest)
364 continue;
365
366 if (!player->CanTakeQuest(quest, false))
367 continue;
368
369 switch (questId)
370 {
371 // Horde attacker
378 if (wintergrasp->GetAttackerTeam() != TEAM_HORDE)
379 continue;
380 break;
381 // Horde defender
389 if (wintergrasp->GetDefenderTeam() != TEAM_HORDE)
390 continue;
391 break;
392 // Alliance attacker
398 if (wintergrasp->GetAttackerTeam() != TEAM_ALLIANCE)
399 continue;
400 break;
401 // Alliance defender
408 if (wintergrasp->GetDefenderTeam() != TEAM_ALLIANCE)
409 continue;
410 break;
411 default:
412 break;
413 }
414
415 if (quest->IsAutoComplete())
416 qm.AddMenuItem(questId, 4);
417 else if (player->GetQuestStatus(questId) == QUEST_STATUS_NONE)
418 qm.AddMenuItem(questId, 2);
419 }
420 }
421
422 player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
423 return true;
424 }
425};
426
463
490
492{
493public:
494 achievement_wg_didnt_stand_a_chance() : AchievementCriteriaScript("achievement_wg_didnt_stand_a_chance") { }
495
496 bool OnCheck(Player* source, Unit* target) OVERRIDE
497 {
498 if (!target)
499 return false;
500
501 if (Player* victim = target->ToPlayer())
502 {
503 if (!victim->IsMounted())
504 return false;
505
506 if (Vehicle* vehicle = source->GetVehicle())
507 if (vehicle->GetVehicleInfo()->m_ID == 244) // Wintergrasp Tower Cannon
508 return true;
509 }
510
511 return false;
512 }
513};
514
519
521{
522public:
523 spell_wintergrasp_defender_teleport() : SpellScriptLoader("spell_wintergrasp_defender_teleport") { }
524
526 {
528
530 {
531 if (Battlefield* wg = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG))
532 if (Player* target = GetExplTargetUnit()->ToPlayer())
533 // check if we are in Wintergrasp at all, SotA uses same teleport spells
534 if ((target->GetZoneId() == 4197 && target->GetTeamId() != wg->GetDefenderTeam()) || target->HasAura(SPELL_WINTERGRASP_TELEPORT_TRIGGER))
537 }
538
543 };
544
549};
550
581
std::vector< BfGraveyard * > GraveyardVect
Definition Battlefield.h:63
@ BATTLEFIELD_BATTLEID_WG
Definition Battlefield.h:26
#define sBattlefieldMgr
@ NPC_WINTERGRASP_SIEGE_ENGINE_HORDE
@ NPC_WINTERGRASP_CATAPULT
@ NPC_WINTERGRASP_DEMOLISHER
@ NPC_WINTERGRASP_SIEGE_ENGINE_ALLIANCE
uint32 const WintergraspFaction[]
@ SPELL_CORPORAL
@ SPELL_LIEUTENANT
@ BATTLEFIELD_WG_DATA_VEHICLE_A
@ BATTLEFIELD_WG_DATA_MAX_VEHICLE_A
@ BATTLEFIELD_WG_DATA_VEHICLE_H
@ BATTLEFIELD_WG_DATA_MAX_VEHICLE_H
@ MINUTE
Definition Common.h:119
DBCStorage< WorldSafeLocsEntry > sWorldSafeLocsStore(WorldSafeLocsEntryfmt)
std::uint8_t uint8
Definition Define.h:79
std::uint32_t uint32
Definition Define.h:77
#define OVERRIDE
Definition Define.h:60
@ GOSSIP_ICON_CHAT
Definition GossipDef.h:46
@ GOSSIP_OPTION_VENDOR
Definition GossipDef.h:23
std::pair< QuestRelations::const_iterator, QuestRelations::const_iterator > QuestRelationBounds
Definition ObjectMgr.h:457
#define sObjectMgr
Definition ObjectMgr.h:1617
QuestStatus
Definition QuestDef.h:85
@ QUEST_STATUS_INCOMPLETE
Definition QuestDef.h:89
@ QUEST_STATUS_NONE
Definition QuestDef.h:86
@ QUEST_STATUS_COMPLETE
Definition QuestDef.h:87
@ GOSSIP_SENDER_MAIN
@ GOSSIP_ACTION_INFO_DEF
SpellEffIndex
@ EFFECT_0
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_SCRIPT_EFFECT
@ TEAM_ALLIANCE
@ TEAM_HORDE
SpellCastResult
#define sSpellMgr
Definition SpellMgr.h:744
#define SpellCheckCastFn(F)
#define SpellEffectFn(F, I, N)
@ UNIT_STATE_CASTING
Definition Unit.h:527
CreatureIds
AchievementCriteriaScript(const char *name)
bool IsWarTime() const
Return true if battle is start, false if battle is not started.
void InvitePlayerToQueue(Player *player)
void InvitePlayerToWar(Player *player)
TeamId GetAttackerTeam() const
TeamId GetDefenderTeam() const
virtual uint32 GetData(uint32 dataId) const
uint32 GetTimer() const
GraveyardVect GetGraveyardVector()
CreatureScript(const char *name)
GameObject *const go
GameObjectAI(GameObject *g)
GameObjectScript(const char *name)
Player * ToPlayer()
Definition Object.h:204
uint32 GetEntry() const
Definition Object.h:125
static uint32 GetDefaultGossipMenuForSource(WorldObject *source)
Definition Player.cpp:12032
bool IsAutoComplete() const
Definition QuestDef.cpp:199
void ClearMenu()
void AddMenuItem(uint32 QuestId, uint8 Icon)
Unit * GetExplTargetUnit()
HookList< CheckCastHandler > OnCheckCast
Player * GetHitPlayer()
void SetExplTargetDest(WorldLocation &loc)
void PreventHitDefaultEffect(SpellEffIndex effIndex)
HookList< EffectHandler > OnEffectHitTarget
Unit * GetHitUnit()
int32 GetEffectValue()
Unit * GetCaster()
SpellScriptLoader(const char *name)
void DoCast(uint32 spellId)
Definition UnitAI.cpp:110
Definition Unit.h:1367
void CastSpell(SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=NULL, AuraEffect const *triggeredByAura=NULL, uint64 originalCaster=0)
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
Definition Object.cpp:2801
bool OnCheck(Player *source, Unit *target) OVERRIDE
GameObjectAI * GetAI(GameObject *go) const OVERRIDE
bool OnGossipHello(Player *player, Creature *creature) OVERRIDE
bool OnGossipSelect(Player *player, Creature *creature, uint32, uint32 action) OVERRIDE
bool CanBuild(Creature *creature)
bool OnGossipHello(Player *player, Creature *creature) OVERRIDE
bool OnGossipSelect(Player *player, Creature *, uint32, uint32) OVERRIDE
bool OnGossipHello(Player *player, Creature *creature) OVERRIDE
bool OnGossipHello(Player *player, Creature *creature) OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
bool OnGossipSelect(Player *player, Creature *, uint32, uint32 action) OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
QuestIds
Definition stratholme.h:60
void GetPosition(float &x, float &y) const
Definition Object.h:333
Creature * me
ScriptedAI(Creature *creature)
void UpdateAI(uint32) OVERRIDE
== Triggered Actions Requested ==================
uint32 const vehiclesList[MAX_WINTERGRASP_VEHICLES]
#define GOSSIP_HELLO_DEMO4
#define GOSSIP_HELLO_DEMO2
@ SPELL_WINTERGRASP_TELEPORT_TRIGGER
WGqueuenpctext
@ WG_NPCQUEUE_TEXT_H_WAR
@ WG_NPCQUEUE_TEXTOPTION_JOIN
@ WG_NPCQUEUE_TEXT_H_NOWAR
@ WG_NPCQUEUE_TEXT_A_WAR
@ WG_NPCQUEUE_TEXT_A_QUEUE
@ WG_NPCQUEUE_TEXT_H_QUEUE
@ WG_NPCQUEUE_TEXT_A_NOWAR
@ SPELL_BUILD_DEMOLISHER_FORCE
@ SPELL_VEHICLE_TELEPORT
@ SPELL_RIDE_WG_VEHICLE
@ SPELL_ACTIVATE_CONTROL_ARMS
@ SPELL_CHANNEL_SPIRIT_HEAL
@ SPELL_BUILD_SIEGE_VEHICLE_FORCE_ALLIANCE
@ SPELL_BUILD_SIEGE_VEHICLE_FORCE_HORDE
@ SPELL_BUILD_CATAPULT_FORCE
uint8 const MAX_WINTERGRASP_VEHICLES
@ QUEST_HEALING_WITH_ROSES_HORDE_DEF
@ QUEST_DEFEND_THE_SIEGE_HORDE_ATT
@ QUEST_SHOUTHERN_SABOTAGE_ALLIANCE_DEF
@ QUEST_SLAY_THEM_ALL_HORDE_DEF
@ QUEST_FUELING_THE_DEMOLISHERS_HORDE_DEF
@ QUEST_A_RARE_HERB_ALLIANCE_DEF
@ QUEST_FUELING_THE_DEMOLISHERS_HORDE_ATT
@ QUEST_SLAY_THEM_ALL_HORDE_ATT
@ QUEST_STOP_THE_SIEGE_HORDE_DEF
@ QUEST_WARDING_THE_WALLS_HORDE_DEF
@ QUEST_BONES_AND_ARROWS_ALLIANCE_DEF
@ QUEST_A_RARE_HERB_ALLIANCE_ATT
@ QUEST_HEALING_WITH_ROSES_HORDE_ATT
@ QUEST_BONES_AND_ARROWS_ALLIANCE_ATT
@ QUEST_NO_MERCY_FOR_THE_MERCILESS_ALLIANCE_ATT
@ QUEST_STOP_THE_SIEGE_ALLIANCE_DEF
@ QUEST_NO_MERCY_FOR_THE_MERCILESS_ALLIANCE_DEF
@ QUEST_WARDING_THE_WARRIORS_ALLIANCE_ATT
@ QUEST_TOPPLING_THE_TOWERS_HORDE_DEF
@ QUEST_BONES_AND_ARROWS_HORDE_DEF
@ QUEST_WARDING_THE_WARRIORS_ALLIANCE_DEF
@ QUEST_BONES_AND_ARROWS_HORDE_ATT
@ QUEST_DEFEND_THE_SIEGE_ALLIANCE_ATT
@ QUEST_JINXING_THE_WALLS_HORDE_ATT
@ NPC_GOBLIN_MECHANIC
@ NPC_WINTERGRASP_CONTROL_ARMS
@ NPC_WORLD_TRIGGER_LARGE_AOI_NOT_IMMUNE_PC_NPC
@ NPC_GNOMISH_ENGINEER
void AddSC_wintergrasp()
#define GOSSIP_HELLO_DEMO3
#define GOSSIP_HELLO_DEMO1