diff options
Diffstat (limited to 'src/bindings/scripts/ScriptMgr.cpp')
-rw-r--r-- | src/bindings/scripts/ScriptMgr.cpp | 4270 |
1 files changed, 2135 insertions, 2135 deletions
diff --git a/src/bindings/scripts/ScriptMgr.cpp b/src/bindings/scripts/ScriptMgr.cpp index 11d293ffe3d..d29999cb003 100644 --- a/src/bindings/scripts/ScriptMgr.cpp +++ b/src/bindings/scripts/ScriptMgr.cpp @@ -1,2135 +1,2135 @@ -/* Copyright (C) 2006 - 2008 TrinityScript <https://scriptdev2.svn.sourceforge.net/>
- * This program is free software licensed under GPL version 2
- * Please see the included DOCS/LICENSE.TXT for more information */
-
-#include "precompiled.h"
-#include "Config/Config.h"
-#include "Database/DatabaseEnv.h"
-#include "Database/DBCStores.h"
-#include "ObjectMgr.h"
-#include "ProgressBar.h"
-#include "scripts/creature/mob_event_ai.h"
-
-#define _FULLVERSION "TrinityScript"
-
-#ifndef _TSCRIPTCONFVERSION
-# define _TSCRIPTCONFVERSION 2008100201
-#endif //_TSCRIPTCONFVERSION
-
-#ifndef _TRINITY_SCRIPT_CONFIG
-# define _TRINITY_SCRIPT_CONFIG "trinityscript.conf"
-#endif //_TRINITY_SCRIPT_CONFIG
-
-//*** Global data ***
-int nrscripts;
-Script *m_scripts[MAX_SCRIPTS];
-
-DatabaseType TScriptDB;
-Config TScriptConfig;
-uint32 Locale;
-
-// String text additional data, used in TextMap
-struct StringTextData
-{
- uint32 SoundId;
- uint8 Type;
- uint32 Language;
-};
-
-// Enums used by StringTextData::Type
-enum ChatType
-{
- CHAT_TYPE_SAY = 0,
- CHAT_TYPE_YELL = 1,
- CHAT_TYPE_TEXT_EMOTE = 2,
- CHAT_TYPE_BOSS_EMOTE = 3,
- CHAT_TYPE_WHISPER = 4,
- CHAT_TYPE_BOSS_WHISPER = 5,
-};
-
-#define TEXT_SOURCE_RANGE -100000 //the amount of entries each text source has available
-
-// Text Maps
-HM_NAMESPACE::hash_map<uint32, std::string> EventAI_Text_Map;
-HM_NAMESPACE::hash_map<int32, StringTextData> TextMap;
-
-// Localized Text structure for storing locales (for EAI and SD2 scripts).
-struct Localized_Text
-{
- std::string locale_1;
- std::string locale_2;
- std::string locale_3;
- std::string locale_4;
- std::string locale_5;
- std::string locale_6;
- std::string locale_7;
- std::string locale_8;
-};
-//*** End Global data ***
-
-//*** EventAI data ***
-HM_NAMESPACE::hash_map<uint32, Localized_Text> EventAI_LocalizedTextMap;
-
-//Event AI structure. Used exclusivly by mob_event_ai.cpp (60 bytes each)
-std::list<EventAI_Event> EventAI_Event_List;
-
-//Event AI summon structure. Used exclusivly by mob_event_ai.cpp.
-HM_NAMESPACE::hash_map<uint32, EventAI_Summon> EventAI_Summon_Map;
-
-//Event AI error prevention structure. Used at runtime to prevent error log spam of same creature id.
-//HM_NAMESPACE::hash_map<uint32, EventAI_CreatureError> EventAI_CreatureErrorPreventionList;
-
-uint32 EAI_ErrorLevel;
-//*** End EventAI data ***
-
-void FillSpellSummary();
-
-// -- Scripts to be added --
-
-// -- Areatrigger --
-extern void AddSC_areatrigger_scripts();
-
-// -- Boss --
-extern void AddSC_boss_emeriss();
-extern void AddSC_boss_taerar();
-extern void AddSC_boss_ysondre();
-
-// -- Creature --
-extern void AddSC_mob_event();
-extern void AddSC_generic_creature();
-
-// -- Custom --
-extern void AddSC_custom_example();
-extern void AddSC_custom_gossip_codebox();
-extern void AddSC_test();
-
-// -- GO --
-extern void AddSC_go_scripts();
-
-// -- Guard --
-extern void AddSC_guards();
-
-// -- Honor --
-
-// -- Item --
-extern void AddSC_item_scripts();
-extern void AddSC_item_test();
-
-// -- NPC --
-extern void AddSC_npc_professions();
-extern void AddSC_npcs_special();
-
-// -- Servers --
-
-//--------------------
-//------ ZONE --------
-
-//Alterac Mountains
-extern void AddSC_alterac_mountains();
-
-//Arathi Highlands
-//Ashenvale Forest
-//Aunchindoun
-//--Auchenai Crypts
-extern void AddSC_boss_exarch_maladaar();
-//--Mana Tombs
-extern void AddSC_boss_nexusprince_shaffar();
-extern void AddSC_boss_pandemonius();
-
-//--Sekketh Halls
-extern void AddSC_boss_darkweaver_syth();
-extern void AddSC_boss_talon_king_ikiss();
-extern void AddSC_instance_sethekk_halls();
-
-//--Shadow Labyrinth
-extern void AddSC_boss_ambassador_hellmaw();
-extern void AddSC_boss_blackheart_the_inciter();
-extern void AddSC_boss_grandmaster_vorpil();
-extern void AddSC_boss_murmur();
-extern void AddSC_instance_shadow_labyrinth();
-
-//Azshara
-extern void AddSC_boss_azuregos();
-extern void AddSC_azshara();
-
-//Azuremyst Isle
-extern void AddSC_azuremyst_isle();
-
-//Badlands
-//Barrens
-extern void AddSC_the_barrens();
-
-//Black Temple
-extern void AddSC_black_temple();
-extern void AddSC_boss_illidan();
-extern void AddSC_boss_shade_of_akama();
-extern void AddSC_boss_supremus();
-extern void AddSC_boss_gurtogg_bloodboil();
-extern void AddSC_boss_mother_shahraz();
-extern void AddSC_boss_reliquary_of_souls();
-extern void AddSC_boss_teron_gorefiend();
-extern void AddSC_boss_najentus();
-extern void AddSC_boss_illidari_council();
-extern void AddSC_instance_black_temple();
-
-//Blackfathom Depths
-//Blackrock Depths
-extern void AddSC_blackrock_depths();
-extern void AddSC_boss_ambassador_flamelash();
-extern void AddSC_boss_angerrel();
-extern void AddSC_boss_anubshiah();
-extern void AddSC_boss_doomrel();
-extern void AddSC_boss_doperel();
-extern void AddSC_boss_draganthaurissan();
-extern void AddSC_boss_general_angerforge();
-extern void AddSC_boss_gloomrel();
-extern void AddSC_boss_gorosh_the_dervish();
-extern void AddSC_boss_grizzle();
-extern void AddSC_boss_haterel();
-extern void AddSC_boss_high_interrogator_gerstahn();
-extern void AddSC_boss_magmus();
-extern void AddSC_boss_moira_bronzebeard();
-extern void AddSC_boss_seethrel();
-extern void AddSC_boss_vilerel();
-
-//Blackrock Spire
-extern void AddSC_boss_drakkisath();
-extern void AddSC_boss_halycon();
-extern void AddSC_boss_highlordomokk();
-extern void AddSC_boss_mothersmolderweb();
-extern void AddSC_boss_overlordwyrmthalak();
-extern void AddSC_boss_shadowvosh();
-extern void AddSC_boss_thebeast();
-extern void AddSC_boss_warmastervoone();
-extern void AddSC_boss_quatermasterzigris();
-extern void AddSC_boss_pyroguard_emberseer();
-extern void AddSC_boss_gyth();
-extern void AddSC_boss_rend_blackhand();
-
-//Blackwing lair
-extern void AddSC_boss_razorgore();
-extern void AddSC_boss_vael();
-extern void AddSC_boss_broodlord();
-extern void AddSC_boss_firemaw();
-extern void AddSC_boss_ebonroc();
-extern void AddSC_boss_flamegor();
-extern void AddSC_boss_chromaggus();
-extern void AddSC_boss_nefarian();
-extern void AddSC_boss_victor_nefarius();
-
-//Blade's Edge Mountains
-extern void AddSC_blades_edge_mountains();
-
-//Blasted lands
-extern void AddSC_boss_kruul();
-extern void AddSC_blasted_lands();
-
-//Bloodmyst Isle
-extern void AddSC_bloodmyst_isle();
-
-//Burning steppes
-extern void AddSC_burning_steppes();
-
-//Caverns of Time
-//--Battle for Mt. Hyjal
-extern void AddSC_hyjal();
-extern void AddSC_boss_archimonde();
-extern void AddSC_instance_mount_hyjal();
-
-//--Old Hillsbrad
-extern void AddSC_boss_captain_skarloc();
-extern void AddSC_boss_epoch_hunter();
-extern void AddSC_boss_lieutenant_drake();
-extern void AddSC_instance_old_hillsbrad();
-extern void AddSC_old_hillsbrad();
-
-//--The Dark Portal
-extern void AddSC_boss_aeonus();
-extern void AddSC_boss_chrono_lord_deja();
-extern void AddSC_boss_temporus();
-
-//Coilfang Resevoir
-//--Serpent Shrine Cavern
-extern void AddSC_boss_fathomlord_karathress();
-extern void AddSC_boss_hydross_the_unstable();
-extern void AddSC_boss_lady_vashj();
-extern void AddSC_boss_leotheras_the_blind();
-extern void AddSC_boss_morogrim_tidewalker();
-extern void AddSC_instance_serpentshrine_cavern();
-
-//--Slave Pens
-
-//--Steam Vault
-extern void AddSC_boss_hydromancer_thespia();
-extern void AddSC_boss_mekgineer_steamrigger();
-extern void AddSC_boss_warlord_kalithresh();
-extern void AddSC_instance_steam_vault();
-
-//--Underbog
-extern void AddSC_boss_hungarfen();
-
-//Darkshore
-//Darnassus
-//Deadmines
-//Deadwind pass
-//Desolace
-//Dire Maul
-//Dun Morogh
-extern void AddSC_dun_morogh();
-
-//Durotar
-//Duskwood
-//Dustwallow marsh
-extern void AddSC_dustwallow_marsh();
-
-//Eversong Woods
-extern void AddSC_eversong_woods();
-
-//Exodar
-//Eastern Plaguelands
-extern void AddSC_eastern_plaguelands();
-
-//Elwynn Forest
-extern void AddSC_elwynn_forest();
-
-//Felwood
-extern void AddSC_felwood();
-
-//Feralas
-extern void AddSC_feralas();
-
-//Ghostlands
-extern void AddSC_ghostlands();
-
-//Gnomeregan
-//Gruul's Lair
-extern void AddSC_boss_gruul();
-extern void AddSC_boss_high_king_maulgar();
-extern void AddSC_instance_gruuls_lair();
-
-//Hellfire Citadel
-//--Blood Furnace
-extern void AddSC_boss_broggok();
-extern void AddSC_boss_kelidan_the_breaker();
-extern void AddSC_boss_the_maker();
-
-//--Magtheridon's Lair
-extern void AddSC_boss_magtheridon();
-extern void AddSC_instance_magtheridons_lair();
-
-//--Shattered Halls
-extern void AddSC_boss_grand_warlock_nethekurse();
-extern void AddSC_boss_warbringer_omrogg();
-extern void AddSC_instance_shattered_halls();
-
-//--Ramparts
-extern void AddSC_boss_watchkeeper_gargolmar();
-extern void AddSC_boss_omor_the_unscarred();
-
-//Hellfire Peninsula
-extern void AddSC_boss_doomlordkazzak();
-extern void AddSC_hellfire_peninsula();
-
-//Hillsbrad Foothills
-//Hinterlands
-//Ironforge
-extern void AddSC_ironforge();
-
-//Isle of Quel'Danas
-extern void AddSC_isle_of_queldanas();
-
-//Karazhan
-extern void AddSC_boss_attumen();
-extern void AddSC_boss_curator();
-extern void AddSC_boss_maiden_of_virtue();
-extern void AddSC_boss_shade_of_aran();
-extern void AddSC_boss_malchezaar();
-extern void AddSC_boss_terestian_illhoof();
-extern void AddSC_netherspite_infernal();
-extern void AddSC_boss_moroes();
-extern void AddSC_bosses_opera();
-extern void AddSC_instance_karazhan();
-extern void AddSC_karazhan();
-
-//Loch Modan
-extern void AddSC_loch_modan();
-
-//Lower Blackrock Spire
-
-// Magister's Terrace
-extern void AddSC_boss_felblood_kaelthas();
-extern void AddSC_boss_selin_fireheart();
-extern void AddSC_boss_vexallus();
-extern void AddSC_boss_priestess_delrissa();
-extern void AddSC_instance_magisters_terrace();
-
-//Maraudon
-extern void AddSC_boss_celebras_the_cursed();
-extern void AddSC_boss_landslide();
-extern void AddSC_boss_noxxion();
-extern void AddSC_boss_ptheradras();
-
-//Molten core
-extern void AddSC_boss_lucifron();
-extern void AddSC_boss_magmadar();
-extern void AddSC_boss_gehennas();
-extern void AddSC_boss_garr();
-extern void AddSC_boss_baron_geddon();
-extern void AddSC_boss_shazzrah();
-extern void AddSC_boss_golemagg();
-extern void AddSC_boss_sulfuron();
-extern void AddSC_boss_majordomo();
-extern void AddSC_boss_ragnaros();
-extern void AddSC_instance_molten_core();
-extern void AddSC_molten_core();
-
-//Moonglade
-extern void AddSC_moonglade();
-
-//Mulgore
-extern void AddSC_mulgore();
-
-//Nagrand
-extern void AddSC_nagrand();
-
-//Naxxramas
-extern void AddSC_boss_anubrekhan();
-extern void AddSC_boss_maexxna();
-extern void AddSC_boss_patchwerk();
-extern void AddSC_boss_razuvious();
-extern void AddSC_boss_highlord_mograine();
-extern void AddSC_boss_lady_blaumeux();
-extern void AddSC_boss_sir_zeliek();
-extern void AddSC_boss_thane_korthazz();
-extern void AddSC_boss_kelthuzad();
-extern void AddSC_boss_faerlina();
-extern void AddSC_boss_loatheb();
-extern void AddSC_boss_noth();
-extern void AddSC_boss_gluth();
-extern void AddSC_boss_sapphiron();
-
-//Netherstorm
-extern void AddSC_netherstorm();
-
-//Onyxia's Lair
-extern void AddSC_boss_onyxia();
-
-//Orgrimmar
-extern void AddSC_orgrimmar();
-
-//Ragefire Chasm
-//Razorfen Downs
-extern void AddSC_boss_amnennar_the_coldbringer();
-
-//Redridge Mountains
-//Ruins of Ahn'Qiraj
-//Scarlet Monastery
-extern void AddSC_boss_arcanist_doan();
-extern void AddSC_boss_azshir_the_sleepless();
-extern void AddSC_boss_bloodmage_thalnos();
-extern void AddSC_boss_herod();
-extern void AddSC_boss_high_inquisitor_fairbanks();
-extern void AddSC_boss_high_inquisitor_whitemane();
-extern void AddSC_boss_houndmaster_loksey();
-extern void AddSC_boss_interrogator_vishas();
-extern void AddSC_boss_scarlet_commander_mograine();
-extern void AddSC_boss_scorn();
-
-//Scholomance
-extern void AddSC_boss_darkmaster_gandling();
-extern void AddSC_boss_death_knight_darkreaver();
-extern void AddSC_boss_theolenkrastinov();
-extern void AddSC_boss_illuciabarov();
-extern void AddSC_boss_instructormalicia();
-extern void AddSC_boss_jandicebarov();
-extern void AddSC_boss_kormok();
-extern void AddSC_boss_lordalexeibarov();
-extern void AddSC_boss_lorekeeperpolkelt();
-extern void AddSC_boss_rasfrost();
-extern void AddSC_boss_theravenian();
-extern void AddSC_boss_vectus();
-extern void AddSC_instance_scholomance();
-
-//Searing gorge
-extern void AddSC_searing_gorge();
-
-//Shadowfang keep
-extern void AddSC_shadowfang_keep();
-extern void AddSC_instance_shadowfang_keep();
-
-//Shadowmoon Valley
-extern void AddSC_boss_doomwalker();
-extern void AddSC_shadowmoon_valley();
-
-//Shattrath
-extern void AddSC_shattrath_city();
-
-//Silithus
-extern void AddSC_silithus();
-
-//Silvermoon
-extern void AddSC_silvermoon_city();
-
-//Silverpine forest
-extern void AddSC_silverpine_forest();
-
-//Stockade
-//Stonetalon mountains
-extern void AddSC_stonetalon_mountains();
-
-//Stormwind City
-extern void AddSC_stormwind_city();
-
-//Stranglethorn Vale
-extern void AddSC_stranglethorn_vale();
-
-//Stratholme
-extern void AddSC_boss_magistrate_barthilas();
-extern void AddSC_boss_maleki_the_pallid();
-extern void AddSC_boss_nerubenkan();
-extern void AddSC_boss_cannon_master_willey();
-extern void AddSC_boss_baroness_anastari();
-extern void AddSC_boss_ramstein_the_gorger();
-extern void AddSC_boss_timmy_the_cruel();
-extern void AddSC_boss_postmaster_malown();
-extern void AddSC_boss_baron_rivendare();
-extern void AddSC_boss_dathrohan_balnazzar();
-extern void AddSC_boss_order_of_silver_hand();
-extern void AddSC_instance_stratholme();
-extern void AddSC_stratholme();
-
-//Sunken Temple
-//Tanaris
-extern void AddSC_tanaris();
-
-//Teldrassil
-//Tempest Keep
-//--Arcatraz
-extern void AddSC_arcatraz();
-extern void AddSC_boss_harbinger_skyriss();
-extern void AddSC_instance_arcatraz();
-
-//--Botanica
-extern void AddSC_boss_high_botanist_freywinn();
-extern void AddSC_boss_laj();
-extern void AddSC_boss_warp_splinter();
-
-//--The Eye
-extern void AddSC_boss_kaelthas();
-extern void AddSC_boss_void_reaver();
-extern void AddSC_boss_high_astromancer_solarian();
-extern void AddSC_instance_the_eye();
-extern void AddSC_the_eye();
-
-//--The Mechanar
-extern void AddSC_boss_gatewatcher_iron_hand();
-extern void AddSC_boss_nethermancer_sepethrea();
-
-//Temple of ahn'qiraj
-extern void AddSC_boss_cthun();
-extern void AddSC_boss_fankriss();
-extern void AddSC_boss_huhuran();
-extern void AddSC_bug_trio();
-extern void AddSC_boss_sartura();
-extern void AddSC_boss_skeram();
-extern void AddSC_boss_twinemperors();
-extern void AddSC_mob_anubisath_sentinel();
-extern void AddSC_instance_temple_of_ahnqiraj();
-
-//Terokkar Forest
-extern void AddSC_terokkar_forest();
-
-//Thousand Needles
-//Thunder Bluff
-extern void AddSC_thunder_bluff();
-
-//Tirisfal Glades
-extern void AddSC_tirisfal_glades();
-
-//Uldaman
-extern void AddSC_boss_ironaya();
-extern void AddSC_uldaman();
-
-//Undercity
-extern void AddSC_undercity();
-
-//Un'Goro Crater
-//Upper blackrock spire
-//Wailing caverns
-
-//Western plaguelands
-extern void AddSC_western_plaguelands();
-
-//Westfall
-//Wetlands
-//Winterspring
-extern void AddSC_winterspring();
-
-//Zangarmarsh
-extern void AddSC_zangarmarsh();
-
-//Zul'Farrak
-//Zul'Gurub
-extern void AddSC_boss_jeklik();
-extern void AddSC_boss_venoxis();
-extern void AddSC_boss_marli();
-extern void AddSC_boss_mandokir();
-extern void AddSC_boss_gahzranka();
-extern void AddSC_boss_thekal();
-extern void AddSC_boss_arlokk();
-extern void AddSC_boss_jindo();
-extern void AddSC_boss_hakkar();
-extern void AddSC_boss_grilek();
-extern void AddSC_boss_hazzarah();
-extern void AddSC_boss_renataki();
-extern void AddSC_boss_wushoolay();
-extern void AddSC_instance_zulgurub();
-//Zul'Aman
-extern void AddSC_boss_janalai();
-extern void AddSC_boss_nalorakk();
-extern void AddSC_instance_zulaman();
-extern void AddSC_zulaman();
-
-// -------------------
-void LoadDatabase()
-{
- //Get db string from file
- char const* dbstring = NULL;
-
- if( !TScriptConfig.GetString("TScriptDatabaseInfo", &dbstring) )
- {
- error_log("TSCR: Missing Trinity Script database info from configuration file. Load database aborted.");
- return;
- }
-
- //Initialize connection to DB
- if( dbstring && TScriptDB.Initialize(dbstring) )
- outstring_log("TSCR: TrinityScript database: %s",dbstring);
- else
- {
- error_log("TSCR: Unable to connect to Database. Load database aborted.");
- return;
- }
-
- //***Preform all DB queries here***
- QueryResult *result;
-
- //Get Version information
- result = TScriptDB.PQuery("SELECT version FROM script_db_version");
-
- if (result)
- {
- Field *fields = result->Fetch();
- outstring_log("TSCR: Database version is: %s", fields[0].GetString());
- outstring_log("");
- delete result;
-
- }else
- {
- error_log("TSCR: Missing `script_db_version` information.");
- outstring_log("");
- }
-
- // Drop Existing Text Map, only done once and we are ready to add data from multiple sources.
- TextMap.clear();
-
- //TODO: Add load from eventai_texts here
-
- // Load Script Text
- outstring_log("TSCR: Loading Script Texts...");
- LoadMangosStrings(TScriptDB,"script_texts",TEXT_SOURCE_RANGE,(TEXT_SOURCE_RANGE*2)+1);
-
- // Gather Additional data from Script Texts
- result = TScriptDB.PQuery("SELECT entry, sound, type, language FROM script_texts");
-
- outstring_log("TSCR: Loading Script Texts additional data...");
- if (result)
- {
- barGoLink bar(result->GetRowCount());
- uint32 count = 0;
-
- do
- {
- bar.step();
- Field* fields = result->Fetch();
- StringTextData temp;
-
- int32 i = fields[0].GetInt32();
- temp.SoundId = fields[1].GetInt32();
- temp.Type = fields[2].GetInt32();
- temp.Language = fields[3].GetInt32();
-
- if (i >= 0)
- {
- error_db_log("TSCR: Entry %i in table `script_texts` is not a negative value.",i);
- continue;
- }
-
- if (i > TEXT_SOURCE_RANGE || i <= TEXT_SOURCE_RANGE*2)
- {
- error_db_log("TSCR: Entry %i in table `script_texts` is out of accepted entry range for table.",i);
- continue;
- }
-
- if (temp.SoundId)
- {
- if (!GetSoundEntriesStore()->LookupEntry(temp.SoundId))
- error_db_log("TSCR: Entry %i in table `script_texts` has soundId %u but sound does not exist.",i,temp.SoundId);
- }
-
- if (!GetLanguageDescByID(temp.Language))
- error_db_log("TSCR: Entry %i in table `script_texts` using Language %u but Language does not exist.",i,temp.Language);
-
- if (temp.Type > CHAT_TYPE_BOSS_WHISPER)
- error_db_log("TSCR: Entry %i in table `script_texts` has Type %u but this Chat Type does not exist.",i,temp.Type);
-
- TextMap[i] = temp;
- ++count;
- } while (result->NextRow());
-
- delete result;
-
- outstring_log("");
- outstring_log(">> TSCR: Loaded %u additional Script Texts data.", count);
- }else
- {
- barGoLink bar(1);
- bar.step();
- outstring_log("");
- outstring_log(">> Loaded 0 additional Script Texts data. DB table `script_texts` is empty.");
- }
-
- // Load Custom Text
- outstring_log("TSCR: Loading Custom Texts...");
- LoadMangosStrings(TScriptDB,"custom_texts",TEXT_SOURCE_RANGE*2,(TEXT_SOURCE_RANGE*3)+1);
-
- // Gather Additional data from Custom Texts
- result = TScriptDB.PQuery("SELECT entry, sound, type, language FROM custom_texts");
-
- outstring_log("TSCR: Loading Custom Texts additional data...");
- if (result)
- {
- barGoLink bar(result->GetRowCount());
- uint32 count = 0;
-
- do
- {
- bar.step();
- Field* fields = result->Fetch();
- StringTextData temp;
-
- int32 i = fields[0].GetInt32();
- temp.SoundId = fields[1].GetInt32();
- temp.Type = fields[2].GetInt32();
- temp.Language = fields[3].GetInt32();
-
- if (i >= 0)
- {
- error_db_log("TSCR: Entry %i in table `custom_texts` is not a negative value.",i);
- continue;
- }
-
- if (i > TEXT_SOURCE_RANGE*2 || i <= TEXT_SOURCE_RANGE*3)
- {
- error_db_log("TSCR: Entry %i in table `custom_texts` is out of accepted entry range for table.",i);
- continue;
- }
-
- if (temp.SoundId)
- {
- if (!GetSoundEntriesStore()->LookupEntry(temp.SoundId))
- error_db_log("TSCR: Entry %i in table `custom_texts` has soundId %u but sound does not exist.",i,temp.SoundId);
- }
-
- if (!GetLanguageDescByID(temp.Language))
- error_db_log("TSCR: Entry %i in table `custom_texts` using Language %u but Language does not exist.",i,temp.Language);
-
- if (temp.Type > CHAT_TYPE_BOSS_WHISPER)
- error_db_log("TSCR: Entry %i in table `custom_texts` has Type %u but this Chat Type does not exist.",i,temp.Type);
-
- TextMap[i] = temp;
- ++count;
- } while (result->NextRow());
-
- delete result;
-
- outstring_log("");
- outstring_log(">> Loaded %u additional Custom Texts data.", count);
- }else
- {
- barGoLink bar(1);
- bar.step();
- outstring_log("");
- outstring_log(">> Loaded 0 additional Custom Texts data. DB table `custom_texts` is empty.");
- }
-
- // Drop existing Event AI Localized Text hash map
- EventAI_LocalizedTextMap.clear();
-
- // Gather EventAI Localized Texts
- result = TScriptDB.PQuery("SELECT id, locale_1, locale_2, locale_3, locale_4, locale_5, locale_6, locale_7, locale_8 "
- "FROM eventai_localized_texts");
-
- outstring_log("TSCR: Loading EventAI Localized Texts...");
- if(result)
- {
- barGoLink bar(result->GetRowCount());
- uint32 count = 0;
-
- do
- {
- Localized_Text temp;
- bar.step();
-
- Field *fields = result->Fetch();
-
- uint32 i = fields[0].GetInt32();
-
- temp.locale_1 = fields[1].GetString();
- temp.locale_2 = fields[2].GetString();
- temp.locale_3 = fields[3].GetString();
- temp.locale_4 = fields[4].GetString();
- temp.locale_5 = fields[5].GetString();
- temp.locale_6 = fields[6].GetString();
- temp.locale_7 = fields[7].GetString();
- temp.locale_8 = fields[8].GetString();
-
- EventAI_LocalizedTextMap[i] = temp;
- ++count;
-
- }while(result->NextRow());
-
- delete result;
-
- outstring_log("");
- outstring_log(">> Loaded %u EventAI Localized Texts", count);
- }else
- {
- barGoLink bar(1);
- bar.step();
- outstring_log("");
- outstring_log(">> Loaded 0 EventAI Localized Texts. DB table `eventai_localized_texts` is empty");
- }
-
- //Drop existing EventAI Text hash map
- EventAI_Text_Map.clear();
-
- //Gather EventAI Text Entries
- result = TScriptDB.PQuery("SELECT id, text FROM eventai_texts");
-
- outstring_log("TSCR: Loading EventAI_Texts...");
- if (result)
- {
- barGoLink bar(result->GetRowCount());
- uint32 Count = 0;
-
- do
- {
- bar.step();
- Field *fields = result->Fetch();
-
- uint32 i = fields[0].GetInt32();
-
- std::string text = fields[1].GetString();
-
- if (!strlen(text.c_str()))
- error_db_log("TSCR: EventAI text %u is empty", i);
-
- EventAI_Text_Map[i] = text;
- ++Count;
-
- }while (result->NextRow());
-
- delete result;
-
- outstring_log("");
- outstring_log(">> Loaded %u EventAI texts", Count);
- }else
- {
- barGoLink bar(1);
- bar.step();
- outstring_log("");
- outstring_log(">> Loaded 0 EventAI texts. DB table `eventai_texts` is empty.");
- }
-
- //Gather event data
- result = TScriptDB.PQuery("SELECT id, position_x, position_y, position_z, orientation, spawntimesecs FROM eventai_summons");
-
- //Drop Existing EventSummon Map
- EventAI_Summon_Map.clear();
-
- outstring_log("TSCR: Loading EventAI_Summons...");
- if (result)
- {
- barGoLink bar(result->GetRowCount());
- uint32 Count = 0;
-
- do
- {
- bar.step();
- Field *fields = result->Fetch();
-
- EventAI_Summon temp;
-
- uint32 i = fields[0].GetUInt32();
- temp.position_x = fields[1].GetFloat();
- temp.position_y = fields[2].GetFloat();
- temp.position_z = fields[3].GetFloat();
- temp.orientation = fields[4].GetFloat();
- temp.SpawnTimeSecs = fields[5].GetUInt32();
-
- //Add to map
- EventAI_Summon_Map[i] = temp;
- ++Count;
- }while (result->NextRow());
-
- delete result;
-
- outstring_log("");
- outstring_log(">> Loaded %u EventAI summon definitions", Count);
- }else
- {
- barGoLink bar(1);
- bar.step();
- outstring_log("");
- outstring_log(">> Loaded 0 EventAI Summon definitions. DB table `eventai_summons` is empty.");
- }
-
- //Gather event data
- result = TScriptDB.PQuery("SELECT id, creature_id, event_type, event_inverse_phase_mask, event_chance, event_flags, "
- "event_param1, event_param2, event_param3, event_param4, "
- "action1_type, action1_param1, action1_param2, action1_param3, "
- "action2_type, action2_param1, action2_param2, action2_param3, "
- "action3_type, action3_param1, action3_param2, action3_param3 "
- "FROM eventai_scripts");
-
- //Drop Existing EventAI List
- EventAI_Event_List.clear();
-
- outstring_log("TSCR: Loading EventAI_Scripts...");
- if (result)
- {
- barGoLink bar(result->GetRowCount());
- uint32 Count = 0;
-
- do
- {
- bar.step();
- Field *fields = result->Fetch();
-
- EventAI_Event temp;
-
- temp.event_id = fields[0].GetUInt32();
- uint32 i = temp.event_id;
- temp.creature_id = fields[1].GetUInt32();
- temp.event_type = fields[2].GetUInt16();
- temp.event_inverse_phase_mask = fields[3].GetUInt32();
- temp.event_chance = fields[4].GetUInt8();
- temp.event_flags = fields[5].GetUInt8();
- temp.event_param1 = fields[6].GetUInt32();
- temp.event_param2 = fields[7].GetUInt32();
- temp.event_param3 = fields[8].GetUInt32();
- temp.event_param4 = fields[9].GetUInt32();
-
- //Report any errors in event
- if (temp.event_type >= EVENT_T_END)
- error_db_log("TSCR: Event %u has incorrect event type. Maybe DB requires updated version of SD2.", i);
-
- //No chance of this event occuring
- if (temp.event_chance == 0)
- error_db_log("TSCR: Event %u has 0 percent chance. Event will never trigger!", i);
-
- //Chance above 100, force it to be 100
- if (temp.event_chance > 100)
- {
- error_db_log("TSCR: Creature %u are using event %u with more than 100 percent chance. Adjusting to 100 percent.", temp.creature_id, i);
- temp.event_chance = 100;
- }
-
- //Individual event checks
- switch (temp.event_type)
- {
- case EVENT_T_HP:
- case EVENT_T_MANA:
- case EVENT_T_TARGET_HP:
- {
- if (temp.event_param2 > 100)
- error_db_log("TSCR: Creature %u are using percentage event(%u) with param2 (MinPercent) > 100. Event will never trigger! ", temp.creature_id, i);
-
- if (temp.event_param1 <= temp.event_param2)
- error_db_log("TSCR: Creature %u are using percentage event(%u) with param1 <= param2 (MaxPercent <= MinPercent). Event will never trigger! ", temp.creature_id, i);
-
- if (temp.event_flags & EFLAG_REPEATABLE && !temp.event_param3 && !temp.event_param4)
- {
- 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);
- temp.event_flags &= ~EFLAG_REPEATABLE;
- }
- }
- break;
-
- case EVENT_T_SPELLHIT:
- {
- if (temp.event_param1)
- {
- SpellEntry const* pSpell = GetSpellStore()->LookupEntry(temp.event_param1);
- if (!pSpell)
- {
- error_db_log("TSCR: Creature %u has non-existant SpellID(%u) defined in event %u.", temp.creature_id, temp.event_param1, i);
- continue;
- }
-
- if (temp.event_param2_s != -1 && temp.event_param2 != pSpell->SchoolMask)
- 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);
- }
-
- //TODO: fix this system with SPELL_SCHOOL_MASK. Current complicate things, using int32(-1) instead of just 0
- //SPELL_SCHOOL_MASK_NONE = 0 and does not exist, thus it can not ever trigger or be used in SpellHit()
- if (temp.event_param2_s != -1 && temp.event_param2_s > SPELL_SCHOOL_MASK_ALL)
- error_db_log("TSCR: Creature %u is using invalid SpellSchoolMask(%u) defined in event %u.", temp.creature_id, temp.event_param2, i);
-
- if (temp.event_param4 < temp.event_param3)
- error_db_log("TSCR: Creature %u are using repeatable event(%u) with param4 < param3 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i);
- }
- break;
-
- case EVENT_T_RANGE:
- case EVENT_T_OOC_LOS:
- case EVENT_T_FRIENDLY_HP:
- case EVENT_T_FRIENDLY_IS_CC:
- case EVENT_T_FRIENDLY_MISSING_BUFF:
- {
- if (temp.event_param4 < temp.event_param3)
- error_db_log("TSCR: Creature %u are using repeatable event(%u) with param4 < param3 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i);
- }
- break;
-
- case EVENT_T_TIMER:
- case EVENT_T_TIMER_OOC:
- {
- if (temp.event_param2 < temp.event_param1)
- error_db_log("TSCR: Creature %u are using timed event(%u) with param2 < param1 (InitialMax < InitialMin). Event will never repeat.", temp.creature_id, i);
-
- if (temp.event_param4 < temp.event_param3)
- error_db_log("TSCR: Creature %u are using repeatable event(%u) with param4 < param3 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i);
- }
- break;
-
- case EVENT_T_KILL:
- case EVENT_T_TARGET_CASTING:
- {
- if (temp.event_param2 < temp.event_param1)
- error_db_log("TSCR: Creature %u are using event(%u) with param2 < param1 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i);
- }
- break;
-
- case EVENT_T_AGGRO:
- case EVENT_T_DEATH:
- case EVENT_T_EVADE:
- case EVENT_T_SPAWNED:
- {
- if (temp.event_flags & EFLAG_REPEATABLE)
- {
- error_db_log("TSCR: Creature %u has EFLAG_REPEATABLE set. Event can never be repeatable. Removing flag for event %u.", temp.creature_id, i);
- temp.event_flags &= ~EFLAG_REPEATABLE;
- }
- }
- break;
- }
-
- for (uint32 j = 0; j < MAX_ACTIONS; j++)
- {
- temp.action[j].type = fields[10+(j*4)].GetUInt16();
- temp.action[j].param1 = fields[11+(j*4)].GetUInt32();
- temp.action[j].param2 = fields[12+(j*4)].GetUInt32();
- temp.action[j].param3 = fields[13+(j*4)].GetUInt32();
-
- //Report any errors in actions
- switch (temp.action[j].type)
- {
- case ACTION_T_SAY:
- case ACTION_T_YELL:
- case ACTION_T_TEXTEMOTE:
- if (GetEventAIText(temp.action[j].param1) == DEFAULT_TEXT)
- error_db_log("TSCR: Event %u Action %u refrences missing Localized_Text entry", i, j+1);
- break;
-
- case ACTION_T_SOUND:
- if (!GetSoundEntriesStore()->LookupEntry(temp.action[j].param1))
- error_db_log("TSCR: Event %u Action %u uses non-existant SoundID %u.", i, j+1, temp.action[j].param1);
- break;
-
- case ACTION_T_RANDOM_SAY:
- case ACTION_T_RANDOM_YELL:
- case ACTION_T_RANDOM_TEXTEMOTE:
- if ((temp.action[j].param1 != 0xffffffff && GetEventAIText(temp.action[j].param1) == DEFAULT_TEXT) ||
- (temp.action[j].param2 != 0xffffffff && GetEventAIText(temp.action[j].param2) == DEFAULT_TEXT) ||
- (temp.action[j].param3 != 0xffffffff && GetEventAIText(temp.action[j].param3) == DEFAULT_TEXT))
- error_db_log("TSCR: Event %u Action %u refrences missing Localized_Text entry", i, j+1);
- break;
-
- case ACTION_T_CAST:
- {
- if (!GetSpellStore()->LookupEntry(temp.action[j].param1))
- error_db_log("TSCR: Event %u Action %u uses non-existant SpellID %u.", i, j+1, temp.action[j].param1);
-
- if (temp.action[j].param2 >= TARGET_T_END)
- error_db_log("TSCR: Event %u Action %u uses incorrect Target type", i, j+1);
- }
- break;
-
- case ACTION_T_REMOVEAURASFROMSPELL:
- {
- if (!GetSpellStore()->LookupEntry(temp.action[j].param2))
- error_db_log("TSCR: Event %u Action %u uses non-existant SpellID %u.", i, j+1, temp.action[j].param2);
-
- if (temp.action[j].param1 >= TARGET_T_END)
- error_db_log("TSCR: Event %u Action %u uses incorrect Target type", i, j+1);
- }
- break;
-
- case ACTION_T_CASTCREATUREGO:
- {
- if (!GetSpellStore()->LookupEntry(temp.action[j].param2))
- error_db_log("TSCR: Event %u Action %u uses non-existant SpellID %u.", i, j+1, temp.action[j].param2);
-
- if (temp.action[j].param3 >= TARGET_T_END)
- error_db_log("TSCR: Event %u Action %u uses incorrect Target type", i, j+1);
- }
- break;
-
- //2nd param target
- case ACTION_T_SUMMON_ID:
- {
- if (EventAI_Summon_Map.find(temp.action[j].param3) == EventAI_Summon_Map.end())
- error_db_log("TSCR: Event %u Action %u summons missing EventAI_Summon %u", i, j+1, temp.action[j].param3);
-
- if (temp.action[j].param2 >= TARGET_T_END)
- error_db_log("TSCR: Event %u Action %u uses incorrect Target type", i, j+1);
- }
- break;
-
- case ACTION_T_SUMMON:
- case ACTION_T_THREAT_SINGLE_PCT:
- case ACTION_T_QUEST_EVENT:
- case ACTION_T_SET_UNIT_FLAG:
- case ACTION_T_REMOVE_UNIT_FLAG:
- case ACTION_T_SET_INST_DATA64:
- if (temp.action[j].param2 >= TARGET_T_END)
- error_db_log("TSCR: Event %u Action %u uses incorrect Target type", i, j+1);
- break;
-
- //3rd param target
- case ACTION_T_SET_UNIT_FIELD:
- if (temp.action[j].param3 >= TARGET_T_END)
- error_db_log("TSCR: Event %u Action %u uses incorrect Target type", i, j+1);
- break;
-
- case ACTION_T_SET_PHASE:
- if (temp.action[j].param1 > 31)
- error_db_log("TSCR: Event %u Action %u attempts to set phase > 31. Phase mask cannot be used past phase 31.", i, j+1);
- break;
-
- case ACTION_T_INC_PHASE:
- if (!temp.action[j].param1)
- error_db_log("TSCR: Event %u Action %u is incrementing phase by 0. Was this intended?", i, j+1);
- break;
-
- case ACTION_T_KILLED_MONSTER:
- if (temp.event_type != EVENT_T_DEATH)
- outstring_log("SD2 WARNING: Event %u Action %u calling ACTION_T_KILLED_MONSTER outside of EVENT_T_DEATH", i, j+1);
- break;
-
- case ACTION_T_SET_INST_DATA:
- if (temp.action[j].param2 > 3)
- error_db_log("TSCR: Event %u Action %u attempts to set instance data above encounter state 3. Custom case?", i, j+1);
- break;
-
- default:
- if (temp.action[j].type >= ACTION_T_END)
- error_db_log("TSCR: Event %u Action %u has incorrect action type. Maybe DB requires updated version of SD2.", i, j+1);
- break;
- }
- }
-
- //Add to list
- EventAI_Event_List.push_back(temp);
- ++Count;
- } while (result->NextRow());
-
- delete result;
-
- outstring_log("");
- outstring_log(">> Loaded %u EventAI scripts", Count);
- }else
- {
- barGoLink bar(1);
- bar.step();
- outstring_log("");
- outstring_log(">> Loaded 0 EventAI scripts. DB table `eventai_scripts` is empty.");
- }
-
- //Free database thread and resources
- TScriptDB.HaltDelayThread();
-
-}
-
-struct TSpellSummary {
- uint8 Targets; // set of enum SelectTarget
- uint8 Effects; // set of enum SelectEffect
-}extern *SpellSummary;
-
-MANGOS_DLL_EXPORT
-void ScriptsFree()
-{
- // Free Spell Summary
- delete []SpellSummary;
-
- // Free resources before library unload
- for(int i=0;i<nrscripts;i++)
- delete m_scripts[i];
-
- nrscripts = 0;
-}
-
-MANGOS_DLL_EXPORT
-void ScriptsInit()
-{
- bool CanLoadDB = true;
-
- //Trinity Script startup
- outstring_log(" _____ _ _ _ ____ _ _");
- outstring_log("|_ _| __(_)_ __ (_) |_ _ _/ ___| ___ _ __(_)_ __ | |_ ");
- outstring_log(" | || '__| | '_ \\| | __| | | \\___ \\ / __| \'__| | \'_ \\| __|");
- outstring_log(" | || | | | | | | | |_| |_| |___) | (__| | | | |_) | |_ ");
- outstring_log(" |_||_| |_|_| |_|_|\\__|\\__, |____/ \\___|_| |_| .__/ \\__|");
- outstring_log(" |___/ |_| ");
- outstring_log("Trinity Script initializing %s", _FULLVERSION);
- outstring_log("");
-
- //Get configuration file
- if (!TScriptConfig.SetSource(_TRINITY_SCRIPT_CONFIG))
- {
- CanLoadDB = false;
- error_log("TSCR: Unable to open configuration file. Database will be unaccessible. Configuration values will use default.");
- }
- else outstring_log("TSCR: Using configuration file %s",_TRINITY_SCRIPT_CONFIG);
-
- //Check config file version
- if (TScriptConfig.GetIntDefault("ConfVersion", 0) != _TSCRIPTCONFVERSION)
- error_log("TSCR: Configuration file version doesn't match expected version. Some config variables may be wrong or missing.");
-
- //Locale
- Locale = TScriptConfig.GetIntDefault("Locale", 0);
-
- if (Locale > 8)
- {
- Locale = 0;
- error_log("TSCR: Locale set to invalid language id. Defaulting to 0.");
- }
-
- outstring_log("TSCR: Using locale %u", Locale);
-
- EAI_ErrorLevel = TScriptConfig.GetIntDefault("EAIErrorLevel", 1);
-
- switch (EAI_ErrorLevel)
- {
- case 0:
- outstring_log("TSCR: EventAI Error Reporting level set to 0 (Startup Errors only)");
- break;
- case 1:
- outstring_log("TSCR: EventAI Error Reporting level set to 1 (Startup errors and Runtime event errors)");
- break;
- case 2:
- outstring_log("TSCR: EventAI Error Reporting level set to 2 (Startup errors, Runtime event errors, and Creation errors)");
- break;
- default:
- outstring_log("TSCR: Unknown EventAI Error Reporting level. Defaulting to 1 (Startup errors and Runtime event errors)");
- EAI_ErrorLevel = 1;
- break;
- }
-
- outstring_log("");
-
- //Load database (must be called after TScriptConfig.SetSource). In case it failed, no need to even try load.
- if (CanLoadDB)
- LoadDatabase();
-
- outstring_log("TSCR: Loading C++ scripts");
- barGoLink bar(1);
- bar.step();
- outstring_log("");
-
- nrscripts = 0;
- for(int i=0;i<MAX_SCRIPTS;i++)
- m_scripts[i]=NULL;
-
- FillSpellSummary();
-
- // -- Scripts to be added --
-
- // -- Areatrigger --
- AddSC_areatrigger_scripts();
-
- // -- Boss --
- AddSC_boss_emeriss();
- AddSC_boss_taerar();
- AddSC_boss_ysondre();
-
- // -- Creature --
- AddSC_mob_event();
- AddSC_generic_creature();
-
- // -- Custom --
- AddSC_custom_example();
- AddSC_custom_gossip_codebox();
- AddSC_test();
-
- // -- GO --
- AddSC_go_scripts();
-
- // -- Guard --
- AddSC_guards();
-
- // -- Honor --
-
- // -- Item --
- AddSC_item_scripts();
- AddSC_item_test();
-
- // -- NPC --
- AddSC_npc_professions();
- AddSC_npcs_special();
-
- // -- Servers --
-
- //--------------------
- //------ ZONE --------
-
- //Alterac Mountains
- AddSC_alterac_mountains();
-
- //Arathi Highlands
- //Ashenvale Forest
- //Aunchindoun
- //--Auchenai Crypts
- AddSC_boss_exarch_maladaar();
-
- //--Mana Tombs
- AddSC_boss_nexusprince_shaffar();
- AddSC_boss_pandemonius();
-
- //--Sekketh Halls
- AddSC_boss_darkweaver_syth();
- AddSC_boss_talon_king_ikiss();
- AddSC_instance_sethekk_halls();
-
- //--Shadow Labyrinth
- AddSC_boss_ambassador_hellmaw();
- AddSC_boss_blackheart_the_inciter();
- AddSC_boss_grandmaster_vorpil();
- AddSC_boss_murmur();
- AddSC_instance_shadow_labyrinth();
-
- //Azshara
- AddSC_boss_azuregos();
- AddSC_azshara();
-
- //Azuremyst Isle
- AddSC_azuremyst_isle();
-
- //Badlands
- //Barrens
- AddSC_the_barrens();
-
- //Black Temple
- AddSC_black_temple();
- AddSC_boss_illidan();
- AddSC_boss_shade_of_akama();
- AddSC_boss_supremus();
- AddSC_boss_gurtogg_bloodboil();
- AddSC_boss_mother_shahraz();
- AddSC_boss_reliquary_of_souls();
- AddSC_boss_teron_gorefiend();
- AddSC_boss_najentus();
- AddSC_boss_illidari_council();
- AddSC_instance_black_temple();
-
- //Blackfathom Depths
- //Blackrock Depths
- AddSC_blackrock_depths();
- AddSC_boss_ambassador_flamelash();
- AddSC_boss_angerrel();
- AddSC_boss_anubshiah();
- AddSC_boss_doomrel();
- AddSC_boss_doperel();
- AddSC_boss_draganthaurissan();
- AddSC_boss_general_angerforge();
- AddSC_boss_gloomrel();
- AddSC_boss_gorosh_the_dervish();
- AddSC_boss_grizzle();
- AddSC_boss_haterel();
- AddSC_boss_high_interrogator_gerstahn();
- AddSC_boss_magmus();
- AddSC_boss_moira_bronzebeard();
- AddSC_boss_seethrel();
- AddSC_boss_vilerel();
-
- //Blackrock Spire
- AddSC_boss_drakkisath();
- AddSC_boss_halycon();
- AddSC_boss_highlordomokk();
- AddSC_boss_mothersmolderweb();
- AddSC_boss_overlordwyrmthalak();
- AddSC_boss_shadowvosh();
- AddSC_boss_thebeast();
- AddSC_boss_warmastervoone();
- AddSC_boss_quatermasterzigris();
- AddSC_boss_pyroguard_emberseer();
- AddSC_boss_gyth();
- AddSC_boss_rend_blackhand();
-
- //Blackwing lair
- AddSC_boss_razorgore();
- AddSC_boss_vael();
- AddSC_boss_broodlord();
- AddSC_boss_firemaw();
- AddSC_boss_ebonroc();
- AddSC_boss_flamegor();
- AddSC_boss_chromaggus();
- AddSC_boss_nefarian();
- AddSC_boss_victor_nefarius();
-
- //Blade's Edge Mountains
- AddSC_blades_edge_mountains();
-
- //Blasted lands
- AddSC_boss_kruul();
- AddSC_blasted_lands();
-
- //Bloodmyst Isle
- AddSC_bloodmyst_isle();
-
- //Burning steppes
- AddSC_burning_steppes();
-
- //Caverns of Time
- //--Battle for Mt. Hyjal
- AddSC_hyjal();
- AddSC_boss_archimonde();
- AddSC_instance_mount_hyjal();
-
- //--Old Hillsbrad
- AddSC_boss_captain_skarloc();
- AddSC_boss_epoch_hunter();
- AddSC_boss_lieutenant_drake();
- AddSC_instance_old_hillsbrad();
- AddSC_old_hillsbrad();
-
- //--The Dark Portal
- AddSC_boss_aeonus();
- AddSC_boss_chrono_lord_deja();
- AddSC_boss_temporus();
-
- //Coilfang Resevoir
- //--Serpent Shrine Cavern
- AddSC_boss_fathomlord_karathress();
- AddSC_boss_hydross_the_unstable();
- AddSC_boss_lady_vashj();
- AddSC_boss_leotheras_the_blind();
- AddSC_boss_morogrim_tidewalker();
- AddSC_instance_serpentshrine_cavern();
-
- //--Slave Pens
- //--Steam Vault
- AddSC_boss_hydromancer_thespia();
- AddSC_boss_mekgineer_steamrigger();
- AddSC_boss_warlord_kalithresh();
- AddSC_instance_steam_vault();
-
- //--Underbog
- AddSC_boss_hungarfen();
-
- //Darkshore
- //Darnassus
- //Deadmines
- //Deadwind pass
- //Desolace
- //Dire Maul
- //Dun Morogh
- AddSC_dun_morogh();
-
- //Durotar
- //Duskwood
- //Dustwallow marsh
- AddSC_dustwallow_marsh();
-
- //Eversong Woods
- AddSC_eversong_woods();
-
- //Exodar
- //Eastern Plaguelands
- AddSC_eastern_plaguelands();
-
- //Elwynn Forest
- AddSC_elwynn_forest();
-
- //Felwood
- AddSC_felwood();
-
- //Feralas
- AddSC_feralas();
-
- //Ghostlands
- AddSC_ghostlands();
-
- //Gnomeregan
- //Gruul's Lair
- AddSC_boss_gruul();
- AddSC_boss_high_king_maulgar();
- AddSC_instance_gruuls_lair();
-
- //Hellfire Citadel
- //--Blood Furnace
- AddSC_boss_broggok();
- AddSC_boss_kelidan_the_breaker();
- AddSC_boss_the_maker();
-
- //--Magtheridon's Lair
- AddSC_boss_magtheridon();
- AddSC_instance_magtheridons_lair();
-
- //--Shattered Halls
- AddSC_boss_grand_warlock_nethekurse();
- AddSC_boss_warbringer_omrogg();
- AddSC_instance_shattered_halls();
-
- //--Ramparts
- AddSC_boss_watchkeeper_gargolmar();
- AddSC_boss_omor_the_unscarred();
-
- //Hellfire Peninsula
- AddSC_boss_doomlordkazzak();
- AddSC_hellfire_peninsula();
-
- //Hillsbrad Foothills
- //Hinterlands
- //Ironforge
- AddSC_ironforge();
-
- //Isle of Quel'Danas
- AddSC_isle_of_queldanas();
-
- //Karazhan
- AddSC_boss_attumen();
- AddSC_boss_curator();
- AddSC_boss_maiden_of_virtue();
- AddSC_boss_shade_of_aran();
- AddSC_boss_malchezaar();
- AddSC_boss_terestian_illhoof();
- AddSC_netherspite_infernal();
- AddSC_boss_moroes();
- AddSC_bosses_opera();
- AddSC_instance_karazhan();
- AddSC_karazhan();
-
- //Loch Modan
- AddSC_loch_modan();
-
- //Lower Blackrock Spire
-
- // Magister's Terrace
- AddSC_boss_felblood_kaelthas();
- AddSC_boss_selin_fireheart();
- AddSC_boss_vexallus();
- AddSC_boss_priestess_delrissa();
- AddSC_instance_magisters_terrace();
-
- //Maraudon
- AddSC_boss_celebras_the_cursed();
- AddSC_boss_landslide();
- AddSC_boss_noxxion();
- AddSC_boss_ptheradras();
-
- //Molten core
- AddSC_boss_lucifron();
- AddSC_boss_magmadar();
- AddSC_boss_gehennas();
- AddSC_boss_garr();
- AddSC_boss_baron_geddon();
- AddSC_boss_shazzrah();
- AddSC_boss_golemagg();
- AddSC_boss_sulfuron();
- AddSC_boss_majordomo();
- AddSC_boss_ragnaros();
- AddSC_instance_molten_core();
- AddSC_molten_core();
-
- //Moonglade
- AddSC_moonglade();
-
- //Mulgore
- AddSC_mulgore();
-
- //Nagrand
- AddSC_nagrand();
-
- //Naxxramas
- AddSC_boss_anubrekhan();
- AddSC_boss_maexxna();
- AddSC_boss_patchwerk();
- AddSC_boss_razuvious();
- AddSC_boss_highlord_mograine();
- AddSC_boss_lady_blaumeux();
- AddSC_boss_sir_zeliek();
- AddSC_boss_thane_korthazz();
- AddSC_boss_kelthuzad();
- AddSC_boss_faerlina();
- AddSC_boss_loatheb();
- AddSC_boss_noth();
- AddSC_boss_gluth();
- AddSC_boss_sapphiron();
-
- //Netherstorm
- AddSC_netherstorm();
-
- //Onyxia's Lair
- AddSC_boss_onyxia();
-
- //Orgrimmar
- AddSC_orgrimmar();
-
- //Ragefire Chasm
- //Razorfen Downs
- AddSC_boss_amnennar_the_coldbringer();
-
- //Redridge Mountains
- //Ruins of Ahn'Qiraj
- //Scarlet Monastery
- AddSC_boss_arcanist_doan();
- AddSC_boss_azshir_the_sleepless();
- AddSC_boss_bloodmage_thalnos();
- AddSC_boss_herod();
- AddSC_boss_high_inquisitor_fairbanks();
- AddSC_boss_high_inquisitor_whitemane();
- AddSC_boss_houndmaster_loksey();
- AddSC_boss_interrogator_vishas();
- AddSC_boss_scarlet_commander_mograine();
- AddSC_boss_scorn();
-
- //Scholomance
- AddSC_boss_darkmaster_gandling();
- AddSC_boss_death_knight_darkreaver();
- AddSC_boss_theolenkrastinov();
- AddSC_boss_illuciabarov();
- AddSC_boss_instructormalicia();
- AddSC_boss_jandicebarov();
- AddSC_boss_kormok();
- AddSC_boss_lordalexeibarov();
- AddSC_boss_lorekeeperpolkelt();
- AddSC_boss_rasfrost();
- AddSC_boss_theravenian();
- AddSC_boss_vectus();
- AddSC_instance_scholomance();
-
- //Searing gorge
- AddSC_searing_gorge();
-
- //Shadowfang keep
- AddSC_shadowfang_keep();
- AddSC_instance_shadowfang_keep();
-
- //Shadowmoon Valley
- AddSC_boss_doomwalker();
- AddSC_shadowmoon_valley();
-
- //Shattrath
- AddSC_shattrath_city();
-
- //Silithus
- AddSC_silithus();
-
- //Silvermoon
- AddSC_silvermoon_city();
-
- //Silverpine forest
- AddSC_silverpine_forest();
-
- //Stockade
- //Stonetalon mountains
- AddSC_stonetalon_mountains();
-
- //Stormwind City
- AddSC_stormwind_city();
-
- //Stranglethorn Vale
- AddSC_stranglethorn_vale();
-
- //Stratholme
- AddSC_boss_magistrate_barthilas();
- AddSC_boss_maleki_the_pallid();
- AddSC_boss_nerubenkan();
- AddSC_boss_cannon_master_willey();
- AddSC_boss_baroness_anastari();
- AddSC_boss_ramstein_the_gorger();
- AddSC_boss_timmy_the_cruel();
- AddSC_boss_postmaster_malown();
- AddSC_boss_baron_rivendare();
- AddSC_boss_dathrohan_balnazzar();
- AddSC_boss_order_of_silver_hand();
- AddSC_instance_stratholme();
- AddSC_stratholme();
-
- //Sunken Temple
- //Tanaris
- AddSC_tanaris();
-
- //Teldrassil
- //Tempest Keep
- //--Arcatraz
- AddSC_arcatraz();
- AddSC_boss_harbinger_skyriss();
- AddSC_instance_arcatraz();
-
- //--Botanica
- AddSC_boss_high_botanist_freywinn();
- AddSC_boss_laj();
- AddSC_boss_warp_splinter();
-
- //--The Eye
- AddSC_boss_kaelthas();
- AddSC_boss_void_reaver();
- AddSC_boss_high_astromancer_solarian();
- AddSC_instance_the_eye();
- AddSC_the_eye();
-
- //--The Mechanar
- AddSC_boss_gatewatcher_iron_hand();
- AddSC_boss_nethermancer_sepethrea();
-
- //Temple of ahn'qiraj
- AddSC_boss_cthun();
- AddSC_boss_fankriss();
- AddSC_boss_huhuran();
- AddSC_bug_trio();
- AddSC_boss_sartura();
- AddSC_boss_skeram();
- AddSC_boss_twinemperors();
- AddSC_mob_anubisath_sentinel();
- AddSC_instance_temple_of_ahnqiraj();
-
- //Terokkar Forest
- AddSC_terokkar_forest();
-
- //Thousand Needles
- //Thunder Bluff
- AddSC_thunder_bluff();
-
- //Tirisfal Glades
- AddSC_tirisfal_glades();
-
- //Uldaman
- AddSC_boss_ironaya();
- AddSC_uldaman();
-
- //Undercity
- AddSC_undercity();
-
- //Un'Goro Crater
- //Upper blackrock spire
- //Wailing caverns
-
- //Western plaguelands
- AddSC_western_plaguelands();
-
- //Westfall
- //Wetlands
- //Winterspring
- AddSC_winterspring();
-
- //Zangarmarsh
- AddSC_zangarmarsh();
-
- //Zul'Farrak
- //Zul'Gurub
- AddSC_boss_jeklik();
- AddSC_boss_venoxis();
- AddSC_boss_marli();
- AddSC_boss_mandokir();
- AddSC_boss_gahzranka();
- AddSC_boss_thekal();
- AddSC_boss_arlokk();
- AddSC_boss_jindo();
- AddSC_boss_hakkar();
- AddSC_boss_grilek();
- AddSC_boss_hazzarah();
- AddSC_boss_renataki();
- AddSC_boss_wushoolay();
- AddSC_instance_zulgurub();
-
- //Zul'Aman
- AddSC_boss_janalai();
- AddSC_boss_nalorakk();
- AddSC_instance_zulaman();
- AddSC_zulaman();
-
- // -------------------
-
- outstring_log("TSCR: Loaded %u C++ Scripts", nrscripts);
- outstring_log("");
-}
-
-//*********************************
-//*** Functions used internally ***
-
-const char* GetEventAILocalizedText(uint32 entry)
-{
- if (entry == 0xffffffff)
- error_log("TSCR: Entry = -1, GetEventAILocalizedText should not be called in this case.");
-
- const char* temp = NULL;
-
- HM_NAMESPACE::hash_map<uint32, Localized_Text>::iterator i = EventAI_LocalizedTextMap.find(entry);
-
- if (i == EventAI_LocalizedTextMap.end())
- {
- error_log("TSCR: EventAI Localized Text %u not found", entry);
- return DEFAULT_TEXT;
- }
-
- switch (Locale)
- {
- case 1:
- temp = (*i).second.locale_1.c_str();
- break;
-
- case 2:
- temp = (*i).second.locale_2.c_str();
- break;
-
- case 3:
- temp = (*i).second.locale_3.c_str();
- break;
-
- case 4:
- temp = (*i).second.locale_4.c_str();
- break;
-
- case 5:
- temp = (*i).second.locale_5.c_str();
- break;
-
- case 6:
- temp = (*i).second.locale_6.c_str();
- break;
-
- case 7:
- temp = (*i).second.locale_7.c_str();
- break;
-
- case 8:
- temp = (*i).second.locale_8.c_str();
- break;
- };
-
- if (strlen(temp))
- return temp;
-
- return DEFAULT_TEXT;
-}
-
-const char* GetEventAIText(uint32 entry)
-{
- if(entry == 0xffffffff)
- error_log("TSCR: Entry = -1, GetEventAIText should not be called in this case.");
-
- const char* str = NULL;
-
- HM_NAMESPACE::hash_map<uint32, std::string>::iterator itr = EventAI_Text_Map.find(entry);
- if(itr == EventAI_Text_Map.end())
- {
- error_log("TSCR: Unable to find EventAI Text %u", entry);
- return DEFAULT_TEXT;
- }
-
- str = (*itr).second.c_str();
-
- if(strlen(str))
- return str;
-
- if(strlen((*itr).second.c_str()))
- return (*itr).second.c_str();
-
- return DEFAULT_TEXT;
-}
-
-void DoScriptText(int32 textEntry, WorldObject* pSource, Unit* target)
-{
- if (!pSource)
- {
- error_log("TSCR: DoScriptText entry %i, invalid Source pointer.",textEntry);
- return;
- }
-
- if (textEntry >= 0)
- {
- error_log("TSCR: DoScriptText attempts to process entry %i, but entry must be negative.",textEntry);
- return;
- }
-
- HM_NAMESPACE::hash_map<int32, StringTextData>::iterator i = TextMap.find(textEntry);
-
- if (i == TextMap.end())
- {
- error_log("TSCR: DoScriptText could not find text entry %i.",textEntry);
- return;
- }
-
- if((*i).second.SoundId)
- {
- if( GetSoundEntriesStore()->LookupEntry((*i).second.SoundId) )
- {
- pSource->SendPlaySound((*i).second.SoundId, false);
- }
- else
- error_log("TSCR: DoScriptText entry %i tried to process invalid sound id %u.",textEntry,(*i).second.SoundId);
- }
-
- switch((*i).second.Type)
- {
- case CHAT_TYPE_SAY:
- pSource->MonsterSay(textEntry, (*i).second.Language, target ? target->GetGUID() : 0);
- break;
- case CHAT_TYPE_YELL:
- pSource->MonsterYell(textEntry, (*i).second.Language, target ? target->GetGUID() : 0);
- break;
- case CHAT_TYPE_TEXT_EMOTE:
- pSource->MonsterTextEmote(textEntry, target ? target->GetGUID() : 0);
- break;
- case CHAT_TYPE_BOSS_EMOTE:
- pSource->MonsterTextEmote(textEntry, target ? target->GetGUID() : 0, true);
- break;
- case CHAT_TYPE_WHISPER:
- {
- if (target && target->GetTypeId() == TYPEID_PLAYER)
- pSource->MonsterWhisper(textEntry, target->GetGUID());
- else error_log("TSCR: DoScriptText entry %i cannot whisper without target unit (TYPEID_PLAYER).", textEntry);
- }break;
- case CHAT_TYPE_BOSS_WHISPER:
- {
- if (target && target->GetTypeId() == TYPEID_PLAYER)
- pSource->MonsterWhisper(textEntry, target->GetGUID(), true);
- else error_log("TSCR: DoScriptText entry %i cannot whisper without target unit (TYPEID_PLAYER).", textEntry);
- }break;
- }
-}
-
-Script* GetScriptByName(std::string Name)
-{
- if(Name.empty())
- return NULL;
-
- for(int i=0;i<MAX_SCRIPTS;i++)
- {
- if( m_scripts[i] && m_scripts[i]->Name == Name )
- return m_scripts[i];
- }
- return NULL;
-}
-
-//********************************
-//*** Functions to be Exported ***
-
-MANGOS_DLL_EXPORT
-bool GossipHello ( Player * player, Creature *_Creature )
-{
- Script *tmpscript = GetScriptByName(_Creature->GetScriptName());
- if(!tmpscript || !tmpscript->pGossipHello) return false;
-
- player->PlayerTalkClass->ClearMenus();
- return tmpscript->pGossipHello(player,_Creature);
-}
-
-MANGOS_DLL_EXPORT
-bool GossipSelect( Player *player, Creature *_Creature, uint32 sender, uint32 action )
-{
- debug_log("TSCR: Gossip selection, sender: %d, action: %d",sender, action);
-
- Script *tmpscript = GetScriptByName(_Creature->GetScriptName());
- if(!tmpscript || !tmpscript->pGossipSelect) return false;
-
- player->PlayerTalkClass->ClearMenus();
- return tmpscript->pGossipSelect(player,_Creature,sender,action);
-}
-
-MANGOS_DLL_EXPORT
-bool GossipSelectWithCode( Player *player, Creature *_Creature, uint32 sender, uint32 action, const char* sCode )
-{
- debug_log("TSCR: Gossip selection with code, sender: %d, action: %d",sender, action);
-
- Script *tmpscript = GetScriptByName(_Creature->GetScriptName());
- if(!tmpscript || !tmpscript->pGossipSelectWithCode) return false;
-
- player->PlayerTalkClass->ClearMenus();
- return tmpscript->pGossipSelectWithCode(player,_Creature,sender,action,sCode);
-}
-
-MANGOS_DLL_EXPORT
-bool QuestAccept( Player *player, Creature *_Creature, Quest const *_Quest )
-{
- Script *tmpscript = GetScriptByName(_Creature->GetScriptName());
- if(!tmpscript || !tmpscript->pQuestAccept) return false;
-
- player->PlayerTalkClass->ClearMenus();
- return tmpscript->pQuestAccept(player,_Creature,_Quest);
-}
-
-MANGOS_DLL_EXPORT
-bool QuestSelect( Player *player, Creature *_Creature, Quest const *_Quest )
-{
- Script *tmpscript = GetScriptByName(_Creature->GetScriptName());
- if(!tmpscript || !tmpscript->pQuestSelect) return false;
-
- player->PlayerTalkClass->ClearMenus();
- return tmpscript->pQuestSelect(player,_Creature,_Quest);
-}
-
-MANGOS_DLL_EXPORT
-bool QuestComplete( Player *player, Creature *_Creature, Quest const *_Quest )
-{
- Script *tmpscript = GetScriptByName(_Creature->GetScriptName());
- if(!tmpscript || !tmpscript->pQuestComplete) return false;
-
- player->PlayerTalkClass->ClearMenus();
- return tmpscript->pQuestComplete(player,_Creature,_Quest);
-}
-
-MANGOS_DLL_EXPORT
-bool ChooseReward( Player *player, Creature *_Creature, Quest const *_Quest, uint32 opt )
-{
- Script *tmpscript = GetScriptByName(_Creature->GetScriptName());
- if(!tmpscript || !tmpscript->pChooseReward) return false;
-
- player->PlayerTalkClass->ClearMenus();
- return tmpscript->pChooseReward(player,_Creature,_Quest,opt);
-}
-
-MANGOS_DLL_EXPORT
-uint32 NPCDialogStatus( Player *player, Creature *_Creature )
-{
- Script *tmpscript = GetScriptByName(_Creature->GetScriptName());
- if(!tmpscript || !tmpscript->pNPCDialogStatus) return 100;
-
- player->PlayerTalkClass->ClearMenus();
- return tmpscript->pNPCDialogStatus(player,_Creature);
-}
-
-MANGOS_DLL_EXPORT
-uint32 GODialogStatus( Player *player, GameObject *_GO )
-{
- Script *tmpscript = GetScriptByName(_GO->GetGOInfo()->ScriptName);
- if(!tmpscript || !tmpscript->pGODialogStatus) return 100;
-
- player->PlayerTalkClass->ClearMenus();
- return tmpscript->pGODialogStatus(player,_GO);
-}
-
-MANGOS_DLL_EXPORT
-bool ItemHello( Player *player, Item *_Item, Quest const *_Quest )
-{
- Script *tmpscript = GetScriptByName(_Item->GetProto()->ScriptName);
- if(!tmpscript || !tmpscript->pItemHello) return false;
-
- player->PlayerTalkClass->ClearMenus();
- return tmpscript->pItemHello(player,_Item,_Quest);
-}
-
-MANGOS_DLL_EXPORT
-bool ItemQuestAccept( Player *player, Item *_Item, Quest const *_Quest )
-{
- Script *tmpscript = GetScriptByName(_Item->GetProto()->ScriptName);
- if(!tmpscript || !tmpscript->pItemQuestAccept) return false;
-
- player->PlayerTalkClass->ClearMenus();
- return tmpscript->pItemQuestAccept(player,_Item,_Quest);
-}
-
-MANGOS_DLL_EXPORT
-bool GOHello( Player *player, GameObject *_GO )
-{
- Script *tmpscript = GetScriptByName(_GO->GetGOInfo()->ScriptName);
- if(!tmpscript || !tmpscript->pGOHello) return false;
-
- player->PlayerTalkClass->ClearMenus();
- return tmpscript->pGOHello(player,_GO);
-}
-
-MANGOS_DLL_EXPORT
-bool GOQuestAccept( Player *player, GameObject *_GO, Quest const *_Quest )
-{
- Script *tmpscript = GetScriptByName(_GO->GetGOInfo()->ScriptName);
- if(!tmpscript || !tmpscript->pGOQuestAccept) return false;
-
- player->PlayerTalkClass->ClearMenus();
- return tmpscript->pGOQuestAccept(player,_GO,_Quest);
-}
-
-MANGOS_DLL_EXPORT
-bool GOChooseReward( Player *player, GameObject *_GO, Quest const *_Quest, uint32 opt )
-{
- Script *tmpscript = GetScriptByName(_GO->GetGOInfo()->ScriptName);
- if(!tmpscript || !tmpscript->pGOChooseReward) return false;
-
- player->PlayerTalkClass->ClearMenus();
- return tmpscript->pGOChooseReward(player,_GO,_Quest,opt);
-}
-
-MANGOS_DLL_EXPORT
-bool AreaTrigger( Player *player, AreaTriggerEntry * atEntry)
-{
- Script *tmpscript = NULL;
-
- tmpscript = GetScriptByName(GetAreaTriggerScriptNameById(atEntry->id));
- if(!tmpscript || !tmpscript->pAreaTrigger) return false;
-
- return tmpscript->pAreaTrigger(player, atEntry);
-}
-
-MANGOS_DLL_EXPORT
-CreatureAI* GetAI(Creature *_Creature)
-{
- Script *tmpscript = GetScriptByName(_Creature->GetScriptName());
-
- if(!tmpscript || !tmpscript->GetAI) return NULL;
- return tmpscript->GetAI(_Creature);
-}
-
-MANGOS_DLL_EXPORT
-bool ItemUse( Player *player, Item* _Item, SpellCastTargets const& targets)
-{
- Script *tmpscript = GetScriptByName(_Item->GetProto()->ScriptName);
- if(!tmpscript || !tmpscript->pItemUse) return false;
-
- return tmpscript->pItemUse(player,_Item,targets);
-}
-
-MANGOS_DLL_EXPORT
-bool ReceiveEmote( Player *player, Creature *_Creature, uint32 emote )
-{
- Script *tmpscript = GetScriptByName(_Creature->GetScriptName());
- if(!tmpscript || !tmpscript->pReceiveEmote) return false;
-
- return tmpscript->pReceiveEmote(player, _Creature, emote);
-}
-
-MANGOS_DLL_EXPORT
-InstanceData* CreateInstanceData(Map *map)
-{
- Script *tmpscript = NULL;
-
- if(!map->IsDungeon()) return false;
-
- tmpscript = GetScriptByName(((InstanceMap*)map)->GetScript());
- if(!tmpscript || !tmpscript->GetInstanceData) return false;
-
- return tmpscript->GetInstanceData(map);
-}
+/* Copyright (C) 2006 - 2008 TrinityScript <https://scriptdev2.svn.sourceforge.net/> + * This program is free software licensed under GPL version 2 + * Please see the included DOCS/LICENSE.TXT for more information */ + +#include "precompiled.h" +#include "Config/Config.h" +#include "Database/DatabaseEnv.h" +#include "Database/DBCStores.h" +#include "ObjectMgr.h" +#include "ProgressBar.h" +#include "scripts/creature/mob_event_ai.h" + +#define _FULLVERSION "TrinityScript" + +#ifndef _TSCRIPTCONFVERSION +# define _TSCRIPTCONFVERSION 2008100201 +#endif //_TSCRIPTCONFVERSION + +#ifndef _TRINITY_SCRIPT_CONFIG +# define _TRINITY_SCRIPT_CONFIG "trinityscript.conf" +#endif //_TRINITY_SCRIPT_CONFIG + +//*** Global data *** +int nrscripts; +Script *m_scripts[MAX_SCRIPTS]; + +DatabaseType TScriptDB; +Config TScriptConfig; +uint32 Locale; + +// String text additional data, used in TextMap +struct StringTextData +{ + uint32 SoundId; + uint8 Type; + uint32 Language; +}; + +// Enums used by StringTextData::Type +enum ChatType +{ + CHAT_TYPE_SAY = 0, + CHAT_TYPE_YELL = 1, + CHAT_TYPE_TEXT_EMOTE = 2, + CHAT_TYPE_BOSS_EMOTE = 3, + CHAT_TYPE_WHISPER = 4, + CHAT_TYPE_BOSS_WHISPER = 5, +}; + +#define TEXT_SOURCE_RANGE -100000 //the amount of entries each text source has available + +// Text Maps +HM_NAMESPACE::hash_map<uint32, std::string> EventAI_Text_Map; +HM_NAMESPACE::hash_map<int32, StringTextData> TextMap; + +// Localized Text structure for storing locales (for EAI and SD2 scripts). +struct Localized_Text +{ + std::string locale_1; + std::string locale_2; + std::string locale_3; + std::string locale_4; + std::string locale_5; + std::string locale_6; + std::string locale_7; + std::string locale_8; +}; +//*** End Global data *** + +//*** EventAI data *** +HM_NAMESPACE::hash_map<uint32, Localized_Text> EventAI_LocalizedTextMap; + +//Event AI structure. Used exclusivly by mob_event_ai.cpp (60 bytes each) +std::list<EventAI_Event> EventAI_Event_List; + +//Event AI summon structure. Used exclusivly by mob_event_ai.cpp. +HM_NAMESPACE::hash_map<uint32, EventAI_Summon> EventAI_Summon_Map; + +//Event AI error prevention structure. Used at runtime to prevent error log spam of same creature id. +//HM_NAMESPACE::hash_map<uint32, EventAI_CreatureError> EventAI_CreatureErrorPreventionList; + +uint32 EAI_ErrorLevel; +//*** End EventAI data *** + +void FillSpellSummary(); + +// -- Scripts to be added -- + +// -- Areatrigger -- +extern void AddSC_areatrigger_scripts(); + +// -- Boss -- +extern void AddSC_boss_emeriss(); +extern void AddSC_boss_taerar(); +extern void AddSC_boss_ysondre(); + +// -- Creature -- +extern void AddSC_mob_event(); +extern void AddSC_generic_creature(); + +// -- Custom -- +extern void AddSC_custom_example(); +extern void AddSC_custom_gossip_codebox(); +extern void AddSC_test(); + +// -- GO -- +extern void AddSC_go_scripts(); + +// -- Guard -- +extern void AddSC_guards(); + +// -- Honor -- + +// -- Item -- +extern void AddSC_item_scripts(); +extern void AddSC_item_test(); + +// -- NPC -- +extern void AddSC_npc_professions(); +extern void AddSC_npcs_special(); + +// -- Servers -- + +//-------------------- +//------ ZONE -------- + +//Alterac Mountains +extern void AddSC_alterac_mountains(); + +//Arathi Highlands +//Ashenvale Forest +//Aunchindoun +//--Auchenai Crypts +extern void AddSC_boss_exarch_maladaar(); +//--Mana Tombs +extern void AddSC_boss_nexusprince_shaffar(); +extern void AddSC_boss_pandemonius(); + +//--Sekketh Halls +extern void AddSC_boss_darkweaver_syth(); +extern void AddSC_boss_talon_king_ikiss(); +extern void AddSC_instance_sethekk_halls(); + +//--Shadow Labyrinth +extern void AddSC_boss_ambassador_hellmaw(); +extern void AddSC_boss_blackheart_the_inciter(); +extern void AddSC_boss_grandmaster_vorpil(); +extern void AddSC_boss_murmur(); +extern void AddSC_instance_shadow_labyrinth(); + +//Azshara +extern void AddSC_boss_azuregos(); +extern void AddSC_azshara(); + +//Azuremyst Isle +extern void AddSC_azuremyst_isle(); + +//Badlands +//Barrens +extern void AddSC_the_barrens(); + +//Black Temple +extern void AddSC_black_temple(); +extern void AddSC_boss_illidan(); +extern void AddSC_boss_shade_of_akama(); +extern void AddSC_boss_supremus(); +extern void AddSC_boss_gurtogg_bloodboil(); +extern void AddSC_boss_mother_shahraz(); +extern void AddSC_boss_reliquary_of_souls(); +extern void AddSC_boss_teron_gorefiend(); +extern void AddSC_boss_najentus(); +extern void AddSC_boss_illidari_council(); +extern void AddSC_instance_black_temple(); + +//Blackfathom Depths +//Blackrock Depths +extern void AddSC_blackrock_depths(); +extern void AddSC_boss_ambassador_flamelash(); +extern void AddSC_boss_angerrel(); +extern void AddSC_boss_anubshiah(); +extern void AddSC_boss_doomrel(); +extern void AddSC_boss_doperel(); +extern void AddSC_boss_draganthaurissan(); +extern void AddSC_boss_general_angerforge(); +extern void AddSC_boss_gloomrel(); +extern void AddSC_boss_gorosh_the_dervish(); +extern void AddSC_boss_grizzle(); +extern void AddSC_boss_haterel(); +extern void AddSC_boss_high_interrogator_gerstahn(); +extern void AddSC_boss_magmus(); +extern void AddSC_boss_moira_bronzebeard(); +extern void AddSC_boss_seethrel(); +extern void AddSC_boss_vilerel(); + +//Blackrock Spire +extern void AddSC_boss_drakkisath(); +extern void AddSC_boss_halycon(); +extern void AddSC_boss_highlordomokk(); +extern void AddSC_boss_mothersmolderweb(); +extern void AddSC_boss_overlordwyrmthalak(); +extern void AddSC_boss_shadowvosh(); +extern void AddSC_boss_thebeast(); +extern void AddSC_boss_warmastervoone(); +extern void AddSC_boss_quatermasterzigris(); +extern void AddSC_boss_pyroguard_emberseer(); +extern void AddSC_boss_gyth(); +extern void AddSC_boss_rend_blackhand(); + +//Blackwing lair +extern void AddSC_boss_razorgore(); +extern void AddSC_boss_vael(); +extern void AddSC_boss_broodlord(); +extern void AddSC_boss_firemaw(); +extern void AddSC_boss_ebonroc(); +extern void AddSC_boss_flamegor(); +extern void AddSC_boss_chromaggus(); +extern void AddSC_boss_nefarian(); +extern void AddSC_boss_victor_nefarius(); + +//Blade's Edge Mountains +extern void AddSC_blades_edge_mountains(); + +//Blasted lands +extern void AddSC_boss_kruul(); +extern void AddSC_blasted_lands(); + +//Bloodmyst Isle +extern void AddSC_bloodmyst_isle(); + +//Burning steppes +extern void AddSC_burning_steppes(); + +//Caverns of Time +//--Battle for Mt. Hyjal +extern void AddSC_hyjal(); +extern void AddSC_boss_archimonde(); +extern void AddSC_instance_mount_hyjal(); + +//--Old Hillsbrad +extern void AddSC_boss_captain_skarloc(); +extern void AddSC_boss_epoch_hunter(); +extern void AddSC_boss_lieutenant_drake(); +extern void AddSC_instance_old_hillsbrad(); +extern void AddSC_old_hillsbrad(); + +//--The Dark Portal +extern void AddSC_boss_aeonus(); +extern void AddSC_boss_chrono_lord_deja(); +extern void AddSC_boss_temporus(); + +//Coilfang Resevoir +//--Serpent Shrine Cavern +extern void AddSC_boss_fathomlord_karathress(); +extern void AddSC_boss_hydross_the_unstable(); +extern void AddSC_boss_lady_vashj(); +extern void AddSC_boss_leotheras_the_blind(); +extern void AddSC_boss_morogrim_tidewalker(); +extern void AddSC_instance_serpentshrine_cavern(); + +//--Slave Pens + +//--Steam Vault +extern void AddSC_boss_hydromancer_thespia(); +extern void AddSC_boss_mekgineer_steamrigger(); +extern void AddSC_boss_warlord_kalithresh(); +extern void AddSC_instance_steam_vault(); + +//--Underbog +extern void AddSC_boss_hungarfen(); + +//Darkshore +//Darnassus +//Deadmines +//Deadwind pass +//Desolace +//Dire Maul +//Dun Morogh +extern void AddSC_dun_morogh(); + +//Durotar +//Duskwood +//Dustwallow marsh +extern void AddSC_dustwallow_marsh(); + +//Eversong Woods +extern void AddSC_eversong_woods(); + +//Exodar +//Eastern Plaguelands +extern void AddSC_eastern_plaguelands(); + +//Elwynn Forest +extern void AddSC_elwynn_forest(); + +//Felwood +extern void AddSC_felwood(); + +//Feralas +extern void AddSC_feralas(); + +//Ghostlands +extern void AddSC_ghostlands(); + +//Gnomeregan +//Gruul's Lair +extern void AddSC_boss_gruul(); +extern void AddSC_boss_high_king_maulgar(); +extern void AddSC_instance_gruuls_lair(); + +//Hellfire Citadel +//--Blood Furnace +extern void AddSC_boss_broggok(); +extern void AddSC_boss_kelidan_the_breaker(); +extern void AddSC_boss_the_maker(); + +//--Magtheridon's Lair +extern void AddSC_boss_magtheridon(); +extern void AddSC_instance_magtheridons_lair(); + +//--Shattered Halls +extern void AddSC_boss_grand_warlock_nethekurse(); +extern void AddSC_boss_warbringer_omrogg(); +extern void AddSC_instance_shattered_halls(); + +//--Ramparts +extern void AddSC_boss_watchkeeper_gargolmar(); +extern void AddSC_boss_omor_the_unscarred(); + +//Hellfire Peninsula +extern void AddSC_boss_doomlordkazzak(); +extern void AddSC_hellfire_peninsula(); + +//Hillsbrad Foothills +//Hinterlands +//Ironforge +extern void AddSC_ironforge(); + +//Isle of Quel'Danas +extern void AddSC_isle_of_queldanas(); + +//Karazhan +extern void AddSC_boss_attumen(); +extern void AddSC_boss_curator(); +extern void AddSC_boss_maiden_of_virtue(); +extern void AddSC_boss_shade_of_aran(); +extern void AddSC_boss_malchezaar(); +extern void AddSC_boss_terestian_illhoof(); +extern void AddSC_netherspite_infernal(); +extern void AddSC_boss_moroes(); +extern void AddSC_bosses_opera(); +extern void AddSC_instance_karazhan(); +extern void AddSC_karazhan(); + +//Loch Modan +extern void AddSC_loch_modan(); + +//Lower Blackrock Spire + +// Magister's Terrace +extern void AddSC_boss_felblood_kaelthas(); +extern void AddSC_boss_selin_fireheart(); +extern void AddSC_boss_vexallus(); +extern void AddSC_boss_priestess_delrissa(); +extern void AddSC_instance_magisters_terrace(); + +//Maraudon +extern void AddSC_boss_celebras_the_cursed(); +extern void AddSC_boss_landslide(); +extern void AddSC_boss_noxxion(); +extern void AddSC_boss_ptheradras(); + +//Molten core +extern void AddSC_boss_lucifron(); +extern void AddSC_boss_magmadar(); +extern void AddSC_boss_gehennas(); +extern void AddSC_boss_garr(); +extern void AddSC_boss_baron_geddon(); +extern void AddSC_boss_shazzrah(); +extern void AddSC_boss_golemagg(); +extern void AddSC_boss_sulfuron(); +extern void AddSC_boss_majordomo(); +extern void AddSC_boss_ragnaros(); +extern void AddSC_instance_molten_core(); +extern void AddSC_molten_core(); + +//Moonglade +extern void AddSC_moonglade(); + +//Mulgore +extern void AddSC_mulgore(); + +//Nagrand +extern void AddSC_nagrand(); + +//Naxxramas +extern void AddSC_boss_anubrekhan(); +extern void AddSC_boss_maexxna(); +extern void AddSC_boss_patchwerk(); +extern void AddSC_boss_razuvious(); +extern void AddSC_boss_highlord_mograine(); +extern void AddSC_boss_lady_blaumeux(); +extern void AddSC_boss_sir_zeliek(); +extern void AddSC_boss_thane_korthazz(); +extern void AddSC_boss_kelthuzad(); +extern void AddSC_boss_faerlina(); +extern void AddSC_boss_loatheb(); +extern void AddSC_boss_noth(); +extern void AddSC_boss_gluth(); +extern void AddSC_boss_sapphiron(); + +//Netherstorm +extern void AddSC_netherstorm(); + +//Onyxia's Lair +extern void AddSC_boss_onyxia(); + +//Orgrimmar +extern void AddSC_orgrimmar(); + +//Ragefire Chasm +//Razorfen Downs +extern void AddSC_boss_amnennar_the_coldbringer(); + +//Redridge Mountains +//Ruins of Ahn'Qiraj +//Scarlet Monastery +extern void AddSC_boss_arcanist_doan(); +extern void AddSC_boss_azshir_the_sleepless(); +extern void AddSC_boss_bloodmage_thalnos(); +extern void AddSC_boss_herod(); +extern void AddSC_boss_high_inquisitor_fairbanks(); +extern void AddSC_boss_high_inquisitor_whitemane(); +extern void AddSC_boss_houndmaster_loksey(); +extern void AddSC_boss_interrogator_vishas(); +extern void AddSC_boss_scarlet_commander_mograine(); +extern void AddSC_boss_scorn(); + +//Scholomance +extern void AddSC_boss_darkmaster_gandling(); +extern void AddSC_boss_death_knight_darkreaver(); +extern void AddSC_boss_theolenkrastinov(); +extern void AddSC_boss_illuciabarov(); +extern void AddSC_boss_instructormalicia(); +extern void AddSC_boss_jandicebarov(); +extern void AddSC_boss_kormok(); +extern void AddSC_boss_lordalexeibarov(); +extern void AddSC_boss_lorekeeperpolkelt(); +extern void AddSC_boss_rasfrost(); +extern void AddSC_boss_theravenian(); +extern void AddSC_boss_vectus(); +extern void AddSC_instance_scholomance(); + +//Searing gorge +extern void AddSC_searing_gorge(); + +//Shadowfang keep +extern void AddSC_shadowfang_keep(); +extern void AddSC_instance_shadowfang_keep(); + +//Shadowmoon Valley +extern void AddSC_boss_doomwalker(); +extern void AddSC_shadowmoon_valley(); + +//Shattrath +extern void AddSC_shattrath_city(); + +//Silithus +extern void AddSC_silithus(); + +//Silvermoon +extern void AddSC_silvermoon_city(); + +//Silverpine forest +extern void AddSC_silverpine_forest(); + +//Stockade +//Stonetalon mountains +extern void AddSC_stonetalon_mountains(); + +//Stormwind City +extern void AddSC_stormwind_city(); + +//Stranglethorn Vale +extern void AddSC_stranglethorn_vale(); + +//Stratholme +extern void AddSC_boss_magistrate_barthilas(); +extern void AddSC_boss_maleki_the_pallid(); +extern void AddSC_boss_nerubenkan(); +extern void AddSC_boss_cannon_master_willey(); +extern void AddSC_boss_baroness_anastari(); +extern void AddSC_boss_ramstein_the_gorger(); +extern void AddSC_boss_timmy_the_cruel(); +extern void AddSC_boss_postmaster_malown(); +extern void AddSC_boss_baron_rivendare(); +extern void AddSC_boss_dathrohan_balnazzar(); +extern void AddSC_boss_order_of_silver_hand(); +extern void AddSC_instance_stratholme(); +extern void AddSC_stratholme(); + +//Sunken Temple +//Tanaris +extern void AddSC_tanaris(); + +//Teldrassil +//Tempest Keep +//--Arcatraz +extern void AddSC_arcatraz(); +extern void AddSC_boss_harbinger_skyriss(); +extern void AddSC_instance_arcatraz(); + +//--Botanica +extern void AddSC_boss_high_botanist_freywinn(); +extern void AddSC_boss_laj(); +extern void AddSC_boss_warp_splinter(); + +//--The Eye +extern void AddSC_boss_kaelthas(); +extern void AddSC_boss_void_reaver(); +extern void AddSC_boss_high_astromancer_solarian(); +extern void AddSC_instance_the_eye(); +extern void AddSC_the_eye(); + +//--The Mechanar +extern void AddSC_boss_gatewatcher_iron_hand(); +extern void AddSC_boss_nethermancer_sepethrea(); + +//Temple of ahn'qiraj +extern void AddSC_boss_cthun(); +extern void AddSC_boss_fankriss(); +extern void AddSC_boss_huhuran(); +extern void AddSC_bug_trio(); +extern void AddSC_boss_sartura(); +extern void AddSC_boss_skeram(); +extern void AddSC_boss_twinemperors(); +extern void AddSC_mob_anubisath_sentinel(); +extern void AddSC_instance_temple_of_ahnqiraj(); + +//Terokkar Forest +extern void AddSC_terokkar_forest(); + +//Thousand Needles +//Thunder Bluff +extern void AddSC_thunder_bluff(); + +//Tirisfal Glades +extern void AddSC_tirisfal_glades(); + +//Uldaman +extern void AddSC_boss_ironaya(); +extern void AddSC_uldaman(); + +//Undercity +extern void AddSC_undercity(); + +//Un'Goro Crater +//Upper blackrock spire +//Wailing caverns + +//Western plaguelands +extern void AddSC_western_plaguelands(); + +//Westfall +//Wetlands +//Winterspring +extern void AddSC_winterspring(); + +//Zangarmarsh +extern void AddSC_zangarmarsh(); + +//Zul'Farrak +//Zul'Gurub +extern void AddSC_boss_jeklik(); +extern void AddSC_boss_venoxis(); +extern void AddSC_boss_marli(); +extern void AddSC_boss_mandokir(); +extern void AddSC_boss_gahzranka(); +extern void AddSC_boss_thekal(); +extern void AddSC_boss_arlokk(); +extern void AddSC_boss_jindo(); +extern void AddSC_boss_hakkar(); +extern void AddSC_boss_grilek(); +extern void AddSC_boss_hazzarah(); +extern void AddSC_boss_renataki(); +extern void AddSC_boss_wushoolay(); +extern void AddSC_instance_zulgurub(); +//Zul'Aman +extern void AddSC_boss_janalai(); +extern void AddSC_boss_nalorakk(); +extern void AddSC_instance_zulaman(); +extern void AddSC_zulaman(); + +// ------------------- +void LoadDatabase() +{ + //Get db string from file + char const* dbstring = NULL; + + if( !TScriptConfig.GetString("TScriptDatabaseInfo", &dbstring) ) + { + error_log("TSCR: Missing Trinity Script database info from configuration file. Load database aborted."); + return; + } + + //Initialize connection to DB + if( dbstring && TScriptDB.Initialize(dbstring) ) + outstring_log("TSCR: TrinityScript database: %s",dbstring); + else + { + error_log("TSCR: Unable to connect to Database. Load database aborted."); + return; + } + + //***Preform all DB queries here*** + QueryResult *result; + + //Get Version information + result = TScriptDB.PQuery("SELECT version FROM script_db_version"); + + if (result) + { + Field *fields = result->Fetch(); + outstring_log("TSCR: Database version is: %s", fields[0].GetString()); + outstring_log(""); + delete result; + + }else + { + error_log("TSCR: Missing `script_db_version` information."); + outstring_log(""); + } + + // Drop Existing Text Map, only done once and we are ready to add data from multiple sources. + TextMap.clear(); + + //TODO: Add load from eventai_texts here + + // Load Script Text + outstring_log("TSCR: Loading Script Texts..."); + LoadMangosStrings(TScriptDB,"script_texts",TEXT_SOURCE_RANGE,(TEXT_SOURCE_RANGE*2)+1); + + // Gather Additional data from Script Texts + result = TScriptDB.PQuery("SELECT entry, sound, type, language FROM script_texts"); + + outstring_log("TSCR: Loading Script Texts additional data..."); + if (result) + { + barGoLink bar(result->GetRowCount()); + uint32 count = 0; + + do + { + bar.step(); + Field* fields = result->Fetch(); + StringTextData temp; + + int32 i = fields[0].GetInt32(); + temp.SoundId = fields[1].GetInt32(); + temp.Type = fields[2].GetInt32(); + temp.Language = fields[3].GetInt32(); + + if (i >= 0) + { + error_db_log("TSCR: Entry %i in table `script_texts` is not a negative value.",i); + continue; + } + + if (i > TEXT_SOURCE_RANGE || i <= TEXT_SOURCE_RANGE*2) + { + error_db_log("TSCR: Entry %i in table `script_texts` is out of accepted entry range for table.",i); + continue; + } + + if (temp.SoundId) + { + if (!GetSoundEntriesStore()->LookupEntry(temp.SoundId)) + error_db_log("TSCR: Entry %i in table `script_texts` has soundId %u but sound does not exist.",i,temp.SoundId); + } + + if (!GetLanguageDescByID(temp.Language)) + error_db_log("TSCR: Entry %i in table `script_texts` using Language %u but Language does not exist.",i,temp.Language); + + if (temp.Type > CHAT_TYPE_BOSS_WHISPER) + error_db_log("TSCR: Entry %i in table `script_texts` has Type %u but this Chat Type does not exist.",i,temp.Type); + + TextMap[i] = temp; + ++count; + } while (result->NextRow()); + + delete result; + + outstring_log(""); + outstring_log(">> TSCR: Loaded %u additional Script Texts data.", count); + }else + { + barGoLink bar(1); + bar.step(); + outstring_log(""); + outstring_log(">> Loaded 0 additional Script Texts data. DB table `script_texts` is empty."); + } + + // Load Custom Text + outstring_log("TSCR: Loading Custom Texts..."); + LoadMangosStrings(TScriptDB,"custom_texts",TEXT_SOURCE_RANGE*2,(TEXT_SOURCE_RANGE*3)+1); + + // Gather Additional data from Custom Texts + result = TScriptDB.PQuery("SELECT entry, sound, type, language FROM custom_texts"); + + outstring_log("TSCR: Loading Custom Texts additional data..."); + if (result) + { + barGoLink bar(result->GetRowCount()); + uint32 count = 0; + + do + { + bar.step(); + Field* fields = result->Fetch(); + StringTextData temp; + + int32 i = fields[0].GetInt32(); + temp.SoundId = fields[1].GetInt32(); + temp.Type = fields[2].GetInt32(); + temp.Language = fields[3].GetInt32(); + + if (i >= 0) + { + error_db_log("TSCR: Entry %i in table `custom_texts` is not a negative value.",i); + continue; + } + + if (i > TEXT_SOURCE_RANGE*2 || i <= TEXT_SOURCE_RANGE*3) + { + error_db_log("TSCR: Entry %i in table `custom_texts` is out of accepted entry range for table.",i); + continue; + } + + if (temp.SoundId) + { + if (!GetSoundEntriesStore()->LookupEntry(temp.SoundId)) + error_db_log("TSCR: Entry %i in table `custom_texts` has soundId %u but sound does not exist.",i,temp.SoundId); + } + + if (!GetLanguageDescByID(temp.Language)) + error_db_log("TSCR: Entry %i in table `custom_texts` using Language %u but Language does not exist.",i,temp.Language); + + if (temp.Type > CHAT_TYPE_BOSS_WHISPER) + error_db_log("TSCR: Entry %i in table `custom_texts` has Type %u but this Chat Type does not exist.",i,temp.Type); + + TextMap[i] = temp; + ++count; + } while (result->NextRow()); + + delete result; + + outstring_log(""); + outstring_log(">> Loaded %u additional Custom Texts data.", count); + }else + { + barGoLink bar(1); + bar.step(); + outstring_log(""); + outstring_log(">> Loaded 0 additional Custom Texts data. DB table `custom_texts` is empty."); + } + + // Drop existing Event AI Localized Text hash map + EventAI_LocalizedTextMap.clear(); + + // Gather EventAI Localized Texts + result = TScriptDB.PQuery("SELECT id, locale_1, locale_2, locale_3, locale_4, locale_5, locale_6, locale_7, locale_8 " + "FROM eventai_localized_texts"); + + outstring_log("TSCR: Loading EventAI Localized Texts..."); + if(result) + { + barGoLink bar(result->GetRowCount()); + uint32 count = 0; + + do + { + Localized_Text temp; + bar.step(); + + Field *fields = result->Fetch(); + + uint32 i = fields[0].GetInt32(); + + temp.locale_1 = fields[1].GetString(); + temp.locale_2 = fields[2].GetString(); + temp.locale_3 = fields[3].GetString(); + temp.locale_4 = fields[4].GetString(); + temp.locale_5 = fields[5].GetString(); + temp.locale_6 = fields[6].GetString(); + temp.locale_7 = fields[7].GetString(); + temp.locale_8 = fields[8].GetString(); + + EventAI_LocalizedTextMap[i] = temp; + ++count; + + }while(result->NextRow()); + + delete result; + + outstring_log(""); + outstring_log(">> Loaded %u EventAI Localized Texts", count); + }else + { + barGoLink bar(1); + bar.step(); + outstring_log(""); + outstring_log(">> Loaded 0 EventAI Localized Texts. DB table `eventai_localized_texts` is empty"); + } + + //Drop existing EventAI Text hash map + EventAI_Text_Map.clear(); + + //Gather EventAI Text Entries + result = TScriptDB.PQuery("SELECT id, text FROM eventai_texts"); + + outstring_log("TSCR: Loading EventAI_Texts..."); + if (result) + { + barGoLink bar(result->GetRowCount()); + uint32 Count = 0; + + do + { + bar.step(); + Field *fields = result->Fetch(); + + uint32 i = fields[0].GetInt32(); + + std::string text = fields[1].GetString(); + + if (!strlen(text.c_str())) + error_db_log("TSCR: EventAI text %u is empty", i); + + EventAI_Text_Map[i] = text; + ++Count; + + }while (result->NextRow()); + + delete result; + + outstring_log(""); + outstring_log(">> Loaded %u EventAI texts", Count); + }else + { + barGoLink bar(1); + bar.step(); + outstring_log(""); + outstring_log(">> Loaded 0 EventAI texts. DB table `eventai_texts` is empty."); + } + + //Gather event data + result = TScriptDB.PQuery("SELECT id, position_x, position_y, position_z, orientation, spawntimesecs FROM eventai_summons"); + + //Drop Existing EventSummon Map + EventAI_Summon_Map.clear(); + + outstring_log("TSCR: Loading EventAI_Summons..."); + if (result) + { + barGoLink bar(result->GetRowCount()); + uint32 Count = 0; + + do + { + bar.step(); + Field *fields = result->Fetch(); + + EventAI_Summon temp; + + uint32 i = fields[0].GetUInt32(); + temp.position_x = fields[1].GetFloat(); + temp.position_y = fields[2].GetFloat(); + temp.position_z = fields[3].GetFloat(); + temp.orientation = fields[4].GetFloat(); + temp.SpawnTimeSecs = fields[5].GetUInt32(); + + //Add to map + EventAI_Summon_Map[i] = temp; + ++Count; + }while (result->NextRow()); + + delete result; + + outstring_log(""); + outstring_log(">> Loaded %u EventAI summon definitions", Count); + }else + { + barGoLink bar(1); + bar.step(); + outstring_log(""); + outstring_log(">> Loaded 0 EventAI Summon definitions. DB table `eventai_summons` is empty."); + } + + //Gather event data + result = TScriptDB.PQuery("SELECT id, creature_id, event_type, event_inverse_phase_mask, event_chance, event_flags, " + "event_param1, event_param2, event_param3, event_param4, " + "action1_type, action1_param1, action1_param2, action1_param3, " + "action2_type, action2_param1, action2_param2, action2_param3, " + "action3_type, action3_param1, action3_param2, action3_param3 " + "FROM eventai_scripts"); + + //Drop Existing EventAI List + EventAI_Event_List.clear(); + + outstring_log("TSCR: Loading EventAI_Scripts..."); + if (result) + { + barGoLink bar(result->GetRowCount()); + uint32 Count = 0; + + do + { + bar.step(); + Field *fields = result->Fetch(); + + EventAI_Event temp; + + temp.event_id = fields[0].GetUInt32(); + uint32 i = temp.event_id; + temp.creature_id = fields[1].GetUInt32(); + temp.event_type = fields[2].GetUInt16(); + temp.event_inverse_phase_mask = fields[3].GetUInt32(); + temp.event_chance = fields[4].GetUInt8(); + temp.event_flags = fields[5].GetUInt8(); + temp.event_param1 = fields[6].GetUInt32(); + temp.event_param2 = fields[7].GetUInt32(); + temp.event_param3 = fields[8].GetUInt32(); + temp.event_param4 = fields[9].GetUInt32(); + + //Report any errors in event + if (temp.event_type >= EVENT_T_END) + error_db_log("TSCR: Event %u has incorrect event type. Maybe DB requires updated version of SD2.", i); + + //No chance of this event occuring + if (temp.event_chance == 0) + error_db_log("TSCR: Event %u has 0 percent chance. Event will never trigger!", i); + + //Chance above 100, force it to be 100 + if (temp.event_chance > 100) + { + error_db_log("TSCR: Creature %u are using event %u with more than 100 percent chance. Adjusting to 100 percent.", temp.creature_id, i); + temp.event_chance = 100; + } + + //Individual event checks + switch (temp.event_type) + { + case EVENT_T_HP: + case EVENT_T_MANA: + case EVENT_T_TARGET_HP: + { + if (temp.event_param2 > 100) + error_db_log("TSCR: Creature %u are using percentage event(%u) with param2 (MinPercent) > 100. Event will never trigger! ", temp.creature_id, i); + + if (temp.event_param1 <= temp.event_param2) + error_db_log("TSCR: Creature %u are using percentage event(%u) with param1 <= param2 (MaxPercent <= MinPercent). Event will never trigger! ", temp.creature_id, i); + + if (temp.event_flags & EFLAG_REPEATABLE && !temp.event_param3 && !temp.event_param4) + { + 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); + temp.event_flags &= ~EFLAG_REPEATABLE; + } + } + break; + + case EVENT_T_SPELLHIT: + { + if (temp.event_param1) + { + SpellEntry const* pSpell = GetSpellStore()->LookupEntry(temp.event_param1); + if (!pSpell) + { + error_db_log("TSCR: Creature %u has non-existant SpellID(%u) defined in event %u.", temp.creature_id, temp.event_param1, i); + continue; + } + + if (temp.event_param2_s != -1 && temp.event_param2 != pSpell->SchoolMask) + 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); + } + + //TODO: fix this system with SPELL_SCHOOL_MASK. Current complicate things, using int32(-1) instead of just 0 + //SPELL_SCHOOL_MASK_NONE = 0 and does not exist, thus it can not ever trigger or be used in SpellHit() + if (temp.event_param2_s != -1 && temp.event_param2_s > SPELL_SCHOOL_MASK_ALL) + error_db_log("TSCR: Creature %u is using invalid SpellSchoolMask(%u) defined in event %u.", temp.creature_id, temp.event_param2, i); + + if (temp.event_param4 < temp.event_param3) + error_db_log("TSCR: Creature %u are using repeatable event(%u) with param4 < param3 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i); + } + break; + + case EVENT_T_RANGE: + case EVENT_T_OOC_LOS: + case EVENT_T_FRIENDLY_HP: + case EVENT_T_FRIENDLY_IS_CC: + case EVENT_T_FRIENDLY_MISSING_BUFF: + { + if (temp.event_param4 < temp.event_param3) + error_db_log("TSCR: Creature %u are using repeatable event(%u) with param4 < param3 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i); + } + break; + + case EVENT_T_TIMER: + case EVENT_T_TIMER_OOC: + { + if (temp.event_param2 < temp.event_param1) + error_db_log("TSCR: Creature %u are using timed event(%u) with param2 < param1 (InitialMax < InitialMin). Event will never repeat.", temp.creature_id, i); + + if (temp.event_param4 < temp.event_param3) + error_db_log("TSCR: Creature %u are using repeatable event(%u) with param4 < param3 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i); + } + break; + + case EVENT_T_KILL: + case EVENT_T_TARGET_CASTING: + { + if (temp.event_param2 < temp.event_param1) + error_db_log("TSCR: Creature %u are using event(%u) with param2 < param1 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i); + } + break; + + case EVENT_T_AGGRO: + case EVENT_T_DEATH: + case EVENT_T_EVADE: + case EVENT_T_SPAWNED: + { + if (temp.event_flags & EFLAG_REPEATABLE) + { + error_db_log("TSCR: Creature %u has EFLAG_REPEATABLE set. Event can never be repeatable. Removing flag for event %u.", temp.creature_id, i); + temp.event_flags &= ~EFLAG_REPEATABLE; + } + } + break; + } + + for (uint32 j = 0; j < MAX_ACTIONS; j++) + { + temp.action[j].type = fields[10+(j*4)].GetUInt16(); + temp.action[j].param1 = fields[11+(j*4)].GetUInt32(); + temp.action[j].param2 = fields[12+(j*4)].GetUInt32(); + temp.action[j].param3 = fields[13+(j*4)].GetUInt32(); + + //Report any errors in actions + switch (temp.action[j].type) + { + case ACTION_T_SAY: + case ACTION_T_YELL: + case ACTION_T_TEXTEMOTE: + if (GetEventAIText(temp.action[j].param1) == DEFAULT_TEXT) + error_db_log("TSCR: Event %u Action %u refrences missing Localized_Text entry", i, j+1); + break; + + case ACTION_T_SOUND: + if (!GetSoundEntriesStore()->LookupEntry(temp.action[j].param1)) + error_db_log("TSCR: Event %u Action %u uses non-existant SoundID %u.", i, j+1, temp.action[j].param1); + break; + + case ACTION_T_RANDOM_SAY: + case ACTION_T_RANDOM_YELL: + case ACTION_T_RANDOM_TEXTEMOTE: + if ((temp.action[j].param1 != 0xffffffff && GetEventAIText(temp.action[j].param1) == DEFAULT_TEXT) || + (temp.action[j].param2 != 0xffffffff && GetEventAIText(temp.action[j].param2) == DEFAULT_TEXT) || + (temp.action[j].param3 != 0xffffffff && GetEventAIText(temp.action[j].param3) == DEFAULT_TEXT)) + error_db_log("TSCR: Event %u Action %u refrences missing Localized_Text entry", i, j+1); + break; + + case ACTION_T_CAST: + { + if (!GetSpellStore()->LookupEntry(temp.action[j].param1)) + error_db_log("TSCR: Event %u Action %u uses non-existant SpellID %u.", i, j+1, temp.action[j].param1); + + if (temp.action[j].param2 >= TARGET_T_END) + error_db_log("TSCR: Event %u Action %u uses incorrect Target type", i, j+1); + } + break; + + case ACTION_T_REMOVEAURASFROMSPELL: + { + if (!GetSpellStore()->LookupEntry(temp.action[j].param2)) + error_db_log("TSCR: Event %u Action %u uses non-existant SpellID %u.", i, j+1, temp.action[j].param2); + + if (temp.action[j].param1 >= TARGET_T_END) + error_db_log("TSCR: Event %u Action %u uses incorrect Target type", i, j+1); + } + break; + + case ACTION_T_CASTCREATUREGO: + { + if (!GetSpellStore()->LookupEntry(temp.action[j].param2)) + error_db_log("TSCR: Event %u Action %u uses non-existant SpellID %u.", i, j+1, temp.action[j].param2); + + if (temp.action[j].param3 >= TARGET_T_END) + error_db_log("TSCR: Event %u Action %u uses incorrect Target type", i, j+1); + } + break; + + //2nd param target + case ACTION_T_SUMMON_ID: + { + if (EventAI_Summon_Map.find(temp.action[j].param3) == EventAI_Summon_Map.end()) + error_db_log("TSCR: Event %u Action %u summons missing EventAI_Summon %u", i, j+1, temp.action[j].param3); + + if (temp.action[j].param2 >= TARGET_T_END) + error_db_log("TSCR: Event %u Action %u uses incorrect Target type", i, j+1); + } + break; + + case ACTION_T_SUMMON: + case ACTION_T_THREAT_SINGLE_PCT: + case ACTION_T_QUEST_EVENT: + case ACTION_T_SET_UNIT_FLAG: + case ACTION_T_REMOVE_UNIT_FLAG: + case ACTION_T_SET_INST_DATA64: + if (temp.action[j].param2 >= TARGET_T_END) + error_db_log("TSCR: Event %u Action %u uses incorrect Target type", i, j+1); + break; + + //3rd param target + case ACTION_T_SET_UNIT_FIELD: + if (temp.action[j].param3 >= TARGET_T_END) + error_db_log("TSCR: Event %u Action %u uses incorrect Target type", i, j+1); + break; + + case ACTION_T_SET_PHASE: + if (temp.action[j].param1 > 31) + error_db_log("TSCR: Event %u Action %u attempts to set phase > 31. Phase mask cannot be used past phase 31.", i, j+1); + break; + + case ACTION_T_INC_PHASE: + if (!temp.action[j].param1) + error_db_log("TSCR: Event %u Action %u is incrementing phase by 0. Was this intended?", i, j+1); + break; + + case ACTION_T_KILLED_MONSTER: + if (temp.event_type != EVENT_T_DEATH) + outstring_log("SD2 WARNING: Event %u Action %u calling ACTION_T_KILLED_MONSTER outside of EVENT_T_DEATH", i, j+1); + break; + + case ACTION_T_SET_INST_DATA: + if (temp.action[j].param2 > 3) + error_db_log("TSCR: Event %u Action %u attempts to set instance data above encounter state 3. Custom case?", i, j+1); + break; + + default: + if (temp.action[j].type >= ACTION_T_END) + error_db_log("TSCR: Event %u Action %u has incorrect action type. Maybe DB requires updated version of SD2.", i, j+1); + break; + } + } + + //Add to list + EventAI_Event_List.push_back(temp); + ++Count; + } while (result->NextRow()); + + delete result; + + outstring_log(""); + outstring_log(">> Loaded %u EventAI scripts", Count); + }else + { + barGoLink bar(1); + bar.step(); + outstring_log(""); + outstring_log(">> Loaded 0 EventAI scripts. DB table `eventai_scripts` is empty."); + } + + //Free database thread and resources + TScriptDB.HaltDelayThread(); + +} + +struct TSpellSummary { + uint8 Targets; // set of enum SelectTarget + uint8 Effects; // set of enum SelectEffect +}extern *SpellSummary; + +MANGOS_DLL_EXPORT +void ScriptsFree() +{ + // Free Spell Summary + delete []SpellSummary; + + // Free resources before library unload + for(int i=0;i<nrscripts;i++) + delete m_scripts[i]; + + nrscripts = 0; +} + +MANGOS_DLL_EXPORT +void ScriptsInit() +{ + bool CanLoadDB = true; + + //Trinity Script startup + outstring_log(" _____ _ _ _ ____ _ _"); + outstring_log("|_ _| __(_)_ __ (_) |_ _ _/ ___| ___ _ __(_)_ __ | |_ "); + outstring_log(" | || '__| | '_ \\| | __| | | \\___ \\ / __| \'__| | \'_ \\| __|"); + outstring_log(" | || | | | | | | | |_| |_| |___) | (__| | | | |_) | |_ "); + outstring_log(" |_||_| |_|_| |_|_|\\__|\\__, |____/ \\___|_| |_| .__/ \\__|"); + outstring_log(" |___/ |_| "); + outstring_log("Trinity Script initializing %s", _FULLVERSION); + outstring_log(""); + + //Get configuration file + if (!TScriptConfig.SetSource(_TRINITY_SCRIPT_CONFIG)) + { + CanLoadDB = false; + error_log("TSCR: Unable to open configuration file. Database will be unaccessible. Configuration values will use default."); + } + else outstring_log("TSCR: Using configuration file %s",_TRINITY_SCRIPT_CONFIG); + + //Check config file version + if (TScriptConfig.GetIntDefault("ConfVersion", 0) != _TSCRIPTCONFVERSION) + error_log("TSCR: Configuration file version doesn't match expected version. Some config variables may be wrong or missing."); + + //Locale + Locale = TScriptConfig.GetIntDefault("Locale", 0); + + if (Locale > 8) + { + Locale = 0; + error_log("TSCR: Locale set to invalid language id. Defaulting to 0."); + } + + outstring_log("TSCR: Using locale %u", Locale); + + EAI_ErrorLevel = TScriptConfig.GetIntDefault("EAIErrorLevel", 1); + + switch (EAI_ErrorLevel) + { + case 0: + outstring_log("TSCR: EventAI Error Reporting level set to 0 (Startup Errors only)"); + break; + case 1: + outstring_log("TSCR: EventAI Error Reporting level set to 1 (Startup errors and Runtime event errors)"); + break; + case 2: + outstring_log("TSCR: EventAI Error Reporting level set to 2 (Startup errors, Runtime event errors, and Creation errors)"); + break; + default: + outstring_log("TSCR: Unknown EventAI Error Reporting level. Defaulting to 1 (Startup errors and Runtime event errors)"); + EAI_ErrorLevel = 1; + break; + } + + outstring_log(""); + + //Load database (must be called after TScriptConfig.SetSource). In case it failed, no need to even try load. + if (CanLoadDB) + LoadDatabase(); + + outstring_log("TSCR: Loading C++ scripts"); + barGoLink bar(1); + bar.step(); + outstring_log(""); + + nrscripts = 0; + for(int i=0;i<MAX_SCRIPTS;i++) + m_scripts[i]=NULL; + + FillSpellSummary(); + + // -- Scripts to be added -- + + // -- Areatrigger -- + AddSC_areatrigger_scripts(); + + // -- Boss -- + AddSC_boss_emeriss(); + AddSC_boss_taerar(); + AddSC_boss_ysondre(); + + // -- Creature -- + AddSC_mob_event(); + AddSC_generic_creature(); + + // -- Custom -- + AddSC_custom_example(); + AddSC_custom_gossip_codebox(); + AddSC_test(); + + // -- GO -- + AddSC_go_scripts(); + + // -- Guard -- + AddSC_guards(); + + // -- Honor -- + + // -- Item -- + AddSC_item_scripts(); + AddSC_item_test(); + + // -- NPC -- + AddSC_npc_professions(); + AddSC_npcs_special(); + + // -- Servers -- + + //-------------------- + //------ ZONE -------- + + //Alterac Mountains + AddSC_alterac_mountains(); + + //Arathi Highlands + //Ashenvale Forest + //Aunchindoun + //--Auchenai Crypts + AddSC_boss_exarch_maladaar(); + + //--Mana Tombs + AddSC_boss_nexusprince_shaffar(); + AddSC_boss_pandemonius(); + + //--Sekketh Halls + AddSC_boss_darkweaver_syth(); + AddSC_boss_talon_king_ikiss(); + AddSC_instance_sethekk_halls(); + + //--Shadow Labyrinth + AddSC_boss_ambassador_hellmaw(); + AddSC_boss_blackheart_the_inciter(); + AddSC_boss_grandmaster_vorpil(); + AddSC_boss_murmur(); + AddSC_instance_shadow_labyrinth(); + + //Azshara + AddSC_boss_azuregos(); + AddSC_azshara(); + + //Azuremyst Isle + AddSC_azuremyst_isle(); + + //Badlands + //Barrens + AddSC_the_barrens(); + + //Black Temple + AddSC_black_temple(); + AddSC_boss_illidan(); + AddSC_boss_shade_of_akama(); + AddSC_boss_supremus(); + AddSC_boss_gurtogg_bloodboil(); + AddSC_boss_mother_shahraz(); + AddSC_boss_reliquary_of_souls(); + AddSC_boss_teron_gorefiend(); + AddSC_boss_najentus(); + AddSC_boss_illidari_council(); + AddSC_instance_black_temple(); + + //Blackfathom Depths + //Blackrock Depths + AddSC_blackrock_depths(); + AddSC_boss_ambassador_flamelash(); + AddSC_boss_angerrel(); + AddSC_boss_anubshiah(); + AddSC_boss_doomrel(); + AddSC_boss_doperel(); + AddSC_boss_draganthaurissan(); + AddSC_boss_general_angerforge(); + AddSC_boss_gloomrel(); + AddSC_boss_gorosh_the_dervish(); + AddSC_boss_grizzle(); + AddSC_boss_haterel(); + AddSC_boss_high_interrogator_gerstahn(); + AddSC_boss_magmus(); + AddSC_boss_moira_bronzebeard(); + AddSC_boss_seethrel(); + AddSC_boss_vilerel(); + + //Blackrock Spire + AddSC_boss_drakkisath(); + AddSC_boss_halycon(); + AddSC_boss_highlordomokk(); + AddSC_boss_mothersmolderweb(); + AddSC_boss_overlordwyrmthalak(); + AddSC_boss_shadowvosh(); + AddSC_boss_thebeast(); + AddSC_boss_warmastervoone(); + AddSC_boss_quatermasterzigris(); + AddSC_boss_pyroguard_emberseer(); + AddSC_boss_gyth(); + AddSC_boss_rend_blackhand(); + + //Blackwing lair + AddSC_boss_razorgore(); + AddSC_boss_vael(); + AddSC_boss_broodlord(); + AddSC_boss_firemaw(); + AddSC_boss_ebonroc(); + AddSC_boss_flamegor(); + AddSC_boss_chromaggus(); + AddSC_boss_nefarian(); + AddSC_boss_victor_nefarius(); + + //Blade's Edge Mountains + AddSC_blades_edge_mountains(); + + //Blasted lands + AddSC_boss_kruul(); + AddSC_blasted_lands(); + + //Bloodmyst Isle + AddSC_bloodmyst_isle(); + + //Burning steppes + AddSC_burning_steppes(); + + //Caverns of Time + //--Battle for Mt. Hyjal + AddSC_hyjal(); + AddSC_boss_archimonde(); + AddSC_instance_mount_hyjal(); + + //--Old Hillsbrad + AddSC_boss_captain_skarloc(); + AddSC_boss_epoch_hunter(); + AddSC_boss_lieutenant_drake(); + AddSC_instance_old_hillsbrad(); + AddSC_old_hillsbrad(); + + //--The Dark Portal + AddSC_boss_aeonus(); + AddSC_boss_chrono_lord_deja(); + AddSC_boss_temporus(); + + //Coilfang Resevoir + //--Serpent Shrine Cavern + AddSC_boss_fathomlord_karathress(); + AddSC_boss_hydross_the_unstable(); + AddSC_boss_lady_vashj(); + AddSC_boss_leotheras_the_blind(); + AddSC_boss_morogrim_tidewalker(); + AddSC_instance_serpentshrine_cavern(); + + //--Slave Pens + //--Steam Vault + AddSC_boss_hydromancer_thespia(); + AddSC_boss_mekgineer_steamrigger(); + AddSC_boss_warlord_kalithresh(); + AddSC_instance_steam_vault(); + + //--Underbog + AddSC_boss_hungarfen(); + + //Darkshore + //Darnassus + //Deadmines + //Deadwind pass + //Desolace + //Dire Maul + //Dun Morogh + AddSC_dun_morogh(); + + //Durotar + //Duskwood + //Dustwallow marsh + AddSC_dustwallow_marsh(); + + //Eversong Woods + AddSC_eversong_woods(); + + //Exodar + //Eastern Plaguelands + AddSC_eastern_plaguelands(); + + //Elwynn Forest + AddSC_elwynn_forest(); + + //Felwood + AddSC_felwood(); + + //Feralas + AddSC_feralas(); + + //Ghostlands + AddSC_ghostlands(); + + //Gnomeregan + //Gruul's Lair + AddSC_boss_gruul(); + AddSC_boss_high_king_maulgar(); + AddSC_instance_gruuls_lair(); + + //Hellfire Citadel + //--Blood Furnace + AddSC_boss_broggok(); + AddSC_boss_kelidan_the_breaker(); + AddSC_boss_the_maker(); + + //--Magtheridon's Lair + AddSC_boss_magtheridon(); + AddSC_instance_magtheridons_lair(); + + //--Shattered Halls + AddSC_boss_grand_warlock_nethekurse(); + AddSC_boss_warbringer_omrogg(); + AddSC_instance_shattered_halls(); + + //--Ramparts + AddSC_boss_watchkeeper_gargolmar(); + AddSC_boss_omor_the_unscarred(); + + //Hellfire Peninsula + AddSC_boss_doomlordkazzak(); + AddSC_hellfire_peninsula(); + + //Hillsbrad Foothills + //Hinterlands + //Ironforge + AddSC_ironforge(); + + //Isle of Quel'Danas + AddSC_isle_of_queldanas(); + + //Karazhan + AddSC_boss_attumen(); + AddSC_boss_curator(); + AddSC_boss_maiden_of_virtue(); + AddSC_boss_shade_of_aran(); + AddSC_boss_malchezaar(); + AddSC_boss_terestian_illhoof(); + AddSC_netherspite_infernal(); + AddSC_boss_moroes(); + AddSC_bosses_opera(); + AddSC_instance_karazhan(); + AddSC_karazhan(); + + //Loch Modan + AddSC_loch_modan(); + + //Lower Blackrock Spire + + // Magister's Terrace + AddSC_boss_felblood_kaelthas(); + AddSC_boss_selin_fireheart(); + AddSC_boss_vexallus(); + AddSC_boss_priestess_delrissa(); + AddSC_instance_magisters_terrace(); + + //Maraudon + AddSC_boss_celebras_the_cursed(); + AddSC_boss_landslide(); + AddSC_boss_noxxion(); + AddSC_boss_ptheradras(); + + //Molten core + AddSC_boss_lucifron(); + AddSC_boss_magmadar(); + AddSC_boss_gehennas(); + AddSC_boss_garr(); + AddSC_boss_baron_geddon(); + AddSC_boss_shazzrah(); + AddSC_boss_golemagg(); + AddSC_boss_sulfuron(); + AddSC_boss_majordomo(); + AddSC_boss_ragnaros(); + AddSC_instance_molten_core(); + AddSC_molten_core(); + + //Moonglade + AddSC_moonglade(); + + //Mulgore + AddSC_mulgore(); + + //Nagrand + AddSC_nagrand(); + + //Naxxramas + AddSC_boss_anubrekhan(); + AddSC_boss_maexxna(); + AddSC_boss_patchwerk(); + AddSC_boss_razuvious(); + AddSC_boss_highlord_mograine(); + AddSC_boss_lady_blaumeux(); + AddSC_boss_sir_zeliek(); + AddSC_boss_thane_korthazz(); + AddSC_boss_kelthuzad(); + AddSC_boss_faerlina(); + AddSC_boss_loatheb(); + AddSC_boss_noth(); + AddSC_boss_gluth(); + AddSC_boss_sapphiron(); + + //Netherstorm + AddSC_netherstorm(); + + //Onyxia's Lair + AddSC_boss_onyxia(); + + //Orgrimmar + AddSC_orgrimmar(); + + //Ragefire Chasm + //Razorfen Downs + AddSC_boss_amnennar_the_coldbringer(); + + //Redridge Mountains + //Ruins of Ahn'Qiraj + //Scarlet Monastery + AddSC_boss_arcanist_doan(); + AddSC_boss_azshir_the_sleepless(); + AddSC_boss_bloodmage_thalnos(); + AddSC_boss_herod(); + AddSC_boss_high_inquisitor_fairbanks(); + AddSC_boss_high_inquisitor_whitemane(); + AddSC_boss_houndmaster_loksey(); + AddSC_boss_interrogator_vishas(); + AddSC_boss_scarlet_commander_mograine(); + AddSC_boss_scorn(); + + //Scholomance + AddSC_boss_darkmaster_gandling(); + AddSC_boss_death_knight_darkreaver(); + AddSC_boss_theolenkrastinov(); + AddSC_boss_illuciabarov(); + AddSC_boss_instructormalicia(); + AddSC_boss_jandicebarov(); + AddSC_boss_kormok(); + AddSC_boss_lordalexeibarov(); + AddSC_boss_lorekeeperpolkelt(); + AddSC_boss_rasfrost(); + AddSC_boss_theravenian(); + AddSC_boss_vectus(); + AddSC_instance_scholomance(); + + //Searing gorge + AddSC_searing_gorge(); + + //Shadowfang keep + AddSC_shadowfang_keep(); + AddSC_instance_shadowfang_keep(); + + //Shadowmoon Valley + AddSC_boss_doomwalker(); + AddSC_shadowmoon_valley(); + + //Shattrath + AddSC_shattrath_city(); + + //Silithus + AddSC_silithus(); + + //Silvermoon + AddSC_silvermoon_city(); + + //Silverpine forest + AddSC_silverpine_forest(); + + //Stockade + //Stonetalon mountains + AddSC_stonetalon_mountains(); + + //Stormwind City + AddSC_stormwind_city(); + + //Stranglethorn Vale + AddSC_stranglethorn_vale(); + + //Stratholme + AddSC_boss_magistrate_barthilas(); + AddSC_boss_maleki_the_pallid(); + AddSC_boss_nerubenkan(); + AddSC_boss_cannon_master_willey(); + AddSC_boss_baroness_anastari(); + AddSC_boss_ramstein_the_gorger(); + AddSC_boss_timmy_the_cruel(); + AddSC_boss_postmaster_malown(); + AddSC_boss_baron_rivendare(); + AddSC_boss_dathrohan_balnazzar(); + AddSC_boss_order_of_silver_hand(); + AddSC_instance_stratholme(); + AddSC_stratholme(); + + //Sunken Temple + //Tanaris + AddSC_tanaris(); + + //Teldrassil + //Tempest Keep + //--Arcatraz + AddSC_arcatraz(); + AddSC_boss_harbinger_skyriss(); + AddSC_instance_arcatraz(); + + //--Botanica + AddSC_boss_high_botanist_freywinn(); + AddSC_boss_laj(); + AddSC_boss_warp_splinter(); + + //--The Eye + AddSC_boss_kaelthas(); + AddSC_boss_void_reaver(); + AddSC_boss_high_astromancer_solarian(); + AddSC_instance_the_eye(); + AddSC_the_eye(); + + //--The Mechanar + AddSC_boss_gatewatcher_iron_hand(); + AddSC_boss_nethermancer_sepethrea(); + + //Temple of ahn'qiraj + AddSC_boss_cthun(); + AddSC_boss_fankriss(); + AddSC_boss_huhuran(); + AddSC_bug_trio(); + AddSC_boss_sartura(); + AddSC_boss_skeram(); + AddSC_boss_twinemperors(); + AddSC_mob_anubisath_sentinel(); + AddSC_instance_temple_of_ahnqiraj(); + + //Terokkar Forest + AddSC_terokkar_forest(); + + //Thousand Needles + //Thunder Bluff + AddSC_thunder_bluff(); + + //Tirisfal Glades + AddSC_tirisfal_glades(); + + //Uldaman + AddSC_boss_ironaya(); + AddSC_uldaman(); + + //Undercity + AddSC_undercity(); + + //Un'Goro Crater + //Upper blackrock spire + //Wailing caverns + + //Western plaguelands + AddSC_western_plaguelands(); + + //Westfall + //Wetlands + //Winterspring + AddSC_winterspring(); + + //Zangarmarsh + AddSC_zangarmarsh(); + + //Zul'Farrak + //Zul'Gurub + AddSC_boss_jeklik(); + AddSC_boss_venoxis(); + AddSC_boss_marli(); + AddSC_boss_mandokir(); + AddSC_boss_gahzranka(); + AddSC_boss_thekal(); + AddSC_boss_arlokk(); + AddSC_boss_jindo(); + AddSC_boss_hakkar(); + AddSC_boss_grilek(); + AddSC_boss_hazzarah(); + AddSC_boss_renataki(); + AddSC_boss_wushoolay(); + AddSC_instance_zulgurub(); + + //Zul'Aman + AddSC_boss_janalai(); + AddSC_boss_nalorakk(); + AddSC_instance_zulaman(); + AddSC_zulaman(); + + // ------------------- + + outstring_log("TSCR: Loaded %u C++ Scripts", nrscripts); + outstring_log(""); +} + +//********************************* +//*** Functions used internally *** + +const char* GetEventAILocalizedText(uint32 entry) +{ + if (entry == 0xffffffff) + error_log("TSCR: Entry = -1, GetEventAILocalizedText should not be called in this case."); + + const char* temp = NULL; + + HM_NAMESPACE::hash_map<uint32, Localized_Text>::iterator i = EventAI_LocalizedTextMap.find(entry); + + if (i == EventAI_LocalizedTextMap.end()) + { + error_log("TSCR: EventAI Localized Text %u not found", entry); + return DEFAULT_TEXT; + } + + switch (Locale) + { + case 1: + temp = (*i).second.locale_1.c_str(); + break; + + case 2: + temp = (*i).second.locale_2.c_str(); + break; + + case 3: + temp = (*i).second.locale_3.c_str(); + break; + + case 4: + temp = (*i).second.locale_4.c_str(); + break; + + case 5: + temp = (*i).second.locale_5.c_str(); + break; + + case 6: + temp = (*i).second.locale_6.c_str(); + break; + + case 7: + temp = (*i).second.locale_7.c_str(); + break; + + case 8: + temp = (*i).second.locale_8.c_str(); + break; + }; + + if (strlen(temp)) + return temp; + + return DEFAULT_TEXT; +} + +const char* GetEventAIText(uint32 entry) +{ + if(entry == 0xffffffff) + error_log("TSCR: Entry = -1, GetEventAIText should not be called in this case."); + + const char* str = NULL; + + HM_NAMESPACE::hash_map<uint32, std::string>::iterator itr = EventAI_Text_Map.find(entry); + if(itr == EventAI_Text_Map.end()) + { + error_log("TSCR: Unable to find EventAI Text %u", entry); + return DEFAULT_TEXT; + } + + str = (*itr).second.c_str(); + + if(strlen(str)) + return str; + + if(strlen((*itr).second.c_str())) + return (*itr).second.c_str(); + + return DEFAULT_TEXT; +} + +void DoScriptText(int32 textEntry, WorldObject* pSource, Unit* target) +{ + if (!pSource) + { + error_log("TSCR: DoScriptText entry %i, invalid Source pointer.",textEntry); + return; + } + + if (textEntry >= 0) + { + error_log("TSCR: DoScriptText attempts to process entry %i, but entry must be negative.",textEntry); + return; + } + + HM_NAMESPACE::hash_map<int32, StringTextData>::iterator i = TextMap.find(textEntry); + + if (i == TextMap.end()) + { + error_log("TSCR: DoScriptText could not find text entry %i.",textEntry); + return; + } + + if((*i).second.SoundId) + { + if( GetSoundEntriesStore()->LookupEntry((*i).second.SoundId) ) + { + pSource->SendPlaySound((*i).second.SoundId, false); + } + else + error_log("TSCR: DoScriptText entry %i tried to process invalid sound id %u.",textEntry,(*i).second.SoundId); + } + + switch((*i).second.Type) + { + case CHAT_TYPE_SAY: + pSource->MonsterSay(textEntry, (*i).second.Language, target ? target->GetGUID() : 0); + break; + case CHAT_TYPE_YELL: + pSource->MonsterYell(textEntry, (*i).second.Language, target ? target->GetGUID() : 0); + break; + case CHAT_TYPE_TEXT_EMOTE: + pSource->MonsterTextEmote(textEntry, target ? target->GetGUID() : 0); + break; + case CHAT_TYPE_BOSS_EMOTE: + pSource->MonsterTextEmote(textEntry, target ? target->GetGUID() : 0, true); + break; + case CHAT_TYPE_WHISPER: + { + if (target && target->GetTypeId() == TYPEID_PLAYER) + pSource->MonsterWhisper(textEntry, target->GetGUID()); + else error_log("TSCR: DoScriptText entry %i cannot whisper without target unit (TYPEID_PLAYER).", textEntry); + }break; + case CHAT_TYPE_BOSS_WHISPER: + { + if (target && target->GetTypeId() == TYPEID_PLAYER) + pSource->MonsterWhisper(textEntry, target->GetGUID(), true); + else error_log("TSCR: DoScriptText entry %i cannot whisper without target unit (TYPEID_PLAYER).", textEntry); + }break; + } +} + +Script* GetScriptByName(std::string Name) +{ + if(Name.empty()) + return NULL; + + for(int i=0;i<MAX_SCRIPTS;i++) + { + if( m_scripts[i] && m_scripts[i]->Name == Name ) + return m_scripts[i]; + } + return NULL; +} + +//******************************** +//*** Functions to be Exported *** + +MANGOS_DLL_EXPORT +bool GossipHello ( Player * player, Creature *_Creature ) +{ + Script *tmpscript = GetScriptByName(_Creature->GetScriptName()); + if(!tmpscript || !tmpscript->pGossipHello) return false; + + player->PlayerTalkClass->ClearMenus(); + return tmpscript->pGossipHello(player,_Creature); +} + +MANGOS_DLL_EXPORT +bool GossipSelect( Player *player, Creature *_Creature, uint32 sender, uint32 action ) +{ + debug_log("TSCR: Gossip selection, sender: %d, action: %d",sender, action); + + Script *tmpscript = GetScriptByName(_Creature->GetScriptName()); + if(!tmpscript || !tmpscript->pGossipSelect) return false; + + player->PlayerTalkClass->ClearMenus(); + return tmpscript->pGossipSelect(player,_Creature,sender,action); +} + +MANGOS_DLL_EXPORT +bool GossipSelectWithCode( Player *player, Creature *_Creature, uint32 sender, uint32 action, const char* sCode ) +{ + debug_log("TSCR: Gossip selection with code, sender: %d, action: %d",sender, action); + + Script *tmpscript = GetScriptByName(_Creature->GetScriptName()); + if(!tmpscript || !tmpscript->pGossipSelectWithCode) return false; + + player->PlayerTalkClass->ClearMenus(); + return tmpscript->pGossipSelectWithCode(player,_Creature,sender,action,sCode); +} + +MANGOS_DLL_EXPORT +bool QuestAccept( Player *player, Creature *_Creature, Quest const *_Quest ) +{ + Script *tmpscript = GetScriptByName(_Creature->GetScriptName()); + if(!tmpscript || !tmpscript->pQuestAccept) return false; + + player->PlayerTalkClass->ClearMenus(); + return tmpscript->pQuestAccept(player,_Creature,_Quest); +} + +MANGOS_DLL_EXPORT +bool QuestSelect( Player *player, Creature *_Creature, Quest const *_Quest ) +{ + Script *tmpscript = GetScriptByName(_Creature->GetScriptName()); + if(!tmpscript || !tmpscript->pQuestSelect) return false; + + player->PlayerTalkClass->ClearMenus(); + return tmpscript->pQuestSelect(player,_Creature,_Quest); +} + +MANGOS_DLL_EXPORT +bool QuestComplete( Player *player, Creature *_Creature, Quest const *_Quest ) +{ + Script *tmpscript = GetScriptByName(_Creature->GetScriptName()); + if(!tmpscript || !tmpscript->pQuestComplete) return false; + + player->PlayerTalkClass->ClearMenus(); + return tmpscript->pQuestComplete(player,_Creature,_Quest); +} + +MANGOS_DLL_EXPORT +bool ChooseReward( Player *player, Creature *_Creature, Quest const *_Quest, uint32 opt ) +{ + Script *tmpscript = GetScriptByName(_Creature->GetScriptName()); + if(!tmpscript || !tmpscript->pChooseReward) return false; + + player->PlayerTalkClass->ClearMenus(); + return tmpscript->pChooseReward(player,_Creature,_Quest,opt); +} + +MANGOS_DLL_EXPORT +uint32 NPCDialogStatus( Player *player, Creature *_Creature ) +{ + Script *tmpscript = GetScriptByName(_Creature->GetScriptName()); + if(!tmpscript || !tmpscript->pNPCDialogStatus) return 100; + + player->PlayerTalkClass->ClearMenus(); + return tmpscript->pNPCDialogStatus(player,_Creature); +} + +MANGOS_DLL_EXPORT +uint32 GODialogStatus( Player *player, GameObject *_GO ) +{ + Script *tmpscript = GetScriptByName(_GO->GetGOInfo()->ScriptName); + if(!tmpscript || !tmpscript->pGODialogStatus) return 100; + + player->PlayerTalkClass->ClearMenus(); + return tmpscript->pGODialogStatus(player,_GO); +} + +MANGOS_DLL_EXPORT +bool ItemHello( Player *player, Item *_Item, Quest const *_Quest ) +{ + Script *tmpscript = GetScriptByName(_Item->GetProto()->ScriptName); + if(!tmpscript || !tmpscript->pItemHello) return false; + + player->PlayerTalkClass->ClearMenus(); + return tmpscript->pItemHello(player,_Item,_Quest); +} + +MANGOS_DLL_EXPORT +bool ItemQuestAccept( Player *player, Item *_Item, Quest const *_Quest ) +{ + Script *tmpscript = GetScriptByName(_Item->GetProto()->ScriptName); + if(!tmpscript || !tmpscript->pItemQuestAccept) return false; + + player->PlayerTalkClass->ClearMenus(); + return tmpscript->pItemQuestAccept(player,_Item,_Quest); +} + +MANGOS_DLL_EXPORT +bool GOHello( Player *player, GameObject *_GO ) +{ + Script *tmpscript = GetScriptByName(_GO->GetGOInfo()->ScriptName); + if(!tmpscript || !tmpscript->pGOHello) return false; + + player->PlayerTalkClass->ClearMenus(); + return tmpscript->pGOHello(player,_GO); +} + +MANGOS_DLL_EXPORT +bool GOQuestAccept( Player *player, GameObject *_GO, Quest const *_Quest ) +{ + Script *tmpscript = GetScriptByName(_GO->GetGOInfo()->ScriptName); + if(!tmpscript || !tmpscript->pGOQuestAccept) return false; + + player->PlayerTalkClass->ClearMenus(); + return tmpscript->pGOQuestAccept(player,_GO,_Quest); +} + +MANGOS_DLL_EXPORT +bool GOChooseReward( Player *player, GameObject *_GO, Quest const *_Quest, uint32 opt ) +{ + Script *tmpscript = GetScriptByName(_GO->GetGOInfo()->ScriptName); + if(!tmpscript || !tmpscript->pGOChooseReward) return false; + + player->PlayerTalkClass->ClearMenus(); + return tmpscript->pGOChooseReward(player,_GO,_Quest,opt); +} + +MANGOS_DLL_EXPORT +bool AreaTrigger( Player *player, AreaTriggerEntry * atEntry) +{ + Script *tmpscript = NULL; + + tmpscript = GetScriptByName(GetAreaTriggerScriptNameById(atEntry->id)); + if(!tmpscript || !tmpscript->pAreaTrigger) return false; + + return tmpscript->pAreaTrigger(player, atEntry); +} + +MANGOS_DLL_EXPORT +CreatureAI* GetAI(Creature *_Creature) +{ + Script *tmpscript = GetScriptByName(_Creature->GetScriptName()); + + if(!tmpscript || !tmpscript->GetAI) return NULL; + return tmpscript->GetAI(_Creature); +} + +MANGOS_DLL_EXPORT +bool ItemUse( Player *player, Item* _Item, SpellCastTargets const& targets) +{ + Script *tmpscript = GetScriptByName(_Item->GetProto()->ScriptName); + if(!tmpscript || !tmpscript->pItemUse) return false; + + return tmpscript->pItemUse(player,_Item,targets); +} + +MANGOS_DLL_EXPORT +bool ReceiveEmote( Player *player, Creature *_Creature, uint32 emote ) +{ + Script *tmpscript = GetScriptByName(_Creature->GetScriptName()); + if(!tmpscript || !tmpscript->pReceiveEmote) return false; + + return tmpscript->pReceiveEmote(player, _Creature, emote); +} + +MANGOS_DLL_EXPORT +InstanceData* CreateInstanceData(Map *map) +{ + Script *tmpscript = NULL; + + if(!map->IsDungeon()) return false; + + tmpscript = GetScriptByName(((InstanceMap*)map)->GetScript()); + if(!tmpscript || !tmpscript->GetInstanceData) return false; + + return tmpscript->GetInstanceData(map); +} |