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