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

Revision 109, 62.5 kB (checked in by yumileroy, 17 years ago)

[svn] Update trinityscript to SD2 rev 700. Source: scriptdev2. Patch provided by SLG.

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