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

Revision 165, 62.6 kB (checked in by yumileroy, 17 years ago)

[svn] Merge SD2 Rev 735. Patch provided by neo0608.
Fix 171_world.sql.

Original author: megamage
Date: 2008-11-04 15:37:18-06:00

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