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

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

[svn] Merge branch r50 with trunk.

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