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