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

Revision 223, 62.8 kB (checked in by yumileroy, 17 years ago)

[svn] * Merged SD2 Rev. 706 & 707

  • Added: Pathaleon the Calculator script. Also added a Mechanar Instance script.
  • Added: Fixed and improved version of High King Maulgar. (Timers, Spells, Adds...)
  • Fixed: Nethermancer Sepethrea encounter. Spawning Adds, timers, spells...
  • Fixed: Lot of timers and spells like for: Doomlord Kazzak, Doomwalker, Gruul, and more.

* Fixed 147_world.sql

Original author: slg
Date: 2008-11-13 17:12:54-06:00

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