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

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

[svn] * Continue Trinity Script conversion.

Original author: Seline
Date: 2008-10-03 19:21:26-05:00

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