2008-10-11 14:16:25 -05:00
/* 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 );
}