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

Revision 82, 63.0 kB (checked in by yumileroy, 17 years ago)

[svn] Add Alar script.
Update Magtheridon script.
Update Vorpil script. Patch provided by BroodWyrm?.
Add sunwell boss scripts into scriptmgr.cpp (forgot to do so in previous revs).

Original author: megamage
Date: 2008-10-20 14:02:13-05:00

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