2008-10-11 14:16:25 -05:00
/* Copyright (C) 2006 - 2008 TrinityScript <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
# include "precompiled.h"
# include "Config/Config.h"
# include "Database/DatabaseEnv.h"
2009-03-27 09:58:20 -06:00
# include "DBCStores.h"
2008-10-11 14:16:25 -05:00
# include "ObjectMgr.h"
# include "ProgressBar.h"
2009-08-16 01:45:49 +02:00
# include "../system/ScriptLoader.h"
2008-10-11 14:16:25 -05:00
# define _FULLVERSION "TrinityScript"
# ifndef _TRINITY_SCRIPT_CONFIG
2008-10-12 17:35:16 -05:00
# define _TRINITY_SCRIPT_CONFIG "trinitycore.conf"
# endif _TRINITY_SCRIPT_CONFIG
2008-10-11 14:16:25 -05:00
2008-11-20 16:16:57 -06:00
int num_sc_scripts ;
2008-10-11 14:16:25 -05:00
Script * m_scripts [ MAX_SCRIPTS ] ;
DatabaseType TScriptDB ;
Config TScriptConfig ;
// String text additional data, used in TextMap
struct StringTextData
{
uint32 SoundId ;
uint8 Type ;
uint32 Language ;
2009-02-09 08:16:34 -05:00
uint32 Emote ;
2008-10-11 14:16:25 -05:00
} ;
2008-10-25 11:40:10 -05:00
# define TEXT_SOURCE_RANGE -1000000 //the amount of entries each text source has available
2008-10-11 14:16:25 -05:00
// Text Maps
2008-11-10 06:53:00 -06:00
UNORDERED_MAP < int32 , StringTextData > TextMap ;
2008-10-11 14:16:25 -05:00
2009-04-09 23:07:32 +02:00
// Waypoint map (escorts)
UNORDERED_MAP < uint32 , std : : vector < PointMovement > > PointMovementMap ;
2008-10-11 14:16:25 -05:00
void FillSpellSummary ( ) ;
2009-02-05 15:38:24 -06:00
void LoadOverridenSQLData ( ) ;
void LoadOverridenDBCData ( ) ;
2008-10-11 14:16:25 -05:00
void LoadDatabase ( )
{
//Get db string from file
2009-03-18 20:32:17 -06:00
std : : string dbstring = TScriptConfig . GetStringDefault ( " WorldDatabaseInfo " , " " ) ;
2008-10-11 14:16:25 -05:00
2009-08-15 00:32:04 +02:00
if ( dbstring . empty ( ) )
2008-10-11 14:16:25 -05:00
{
2008-10-12 17:35:16 -05:00
error_log ( " TSCR: Missing world database info from configuration file. Load database aborted. " ) ;
2008-10-11 14:16:25 -05:00
return ;
}
//Initialize connection to DB
2009-08-15 00:32:04 +02:00
if ( ! dbstring . empty ( ) & & TScriptDB . Initialize ( dbstring . c_str ( ) ) )
2009-03-18 20:46:39 +01:00
outstring_log ( " TSCR: TrinityScript database: %s " , dbstring . c_str ( ) ) ;
2008-10-11 14:16:25 -05:00
else
{
error_log ( " TSCR: Unable to connect to Database. Load database aborted. " ) ;
return ;
}
//***Preform all DB queries here***
QueryResult * result ;
//Get Version information
2009-01-19 17:38:03 +01:00
result = TScriptDB . PQuery ( " SELECT script_version FROM version LIMIT 1 " ) ;
2008-10-11 14:16:25 -05:00
if ( result )
{
Field * fields = result - > Fetch ( ) ;
outstring_log ( " TSCR: Database version is: %s " , fields [ 0 ] . GetString ( ) ) ;
outstring_log ( " " ) ;
delete result ;
} else
{
2009-01-19 17:38:03 +01:00
error_log ( " TSCR: Missing `version.script_version` information. " ) ;
2008-10-11 14:16:25 -05:00
outstring_log ( " " ) ;
}
// Drop Existing Text Map, only done once and we are ready to add data from multiple sources.
TextMap . clear ( ) ;
2009-02-04 10:33:18 -06:00
// Load Script Text
2008-10-25 11:40:10 -05:00
outstring_log ( " TSCR: Loading Script Texts... " ) ;
LoadTrinityStrings ( TScriptDB , " script_texts " , TEXT_SOURCE_RANGE , 1 + ( TEXT_SOURCE_RANGE * 2 ) ) ;
2008-10-11 14:16:25 -05:00
2008-10-25 11:40:10 -05:00
// Gather Additional data from Script Texts
2008-12-31 12:22:16 -06:00
result = TScriptDB . PQuery ( " SELECT entry, sound, type, language, emote FROM script_texts " ) ;
2008-10-11 14:16:25 -05:00
2008-10-25 11:40:10 -05:00
outstring_log ( " TSCR: Loading Script Texts additional data... " ) ;
2008-10-11 14:16:25 -05:00
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 ( ) ;
2009-02-09 08:16:34 -05:00
temp . Emote = fields [ 4 ] . GetInt32 ( ) ;
2008-10-11 14:16:25 -05:00
if ( i > = 0 )
{
2008-10-25 11:40:10 -05:00
error_db_log ( " TSCR: Entry %i in table `script_texts` is not a negative value. " , i ) ;
2008-10-11 14:16:25 -05:00
continue ;
}
2008-10-25 11:40:10 -05:00
if ( i > TEXT_SOURCE_RANGE | | i < = TEXT_SOURCE_RANGE * 2 )
2008-10-11 14:16:25 -05:00
{
2008-10-25 11:40:10 -05:00
error_db_log ( " TSCR: Entry %i in table `script_texts` is out of accepted entry range for table. " , i ) ;
2008-10-11 14:16:25 -05:00
continue ;
}
if ( temp . SoundId )
{
if ( ! GetSoundEntriesStore ( ) - > LookupEntry ( temp . SoundId ) )
2009-08-15 00:32:04 +02:00
error_db_log ( " TSCR: Entry %i in table `script_texts` has soundId %u but sound does not exist. " , i , temp . SoundId ) ;
2008-10-11 14:16:25 -05:00
}
if ( ! GetLanguageDescByID ( temp . Language ) )
2009-08-15 00:32:04 +02:00
error_db_log ( " TSCR: Entry %i in table `script_texts` using Language %u but Language does not exist. " , i , temp . Language ) ;
2008-10-11 14:16:25 -05:00
2009-04-19 21:16:11 +02:00
if ( temp . Type > CHAT_TYPE_ZONE_YELL )
2009-08-15 00:32:04 +02:00
error_db_log ( " TSCR: Entry %i in table `script_texts` has Type %u but this Chat Type does not exist. " , i , temp . Type ) ;
2008-10-11 14:16:25 -05:00
TextMap [ i ] = temp ;
+ + count ;
} while ( result - > NextRow ( ) ) ;
delete result ;
outstring_log ( " " ) ;
2008-10-25 11:40:10 -05:00
outstring_log ( " >> TSCR: Loaded %u additional Script Texts data. " , count ) ;
2008-10-11 14:16:25 -05:00
} else
{
barGoLink bar ( 1 ) ;
bar . step ( ) ;
outstring_log ( " " ) ;
2008-10-25 11:40:10 -05:00
outstring_log ( " >> Loaded 0 additional Script Texts data. DB table `script_texts` is empty. " ) ;
2008-10-11 14:16:25 -05:00
}
2009-02-04 10:33:18 -06:00
// Load Custom Text
2008-10-25 11:40:10 -05:00
outstring_log ( " TSCR: Loading Custom Texts... " ) ;
LoadTrinityStrings ( TScriptDB , " custom_texts " , TEXT_SOURCE_RANGE * 2 , 1 + ( TEXT_SOURCE_RANGE * 3 ) ) ;
2008-10-11 14:16:25 -05:00
2008-10-25 11:40:10 -05:00
// Gather Additional data from Custom Texts
2008-12-31 12:33:54 +01:00
result = TScriptDB . PQuery ( " SELECT entry, sound, type, language, emote FROM custom_texts " ) ;
2008-10-11 14:16:25 -05:00
2008-10-25 11:40:10 -05:00
outstring_log ( " TSCR: Loading Custom Texts additional data... " ) ;
if ( result )
2008-10-11 14:16:25 -05:00
{
barGoLink bar ( result - > GetRowCount ( ) ) ;
uint32 count = 0 ;
do
{
bar . step ( ) ;
2008-10-25 11:40:10 -05:00
Field * fields = result - > Fetch ( ) ;
StringTextData temp ;
2008-10-11 14:16:25 -05:00
2008-10-25 11:40:10 -05:00
int32 i = fields [ 0 ] . GetInt32 ( ) ;
temp . SoundId = fields [ 1 ] . GetInt32 ( ) ;
temp . Type = fields [ 2 ] . GetInt32 ( ) ;
temp . Language = fields [ 3 ] . GetInt32 ( ) ;
2009-02-09 08:16:34 -05:00
temp . Emote = fields [ 4 ] . GetInt32 ( ) ;
2008-10-11 14:16:25 -05:00
2008-10-25 11:40:10 -05:00
if ( i > = 0 )
{
error_db_log ( " TSCR: Entry %i in table `custom_texts` is not a negative value. " , i ) ;
continue ;
}
2008-10-11 14:16:25 -05:00
2008-10-25 11:40:10 -05:00
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 ;
}
2008-10-11 14:16:25 -05:00
2008-10-25 11:40:10 -05:00
if ( temp . SoundId )
{
if ( ! GetSoundEntriesStore ( ) - > LookupEntry ( temp . SoundId ) )
2009-08-15 00:32:04 +02:00
error_db_log ( " TSCR: Entry %i in table `custom_texts` has soundId %u but sound does not exist. " , i , temp . SoundId ) ;
2008-10-25 11:40:10 -05:00
}
2008-10-11 14:16:25 -05:00
2008-10-25 11:40:10 -05:00
if ( ! GetLanguageDescByID ( temp . Language ) )
2009-08-15 00:32:04 +02:00
error_db_log ( " TSCR: Entry %i in table `custom_texts` using Language %u but Language does not exist. " , i , temp . Language ) ;
2008-10-11 14:16:25 -05:00
2009-04-19 21:16:11 +02:00
if ( temp . Type > CHAT_TYPE_ZONE_YELL )
2009-08-15 00:32:04 +02:00
error_db_log ( " TSCR: Entry %i in table `custom_texts` has Type %u but this Chat Type does not exist. " , i , temp . Type ) ;
2008-10-11 14:16:25 -05:00
2008-10-25 11:40:10 -05:00
TextMap [ i ] = temp ;
+ + count ;
} while ( result - > NextRow ( ) ) ;
2008-10-11 14:16:25 -05:00
delete result ;
outstring_log ( " " ) ;
2008-10-25 11:40:10 -05:00
outstring_log ( " >> Loaded %u additional Custom Texts data. " , count ) ;
2008-10-11 14:16:25 -05:00
} else
{
barGoLink bar ( 1 ) ;
bar . step ( ) ;
outstring_log ( " " ) ;
2008-10-25 11:40:10 -05:00
outstring_log ( " >> Loaded 0 additional Custom Texts data. DB table `custom_texts` is empty. " ) ;
2008-10-11 14:16:25 -05:00
}
2009-03-23 15:22:24 -06:00
2009-03-22 23:11:55 +01:00
// Drop Existing Waypoint list
2009-04-09 23:07:32 +02:00
PointMovementMap . clear ( ) ;
2009-03-22 23:11:55 +01:00
uint64 uiCreatureCount = 0 ;
// Load Waypoints
result = TScriptDB . PQuery ( " SELECT COUNT(entry) FROM script_waypoint GROUP BY entry " ) ;
if ( result )
{
uiCreatureCount = result - > GetRowCount ( ) ;
delete result ;
}
2009-04-24 00:51:09 -04:00
outstring_log ( " TSCR: Loading Script Waypoints for %u creature(s)... " , uiCreatureCount ) ;
2009-03-22 23:11:55 +01:00
result = TScriptDB . PQuery ( " SELECT entry, pointid, location_x, location_y, location_z, waittime FROM script_waypoint ORDER BY pointid " ) ;
if ( result )
{
barGoLink bar ( result - > GetRowCount ( ) ) ;
uint32 uiNodeCount = 0 ;
do
{
bar . step ( ) ;
Field * pFields = result - > Fetch ( ) ;
PointMovement pTemp ;
pTemp . m_uiCreatureEntry = pFields [ 0 ] . GetUInt32 ( ) ;
2009-04-09 23:07:32 +02:00
uint32 uiCreatureEntry = pTemp . m_uiCreatureEntry ;
2009-03-22 23:11:55 +01:00
pTemp . m_uiPointId = pFields [ 1 ] . GetUInt32 ( ) ;
pTemp . m_fX = pFields [ 2 ] . GetFloat ( ) ;
pTemp . m_fY = pFields [ 3 ] . GetFloat ( ) ;
pTemp . m_fZ = pFields [ 4 ] . GetFloat ( ) ;
pTemp . m_uiWaitTime = pFields [ 5 ] . GetUInt32 ( ) ;
CreatureInfo const * pCInfo = GetCreatureTemplateStore ( pTemp . m_uiCreatureEntry ) ;
if ( ! pCInfo )
{
2009-04-24 00:51:09 -04:00
error_db_log ( " TSCR: DB table script_waypoint has waypoint for non-existant creature entry %u " , pTemp . m_uiCreatureEntry ) ;
2009-03-22 23:11:55 +01:00
continue ;
}
if ( ! pCInfo - > ScriptID )
2009-04-24 00:51:09 -04:00
error_db_log ( " TSCR: DB table script_waypoint has waypoint for creature entry %u, but creature does not have ScriptName defined and then useless. " , pTemp . m_uiCreatureEntry ) ;
2009-03-22 23:11:55 +01:00
2009-04-09 23:07:32 +02:00
PointMovementMap [ uiCreatureEntry ] . push_back ( pTemp ) ;
2009-03-22 23:11:55 +01:00
+ + uiNodeCount ;
} while ( result - > NextRow ( ) ) ;
delete result ;
outstring_log ( " " ) ;
outstring_log ( " >> Loaded %u Script Waypoint nodes. " , uiNodeCount ) ;
}
else
{
barGoLink bar ( 1 ) ;
bar . step ( ) ;
outstring_log ( " " ) ;
outstring_log ( " >> Loaded 0 Script Waypoints. DB table `script_waypoint` is empty. " ) ;
}
2008-10-11 14:16:25 -05:00
//Free database thread and resources
TScriptDB . HaltDelayThread ( ) ;
}
struct TSpellSummary {
uint8 Targets ; // set of enum SelectTarget
2009-02-04 10:33:18 -06:00
uint8 Effects ; // set of enum SelectEffect
2008-10-11 14:16:25 -05:00
} extern * SpellSummary ;
2008-10-14 11:57:03 -05:00
TRINITY_DLL_EXPORT
2008-10-11 14:16:25 -05:00
void ScriptsFree ( )
2008-11-20 16:16:57 -06:00
{
2008-10-11 14:16:25 -05:00
// Free Spell Summary
delete [ ] SpellSummary ;
// Free resources before library unload
2009-08-13 22:27:55 +02:00
for ( uint16 i = 0 ; i < MAX_SCRIPTS ; + + i )
2008-10-11 14:16:25 -05:00
delete m_scripts [ i ] ;
2008-11-20 16:16:57 -06:00
num_sc_scripts = 0 ;
2008-10-11 14:16:25 -05:00
}
2008-10-14 11:57:03 -05:00
TRINITY_DLL_EXPORT
2009-04-25 13:35:46 -04:00
void ScriptsInit ( char const * cfg_file = " trinitycore.conf " )
2008-10-11 14:16:25 -05:00
{
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
2009-04-25 13:35:46 -04:00
if ( ! TScriptConfig . SetSource ( cfg_file ) )
2008-10-11 14:16:25 -05:00
{
CanLoadDB = false ;
error_log ( " TSCR: Unable to open configuration file. Database will be unaccessible. Configuration values will use default. " ) ;
}
2009-04-25 13:35:46 -04:00
else outstring_log ( " TSCR: Using configuration file %s " , cfg_file ) ;
2008-10-11 14:16:25 -05:00
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 ( " " ) ;
2009-08-13 22:27:55 +02:00
for ( uint16 i = 0 ; i < MAX_SCRIPTS ; + + i )
2008-10-11 14:16:25 -05:00
m_scripts [ i ] = NULL ;
FillSpellSummary ( ) ;
2009-08-16 01:45:49 +02:00
AddScripts ( ) ;
2008-10-11 14:16:25 -05:00
2009-02-09 08:16:34 -05:00
outstring_log ( " >> Loaded %i C++ Scripts. " , num_sc_scripts ) ;
2009-02-05 15:38:24 -06:00
outstring_log ( " >> Load Overriden SQL Data. " ) ;
LoadOverridenSQLData ( ) ;
outstring_log ( " >> Load Overriden DBC Data. " ) ;
LoadOverridenDBCData ( ) ;
2008-10-11 14:16:25 -05:00
}
//*********************************
2008-10-25 11:40:10 -05:00
//*** Functions used globally ***
2008-10-11 14:16:25 -05:00
void DoScriptText ( int32 textEntry , WorldObject * pSource , Unit * target )
{
if ( ! pSource )
{
error_log ( " TSCR: DoScriptText entry %i, invalid Source pointer. " , textEntry ) ;
return ;
}
if ( textEntry > = 0 )
{
2008-10-25 11:40:10 -05:00
error_log ( " TSCR: DoScriptText with source entry %u (TypeId=%u, guid=%u) attempts to process text entry %i, but text entry must be negative. " , pSource - > GetEntry ( ) , pSource - > GetTypeId ( ) , pSource - > GetGUIDLow ( ) , textEntry ) ;
2008-10-11 14:16:25 -05:00
return ;
}
2008-11-10 06:53:00 -06:00
UNORDERED_MAP < int32 , StringTextData > : : iterator i = TextMap . find ( textEntry ) ;
2008-10-11 14:16:25 -05:00
if ( i = = TextMap . end ( ) )
{
2008-10-25 11:40:10 -05:00
error_log ( " TSCR: DoScriptText with source entry %u (TypeId=%u, guid=%u) could not find text entry %i. " , pSource - > GetEntry ( ) , pSource - > GetTypeId ( ) , pSource - > GetGUIDLow ( ) , textEntry ) ;
2008-10-11 14:16:25 -05:00
return ;
}
2008-12-31 12:33:54 +01:00
debug_log ( " TSCR: DoScriptText: text entry=%i, Sound=%u, Type=%u, Language=%u, Emote=%u " , textEntry , ( * i ) . second . SoundId , ( * i ) . second . Type , ( * i ) . second . Language , ( * i ) . second . Emote ) ;
2008-10-25 11:40:10 -05:00
2008-10-11 14:16:25 -05:00
if ( ( * i ) . second . SoundId )
{
2009-08-15 00:32:04 +02:00
if ( GetSoundEntriesStore ( ) - > LookupEntry ( ( * i ) . second . SoundId ) )
2008-10-11 14:16:25 -05:00
{
pSource - > SendPlaySound ( ( * i ) . second . SoundId , false ) ;
}
else
error_log ( " TSCR: DoScriptText entry %i tried to process invalid sound id %u. " , textEntry , ( * i ) . second . SoundId ) ;
}
2009-02-09 08:16:34 -05:00
if ( ( * i ) . second . Emote )
{
if ( pSource - > GetTypeId ( ) = = TYPEID_UNIT | | pSource - > GetTypeId ( ) = = TYPEID_PLAYER )
{
( ( Unit * ) pSource ) - > HandleEmoteCommand ( ( * i ) . second . Emote ) ;
}
else
2009-08-15 00:32:04 +02:00
error_log ( " TSCR: DoScriptText entry %i tried to process emote for invalid TypeId (%u). " , textEntry , pSource - > GetTypeId ( ) ) ;
2009-02-09 08:16:34 -05:00
}
2008-12-31 12:33:54 +01:00
2008-10-11 14:16:25 -05:00
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 ;
2009-04-03 16:54:20 -06:00
case CHAT_TYPE_ZONE_YELL :
pSource - > MonsterYellToZone ( textEntry , ( * i ) . second . Language , target ? target - > GetGUID ( ) : 0 ) ;
break ;
2008-10-11 14:16:25 -05:00
}
}
2008-10-25 11:40:10 -05:00
//*********************************
//*** Functions used internally ***
2008-11-20 16:16:57 -06:00
void Script : : RegisterSelf ( )
2008-11-03 08:14:21 -06:00
{
2008-11-20 16:16:57 -06:00
int id = GetScriptId ( Name . c_str ( ) ) ;
2009-04-19 10:17:38 -05:00
if ( id )
2008-10-11 14:16:25 -05:00
{
2008-11-20 16:16:57 -06:00
m_scripts [ id ] = this ;
+ + num_sc_scripts ;
2009-02-20 14:14:16 +01:00
}
2009-05-12 11:16:26 -05:00
else if ( Name . find ( " example " ) = = std : : string : : npos )
2009-02-20 14:14:16 +01:00
{
2009-04-19 10:17:38 -05:00
error_db_log ( " CRASH ALERT! TrinityScript: RegisterSelf, but script named %s does not have ScriptName assigned in database. " , ( this ) - > Name . c_str ( ) ) ;
2009-02-20 14:14:16 +01:00
delete this ;
}
2008-10-11 14:16:25 -05:00
}
//********************************
//*** Functions to be Exported ***
2008-11-20 16:16:57 -06:00
TRINITY_DLL_EXPORT
char const * ScriptsVersion ( )
{
2009-02-09 08:16:34 -05:00
return " Default Trinity scripting library " ;
2008-11-20 16:16:57 -06:00
}
2008-10-14 11:57:03 -05:00
TRINITY_DLL_EXPORT
2009-08-15 00:32:04 +02:00
bool GossipHello ( Player * pPlayer , Creature * pCreature )
2008-10-11 14:16:25 -05:00
{
2009-08-15 00:32:04 +02:00
Script * tmpscript = m_scripts [ pCreature - > GetScriptId ( ) ] ;
2008-10-25 11:40:10 -05:00
if ( ! tmpscript | | ! tmpscript - > pGossipHello ) return false ;
2008-10-11 14:16:25 -05:00
2009-08-15 00:32:04 +02:00
pPlayer - > PlayerTalkClass - > ClearMenus ( ) ;
return tmpscript - > pGossipHello ( pPlayer , pCreature ) ;
2008-10-11 14:16:25 -05:00
}
2008-10-14 11:57:03 -05:00
TRINITY_DLL_EXPORT
2009-08-15 00:32:04 +02:00
bool GossipSelect ( Player * pPlayer , Creature * pCreature , uint32 uiSender , uint32 uiAction )
2008-10-11 14:16:25 -05:00
{
2009-08-15 00:32:04 +02:00
debug_log ( " TSCR: Gossip selection, sender: %d, action: %d " , uiSender , uiAction ) ;
2008-10-11 14:16:25 -05:00
2009-08-15 00:32:04 +02:00
Script * tmpscript = m_scripts [ pCreature - > GetScriptId ( ) ] ;
2008-10-25 11:40:10 -05:00
if ( ! tmpscript | | ! tmpscript - > pGossipSelect ) return false ;
2008-10-11 14:16:25 -05:00
2009-08-15 00:32:04 +02:00
pPlayer - > PlayerTalkClass - > ClearMenus ( ) ;
return tmpscript - > pGossipSelect ( pPlayer , pCreature , uiSender , uiAction ) ;
2008-10-11 14:16:25 -05:00
}
2008-10-14 11:57:03 -05:00
TRINITY_DLL_EXPORT
2009-08-15 00:32:04 +02:00
bool GossipSelectWithCode ( Player * pPlayer , Creature * pCreature , uint32 uiSender , uint32 uiAction , const char * sCode )
2008-10-11 14:16:25 -05:00
{
2009-08-15 00:32:04 +02:00
debug_log ( " TSCR: Gossip selection with code, sender: %d, action: %d " , uiSender , uiAction ) ;
2008-10-11 14:16:25 -05:00
2009-08-15 00:32:04 +02:00
Script * tmpscript = m_scripts [ pCreature - > GetScriptId ( ) ] ;
2008-10-25 11:40:10 -05:00
if ( ! tmpscript | | ! tmpscript - > pGossipSelectWithCode ) return false ;
2008-10-11 14:16:25 -05:00
2009-08-15 00:32:04 +02:00
pPlayer - > PlayerTalkClass - > ClearMenus ( ) ;
return tmpscript - > pGossipSelectWithCode ( pPlayer , pCreature , uiSender , uiAction , sCode ) ;
2008-10-11 14:16:25 -05:00
}
2009-03-30 16:57:17 +02:00
TRINITY_DLL_EXPORT
2009-08-15 00:32:04 +02:00
bool GOSelect ( Player * pPlayer , GameObject * pGO , uint32 uiSender , uint32 uiAction )
2009-03-30 16:57:17 +02:00
{
2009-08-15 00:32:04 +02:00
if ( ! pGO )
2009-04-19 18:48:20 +02:00
return false ;
2009-08-15 00:32:04 +02:00
debug_log ( " TSCR: Gossip selection, sender: %d, action: %d " , uiSender , uiAction ) ;
2009-03-30 16:57:17 +02:00
2009-08-15 00:32:04 +02:00
Script * tmpscript = m_scripts [ pGO - > GetGOInfo ( ) - > ScriptId ] ;
2009-03-30 16:57:17 +02:00
if ( ! tmpscript | | ! tmpscript - > pGOSelect ) return false ;
2009-08-15 00:32:04 +02:00
pPlayer - > PlayerTalkClass - > ClearMenus ( ) ;
return tmpscript - > pGOSelect ( pPlayer , pGO , uiSender , uiAction ) ;
2009-03-30 16:57:17 +02:00
}
TRINITY_DLL_EXPORT
2009-08-15 00:32:04 +02:00
bool GOSelectWithCode ( Player * pPlayer , GameObject * pGO , uint32 uiSender , uint32 uiAction , const char * sCode )
2009-03-30 16:57:17 +02:00
{
2009-08-15 00:32:04 +02:00
if ( ! pGO )
2009-04-19 18:48:20 +02:00
return false ;
2009-08-15 00:32:04 +02:00
debug_log ( " TSCR: Gossip selection, sender: %d, action: %d " , uiSender , uiAction ) ;
2009-03-30 16:57:17 +02:00
2009-08-15 00:32:04 +02:00
Script * tmpscript = m_scripts [ pGO - > GetGOInfo ( ) - > ScriptId ] ;
2009-03-30 16:57:17 +02:00
if ( ! tmpscript | | ! tmpscript - > pGOSelectWithCode ) return false ;
2009-08-15 00:32:04 +02:00
pPlayer - > PlayerTalkClass - > ClearMenus ( ) ;
return tmpscript - > pGOSelectWithCode ( pPlayer , pGO , uiSender , uiAction , sCode ) ;
2009-03-30 16:57:17 +02:00
}
2008-10-14 11:57:03 -05:00
TRINITY_DLL_EXPORT
2009-08-15 00:32:04 +02:00
bool QuestAccept ( Player * pPlayer , Creature * pCreature , Quest const * pQuest )
2008-10-11 14:16:25 -05:00
{
2009-08-15 00:32:04 +02:00
Script * tmpscript = m_scripts [ pCreature - > GetScriptId ( ) ] ;
2008-10-25 11:40:10 -05:00
if ( ! tmpscript | | ! tmpscript - > pQuestAccept ) return false ;
2008-10-11 14:16:25 -05:00
2009-08-15 00:32:04 +02:00
pPlayer - > PlayerTalkClass - > ClearMenus ( ) ;
return tmpscript - > pQuestAccept ( pPlayer , pCreature , pQuest ) ;
2008-10-11 14:16:25 -05:00
}
2008-10-14 11:57:03 -05:00
TRINITY_DLL_EXPORT
2009-08-15 00:32:04 +02:00
bool QuestSelect ( Player * pPlayer , Creature * pCreature , Quest const * pQuest )
2008-10-11 14:16:25 -05:00
{
2009-08-15 00:32:04 +02:00
Script * tmpscript = m_scripts [ pCreature - > GetScriptId ( ) ] ;
2008-10-25 11:40:10 -05:00
if ( ! tmpscript | | ! tmpscript - > pQuestSelect ) return false ;
2008-10-11 14:16:25 -05:00
2009-08-15 00:32:04 +02:00
pPlayer - > PlayerTalkClass - > ClearMenus ( ) ;
return tmpscript - > pQuestSelect ( pPlayer , pCreature , pQuest ) ;
2008-10-11 14:16:25 -05:00
}
2008-10-14 11:57:03 -05:00
TRINITY_DLL_EXPORT
2009-08-15 00:32:04 +02:00
bool QuestComplete ( Player * pPlayer , Creature * pCreature , Quest const * pQuest )
2008-10-11 14:16:25 -05:00
{
2009-08-15 00:32:04 +02:00
Script * tmpscript = m_scripts [ pCreature - > GetScriptId ( ) ] ;
2008-10-25 11:40:10 -05:00
if ( ! tmpscript | | ! tmpscript - > pQuestComplete ) return false ;
2008-10-11 14:16:25 -05:00
2009-08-15 00:32:04 +02:00
pPlayer - > PlayerTalkClass - > ClearMenus ( ) ;
return tmpscript - > pQuestComplete ( pPlayer , pCreature , pQuest ) ;
2008-10-11 14:16:25 -05:00
}
2008-10-14 11:57:03 -05:00
TRINITY_DLL_EXPORT
2009-08-15 00:32:04 +02:00
bool ChooseReward ( Player * pPlayer , Creature * pCreature , Quest const * pQuest , uint32 opt )
2008-10-11 14:16:25 -05:00
{
2009-08-15 00:32:04 +02:00
Script * tmpscript = m_scripts [ pCreature - > GetScriptId ( ) ] ;
2008-10-25 11:40:10 -05:00
if ( ! tmpscript | | ! tmpscript - > pChooseReward ) return false ;
2008-10-11 14:16:25 -05:00
2009-08-15 00:32:04 +02:00
pPlayer - > PlayerTalkClass - > ClearMenus ( ) ;
return tmpscript - > pChooseReward ( pPlayer , pCreature , pQuest , opt ) ;
2008-10-11 14:16:25 -05:00
}
2008-10-14 11:57:03 -05:00
TRINITY_DLL_EXPORT
2009-08-15 00:32:04 +02:00
uint32 NPCDialogStatus ( Player * pPlayer , Creature * pCreature )
2008-10-11 14:16:25 -05:00
{
2009-08-15 00:32:04 +02:00
Script * tmpscript = m_scripts [ pCreature - > GetScriptId ( ) ] ;
2008-10-25 11:40:10 -05:00
if ( ! tmpscript | | ! tmpscript - > pNPCDialogStatus ) return 100 ;
2008-10-11 14:16:25 -05:00
2009-08-15 00:32:04 +02:00
pPlayer - > PlayerTalkClass - > ClearMenus ( ) ;
return tmpscript - > pNPCDialogStatus ( pPlayer , pCreature ) ;
2008-10-11 14:16:25 -05:00
}
2008-10-14 11:57:03 -05:00
TRINITY_DLL_EXPORT
2009-08-15 00:32:04 +02:00
uint32 GODialogStatus ( Player * pPlayer , GameObject * pGO )
2008-10-11 14:16:25 -05:00
{
2009-08-15 00:32:04 +02:00
Script * tmpscript = m_scripts [ pGO - > GetGOInfo ( ) - > ScriptId ] ;
2008-11-20 16:16:57 -06:00
if ( ! tmpscript | | ! tmpscript - > pGODialogStatus ) return 100 ;
2008-10-11 14:16:25 -05:00
2009-08-15 00:32:04 +02:00
pPlayer - > PlayerTalkClass - > ClearMenus ( ) ;
return tmpscript - > pGODialogStatus ( pPlayer , pGO ) ;
2008-10-11 14:16:25 -05:00
}
2008-10-14 11:57:03 -05:00
TRINITY_DLL_EXPORT
2009-08-15 00:32:04 +02:00
bool ItemHello ( Player * pPlayer , Item * pItem , Quest const * pQuest )
2008-10-11 14:16:25 -05:00
{
2009-08-15 00:32:04 +02:00
Script * tmpscript = m_scripts [ pItem - > GetProto ( ) - > ScriptId ] ;
2008-10-25 11:40:10 -05:00
if ( ! tmpscript | | ! tmpscript - > pItemHello ) return false ;
2008-10-11 14:16:25 -05:00
2009-08-15 00:32:04 +02:00
pPlayer - > PlayerTalkClass - > ClearMenus ( ) ;
return tmpscript - > pItemHello ( pPlayer , pItem , pQuest ) ;
2008-10-11 14:16:25 -05:00
}
2008-10-14 11:57:03 -05:00
TRINITY_DLL_EXPORT
2009-08-15 00:32:04 +02:00
bool ItemQuestAccept ( Player * pPlayer , Item * pItem , Quest const * pQuest )
2008-10-11 14:16:25 -05:00
{
2009-08-15 00:32:04 +02:00
Script * tmpscript = m_scripts [ pItem - > GetProto ( ) - > ScriptId ] ;
2008-10-25 11:40:10 -05:00
if ( ! tmpscript | | ! tmpscript - > pItemQuestAccept ) return false ;
2008-10-11 14:16:25 -05:00
2009-08-15 00:32:04 +02:00
pPlayer - > PlayerTalkClass - > ClearMenus ( ) ;
return tmpscript - > pItemQuestAccept ( pPlayer , pItem , pQuest ) ;
2008-10-11 14:16:25 -05:00
}
2008-10-14 11:57:03 -05:00
TRINITY_DLL_EXPORT
2009-08-15 00:32:04 +02:00
bool GOHello ( Player * pPlayer , GameObject * pGO )
2008-10-11 14:16:25 -05:00
{
2009-08-15 00:32:04 +02:00
Script * tmpscript = m_scripts [ pGO - > GetGOInfo ( ) - > ScriptId ] ;
2008-10-25 11:40:10 -05:00
if ( ! tmpscript | | ! tmpscript - > pGOHello ) return false ;
2008-10-11 14:16:25 -05:00
2009-08-15 00:32:04 +02:00
pPlayer - > PlayerTalkClass - > ClearMenus ( ) ;
return tmpscript - > pGOHello ( pPlayer , pGO ) ;
2008-10-11 14:16:25 -05:00
}
2008-10-14 11:57:03 -05:00
TRINITY_DLL_EXPORT
2009-08-15 00:32:04 +02:00
bool GOQuestAccept ( Player * pPlayer , GameObject * pGO , Quest const * pQuest )
2008-10-11 14:16:25 -05:00
{
2009-08-15 00:32:04 +02:00
Script * tmpscript = m_scripts [ pGO - > GetGOInfo ( ) - > ScriptId ] ;
2008-10-25 11:40:10 -05:00
if ( ! tmpscript | | ! tmpscript - > pGOQuestAccept ) return false ;
2008-10-11 14:16:25 -05:00
2009-08-15 00:32:04 +02:00
pPlayer - > PlayerTalkClass - > ClearMenus ( ) ;
return tmpscript - > pGOQuestAccept ( pPlayer , pGO , pQuest ) ;
2008-10-11 14:16:25 -05:00
}
2008-10-14 11:57:03 -05:00
TRINITY_DLL_EXPORT
2009-08-15 00:32:04 +02:00
bool GOChooseReward ( Player * pPlayer , GameObject * pGO , Quest const * pQuest , uint32 opt )
2008-10-11 14:16:25 -05:00
{
2009-08-15 00:32:04 +02:00
Script * tmpscript = m_scripts [ pGO - > GetGOInfo ( ) - > ScriptId ] ;
2008-10-25 11:40:10 -05:00
if ( ! tmpscript | | ! tmpscript - > pGOChooseReward ) return false ;
2008-10-11 14:16:25 -05:00
2009-08-15 00:32:04 +02:00
pPlayer - > PlayerTalkClass - > ClearMenus ( ) ;
return tmpscript - > pGOChooseReward ( pPlayer , pGO , pQuest , opt ) ;
2008-10-11 14:16:25 -05:00
}
2008-10-14 11:57:03 -05:00
TRINITY_DLL_EXPORT
2009-08-15 00:32:04 +02:00
bool AreaTrigger ( Player * pPlayer , AreaTriggerEntry * atEntry )
2008-10-11 14:16:25 -05:00
{
2008-11-20 16:16:57 -06:00
Script * tmpscript = m_scripts [ GetAreaTriggerScriptId ( atEntry - > id ) ] ;
2008-10-25 11:40:10 -05:00
if ( ! tmpscript | | ! tmpscript - > pAreaTrigger ) return false ;
2008-10-11 14:16:25 -05:00
2009-08-15 00:32:04 +02:00
return tmpscript - > pAreaTrigger ( pPlayer , atEntry ) ;
2008-10-11 14:16:25 -05:00
}
2008-10-14 11:57:03 -05:00
TRINITY_DLL_EXPORT
2009-08-15 00:32:04 +02:00
CreatureAI * GetAI ( Creature * pCreature )
2008-10-11 14:16:25 -05:00
{
2009-08-15 00:32:04 +02:00
Script * tmpscript = m_scripts [ pCreature - > GetScriptId ( ) ] ;
2008-10-25 11:40:10 -05:00
if ( ! tmpscript | | ! tmpscript - > GetAI ) return NULL ;
2008-11-20 16:16:57 -06:00
2009-08-15 00:32:04 +02:00
return tmpscript - > GetAI ( pCreature ) ;
2008-10-11 14:16:25 -05:00
}
2008-10-14 11:57:03 -05:00
TRINITY_DLL_EXPORT
2009-08-15 00:32:04 +02:00
bool ItemUse ( Player * pPlayer , Item * pItem , SpellCastTargets const & targets )
2008-10-11 14:16:25 -05:00
{
2009-08-15 00:32:04 +02:00
Script * tmpscript = m_scripts [ pItem - > GetProto ( ) - > ScriptId ] ;
2008-10-25 11:40:10 -05:00
if ( ! tmpscript | | ! tmpscript - > pItemUse ) return false ;
2008-10-11 14:16:25 -05:00
2009-08-15 00:32:04 +02:00
return tmpscript - > pItemUse ( pPlayer , pItem , targets ) ;
2008-10-11 14:16:25 -05:00
}
2009-08-04 01:44:14 +02:00
TRINITY_DLL_EXPORT
2009-08-15 00:32:04 +02:00
bool ItemExpire ( Player * pPlayer , ItemPrototype const * pItemProto )
2009-08-04 01:44:14 +02:00
{
2009-08-15 00:32:04 +02:00
Script * tmpscript = m_scripts [ pItemProto - > ScriptId ] ;
2009-08-04 01:44:14 +02:00
if ( ! tmpscript | | ! tmpscript - > pItemExpire ) return true ;
2009-08-15 00:32:04 +02:00
return tmpscript - > pItemExpire ( pPlayer , pItemProto ) ;
2009-08-04 01:44:14 +02:00
}
2008-10-14 11:57:03 -05:00
TRINITY_DLL_EXPORT
2009-08-15 00:32:04 +02:00
bool EffectDummyCreature ( Unit * caster , uint32 spellId , uint32 effIndex , Creature * crTarget )
2008-10-11 14:16:25 -05:00
{
2009-04-03 16:54:20 -06:00
Script * tmpscript = m_scripts [ crTarget - > GetScriptId ( ) ] ;
2008-10-11 14:16:25 -05:00
2009-04-03 16:54:20 -06:00
if ( ! tmpscript | | ! tmpscript - > pEffectDummyCreature ) return false ;
2008-10-11 14:16:25 -05:00
2009-08-15 00:32:04 +02:00
return tmpscript - > pEffectDummyCreature ( caster , spellId , effIndex , crTarget ) ;
2008-10-11 14:16:25 -05:00
}
2009-02-17 20:07:49 -06:00
2009-03-13 20:34:36 -06:00
TRINITY_DLL_EXPORT
2009-08-15 00:32:04 +02:00
bool EffectDummyGameObj ( Unit * caster , uint32 spellId , uint32 effIndex , GameObject * gameObjTarget )
2009-03-13 20:34:36 -06:00
{
Script * tmpscript = m_scripts [ gameObjTarget - > GetGOInfo ( ) - > ScriptId ] ;
if ( ! tmpscript | | ! tmpscript - > pEffectDummyGameObj ) return false ;
2009-08-15 00:32:04 +02:00
return tmpscript - > pEffectDummyGameObj ( caster , spellId , effIndex , gameObjTarget ) ;
2009-03-13 20:34:36 -06:00
}
2009-04-03 16:54:20 -06:00
2009-03-13 20:34:36 -06:00
TRINITY_DLL_EXPORT
2009-08-15 00:32:04 +02:00
bool EffectDummyItem ( Unit * caster , uint32 spellId , uint32 effIndex , Item * itemTarget )
2009-03-13 20:34:36 -06:00
{
2009-04-03 16:54:20 -06:00
Script * tmpscript = m_scripts [ itemTarget - > GetProto ( ) - > ScriptId ] ;
2009-03-13 20:34:36 -06:00
2009-04-03 16:54:20 -06:00
if ( ! tmpscript | | ! tmpscript - > pEffectDummyItem ) return false ;
2009-03-13 20:34:36 -06:00
2009-08-15 00:32:04 +02:00
return tmpscript - > pEffectDummyItem ( caster , spellId , effIndex , itemTarget ) ;
2009-03-13 20:34:36 -06:00
}
TRINITY_DLL_EXPORT
2009-04-03 16:54:20 -06:00
InstanceData * CreateInstanceData ( Map * map )
2009-03-13 20:34:36 -06:00
{
2009-04-03 16:54:20 -06:00
if ( ! map - > IsDungeon ( ) ) return NULL ;
2009-03-13 20:34:36 -06:00
2009-04-03 16:54:20 -06:00
Script * tmpscript = m_scripts [ ( ( InstanceMap * ) map ) - > GetScriptId ( ) ] ;
if ( ! tmpscript | | ! tmpscript - > GetInstanceData ) return NULL ;
2009-03-13 20:34:36 -06:00
2009-04-03 16:54:20 -06:00
return tmpscript - > GetInstanceData ( map ) ;
2009-03-13 20:34:36 -06:00
}
2009-04-03 16:54:20 -06:00