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

Revision 37, 62.7 kB (checked in by yumileroy, 17 years ago)

[svn] * svn:eol-style native set on all files that need it

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