root/trunk/src/bindings/scripts/ScriptMgr.cpp @ 105

Revision 105, 62.9 kB (checked in by yumileroy, 17 years ago)

[svn] Fix cloak of shadow, can remove fairy fire now.
Add yells to High King Maulgar. Patch provided by riddick.
Script for Prince Malchezaar Doors. Patch provided by BroodWyrm?.
Bug fix for Selin Fireheart. Patch provided by BroodWyrm?.
Arcane Charges only while on flightpath. Patch provided by SLG.

Original author: megamage
Date: 2008-10-23 22:04:14-05:00

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