1 | /* Copyright (C) 2006 - 2008 TrinityScript <https://scriptdev2.svn.sourceforge.net/> |
---|
2 | * This program is free software licensed under GPL version 2 |
---|
3 | * Please see the included DOCS/LICENSE.TXT for more information */ |
---|
4 | |
---|
5 | #include "precompiled.h" |
---|
6 | #include "Config/Config.h" |
---|
7 | #include "Database/DatabaseEnv.h" |
---|
8 | #include "Database/DBCStores.h" |
---|
9 | #include "ObjectMgr.h" |
---|
10 | #include "ProgressBar.h" |
---|
11 | #include "scripts/creature/mob_event_ai.h" |
---|
12 | |
---|
13 | #define _FULLVERSION "TrinityScript" |
---|
14 | |
---|
15 | #ifndef _TRINITY_SCRIPT_CONFIG |
---|
16 | # define _TRINITY_SCRIPT_CONFIG "trinitycore.conf" |
---|
17 | #endif _TRINITY_SCRIPT_CONFIG |
---|
18 | |
---|
19 | //*** Global data *** |
---|
20 | int nrscripts; |
---|
21 | Script *m_scripts[MAX_SCRIPTS]; |
---|
22 | |
---|
23 | DatabaseType TScriptDB; |
---|
24 | Config TScriptConfig; |
---|
25 | uint32 Locale; |
---|
26 | |
---|
27 | // String text additional data, used in TextMap |
---|
28 | struct StringTextData |
---|
29 | { |
---|
30 | uint32 SoundId; |
---|
31 | uint8 Type; |
---|
32 | uint32 Language; |
---|
33 | }; |
---|
34 | |
---|
35 | // Enums used by StringTextData::Type |
---|
36 | enum ChatType |
---|
37 | { |
---|
38 | CHAT_TYPE_SAY = 0, |
---|
39 | CHAT_TYPE_YELL = 1, |
---|
40 | CHAT_TYPE_TEXT_EMOTE = 2, |
---|
41 | CHAT_TYPE_BOSS_EMOTE = 3, |
---|
42 | CHAT_TYPE_WHISPER = 4, |
---|
43 | CHAT_TYPE_BOSS_WHISPER = 5, |
---|
44 | }; |
---|
45 | |
---|
46 | #define TEXT_SOURCE_RANGE -100000 //the amount of entries each text source has available |
---|
47 | |
---|
48 | // Text Maps |
---|
49 | HM_NAMESPACE::hash_map<uint32, std::string> EventAI_Text_Map; |
---|
50 | HM_NAMESPACE::hash_map<int32, StringTextData> TextMap; |
---|
51 | |
---|
52 | // Localized Text structure for storing locales (for EAI and SD2 scripts). |
---|
53 | struct Localized_Text |
---|
54 | { |
---|
55 | std::string locale_1; |
---|
56 | std::string locale_2; |
---|
57 | std::string locale_3; |
---|
58 | std::string locale_4; |
---|
59 | std::string locale_5; |
---|
60 | std::string locale_6; |
---|
61 | std::string locale_7; |
---|
62 | std::string locale_8; |
---|
63 | }; |
---|
64 | //*** End Global data *** |
---|
65 | |
---|
66 | //*** EventAI data *** |
---|
67 | HM_NAMESPACE::hash_map<uint32, Localized_Text> EventAI_LocalizedTextMap; |
---|
68 | |
---|
69 | //Event AI structure. Used exclusivly by mob_event_ai.cpp (60 bytes each) |
---|
70 | std::list<EventAI_Event> EventAI_Event_List; |
---|
71 | |
---|
72 | //Event AI summon structure. Used exclusivly by mob_event_ai.cpp. |
---|
73 | HM_NAMESPACE::hash_map<uint32, EventAI_Summon> EventAI_Summon_Map; |
---|
74 | |
---|
75 | //Event AI error prevention structure. Used at runtime to prevent error log spam of same creature id. |
---|
76 | //HM_NAMESPACE::hash_map<uint32, EventAI_CreatureError> EventAI_CreatureErrorPreventionList; |
---|
77 | |
---|
78 | uint32 EAI_ErrorLevel; |
---|
79 | //*** End EventAI data *** |
---|
80 | |
---|
81 | void FillSpellSummary(); |
---|
82 | |
---|
83 | // -- Scripts to be added -- |
---|
84 | |
---|
85 | // -- Areatrigger -- |
---|
86 | extern void AddSC_areatrigger_scripts(); |
---|
87 | |
---|
88 | // -- Boss -- |
---|
89 | extern void AddSC_boss_emeriss(); |
---|
90 | extern void AddSC_boss_taerar(); |
---|
91 | extern void AddSC_boss_ysondre(); |
---|
92 | |
---|
93 | // -- Creature -- |
---|
94 | extern void AddSC_mob_event(); |
---|
95 | extern void AddSC_generic_creature(); |
---|
96 | |
---|
97 | // -- Custom -- |
---|
98 | extern void AddSC_custom_example(); |
---|
99 | extern void AddSC_custom_gossip_codebox(); |
---|
100 | extern void AddSC_test(); |
---|
101 | |
---|
102 | // -- GO -- |
---|
103 | extern void AddSC_go_scripts(); |
---|
104 | |
---|
105 | // -- Guard -- |
---|
106 | extern void AddSC_guards(); |
---|
107 | |
---|
108 | // -- Honor -- |
---|
109 | |
---|
110 | // -- Item -- |
---|
111 | extern void AddSC_item_scripts(); |
---|
112 | extern void AddSC_item_test(); |
---|
113 | |
---|
114 | // -- NPC -- |
---|
115 | extern void AddSC_npc_professions(); |
---|
116 | extern void AddSC_npcs_special(); |
---|
117 | |
---|
118 | // -- Servers -- |
---|
119 | |
---|
120 | //-------------------- |
---|
121 | //------ ZONE -------- |
---|
122 | |
---|
123 | //Alterac Mountains |
---|
124 | extern void AddSC_alterac_mountains(); |
---|
125 | |
---|
126 | //Arathi Highlands |
---|
127 | //Ashenvale Forest |
---|
128 | //Aunchindoun |
---|
129 | //--Auchenai Crypts |
---|
130 | extern void AddSC_boss_exarch_maladaar(); |
---|
131 | //--Mana Tombs |
---|
132 | extern void AddSC_boss_nexusprince_shaffar(); |
---|
133 | extern void AddSC_boss_pandemonius(); |
---|
134 | |
---|
135 | //--Sekketh Halls |
---|
136 | extern void AddSC_boss_darkweaver_syth(); |
---|
137 | extern void AddSC_boss_talon_king_ikiss(); |
---|
138 | extern void AddSC_instance_sethekk_halls(); |
---|
139 | |
---|
140 | //--Shadow Labyrinth |
---|
141 | extern void AddSC_boss_ambassador_hellmaw(); |
---|
142 | extern void AddSC_boss_blackheart_the_inciter(); |
---|
143 | extern void AddSC_boss_grandmaster_vorpil(); |
---|
144 | extern void AddSC_boss_murmur(); |
---|
145 | extern void AddSC_instance_shadow_labyrinth(); |
---|
146 | |
---|
147 | //Azshara |
---|
148 | extern void AddSC_boss_azuregos(); |
---|
149 | extern void AddSC_azshara(); |
---|
150 | |
---|
151 | //Azuremyst Isle |
---|
152 | extern void AddSC_azuremyst_isle(); |
---|
153 | |
---|
154 | //Badlands |
---|
155 | //Barrens |
---|
156 | extern void AddSC_the_barrens(); |
---|
157 | |
---|
158 | //Black Temple |
---|
159 | extern void AddSC_black_temple(); |
---|
160 | extern void AddSC_boss_illidan(); |
---|
161 | extern void AddSC_boss_shade_of_akama(); |
---|
162 | extern void AddSC_boss_supremus(); |
---|
163 | extern void AddSC_boss_gurtogg_bloodboil(); |
---|
164 | extern void AddSC_boss_mother_shahraz(); |
---|
165 | extern void AddSC_boss_reliquary_of_souls(); |
---|
166 | extern void AddSC_boss_teron_gorefiend(); |
---|
167 | extern void AddSC_boss_najentus(); |
---|
168 | extern void AddSC_boss_illidari_council(); |
---|
169 | extern void AddSC_instance_black_temple(); |
---|
170 | |
---|
171 | //Blackfathom Depths |
---|
172 | //Blackrock Depths |
---|
173 | extern void AddSC_blackrock_depths(); |
---|
174 | extern void AddSC_boss_ambassador_flamelash(); |
---|
175 | extern void AddSC_boss_angerrel(); |
---|
176 | extern void AddSC_boss_anubshiah(); |
---|
177 | extern void AddSC_boss_doomrel(); |
---|
178 | extern void AddSC_boss_doperel(); |
---|
179 | extern void AddSC_boss_draganthaurissan(); |
---|
180 | extern void AddSC_boss_general_angerforge(); |
---|
181 | extern void AddSC_boss_gloomrel(); |
---|
182 | extern void AddSC_boss_gorosh_the_dervish(); |
---|
183 | extern void AddSC_boss_grizzle(); |
---|
184 | extern void AddSC_boss_haterel(); |
---|
185 | extern void AddSC_boss_high_interrogator_gerstahn(); |
---|
186 | extern void AddSC_boss_magmus(); |
---|
187 | extern void AddSC_boss_moira_bronzebeard(); |
---|
188 | extern void AddSC_boss_seethrel(); |
---|
189 | extern void AddSC_boss_vilerel(); |
---|
190 | |
---|
191 | //Blackrock Spire |
---|
192 | extern void AddSC_boss_drakkisath(); |
---|
193 | extern void AddSC_boss_halycon(); |
---|
194 | extern void AddSC_boss_highlordomokk(); |
---|
195 | extern void AddSC_boss_mothersmolderweb(); |
---|
196 | extern void AddSC_boss_overlordwyrmthalak(); |
---|
197 | extern void AddSC_boss_shadowvosh(); |
---|
198 | extern void AddSC_boss_thebeast(); |
---|
199 | extern void AddSC_boss_warmastervoone(); |
---|
200 | extern void AddSC_boss_quatermasterzigris(); |
---|
201 | extern void AddSC_boss_pyroguard_emberseer(); |
---|
202 | extern void AddSC_boss_gyth(); |
---|
203 | extern void AddSC_boss_rend_blackhand(); |
---|
204 | |
---|
205 | //Blackwing lair |
---|
206 | extern void AddSC_boss_razorgore(); |
---|
207 | extern void AddSC_boss_vael(); |
---|
208 | extern void AddSC_boss_broodlord(); |
---|
209 | extern void AddSC_boss_firemaw(); |
---|
210 | extern void AddSC_boss_ebonroc(); |
---|
211 | extern void AddSC_boss_flamegor(); |
---|
212 | extern void AddSC_boss_chromaggus(); |
---|
213 | extern void AddSC_boss_nefarian(); |
---|
214 | extern void AddSC_boss_victor_nefarius(); |
---|
215 | |
---|
216 | //Blade's Edge Mountains |
---|
217 | extern void AddSC_blades_edge_mountains(); |
---|
218 | |
---|
219 | //Blasted lands |
---|
220 | extern void AddSC_boss_kruul(); |
---|
221 | extern void AddSC_blasted_lands(); |
---|
222 | |
---|
223 | //Bloodmyst Isle |
---|
224 | extern void AddSC_bloodmyst_isle(); |
---|
225 | |
---|
226 | //Burning steppes |
---|
227 | extern void AddSC_burning_steppes(); |
---|
228 | |
---|
229 | //Caverns of Time |
---|
230 | //--Battle for Mt. Hyjal |
---|
231 | extern void AddSC_hyjal(); |
---|
232 | extern void AddSC_boss_archimonde(); |
---|
233 | extern void AddSC_instance_mount_hyjal(); |
---|
234 | |
---|
235 | //--Old Hillsbrad |
---|
236 | extern void AddSC_boss_captain_skarloc(); |
---|
237 | extern void AddSC_boss_epoch_hunter(); |
---|
238 | extern void AddSC_boss_lieutenant_drake(); |
---|
239 | extern void AddSC_instance_old_hillsbrad(); |
---|
240 | extern void AddSC_old_hillsbrad(); |
---|
241 | |
---|
242 | //--The Dark Portal |
---|
243 | extern void AddSC_boss_aeonus(); |
---|
244 | extern void AddSC_boss_chrono_lord_deja(); |
---|
245 | extern void AddSC_boss_temporus(); |
---|
246 | |
---|
247 | //Coilfang Resevoir |
---|
248 | //--Serpent Shrine Cavern |
---|
249 | extern void AddSC_boss_fathomlord_karathress(); |
---|
250 | extern void AddSC_boss_hydross_the_unstable(); |
---|
251 | extern void AddSC_boss_lady_vashj(); |
---|
252 | extern void AddSC_boss_leotheras_the_blind(); |
---|
253 | extern void AddSC_boss_morogrim_tidewalker(); |
---|
254 | extern void AddSC_instance_serpentshrine_cavern(); |
---|
255 | |
---|
256 | //--Slave Pens |
---|
257 | |
---|
258 | //--Steam Vault |
---|
259 | extern void AddSC_boss_hydromancer_thespia(); |
---|
260 | extern void AddSC_boss_mekgineer_steamrigger(); |
---|
261 | extern void AddSC_boss_warlord_kalithresh(); |
---|
262 | extern void AddSC_instance_steam_vault(); |
---|
263 | |
---|
264 | //--Underbog |
---|
265 | extern void AddSC_boss_hungarfen(); |
---|
266 | |
---|
267 | //Darkshore |
---|
268 | //Darnassus |
---|
269 | //Deadmines |
---|
270 | //Deadwind pass |
---|
271 | //Desolace |
---|
272 | //Dire Maul |
---|
273 | //Dun Morogh |
---|
274 | extern void AddSC_dun_morogh(); |
---|
275 | |
---|
276 | //Durotar |
---|
277 | //Duskwood |
---|
278 | //Dustwallow marsh |
---|
279 | extern void AddSC_dustwallow_marsh(); |
---|
280 | |
---|
281 | //Eversong Woods |
---|
282 | extern void AddSC_eversong_woods(); |
---|
283 | |
---|
284 | //Exodar |
---|
285 | //Eastern Plaguelands |
---|
286 | extern void AddSC_eastern_plaguelands(); |
---|
287 | |
---|
288 | //Elwynn Forest |
---|
289 | extern void AddSC_elwynn_forest(); |
---|
290 | |
---|
291 | //Felwood |
---|
292 | extern void AddSC_felwood(); |
---|
293 | |
---|
294 | //Feralas |
---|
295 | extern void AddSC_feralas(); |
---|
296 | |
---|
297 | //Ghostlands |
---|
298 | extern void AddSC_ghostlands(); |
---|
299 | |
---|
300 | //Gnomeregan |
---|
301 | //Gruul's Lair |
---|
302 | extern void AddSC_boss_gruul(); |
---|
303 | extern void AddSC_boss_high_king_maulgar(); |
---|
304 | extern void AddSC_instance_gruuls_lair(); |
---|
305 | |
---|
306 | //Hellfire Citadel |
---|
307 | //--Blood Furnace |
---|
308 | extern void AddSC_boss_broggok(); |
---|
309 | extern void AddSC_boss_kelidan_the_breaker(); |
---|
310 | extern void AddSC_boss_the_maker(); |
---|
311 | |
---|
312 | //--Magtheridon's Lair |
---|
313 | extern void AddSC_boss_magtheridon(); |
---|
314 | extern void AddSC_instance_magtheridons_lair(); |
---|
315 | |
---|
316 | //--Shattered Halls |
---|
317 | extern void AddSC_boss_grand_warlock_nethekurse(); |
---|
318 | extern void AddSC_boss_warbringer_omrogg(); |
---|
319 | extern void AddSC_instance_shattered_halls(); |
---|
320 | |
---|
321 | //--Ramparts |
---|
322 | extern void AddSC_boss_watchkeeper_gargolmar(); |
---|
323 | extern void AddSC_boss_omor_the_unscarred(); |
---|
324 | |
---|
325 | //Hellfire Peninsula |
---|
326 | extern void AddSC_boss_doomlordkazzak(); |
---|
327 | extern void AddSC_hellfire_peninsula(); |
---|
328 | |
---|
329 | //Hillsbrad Foothills |
---|
330 | //Hinterlands |
---|
331 | //Ironforge |
---|
332 | extern void AddSC_ironforge(); |
---|
333 | |
---|
334 | //Isle of Quel'Danas |
---|
335 | extern void AddSC_isle_of_queldanas(); |
---|
336 | |
---|
337 | //Karazhan |
---|
338 | extern void AddSC_boss_attumen(); |
---|
339 | extern void AddSC_boss_curator(); |
---|
340 | extern void AddSC_boss_maiden_of_virtue(); |
---|
341 | extern void AddSC_boss_shade_of_aran(); |
---|
342 | extern void AddSC_boss_malchezaar(); |
---|
343 | extern void AddSC_boss_terestian_illhoof(); |
---|
344 | extern void AddSC_netherspite_infernal(); |
---|
345 | extern void AddSC_boss_moroes(); |
---|
346 | extern void AddSC_bosses_opera(); |
---|
347 | extern void AddSC_instance_karazhan(); |
---|
348 | extern void AddSC_karazhan(); |
---|
349 | |
---|
350 | //Loch Modan |
---|
351 | extern void AddSC_loch_modan(); |
---|
352 | |
---|
353 | //Lower Blackrock Spire |
---|
354 | |
---|
355 | // Magister's Terrace |
---|
356 | extern void AddSC_boss_felblood_kaelthas(); |
---|
357 | extern void AddSC_boss_selin_fireheart(); |
---|
358 | extern void AddSC_boss_vexallus(); |
---|
359 | extern void AddSC_boss_priestess_delrissa(); |
---|
360 | extern void AddSC_instance_magisters_terrace(); |
---|
361 | |
---|
362 | //Maraudon |
---|
363 | extern void AddSC_boss_celebras_the_cursed(); |
---|
364 | extern void AddSC_boss_landslide(); |
---|
365 | extern void AddSC_boss_noxxion(); |
---|
366 | extern void AddSC_boss_ptheradras(); |
---|
367 | |
---|
368 | //Molten core |
---|
369 | extern void AddSC_boss_lucifron(); |
---|
370 | extern void AddSC_boss_magmadar(); |
---|
371 | extern void AddSC_boss_gehennas(); |
---|
372 | extern void AddSC_boss_garr(); |
---|
373 | extern void AddSC_boss_baron_geddon(); |
---|
374 | extern void AddSC_boss_shazzrah(); |
---|
375 | extern void AddSC_boss_golemagg(); |
---|
376 | extern void AddSC_boss_sulfuron(); |
---|
377 | extern void AddSC_boss_majordomo(); |
---|
378 | extern void AddSC_boss_ragnaros(); |
---|
379 | extern void AddSC_instance_molten_core(); |
---|
380 | extern void AddSC_molten_core(); |
---|
381 | |
---|
382 | //Moonglade |
---|
383 | extern void AddSC_moonglade(); |
---|
384 | |
---|
385 | //Mulgore |
---|
386 | extern void AddSC_mulgore(); |
---|
387 | |
---|
388 | //Nagrand |
---|
389 | extern void AddSC_nagrand(); |
---|
390 | |
---|
391 | //Naxxramas |
---|
392 | extern void AddSC_boss_anubrekhan(); |
---|
393 | extern void AddSC_boss_maexxna(); |
---|
394 | extern void AddSC_boss_patchwerk(); |
---|
395 | extern void AddSC_boss_razuvious(); |
---|
396 | extern void AddSC_boss_highlord_mograine(); |
---|
397 | extern void AddSC_boss_lady_blaumeux(); |
---|
398 | extern void AddSC_boss_sir_zeliek(); |
---|
399 | extern void AddSC_boss_thane_korthazz(); |
---|
400 | extern void AddSC_boss_kelthuzad(); |
---|
401 | extern void AddSC_boss_faerlina(); |
---|
402 | extern void AddSC_boss_loatheb(); |
---|
403 | extern void AddSC_boss_noth(); |
---|
404 | extern void AddSC_boss_gluth(); |
---|
405 | extern void AddSC_boss_sapphiron(); |
---|
406 | |
---|
407 | //Netherstorm |
---|
408 | extern void AddSC_netherstorm(); |
---|
409 | |
---|
410 | //Onyxia's Lair |
---|
411 | extern void AddSC_boss_onyxia(); |
---|
412 | |
---|
413 | //Orgrimmar |
---|
414 | extern void AddSC_orgrimmar(); |
---|
415 | |
---|
416 | //Ragefire Chasm |
---|
417 | //Razorfen Downs |
---|
418 | extern void AddSC_boss_amnennar_the_coldbringer(); |
---|
419 | |
---|
420 | //Redridge Mountains |
---|
421 | //Ruins of Ahn'Qiraj |
---|
422 | //Scarlet Monastery |
---|
423 | extern void AddSC_boss_arcanist_doan(); |
---|
424 | extern void AddSC_boss_azshir_the_sleepless(); |
---|
425 | extern void AddSC_boss_bloodmage_thalnos(); |
---|
426 | extern void AddSC_boss_herod(); |
---|
427 | extern void AddSC_boss_high_inquisitor_fairbanks(); |
---|
428 | extern void AddSC_boss_high_inquisitor_whitemane(); |
---|
429 | extern void AddSC_boss_houndmaster_loksey(); |
---|
430 | extern void AddSC_boss_interrogator_vishas(); |
---|
431 | extern void AddSC_boss_scarlet_commander_mograine(); |
---|
432 | extern void AddSC_boss_scorn(); |
---|
433 | |
---|
434 | //Scholomance |
---|
435 | extern void AddSC_boss_darkmaster_gandling(); |
---|
436 | extern void AddSC_boss_death_knight_darkreaver(); |
---|
437 | extern void AddSC_boss_theolenkrastinov(); |
---|
438 | extern void AddSC_boss_illuciabarov(); |
---|
439 | extern void AddSC_boss_instructormalicia(); |
---|
440 | extern void AddSC_boss_jandicebarov(); |
---|
441 | extern void AddSC_boss_kormok(); |
---|
442 | extern void AddSC_boss_lordalexeibarov(); |
---|
443 | extern void AddSC_boss_lorekeeperpolkelt(); |
---|
444 | extern void AddSC_boss_rasfrost(); |
---|
445 | extern void AddSC_boss_theravenian(); |
---|
446 | extern void AddSC_boss_vectus(); |
---|
447 | extern void AddSC_instance_scholomance(); |
---|
448 | |
---|
449 | //Searing gorge |
---|
450 | extern void AddSC_searing_gorge(); |
---|
451 | |
---|
452 | //Shadowfang keep |
---|
453 | extern void AddSC_shadowfang_keep(); |
---|
454 | extern void AddSC_instance_shadowfang_keep(); |
---|
455 | |
---|
456 | //Shadowmoon Valley |
---|
457 | extern void AddSC_boss_doomwalker(); |
---|
458 | extern void AddSC_shadowmoon_valley(); |
---|
459 | |
---|
460 | //Shattrath |
---|
461 | extern void AddSC_shattrath_city(); |
---|
462 | |
---|
463 | //Silithus |
---|
464 | extern void AddSC_silithus(); |
---|
465 | |
---|
466 | //Silvermoon |
---|
467 | extern void AddSC_silvermoon_city(); |
---|
468 | |
---|
469 | //Silverpine forest |
---|
470 | extern void AddSC_silverpine_forest(); |
---|
471 | |
---|
472 | //Stockade |
---|
473 | //Stonetalon mountains |
---|
474 | extern void AddSC_stonetalon_mountains(); |
---|
475 | |
---|
476 | //Stormwind City |
---|
477 | extern void AddSC_stormwind_city(); |
---|
478 | |
---|
479 | //Stranglethorn Vale |
---|
480 | extern void AddSC_stranglethorn_vale(); |
---|
481 | |
---|
482 | //Stratholme |
---|
483 | extern void AddSC_boss_magistrate_barthilas(); |
---|
484 | extern void AddSC_boss_maleki_the_pallid(); |
---|
485 | extern void AddSC_boss_nerubenkan(); |
---|
486 | extern void AddSC_boss_cannon_master_willey(); |
---|
487 | extern void AddSC_boss_baroness_anastari(); |
---|
488 | extern void AddSC_boss_ramstein_the_gorger(); |
---|
489 | extern void AddSC_boss_timmy_the_cruel(); |
---|
490 | extern void AddSC_boss_postmaster_malown(); |
---|
491 | extern void AddSC_boss_baron_rivendare(); |
---|
492 | extern void AddSC_boss_dathrohan_balnazzar(); |
---|
493 | extern void AddSC_boss_order_of_silver_hand(); |
---|
494 | extern void AddSC_instance_stratholme(); |
---|
495 | extern void AddSC_stratholme(); |
---|
496 | |
---|
497 | //Sunken Temple |
---|
498 | //Tanaris |
---|
499 | extern void AddSC_tanaris(); |
---|
500 | |
---|
501 | //Teldrassil |
---|
502 | //Tempest Keep |
---|
503 | //--Arcatraz |
---|
504 | extern void AddSC_arcatraz(); |
---|
505 | extern void AddSC_boss_harbinger_skyriss(); |
---|
506 | extern void AddSC_instance_arcatraz(); |
---|
507 | |
---|
508 | //--Botanica |
---|
509 | extern void AddSC_boss_high_botanist_freywinn(); |
---|
510 | extern void AddSC_boss_laj(); |
---|
511 | extern void AddSC_boss_warp_splinter(); |
---|
512 | |
---|
513 | //--The Eye |
---|
514 | extern void AddSC_boss_kaelthas(); |
---|
515 | extern void AddSC_boss_void_reaver(); |
---|
516 | extern void AddSC_boss_high_astromancer_solarian(); |
---|
517 | extern void AddSC_instance_the_eye(); |
---|
518 | extern void AddSC_the_eye(); |
---|
519 | |
---|
520 | //--The Mechanar |
---|
521 | extern void AddSC_boss_gatewatcher_iron_hand(); |
---|
522 | extern void AddSC_boss_nethermancer_sepethrea(); |
---|
523 | |
---|
524 | //Temple of ahn'qiraj |
---|
525 | extern void AddSC_boss_cthun(); |
---|
526 | extern void AddSC_boss_fankriss(); |
---|
527 | extern void AddSC_boss_huhuran(); |
---|
528 | extern void AddSC_bug_trio(); |
---|
529 | extern void AddSC_boss_sartura(); |
---|
530 | extern void AddSC_boss_skeram(); |
---|
531 | extern void AddSC_boss_twinemperors(); |
---|
532 | extern void AddSC_mob_anubisath_sentinel(); |
---|
533 | extern void AddSC_instance_temple_of_ahnqiraj(); |
---|
534 | |
---|
535 | //Terokkar Forest |
---|
536 | extern void AddSC_terokkar_forest(); |
---|
537 | |
---|
538 | //Thousand Needles |
---|
539 | //Thunder Bluff |
---|
540 | extern void AddSC_thunder_bluff(); |
---|
541 | |
---|
542 | //Tirisfal Glades |
---|
543 | extern void AddSC_tirisfal_glades(); |
---|
544 | |
---|
545 | //Uldaman |
---|
546 | extern void AddSC_boss_ironaya(); |
---|
547 | extern void AddSC_uldaman(); |
---|
548 | |
---|
549 | //Undercity |
---|
550 | extern void AddSC_undercity(); |
---|
551 | |
---|
552 | //Un'Goro Crater |
---|
553 | //Upper blackrock spire |
---|
554 | //Wailing caverns |
---|
555 | |
---|
556 | //Western plaguelands |
---|
557 | extern void AddSC_western_plaguelands(); |
---|
558 | |
---|
559 | //Westfall |
---|
560 | //Wetlands |
---|
561 | //Winterspring |
---|
562 | extern void AddSC_winterspring(); |
---|
563 | |
---|
564 | //Zangarmarsh |
---|
565 | extern void AddSC_zangarmarsh(); |
---|
566 | |
---|
567 | //Zul'Farrak |
---|
568 | //Zul'Gurub |
---|
569 | extern void AddSC_boss_jeklik(); |
---|
570 | extern void AddSC_boss_venoxis(); |
---|
571 | extern void AddSC_boss_marli(); |
---|
572 | extern void AddSC_boss_mandokir(); |
---|
573 | extern void AddSC_boss_gahzranka(); |
---|
574 | extern void AddSC_boss_thekal(); |
---|
575 | extern void AddSC_boss_arlokk(); |
---|
576 | extern void AddSC_boss_jindo(); |
---|
577 | extern void AddSC_boss_hakkar(); |
---|
578 | extern void AddSC_boss_grilek(); |
---|
579 | extern void AddSC_boss_hazzarah(); |
---|
580 | extern void AddSC_boss_renataki(); |
---|
581 | extern void AddSC_boss_wushoolay(); |
---|
582 | extern void AddSC_instance_zulgurub(); |
---|
583 | //Zul'Aman |
---|
584 | extern void AddSC_boss_janalai(); |
---|
585 | extern void AddSC_boss_nalorakk(); |
---|
586 | extern void AddSC_instance_zulaman(); |
---|
587 | extern void AddSC_zulaman(); |
---|
588 | |
---|
589 | // ------------------- |
---|
590 | void LoadDatabase() |
---|
591 | { |
---|
592 | //Get db string from file |
---|
593 | char const* dbstring = NULL; |
---|
594 | |
---|
595 | if( !TScriptConfig.GetString("WorldDatabaseInfo", &dbstring) ) |
---|
596 | { |
---|
597 | error_log("TSCR: Missing world database info from configuration file. Load database aborted."); |
---|
598 | return; |
---|
599 | } |
---|
600 | |
---|
601 | //Initialize connection to DB |
---|
602 | if( dbstring && TScriptDB.Initialize(dbstring) ) |
---|
603 | outstring_log("TSCR: TrinityScript database: %s",dbstring); |
---|
604 | else |
---|
605 | { |
---|
606 | error_log("TSCR: Unable to connect to Database. Load database aborted."); |
---|
607 | return; |
---|
608 | } |
---|
609 | |
---|
610 | //***Preform all DB queries here*** |
---|
611 | QueryResult *result; |
---|
612 | |
---|
613 | //Get Version information |
---|
614 | result = TScriptDB.PQuery("SELECT version FROM script_db_version"); |
---|
615 | |
---|
616 | if (result) |
---|
617 | { |
---|
618 | Field *fields = result->Fetch(); |
---|
619 | outstring_log("TSCR: Database version is: %s", fields[0].GetString()); |
---|
620 | outstring_log(""); |
---|
621 | delete result; |
---|
622 | |
---|
623 | }else |
---|
624 | { |
---|
625 | error_log("TSCR: Missing `script_db_version` information."); |
---|
626 | outstring_log(""); |
---|
627 | } |
---|
628 | |
---|
629 | // Drop Existing Text Map, only done once and we are ready to add data from multiple sources. |
---|
630 | TextMap.clear(); |
---|
631 | |
---|
632 | //TODO: Add load from eventai_texts here |
---|
633 | |
---|
634 | // Load Script Text |
---|
635 | outstring_log("TSCR: Loading Script Texts..."); |
---|
636 | LoadMangosStrings(TScriptDB,"script_texts",TEXT_SOURCE_RANGE,(TEXT_SOURCE_RANGE*2)+1); |
---|
637 | |
---|
638 | // Gather Additional data from Script Texts |
---|
639 | result = TScriptDB.PQuery("SELECT entry, sound, type, language FROM script_texts"); |
---|
640 | |
---|
641 | outstring_log("TSCR: Loading Script Texts additional data..."); |
---|
642 | if (result) |
---|
643 | { |
---|
644 | barGoLink bar(result->GetRowCount()); |
---|
645 | uint32 count = 0; |
---|
646 | |
---|
647 | do |
---|
648 | { |
---|
649 | bar.step(); |
---|
650 | Field* fields = result->Fetch(); |
---|
651 | StringTextData temp; |
---|
652 | |
---|
653 | int32 i = fields[0].GetInt32(); |
---|
654 | temp.SoundId = fields[1].GetInt32(); |
---|
655 | temp.Type = fields[2].GetInt32(); |
---|
656 | temp.Language = fields[3].GetInt32(); |
---|
657 | |
---|
658 | if (i >= 0) |
---|
659 | { |
---|
660 | error_db_log("TSCR: Entry %i in table `script_texts` is not a negative value.",i); |
---|
661 | continue; |
---|
662 | } |
---|
663 | |
---|
664 | if (i > TEXT_SOURCE_RANGE || i <= TEXT_SOURCE_RANGE*2) |
---|
665 | { |
---|
666 | error_db_log("TSCR: Entry %i in table `script_texts` is out of accepted entry range for table.",i); |
---|
667 | continue; |
---|
668 | } |
---|
669 | |
---|
670 | if (temp.SoundId) |
---|
671 | { |
---|
672 | if (!GetSoundEntriesStore()->LookupEntry(temp.SoundId)) |
---|
673 | error_db_log("TSCR: Entry %i in table `script_texts` has soundId %u but sound does not exist.",i,temp.SoundId); |
---|
674 | } |
---|
675 | |
---|
676 | if (!GetLanguageDescByID(temp.Language)) |
---|
677 | error_db_log("TSCR: Entry %i in table `script_texts` using Language %u but Language does not exist.",i,temp.Language); |
---|
678 | |
---|
679 | if (temp.Type > CHAT_TYPE_BOSS_WHISPER) |
---|
680 | error_db_log("TSCR: Entry %i in table `script_texts` has Type %u but this Chat Type does not exist.",i,temp.Type); |
---|
681 | |
---|
682 | TextMap[i] = temp; |
---|
683 | ++count; |
---|
684 | } while (result->NextRow()); |
---|
685 | |
---|
686 | delete result; |
---|
687 | |
---|
688 | outstring_log(""); |
---|
689 | outstring_log(">> TSCR: Loaded %u additional Script Texts data.", count); |
---|
690 | }else |
---|
691 | { |
---|
692 | barGoLink bar(1); |
---|
693 | bar.step(); |
---|
694 | outstring_log(""); |
---|
695 | outstring_log(">> Loaded 0 additional Script Texts data. DB table `script_texts` is empty."); |
---|
696 | } |
---|
697 | |
---|
698 | // Load Custom Text |
---|
699 | outstring_log("TSCR: Loading Custom Texts..."); |
---|
700 | LoadMangosStrings(TScriptDB,"custom_texts",TEXT_SOURCE_RANGE*2,(TEXT_SOURCE_RANGE*3)+1); |
---|
701 | |
---|
702 | // Gather Additional data from Custom Texts |
---|
703 | result = TScriptDB.PQuery("SELECT entry, sound, type, language FROM custom_texts"); |
---|
704 | |
---|
705 | outstring_log("TSCR: Loading Custom Texts additional data..."); |
---|
706 | if (result) |
---|
707 | { |
---|
708 | barGoLink bar(result->GetRowCount()); |
---|
709 | uint32 count = 0; |
---|
710 | |
---|
711 | do |
---|
712 | { |
---|
713 | bar.step(); |
---|
714 | Field* fields = result->Fetch(); |
---|
715 | StringTextData temp; |
---|
716 | |
---|
717 | int32 i = fields[0].GetInt32(); |
---|
718 | temp.SoundId = fields[1].GetInt32(); |
---|
719 | temp.Type = fields[2].GetInt32(); |
---|
720 | temp.Language = fields[3].GetInt32(); |
---|
721 | |
---|
722 | if (i >= 0) |
---|
723 | { |
---|
724 | error_db_log("TSCR: Entry %i in table `custom_texts` is not a negative value.",i); |
---|
725 | continue; |
---|
726 | } |
---|
727 | |
---|
728 | if (i > TEXT_SOURCE_RANGE*2 || i <= TEXT_SOURCE_RANGE*3) |
---|
729 | { |
---|
730 | error_db_log("TSCR: Entry %i in table `custom_texts` is out of accepted entry range for table.",i); |
---|
731 | continue; |
---|
732 | } |
---|
733 | |
---|
734 | if (temp.SoundId) |
---|
735 | { |
---|
736 | if (!GetSoundEntriesStore()->LookupEntry(temp.SoundId)) |
---|
737 | error_db_log("TSCR: Entry %i in table `custom_texts` has soundId %u but sound does not exist.",i,temp.SoundId); |
---|
738 | } |
---|
739 | |
---|
740 | if (!GetLanguageDescByID(temp.Language)) |
---|
741 | error_db_log("TSCR: Entry %i in table `custom_texts` using Language %u but Language does not exist.",i,temp.Language); |
---|
742 | |
---|
743 | if (temp.Type > CHAT_TYPE_BOSS_WHISPER) |
---|
744 | error_db_log("TSCR: Entry %i in table `custom_texts` has Type %u but this Chat Type does not exist.",i,temp.Type); |
---|
745 | |
---|
746 | TextMap[i] = temp; |
---|
747 | ++count; |
---|
748 | } while (result->NextRow()); |
---|
749 | |
---|
750 | delete result; |
---|
751 | |
---|
752 | outstring_log(""); |
---|
753 | outstring_log(">> Loaded %u additional Custom Texts data.", count); |
---|
754 | }else |
---|
755 | { |
---|
756 | barGoLink bar(1); |
---|
757 | bar.step(); |
---|
758 | outstring_log(""); |
---|
759 | outstring_log(">> Loaded 0 additional Custom Texts data. DB table `custom_texts` is empty."); |
---|
760 | } |
---|
761 | |
---|
762 | // Drop existing Event AI Localized Text hash map |
---|
763 | EventAI_LocalizedTextMap.clear(); |
---|
764 | |
---|
765 | // Gather EventAI Localized Texts |
---|
766 | result = TScriptDB.PQuery("SELECT id, locale_1, locale_2, locale_3, locale_4, locale_5, locale_6, locale_7, locale_8 " |
---|
767 | "FROM eventai_localized_texts"); |
---|
768 | |
---|
769 | outstring_log("TSCR: Loading EventAI Localized Texts..."); |
---|
770 | if(result) |
---|
771 | { |
---|
772 | barGoLink bar(result->GetRowCount()); |
---|
773 | uint32 count = 0; |
---|
774 | |
---|
775 | do |
---|
776 | { |
---|
777 | Localized_Text temp; |
---|
778 | bar.step(); |
---|
779 | |
---|
780 | Field *fields = result->Fetch(); |
---|
781 | |
---|
782 | uint32 i = fields[0].GetInt32(); |
---|
783 | |
---|
784 | temp.locale_1 = fields[1].GetString(); |
---|
785 | temp.locale_2 = fields[2].GetString(); |
---|
786 | temp.locale_3 = fields[3].GetString(); |
---|
787 | temp.locale_4 = fields[4].GetString(); |
---|
788 | temp.locale_5 = fields[5].GetString(); |
---|
789 | temp.locale_6 = fields[6].GetString(); |
---|
790 | temp.locale_7 = fields[7].GetString(); |
---|
791 | temp.locale_8 = fields[8].GetString(); |
---|
792 | |
---|
793 | EventAI_LocalizedTextMap[i] = temp; |
---|
794 | ++count; |
---|
795 | |
---|
796 | }while(result->NextRow()); |
---|
797 | |
---|
798 | delete result; |
---|
799 | |
---|
800 | outstring_log(""); |
---|
801 | outstring_log(">> Loaded %u EventAI Localized Texts", count); |
---|
802 | }else |
---|
803 | { |
---|
804 | barGoLink bar(1); |
---|
805 | bar.step(); |
---|
806 | outstring_log(""); |
---|
807 | outstring_log(">> Loaded 0 EventAI Localized Texts. DB table `eventai_localized_texts` is empty"); |
---|
808 | } |
---|
809 | |
---|
810 | //Drop existing EventAI Text hash map |
---|
811 | EventAI_Text_Map.clear(); |
---|
812 | |
---|
813 | //Gather EventAI Text Entries |
---|
814 | result = TScriptDB.PQuery("SELECT id, text FROM eventai_texts"); |
---|
815 | |
---|
816 | outstring_log("TSCR: Loading EventAI_Texts..."); |
---|
817 | if (result) |
---|
818 | { |
---|
819 | barGoLink bar(result->GetRowCount()); |
---|
820 | uint32 Count = 0; |
---|
821 | |
---|
822 | do |
---|
823 | { |
---|
824 | bar.step(); |
---|
825 | Field *fields = result->Fetch(); |
---|
826 | |
---|
827 | uint32 i = fields[0].GetInt32(); |
---|
828 | |
---|
829 | std::string text = fields[1].GetString(); |
---|
830 | |
---|
831 | if (!strlen(text.c_str())) |
---|
832 | error_db_log("TSCR: EventAI text %u is empty", i); |
---|
833 | |
---|
834 | EventAI_Text_Map[i] = text; |
---|
835 | ++Count; |
---|
836 | |
---|
837 | }while (result->NextRow()); |
---|
838 | |
---|
839 | delete result; |
---|
840 | |
---|
841 | outstring_log(""); |
---|
842 | outstring_log(">> Loaded %u EventAI texts", Count); |
---|
843 | }else |
---|
844 | { |
---|
845 | barGoLink bar(1); |
---|
846 | bar.step(); |
---|
847 | outstring_log(""); |
---|
848 | outstring_log(">> Loaded 0 EventAI texts. DB table `eventai_texts` is empty."); |
---|
849 | } |
---|
850 | |
---|
851 | //Gather event data |
---|
852 | result = TScriptDB.PQuery("SELECT id, position_x, position_y, position_z, orientation, spawntimesecs FROM eventai_summons"); |
---|
853 | |
---|
854 | //Drop Existing EventSummon Map |
---|
855 | EventAI_Summon_Map.clear(); |
---|
856 | |
---|
857 | outstring_log("TSCR: Loading EventAI_Summons..."); |
---|
858 | if (result) |
---|
859 | { |
---|
860 | barGoLink bar(result->GetRowCount()); |
---|
861 | uint32 Count = 0; |
---|
862 | |
---|
863 | do |
---|
864 | { |
---|
865 | bar.step(); |
---|
866 | Field *fields = result->Fetch(); |
---|
867 | |
---|
868 | EventAI_Summon temp; |
---|
869 | |
---|
870 | uint32 i = fields[0].GetUInt32(); |
---|
871 | temp.position_x = fields[1].GetFloat(); |
---|
872 | temp.position_y = fields[2].GetFloat(); |
---|
873 | temp.position_z = fields[3].GetFloat(); |
---|
874 | temp.orientation = fields[4].GetFloat(); |
---|
875 | temp.SpawnTimeSecs = fields[5].GetUInt32(); |
---|
876 | |
---|
877 | //Add to map |
---|
878 | EventAI_Summon_Map[i] = temp; |
---|
879 | ++Count; |
---|
880 | }while (result->NextRow()); |
---|
881 | |
---|
882 | delete result; |
---|
883 | |
---|
884 | outstring_log(""); |
---|
885 | outstring_log(">> Loaded %u EventAI summon definitions", Count); |
---|
886 | }else |
---|
887 | { |
---|
888 | barGoLink bar(1); |
---|
889 | bar.step(); |
---|
890 | outstring_log(""); |
---|
891 | outstring_log(">> Loaded 0 EventAI Summon definitions. DB table `eventai_summons` is empty."); |
---|
892 | } |
---|
893 | |
---|
894 | //Gather event data |
---|
895 | result = TScriptDB.PQuery("SELECT id, creature_id, event_type, event_inverse_phase_mask, event_chance, event_flags, " |
---|
896 | "event_param1, event_param2, event_param3, event_param4, " |
---|
897 | "action1_type, action1_param1, action1_param2, action1_param3, " |
---|
898 | "action2_type, action2_param1, action2_param2, action2_param3, " |
---|
899 | "action3_type, action3_param1, action3_param2, action3_param3 " |
---|
900 | "FROM eventai_scripts"); |
---|
901 | |
---|
902 | //Drop Existing EventAI List |
---|
903 | EventAI_Event_List.clear(); |
---|
904 | |
---|
905 | outstring_log("TSCR: Loading EventAI_Scripts..."); |
---|
906 | if (result) |
---|
907 | { |
---|
908 | barGoLink bar(result->GetRowCount()); |
---|
909 | uint32 Count = 0; |
---|
910 | |
---|
911 | do |
---|
912 | { |
---|
913 | bar.step(); |
---|
914 | Field *fields = result->Fetch(); |
---|
915 | |
---|
916 | EventAI_Event temp; |
---|
917 | |
---|
918 | temp.event_id = fields[0].GetUInt32(); |
---|
919 | uint32 i = temp.event_id; |
---|
920 | temp.creature_id = fields[1].GetUInt32(); |
---|
921 | temp.event_type = fields[2].GetUInt16(); |
---|
922 | temp.event_inverse_phase_mask = fields[3].GetUInt32(); |
---|
923 | temp.event_chance = fields[4].GetUInt8(); |
---|
924 | temp.event_flags = fields[5].GetUInt8(); |
---|
925 | temp.event_param1 = fields[6].GetUInt32(); |
---|
926 | temp.event_param2 = fields[7].GetUInt32(); |
---|
927 | temp.event_param3 = fields[8].GetUInt32(); |
---|
928 | temp.event_param4 = fields[9].GetUInt32(); |
---|
929 | |
---|
930 | //Report any errors in event |
---|
931 | if (temp.event_type >= EVENT_T_END) |
---|
932 | error_db_log("TSCR: Event %u has incorrect event type. Maybe DB requires updated version of SD2.", i); |
---|
933 | |
---|
934 | //No chance of this event occuring |
---|
935 | if (temp.event_chance == 0) |
---|
936 | error_db_log("TSCR: Event %u has 0 percent chance. Event will never trigger!", i); |
---|
937 | |
---|
938 | //Chance above 100, force it to be 100 |
---|
939 | if (temp.event_chance > 100) |
---|
940 | { |
---|
941 | error_db_log("TSCR: Creature %u are using event %u with more than 100 percent chance. Adjusting to 100 percent.", temp.creature_id, i); |
---|
942 | temp.event_chance = 100; |
---|
943 | } |
---|
944 | |
---|
945 | //Individual event checks |
---|
946 | switch (temp.event_type) |
---|
947 | { |
---|
948 | case EVENT_T_HP: |
---|
949 | case EVENT_T_MANA: |
---|
950 | case EVENT_T_TARGET_HP: |
---|
951 | { |
---|
952 | if (temp.event_param2 > 100) |
---|
953 | error_db_log("TSCR: Creature %u are using percentage event(%u) with param2 (MinPercent) > 100. Event will never trigger! ", temp.creature_id, i); |
---|
954 | |
---|
955 | if (temp.event_param1 <= temp.event_param2) |
---|
956 | error_db_log("TSCR: Creature %u are using percentage event(%u) with param1 <= param2 (MaxPercent <= MinPercent). Event will never trigger! ", temp.creature_id, i); |
---|
957 | |
---|
958 | if (temp.event_flags & EFLAG_REPEATABLE && !temp.event_param3 && !temp.event_param4) |
---|
959 | { |
---|
960 | error_db_log("TSCR: Creature %u has param3 and param4=0 (RepeatMin/RepeatMax) but cannot be repeatable without timers. Removing EFLAG_REPEATABLE for event %u.", temp.creature_id, i); |
---|
961 | temp.event_flags &= ~EFLAG_REPEATABLE; |
---|
962 | } |
---|
963 | } |
---|
964 | break; |
---|
965 | |
---|
966 | case EVENT_T_SPELLHIT: |
---|
967 | { |
---|
968 | if (temp.event_param1) |
---|
969 | { |
---|
970 | SpellEntry const* pSpell = GetSpellStore()->LookupEntry(temp.event_param1); |
---|
971 | if (!pSpell) |
---|
972 | { |
---|
973 | error_db_log("TSCR: Creature %u has non-existant SpellID(%u) defined in event %u.", temp.creature_id, temp.event_param1, i); |
---|
974 | continue; |
---|
975 | } |
---|
976 | |
---|
977 | if (temp.event_param2_s != -1 && temp.event_param2 != pSpell->SchoolMask) |
---|
978 | error_db_log("TSCR: Creature %u has param1(spellId %u) but param2 is not -1 and not equal to spell's school mask. Event %u can never trigger.", temp.creature_id, temp.event_param1, i); |
---|
979 | } |
---|
980 | |
---|
981 | //TODO: fix this system with SPELL_SCHOOL_MASK. Current complicate things, using int32(-1) instead of just 0 |
---|
982 | //SPELL_SCHOOL_MASK_NONE = 0 and does not exist, thus it can not ever trigger or be used in SpellHit() |
---|
983 | if (temp.event_param2_s != -1 && temp.event_param2_s > SPELL_SCHOOL_MASK_ALL) |
---|
984 | error_db_log("TSCR: Creature %u is using invalid SpellSchoolMask(%u) defined in event %u.", temp.creature_id, temp.event_param2, i); |
---|
985 | |
---|
986 | if (temp.event_param4 < temp.event_param3) |
---|
987 | error_db_log("TSCR: Creature %u are using repeatable event(%u) with param4 < param3 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i); |
---|
988 | } |
---|
989 | break; |
---|
990 | |
---|
991 | case EVENT_T_RANGE: |
---|
992 | case EVENT_T_OOC_LOS: |
---|
993 | case EVENT_T_FRIENDLY_HP: |
---|
994 | case EVENT_T_FRIENDLY_IS_CC: |
---|
995 | case EVENT_T_FRIENDLY_MISSING_BUFF: |
---|
996 | { |
---|
997 | if (temp.event_param4 < temp.event_param3) |
---|
998 | error_db_log("TSCR: Creature %u are using repeatable event(%u) with param4 < param3 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i); |
---|
999 | } |
---|
1000 | break; |
---|
1001 | |
---|
1002 | case EVENT_T_TIMER: |
---|
1003 | case EVENT_T_TIMER_OOC: |
---|
1004 | { |
---|
1005 | if (temp.event_param2 < temp.event_param1) |
---|
1006 | error_db_log("TSCR: Creature %u are using timed event(%u) with param2 < param1 (InitialMax < InitialMin). Event will never repeat.", temp.creature_id, i); |
---|
1007 | |
---|
1008 | if (temp.event_param4 < temp.event_param3) |
---|
1009 | error_db_log("TSCR: Creature %u are using repeatable event(%u) with param4 < param3 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i); |
---|
1010 | } |
---|
1011 | break; |
---|
1012 | |
---|
1013 | case EVENT_T_KILL: |
---|
1014 | case EVENT_T_TARGET_CASTING: |
---|
1015 | { |
---|
1016 | if (temp.event_param2 < temp.event_param1) |
---|
1017 | error_db_log("TSCR: Creature %u are using event(%u) with param2 < param1 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i); |
---|
1018 | } |
---|
1019 | break; |
---|
1020 | |
---|
1021 | case EVENT_T_AGGRO: |
---|
1022 | case EVENT_T_DEATH: |
---|
1023 | case EVENT_T_EVADE: |
---|
1024 | case EVENT_T_SPAWNED: |
---|
1025 | { |
---|
1026 | if (temp.event_flags & EFLAG_REPEATABLE) |
---|
1027 | { |
---|
1028 | error_db_log("TSCR: Creature %u has EFLAG_REPEATABLE set. Event can never be repeatable. Removing flag for event %u.", temp.creature_id, i); |
---|
1029 | temp.event_flags &= ~EFLAG_REPEATABLE; |
---|
1030 | } |
---|
1031 | } |
---|
1032 | break; |
---|
1033 | } |
---|
1034 | |
---|
1035 | for (uint32 j = 0; j < MAX_ACTIONS; j++) |
---|
1036 | { |
---|
1037 | temp.action[j].type = fields[10+(j*4)].GetUInt16(); |
---|
1038 | temp.action[j].param1 = fields[11+(j*4)].GetUInt32(); |
---|
1039 | temp.action[j].param2 = fields[12+(j*4)].GetUInt32(); |
---|
1040 | temp.action[j].param3 = fields[13+(j*4)].GetUInt32(); |
---|
1041 | |
---|
1042 | //Report any errors in actions |
---|
1043 | switch (temp.action[j].type) |
---|
1044 | { |
---|
1045 | case ACTION_T_SAY: |
---|
1046 | case ACTION_T_YELL: |
---|
1047 | case ACTION_T_TEXTEMOTE: |
---|
1048 | if (GetEventAIText(temp.action[j].param1) == DEFAULT_TEXT) |
---|
1049 | error_db_log("TSCR: Event %u Action %u refrences missing Localized_Text entry", i, j+1); |
---|
1050 | break; |
---|
1051 | |
---|
1052 | case ACTION_T_SOUND: |
---|
1053 | if (!GetSoundEntriesStore()->LookupEntry(temp.action[j].param1)) |
---|
1054 | error_db_log("TSCR: Event %u Action %u uses non-existant SoundID %u.", i, j+1, temp.action[j].param1); |
---|
1055 | break; |
---|
1056 | |
---|
1057 | case ACTION_T_RANDOM_SAY: |
---|
1058 | case ACTION_T_RANDOM_YELL: |
---|
1059 | case ACTION_T_RANDOM_TEXTEMOTE: |
---|
1060 | if ((temp.action[j].param1 != 0xffffffff && GetEventAIText(temp.action[j].param1) == DEFAULT_TEXT) || |
---|
1061 | (temp.action[j].param2 != 0xffffffff && GetEventAIText(temp.action[j].param2) == DEFAULT_TEXT) || |
---|
1062 | (temp.action[j].param3 != 0xffffffff && GetEventAIText(temp.action[j].param3) == DEFAULT_TEXT)) |
---|
1063 | error_db_log("TSCR: Event %u Action %u refrences missing Localized_Text entry", i, j+1); |
---|
1064 | break; |
---|
1065 | |
---|
1066 | case ACTION_T_CAST: |
---|
1067 | { |
---|
1068 | if (!GetSpellStore()->LookupEntry(temp.action[j].param1)) |
---|
1069 | error_db_log("TSCR: Event %u Action %u uses non-existant SpellID %u.", i, j+1, temp.action[j].param1); |
---|
1070 | |
---|
1071 | if (temp.action[j].param2 >= TARGET_T_END) |
---|
1072 | error_db_log("TSCR: Event %u Action %u uses incorrect Target type", i, j+1); |
---|
1073 | } |
---|
1074 | break; |
---|
1075 | |
---|
1076 | case ACTION_T_REMOVEAURASFROMSPELL: |
---|
1077 | { |
---|
1078 | if (!GetSpellStore()->LookupEntry(temp.action[j].param2)) |
---|
1079 | error_db_log("TSCR: Event %u Action %u uses non-existant SpellID %u.", i, j+1, temp.action[j].param2); |
---|
1080 | |
---|
1081 | if (temp.action[j].param1 >= TARGET_T_END) |
---|
1082 | error_db_log("TSCR: Event %u Action %u uses incorrect Target type", i, j+1); |
---|
1083 | } |
---|
1084 | break; |
---|
1085 | |
---|
1086 | case ACTION_T_CASTCREATUREGO: |
---|
1087 | { |
---|
1088 | if (!GetSpellStore()->LookupEntry(temp.action[j].param2)) |
---|
1089 | error_db_log("TSCR: Event %u Action %u uses non-existant SpellID %u.", i, j+1, temp.action[j].param2); |
---|
1090 | |
---|
1091 | if (temp.action[j].param3 >= TARGET_T_END) |
---|
1092 | error_db_log("TSCR: Event %u Action %u uses incorrect Target type", i, j+1); |
---|
1093 | } |
---|
1094 | break; |
---|
1095 | |
---|
1096 | //2nd param target |
---|
1097 | case ACTION_T_SUMMON_ID: |
---|
1098 | { |
---|
1099 | if (EventAI_Summon_Map.find(temp.action[j].param3) == EventAI_Summon_Map.end()) |
---|
1100 | error_db_log("TSCR: Event %u Action %u summons missing EventAI_Summon %u", i, j+1, temp.action[j].param3); |
---|
1101 | |
---|
1102 | if (temp.action[j].param2 >= TARGET_T_END) |
---|
1103 | error_db_log("TSCR: Event %u Action %u uses incorrect Target type", i, j+1); |
---|
1104 | } |
---|
1105 | break; |
---|
1106 | |
---|
1107 | case ACTION_T_SUMMON: |
---|
1108 | case ACTION_T_THREAT_SINGLE_PCT: |
---|
1109 | case ACTION_T_QUEST_EVENT: |
---|
1110 | case ACTION_T_SET_UNIT_FLAG: |
---|
1111 | case ACTION_T_REMOVE_UNIT_FLAG: |
---|
1112 | case ACTION_T_SET_INST_DATA64: |
---|
1113 | if (temp.action[j].param2 >= TARGET_T_END) |
---|
1114 | error_db_log("TSCR: Event %u Action %u uses incorrect Target type", i, j+1); |
---|
1115 | break; |
---|
1116 | |
---|
1117 | //3rd param target |
---|
1118 | case ACTION_T_SET_UNIT_FIELD: |
---|
1119 | if (temp.action[j].param3 >= TARGET_T_END) |
---|
1120 | error_db_log("TSCR: Event %u Action %u uses incorrect Target type", i, j+1); |
---|
1121 | break; |
---|
1122 | |
---|
1123 | case ACTION_T_SET_PHASE: |
---|
1124 | if (temp.action[j].param1 > 31) |
---|
1125 | error_db_log("TSCR: Event %u Action %u attempts to set phase > 31. Phase mask cannot be used past phase 31.", i, j+1); |
---|
1126 | break; |
---|
1127 | |
---|
1128 | case ACTION_T_INC_PHASE: |
---|
1129 | if (!temp.action[j].param1) |
---|
1130 | error_db_log("TSCR: Event %u Action %u is incrementing phase by 0. Was this intended?", i, j+1); |
---|
1131 | break; |
---|
1132 | |
---|
1133 | case ACTION_T_KILLED_MONSTER: |
---|
1134 | if (temp.event_type != EVENT_T_DEATH) |
---|
1135 | outstring_log("SD2 WARNING: Event %u Action %u calling ACTION_T_KILLED_MONSTER outside of EVENT_T_DEATH", i, j+1); |
---|
1136 | break; |
---|
1137 | |
---|
1138 | case ACTION_T_SET_INST_DATA: |
---|
1139 | if (temp.action[j].param2 > 3) |
---|
1140 | error_db_log("TSCR: Event %u Action %u attempts to set instance data above encounter state 3. Custom case?", i, j+1); |
---|
1141 | break; |
---|
1142 | |
---|
1143 | default: |
---|
1144 | if (temp.action[j].type >= ACTION_T_END) |
---|
1145 | error_db_log("TSCR: Event %u Action %u has incorrect action type. Maybe DB requires updated version of SD2.", i, j+1); |
---|
1146 | break; |
---|
1147 | } |
---|
1148 | } |
---|
1149 | |
---|
1150 | //Add to list |
---|
1151 | EventAI_Event_List.push_back(temp); |
---|
1152 | ++Count; |
---|
1153 | } while (result->NextRow()); |
---|
1154 | |
---|
1155 | delete result; |
---|
1156 | |
---|
1157 | outstring_log(""); |
---|
1158 | outstring_log(">> Loaded %u EventAI scripts", Count); |
---|
1159 | }else |
---|
1160 | { |
---|
1161 | barGoLink bar(1); |
---|
1162 | bar.step(); |
---|
1163 | outstring_log(""); |
---|
1164 | outstring_log(">> Loaded 0 EventAI scripts. DB table `eventai_scripts` is empty."); |
---|
1165 | } |
---|
1166 | |
---|
1167 | //Free database thread and resources |
---|
1168 | TScriptDB.HaltDelayThread(); |
---|
1169 | |
---|
1170 | } |
---|
1171 | |
---|
1172 | struct TSpellSummary { |
---|
1173 | uint8 Targets; // set of enum SelectTarget |
---|
1174 | uint8 Effects; // set of enum SelectEffect |
---|
1175 | }extern *SpellSummary; |
---|
1176 | |
---|
1177 | MANGOS_DLL_EXPORT |
---|
1178 | void ScriptsFree() |
---|
1179 | { |
---|
1180 | // Free Spell Summary |
---|
1181 | delete []SpellSummary; |
---|
1182 | |
---|
1183 | // Free resources before library unload |
---|
1184 | for(int i=0;i<nrscripts;i++) |
---|
1185 | delete m_scripts[i]; |
---|
1186 | |
---|
1187 | nrscripts = 0; |
---|
1188 | } |
---|
1189 | |
---|
1190 | MANGOS_DLL_EXPORT |
---|
1191 | void ScriptsInit() |
---|
1192 | { |
---|
1193 | bool CanLoadDB = true; |
---|
1194 | |
---|
1195 | //Trinity Script startup |
---|
1196 | outstring_log(" _____ _ _ _ ____ _ _"); |
---|
1197 | outstring_log("|_ _| __(_)_ __ (_) |_ _ _/ ___| ___ _ __(_)_ __ | |_ "); |
---|
1198 | outstring_log(" | || '__| | '_ \\| | __| | | \\___ \\ / __| \'__| | \'_ \\| __|"); |
---|
1199 | outstring_log(" | || | | | | | | | |_| |_| |___) | (__| | | | |_) | |_ "); |
---|
1200 | outstring_log(" |_||_| |_|_| |_|_|\\__|\\__, |____/ \\___|_| |_| .__/ \\__|"); |
---|
1201 | outstring_log(" |___/ |_| "); |
---|
1202 | outstring_log("Trinity Script initializing %s", _FULLVERSION); |
---|
1203 | outstring_log(""); |
---|
1204 | |
---|
1205 | //Get configuration file |
---|
1206 | if (!TScriptConfig.SetSource(_TRINITY_SCRIPT_CONFIG)) |
---|
1207 | { |
---|
1208 | CanLoadDB = false; |
---|
1209 | error_log("TSCR: Unable to open configuration file. Database will be unaccessible. Configuration values will use default."); |
---|
1210 | } |
---|
1211 | else outstring_log("TSCR: Using configuration file %s",_TRINITY_SCRIPT_CONFIG); |
---|
1212 | |
---|
1213 | //Locale |
---|
1214 | Locale = TScriptConfig.GetIntDefault("Locale", 0); |
---|
1215 | |
---|
1216 | if (Locale > 8) |
---|
1217 | { |
---|
1218 | Locale = 0; |
---|
1219 | error_log("TSCR: Locale set to invalid language id. Defaulting to 0."); |
---|
1220 | } |
---|
1221 | |
---|
1222 | outstring_log("TSCR: Using locale %u", Locale); |
---|
1223 | |
---|
1224 | EAI_ErrorLevel = TScriptConfig.GetIntDefault("EAIErrorLevel", 1); |
---|
1225 | |
---|
1226 | switch (EAI_ErrorLevel) |
---|
1227 | { |
---|
1228 | case 0: |
---|
1229 | outstring_log("TSCR: EventAI Error Reporting level set to 0 (Startup Errors only)"); |
---|
1230 | break; |
---|
1231 | case 1: |
---|
1232 | outstring_log("TSCR: EventAI Error Reporting level set to 1 (Startup errors and Runtime event errors)"); |
---|
1233 | break; |
---|
1234 | case 2: |
---|
1235 | outstring_log("TSCR: EventAI Error Reporting level set to 2 (Startup errors, Runtime event errors, and Creation errors)"); |
---|
1236 | break; |
---|
1237 | default: |
---|
1238 | outstring_log("TSCR: Unknown EventAI Error Reporting level. Defaulting to 1 (Startup errors and Runtime event errors)"); |
---|
1239 | EAI_ErrorLevel = 1; |
---|
1240 | break; |
---|
1241 | } |
---|
1242 | |
---|
1243 | outstring_log(""); |
---|
1244 | |
---|
1245 | //Load database (must be called after TScriptConfig.SetSource). In case it failed, no need to even try load. |
---|
1246 | if (CanLoadDB) |
---|
1247 | LoadDatabase(); |
---|
1248 | |
---|
1249 | outstring_log("TSCR: Loading C++ scripts"); |
---|
1250 | barGoLink bar(1); |
---|
1251 | bar.step(); |
---|
1252 | outstring_log(""); |
---|
1253 | |
---|
1254 | nrscripts = 0; |
---|
1255 | for(int i=0;i<MAX_SCRIPTS;i++) |
---|
1256 | m_scripts[i]=NULL; |
---|
1257 | |
---|
1258 | FillSpellSummary(); |
---|
1259 | |
---|
1260 | // -- Scripts to be added -- |
---|
1261 | |
---|
1262 | // -- Areatrigger -- |
---|
1263 | AddSC_areatrigger_scripts(); |
---|
1264 | |
---|
1265 | // -- Boss -- |
---|
1266 | AddSC_boss_emeriss(); |
---|
1267 | AddSC_boss_taerar(); |
---|
1268 | AddSC_boss_ysondre(); |
---|
1269 | |
---|
1270 | // -- Creature -- |
---|
1271 | AddSC_mob_event(); |
---|
1272 | AddSC_generic_creature(); |
---|
1273 | |
---|
1274 | // -- Custom -- |
---|
1275 | AddSC_custom_example(); |
---|
1276 | AddSC_custom_gossip_codebox(); |
---|
1277 | AddSC_test(); |
---|
1278 | |
---|
1279 | // -- GO -- |
---|
1280 | AddSC_go_scripts(); |
---|
1281 | |
---|
1282 | // -- Guard -- |
---|
1283 | AddSC_guards(); |
---|
1284 | |
---|
1285 | // -- Honor -- |
---|
1286 | |
---|
1287 | // -- Item -- |
---|
1288 | AddSC_item_scripts(); |
---|
1289 | AddSC_item_test(); |
---|
1290 | |
---|
1291 | // -- NPC -- |
---|
1292 | AddSC_npc_professions(); |
---|
1293 | AddSC_npcs_special(); |
---|
1294 | |
---|
1295 | // -- Servers -- |
---|
1296 | |
---|
1297 | //-------------------- |
---|
1298 | //------ ZONE -------- |
---|
1299 | |
---|
1300 | //Alterac Mountains |
---|
1301 | AddSC_alterac_mountains(); |
---|
1302 | |
---|
1303 | //Arathi Highlands |
---|
1304 | //Ashenvale Forest |
---|
1305 | //Aunchindoun |
---|
1306 | //--Auchenai Crypts |
---|
1307 | AddSC_boss_exarch_maladaar(); |
---|
1308 | |
---|
1309 | //--Mana Tombs |
---|
1310 | AddSC_boss_nexusprince_shaffar(); |
---|
1311 | AddSC_boss_pandemonius(); |
---|
1312 | |
---|
1313 | //--Sekketh Halls |
---|
1314 | AddSC_boss_darkweaver_syth(); |
---|
1315 | AddSC_boss_talon_king_ikiss(); |
---|
1316 | AddSC_instance_sethekk_halls(); |
---|
1317 | |
---|
1318 | //--Shadow Labyrinth |
---|
1319 | AddSC_boss_ambassador_hellmaw(); |
---|
1320 | AddSC_boss_blackheart_the_inciter(); |
---|
1321 | AddSC_boss_grandmaster_vorpil(); |
---|
1322 | AddSC_boss_murmur(); |
---|
1323 | AddSC_instance_shadow_labyrinth(); |
---|
1324 | |
---|
1325 | //Azshara |
---|
1326 | AddSC_boss_azuregos(); |
---|
1327 | AddSC_azshara(); |
---|
1328 | |
---|
1329 | //Azuremyst Isle |
---|
1330 | AddSC_azuremyst_isle(); |
---|
1331 | |
---|
1332 | //Badlands |
---|
1333 | //Barrens |
---|
1334 | AddSC_the_barrens(); |
---|
1335 | |
---|
1336 | //Black Temple |
---|
1337 | AddSC_black_temple(); |
---|
1338 | AddSC_boss_illidan(); |
---|
1339 | AddSC_boss_shade_of_akama(); |
---|
1340 | AddSC_boss_supremus(); |
---|
1341 | AddSC_boss_gurtogg_bloodboil(); |
---|
1342 | AddSC_boss_mother_shahraz(); |
---|
1343 | AddSC_boss_reliquary_of_souls(); |
---|
1344 | AddSC_boss_teron_gorefiend(); |
---|
1345 | AddSC_boss_najentus(); |
---|
1346 | AddSC_boss_illidari_council(); |
---|
1347 | AddSC_instance_black_temple(); |
---|
1348 | |
---|
1349 | //Blackfathom Depths |
---|
1350 | //Blackrock Depths |
---|
1351 | AddSC_blackrock_depths(); |
---|
1352 | AddSC_boss_ambassador_flamelash(); |
---|
1353 | AddSC_boss_angerrel(); |
---|
1354 | AddSC_boss_anubshiah(); |
---|
1355 | AddSC_boss_doomrel(); |
---|
1356 | AddSC_boss_doperel(); |
---|
1357 | AddSC_boss_draganthaurissan(); |
---|
1358 | AddSC_boss_general_angerforge(); |
---|
1359 | AddSC_boss_gloomrel(); |
---|
1360 | AddSC_boss_gorosh_the_dervish(); |
---|
1361 | AddSC_boss_grizzle(); |
---|
1362 | AddSC_boss_haterel(); |
---|
1363 | AddSC_boss_high_interrogator_gerstahn(); |
---|
1364 | AddSC_boss_magmus(); |
---|
1365 | AddSC_boss_moira_bronzebeard(); |
---|
1366 | AddSC_boss_seethrel(); |
---|
1367 | AddSC_boss_vilerel(); |
---|
1368 | |
---|
1369 | //Blackrock Spire |
---|
1370 | AddSC_boss_drakkisath(); |
---|
1371 | AddSC_boss_halycon(); |
---|
1372 | AddSC_boss_highlordomokk(); |
---|
1373 | AddSC_boss_mothersmolderweb(); |
---|
1374 | AddSC_boss_overlordwyrmthalak(); |
---|
1375 | AddSC_boss_shadowvosh(); |
---|
1376 | AddSC_boss_thebeast(); |
---|
1377 | AddSC_boss_warmastervoone(); |
---|
1378 | AddSC_boss_quatermasterzigris(); |
---|
1379 | AddSC_boss_pyroguard_emberseer(); |
---|
1380 | AddSC_boss_gyth(); |
---|
1381 | AddSC_boss_rend_blackhand(); |
---|
1382 | |
---|
1383 | //Blackwing lair |
---|
1384 | AddSC_boss_razorgore(); |
---|
1385 | AddSC_boss_vael(); |
---|
1386 | AddSC_boss_broodlord(); |
---|
1387 | AddSC_boss_firemaw(); |
---|
1388 | AddSC_boss_ebonroc(); |
---|
1389 | AddSC_boss_flamegor(); |
---|
1390 | AddSC_boss_chromaggus(); |
---|
1391 | AddSC_boss_nefarian(); |
---|
1392 | AddSC_boss_victor_nefarius(); |
---|
1393 | |
---|
1394 | //Blade's Edge Mountains |
---|
1395 | AddSC_blades_edge_mountains(); |
---|
1396 | |
---|
1397 | //Blasted lands |
---|
1398 | AddSC_boss_kruul(); |
---|
1399 | AddSC_blasted_lands(); |
---|
1400 | |
---|
1401 | //Bloodmyst Isle |
---|
1402 | AddSC_bloodmyst_isle(); |
---|
1403 | |
---|
1404 | //Burning steppes |
---|
1405 | AddSC_burning_steppes(); |
---|
1406 | |
---|
1407 | //Caverns of Time |
---|
1408 | //--Battle for Mt. Hyjal |
---|
1409 | AddSC_hyjal(); |
---|
1410 | AddSC_boss_archimonde(); |
---|
1411 | AddSC_instance_mount_hyjal(); |
---|
1412 | |
---|
1413 | //--Old Hillsbrad |
---|
1414 | AddSC_boss_captain_skarloc(); |
---|
1415 | AddSC_boss_epoch_hunter(); |
---|
1416 | AddSC_boss_lieutenant_drake(); |
---|
1417 | AddSC_instance_old_hillsbrad(); |
---|
1418 | AddSC_old_hillsbrad(); |
---|
1419 | |
---|
1420 | //--The Dark Portal |
---|
1421 | AddSC_boss_aeonus(); |
---|
1422 | AddSC_boss_chrono_lord_deja(); |
---|
1423 | AddSC_boss_temporus(); |
---|
1424 | |
---|
1425 | //Coilfang Resevoir |
---|
1426 | //--Serpent Shrine Cavern |
---|
1427 | AddSC_boss_fathomlord_karathress(); |
---|
1428 | AddSC_boss_hydross_the_unstable(); |
---|
1429 | AddSC_boss_lady_vashj(); |
---|
1430 | AddSC_boss_leotheras_the_blind(); |
---|
1431 | AddSC_boss_morogrim_tidewalker(); |
---|
1432 | AddSC_instance_serpentshrine_cavern(); |
---|
1433 | |
---|
1434 | //--Slave Pens |
---|
1435 | //--Steam Vault |
---|
1436 | AddSC_boss_hydromancer_thespia(); |
---|
1437 | AddSC_boss_mekgineer_steamrigger(); |
---|
1438 | AddSC_boss_warlord_kalithresh(); |
---|
1439 | AddSC_instance_steam_vault(); |
---|
1440 | |
---|
1441 | //--Underbog |
---|
1442 | AddSC_boss_hungarfen(); |
---|
1443 | |
---|
1444 | //Darkshore |
---|
1445 | //Darnassus |
---|
1446 | //Deadmines |
---|
1447 | //Deadwind pass |
---|
1448 | //Desolace |
---|
1449 | //Dire Maul |
---|
1450 | //Dun Morogh |
---|
1451 | AddSC_dun_morogh(); |
---|
1452 | |
---|
1453 | //Durotar |
---|
1454 | //Duskwood |
---|
1455 | //Dustwallow marsh |
---|
1456 | AddSC_dustwallow_marsh(); |
---|
1457 | |
---|
1458 | //Eversong Woods |
---|
1459 | AddSC_eversong_woods(); |
---|
1460 | |
---|
1461 | //Exodar |
---|
1462 | //Eastern Plaguelands |
---|
1463 | AddSC_eastern_plaguelands(); |
---|
1464 | |
---|
1465 | //Elwynn Forest |
---|
1466 | AddSC_elwynn_forest(); |
---|
1467 | |
---|
1468 | //Felwood |
---|
1469 | AddSC_felwood(); |
---|
1470 | |
---|
1471 | //Feralas |
---|
1472 | AddSC_feralas(); |
---|
1473 | |
---|
1474 | //Ghostlands |
---|
1475 | AddSC_ghostlands(); |
---|
1476 | |
---|
1477 | //Gnomeregan |
---|
1478 | //Gruul's Lair |
---|
1479 | AddSC_boss_gruul(); |
---|
1480 | AddSC_boss_high_king_maulgar(); |
---|
1481 | AddSC_instance_gruuls_lair(); |
---|
1482 | |
---|
1483 | //Hellfire Citadel |
---|
1484 | //--Blood Furnace |
---|
1485 | AddSC_boss_broggok(); |
---|
1486 | AddSC_boss_kelidan_the_breaker(); |
---|
1487 | AddSC_boss_the_maker(); |
---|
1488 | |
---|
1489 | //--Magtheridon's Lair |
---|
1490 | AddSC_boss_magtheridon(); |
---|
1491 | AddSC_instance_magtheridons_lair(); |
---|
1492 | |
---|
1493 | //--Shattered Halls |
---|
1494 | AddSC_boss_grand_warlock_nethekurse(); |
---|
1495 | AddSC_boss_warbringer_omrogg(); |
---|
1496 | AddSC_instance_shattered_halls(); |
---|
1497 | |
---|
1498 | //--Ramparts |
---|
1499 | AddSC_boss_watchkeeper_gargolmar(); |
---|
1500 | AddSC_boss_omor_the_unscarred(); |
---|
1501 | |
---|
1502 | //Hellfire Peninsula |
---|
1503 | AddSC_boss_doomlordkazzak(); |
---|
1504 | AddSC_hellfire_peninsula(); |
---|
1505 | |
---|
1506 | //Hillsbrad Foothills |
---|
1507 | //Hinterlands |
---|
1508 | //Ironforge |
---|
1509 | AddSC_ironforge(); |
---|
1510 | |
---|
1511 | //Isle of Quel'Danas |
---|
1512 | AddSC_isle_of_queldanas(); |
---|
1513 | |
---|
1514 | //Karazhan |
---|
1515 | AddSC_boss_attumen(); |
---|
1516 | AddSC_boss_curator(); |
---|
1517 | AddSC_boss_maiden_of_virtue(); |
---|
1518 | AddSC_boss_shade_of_aran(); |
---|
1519 | AddSC_boss_malchezaar(); |
---|
1520 | AddSC_boss_terestian_illhoof(); |
---|
1521 | AddSC_netherspite_infernal(); |
---|
1522 | AddSC_boss_moroes(); |
---|
1523 | AddSC_bosses_opera(); |
---|
1524 | AddSC_instance_karazhan(); |
---|
1525 | AddSC_karazhan(); |
---|
1526 | |
---|
1527 | //Loch Modan |
---|
1528 | AddSC_loch_modan(); |
---|
1529 | |
---|
1530 | //Lower Blackrock Spire |
---|
1531 | |
---|
1532 | // Magister's Terrace |
---|
1533 | AddSC_boss_felblood_kaelthas(); |
---|
1534 | AddSC_boss_selin_fireheart(); |
---|
1535 | AddSC_boss_vexallus(); |
---|
1536 | AddSC_boss_priestess_delrissa(); |
---|
1537 | AddSC_instance_magisters_terrace(); |
---|
1538 | |
---|
1539 | //Maraudon |
---|
1540 | AddSC_boss_celebras_the_cursed(); |
---|
1541 | AddSC_boss_landslide(); |
---|
1542 | AddSC_boss_noxxion(); |
---|
1543 | AddSC_boss_ptheradras(); |
---|
1544 | |
---|
1545 | //Molten core |
---|
1546 | AddSC_boss_lucifron(); |
---|
1547 | AddSC_boss_magmadar(); |
---|
1548 | AddSC_boss_gehennas(); |
---|
1549 | AddSC_boss_garr(); |
---|
1550 | AddSC_boss_baron_geddon(); |
---|
1551 | AddSC_boss_shazzrah(); |
---|
1552 | AddSC_boss_golemagg(); |
---|
1553 | AddSC_boss_sulfuron(); |
---|
1554 | AddSC_boss_majordomo(); |
---|
1555 | AddSC_boss_ragnaros(); |
---|
1556 | AddSC_instance_molten_core(); |
---|
1557 | AddSC_molten_core(); |
---|
1558 | |
---|
1559 | //Moonglade |
---|
1560 | AddSC_moonglade(); |
---|
1561 | |
---|
1562 | //Mulgore |
---|
1563 | AddSC_mulgore(); |
---|
1564 | |
---|
1565 | //Nagrand |
---|
1566 | AddSC_nagrand(); |
---|
1567 | |
---|
1568 | //Naxxramas |
---|
1569 | AddSC_boss_anubrekhan(); |
---|
1570 | AddSC_boss_maexxna(); |
---|
1571 | AddSC_boss_patchwerk(); |
---|
1572 | AddSC_boss_razuvious(); |
---|
1573 | AddSC_boss_highlord_mograine(); |
---|
1574 | AddSC_boss_lady_blaumeux(); |
---|
1575 | AddSC_boss_sir_zeliek(); |
---|
1576 | AddSC_boss_thane_korthazz(); |
---|
1577 | AddSC_boss_kelthuzad(); |
---|
1578 | AddSC_boss_faerlina(); |
---|
1579 | AddSC_boss_loatheb(); |
---|
1580 | AddSC_boss_noth(); |
---|
1581 | AddSC_boss_gluth(); |
---|
1582 | AddSC_boss_sapphiron(); |
---|
1583 | |
---|
1584 | //Netherstorm |
---|
1585 | AddSC_netherstorm(); |
---|
1586 | |
---|
1587 | //Onyxia's Lair |
---|
1588 | AddSC_boss_onyxia(); |
---|
1589 | |
---|
1590 | //Orgrimmar |
---|
1591 | AddSC_orgrimmar(); |
---|
1592 | |
---|
1593 | //Ragefire Chasm |
---|
1594 | //Razorfen Downs |
---|
1595 | AddSC_boss_amnennar_the_coldbringer(); |
---|
1596 | |
---|
1597 | //Redridge Mountains |
---|
1598 | //Ruins of Ahn'Qiraj |
---|
1599 | //Scarlet Monastery |
---|
1600 | AddSC_boss_arcanist_doan(); |
---|
1601 | AddSC_boss_azshir_the_sleepless(); |
---|
1602 | AddSC_boss_bloodmage_thalnos(); |
---|
1603 | AddSC_boss_herod(); |
---|
1604 | AddSC_boss_high_inquisitor_fairbanks(); |
---|
1605 | AddSC_boss_high_inquisitor_whitemane(); |
---|
1606 | AddSC_boss_houndmaster_loksey(); |
---|
1607 | AddSC_boss_interrogator_vishas(); |
---|
1608 | AddSC_boss_scarlet_commander_mograine(); |
---|
1609 | AddSC_boss_scorn(); |
---|
1610 | |
---|
1611 | //Scholomance |
---|
1612 | AddSC_boss_darkmaster_gandling(); |
---|
1613 | AddSC_boss_death_knight_darkreaver(); |
---|
1614 | AddSC_boss_theolenkrastinov(); |
---|
1615 | AddSC_boss_illuciabarov(); |
---|
1616 | AddSC_boss_instructormalicia(); |
---|
1617 | AddSC_boss_jandicebarov(); |
---|
1618 | AddSC_boss_kormok(); |
---|
1619 | AddSC_boss_lordalexeibarov(); |
---|
1620 | AddSC_boss_lorekeeperpolkelt(); |
---|
1621 | AddSC_boss_rasfrost(); |
---|
1622 | AddSC_boss_theravenian(); |
---|
1623 | AddSC_boss_vectus(); |
---|
1624 | AddSC_instance_scholomance(); |
---|
1625 | |
---|
1626 | //Searing gorge |
---|
1627 | AddSC_searing_gorge(); |
---|
1628 | |
---|
1629 | //Shadowfang keep |
---|
1630 | AddSC_shadowfang_keep(); |
---|
1631 | AddSC_instance_shadowfang_keep(); |
---|
1632 | |
---|
1633 | //Shadowmoon Valley |
---|
1634 | AddSC_boss_doomwalker(); |
---|
1635 | AddSC_shadowmoon_valley(); |
---|
1636 | |
---|
1637 | //Shattrath |
---|
1638 | AddSC_shattrath_city(); |
---|
1639 | |
---|
1640 | //Silithus |
---|
1641 | AddSC_silithus(); |
---|
1642 | |
---|
1643 | //Silvermoon |
---|
1644 | AddSC_silvermoon_city(); |
---|
1645 | |
---|
1646 | //Silverpine forest |
---|
1647 | AddSC_silverpine_forest(); |
---|
1648 | |
---|
1649 | //Stockade |
---|
1650 | //Stonetalon mountains |
---|
1651 | AddSC_stonetalon_mountains(); |
---|
1652 | |
---|
1653 | //Stormwind City |
---|
1654 | AddSC_stormwind_city(); |
---|
1655 | |
---|
1656 | //Stranglethorn Vale |
---|
1657 | AddSC_stranglethorn_vale(); |
---|
1658 | |
---|
1659 | //Stratholme |
---|
1660 | AddSC_boss_magistrate_barthilas(); |
---|
1661 | AddSC_boss_maleki_the_pallid(); |
---|
1662 | AddSC_boss_nerubenkan(); |
---|
1663 | AddSC_boss_cannon_master_willey(); |
---|
1664 | AddSC_boss_baroness_anastari(); |
---|
1665 | AddSC_boss_ramstein_the_gorger(); |
---|
1666 | AddSC_boss_timmy_the_cruel(); |
---|
1667 | AddSC_boss_postmaster_malown(); |
---|
1668 | AddSC_boss_baron_rivendare(); |
---|
1669 | AddSC_boss_dathrohan_balnazzar(); |
---|
1670 | AddSC_boss_order_of_silver_hand(); |
---|
1671 | AddSC_instance_stratholme(); |
---|
1672 | AddSC_stratholme(); |
---|
1673 | |
---|
1674 | //Sunken Temple |
---|
1675 | //Tanaris |
---|
1676 | AddSC_tanaris(); |
---|
1677 | |
---|
1678 | //Teldrassil |
---|
1679 | //Tempest Keep |
---|
1680 | //--Arcatraz |
---|
1681 | AddSC_arcatraz(); |
---|
1682 | AddSC_boss_harbinger_skyriss(); |
---|
1683 | AddSC_instance_arcatraz(); |
---|
1684 | |
---|
1685 | //--Botanica |
---|
1686 | AddSC_boss_high_botanist_freywinn(); |
---|
1687 | AddSC_boss_laj(); |
---|
1688 | AddSC_boss_warp_splinter(); |
---|
1689 | |
---|
1690 | //--The Eye |
---|
1691 | AddSC_boss_kaelthas(); |
---|
1692 | AddSC_boss_void_reaver(); |
---|
1693 | AddSC_boss_high_astromancer_solarian(); |
---|
1694 | AddSC_instance_the_eye(); |
---|
1695 | AddSC_the_eye(); |
---|
1696 | |
---|
1697 | //--The Mechanar |
---|
1698 | AddSC_boss_gatewatcher_iron_hand(); |
---|
1699 | AddSC_boss_nethermancer_sepethrea(); |
---|
1700 | |
---|
1701 | //Temple of ahn'qiraj |
---|
1702 | AddSC_boss_cthun(); |
---|
1703 | AddSC_boss_fankriss(); |
---|
1704 | AddSC_boss_huhuran(); |
---|
1705 | AddSC_bug_trio(); |
---|
1706 | AddSC_boss_sartura(); |
---|
1707 | AddSC_boss_skeram(); |
---|
1708 | AddSC_boss_twinemperors(); |
---|
1709 | AddSC_mob_anubisath_sentinel(); |
---|
1710 | AddSC_instance_temple_of_ahnqiraj(); |
---|
1711 | |
---|
1712 | //Terokkar Forest |
---|
1713 | AddSC_terokkar_forest(); |
---|
1714 | |
---|
1715 | //Thousand Needles |
---|
1716 | //Thunder Bluff |
---|
1717 | AddSC_thunder_bluff(); |
---|
1718 | |
---|
1719 | //Tirisfal Glades |
---|
1720 | AddSC_tirisfal_glades(); |
---|
1721 | |
---|
1722 | //Uldaman |
---|
1723 | AddSC_boss_ironaya(); |
---|
1724 | AddSC_uldaman(); |
---|
1725 | |
---|
1726 | //Undercity |
---|
1727 | AddSC_undercity(); |
---|
1728 | |
---|
1729 | //Un'Goro Crater |
---|
1730 | //Upper blackrock spire |
---|
1731 | //Wailing caverns |
---|
1732 | |
---|
1733 | //Western plaguelands |
---|
1734 | AddSC_western_plaguelands(); |
---|
1735 | |
---|
1736 | //Westfall |
---|
1737 | //Wetlands |
---|
1738 | //Winterspring |
---|
1739 | AddSC_winterspring(); |
---|
1740 | |
---|
1741 | //Zangarmarsh |
---|
1742 | AddSC_zangarmarsh(); |
---|
1743 | |
---|
1744 | //Zul'Farrak |
---|
1745 | //Zul'Gurub |
---|
1746 | AddSC_boss_jeklik(); |
---|
1747 | AddSC_boss_venoxis(); |
---|
1748 | AddSC_boss_marli(); |
---|
1749 | AddSC_boss_mandokir(); |
---|
1750 | AddSC_boss_gahzranka(); |
---|
1751 | AddSC_boss_thekal(); |
---|
1752 | AddSC_boss_arlokk(); |
---|
1753 | AddSC_boss_jindo(); |
---|
1754 | AddSC_boss_hakkar(); |
---|
1755 | AddSC_boss_grilek(); |
---|
1756 | AddSC_boss_hazzarah(); |
---|
1757 | AddSC_boss_renataki(); |
---|
1758 | AddSC_boss_wushoolay(); |
---|
1759 | AddSC_instance_zulgurub(); |
---|
1760 | |
---|
1761 | //Zul'Aman |
---|
1762 | AddSC_boss_janalai(); |
---|
1763 | AddSC_boss_nalorakk(); |
---|
1764 | AddSC_instance_zulaman(); |
---|
1765 | AddSC_zulaman(); |
---|
1766 | |
---|
1767 | // ------------------- |
---|
1768 | |
---|
1769 | outstring_log("TSCR: Loaded %u C++ Scripts", nrscripts); |
---|
1770 | outstring_log(""); |
---|
1771 | } |
---|
1772 | |
---|
1773 | //********************************* |
---|
1774 | //*** Functions used internally *** |
---|
1775 | |
---|
1776 | const char* GetEventAILocalizedText(uint32 entry) |
---|
1777 | { |
---|
1778 | if (entry == 0xffffffff) |
---|
1779 | error_log("TSCR: Entry = -1, GetEventAILocalizedText should not be called in this case."); |
---|
1780 | |
---|
1781 | const char* temp = NULL; |
---|
1782 | |
---|
1783 | HM_NAMESPACE::hash_map<uint32, Localized_Text>::iterator i = EventAI_LocalizedTextMap.find(entry); |
---|
1784 | |
---|
1785 | if (i == EventAI_LocalizedTextMap.end()) |
---|
1786 | { |
---|
1787 | error_log("TSCR: EventAI Localized Text %u not found", entry); |
---|
1788 | return DEFAULT_TEXT; |
---|
1789 | } |
---|
1790 | |
---|
1791 | switch (Locale) |
---|
1792 | { |
---|
1793 | case 1: |
---|
1794 | temp = (*i).second.locale_1.c_str(); |
---|
1795 | break; |
---|
1796 | |
---|
1797 | case 2: |
---|
1798 | temp = (*i).second.locale_2.c_str(); |
---|
1799 | break; |
---|
1800 | |
---|
1801 | case 3: |
---|
1802 | temp = (*i).second.locale_3.c_str(); |
---|
1803 | break; |
---|
1804 | |
---|
1805 | case 4: |
---|
1806 | temp = (*i).second.locale_4.c_str(); |
---|
1807 | break; |
---|
1808 | |
---|
1809 | case 5: |
---|
1810 | temp = (*i).second.locale_5.c_str(); |
---|
1811 | break; |
---|
1812 | |
---|
1813 | case 6: |
---|
1814 | temp = (*i).second.locale_6.c_str(); |
---|
1815 | break; |
---|
1816 | |
---|
1817 | case 7: |
---|
1818 | temp = (*i).second.locale_7.c_str(); |
---|
1819 | break; |
---|
1820 | |
---|
1821 | case 8: |
---|
1822 | temp = (*i).second.locale_8.c_str(); |
---|
1823 | break; |
---|
1824 | }; |
---|
1825 | |
---|
1826 | if (strlen(temp)) |
---|
1827 | return temp; |
---|
1828 | |
---|
1829 | return DEFAULT_TEXT; |
---|
1830 | } |
---|
1831 | |
---|
1832 | const char* GetEventAIText(uint32 entry) |
---|
1833 | { |
---|
1834 | if(entry == 0xffffffff) |
---|
1835 | error_log("TSCR: Entry = -1, GetEventAIText should not be called in this case."); |
---|
1836 | |
---|
1837 | const char* str = NULL; |
---|
1838 | |
---|
1839 | HM_NAMESPACE::hash_map<uint32, std::string>::iterator itr = EventAI_Text_Map.find(entry); |
---|
1840 | if(itr == EventAI_Text_Map.end()) |
---|
1841 | { |
---|
1842 | error_log("TSCR: Unable to find EventAI Text %u", entry); |
---|
1843 | return DEFAULT_TEXT; |
---|
1844 | } |
---|
1845 | |
---|
1846 | str = (*itr).second.c_str(); |
---|
1847 | |
---|
1848 | if(strlen(str)) |
---|
1849 | return str; |
---|
1850 | |
---|
1851 | if(strlen((*itr).second.c_str())) |
---|
1852 | return (*itr).second.c_str(); |
---|
1853 | |
---|
1854 | return DEFAULT_TEXT; |
---|
1855 | } |
---|
1856 | |
---|
1857 | void DoScriptText(int32 textEntry, WorldObject* pSource, Unit* target) |
---|
1858 | { |
---|
1859 | if (!pSource) |
---|
1860 | { |
---|
1861 | error_log("TSCR: DoScriptText entry %i, invalid Source pointer.",textEntry); |
---|
1862 | return; |
---|
1863 | } |
---|
1864 | |
---|
1865 | if (textEntry >= 0) |
---|
1866 | { |
---|
1867 | error_log("TSCR: DoScriptText attempts to process entry %i, but entry must be negative.",textEntry); |
---|
1868 | return; |
---|
1869 | } |
---|
1870 | |
---|
1871 | HM_NAMESPACE::hash_map<int32, StringTextData>::iterator i = TextMap.find(textEntry); |
---|
1872 | |
---|
1873 | if (i == TextMap.end()) |
---|
1874 | { |
---|
1875 | error_log("TSCR: DoScriptText could not find text entry %i.",textEntry); |
---|
1876 | return; |
---|
1877 | } |
---|
1878 | |
---|
1879 | if((*i).second.SoundId) |
---|
1880 | { |
---|
1881 | if( GetSoundEntriesStore()->LookupEntry((*i).second.SoundId) ) |
---|
1882 | { |
---|
1883 | pSource->SendPlaySound((*i).second.SoundId, false); |
---|
1884 | } |
---|
1885 | else |
---|
1886 | error_log("TSCR: DoScriptText entry %i tried to process invalid sound id %u.",textEntry,(*i).second.SoundId); |
---|
1887 | } |
---|
1888 | |
---|
1889 | switch((*i).second.Type) |
---|
1890 | { |
---|
1891 | case CHAT_TYPE_SAY: |
---|
1892 | pSource->MonsterSay(textEntry, (*i).second.Language, target ? target->GetGUID() : 0); |
---|
1893 | break; |
---|
1894 | case CHAT_TYPE_YELL: |
---|
1895 | pSource->MonsterYell(textEntry, (*i).second.Language, target ? target->GetGUID() : 0); |
---|
1896 | break; |
---|
1897 | case CHAT_TYPE_TEXT_EMOTE: |
---|
1898 | pSource->MonsterTextEmote(textEntry, target ? target->GetGUID() : 0); |
---|
1899 | break; |
---|
1900 | case CHAT_TYPE_BOSS_EMOTE: |
---|
1901 | pSource->MonsterTextEmote(textEntry, target ? target->GetGUID() : 0, true); |
---|
1902 | break; |
---|
1903 | case CHAT_TYPE_WHISPER: |
---|
1904 | { |
---|
1905 | if (target && target->GetTypeId() == TYPEID_PLAYER) |
---|
1906 | pSource->MonsterWhisper(textEntry, target->GetGUID()); |
---|
1907 | else error_log("TSCR: DoScriptText entry %i cannot whisper without target unit (TYPEID_PLAYER).", textEntry); |
---|
1908 | }break; |
---|
1909 | case CHAT_TYPE_BOSS_WHISPER: |
---|
1910 | { |
---|
1911 | if (target && target->GetTypeId() == TYPEID_PLAYER) |
---|
1912 | pSource->MonsterWhisper(textEntry, target->GetGUID(), true); |
---|
1913 | else error_log("TSCR: DoScriptText entry %i cannot whisper without target unit (TYPEID_PLAYER).", textEntry); |
---|
1914 | }break; |
---|
1915 | } |
---|
1916 | } |
---|
1917 | |
---|
1918 | Script* GetScriptByName(std::string Name) |
---|
1919 | { |
---|
1920 | if(Name.empty()) |
---|
1921 | return NULL; |
---|
1922 | |
---|
1923 | for(int i=0;i<MAX_SCRIPTS;i++) |
---|
1924 | { |
---|
1925 | if( m_scripts[i] && m_scripts[i]->Name == Name ) |
---|
1926 | return m_scripts[i]; |
---|
1927 | } |
---|
1928 | return NULL; |
---|
1929 | } |
---|
1930 | |
---|
1931 | //******************************** |
---|
1932 | //*** Functions to be Exported *** |
---|
1933 | |
---|
1934 | MANGOS_DLL_EXPORT |
---|
1935 | bool GossipHello ( Player * player, Creature *_Creature ) |
---|
1936 | { |
---|
1937 | Script *tmpscript = GetScriptByName(_Creature->GetScriptName()); |
---|
1938 | if(!tmpscript || !tmpscript->pGossipHello) return false; |
---|
1939 | |
---|
1940 | player->PlayerTalkClass->ClearMenus(); |
---|
1941 | return tmpscript->pGossipHello(player,_Creature); |
---|
1942 | } |
---|
1943 | |
---|
1944 | MANGOS_DLL_EXPORT |
---|
1945 | bool GossipSelect( Player *player, Creature *_Creature, uint32 sender, uint32 action ) |
---|
1946 | { |
---|
1947 | debug_log("TSCR: Gossip selection, sender: %d, action: %d",sender, action); |
---|
1948 | |
---|
1949 | Script *tmpscript = GetScriptByName(_Creature->GetScriptName()); |
---|
1950 | if(!tmpscript || !tmpscript->pGossipSelect) return false; |
---|
1951 | |
---|
1952 | player->PlayerTalkClass->ClearMenus(); |
---|
1953 | return tmpscript->pGossipSelect(player,_Creature,sender,action); |
---|
1954 | } |
---|
1955 | |
---|
1956 | MANGOS_DLL_EXPORT |
---|
1957 | bool GossipSelectWithCode( Player *player, Creature *_Creature, uint32 sender, uint32 action, const char* sCode ) |
---|
1958 | { |
---|
1959 | debug_log("TSCR: Gossip selection with code, sender: %d, action: %d",sender, action); |
---|
1960 | |
---|
1961 | Script *tmpscript = GetScriptByName(_Creature->GetScriptName()); |
---|
1962 | if(!tmpscript || !tmpscript->pGossipSelectWithCode) return false; |
---|
1963 | |
---|
1964 | player->PlayerTalkClass->ClearMenus(); |
---|
1965 | return tmpscript->pGossipSelectWithCode(player,_Creature,sender,action,sCode); |
---|
1966 | } |
---|
1967 | |
---|
1968 | MANGOS_DLL_EXPORT |
---|
1969 | bool QuestAccept( Player *player, Creature *_Creature, Quest const *_Quest ) |
---|
1970 | { |
---|
1971 | Script *tmpscript = GetScriptByName(_Creature->GetScriptName()); |
---|
1972 | if(!tmpscript || !tmpscript->pQuestAccept) return false; |
---|
1973 | |
---|
1974 | player->PlayerTalkClass->ClearMenus(); |
---|
1975 | return tmpscript->pQuestAccept(player,_Creature,_Quest); |
---|
1976 | } |
---|
1977 | |
---|
1978 | MANGOS_DLL_EXPORT |
---|
1979 | bool QuestSelect( Player *player, Creature *_Creature, Quest const *_Quest ) |
---|
1980 | { |
---|
1981 | Script *tmpscript = GetScriptByName(_Creature->GetScriptName()); |
---|
1982 | if(!tmpscript || !tmpscript->pQuestSelect) return false; |
---|
1983 | |
---|
1984 | player->PlayerTalkClass->ClearMenus(); |
---|
1985 | return tmpscript->pQuestSelect(player,_Creature,_Quest); |
---|
1986 | } |
---|
1987 | |
---|
1988 | MANGOS_DLL_EXPORT |
---|
1989 | bool QuestComplete( Player *player, Creature *_Creature, Quest const *_Quest ) |
---|
1990 | { |
---|
1991 | Script *tmpscript = GetScriptByName(_Creature->GetScriptName()); |
---|
1992 | if(!tmpscript || !tmpscript->pQuestComplete) return false; |
---|
1993 | |
---|
1994 | player->PlayerTalkClass->ClearMenus(); |
---|
1995 | return tmpscript->pQuestComplete(player,_Creature,_Quest); |
---|
1996 | } |
---|
1997 | |
---|
1998 | MANGOS_DLL_EXPORT |
---|
1999 | bool ChooseReward( Player *player, Creature *_Creature, Quest const *_Quest, uint32 opt ) |
---|
2000 | { |
---|
2001 | Script *tmpscript = GetScriptByName(_Creature->GetScriptName()); |
---|
2002 | if(!tmpscript || !tmpscript->pChooseReward) return false; |
---|
2003 | |
---|
2004 | player->PlayerTalkClass->ClearMenus(); |
---|
2005 | return tmpscript->pChooseReward(player,_Creature,_Quest,opt); |
---|
2006 | } |
---|
2007 | |
---|
2008 | MANGOS_DLL_EXPORT |
---|
2009 | uint32 NPCDialogStatus( Player *player, Creature *_Creature ) |
---|
2010 | { |
---|
2011 | Script *tmpscript = GetScriptByName(_Creature->GetScriptName()); |
---|
2012 | if(!tmpscript || !tmpscript->pNPCDialogStatus) return 100; |
---|
2013 | |
---|
2014 | player->PlayerTalkClass->ClearMenus(); |
---|
2015 | return tmpscript->pNPCDialogStatus(player,_Creature); |
---|
2016 | } |
---|
2017 | |
---|
2018 | MANGOS_DLL_EXPORT |
---|
2019 | uint32 GODialogStatus( Player *player, GameObject *_GO ) |
---|
2020 | { |
---|
2021 | Script *tmpscript = GetScriptByName(_GO->GetGOInfo()->ScriptName); |
---|
2022 | if(!tmpscript || !tmpscript->pGODialogStatus) return 100; |
---|
2023 | |
---|
2024 | player->PlayerTalkClass->ClearMenus(); |
---|
2025 | return tmpscript->pGODialogStatus(player,_GO); |
---|
2026 | } |
---|
2027 | |
---|
2028 | MANGOS_DLL_EXPORT |
---|
2029 | bool ItemHello( Player *player, Item *_Item, Quest const *_Quest ) |
---|
2030 | { |
---|
2031 | Script *tmpscript = GetScriptByName(_Item->GetProto()->ScriptName); |
---|
2032 | if(!tmpscript || !tmpscript->pItemHello) return false; |
---|
2033 | |
---|
2034 | player->PlayerTalkClass->ClearMenus(); |
---|
2035 | return tmpscript->pItemHello(player,_Item,_Quest); |
---|
2036 | } |
---|
2037 | |
---|
2038 | MANGOS_DLL_EXPORT |
---|
2039 | bool ItemQuestAccept( Player *player, Item *_Item, Quest const *_Quest ) |
---|
2040 | { |
---|
2041 | Script *tmpscript = GetScriptByName(_Item->GetProto()->ScriptName); |
---|
2042 | if(!tmpscript || !tmpscript->pItemQuestAccept) return false; |
---|
2043 | |
---|
2044 | player->PlayerTalkClass->ClearMenus(); |
---|
2045 | return tmpscript->pItemQuestAccept(player,_Item,_Quest); |
---|
2046 | } |
---|
2047 | |
---|
2048 | MANGOS_DLL_EXPORT |
---|
2049 | bool GOHello( Player *player, GameObject *_GO ) |
---|
2050 | { |
---|
2051 | Script *tmpscript = GetScriptByName(_GO->GetGOInfo()->ScriptName); |
---|
2052 | if(!tmpscript || !tmpscript->pGOHello) return false; |
---|
2053 | |
---|
2054 | player->PlayerTalkClass->ClearMenus(); |
---|
2055 | return tmpscript->pGOHello(player,_GO); |
---|
2056 | } |
---|
2057 | |
---|
2058 | MANGOS_DLL_EXPORT |
---|
2059 | bool GOQuestAccept( Player *player, GameObject *_GO, Quest const *_Quest ) |
---|
2060 | { |
---|
2061 | Script *tmpscript = GetScriptByName(_GO->GetGOInfo()->ScriptName); |
---|
2062 | if(!tmpscript || !tmpscript->pGOQuestAccept) return false; |
---|
2063 | |
---|
2064 | player->PlayerTalkClass->ClearMenus(); |
---|
2065 | return tmpscript->pGOQuestAccept(player,_GO,_Quest); |
---|
2066 | } |
---|
2067 | |
---|
2068 | MANGOS_DLL_EXPORT |
---|
2069 | bool GOChooseReward( Player *player, GameObject *_GO, Quest const *_Quest, uint32 opt ) |
---|
2070 | { |
---|
2071 | Script *tmpscript = GetScriptByName(_GO->GetGOInfo()->ScriptName); |
---|
2072 | if(!tmpscript || !tmpscript->pGOChooseReward) return false; |
---|
2073 | |
---|
2074 | player->PlayerTalkClass->ClearMenus(); |
---|
2075 | return tmpscript->pGOChooseReward(player,_GO,_Quest,opt); |
---|
2076 | } |
---|
2077 | |
---|
2078 | MANGOS_DLL_EXPORT |
---|
2079 | bool AreaTrigger( Player *player, AreaTriggerEntry * atEntry) |
---|
2080 | { |
---|
2081 | Script *tmpscript = NULL; |
---|
2082 | |
---|
2083 | tmpscript = GetScriptByName(GetAreaTriggerScriptNameById(atEntry->id)); |
---|
2084 | if(!tmpscript || !tmpscript->pAreaTrigger) return false; |
---|
2085 | |
---|
2086 | return tmpscript->pAreaTrigger(player, atEntry); |
---|
2087 | } |
---|
2088 | |
---|
2089 | MANGOS_DLL_EXPORT |
---|
2090 | CreatureAI* GetAI(Creature *_Creature) |
---|
2091 | { |
---|
2092 | Script *tmpscript = GetScriptByName(_Creature->GetScriptName()); |
---|
2093 | |
---|
2094 | if(!tmpscript || !tmpscript->GetAI) return NULL; |
---|
2095 | return tmpscript->GetAI(_Creature); |
---|
2096 | } |
---|
2097 | |
---|
2098 | MANGOS_DLL_EXPORT |
---|
2099 | bool ItemUse( Player *player, Item* _Item, SpellCastTargets const& targets) |
---|
2100 | { |
---|
2101 | Script *tmpscript = GetScriptByName(_Item->GetProto()->ScriptName); |
---|
2102 | if(!tmpscript || !tmpscript->pItemUse) return false; |
---|
2103 | |
---|
2104 | return tmpscript->pItemUse(player,_Item,targets); |
---|
2105 | } |
---|
2106 | |
---|
2107 | MANGOS_DLL_EXPORT |
---|
2108 | bool ReceiveEmote( Player *player, Creature *_Creature, uint32 emote ) |
---|
2109 | { |
---|
2110 | Script *tmpscript = GetScriptByName(_Creature->GetScriptName()); |
---|
2111 | if(!tmpscript || !tmpscript->pReceiveEmote) return false; |
---|
2112 | |
---|
2113 | return tmpscript->pReceiveEmote(player, _Creature, emote); |
---|
2114 | } |
---|
2115 | |
---|
2116 | MANGOS_DLL_EXPORT |
---|
2117 | InstanceData* CreateInstanceData(Map *map) |
---|
2118 | { |
---|
2119 | Script *tmpscript = NULL; |
---|
2120 | |
---|
2121 | if(!map->IsDungeon()) return false; |
---|
2122 | |
---|
2123 | tmpscript = GetScriptByName(((InstanceMap*)map)->GetScript()); |
---|
2124 | if(!tmpscript || !tmpscript->GetInstanceData) return false; |
---|
2125 | |
---|
2126 | return tmpscript->GetInstanceData(map); |
---|
2127 | } |
---|