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

Revision 2, 61.9 kB (checked in by yumileroy, 17 years ago)

[svn] * Proper SVN structure

Original author: Neo2003
Date: 2008-10-02 16:23:55-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 ScriptDev2DB;
84Config SD2Config;
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 (!SD2Config.GetString("ScriptDev2DatabaseInfo", &dbstring))
601        error_log("SD2: Missing ScriptDev2 Database Info from configuration file");
602
603    //Initilize connection to DB
604    if (!dbstring || !ScriptDev2DB.Initialize(dbstring))
605        error_db_log("SD2: Unable to connect to Database");
606    else
607    {
608        //***Preform all DB queries here***
609        QueryResult *result;
610
611        //Get Version information
612        result = ScriptDev2DB.PQuery("SELECT `version`"
613            "FROM `sd2_db_version`");
614
615        if (result)
616        {
617            Field *fields = result->Fetch();
618            outstring_log(" ");
619            outstring_log("SD2: Database version is: %s", fields[0].GetString());
620            outstring_log(" ");
621            delete result;
622
623        }else error_db_log("SD2: Missing sd2_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 = ScriptDev2DB.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("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("SD2: Loaded %u EventAI Localized Texts", count);
665        }else outstring_log("SD2: 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 = ScriptDev2DB.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("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("SD2: Loaded %u Script Localized Texts", count);
707        }else outstring_log("SD2: 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 = ScriptDev2DB.PQuery("SELECT `id`,`text` FROM `eventai_texts`");
714
715        if (result)
716        {
717            outstring_log( "SD2: 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("SD2: 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("SD2: >> Loaded %u EventAI_Texts", Count);
742
743        }else outstring_log("SD2: WARNING >> Loaded 0 EventAI_Texts. DB table `EventAI_Texts` is empty.");
744
745        //Gather event data
746        result = ScriptDev2DB.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( "SD2: 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("SD2: >> Loaded %u EventAI_Summons", Count);
781
782        }else outstring_log("SD2: WARNING >> Loaded 0 EventAI_Summons. DB table `EventAI_Summons` is empty.");
783
784        //Gather event data
785        result = ScriptDev2DB.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( "SD2: 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("SD2: 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("SD2: 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("SD2: 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("SD2: 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("SD2: 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("SD2: 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("SD2: 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("SD2: 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("SD2: 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("SD2: 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("SD2: 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("SD2: 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("SD2: 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("SD2: 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("SD2: 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("SD2: 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("SD2: 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("SD2: 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("SD2: 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("SD2: 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("SD2: 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("SD2: 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("SD2: 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("SD2: 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("SD2: 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("SD2: 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("SD2: 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("SD2: 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("SD2: 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("SD2: 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("SD2 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("SD2: 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("SD2: 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("SD2: >> Loaded %u EventAI_Events", Count);
1045
1046        }else outstring_log("SD2: WARNING >> Loaded 0 EventAI_Scripts. DB table `EventAI_Scripts` is empty.");
1047
1048        // Gather Script Text
1049        result = ScriptDev2DB.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("SD2: 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("SD2: 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("SD2: 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("SD2: Loaded %u Script Texts", count);
1091
1092        }else outstring_log("SD2 WARNING >> Loaded 0 Script Texts. Database table `script_texts` is empty.");
1093
1094        //Free database thread and resources
1095        ScriptDev2DB.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    //ScriptDev2 startup
1123    outstring_log("");
1124    outstring_log(" MMM  MMM    MM");
1125    outstring_log("M  MM M  M  M  M");
1126    outstring_log("MM    M   M   M");
1127    outstring_log(" MMM  M   M  M");
1128    outstring_log("   MM M   M MMMM");
1129    outstring_log("MM  M M  M ");
1130    outstring_log(" MMM  MMM  http://www.scriptdev2.com");
1131    outstring_log("");
1132
1133    outstring_log("ScriptDev2 initializing %s", _FULLVERSION);
1134
1135    outstring_log("");
1136
1137    //Get configuration file
1138    if (!SD2Config.SetSource(_TRINITY_SCRIPT_CONFIG))
1139        error_log("SD2: Unable to open configuration file, Database will be unaccessible");
1140    else outstring_log("SD2: Using configuration file %s", _TRINITY_SCRIPT_CONFIG);
1141
1142
1143    //Check config file version
1144    if (SD2Config.GetIntDefault("ConfVersion", 0) != _TSCRIPTCONFVERSION)
1145        error_log("SD2: Configuration file version doesn't match expected version. Some config variables may be wrong or missing.");
1146
1147    //Locale
1148    Locale = SD2Config.GetIntDefault("Locale", 0);
1149
1150    if (Locale > 8)
1151    {
1152        Locale = 0;
1153        error_log("SD2: Locale set to invalid language id. Defaulting to 0.");
1154    }
1155
1156    outstring_log("SD2: Using locale %u", Locale);
1157    outstring_log("");
1158
1159    EAI_ErrorLevel = SD2Config.GetIntDefault("EAIErrorLevel", 1);
1160
1161    switch (EAI_ErrorLevel)
1162    {
1163    case 0:
1164        outstring_log("SD2: EventAI Error Reporting level set to 0 (Startup Errors only)");
1165        break;
1166
1167    case 1:
1168        outstring_log("SD2: EventAI Error Reporting level set to 1 (Startup errors and Runtime event errors)");
1169        break;
1170
1171    case 2:
1172        outstring_log("SD2: EventAI Error Reporting level set to 2 (Startup errors, Runtime event errors, and Creation errors)");
1173        break;
1174
1175    default:
1176        outstring_log("SD2: Unknown EventAI Error Reporting level. Defaulting to 1 (Startup errors and Runtime event errors)");
1177        EAI_ErrorLevel = 1;
1178        break;
1179    }
1180    outstring_log("");
1181
1182    //Load database (must be called after SD2Config.SetSource)
1183    LoadDatabase();
1184
1185    nrscripts = 0;
1186    for(int i=0;i<MAX_SCRIPTS;i++)
1187        m_scripts[i]=NULL;
1188
1189    FillSpellSummary();
1190
1191    // -- Scripts to be added --
1192
1193    // -- Areatrigger --
1194    AddSC_areatrigger_scripts();
1195
1196    // -- Boss --
1197    AddSC_boss_emeriss();
1198    AddSC_boss_taerar();
1199    AddSC_boss_ysondre();
1200
1201    // -- Creature --
1202    AddSC_mob_event();
1203    AddSC_generic_creature();
1204
1205    // -- Custom --
1206    AddSC_custom_example();
1207    AddSC_custom_gossip_codebox();
1208    AddSC_test();
1209
1210    // -- GO --
1211    AddSC_go_scripts();
1212
1213    // -- Guard --
1214    AddSC_guards();
1215
1216    // -- Honor --
1217
1218    // -- Item --
1219    AddSC_item_scripts();
1220    AddSC_item_test();
1221
1222    // -- NPC --
1223    AddSC_npc_professions();
1224    AddSC_npcs_special();
1225
1226    // -- Servers --
1227
1228    //--------------------
1229    //------ ZONE --------
1230
1231    //Alterac Mountains
1232    AddSC_alterac_mountains();
1233
1234    //Arathi Highlands
1235    //Ashenvale Forest
1236    //Aunchindoun
1237    //--Auchenai Crypts
1238    AddSC_boss_exarch_maladaar();
1239
1240    //--Mana Tombs
1241    AddSC_boss_nexusprince_shaffar();
1242    AddSC_boss_pandemonius();
1243
1244    //--Sekketh Halls
1245    AddSC_boss_darkweaver_syth();
1246    AddSC_boss_talon_king_ikiss();
1247    AddSC_instance_sethekk_halls();
1248
1249    //--Shadow Labyrinth
1250    AddSC_boss_ambassador_hellmaw();
1251    AddSC_boss_blackheart_the_inciter();
1252    AddSC_boss_grandmaster_vorpil();
1253    AddSC_boss_murmur();
1254    AddSC_instance_shadow_labyrinth();
1255
1256    //Azshara
1257    AddSC_boss_azuregos();
1258    AddSC_azshara();
1259
1260    //Azuremyst Isle
1261    AddSC_azuremyst_isle();
1262
1263    //Badlands
1264    //Barrens
1265    AddSC_the_barrens();
1266
1267    //Black Temple
1268    AddSC_black_temple();
1269    AddSC_boss_illidan();
1270    AddSC_boss_shade_of_akama();
1271    AddSC_boss_supremus();
1272    AddSC_boss_gurtogg_bloodboil();
1273    AddSC_boss_mother_shahraz();
1274    AddSC_boss_reliquary_of_souls();
1275    AddSC_boss_teron_gorefiend();
1276    AddSC_boss_najentus();
1277    AddSC_boss_illidari_council();
1278    AddSC_instance_black_temple();
1279
1280    //Blackfathom Depths
1281    //Blackrock Depths
1282    AddSC_blackrock_depths();
1283    AddSC_boss_ambassador_flamelash();
1284    AddSC_boss_angerrel();
1285    AddSC_boss_anubshiah();
1286    AddSC_boss_doomrel();
1287    AddSC_boss_doperel();
1288    AddSC_boss_draganthaurissan();
1289    AddSC_boss_general_angerforge();
1290    AddSC_boss_gloomrel();
1291    AddSC_boss_gorosh_the_dervish();
1292    AddSC_boss_grizzle();
1293    AddSC_boss_haterel();
1294    AddSC_boss_high_interrogator_gerstahn();
1295    AddSC_boss_magmus();
1296    AddSC_boss_moira_bronzebeard();
1297    AddSC_boss_seethrel();
1298    AddSC_boss_vilerel();
1299
1300    //Blackrock Spire
1301    AddSC_boss_drakkisath();
1302    AddSC_boss_halycon();
1303    AddSC_boss_highlordomokk();
1304    AddSC_boss_mothersmolderweb();
1305    AddSC_boss_overlordwyrmthalak();
1306    AddSC_boss_shadowvosh();
1307    AddSC_boss_thebeast();
1308    AddSC_boss_warmastervoone();
1309    AddSC_boss_quatermasterzigris();
1310    AddSC_boss_pyroguard_emberseer();
1311    AddSC_boss_gyth();
1312    AddSC_boss_rend_blackhand();
1313
1314    //Blackwing lair
1315    AddSC_boss_razorgore();
1316    AddSC_boss_vael();
1317    AddSC_boss_broodlord();
1318    AddSC_boss_firemaw();
1319    AddSC_boss_ebonroc();
1320    AddSC_boss_flamegor();
1321    AddSC_boss_chromaggus();
1322    AddSC_boss_nefarian();
1323    AddSC_boss_victor_nefarius();
1324
1325    //Blade's Edge Mountains
1326    AddSC_blades_edge_mountains();
1327
1328    //Blasted lands
1329    AddSC_boss_kruul();
1330    AddSC_blasted_lands();
1331
1332    //Bloodmyst Isle
1333    AddSC_bloodmyst_isle();
1334
1335    //Burning steppes
1336    AddSC_burning_steppes();
1337
1338    //Caverns of Time
1339    //--Battle for Mt. Hyjal
1340    AddSC_hyjal();
1341    AddSC_boss_archimonde();
1342    AddSC_instance_mount_hyjal();
1343
1344    //--Old Hillsbrad
1345    AddSC_boss_captain_skarloc();
1346    AddSC_boss_epoch_hunter();
1347    AddSC_boss_lieutenant_drake();
1348    AddSC_instance_old_hillsbrad();
1349    AddSC_old_hillsbrad();
1350
1351    //--The Dark Portal
1352    AddSC_boss_aeonus();
1353    AddSC_boss_chrono_lord_deja();
1354    AddSC_boss_temporus();
1355
1356    //Coilfang Resevoir
1357    //--Serpent Shrine Cavern
1358    AddSC_boss_fathomlord_karathress();
1359    AddSC_boss_hydross_the_unstable();
1360    AddSC_boss_lady_vashj();
1361    AddSC_boss_leotheras_the_blind();
1362    AddSC_boss_morogrim_tidewalker();
1363    AddSC_instance_serpentshrine_cavern();
1364
1365    //--Slave Pens
1366    //--Steam Vault
1367    AddSC_boss_hydromancer_thespia();
1368    AddSC_boss_mekgineer_steamrigger();
1369    AddSC_boss_warlord_kalithresh();
1370    AddSC_instance_steam_vault();
1371
1372    //--Underbog
1373    AddSC_boss_hungarfen();
1374
1375    //Darkshore
1376    //Darnassus
1377    //Deadmines
1378    //Deadwind pass
1379    //Desolace
1380    //Dire Maul
1381    //Dun Morogh
1382    AddSC_dun_morogh();
1383
1384    //Durotar
1385    //Duskwood
1386    //Dustwallow marsh
1387    AddSC_dustwallow_marsh();
1388
1389    //Eversong Woods
1390    AddSC_eversong_woods();
1391
1392    //Exodar
1393    //Eastern Plaguelands
1394    AddSC_eastern_plaguelands();
1395
1396    //Elwynn Forest
1397    AddSC_elwynn_forest();
1398
1399    //Felwood
1400    AddSC_felwood();
1401
1402    //Feralas
1403    AddSC_feralas();
1404
1405    //Ghostlands
1406    AddSC_ghostlands();
1407
1408    //Gnomeregan
1409    //Gruul's Lair
1410    AddSC_boss_gruul();
1411    AddSC_boss_high_king_maulgar();
1412    AddSC_instance_gruuls_lair();
1413
1414    //Hellfire Citadel
1415    //--Blood Furnace
1416    AddSC_boss_broggok();
1417    AddSC_boss_kelidan_the_breaker();
1418    AddSC_boss_the_maker();
1419
1420    //--Magtheridon's Lair
1421    AddSC_boss_magtheridon();
1422    AddSC_instance_magtheridons_lair();
1423
1424    //--Shattered Halls
1425    AddSC_boss_grand_warlock_nethekurse();
1426    AddSC_boss_warbringer_omrogg();
1427    AddSC_instance_shattered_halls();
1428
1429    //--Ramparts
1430    AddSC_boss_watchkeeper_gargolmar();
1431    AddSC_boss_omor_the_unscarred();
1432
1433    //Hellfire Peninsula
1434    AddSC_boss_doomlordkazzak();
1435    AddSC_hellfire_peninsula();
1436
1437    //Hillsbrad Foothills
1438    //Hinterlands
1439    //Ironforge
1440    AddSC_ironforge();
1441
1442    //Isle of Quel'Danas
1443    AddSC_isle_of_queldanas();
1444
1445    //Karazhan
1446    AddSC_boss_attumen();
1447    AddSC_boss_curator();
1448    AddSC_boss_maiden_of_virtue();
1449    AddSC_boss_shade_of_aran();
1450    AddSC_boss_malchezaar();
1451    AddSC_boss_terestian_illhoof();
1452    AddSC_netherspite_infernal();
1453    AddSC_boss_moroes();
1454    AddSC_bosses_opera();
1455    AddSC_instance_karazhan();
1456    AddSC_karazhan();
1457
1458    //Loch Modan
1459    AddSC_loch_modan();
1460
1461    //Lower Blackrock Spire
1462
1463    // Magister's Terrace
1464    AddSC_boss_felblood_kaelthas();
1465    AddSC_boss_selin_fireheart();
1466    AddSC_boss_vexallus();
1467    AddSC_boss_priestess_delrissa();
1468    AddSC_instance_magisters_terrace();
1469
1470    //Maraudon
1471    AddSC_boss_celebras_the_cursed();
1472    AddSC_boss_landslide();
1473    AddSC_boss_noxxion();
1474    AddSC_boss_ptheradras();
1475
1476    //Molten core
1477    AddSC_boss_lucifron();
1478    AddSC_boss_magmadar();
1479    AddSC_boss_gehennas();
1480    AddSC_boss_garr();
1481    AddSC_boss_baron_geddon();
1482    AddSC_boss_shazzrah();
1483    AddSC_boss_golemagg();
1484    AddSC_boss_sulfuron();
1485    AddSC_boss_majordomo();
1486    AddSC_boss_ragnaros();
1487    AddSC_instance_molten_core();
1488    AddSC_molten_core();
1489
1490    //Moonglade
1491    AddSC_moonglade();
1492
1493    //Mulgore
1494    AddSC_mulgore();
1495
1496    //Nagrand
1497    AddSC_nagrand();
1498
1499    //Naxxramas
1500    AddSC_boss_anubrekhan();
1501    AddSC_boss_maexxna();
1502    AddSC_boss_patchwerk();
1503    AddSC_boss_razuvious();
1504    AddSC_boss_highlord_mograine();
1505    AddSC_boss_lady_blaumeux();
1506    AddSC_boss_sir_zeliek();
1507    AddSC_boss_thane_korthazz();
1508    AddSC_boss_kelthuzad();
1509    AddSC_boss_faerlina();
1510    AddSC_boss_loatheb();
1511    AddSC_boss_noth();
1512    AddSC_boss_gluth();
1513    AddSC_boss_sapphiron();
1514
1515    //Netherstorm
1516    AddSC_netherstorm();
1517
1518    //Onyxia's Lair
1519    AddSC_boss_onyxia();
1520
1521    //Orgrimmar
1522    AddSC_orgrimmar();
1523
1524    //Ragefire Chasm
1525    //Razorfen Downs
1526    AddSC_boss_amnennar_the_coldbringer();
1527
1528    //Redridge Mountains
1529    //Ruins of Ahn'Qiraj
1530    //Scarlet Monastery
1531    AddSC_boss_arcanist_doan();
1532    AddSC_boss_azshir_the_sleepless();
1533    AddSC_boss_bloodmage_thalnos();
1534    AddSC_boss_herod();
1535    AddSC_boss_high_inquisitor_fairbanks();
1536    AddSC_boss_high_inquisitor_whitemane();
1537    AddSC_boss_houndmaster_loksey();
1538    AddSC_boss_interrogator_vishas();
1539    AddSC_boss_scarlet_commander_mograine();
1540    AddSC_boss_scorn();
1541
1542    //Scholomance
1543    AddSC_boss_darkmaster_gandling();
1544    AddSC_boss_death_knight_darkreaver();
1545    AddSC_boss_theolenkrastinov();
1546    AddSC_boss_illuciabarov();
1547    AddSC_boss_instructormalicia();
1548    AddSC_boss_jandicebarov();
1549    AddSC_boss_kormok();
1550    AddSC_boss_lordalexeibarov();
1551    AddSC_boss_lorekeeperpolkelt();
1552    AddSC_boss_rasfrost();
1553    AddSC_boss_theravenian();
1554    AddSC_boss_vectus();
1555    AddSC_instance_scholomance();
1556
1557    //Searing gorge
1558    AddSC_searing_gorge();
1559
1560    //Shadowfang keep
1561    AddSC_shadowfang_keep();
1562    AddSC_instance_shadowfang_keep();
1563
1564    //Shadowmoon Valley
1565    AddSC_boss_doomwalker();
1566    AddSC_shadowmoon_valley();
1567
1568    //Shattrath
1569    AddSC_shattrath_city();
1570
1571    //Silithus
1572    AddSC_silithus();
1573
1574    //Silvermoon
1575    AddSC_silvermoon_city();
1576
1577    //Silverpine forest
1578    AddSC_silverpine_forest();
1579
1580    //Stockade
1581    //Stonetalon mountains
1582    AddSC_stonetalon_mountains();
1583
1584    //Stormwind City
1585    AddSC_stormwind_city();
1586
1587    //Stranglethorn Vale
1588    AddSC_stranglethorn_vale();
1589
1590    //Stratholme
1591    AddSC_boss_magistrate_barthilas();
1592    AddSC_boss_maleki_the_pallid();
1593    AddSC_boss_nerubenkan();
1594    AddSC_boss_cannon_master_willey();
1595    AddSC_boss_baroness_anastari();
1596    AddSC_boss_ramstein_the_gorger();
1597    AddSC_boss_timmy_the_cruel();
1598    AddSC_boss_postmaster_malown();
1599    AddSC_boss_baron_rivendare();
1600    AddSC_boss_dathrohan_balnazzar();
1601    AddSC_boss_order_of_silver_hand();
1602    AddSC_instance_stratholme();
1603    AddSC_stratholme();
1604
1605    //Sunken Temple
1606    //Tanaris
1607    AddSC_tanaris();
1608
1609    //Teldrassil
1610    //Tempest Keep
1611    //--Arcatraz
1612    AddSC_arcatraz();
1613    AddSC_boss_harbinger_skyriss();
1614    AddSC_instance_arcatraz();
1615
1616    //--Botanica
1617    AddSC_boss_high_botanist_freywinn();
1618    AddSC_boss_laj();
1619    AddSC_boss_warp_splinter();
1620
1621    //--The Eye
1622    AddSC_boss_kaelthas();
1623    AddSC_boss_void_reaver();
1624    AddSC_boss_high_astromancer_solarian();
1625    AddSC_instance_the_eye();
1626    AddSC_the_eye();
1627
1628    //--The Mechanar
1629    AddSC_boss_gatewatcher_iron_hand();
1630    AddSC_boss_nethermancer_sepethrea();
1631
1632    //Temple of ahn'qiraj
1633    AddSC_boss_cthun();
1634    AddSC_boss_fankriss();
1635    AddSC_boss_huhuran();
1636    AddSC_bug_trio();
1637    AddSC_boss_sartura();
1638    AddSC_boss_skeram();
1639    AddSC_boss_twinemperors();
1640    AddSC_mob_anubisath_sentinel();
1641    AddSC_instance_temple_of_ahnqiraj();
1642
1643    //Terokkar Forest
1644    AddSC_terokkar_forest();
1645
1646    //Thousand Needles
1647    //Thunder Bluff
1648    AddSC_thunder_bluff();
1649
1650    //Tirisfal Glades
1651    AddSC_tirisfal_glades();
1652
1653    //Uldaman
1654    AddSC_boss_ironaya();
1655    AddSC_uldaman();
1656
1657    //Undercity
1658    AddSC_undercity();
1659
1660    //Un'Goro Crater
1661    //Upper blackrock spire
1662    //Wailing caverns
1663
1664    //Western plaguelands
1665    AddSC_western_plaguelands();
1666
1667    //Westfall
1668    //Wetlands
1669    //Winterspring
1670    AddSC_winterspring();
1671
1672    //Zangarmarsh
1673    AddSC_zangarmarsh();
1674
1675    //Zul'Farrak
1676    //Zul'Gurub
1677    AddSC_boss_jeklik();
1678    AddSC_boss_venoxis();
1679    AddSC_boss_marli();
1680    AddSC_boss_mandokir();
1681    AddSC_boss_gahzranka();
1682    AddSC_boss_thekal();
1683    AddSC_boss_arlokk();
1684    AddSC_boss_jindo();
1685    AddSC_boss_hakkar();
1686    AddSC_boss_grilek();
1687    AddSC_boss_hazzarah();
1688    AddSC_boss_renataki();
1689    AddSC_boss_wushoolay();
1690    AddSC_instance_zulgurub();
1691
1692    //Zul'Aman
1693    AddSC_boss_janalai();
1694    AddSC_boss_nalorakk();
1695    AddSC_instance_zulaman();
1696    AddSC_zulaman();
1697
1698    // -------------------
1699
1700    outstring_log("SD2: Loaded %u C++ Scripts", nrscripts);
1701    outstring_log("");
1702}
1703
1704//*********************************
1705//*** Functions used internally ***
1706
1707const char* GetEventAILocalizedText(uint32 entry)
1708{
1709    if (entry == 0xffffffff)
1710        error_log("SD2: Entry = -1, GetEventAILocalizedText should not be called in this case.");
1711
1712    const char* temp = NULL;
1713
1714    HM_NAMESPACE::hash_map<uint32, Localized_Text>::iterator i = EventAI_LocalizedTextMap.find(entry);
1715
1716    if (i == EventAI_LocalizedTextMap.end())
1717    {
1718        error_log("SD2: EventAI Localized Text %u not found", entry);
1719        return DEFAULT_TEXT;
1720    }
1721
1722    switch (Locale)
1723    {
1724        case 1:
1725            temp =  (*i).second.locale_1.c_str();
1726            break;
1727
1728        case 2:
1729            temp =  (*i).second.locale_2.c_str();
1730            break;
1731
1732        case 3:
1733            temp =  (*i).second.locale_3.c_str();
1734            break;
1735
1736        case 4:
1737            temp =  (*i).second.locale_4.c_str();
1738            break;
1739
1740        case 5:
1741            temp =  (*i).second.locale_5.c_str();
1742            break;
1743
1744        case 6:
1745            temp =  (*i).second.locale_6.c_str();
1746            break;
1747
1748        case 7:
1749            temp =  (*i).second.locale_7.c_str();
1750            break;
1751
1752        case 8:
1753            temp =  (*i).second.locale_8.c_str();
1754            break;
1755    };
1756
1757    if (strlen(temp))
1758        return temp;
1759
1760    return DEFAULT_TEXT;
1761}
1762
1763const char* GetScriptLocalizedText(uint32 entry)
1764{   
1765    const char* temp = NULL;
1766
1767    HM_NAMESPACE::hash_map<uint32, Localized_Text>::iterator i = Script_LocalizedTextMap.find(entry);
1768
1769    if (i == Script_LocalizedTextMap.end())
1770    {
1771        error_log("SD2: Script Localized Text %u not found", entry);
1772        return DEFAULT_TEXT;
1773    }
1774
1775    switch (Locale)
1776    {
1777        case 1:
1778            temp =  (*i).second.locale_1.c_str();
1779            break;
1780
1781        case 2:
1782            temp =  (*i).second.locale_2.c_str();
1783            break;
1784
1785        case 3:
1786            temp =  (*i).second.locale_3.c_str();
1787            break;
1788
1789        case 4:
1790            temp =  (*i).second.locale_4.c_str();
1791            break;
1792
1793        case 5:
1794            temp =  (*i).second.locale_5.c_str();
1795            break;
1796
1797        case 6:
1798            temp =  (*i).second.locale_6.c_str();
1799            break;
1800
1801        case 7:
1802            temp =  (*i).second.locale_7.c_str();
1803            break;
1804
1805        case 8:
1806            temp =  (*i).second.locale_8.c_str();
1807            break;
1808    };
1809
1810    if (strlen(temp))
1811        return temp;
1812
1813    return DEFAULT_TEXT;
1814}
1815
1816const char* GetEventAIText(uint32 entry)
1817{
1818    if(entry == 0xffffffff)
1819        error_log("SD2: Entry = -1, GetEventAIText should not be called in this case.");
1820
1821    const char* str = NULL;
1822
1823    HM_NAMESPACE::hash_map<uint32, std::string>::iterator itr = EventAI_Text_Map.find(entry);
1824    if(itr == EventAI_Text_Map.end())
1825    {
1826        error_log("SD2 ERROR: Unable to find EventAI Text %u", entry);
1827        return DEFAULT_TEXT;
1828    }
1829
1830    str = (*itr).second.c_str();
1831
1832    if(strlen(str))
1833        return str;
1834
1835    if(strlen((*itr).second.c_str()))
1836        return (*itr).second.c_str();
1837
1838    return DEFAULT_TEXT;
1839}
1840
1841void ProcessScriptText(uint32 id, WorldObject* pSource, Unit* target)
1842{
1843    if (!pSource)
1844    {
1845        error_log("SD2: ProcessScriptText invalid Source pointer.");
1846        return;
1847    }
1848
1849    HM_NAMESPACE::hash_map<uint32, ScriptText>::iterator i = Script_TextMap.find(id);
1850
1851    if (i == Script_TextMap.end())
1852    {
1853        error_log("SD2: ProcessScriptText could not find id %u.",id);
1854        return;
1855    }
1856
1857    if((*i).second.SoundId)
1858    {
1859        if(GetSoundEntriesStore()->LookupEntry((*i).second.SoundId))
1860        {
1861            WorldPacket data(4);
1862            data.SetOpcode(SMSG_PLAY_SOUND);
1863            data << uint32((*i).second.SoundId);
1864            pSource->SendMessageToSet(&data,false);
1865        }
1866        else
1867            error_log("SD2: ProcessScriptText id %u tried to process invalid soundid %u.",id,(*i).second.SoundId);
1868    }
1869
1870    switch((*i).second.Type)
1871    {
1872        case CHAT_TYPE_SAY:
1873            pSource->MonsterSay((*i).second.Text.c_str(), (*i).second.Language, target ? target->GetGUID() : 0);
1874            break;
1875
1876        case CHAT_TYPE_YELL:
1877            pSource->MonsterYell((*i).second.Text.c_str(), (*i).second.Language, target ? target->GetGUID() : 0);
1878            break;
1879
1880        case CHAT_TYPE_TEXT_EMOTE:
1881            pSource->MonsterTextEmote((*i).second.Text.c_str(), target ? target->GetGUID() : 0);
1882            break;
1883
1884        case CHAT_TYPE_BOSS_EMOTE:
1885            pSource->MonsterTextEmote((*i).second.Text.c_str(), target ? target->GetGUID() : 0, true);
1886            break;
1887
1888        case CHAT_TYPE_WHISPER:
1889            {
1890                if (target && target->GetTypeId() == TYPEID_PLAYER)
1891                    pSource->MonsterWhisper((*i).second.Text.c_str(), target->GetGUID());
1892                else error_log("SD2: ProcessScriptText id %u cannot whisper without target unit (TYPEID_PLAYER).", id);
1893            }break;
1894
1895        case CHAT_TYPE_BOSS_WHISPER:
1896            {
1897                if (target && target->GetTypeId() == TYPEID_PLAYER)
1898                    pSource->MonsterWhisper((*i).second.Text.c_str(), target->GetGUID(), true);
1899                else error_log("SD2: ProcessScriptText id %u cannot whisper without target unit (TYPEID_PLAYER).", id);
1900            }break;
1901    }
1902}
1903
1904Script* GetScriptByName(std::string Name)
1905{
1906    if(Name.empty())
1907        return NULL;
1908
1909    for(int i=0;i<MAX_SCRIPTS;i++)
1910    {
1911        if( m_scripts[i] && m_scripts[i]->Name == Name )
1912            return m_scripts[i];
1913    }
1914    return NULL;
1915}
1916
1917//********************************
1918//*** Functions to be Exported ***
1919
1920MANGOS_DLL_EXPORT
1921bool GossipHello ( Player * player, Creature *_Creature )
1922{
1923    Script *tmpscript = GetScriptByName(_Creature->GetScriptName());
1924    if(!tmpscript || !tmpscript->pGossipHello) return false;
1925
1926    player->PlayerTalkClass->ClearMenus();
1927    return tmpscript->pGossipHello(player,_Creature);
1928}
1929
1930MANGOS_DLL_EXPORT
1931bool GossipSelect( Player *player, Creature *_Creature, uint32 sender, uint32 action )
1932{
1933    debug_log("SD2: Gossip selection, sender: %d, action: %d",sender, action);
1934
1935    Script *tmpscript = GetScriptByName(_Creature->GetScriptName());
1936    if(!tmpscript || !tmpscript->pGossipSelect) return false;
1937
1938    player->PlayerTalkClass->ClearMenus();
1939    return tmpscript->pGossipSelect(player,_Creature,sender,action);
1940}
1941
1942MANGOS_DLL_EXPORT
1943bool GossipSelectWithCode( Player *player, Creature *_Creature, uint32 sender, uint32 action, const char* sCode )
1944{
1945    debug_log("SD2: Gossip selection with code, sender: %d, action: %d",sender, action);
1946
1947    Script *tmpscript = GetScriptByName(_Creature->GetScriptName());
1948    if(!tmpscript || !tmpscript->pGossipSelectWithCode) return false;
1949
1950    player->PlayerTalkClass->ClearMenus();
1951    return tmpscript->pGossipSelectWithCode(player,_Creature,sender,action,sCode);
1952}
1953
1954MANGOS_DLL_EXPORT
1955bool QuestAccept( Player *player, Creature *_Creature, Quest const *_Quest )
1956{
1957    Script *tmpscript = GetScriptByName(_Creature->GetScriptName());
1958    if(!tmpscript || !tmpscript->pQuestAccept) return false;
1959
1960    player->PlayerTalkClass->ClearMenus();
1961    return tmpscript->pQuestAccept(player,_Creature,_Quest);
1962}
1963
1964MANGOS_DLL_EXPORT
1965bool QuestSelect( Player *player, Creature *_Creature, Quest const *_Quest )
1966{
1967    Script *tmpscript = GetScriptByName(_Creature->GetScriptName());
1968    if(!tmpscript || !tmpscript->pQuestSelect) return false;
1969
1970    player->PlayerTalkClass->ClearMenus();
1971    return tmpscript->pQuestSelect(player,_Creature,_Quest);
1972}
1973
1974MANGOS_DLL_EXPORT
1975bool QuestComplete( Player *player, Creature *_Creature, Quest const *_Quest )
1976{
1977    Script *tmpscript = GetScriptByName(_Creature->GetScriptName());
1978    if(!tmpscript || !tmpscript->pQuestComplete) return false;
1979
1980    player->PlayerTalkClass->ClearMenus();
1981    return tmpscript->pQuestComplete(player,_Creature,_Quest);
1982}
1983
1984MANGOS_DLL_EXPORT
1985bool ChooseReward( Player *player, Creature *_Creature, Quest const *_Quest, uint32 opt )
1986{
1987    Script *tmpscript = GetScriptByName(_Creature->GetScriptName());
1988    if(!tmpscript || !tmpscript->pChooseReward) return false;
1989
1990    player->PlayerTalkClass->ClearMenus();
1991    return tmpscript->pChooseReward(player,_Creature,_Quest,opt);
1992}
1993
1994MANGOS_DLL_EXPORT
1995uint32 NPCDialogStatus( Player *player, Creature *_Creature )
1996{
1997    Script *tmpscript = GetScriptByName(_Creature->GetScriptName());
1998    if(!tmpscript || !tmpscript->pNPCDialogStatus) return 100;
1999
2000    player->PlayerTalkClass->ClearMenus();
2001    return tmpscript->pNPCDialogStatus(player,_Creature);
2002}
2003
2004MANGOS_DLL_EXPORT
2005uint32 GODialogStatus( Player *player, GameObject *_GO )
2006{
2007    Script *tmpscript = GetScriptByName(_GO->GetGOInfo()->ScriptName);
2008    if(!tmpscript || !tmpscript->pGODialogStatus) return 100;
2009
2010    player->PlayerTalkClass->ClearMenus();
2011    return tmpscript->pGODialogStatus(player,_GO);
2012}
2013
2014MANGOS_DLL_EXPORT
2015bool ItemHello( Player *player, Item *_Item, Quest const *_Quest )
2016{
2017    Script *tmpscript = GetScriptByName(_Item->GetProto()->ScriptName);
2018    if(!tmpscript || !tmpscript->pItemHello) return false;
2019
2020    player->PlayerTalkClass->ClearMenus();
2021    return tmpscript->pItemHello(player,_Item,_Quest);
2022}
2023
2024MANGOS_DLL_EXPORT
2025bool ItemQuestAccept( Player *player, Item *_Item, Quest const *_Quest )
2026{
2027    Script *tmpscript = GetScriptByName(_Item->GetProto()->ScriptName);
2028    if(!tmpscript || !tmpscript->pItemQuestAccept) return false;
2029
2030    player->PlayerTalkClass->ClearMenus();
2031    return tmpscript->pItemQuestAccept(player,_Item,_Quest);
2032}
2033
2034MANGOS_DLL_EXPORT
2035bool GOHello( Player *player, GameObject *_GO )
2036{
2037    Script *tmpscript = GetScriptByName(_GO->GetGOInfo()->ScriptName);
2038    if(!tmpscript || !tmpscript->pGOHello) return false;
2039
2040    player->PlayerTalkClass->ClearMenus();
2041    return tmpscript->pGOHello(player,_GO);
2042}
2043
2044MANGOS_DLL_EXPORT
2045bool GOQuestAccept( Player *player, GameObject *_GO, Quest const *_Quest )
2046{
2047    Script *tmpscript = GetScriptByName(_GO->GetGOInfo()->ScriptName);
2048    if(!tmpscript || !tmpscript->pGOQuestAccept) return false;
2049
2050    player->PlayerTalkClass->ClearMenus();
2051    return tmpscript->pGOQuestAccept(player,_GO,_Quest);
2052}
2053
2054MANGOS_DLL_EXPORT
2055bool GOChooseReward( Player *player, GameObject *_GO, Quest const *_Quest, uint32 opt )
2056{
2057    Script *tmpscript = GetScriptByName(_GO->GetGOInfo()->ScriptName);
2058    if(!tmpscript || !tmpscript->pGOChooseReward) return false;
2059
2060    player->PlayerTalkClass->ClearMenus();
2061    return tmpscript->pGOChooseReward(player,_GO,_Quest,opt);
2062}
2063
2064MANGOS_DLL_EXPORT
2065bool AreaTrigger( Player *player, AreaTriggerEntry * atEntry)
2066{
2067    Script *tmpscript = NULL;
2068
2069    tmpscript = GetScriptByName(GetAreaTriggerScriptNameById(atEntry->id));
2070    if(!tmpscript || !tmpscript->pAreaTrigger) return false;
2071
2072    return tmpscript->pAreaTrigger(player, atEntry);
2073}
2074
2075MANGOS_DLL_EXPORT
2076CreatureAI* GetAI(Creature *_Creature)
2077{
2078    Script *tmpscript = GetScriptByName(_Creature->GetScriptName());
2079
2080    if(!tmpscript || !tmpscript->GetAI) return NULL;
2081    return tmpscript->GetAI(_Creature);
2082}
2083
2084MANGOS_DLL_EXPORT
2085bool ItemUse( Player *player, Item* _Item, SpellCastTargets const& targets)
2086{
2087    Script *tmpscript = GetScriptByName(_Item->GetProto()->ScriptName);
2088    if(!tmpscript || !tmpscript->pItemUse) return false;
2089
2090    return tmpscript->pItemUse(player,_Item,targets);
2091}
2092
2093MANGOS_DLL_EXPORT
2094bool ReceiveEmote( Player *player, Creature *_Creature, uint32 emote )
2095{
2096    Script *tmpscript = GetScriptByName(_Creature->GetScriptName());
2097    if(!tmpscript || !tmpscript->pReceiveEmote) return false;
2098
2099    return tmpscript->pReceiveEmote(player, _Creature, emote);
2100}
2101
2102MANGOS_DLL_EXPORT
2103InstanceData* CreateInstanceData(Map *map)
2104{
2105    Script *tmpscript = NULL;
2106
2107    if(!map->IsDungeon()) return false;
2108
2109    tmpscript = GetScriptByName(((InstanceMap*)map)->GetScript());
2110    if(!tmpscript || !tmpscript->GetInstanceData) return false;
2111
2112    return tmpscript->GetInstanceData(map);
2113}
Note: See TracBrowser for help on using the browser.