mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-19 08:55:32 +01:00
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
2151 lines
63 KiB
C++
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);
|
|
}
|