Files
TrinityCore/src/bindings/scripts/ScriptMgr.cpp
megamage 277334fc41 [svn] Fix cloak of shadow, can remove fairy fire now.
Add yells to High King Maulgar. Patch provided by riddick.
Script for Prince Malchezaar Doors. Patch provided by BroodWyrm.
Bug fix for Selin Fireheart. Patch provided by BroodWyrm.
Arcane Charges only while on flightpath. Patch provided by SLG.

--HG--
branch : trunk
2008-10-23 22:04:14 -05:00

2151 lines
63 KiB
C++

/* 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 _TRINITY_SCRIPT_CONFIG
# define _TRINITY_SCRIPT_CONFIG "trinitycore.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_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
//Sunwell Plateau
extern void AddSC_instance_sunwell_plateau();
extern void AddSC_boss_kalecgos();
extern void AddSC_boss_brutallus();
extern void AddSC_boss_felmyst();
extern void AddSC_boss_eredar_twins();
//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_alar();
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_akilzon();
extern void AddSC_boss_halazzi();
extern void AddSC_boss_hex_lord_malacrass();
extern void AddSC_boss_janalai();
extern void AddSC_boss_nalorakk();
extern void AddSC_boss_zuljin();
extern void AddSC_instance_zulaman();
extern void AddSC_zulaman();
// -------------------
void LoadDatabase()
{
//Get db string from file
char const* dbstring = NULL;
if( !TScriptConfig.GetString("WorldDatabaseInfo", &dbstring) )
{
error_log("TSCR: Missing world 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...");
LoadTrinityStrings(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...");
LoadTrinityStrings(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;
TRINITY_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;
}
TRINITY_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);
//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_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
//Sunwell Plateau
AddSC_instance_sunwell_plateau();
AddSC_boss_kalecgos();
AddSC_boss_brutallus();
AddSC_boss_felmyst();
AddSC_boss_eredar_twins();
//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_alar();
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_akilzon();
AddSC_boss_halazzi();
AddSC_boss_hex_lord_malacrass();
AddSC_boss_janalai();
AddSC_boss_nalorakk();
AddSC_boss_zuljin();
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 ***
TRINITY_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);
}
TRINITY_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);
}
TRINITY_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);
}
TRINITY_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);
}
TRINITY_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);
}
TRINITY_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);
}
TRINITY_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);
}
TRINITY_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);
}
TRINITY_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);
}
TRINITY_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);
}
TRINITY_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);
}
TRINITY_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);
}
TRINITY_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);
}
TRINITY_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);
}
TRINITY_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);
}
TRINITY_DLL_EXPORT
CreatureAI* GetAI(Creature *_Creature)
{
Script *tmpscript = GetScriptByName(_Creature->GetScriptName());
if(!tmpscript || !tmpscript->GetAI) return NULL;
return tmpscript->GetAI(_Creature);
}
TRINITY_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);
}
TRINITY_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);
}
TRINITY_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);
}