2013-05-09 10:44:08 -04:00
/* EQEMu: Everquest Server Emulator
Copyright ( C ) 2001 - 2003 EQEMu Development Team ( http : //eqemulator.net)
2013-02-16 16:14:39 -08:00
2013-05-09 10:44:08 -04:00
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; version 2 of the License .
2013-02-16 16:14:39 -08:00
2013-05-09 10:44:08 -04:00
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY except by those people which sell it , which
2013-02-16 16:14:39 -08:00
are required to give you total support for your newly bought product ;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
2013-05-09 10:44:08 -04:00
A PARTICULAR PURPOSE . See the GNU General Public License for more details .
2013-02-16 16:14:39 -08:00
2013-05-09 10:44:08 -04:00
You should have received a copy of the GNU General Public License
along with this program ; if not , write to the Free Software
Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
2013-02-16 16:14:39 -08:00
*/
# include "../common/debug.h"
# include "../common/rulesys.h"
# include <iostream>
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <errmsg.h>
# include <mysqld_error.h>
# include <limits.h>
# include <ctype.h>
# include <assert.h>
# include <map>
// Disgrace: for windows compile
# ifdef _WINDOWS
# include <windows.h>
# define snprintf _snprintf
# define strncasecmp _strnicmp
# define strcasecmp _stricmp
# else
# include "unix.h"
# include <netinet/in.h>
# include <sys/time.h>
# endif
# include "database.h"
# include "eq_packet_structs.h"
# include "guilds.h"
2013-05-11 00:05:11 -07:00
//#include "MiscFunctions.h"
# include "StringUtil.h"
2013-02-16 16:14:39 -08:00
# include "extprofile.h"
extern Client client ;
/*
This is the amount of time in seconds the client has to enter the zone
server after the world server , or inbetween zones when that is finished
*/
/*
Establish a connection to a mysql database with the supplied parameters
2013-05-09 10:44:08 -04:00
Added a very simple . ini file parser - Bounce
2013-02-16 16:14:39 -08:00
Modify to use for win32 & linux - misanthropicfiend
*/
Database : : Database ( )
{
DBInitVars ( ) ;
}
/*
Establish a connection to a mysql database with the supplied parameters
*/
Database : : Database ( const char * host , const char * user , const char * passwd , const char * database , uint32 port )
{
DBInitVars ( ) ;
Connect ( host , user , passwd , database , port ) ;
}
bool Database : : Connect ( const char * host , const char * user , const char * passwd , const char * database , uint32 port )
{
uint32 errnum = 0 ;
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
if ( ! Open ( host , user , passwd , database , port , & errnum , errbuf ) )
{
LogFile - > write ( EQEMuLog : : Error , " Failed to connect to database: Error: %s " , errbuf ) ;
HandleMysqlError ( errnum ) ;
return false ;
}
else
{
LogFile - > write ( EQEMuLog : : Status , " Using database '%s' at %s:%d " , database , host , port ) ;
return true ;
}
}
void Database : : DBInitVars ( ) {
varcache_array = 0 ;
varcache_max = 0 ;
varcache_lastupdate = 0 ;
}
void Database : : HandleMysqlError ( uint32 errnum ) {
/* switch(errnum) {
case 0 :
break ;
case 1045 : // Access Denied
case 2001 : {
AddEQEMuError ( EQEMuError_Mysql_1405 , true ) ;
break ;
}
case 2003 : { // Unable to connect
AddEQEMuError ( EQEMuError_Mysql_2003 , true ) ;
break ;
}
case 2005 : { // Unable to connect
AddEQEMuError ( EQEMuError_Mysql_2005 , true ) ;
break ;
}
case 2007 : { // Unable to connect
AddEQEMuError ( EQEMuError_Mysql_2007 , true ) ;
break ;
}
} */
}
/*
Close the connection to the database
*/
Database : : ~ Database ( )
{
unsigned int x ;
if ( varcache_array ) {
for ( x = 0 ; x < varcache_max ; x + + ) {
safe_delete_array ( varcache_array [ x ] ) ;
}
safe_delete_array ( varcache_array ) ;
}
}
/*
Check if there is an account with name " name " and password " password "
Return the account id or zero if no account matches .
Zero will also be returned if there is a database error .
*/
uint32 Database : : CheckLogin ( const char * name , const char * password , int16 * oStatus ) {
2014-07-03 15:15:42 -07:00
char * query = nullptr ;
2013-02-16 16:14:39 -08:00
if ( strlen ( name ) > = 50 | | strlen ( password ) > = 50 )
return ( 0 ) ;
char tmpUN [ 100 ] ;
char tmpPW [ 100 ] ;
2014-07-03 15:15:42 -07:00
2013-02-16 16:14:39 -08:00
DoEscapeString ( tmpUN , name , strlen ( name ) ) ;
DoEscapeString ( tmpPW , password , strlen ( password ) ) ;
2014-07-03 15:15:42 -07:00
auto results = QueryDatabase ( query , MakeAnyLenString ( & query ,
2013-02-16 16:14:39 -08:00
" SELECT id, status FROM account WHERE name='%s' AND password is not null "
" and length(password) > 0 and (password='%s' or password=MD5('%s')) " ,
2014-07-03 15:15:42 -07:00
tmpUN , tmpPW , tmpPW ) ) ;
2014-07-04 00:01:13 -07:00
2014-07-03 15:15:42 -07:00
if ( ! results . Success ( ) )
2013-02-16 16:14:39 -08:00
{
2014-07-03 15:34:42 -07:00
safe_delete_array ( query ) ;
2014-07-03 15:15:42 -07:00
std : : cerr < < " Error in CheckLogin query ' " < < query < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
return 0 ;
2013-02-16 16:14:39 -08:00
}
2014-07-03 15:34:42 -07:00
safe_delete_array ( query ) ;
2014-07-03 15:15:42 -07:00
auto row = results . begin ( ) ;
uint32 id = atoi ( row [ 0 ] ) ;
if ( oStatus )
* oStatus = atoi ( row [ 1 ] ) ;
return id ;
2013-02-16 16:14:39 -08:00
}
2014-07-03 15:24:09 -07:00
//Get Banned IP Address List - Only return false if the incoming connection's IP address is not present in the banned_ips table.
2013-02-16 16:14:39 -08:00
bool Database : : CheckBannedIPs ( const char * loginIP )
{
2014-07-03 15:19:50 -07:00
char * query = nullptr ;
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " SELECT ip_address FROM Banned_IPs WHERE ip_address='%s' " , loginIP ) ) ;
2014-07-04 00:01:13 -07:00
2014-07-03 15:19:50 -07:00
if ( ! results . Success ( ) )
2013-05-09 10:44:08 -04:00
{
2014-07-03 15:19:50 -07:00
std : : cerr < < " Error in CheckBannedIPs query ' " < < query < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
2014-07-03 15:34:42 -07:00
safe_delete_array ( query ) ;
2013-05-09 10:44:08 -04:00
return true ;
}
2014-07-03 15:19:50 -07:00
2014-07-03 15:34:42 -07:00
safe_delete_array ( query ) ;
2014-07-03 15:19:50 -07:00
if ( results . RowCount ( ) ! = 0 )
return true ;
return false ;
2013-02-16 16:14:39 -08:00
}
bool Database : : AddBannedIP ( char * bannedIP , const char * notes )
{
2014-07-03 15:24:09 -07:00
char * query = nullptr ;
2013-02-16 16:14:39 -08:00
2014-07-03 15:24:09 -07:00
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " INSERT into Banned_IPs SET ip_address='%s', notes='%s' " , bannedIP , notes ) ) ;
if ( ! results . Success ( ) )
{
std : : cerr < < " Error in ReserveName query ' " < < query < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
2014-07-03 15:34:42 -07:00
safe_delete_array ( query ) ;
2013-05-09 10:44:08 -04:00
return false ;
}
2014-07-03 15:34:42 -07:00
safe_delete_array ( query ) ;
2013-05-09 10:44:08 -04:00
return true ;
2013-02-16 16:14:39 -08:00
}
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
bool Database : : CheckGMIPs ( const char * ip_address , uint32 account_id ) {
2014-07-03 15:26:39 -07:00
char * query = nullptr ;
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " SELECT * FROM `gm_ips` WHERE `ip_address` = '%s' AND `account_id` = %i " , ip_address , account_id ) ) ;
2013-02-16 16:14:39 -08:00
2014-07-03 15:26:39 -07:00
safe_delete_array ( query ) ;
if ( ! results . Success ( ) )
2013-02-16 16:14:39 -08:00
return false ;
2014-07-03 15:26:39 -07:00
if ( results . RowCount ( ) = = 1 )
return true ;
2013-05-06 13:07:41 -04:00
2013-02-16 16:14:39 -08:00
return false ;
}
bool Database : : AddGMIP ( char * ip_address , char * name ) {
2014-07-03 15:31:37 -07:00
char * query = nullptr ;
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " INSERT into `gm_ips` SET `ip_address` = '%s', `name` = '%s' " , ip_address , name ) ) ;
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
2014-07-03 15:31:37 -07:00
return results . Success ( ) ;
2013-02-16 16:14:39 -08:00
}
void Database : : LoginIP ( uint32 AccountID , const char * LoginIP )
{
2014-07-03 15:34:42 -07:00
char * query = nullptr ;
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " INSERT INTO account_ip SET accid=%i, ip='%s' ON DUPLICATE KEY UPDATE count=count+1, lastused=now() " , AccountID , LoginIP ) ) ;
if ( ! results . Success ( ) )
std : : cerr < < " Error in Log IP query ' " < < query < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
2013-02-16 16:14:39 -08:00
2013-05-09 10:44:08 -04:00
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
}
int16 Database : : CheckStatus ( uint32 account_id )
{
2014-07-03 15:41:26 -07:00
char * query = nullptr ;
2013-02-16 16:14:39 -08:00
2014-07-03 15:41:26 -07:00
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " SELECT `status`, UNIX_TIMESTAMP(`suspendeduntil`) as `suspendeduntil`, UNIX_TIMESTAMP() as `current` "
" FROM `account` WHERE `id` = %i " , account_id ) ) ;
if ( ! results . Success ( ) )
2013-02-16 16:14:39 -08:00
{
2014-07-03 15:41:26 -07:00
std : : cerr < < " Error in CheckStatus query ' " < < query < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
2014-07-03 15:41:26 -07:00
return 0 ;
}
2013-02-16 16:14:39 -08:00
2014-07-03 15:41:26 -07:00
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
2014-07-03 15:41:26 -07:00
if ( results . RowCount ( ) = = 1 )
{
auto row = results . begin ( ) ;
2013-02-16 16:14:39 -08:00
2014-07-03 15:41:26 -07:00
int16 status = atoi ( row [ 0 ] ) ;
2013-02-16 16:14:39 -08:00
2014-07-03 15:41:26 -07:00
int32 suspendeduntil = 0 ;
2013-02-16 16:14:39 -08:00
2014-07-03 15:41:26 -07:00
// MariaDB initalizes with NULL if unix_timestamp() is out of range
if ( row [ 1 ] ! = nullptr ) {
suspendeduntil = atoi ( row [ 1 ] ) ;
}
2013-02-16 16:14:39 -08:00
2014-07-03 15:41:26 -07:00
int32 current = atoi ( row [ 2 ] ) ;
2013-02-16 16:14:39 -08:00
2014-07-03 15:41:26 -07:00
if ( suspendeduntil > current )
return - 1 ;
return status ;
2013-02-16 16:14:39 -08:00
}
return 0 ;
}
uint32 Database : : CreateAccount ( const char * name , const char * password , int16 status , uint32 lsaccount_id ) {
2014-07-03 15:57:32 -07:00
char * query = nullptr ;
uint32 queryLen ;
2013-02-16 16:14:39 -08:00
if ( password )
2014-07-03 15:57:32 -07:00
queryLen = MakeAnyLenString ( & query , " INSERT INTO account SET name='%s', password='%s', status=%i, lsaccount_id=%i, time_creation=UNIX_TIMESTAMP(); " , name , password , status , lsaccount_id ) ;
2013-02-16 16:14:39 -08:00
else
2014-07-03 15:57:32 -07:00
queryLen = MakeAnyLenString ( & query , " INSERT INTO account SET name='%s', status=%i, lsaccount_id=%i, time_creation=UNIX_TIMESTAMP(); " , name , status , lsaccount_id ) ;
2013-02-16 16:14:39 -08:00
2013-05-22 16:17:19 -04:00
std : : cerr < < " Account Attempting to be created: " < < name < < " " < < ( int16 ) status < < std : : endl ;
2014-07-03 15:57:32 -07:00
auto results = QueryDatabase ( query , queryLen ) ;
if ( ! results . Success ( ) )
{
std : : cerr < < " Error in CreateAccount query ' " < < query < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
return 0 ;
}
2014-07-04 00:01:13 -07:00
if ( results . LastInsertedID ( ) = = 0 )
2014-07-03 15:57:32 -07:00
{
std : : cerr < < " Error in CreateAccount query ' " < < query < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
return 0 ;
}
2014-07-03 15:57:32 -07:00
return results . LastInsertedID ( ) ;
2013-02-16 16:14:39 -08:00
}
bool Database : : DeleteAccount ( const char * name ) {
2014-07-03 16:03:05 -07:00
char * query = nullptr ;
2013-02-16 16:14:39 -08:00
2013-05-22 16:17:19 -04:00
std : : cerr < < " Account Attempting to be deleted: " < < name < < std : : endl ;
2013-02-16 16:14:39 -08:00
2014-07-03 16:03:05 -07:00
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " DELETE FROM account WHERE name='%s'; " , name ) ) ;
if ( ! results . Success ( ) )
{
std : : cerr < < " Error in DeleteAccount query ' " < < query < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
2014-07-03 16:03:05 -07:00
return false ;
2013-02-16 16:14:39 -08:00
}
2014-07-03 16:03:05 -07:00
safe_delete_array ( query ) ;
return results . RowsAffected ( ) = = 1 ;
2013-02-16 16:14:39 -08:00
}
bool Database : : SetLocalPassword ( uint32 accid , const char * password ) {
2014-07-03 16:04:50 -07:00
char * query = nullptr ;
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " UPDATE account SET password=MD5('%s') where id=%i; " , password , accid ) ) ;
2013-02-16 16:14:39 -08:00
2014-07-03 16:04:50 -07:00
if ( ! results . Success ( ) ) {
std : : cerr < < " Error in SetLocalPassword query ' " < < query < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
return false ;
}
safe_delete_array ( query ) ;
return true ;
}
bool Database : : SetAccountStatus ( const char * name , int16 status ) {
2014-07-03 16:08:28 -07:00
char * query = nullptr ;
2013-02-16 16:14:39 -08:00
2013-05-22 16:17:19 -04:00
std : : cout < < " Account being GM Flagged: " < < name < < " , Level: " < < ( int16 ) status < < std : : endl ;
2014-07-03 16:08:28 -07:00
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " UPDATE account SET status=%i WHERE name='%s'; " , status , name ) ) ;
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
2014-07-03 16:08:28 -07:00
if ( ! results . Success ( ) )
return false ;
if ( results . RowsAffected ( ) = = 0 )
{
2013-05-22 16:17:19 -04:00
std : : cout < < " Account: " < < name < < " does not exist, therefore it cannot be flagged \n " ;
2013-02-16 16:14:39 -08:00
return false ;
}
return true ;
}
bool Database : : ReserveName ( uint32 account_id , char * name )
{
2014-07-03 16:10:29 -07:00
char * query = nullptr ;
2013-02-16 16:14:39 -08:00
2014-07-03 16:10:29 -07:00
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " INSERT into character_ SET account_id=%i, name='%s', profile=NULL " , account_id , name ) ) ;
if ( ! results . Success ( ) )
{
std : : cerr < < " Error in ReserveName query ' " < < query < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
return false ;
}
2014-07-03 16:10:29 -07:00
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
return true ;
}
/*
Delete the character with the name " name "
returns false on failure , true otherwise
*/
bool Database : : DeleteCharacter ( char * name )
{
2014-07-03 16:43:24 -07:00
char * query = nullptr ;
int charid ;
2013-02-16 16:14:39 -08:00
if ( ! name | | ! strlen ( name ) )
{
2014-07-03 16:22:15 -07:00
std : : cerr < < " DeleteCharacter: request to delete without a name (empty char slot) " < < std : : endl ;
2013-02-16 16:14:39 -08:00
return false ;
}
// get id from character_ before deleting record so we can clean up inventory and qglobal
# if DEBUG >= 5
2014-07-03 16:22:15 -07:00
std : : cout < < " DeleteCharacter: Attempting to delete ' " < < name < < " ' " < < std : : endl ;
2013-02-16 16:14:39 -08:00
# endif
2014-07-03 16:43:24 -07:00
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " SELECT id from character_ WHERE name='%s' " , name ) ) ;
safe_delete_array ( query ) ;
if ( results . RowCount ( ) ! = 1 )
2013-02-16 16:14:39 -08:00
{
2014-07-03 16:43:24 -07:00
std : : cerr < < " DeleteCharacter error: got " < < results . RowCount ( ) < < " rows matching ' " < < name < < " ' " < < std : : endl ;
return false ;
2013-02-16 16:14:39 -08:00
}
2014-07-03 16:43:24 -07:00
auto row = results . begin ( ) ;
charid = atoi ( row [ 0 ] ) ;
2013-02-16 16:14:39 -08:00
# if DEBUG >= 5
2014-07-03 16:43:24 -07:00
std : : cout < < " DeleteCharacter: found ' " < < name < < " ' with char id: " < < charid < < std : : endl ;
2014-07-03 16:22:15 -07:00
std : : cout < < " DeleteCharacter: deleting << ' " < < name < < " ' (id " < < charid < < " ): " < < std : : endl ;
std : : cout < < " quest_globals " ;
2013-02-16 16:14:39 -08:00
# endif
2014-07-03 16:43:24 -07:00
QueryDatabase ( query , MakeAnyLenString ( & query , " DELETE from quest_globals WHERE charid='%d' " , charid ) ) ;
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
# if DEBUG >= 5
2014-07-03 16:22:15 -07:00
std : : cout < < " character_tasks " ;
2013-02-16 16:14:39 -08:00
# endif
2014-07-03 16:43:24 -07:00
QueryDatabase ( query , MakeAnyLenString ( & query , " DELETE from character_tasks WHERE charid='%d' " , charid ) ) ;
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
# if DEBUG >= 5
2014-07-03 16:22:15 -07:00
std : : cout < < " character_activities " ;
2013-02-16 16:14:39 -08:00
# endif
2014-07-03 16:43:24 -07:00
QueryDatabase ( query , MakeAnyLenString ( & query , " DELETE from character_activities WHERE charid='%d' " , charid ) ) ;
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
# if DEBUG >= 5
2014-07-03 16:22:15 -07:00
std : : cout < < " character_enabledtasks " ;
2013-02-16 16:14:39 -08:00
# endif
2014-07-03 16:43:24 -07:00
QueryDatabase ( query , MakeAnyLenString ( & query , " DELETE from character_enabledtasks WHERE charid='%d' " , charid ) ) ;
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
# if DEBUG >= 5
2014-07-03 16:22:15 -07:00
std : : cout < < " completed_tasks " ;
2013-02-16 16:14:39 -08:00
# endif
2014-07-03 16:43:24 -07:00
QueryDatabase ( query , MakeAnyLenString ( & query , " DELETE from completed_tasks WHERE charid='%d' " , charid ) ) ;
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
# if DEBUG >= 5
2014-07-03 16:22:15 -07:00
std : : cout < < " friends " ;
2013-02-16 16:14:39 -08:00
# endif
2014-07-03 16:43:24 -07:00
QueryDatabase ( query , MakeAnyLenString ( & query , " DELETE from friends WHERE charid='%d' " , charid ) ) ;
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
# if DEBUG >= 5
2014-07-03 16:22:15 -07:00
std : : cout < < " mail " ;
2013-02-16 16:14:39 -08:00
# endif
2014-07-03 16:43:24 -07:00
QueryDatabase ( query , MakeAnyLenString ( & query , " DELETE from mail WHERE charid='%d' " , charid ) ) ;
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
# if DEBUG >= 5
2014-07-03 16:22:15 -07:00
std : : cout < < " ptimers " ;
2013-02-16 16:14:39 -08:00
# endif
2014-07-03 16:43:24 -07:00
QueryDatabase ( query , MakeAnyLenString ( & query , " DELETE from timers WHERE char_id='%d' " , charid ) ) ;
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
# if DEBUG >= 5
2014-07-03 16:22:15 -07:00
std : : cout < < " inventory " ;
2013-02-16 16:14:39 -08:00
# endif
2014-07-03 16:43:24 -07:00
QueryDatabase ( query , MakeAnyLenString ( & query , " DELETE from inventory WHERE charid='%d' " , charid ) ) ;
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
# if DEBUG >= 5
2014-07-03 16:22:15 -07:00
std : : cout < < " guild_members " ;
2013-02-16 16:14:39 -08:00
# endif
2014-07-03 16:43:24 -07:00
2013-02-16 16:14:39 -08:00
# ifdef BOTS
2014-07-03 16:43:24 -07:00
QueryDatabase ( query , MakeAnyLenString ( & query , " DELETE FROM guild_members WHERE char_id='%d' AND GetMobTypeById(%i) = 'C' " , charid ) ) ;
2013-02-16 16:14:39 -08:00
# else
2014-07-03 16:43:24 -07:00
QueryDatabase ( query , MakeAnyLenString ( & query , " DELETE FROM guild_members WHERE char_id='%d' " , charid ) ) ;
2013-02-16 16:14:39 -08:00
# endif
2014-07-03 16:43:24 -07:00
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
# if DEBUG >= 5
2014-07-03 16:22:15 -07:00
std : : cout < < " recipes " ;
2013-02-16 16:14:39 -08:00
# endif
2014-07-03 16:43:24 -07:00
QueryDatabase ( query , MakeAnyLenString ( & query , " DELETE FROM char_recipe_list WHERE char_id='%d' " , charid ) ) ;
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
# if DEBUG >= 5
2014-07-03 16:22:15 -07:00
std : : cout < < " adventure_stats " ;
2013-02-16 16:14:39 -08:00
# endif
2014-07-03 16:43:24 -07:00
QueryDatabase ( query , MakeAnyLenString ( & query , " DELETE FROM adventure_stats WHERE player_id='%d' " , charid ) ) ;
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
# if DEBUG >= 5
2014-07-03 16:22:15 -07:00
std : : cout < < " zone_flags " ;
2013-02-16 16:14:39 -08:00
# endif
2014-07-03 16:43:24 -07:00
QueryDatabase ( query , MakeAnyLenString ( & query , " DELETE FROM zone_flags WHERE charID='%d' " , charid ) ) ;
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
# if DEBUG >= 5
2014-07-03 16:22:15 -07:00
std : : cout < < " titles " ;
2013-02-16 16:14:39 -08:00
# endif
2014-07-03 16:43:24 -07:00
QueryDatabase ( query , MakeAnyLenString ( & query , " DELETE FROM titles WHERE char_id='%d' " , charid ) ) ;
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
# if DEBUG >= 5
2014-07-03 16:22:15 -07:00
std : : cout < < " titlesets " ;
2013-02-16 16:14:39 -08:00
# endif
2014-07-03 16:43:24 -07:00
QueryDatabase ( query , MakeAnyLenString ( & query , " DELETE FROM player_titlesets WHERE char_id='%d' " , charid ) ) ;
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
# if DEBUG >= 5
2014-07-03 16:22:15 -07:00
std : : cout < < " keyring " ;
2013-02-16 16:14:39 -08:00
# endif
2014-07-03 16:43:24 -07:00
QueryDatabase ( query , MakeAnyLenString ( & query , " DELETE FROM keyring WHERE char_id='%d' " , charid ) ) ;
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
# if DEBUG >= 5
2014-07-03 16:22:15 -07:00
std : : cout < < " factions " ;
2013-02-16 16:14:39 -08:00
# endif
2014-07-03 16:43:24 -07:00
QueryDatabase ( query , MakeAnyLenString ( & query , " DELETE FROM faction_values WHERE char_id='%d' " , charid ) ) ;
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
# if DEBUG >= 5
2014-07-03 16:22:15 -07:00
std : : cout < < " instances " ;
2013-02-16 16:14:39 -08:00
# endif
2014-07-03 16:43:24 -07:00
QueryDatabase ( query , MakeAnyLenString ( & query , " DELETE FROM instance_list_player WHERE charid='%d' " , charid ) ) ;
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
# if DEBUG >= 5
2014-07-03 16:22:15 -07:00
std : : cout < < " _character " ;
2013-02-16 16:14:39 -08:00
# endif
2014-07-03 16:43:24 -07:00
results = QueryDatabase ( query , MakeAnyLenString ( & query , " DELETE from character_ WHERE id='%d' " , charid ) ) ;
safe_delete_array ( query ) ;
if ( results . RowsAffected ( ) ! = 1 ) // here we have to have a match or it's an error
2013-02-16 16:14:39 -08:00
{
2014-07-03 16:43:24 -07:00
LogFile - > write ( EQEMuLog : : Error , " DeleteCharacter: error: delete operation affected %d rows \n " , results . RowsAffected ( ) ) ;
2013-02-16 16:14:39 -08:00
return false ;
}
# if DEBUG >= 5
2014-07-03 16:22:15 -07:00
std : : cout < < " alternate currency " ;
2013-02-16 16:14:39 -08:00
# endif
2014-07-03 16:43:24 -07:00
QueryDatabase ( query , MakeAnyLenString ( & query , " DELETE FROM character_alt_currency WHERE char_id='%d' " , charid ) ) ;
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
# if DEBUG >= 5
2014-07-03 16:22:15 -07:00
std : : cout < < std : : endl ;
2013-02-16 16:14:39 -08:00
# endif
2014-07-03 16:22:15 -07:00
std : : cout < < " DeleteCharacter: successfully deleted ' " < < name < < " ' (id " < < charid < < " ) " < < std : : endl ;
2013-02-16 16:14:39 -08:00
return true ;
}
2014-07-05 10:47:34 -07:00
2013-02-16 16:14:39 -08:00
// Store new character information into the character_ and inventory tables
bool Database : : StoreCharacter ( uint32 account_id , PlayerProfile_Struct * pp , Inventory * inv , ExtendedProfile_Struct * ext )
{
char query [ 256 + sizeof ( PlayerProfile_Struct ) * 2 + sizeof ( ExtendedProfile_Struct ) * 2 + 5 ] ;
char * end = query ;
2014-07-05 10:47:34 -07:00
char * invquery = nullptr ;
2013-02-16 16:14:39 -08:00
uint32 charid = 0 ;
char zone [ 50 ] ;
float x , y , z ;
2014-07-05 10:47:34 -07:00
charid = GetCharacterID ( pp - > name ) ;
2013-02-16 16:14:39 -08:00
if ( ! charid )
{
LogFile - > write ( EQEMuLog : : Error , " StoreCharacter: no character id " ) ;
return false ;
}
const char * zname = GetZoneName ( pp - > zone_id ) ;
2013-05-04 18:06:58 -07:00
if ( zname = = nullptr ) {
2013-02-16 16:14:39 -08:00
//zone not in the DB, something to prevent crash...
strn0cpy ( zone , " qeynos " , 49 ) ;
pp - > zone_id = 1 ;
} else
strn0cpy ( zone , zname , 49 ) ;
2014-07-05 10:47:34 -07:00
2013-02-16 16:14:39 -08:00
x = pp - > x ;
y = pp - > y ;
z = pp - > z ;
// construct the character_ query
end + = sprintf ( end ,
" UPDATE character_ SET timelaston=0, "
" zonename= \' %s \' , x=%f, y=%f, z=%f, profile= \' " ,
zone , x , y , z
) ;
end + = DoEscapeString ( end , ( char * ) pp , sizeof ( PlayerProfile_Struct ) ) ;
end + = sprintf ( end , " \' , extprofile= \' " ) ;
end + = DoEscapeString ( end , ( char * ) ext , sizeof ( ExtendedProfile_Struct ) ) ;
end + = sprintf ( end , " \' WHERE account_id=%d AND name='%s' " , account_id , pp - > name ) ;
2014-07-05 10:47:34 -07:00
auto results = QueryDatabase ( query , ( uint32 ) ( end - query ) ) ;
// stack assigned query, no need to delete it.
2013-02-16 16:14:39 -08:00
2014-07-05 10:47:34 -07:00
if ( ! results . RowsAffected ( ) )
2013-02-16 16:14:39 -08:00
{
2014-07-05 10:47:34 -07:00
LogFile - > write ( EQEMuLog : : Error , " StoreCharacter query '%s' %s " , query , results . ErrorMessage ( ) . c_str ( ) ) ;
2013-02-16 16:14:39 -08:00
return false ;
}
// now the inventory
2014-07-05 10:47:34 -07:00
for ( int16 i = 0 ; i < = 2270 ; )
2013-02-16 16:14:39 -08:00
{
2014-07-05 10:47:34 -07:00
const ItemInst * newinv = inv - > GetItem ( i ) ;
if ( ! newinv )
2013-02-16 16:14:39 -08:00
{
2014-07-05 10:47:34 -07:00
auto results = QueryDatabase ( invquery , MakeAnyLenString ( & invquery ,
2013-02-16 16:14:39 -08:00
" INSERT INTO inventory SET "
" charid=%0u, slotid=%0d, itemid=%0u, charges=%0d, color=%0u " ,
charid , i , newinv - > GetItem ( ) - > ID ,
2014-07-05 10:47:34 -07:00
newinv - > GetCharges ( ) , newinv - > GetColor ( ) ) ) ;
2013-02-16 16:14:39 -08:00
2014-07-05 10:47:34 -07:00
if ( ! results . RowsAffected ( ) )
LogFile - > write ( EQEMuLog : : Error , " StoreCharacter inventory failed. Query '%s' %s " , invquery , results . ErrorMessage ( ) . c_str ( ) ) ;
2013-02-16 16:14:39 -08:00
# if EQDEBUG >= 9
else
2014-07-05 10:47:34 -07:00
LogFile - > write ( EQEMuLog : : Debug , " StoreCharacter inventory succeeded. Query '%s' " , invquery ) ;
2013-02-16 16:14:39 -08:00
# endif
2013-05-09 10:44:08 -04:00
safe_delete_array ( invquery ) ;
2013-02-16 16:14:39 -08:00
}
if ( i = = 30 ) { //end of standard inventory/cursor, jump to internals of bags/cursor
i = 251 ;
continue ;
} else if ( i = = 340 ) { //end of internals of bags/cursor, jump to bank slots
i = 2000 ;
continue ;
} else if ( i = = 2023 ) { //end of bank slots, jump to internals of bank bags
i = 2031 ;
continue ;
}
i + + ;
}
return true ;
}
//0=failure, otherwise returns the char ID for the given char name.
uint32 Database : : GetCharacterID ( const char * name ) {
uint32 cid = 0 ;
if ( GetAccountIDByChar ( name , & cid ) = = 0 )
return ( 0 ) ;
return ( cid ) ;
}
/*
This function returns the account_id that owns the character with
the name " name " or zero if no character with that name was found
Zero will also be returned if there is a database error .
*/
uint32 Database : : GetAccountIDByChar ( const char * charname , uint32 * oCharID ) {
2014-07-03 16:50:14 -07:00
char * query = nullptr ;
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " SELECT account_id, id FROM character_ WHERE name='%s' " , charname ) ) ;
2013-02-16 16:14:39 -08:00
2014-07-03 16:50:14 -07:00
if ( ! results . Success ( ) )
{
std : : cerr < < " Error in GetAccountIDByChar query ' " < < query < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
2014-07-03 16:50:14 -07:00
return 0 ;
2013-02-16 16:14:39 -08:00
}
2014-07-03 16:50:14 -07:00
safe_delete_array ( query ) ;
if ( results . RowCount ( ) = = 1 )
{
auto row = results . begin ( ) ;
uint32 accountId = atoi ( row [ 0 ] ) ;
if ( oCharID )
* oCharID = atoi ( row [ 1 ] ) ;
return accountId ;
2013-02-16 16:14:39 -08:00
}
return 0 ;
}
// Retrieve account_id for a given char_id
uint32 Database : : GetAccountIDByChar ( uint32 char_id ) {
2014-07-03 16:57:02 -07:00
char * query = nullptr ;
2013-02-16 16:14:39 -08:00
2014-07-03 16:57:02 -07:00
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " SELECT account_id FROM character_ WHERE id=%i " , char_id ) ) ;
if ( ! results . Success ( ) )
{
2014-07-04 00:01:13 -07:00
LogFile - > write ( EQEMuLog : : Error , " Error in GetAccountIDByChar query '%s': %s " , query , results . ErrorMessage ( ) . c_str ( ) ) ;
2014-07-03 16:57:02 -07:00
safe_delete_array ( query ) ;
return 0 ;
2013-02-16 16:14:39 -08:00
}
safe_delete_array ( query ) ;
2014-07-03 16:57:02 -07:00
if ( results . RowCount ( ) ! = 1 )
return 0 ;
auto row = results . begin ( ) ;
return atoi ( row [ 0 ] ) ;
2013-02-16 16:14:39 -08:00
}
uint32 Database : : GetAccountIDByName ( const char * accname , int16 * status , uint32 * lsid ) {
2014-07-03 17:07:35 -07:00
char * query = nullptr ;
2013-02-16 16:14:39 -08:00
2014-07-03 17:18:13 -07:00
if ( ! isAlphaNumeric ( accname ) )
return 0 ;
2013-02-16 16:14:39 -08:00
2014-07-03 17:07:35 -07:00
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " SELECT id, status, lsaccount_id FROM account WHERE name='%s' " , accname ) ) ;
2014-07-04 00:01:13 -07:00
2014-07-03 17:07:35 -07:00
if ( ! results . Success ( ) )
{
2014-07-03 17:18:13 -07:00
std : : cerr < < " Error in GetAccountIDByAcc query ' " < < query < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
2014-07-03 17:07:35 -07:00
return 0 ;
2013-02-16 16:14:39 -08:00
}
2014-07-03 17:07:35 -07:00
safe_delete_array ( query ) ;
if ( results . RowCount ( ) ! = 1 )
return 0 ;
auto row = results . begin ( ) ;
uint32 id = atoi ( row [ 0 ] ) ;
if ( status )
* status = atoi ( row [ 1 ] ) ;
2014-07-04 00:01:13 -07:00
if ( lsid )
2014-07-03 17:07:35 -07:00
{
if ( row [ 2 ] )
* lsid = atoi ( row [ 2 ] ) ;
else
* lsid = 0 ;
}
return id ;
2013-02-16 16:14:39 -08:00
}
void Database : : GetAccountName ( uint32 accountid , char * name , uint32 * oLSAccountID ) {
2014-07-03 17:34:25 -07:00
char * query = nullptr ;
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " SELECT name, lsaccount_id FROM account WHERE id='%i' " , accountid ) ) ;
2013-02-16 16:14:39 -08:00
2014-07-03 17:34:25 -07:00
if ( ! results . Success ( ) )
{
2014-07-03 17:42:35 -07:00
std : : cerr < < " Error in GetAccountName query ' " < < query < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
2014-07-03 17:34:25 -07:00
return ;
}
2013-02-16 16:14:39 -08:00
2014-07-03 17:34:25 -07:00
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
2014-07-03 17:34:25 -07:00
if ( results . RowCount ( ) ! = 1 )
return ;
auto row = results . begin ( ) ;
strcpy ( name , row [ 0 ] ) ;
if ( row [ 1 ] & & oLSAccountID ) {
* oLSAccountID = atoi ( row [ 1 ] ) ;
2013-02-16 16:14:39 -08:00
}
2014-07-03 17:34:25 -07:00
2013-02-16 16:14:39 -08:00
}
void Database : : GetCharName ( uint32 char_id , char * name ) {
2014-07-03 17:36:56 -07:00
char * query = nullptr ;
2013-02-16 16:14:39 -08:00
2014-07-03 17:36:56 -07:00
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " SELECT name FROM character_ WHERE id='%i' " , char_id ) ) ;
2013-02-16 16:14:39 -08:00
2014-07-03 17:36:56 -07:00
if ( ! results . Success ( ) )
{
2014-07-03 17:38:47 -07:00
std : : cerr < < " Error in GetCharName query ' " < < query < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
2014-07-03 17:36:56 -07:00
safe_delete_array ( query ) ;
return ;
2013-02-16 16:14:39 -08:00
}
2014-07-03 17:36:56 -07:00
safe_delete_array ( query ) ;
auto row = results . begin ( ) ;
strcpy ( name , row [ 0 ] ) ;
2013-02-16 16:14:39 -08:00
}
bool Database : : LoadVariables ( ) {
2014-07-03 17:42:35 -07:00
char * query = nullptr ;
2013-02-16 16:14:39 -08:00
2014-07-03 17:42:35 -07:00
auto results = QueryDatabase ( query , LoadVariables_MQ ( & query ) ) ;
if ( ! results . Success ( ) )
{
std : : cerr < < " Error in LoadVariables query ' " < < query < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
2014-07-03 17:42:35 -07:00
return false ;
2013-02-16 16:14:39 -08:00
}
2014-07-03 17:42:35 -07:00
safe_delete_array ( query ) ;
2014-07-04 00:01:13 -07:00
return LoadVariables_result ( std : : move ( results ) ) ;
2013-02-16 16:14:39 -08:00
}
2014-07-03 17:42:35 -07:00
uint32 Database : : LoadVariables_MQ ( char * * query )
{
2013-02-16 16:14:39 -08:00
return MakeAnyLenString ( query , " SELECT varname, value, unix_timestamp() FROM variables where unix_timestamp ( ts ) > = % d " , varcache_lastupdate) ;
}
2014-07-03 17:42:35 -07:00
// always returns true? not sure about this.
bool Database : : LoadVariables_result ( MySQLRequestResult results ) {
uint32 i = 0 ;
2013-02-16 16:14:39 -08:00
LockMutex lock ( & Mvarcache ) ;
2014-07-03 17:42:35 -07:00
if ( results . RowCount ( ) = = 0 )
return true ;
if ( ! varcache_array ) {
varcache_max = results . RowCount ( ) ;
varcache_array = new VarCache_Struct * [ varcache_max ] ;
for ( i = 0 ; i < varcache_max ; i + + )
varcache_array [ i ] = 0 ;
}
else {
uint32 tmpnewmax = varcache_max + results . RowCount ( ) ;
VarCache_Struct * * tmp = new VarCache_Struct * [ tmpnewmax ] ;
for ( i = 0 ; i < tmpnewmax ; i + + )
tmp [ i ] = 0 ;
for ( i = 0 ; i < varcache_max ; i + + )
tmp [ i ] = varcache_array [ i ] ;
VarCache_Struct * * tmpdel = varcache_array ;
varcache_array = tmp ;
varcache_max = tmpnewmax ;
delete [ ] tmpdel ;
}
for ( auto row = results . begin ( ) ; row ! = results . end ( ) ; + + row )
{
varcache_lastupdate = atoi ( row [ 2 ] ) ;
for ( i = 0 ; i < varcache_max ; i + + ) {
if ( varcache_array [ i ] ) {
if ( strcasecmp ( varcache_array [ i ] - > varname , row [ 0 ] ) = = 0 ) {
delete varcache_array [ i ] ;
2013-02-16 16:14:39 -08:00
varcache_array [ i ] = ( VarCache_Struct * ) new uint8 [ sizeof ( VarCache_Struct ) + strlen ( row [ 1 ] ) + 1 ] ;
2014-07-03 17:42:35 -07:00
strn0cpy ( varcache_array [ i ] - > varname , row [ 0 ] , sizeof ( varcache_array [ i ] - > varname ) ) ;
2013-02-16 16:14:39 -08:00
strcpy ( varcache_array [ i ] - > value , row [ 1 ] ) ;
break ;
}
}
2014-07-03 17:42:35 -07:00
else {
varcache_array [ i ] = ( VarCache_Struct * ) new uint8 [ sizeof ( VarCache_Struct ) + strlen ( row [ 1 ] ) + 1 ] ;
strcpy ( varcache_array [ i ] - > varname , row [ 0 ] ) ;
strcpy ( varcache_array [ i ] - > value , row [ 1 ] ) ;
break ;
2013-02-16 16:14:39 -08:00
}
}
}
2014-07-03 17:42:35 -07:00
uint32 max_used = 0 ;
for ( i = 0 ; i < varcache_max ; i + + ) {
if ( varcache_array [ i ] ) {
if ( i > max_used )
max_used = i ;
}
}
varcache_max = max_used + 1 ;
2013-02-16 16:14:39 -08:00
return true ;
}
// Gets variable from 'variables' table
bool Database : : GetVariable ( const char * varname , char * varvalue , uint16 varvalue_len ) {
varvalue [ 0 ] = ' \0 ' ;
LockMutex lock ( & Mvarcache ) ;
if ( strlen ( varname ) < = 1 )
return false ;
for ( uint32 i = 0 ; i < varcache_max ; i + + ) {
if ( varcache_array [ i ] ) {
if ( strcasecmp ( varcache_array [ i ] - > varname , varname ) = = 0 ) {
snprintf ( varvalue , varvalue_len , " %s " , varcache_array [ i ] - > value ) ;
varvalue [ varvalue_len - 1 ] = 0 ;
return true ;
}
}
else
return false ;
}
return false ;
}
bool Database : : SetVariable ( const char * varname_in , const char * varvalue_in ) {
2014-07-03 18:21:21 -07:00
char * query = nullptr ;
2013-02-16 16:14:39 -08:00
char * varname , * varvalue ;
varname = ( char * ) malloc ( strlen ( varname_in ) * 2 + 1 ) ;
varvalue = ( char * ) malloc ( strlen ( varvalue_in ) * 2 + 1 ) ;
DoEscapeString ( varname , varname_in , strlen ( varname_in ) ) ;
DoEscapeString ( varvalue , varvalue_in , strlen ( varvalue_in ) ) ;
2014-07-03 18:21:21 -07:00
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " Update variables set value='%s' WHERE varname like '%s' " , varvalue , varname ) ) ;
if ( ! results . Success ( ) )
{
std : : cerr < < " Error in SetVariable query ' " < < query < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
2014-07-03 18:21:21 -07:00
free ( varname ) ;
free ( varvalue ) ;
return false ;
2013-02-16 16:14:39 -08:00
}
2014-07-03 18:21:21 -07:00
safe_delete_array ( query ) ;
2014-07-04 00:01:13 -07:00
2014-07-03 18:21:21 -07:00
if ( results . RowsAffected ( ) = = 1 )
{
LoadVariables ( ) ; // refresh cache
free ( varname ) ;
free ( varvalue ) ;
return true ;
2013-02-16 16:14:39 -08:00
}
2014-07-03 18:21:21 -07:00
results = QueryDatabase ( query , MakeAnyLenString ( & query , " Insert Into variables (varname, value) values ('%s', '%s') " , varname , varvalue ) ) ;
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
free ( varname ) ;
free ( varvalue ) ;
2014-07-03 18:21:21 -07:00
if ( results . RowsAffected ( ) = = 1 ) {
LoadVariables ( ) ; // refresh cache
return true ;
}
2013-02-16 16:14:39 -08:00
return false ;
}
uint32 Database : : GetMiniLoginAccount ( char * ip ) {
2014-07-03 18:24:02 -07:00
char * query = nullptr ;
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " SELECT id FROM account WHERE minilogin_ip='%s' " , ip ) ) ;
if ( ! results . Success ( ) )
2013-02-16 16:14:39 -08:00
{
2014-07-03 18:28:49 -07:00
std : : cerr < < " Error in GetMiniLoginAccount query ' " < < query < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
2014-07-03 18:24:02 -07:00
return 0 ;
2013-02-16 16:14:39 -08:00
}
2014-07-03 18:24:02 -07:00
safe_delete_array ( query ) ;
auto row = results . begin ( ) ;
return atoi ( row [ 0 ] ) ;
2013-02-16 16:14:39 -08:00
}
2014-07-03 18:28:49 -07:00
// Get zone starting points from DB
2013-02-16 16:14:39 -08:00
bool Database : : GetSafePoints ( const char * short_name , uint32 version , float * safe_x , float * safe_y , float * safe_z , int16 * minstatus , uint8 * minlevel , char * flag_needed ) {
2014-07-03 18:28:49 -07:00
char * query = nullptr ;
2013-02-16 16:14:39 -08:00
2014-07-03 18:28:49 -07:00
auto results = QueryDatabase ( query , MakeAnyLenString ( & query ,
2013-02-16 16:14:39 -08:00
" SELECT safe_x, safe_y, safe_z, min_status, min_level, "
" flag_needed FROM zone "
2014-07-03 18:28:49 -07:00
" WHERE short_name='%s' AND (version=%i OR version=0) ORDER BY version DESC " , short_name , version ) ) ;
2013-02-16 16:14:39 -08:00
2014-07-03 18:28:49 -07:00
if ( ! results . Success ( ) )
2013-02-16 16:14:39 -08:00
{
2014-07-03 18:28:49 -07:00
std : : cerr < < " Error in GetSafePoint query ' " < < query < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
2013-05-22 16:17:19 -04:00
std : : cerr < < " If it errors, run the following querys: \n " ;
std : : cerr < < " ALTER TABLE `zone` CHANGE `minium_level` `min_level` TINYINT(3) UNSIGNED DEFAULT \" 0 \" NOT NULL; \n " ;
std : : cerr < < " ALTER TABLE `zone` CHANGE `minium_status` `min_status` TINYINT(3) UNSIGNED DEFAULT \" 0 \" NOT NULL; \n " ;
std : : cerr < < " ALTER TABLE `zone` ADD flag_needed VARCHAR(128) NOT NULL DEFAULT ''; \n " ;
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
2014-07-03 18:28:49 -07:00
return false ;
2013-02-16 16:14:39 -08:00
}
2014-07-03 18:28:49 -07:00
safe_delete_array ( query ) ;
if ( results . RowCount ( ) = = 0 )
return false ;
auto row = results . begin ( ) ;
if ( safe_x ! = nullptr )
* safe_x = atof ( row [ 0 ] ) ;
if ( safe_y ! = nullptr )
* safe_y = atof ( row [ 1 ] ) ;
if ( safe_z ! = nullptr )
* safe_z = atof ( row [ 2 ] ) ;
if ( minstatus ! = nullptr )
* minstatus = atoi ( row [ 3 ] ) ;
if ( minlevel ! = nullptr )
* minlevel = atoi ( row [ 4 ] ) ;
if ( flag_needed ! = nullptr )
strcpy ( flag_needed , row [ 5 ] ) ;
return true ;
2013-02-16 16:14:39 -08:00
}
bool Database : : GetZoneLongName ( const char * short_name , char * * long_name , char * file_name , float * safe_x , float * safe_y , float * safe_z , uint32 * graveyard_id , uint32 * maxclients ) {
2014-07-04 15:31:24 -07:00
char * query = nullptr ;
2013-02-16 16:14:39 -08:00
2014-07-03 18:32:52 -07:00
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " SELECT long_name, file_name, safe_x, safe_y, safe_z, graveyard_id, maxclients FROM zone WHERE short_name='%s' AND version=0 " , short_name ) ) ;
if ( ! results . Success ( ) ) {
std : : cerr < < " Error in GetZoneLongName query ' " < < query < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
2014-07-03 18:32:52 -07:00
return false ;
2013-02-16 16:14:39 -08:00
}
2014-07-03 18:32:52 -07:00
safe_delete_array ( query ) ;
if ( results . RowCount ( ) = = 0 )
2013-02-16 16:14:39 -08:00
return false ;
2014-07-03 18:32:52 -07:00
auto row = results . begin ( ) ;
if ( long_name ! = nullptr )
* long_name = strcpy ( new char [ strlen ( row [ 0 ] ) + 1 ] , row [ 0 ] ) ;
if ( file_name ! = nullptr ) {
if ( row [ 1 ] = = nullptr )
strcpy ( file_name , short_name ) ;
else
strcpy ( file_name , row [ 1 ] ) ;
2013-02-16 16:14:39 -08:00
}
2014-07-03 18:32:52 -07:00
if ( safe_x ! = nullptr )
* safe_x = atof ( row [ 2 ] ) ;
if ( safe_y ! = nullptr )
* safe_y = atof ( row [ 3 ] ) ;
if ( safe_z ! = nullptr )
* safe_z = atof ( row [ 4 ] ) ;
if ( graveyard_id ! = nullptr )
* graveyard_id = atoi ( row [ 5 ] ) ;
if ( maxclients ! = nullptr )
* maxclients = atoi ( row [ 6 ] ) ;
return true ;
2013-02-16 16:14:39 -08:00
}
uint32 Database : : GetZoneGraveyardID ( uint32 zone_id , uint32 version ) {
2014-07-03 18:36:16 -07:00
char * query = nullptr ;
2013-02-16 16:14:39 -08:00
2014-07-03 18:36:16 -07:00
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " SELECT graveyard_id FROM zone WHERE zoneidnumber='%u' AND (version=%i OR version=0) ORDER BY version DESC " , zone_id , version ) ) ;
if ( ! results . Success ( ) )
2013-02-16 16:14:39 -08:00
{
2014-07-03 18:36:16 -07:00
std : : cerr < < " Error in GetZoneGraveyardID query ' " < < query < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
2014-07-03 18:36:16 -07:00
return 0 ;
2013-02-16 16:14:39 -08:00
}
safe_delete_array ( query ) ;
2014-07-03 18:36:16 -07:00
if ( results . RowCount ( ) = = 0 )
return 0 ;
auto row = results . begin ( ) ;
return atoi ( row [ 0 ] ) ;
2013-02-16 16:14:39 -08:00
}
bool Database : : GetZoneGraveyard ( const uint32 graveyard_id , uint32 * graveyard_zoneid , float * graveyard_x , float * graveyard_y , float * graveyard_z , float * graveyard_heading ) {
2014-07-03 18:39:51 -07:00
char * query = nullptr ;
2013-02-16 16:14:39 -08:00
2014-07-03 18:39:51 -07:00
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " SELECT zone_id, x, y, z, heading FROM graveyard WHERE id=%i " , graveyard_id ) ) ;
if ( ! results . Success ( ) ) {
std : : cerr < < " Error in GetZoneGraveyard query ' " < < query < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
return false ;
}
2014-07-03 18:39:51 -07:00
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
2014-07-03 18:39:51 -07:00
if ( results . RowCount ( ) ! = 1 )
return false ;
auto row = results . begin ( ) ;
if ( graveyard_zoneid ! = nullptr )
* graveyard_zoneid = atoi ( row [ 0 ] ) ;
if ( graveyard_x ! = nullptr )
* graveyard_x = atof ( row [ 1 ] ) ;
if ( graveyard_y ! = nullptr )
* graveyard_y = atof ( row [ 2 ] ) ;
if ( graveyard_z ! = nullptr )
* graveyard_z = atof ( row [ 3 ] ) ;
if ( graveyard_heading ! = nullptr )
* graveyard_heading = atof ( row [ 4 ] ) ;
return true ;
2013-02-16 16:14:39 -08:00
}
bool Database : : LoadZoneNames ( ) {
2014-07-03 18:51:24 -07:00
char * query = nullptr ;
2013-02-16 16:14:39 -08:00
2014-07-03 18:51:24 -07:00
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " SELECT zoneidnumber, short_name FROM zone " ) ) ;
if ( ! results . Success ( ) )
{
2014-07-03 18:55:16 -07:00
std : : cerr < < " Error in LoadZoneNames query ' " < < query < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
return false ;
}
2014-07-03 18:51:24 -07:00
safe_delete_array ( query ) ;
for ( auto row = results . begin ( ) ; row ! = results . end ( ) ; + + row )
{
uint32 zoneid = atoi ( row [ 0 ] ) ;
std : : string zonename = row [ 1 ] ;
zonename_array . insert ( std : : pair < uint32 , std : : string > ( zoneid , zonename ) ) ;
}
2013-06-28 04:25:44 -04:00
2013-02-16 16:14:39 -08:00
return true ;
}
uint32 Database : : GetZoneID ( const char * zonename ) {
if ( zonename = = 0 )
return 0 ;
2013-06-28 04:25:44 -04:00
for ( auto iter = zonename_array . begin ( ) ; iter ! = zonename_array . end ( ) ; + + iter ) {
2013-07-08 19:02:54 -04:00
if ( strcasecmp ( iter - > second . c_str ( ) , zonename ) = = 0 ) {
2013-06-28 04:25:44 -04:00
return iter - > first ;
2013-02-16 16:14:39 -08:00
}
}
return 0 ;
}
const char * Database : : GetZoneName ( uint32 zoneID , bool ErrorUnknown ) {
2013-06-28 04:25:44 -04:00
auto iter = zonename_array . find ( zoneID ) ;
2013-05-06 13:07:41 -04:00
2013-06-28 04:25:44 -04:00
if ( iter ! = zonename_array . end ( ) ) {
return iter - > second . c_str ( ) ;
2013-05-09 10:44:08 -04:00
}
2013-02-16 16:14:39 -08:00
else {
if ( ErrorUnknown )
return " UNKNOWN " ;
else
return 0 ;
}
return 0 ;
}
uint8 Database : : GetPEQZone ( uint32 zoneID , uint32 version ) {
2014-07-03 18:55:16 -07:00
char * query = nullptr ;
2013-02-16 16:14:39 -08:00
2014-07-03 18:55:16 -07:00
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " SELECT peqzone from zone where zoneidnumber='%i' AND (version=%i OR version=0) ORDER BY version DESC " , zoneID , version ) ) ;
if ( ! results . Success ( ) )
2013-02-16 16:14:39 -08:00
{
2014-07-03 18:55:16 -07:00
std : : cerr < < " Error in GetPEQZone query ' " < < query < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
2014-07-03 18:55:16 -07:00
return 0 ;
2013-02-16 16:14:39 -08:00
}
safe_delete_array ( query ) ;
2014-07-03 18:55:16 -07:00
if ( results . RowCount ( ) = = 0 )
return 0 ;
auto row = results . begin ( ) ;
return atoi ( row [ 0 ] ) ;
2013-02-16 16:14:39 -08:00
}
2013-05-06 13:07:41 -04:00
bool Database : : CheckNameFilter ( const char * name , bool surname )
2013-02-16 16:14:39 -08:00
{
std : : string str_name = name ;
2014-07-03 19:00:15 -07:00
char * query = nullptr ;
2013-02-16 16:14:39 -08:00
if ( surname )
{
// the minimum 4 is enforced by the client too
if ( ! name | | strlen ( name ) < 3 )
{
return false ;
}
}
else
{
// the minimum 4 is enforced by the client too
if ( ! name | | strlen ( name ) < 4 | | strlen ( name ) > 64 )
{
return false ;
}
}
2013-03-10 18:55:18 +00:00
for ( size_t i = 0 ; i < str_name . size ( ) ; i + + )
2013-02-16 16:14:39 -08:00
{
if ( ! isalpha ( str_name [ i ] ) )
{
return false ;
}
}
2013-03-10 18:55:18 +00:00
for ( size_t x = 0 ; x < str_name . size ( ) ; + + x )
2013-02-16 16:14:39 -08:00
{
str_name [ x ] = tolower ( str_name [ x ] ) ;
}
char c = ' \0 ' ;
uint8 num_c = 0 ;
2013-03-10 18:55:18 +00:00
for ( size_t x = 0 ; x < str_name . size ( ) ; + + x )
2013-02-16 16:14:39 -08:00
{
if ( str_name [ x ] = = c )
{
num_c + + ;
}
else
{
num_c = 1 ;
c = str_name [ x ] ;
}
if ( num_c > 2 )
{
return false ;
}
}
2014-07-03 19:00:15 -07:00
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " SELECT name FROM name_filter " ) ) ;
2013-02-16 16:14:39 -08:00
2014-07-03 19:00:15 -07:00
if ( ! results . Success ( ) )
{
std : : cerr < < " Error in CheckNameFilter query ' " < < query < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
safe_delete_array ( query ) ;
// false through to true? shouldn't it be falls through to false?
2013-02-16 16:14:39 -08:00
return true ;
}
2014-07-03 19:00:15 -07:00
safe_delete_array ( query ) ;
for ( auto row = results . begin ( ) ; row ! = results . end ( ) ; + + row )
2013-02-16 16:14:39 -08:00
{
2014-07-03 19:00:15 -07:00
std : : string current_row = row [ 0 ] ;
for ( size_t x = 0 ; x < current_row . size ( ) ; + + x )
current_row [ x ] = tolower ( current_row [ x ] ) ;
if ( str_name . find ( current_row ) ! = std : : string : : npos )
return false ;
2013-02-16 16:14:39 -08:00
}
return true ;
}
bool Database : : AddToNameFilter ( const char * name ) {
2014-07-03 19:02:39 -07:00
char * query = nullptr ;
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " INSERT INTO name_filter (name) values ('%s') " , name ) ) ;
2013-02-16 16:14:39 -08:00
2014-07-03 19:02:39 -07:00
if ( ! results . Success ( ) )
{
std : : cerr < < " Error in AddToNameFilter query ' " < < query < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
return false ;
}
safe_delete_array ( query ) ;
2014-07-03 19:02:39 -07:00
if ( results . RowsAffected ( ) = = 0 )
2013-02-16 16:14:39 -08:00
return false ;
return true ;
}
uint32 Database : : GetAccountIDFromLSID ( uint32 iLSID , char * oAccountName , int16 * oStatus ) {
2014-07-03 19:06:00 -07:00
char * query = nullptr ;
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " SELECT id, name, status FROM account WHERE lsaccount_id=%i " , iLSID ) ) ;
2013-02-16 16:14:39 -08:00
2014-07-03 19:06:00 -07:00
if ( ! results . Success ( ) )
2013-02-16 16:14:39 -08:00
{
2014-07-03 19:06:00 -07:00
std : : cerr < < " Error in GetAccountIDFromLSID query ' " < < query < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
return 0 ;
}
2014-07-03 19:06:00 -07:00
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
2014-07-03 19:06:00 -07:00
if ( results . RowCount ( ) ! = 1 )
return 0 ;
auto row = results . begin ( ) ;
uint32 account_id = atoi ( row [ 0 ] ) ;
if ( oAccountName )
strcpy ( oAccountName , row [ 1 ] ) ;
if ( oStatus )
* oStatus = atoi ( row [ 2 ] ) ;
return account_id ;
2013-02-16 16:14:39 -08:00
}
void Database : : GetAccountFromID ( uint32 id , char * oAccountName , int16 * oStatus ) {
2014-07-03 19:08:46 -07:00
char * query = nullptr ;
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " SELECT name, status FROM account WHERE id=%i " , id ) ) ;
2013-02-16 16:14:39 -08:00
2014-07-03 19:08:46 -07:00
if ( ! results . Success ( ) )
2013-02-16 16:14:39 -08:00
{
2014-07-03 19:08:46 -07:00
std : : cerr < < " Error in GetAccountFromID query ' " < < query < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
safe_delete_array ( query ) ;
return ;
2013-02-16 16:14:39 -08:00
}
safe_delete_array ( query ) ;
2014-07-03 19:08:46 -07:00
if ( results . RowCount ( ) ! = 1 )
return ;
auto row = results . begin ( ) ;
if ( oAccountName )
strcpy ( oAccountName , row [ 0 ] ) ;
if ( oStatus )
* oStatus = atoi ( row [ 1 ] ) ;
2013-02-16 16:14:39 -08:00
}
void Database : : ClearMerchantTemp ( ) {
2014-07-03 19:12:17 -07:00
char * query = nullptr ;
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " delete from merchantlist_temp " ) ) ;
if ( ! results . Success ( ) )
std : : cerr < < " Error in ClearMerchantTemp query ' " < < query < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
}
bool Database : : UpdateName ( const char * oldname , const char * newname ) {
2014-07-03 19:15:43 -07:00
char * query = nullptr ;
2013-02-16 16:14:39 -08:00
2013-05-22 16:17:19 -04:00
std : : cout < < " Renaming " < < oldname < < " to " < < newname < < " ... " < < std : : endl ;
2014-07-03 19:15:43 -07:00
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " UPDATE character_ SET name='%s' WHERE name='%s'; " , newname , oldname ) ) ;
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
2014-07-03 19:15:43 -07:00
if ( ! results . Success ( ) )
return false ;
if ( results . RowsAffected ( ) = = 0 )
2013-02-16 16:14:39 -08:00
return false ;
return true ;
}
// If the name is used or an error occurs, it returns false, otherwise it returns true
bool Database : : CheckUsedName ( const char * name )
{
2014-07-03 19:19:13 -07:00
char * query = nullptr ;
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " SELECT id FROM character_ where name='%s' " , name ) ) ;
if ( ! results . Success ( ) )
{
std : : cerr < < " Error in CheckUsedName query ' " < < query < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
return false ;
}
2014-07-03 19:19:13 -07:00
safe_delete_array ( query ) ;
if ( results . RowCount ( ) > 0 )
return false ;
return true ;
2013-02-16 16:14:39 -08:00
}
uint8 Database : : GetServerType ( )
{
2014-07-03 19:29:38 -07:00
char * query = nullptr ;
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " SELECT value FROM variables WHERE varname='ServerType' " ) ) ;
if ( ! results . Success ( ) )
2013-02-16 16:14:39 -08:00
{
2014-07-03 19:29:38 -07:00
std : : cerr < < " Error in GetServerType query ' " < < query < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
2014-07-03 19:29:38 -07:00
return 0 ;
2013-02-16 16:14:39 -08:00
}
2014-07-03 19:29:38 -07:00
safe_delete_array ( query ) ;
if ( results . RowCount ( ) ! = 1 )
return 0 ;
2013-02-16 16:14:39 -08:00
2014-07-03 19:29:38 -07:00
auto row = results . begin ( ) ;
return atoi ( row [ 0 ] ) ;
2013-02-16 16:14:39 -08:00
}
bool Database : : MoveCharacterToZone ( const char * charname , const char * zonename , uint32 zoneid ) {
2014-07-03 19:31:41 -07:00
char * query = nullptr ;
2013-02-16 16:14:39 -08:00
2013-05-04 18:06:58 -07:00
if ( zonename = = nullptr | | strlen ( zonename ) = = 0 )
2014-07-03 19:31:41 -07:00
return false ;
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " UPDATE character_ SET zonename = '%s',zoneid=%i,x=-1, y=-1, z=-1 WHERE name='%s' " , zonename , zoneid , charname ) ) ;
2013-02-16 16:14:39 -08:00
2014-07-03 19:31:41 -07:00
if ( ! results . Success ( ) )
{
std : : cerr < < " Error in MoveCharacterToZone(name) query ' " < < query < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
return false ;
}
safe_delete_array ( query ) ;
2014-07-03 19:31:41 -07:00
if ( results . RowsAffected ( ) = = 0 )
2013-02-16 16:14:39 -08:00
return false ;
return true ;
}
bool Database : : MoveCharacterToZone ( const char * charname , const char * zonename ) {
return MoveCharacterToZone ( charname , zonename , GetZoneID ( zonename ) ) ;
}
bool Database : : MoveCharacterToZone ( uint32 iCharID , const char * iZonename ) {
2014-07-03 19:31:41 -07:00
char * query = nullptr ;
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " UPDATE character_ SET zonename = '%s', zoneid=%i, x=-1, y=-1, z=-1 WHERE id=%i " , iZonename , GetZoneID ( iZonename ) , iCharID ) ) ;
2014-07-04 00:01:13 -07:00
2014-07-03 19:31:41 -07:00
if ( ! results . Success ( ) )
{
2014-07-03 21:14:27 -07:00
std : : cerr < < " Error in MoveCharacterToZone(id) query ' " < < query < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
2014-07-03 19:31:41 -07:00
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
return false ;
}
safe_delete_array ( query ) ;
2014-07-03 19:31:41 -07:00
return results . RowsAffected ( ) ! = 0 ;
2013-02-16 16:14:39 -08:00
}
uint8 Database : : CopyCharacter ( const char * oldname , const char * newname , uint32 acctid ) {
2014-07-03 19:57:52 -07:00
char * query = nullptr ;
2013-02-16 16:14:39 -08:00
PlayerProfile_Struct * pp ;
ExtendedProfile_Struct * ext ;
2014-07-03 19:57:52 -07:00
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " SELECT profile, extprofile FROM character_ WHERE name='%s' " , oldname ) ) ;
if ( ! results . Success ( ) )
{
std : : cerr < < " Error in CopyCharacter read query ' " < < query < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
2014-07-03 19:57:52 -07:00
return 0 ;
}
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
2014-07-03 19:57:52 -07:00
auto row = results . begin ( ) ;
2013-02-16 16:14:39 -08:00
2014-07-03 19:57:52 -07:00
pp = ( PlayerProfile_Struct * ) row [ 0 ] ;
strcpy ( pp - > name , newname ) ;
2013-02-16 16:14:39 -08:00
2014-07-03 19:57:52 -07:00
ext = ( ExtendedProfile_Struct * ) row [ 1 ] ;
2013-02-16 16:14:39 -08:00
char query2 [ 276 + sizeof ( PlayerProfile_Struct ) * 2 + sizeof ( ExtendedProfile_Struct ) * 2 + 1 ] ;
char * end = query2 ;
end + = sprintf ( end , " INSERT INTO character_ SET zonename= \' %s \' , x = %f, y = %f, z = %f, profile= \' " , GetZoneName ( pp - > zone_id ) , pp - > x , pp - > y , pp - > z ) ;
2013-05-09 10:44:08 -04:00
end + = DoEscapeString ( end , ( char * ) pp , sizeof ( PlayerProfile_Struct ) ) ;
2013-02-16 16:14:39 -08:00
end + = sprintf ( end , " \' , extprofile= \' " ) ;
end + = DoEscapeString ( end , ( char * ) ext , sizeof ( ExtendedProfile_Struct ) ) ;
2013-05-09 10:44:08 -04:00
end + = sprintf ( end , " \' , account_id=%d, name='%s' " , acctid , newname ) ;
2013-02-16 16:14:39 -08:00
2014-07-03 19:57:52 -07:00
results = QueryDatabase ( query2 , ( uint32 ) ( end - query2 ) ) ;
if ( ! results . Success ( ) )
{
std : : cerr < < " Error in CopyCharacter query ' " < < query2 < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
return 0 ;
}
2014-07-03 19:59:35 -07:00
if ( results . RowsAffected ( ) = = 0 )
2013-02-16 16:14:39 -08:00
return 0 ;
return 1 ;
}
bool Database : : SetHackerFlag ( const char * accountname , const char * charactername , const char * hacked ) {
2014-07-03 19:59:35 -07:00
char * query = nullptr ;
2013-02-16 16:14:39 -08:00
2014-07-03 19:59:35 -07:00
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " INSERT INTO hackers(account,name,hacked) values('%s','%s','%s') " , accountname , charactername , hacked ) ) ;
if ( ! results . Success ( ) )
2013-02-16 16:14:39 -08:00
{
2014-07-03 21:14:27 -07:00
std : : cerr < < " Error in SetHackerFlag query ' " < < query < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
2014-07-03 19:59:35 -07:00
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
return false ;
}
2014-07-03 19:59:35 -07:00
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
2014-07-03 19:59:35 -07:00
return results . RowsAffected ( ) ! = 0 ;
2013-02-16 16:14:39 -08:00
}
2014-07-04 00:01:13 -07:00
bool Database : : SetMQDetectionFlag ( const char * accountname , const char * charactername , const char * hacked , const char * zone ) {
2014-07-03 20:13:38 -07:00
//Utilize the "hacker" table, but also give zone information.
char * query = nullptr ;
2013-02-16 16:14:39 -08:00
2014-07-03 20:13:38 -07:00
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " INSERT INTO hackers(account,name,hacked,zone) values('%s','%s','%s','%s') " , accountname , charactername , hacked , zone ) ) ;
2013-02-16 16:14:39 -08:00
2014-07-03 20:13:38 -07:00
if ( ! results . Success ( ) )
2013-02-16 16:14:39 -08:00
{
2014-07-03 20:13:38 -07:00
safe_delete_array ( query ) ;
std : : cerr < < " Error in SetMQDetectionFlag query ' " < < query < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
2013-02-16 16:14:39 -08:00
return false ;
}
2014-07-03 20:13:38 -07:00
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
2014-07-03 20:13:38 -07:00
return results . RowsAffected ( ) ! = 0 ;
2013-02-16 16:14:39 -08:00
}
uint8 Database : : GetRaceSkill ( uint8 skillid , uint8 in_race )
{
uint16 race_cap = 0 ;
2014-07-03 20:31:56 -07:00
char * query = nullptr ;
2013-02-16 16:14:39 -08:00
//Check for a racial cap!
2014-07-03 20:31:56 -07:00
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " SELECT skillcap from race_skillcaps where skill = %i && race = %i " , skillid , in_race ) ) ;
safe_delete_array ( query ) ;
if ( ! results . Success ( ) )
return 0 ;
if ( results . RowCount ( ) = = 0 )
return 0 ;
auto row = results . begin ( ) ;
return atoi ( row [ 0 ] ) ;
2013-02-16 16:14:39 -08:00
}
uint8 Database : : GetSkillCap ( uint8 skillid , uint8 in_race , uint8 in_class , uint16 in_level )
{
uint8 skill_level = 0 , skill_formula = 0 ;
uint16 base_cap = 0 , skill_cap = 0 , skill_cap2 = 0 , skill_cap3 = 0 ;
2014-07-03 21:01:55 -07:00
char * query = nullptr ;
2013-02-16 16:14:39 -08:00
//Fetch the data from DB.
2014-07-03 21:01:55 -07:00
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " SELECT level, formula, pre50cap, post50cap, post60cap from skillcaps where skill = %i && class = %i " , skillid , in_class ) ) ;
safe_delete_array ( query ) ;
if ( results . Success ( ) & & results . RowsAffected ( ) ! = 0 )
2013-02-16 16:14:39 -08:00
{
2014-07-03 21:01:55 -07:00
auto row = results . begin ( ) ;
skill_level = atoi ( row [ 0 ] ) ;
skill_formula = atoi ( row [ 1 ] ) ;
skill_cap = atoi ( row [ 2 ] ) ;
if ( atoi ( row [ 3 ] ) > skill_cap )
skill_cap2 = ( atoi ( row [ 3 ] ) - skill_cap ) / 10 ; //Split the post-50 skill cap into difference between pre-50 cap and post-50 cap / 10 to determine amount of points per level.
skill_cap3 = atoi ( row [ 4 ] ) ;
2013-02-16 16:14:39 -08:00
}
int race_skill = GetRaceSkill ( skillid , in_race ) ;
if ( race_skill > 0 & & ( race_skill > skill_cap | | skill_cap = = 0 | | in_level < skill_level ) )
return race_skill ;
if ( skill_cap = = 0 ) //Can't train this skill at all.
return 255 ; //Untrainable
if ( in_level < skill_level )
return 254 ; //Untrained
//Determine pre-51 level-based cap
if ( skill_formula > 0 )
base_cap = in_level * skill_formula + skill_formula ;
if ( base_cap > skill_cap | | skill_formula = = 0 )
base_cap = skill_cap ;
2014-07-03 21:01:55 -07:00
2013-02-16 16:14:39 -08:00
//If post 50, add post 50 cap to base cap.
if ( in_level > 50 & & skill_cap2 > 0 )
base_cap + = skill_cap2 * ( in_level - 50 ) ;
2014-07-03 21:01:55 -07:00
2013-02-16 16:14:39 -08:00
//No cap should ever go above its post50cap
if ( skill_cap3 > 0 & & base_cap > skill_cap3 )
base_cap = skill_cap3 ;
2014-07-03 21:01:55 -07:00
2013-02-16 16:14:39 -08:00
//Base cap is now the max value at the person's level, return it!
return base_cap ;
}
uint32 Database : : GetCharacterInfo ( const char * iName , uint32 * oAccID , uint32 * oZoneID , uint32 * oInstanceID , float * oX , float * oY , float * oZ ) {
2014-07-03 21:14:27 -07:00
char * query = nullptr ;
2013-02-16 16:14:39 -08:00
2014-07-03 21:14:27 -07:00
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " SELECT id, account_id, zonename, instanceid, x, y, z FROM character_ WHERE name='%s' " , iName ) ) ;
if ( ! results . Success ( ) )
{
std : : cerr < < " Error in GetCharacterInfo query ' " < < query < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
2014-07-03 21:14:27 -07:00
return 0 ;
2013-02-16 16:14:39 -08:00
}
2014-07-03 21:14:27 -07:00
safe_delete_array ( query ) ;
if ( results . RowCount ( ) ! = 1 )
return 0 ;
auto row = results . begin ( ) ;
uint32 charid = atoi ( row [ 0 ] ) ;
if ( oAccID )
* oAccID = atoi ( row [ 1 ] ) ;
if ( oZoneID )
* oZoneID = GetZoneID ( row [ 2 ] ) ;
if ( oInstanceID )
* oInstanceID = atoi ( row [ 3 ] ) ;
if ( oX )
* oX = atof ( row [ 4 ] ) ;
if ( oY )
* oY = atof ( row [ 5 ] ) ;
if ( oZ )
* oZ = atof ( row [ 6 ] ) ;
return charid ;
2013-02-16 16:14:39 -08:00
}
bool Database : : UpdateLiveChar ( char * charname , uint32 lsaccount_id ) {
2014-07-03 21:16:31 -07:00
char * query = nullptr ;
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " UPDATE account SET charname='%s' WHERE id=%i; " , charname , lsaccount_id ) ) ;
if ( ! results . Success ( ) )
{
std : : cerr < < " Error in UpdateLiveChar query ' " < < query < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
return false ;
}
safe_delete_array ( query ) ;
2014-07-03 21:16:31 -07:00
2013-02-16 16:14:39 -08:00
return true ;
}
bool Database : : GetLiveChar ( uint32 account_id , char * cname ) {
2014-07-04 15:33:33 -07:00
char * query = nullptr ;
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " SELECT charname FROM account WHERE id=%i " , account_id ) ) ;
if ( ! results . Success ( ) )
{
2014-07-04 15:52:14 -07:00
std : : cerr < < " Error in GetLiveChar query ' " < < query < < " ' " < < results . ErrorMessage ( ) < < std : : endl ;
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
2014-07-04 15:33:33 -07:00
return false ;
2013-02-16 16:14:39 -08:00
}
2014-07-04 15:33:33 -07:00
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
2014-07-04 15:33:33 -07:00
if ( results . RowCount ( ) ! = 1 )
return false ;
auto row = results . begin ( ) ;
strcpy ( cname , row [ 0 ] ) ;
return true ;
2013-02-16 16:14:39 -08:00
}
void Database : : SetLFP ( uint32 CharID , bool LFP ) {
2014-07-04 15:36:29 -07:00
char * query = nullptr ;
2013-02-16 16:14:39 -08:00
2014-07-04 15:36:29 -07:00
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " update character_ set lfp=%i where id=%i " , LFP , CharID ) ) ;
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
2014-07-04 15:36:29 -07:00
if ( ! results . Success ( ) )
LogFile - > write ( EQEMuLog : : Error , " Error updating LFP for character %i : %s " , CharID , results . ErrorMessage ( ) . c_str ( ) ) ;
2013-02-16 16:14:39 -08:00
}
void Database : : SetLoginFlags ( uint32 CharID , bool LFP , bool LFG , uint8 firstlogon ) {
2014-07-04 15:41:16 -07:00
char * query = nullptr ;
2013-02-16 16:14:39 -08:00
2014-07-04 15:41:16 -07:00
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " update character_ set lfp=%i, lfg=%i, firstlogon=%i where id=%i " , LFP , LFG , firstlogon , CharID ) ) ;
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
2014-07-04 15:41:16 -07:00
if ( ! results . Success ( ) )
LogFile - > write ( EQEMuLog : : Error , " Error updating LFP for character %i : %s " , CharID , results . ErrorMessage ( ) . c_str ( ) ) ;
2013-02-16 16:14:39 -08:00
}
void Database : : SetLFG ( uint32 CharID , bool LFG ) {
2014-07-04 15:41:16 -07:00
char * query = nullptr ;
2013-02-16 16:14:39 -08:00
2014-07-04 15:41:16 -07:00
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " update character_ set lfg=%i where id=%i " , LFG , CharID ) ) ;
2014-07-04 15:52:14 -07:00
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
2014-07-04 15:41:16 -07:00
if ( ! results . Success ( ) )
LogFile - > write ( EQEMuLog : : Error , " Error updating LFP for character %i : %s " , CharID , results . ErrorMessage ( ) . c_str ( ) ) ;
2013-02-16 16:14:39 -08:00
}
void Database : : SetFirstLogon ( uint32 CharID , uint8 firstlogon ) {
2014-07-04 15:43:21 -07:00
char * query = nullptr ;
2013-02-16 16:14:39 -08:00
2014-07-04 15:43:21 -07:00
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " update character_ set firstlogon=%i where id=%i " , firstlogon , CharID ) ) ;
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
2014-07-04 15:43:21 -07:00
if ( ! results . Success ( ) )
LogFile - > write ( EQEMuLog : : Error , " Error updating firstlogon for character %i : %s " , CharID , results . ErrorMessage ( ) . c_str ( ) ) ;
2013-02-16 16:14:39 -08:00
}
void Database : : AddReport ( std : : string who , std : : string against , std : : string lines )
{
2014-07-04 15:45:34 -07:00
char * query = nullptr ;
2013-02-16 16:14:39 -08:00
char * escape_str = new char [ lines . size ( ) * 2 + 1 ] ;
DoEscapeString ( escape_str , lines . c_str ( ) , lines . size ( ) ) ;
2014-07-04 15:45:34 -07:00
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " INSERT INTO reports (name, reported, reported_text) VALUES('%s', '%s', '%s') " , who . c_str ( ) , against . c_str ( ) , escape_str ) ) ;
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
safe_delete_array ( escape_str ) ;
2014-07-04 15:45:34 -07:00
if ( ! results . Success ( ) )
LogFile - > write ( EQEMuLog : : Error , " Error adding a report for %s: %s " , who . c_str ( ) , results . ErrorMessage ( ) . c_str ( ) ) ;
2013-02-16 16:14:39 -08:00
}
2014-07-04 15:50:41 -07:00
void Database : : SetGroupID ( const char * name , uint32 id , uint32 charid , uint32 ismerc ) {
char * query = nullptr ;
if ( id = = 0 )
2014-07-05 10:47:34 -07:00
{
2014-07-04 15:50:41 -07:00
// removing from group
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " delete from group_id where charid=%i and name='%s' and ismerc=%i " , charid , name , ismerc ) ) ;
safe_delete_array ( query ) ;
if ( ! results . Success ( ) )
LogFile - > write ( EQEMuLog : : Error , " Error deleting character from group id: %s " , results . ErrorMessage ( ) . c_str ( ) ) ;
return ;
2013-02-16 16:14:39 -08:00
}
2014-07-04 15:50:41 -07:00
// adding to group
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " replace into group_id set charid=%i, groupid=%i, name='%s', ismerc='%i' " , charid , id , name , ismerc ) ) ;
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
2014-07-04 15:50:41 -07:00
if ( ! results . Success ( ) )
LogFile - > write ( EQEMuLog : : Error , " Error adding character to group id: %s " , results . ErrorMessage ( ) . c_str ( ) ) ;
2013-02-16 16:14:39 -08:00
}
void Database : : ClearGroup ( uint32 gid ) {
ClearGroupLeader ( gid ) ;
2014-07-04 19:13:39 -07:00
char * query = nullptr ;
if ( gid = = 0 )
2014-07-05 10:47:34 -07:00
{
2014-07-04 19:13:39 -07:00
//clear all groups
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " delete from group_id " ) ) ;
safe_delete_array ( query ) ;
if ( ! results . Success ( ) )
std : : cout < < " Unable to clear groups: " < < results . ErrorMessage ( ) < < std : : endl ;
return ;
2014-07-05 10:47:34 -07:00
}
2014-07-04 19:13:39 -07:00
//clear a specific group
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " delete from group_id where groupid = %lu " , ( unsigned long ) gid ) ) ;
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
2014-07-04 19:13:39 -07:00
if ( ! results . Success ( ) )
std : : cout < < " Unable to clear groups: " < < results . ErrorMessage ( ) < < std : : endl ;
2013-02-16 16:14:39 -08:00
}
uint32 Database : : GetGroupID ( const char * name ) {
2014-07-04 19:17:33 -07:00
char * query = nullptr ;
auto results = QueryDatabase ( query , MakeAnyLenString ( & query , " SELECT groupid from group_id where name='%s' " , name ) ) ;
safe_delete_array ( query ) ;
if ( ! results . Success ( ) )
{
LogFile - > write ( EQEMuLog : : Error , " Error getting group id: %s " , results . ErrorMessage ( ) . c_str ( ) ) ;
return 0 ;
}
if ( results . RowCount ( ) = = 0 )
{
2013-02-16 16:14:39 -08:00
LogFile - > write ( EQEMuLog : : Debug , " Character not in a group: %s " , name ) ;
2014-07-04 19:17:33 -07:00
return 0 ;
2013-02-16 16:14:39 -08:00
}
2014-07-04 19:17:33 -07:00
auto row = results . begin ( ) ;
return atoi ( row [ 0 ] ) ;
2013-02-16 16:14:39 -08:00
}
char * Database : : GetGroupLeaderForLogin ( const char * name , char * leaderbuf ) {
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
2013-05-09 10:44:08 -04:00
char * query = 0 ;
MYSQL_RES * result ;
2013-02-16 16:14:39 -08:00
MYSQL_ROW row ;
PlayerProfile_Struct pp ;
if ( RunQuery ( query , MakeAnyLenString ( & query , " SELECT profile from character_ where name='%s' " , name ) , errbuf , & result ) ) {
row = mysql_fetch_row ( result ) ;
unsigned long * lengths = mysql_fetch_lengths ( result ) ;
if ( lengths [ 0 ] = = sizeof ( PlayerProfile_Struct ) ) {
memcpy ( & pp , row [ 0 ] , sizeof ( PlayerProfile_Struct ) ) ;
strcpy ( leaderbuf , pp . groupMembers [ 0 ] ) ;
}
mysql_free_result ( result ) ;
}
else {
printf ( " Unable to get leader name: %s \n " , errbuf ) ;
}
safe_delete_array ( query ) ;
return leaderbuf ;
}
void Database : : SetGroupLeaderName ( uint32 gid , const char * name ) {
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
2013-05-09 10:44:08 -04:00
char * query = 0 ;
2013-02-16 16:14:39 -08:00
if ( ! RunQuery ( query , MakeAnyLenString ( & query , " Replace into group_leaders set gid=%lu, leadername='%s' " , ( unsigned long ) gid , name ) , errbuf ) )
printf ( " Unable to set group leader: %s \n " , errbuf ) ;
safe_delete_array ( query ) ;
}
char * Database : : GetGroupLeadershipInfo ( uint32 gid , char * leaderbuf , char * maintank , char * assist , char * puller , char * marknpc , GroupLeadershipAA_Struct * GLAA ) {
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
char * query = 0 ;
MYSQL_RES * result ;
MYSQL_ROW row ;
if ( RunQuery ( query , MakeAnyLenString ( & query , " SELECT leadername, maintank, assist, puller, marknpc, leadershipaa FROM group_leaders WHERE gid=%lu " , ( unsigned long ) gid ) ,
2013-05-09 10:44:08 -04:00
errbuf , & result ) ) {
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
row = mysql_fetch_row ( result ) ;
unsigned long * Lengths = mysql_fetch_lengths ( result ) ;
2013-05-04 18:06:58 -07:00
if ( row ! = nullptr ) {
2013-02-16 16:14:39 -08:00
if ( leaderbuf )
strcpy ( leaderbuf , row [ 0 ] ) ;
if ( maintank )
strcpy ( maintank , row [ 1 ] ) ;
if ( assist )
strcpy ( assist , row [ 2 ] ) ;
if ( puller )
strcpy ( puller , row [ 3 ] ) ;
if ( marknpc )
strcpy ( marknpc , row [ 4 ] ) ;
if ( GLAA & & ( Lengths [ 5 ] = = sizeof ( GroupLeadershipAA_Struct ) ) )
memcpy ( GLAA , row [ 5 ] , sizeof ( GroupLeadershipAA_Struct ) ) ;
mysql_free_result ( result ) ;
return leaderbuf ;
}
}
else
safe_delete_array ( query ) ;
if ( leaderbuf )
strcpy ( leaderbuf , " UNKNOWN " ) ;
if ( maintank )
maintank [ 0 ] = 0 ;
if ( assist )
assist [ 0 ] = 0 ;
if ( puller )
puller [ 0 ] = 0 ;
if ( marknpc )
marknpc [ 0 ] = 0 ;
return leaderbuf ;
}
void Database : : ClearGroupLeader ( uint32 gid ) {
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
2013-05-09 10:44:08 -04:00
char * query = 0 ;
if ( gid = = 0 ) { //clear all group leaders
2013-02-16 16:14:39 -08:00
if ( ! RunQuery ( query , MakeAnyLenString ( & query , " DELETE from group_leaders " ) , errbuf ) )
printf ( " Unable to clear group leaders: %s \n " , errbuf ) ;
} else { //clear a specific group leader
if ( ! RunQuery ( query , MakeAnyLenString ( & query , " DELETE from group_leaders where gid = %lu " , ( unsigned long ) gid ) , errbuf ) )
printf ( " Unable to clear group leader: %s \n " , errbuf ) ;
}
safe_delete_array ( query ) ;
}
2013-05-22 16:17:19 -04:00
bool FetchRowMap ( MYSQL_RES * result , std : : map < std : : string , std : : string > & rowmap )
2013-02-16 16:14:39 -08:00
{
MYSQL_FIELD * fields ;
MYSQL_ROW row ;
unsigned long num_fields , i ;
2013-05-09 10:44:08 -04:00
bool retval = false ;
2013-02-16 16:14:39 -08:00
rowmap . clear ( ) ;
2013-05-04 18:06:58 -07:00
if ( result & & ( num_fields = mysql_num_fields ( result ) ) & & ( row = mysql_fetch_row ( result ) ) ! = nullptr & & ( fields = mysql_fetch_fields ( result ) ) ! = nullptr ) {
2013-02-16 16:14:39 -08:00
retval = true ;
for ( i = 0 ; i < num_fields ; i + + ) {
rowmap [ fields [ i ] . name ] = ( row [ i ] ? row [ i ] : " " ) ;
}
}
return retval ;
}
uint8 Database : : GetAgreementFlag ( uint32 acctid )
{
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
char * query = 0 ;
MYSQL_RES * result ;
MYSQL_ROW row ;
if ( RunQuery ( query , MakeAnyLenString ( & query , " SELECT rulesflag FROM account WHERE id=%i " , acctid ) , errbuf , & result ) ) {
safe_delete_array ( query ) ;
if ( mysql_num_rows ( result ) = = 1 )
{
row = mysql_fetch_row ( result ) ;
uint8 flag = atoi ( row [ 0 ] ) ;
mysql_free_result ( result ) ;
return flag ;
}
}
else
{
safe_delete_array ( query ) ;
}
return 0 ;
}
void Database : : SetAgreementFlag ( uint32 acctid )
{
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
char * query = 0 ;
uint32 affected_rows = 0 ;
if ( ! RunQuery ( query , MakeAnyLenString ( & query , " UPDATE account SET rulesflag=1 where id=%i " , acctid ) , errbuf , 0 , & affected_rows ) ) {
safe_delete_array ( query ) ;
}
else
safe_delete_array ( query ) ;
}
void Database : : ClearRaid ( uint32 rid ) {
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
2013-05-09 10:44:08 -04:00
char * query = 0 ;
if ( rid = = 0 ) { //clear all raids
2013-02-16 16:14:39 -08:00
if ( ! RunQuery ( query , MakeAnyLenString ( & query , " delete from raid_members " ) , errbuf ) )
printf ( " Unable to clear raids: %s \n " , errbuf ) ;
} else { //clear a specific group
if ( ! RunQuery ( query , MakeAnyLenString ( & query , " delete from raid_members where raidid = %lu " , ( unsigned long ) rid ) , errbuf ) )
printf ( " Unable to clear raids: %s \n " , errbuf ) ;
}
safe_delete_array ( query ) ;
}
void Database : : ClearRaidDetails ( uint32 rid ) {
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
2013-05-09 10:44:08 -04:00
char * query = 0 ;
if ( rid = = 0 ) { //clear all raids
2013-02-16 16:14:39 -08:00
if ( ! RunQuery ( query , MakeAnyLenString ( & query , " delete from raid_details " ) , errbuf ) )
printf ( " Unable to clear raid details: %s \n " , errbuf ) ;
} else { //clear a specific group
if ( ! RunQuery ( query , MakeAnyLenString ( & query , " delete from raid_details where raidid = %lu " , ( unsigned long ) rid ) , errbuf ) )
printf ( " Unable to clear raid details: %s \n " , errbuf ) ;
}
safe_delete_array ( query ) ;
}
uint32 Database : : GetRaidID ( const char * name ) {
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
2013-05-09 10:44:08 -04:00
char * query = 0 ;
MYSQL_RES * result ;
2013-02-16 16:14:39 -08:00
MYSQL_ROW row ;
uint32 raidid = 0 ;
2013-05-06 13:07:41 -04:00
if ( RunQuery ( query , MakeAnyLenString ( & query , " SELECT raidid from raid_members where name='%s' " , name ) ,
2013-02-16 16:14:39 -08:00
errbuf , & result ) ) {
if ( ( row = mysql_fetch_row ( result ) ) )
{
if ( row [ 0 ] )
raidid = atoi ( row [ 0 ] ) ;
}
else
printf ( " Unable to get raid id, char not found! \n " ) ;
mysql_free_result ( result ) ;
}
else
printf ( " Unable to get raid id: %s \n " , errbuf ) ;
safe_delete_array ( query ) ;
return raidid ;
}
const char * Database : : GetRaidLeaderName ( uint32 rid )
{
static char name [ 128 ] ;
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
2013-05-09 10:44:08 -04:00
char * query = 0 ;
MYSQL_RES * result ;
2013-02-16 16:14:39 -08:00
MYSQL_ROW row ;
2013-05-06 13:07:41 -04:00
if ( RunQuery ( query , MakeAnyLenString ( & query , " SELECT name FROM raid_members WHERE raidid=%u AND israidleader=1 " ,
2013-02-16 16:14:39 -08:00
rid ) , errbuf , & result ) ) {
2013-05-04 18:06:58 -07:00
if ( ( row = mysql_fetch_row ( result ) ) ! = nullptr )
2013-02-16 16:14:39 -08:00
{
memset ( name , 0 , 128 ) ;
strcpy ( name , row [ 0 ] ) ;
mysql_free_result ( result ) ;
safe_delete_array ( query ) ;
return name ;
}
else
printf ( " Unable to get raid id, char not found! \n " ) ;
mysql_free_result ( result ) ;
}
else
printf ( " Unable to get raid id: %s \n " , errbuf ) ;
safe_delete_array ( query ) ;
return " UNKNOWN " ;
}
bool Database : : VerifyInstanceAlive ( uint16 instance_id , uint32 char_id )
{
//we are not saved to this instance so set our instance to 0
if ( ! GlobalInstance ( instance_id ) & & ! CharacterInInstanceGroup ( instance_id , char_id ) )
{
return false ;
}
if ( CheckInstanceExpired ( instance_id ) )
{
DeleteInstance ( instance_id ) ;
return false ;
}
return true ;
}
bool Database : : VerifyZoneInstance ( uint32 zone_id , uint16 instance_id )
{
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
char * query = 0 ;
MYSQL_RES * result ;
2014-02-13 11:24:54 -06:00
if ( RunQuery ( query , MakeAnyLenString ( & query , " SELECT id FROM instance_list where id=%u AND zone=%u " ,
2013-02-16 16:14:39 -08:00
instance_id , zone_id ) , errbuf , & result ) )
{
safe_delete_array ( query ) ;
2013-05-06 13:07:41 -04:00
if ( mysql_num_rows ( result ) ! = 0 )
2013-02-16 16:14:39 -08:00
{
mysql_free_result ( result ) ;
return true ;
}
else
{
mysql_free_result ( result ) ;
return false ;
}
}
2013-05-06 13:07:41 -04:00
else
2013-02-16 16:14:39 -08:00
{
safe_delete_array ( query ) ;
return false ;
}
return false ;
}
bool Database : : CharacterInInstanceGroup ( uint16 instance_id , uint32 char_id )
{
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
char * query = 0 ;
MYSQL_RES * result ;
bool lockout_instance_player = false ;
2014-02-13 11:24:54 -06:00
if ( RunQuery ( query , MakeAnyLenString ( & query , " SELECT charid FROM instance_list_player where id=%u AND charid=%u " ,
2013-02-16 16:14:39 -08:00
instance_id , char_id ) , errbuf , & result ) )
{
safe_delete_array ( query ) ;
2013-05-06 13:07:41 -04:00
if ( mysql_num_rows ( result ) = = 1 )
2013-02-16 16:14:39 -08:00
{
lockout_instance_player = true ;
}
mysql_free_result ( result ) ;
}
2013-05-06 13:07:41 -04:00
else
2013-02-16 16:14:39 -08:00
{
safe_delete_array ( query ) ;
}
return lockout_instance_player ;
}
void Database : : DeleteInstance ( uint16 instance_id )
{
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
char * query = 0 ;
2014-02-13 11:24:54 -06:00
RunQuery ( query , MakeAnyLenString ( & query , " DELETE FROM instance_list WHERE id=%u " , instance_id ) , errbuf ) ;
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
2014-02-13 11:24:54 -06:00
RunQuery ( query , MakeAnyLenString ( & query , " DELETE FROM instance_list_player WHERE id=%u " , instance_id ) , errbuf ) ;
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
RunQuery ( query , MakeAnyLenString ( & query , " DELETE FROM respawn_times WHERE instance_id=%u " , instance_id ) , errbuf ) ;
safe_delete_array ( query ) ;
RunQuery ( query , MakeAnyLenString ( & query , " DELETE FROM spawn_condition_values WHERE instance_id=%u " , instance_id ) , errbuf ) ;
safe_delete_array ( query ) ;
BuryCorpsesInInstance ( instance_id ) ;
}
bool Database : : CheckInstanceExpired ( uint16 instance_id )
{
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
char * query = 0 ;
MYSQL_RES * result ;
MYSQL_ROW row ;
2013-03-10 18:55:18 +00:00
int32 start_time = 0 ;
int32 duration = 0 ;
2013-02-16 16:14:39 -08:00
uint32 never_expires = 0 ;
2014-02-13 11:24:54 -06:00
if ( RunQuery ( query , MakeAnyLenString ( & query , " SELECT start_time, duration, never_expires FROM instance_list WHERE id=%u " ,
2013-02-16 16:14:39 -08:00
instance_id ) , errbuf , & result ) )
{
safe_delete_array ( query ) ;
2013-05-06 13:07:41 -04:00
if ( mysql_num_rows ( result ) ! = 0 )
2013-02-16 16:14:39 -08:00
{
row = mysql_fetch_row ( result ) ;
start_time = atoi ( row [ 0 ] ) ;
duration = atoi ( row [ 1 ] ) ;
never_expires = atoi ( row [ 2 ] ) ;
}
else
{
mysql_free_result ( result ) ;
return true ;
}
mysql_free_result ( result ) ;
}
2013-05-06 13:07:41 -04:00
else
2013-02-16 16:14:39 -08:00
{
safe_delete_array ( query ) ;
return true ;
}
if ( never_expires = = 1 )
{
return false ;
}
timeval tv ;
2013-05-04 18:06:58 -07:00
gettimeofday ( & tv , nullptr ) ;
2013-02-16 16:14:39 -08:00
if ( ( start_time + duration ) < = tv . tv_sec )
{
return true ;
}
return false ;
}
uint32 Database : : ZoneIDFromInstanceID ( uint16 instance_id )
{
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
char * query = 0 ;
MYSQL_RES * result ;
MYSQL_ROW row ;
uint32 ret ;
2014-02-13 11:24:54 -06:00
if ( RunQuery ( query , MakeAnyLenString ( & query , " SELECT zone FROM instance_list where id=%u " , instance_id ) ,
2013-02-16 16:14:39 -08:00
errbuf , & result ) )
{
safe_delete_array ( query ) ;
2013-05-06 13:07:41 -04:00
if ( mysql_num_rows ( result ) ! = 0 )
2013-02-16 16:14:39 -08:00
{
row = mysql_fetch_row ( result ) ;
ret = atoi ( row [ 0 ] ) ;
mysql_free_result ( result ) ;
2013-05-06 13:07:41 -04:00
return ret ;
2013-02-16 16:14:39 -08:00
}
else
{
mysql_free_result ( result ) ;
return 0 ;
}
}
2013-05-06 13:07:41 -04:00
else
2013-02-16 16:14:39 -08:00
{
safe_delete_array ( query ) ;
return 0 ;
}
return 0 ;
}
uint32 Database : : VersionFromInstanceID ( uint16 instance_id )
{
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
char * query = 0 ;
MYSQL_RES * result ;
MYSQL_ROW row ;
uint32 ret ;
2014-02-13 11:24:54 -06:00
if ( RunQuery ( query , MakeAnyLenString ( & query , " SELECT version FROM instance_list where id=%u " , instance_id ) ,
2013-02-16 16:14:39 -08:00
errbuf , & result ) )
{
safe_delete_array ( query ) ;
2013-05-06 13:07:41 -04:00
if ( mysql_num_rows ( result ) ! = 0 )
2013-02-16 16:14:39 -08:00
{
row = mysql_fetch_row ( result ) ;
ret = atoi ( row [ 0 ] ) ;
mysql_free_result ( result ) ;
2013-05-06 13:07:41 -04:00
return ret ;
2013-02-16 16:14:39 -08:00
}
else
{
mysql_free_result ( result ) ;
return 0 ;
}
}
2013-05-06 13:07:41 -04:00
else
2013-02-16 16:14:39 -08:00
{
safe_delete_array ( query ) ;
return 0 ;
}
return 0 ;
}
uint32 Database : : GetTimeRemainingInstance ( uint16 instance_id , bool & is_perma )
{
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
char * query = 0 ;
MYSQL_RES * result ;
MYSQL_ROW row ;
uint32 start_time = 0 ;
uint32 duration = 0 ;
uint32 never_expires = 0 ;
2014-02-13 11:24:54 -06:00
if ( RunQuery ( query , MakeAnyLenString ( & query , " SELECT start_time, duration, never_expires FROM instance_list WHERE id=%u " ,
2013-02-16 16:14:39 -08:00
instance_id ) , errbuf , & result ) )
{
safe_delete_array ( query ) ;
2013-05-06 13:07:41 -04:00
if ( mysql_num_rows ( result ) ! = 0 )
2013-02-16 16:14:39 -08:00
{
row = mysql_fetch_row ( result ) ;
start_time = atoi ( row [ 0 ] ) ;
duration = atoi ( row [ 1 ] ) ;
never_expires = atoi ( row [ 2 ] ) ;
}
else
{
mysql_free_result ( result ) ;
is_perma = false ;
return 0 ;
}
mysql_free_result ( result ) ;
}
2013-05-06 13:07:41 -04:00
else
2013-02-16 16:14:39 -08:00
{
safe_delete_array ( query ) ;
is_perma = false ;
return 0 ;
}
if ( never_expires = = 1 )
{
is_perma = true ;
return 0 ;
}
else
{
is_perma = false ;
}
timeval tv ;
2013-05-04 18:06:58 -07:00
gettimeofday ( & tv , nullptr ) ;
2013-02-16 16:14:39 -08:00
return ( ( start_time + duration ) - tv . tv_sec ) ;
}
bool Database : : GetUnusedInstanceID ( uint16 & instance_id )
{
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
char * query = 0 ;
MYSQL_RES * result ;
MYSQL_ROW row ;
2014-02-24 00:20:18 -06:00
uint32 count = RuleI ( Zone , ReservedInstances ) ;
2014-02-13 11:24:54 -06:00
uint32 max = 65535 ;
2014-02-24 00:20:18 -06:00
if ( RunQuery ( query , MakeAnyLenString ( & query , " SELECT IFNULL(MAX(id),%u)+1 FROM instance_list WHERE id > %u " , count , count ) , errbuf , & result ) ) {
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
2014-02-13 11:24:54 -06:00
if ( mysql_num_rows ( result ) ! = 0 ) {
2014-02-24 00:20:18 -06:00
row = mysql_fetch_row ( result ) ;
if ( atoi ( row [ 0 ] ) < = max ) {
count = atoi ( row [ 0 ] ) ;
2014-03-05 22:19:55 -06:00
mysql_free_result ( result ) ;
2014-02-24 00:20:18 -06:00
} else {
2014-03-05 22:19:55 -06:00
mysql_free_result ( result ) ;
2014-02-24 00:20:18 -06:00
if ( RunQuery ( query , MakeAnyLenString ( & query , " SELECT id FROM instance_list where id > %u ORDER BY id " , count ) , errbuf , & result ) ) {
safe_delete_array ( query ) ;
if ( mysql_num_rows ( result ) ! = 0 ) {
count + + ;
while ( ( row = mysql_fetch_row ( result ) ) ) {
if ( count < atoi ( row [ 0 ] ) ) {
instance_id = count ;
mysql_free_result ( result ) ;
return true ;
} else if ( count > max ) {
instance_id = 0 ;
mysql_free_result ( result ) ;
return false ;
} else {
count + + ;
}
}
} else {
instance_id = 0 ;
mysql_free_result ( result ) ;
return false ;
}
} else {
safe_delete_array ( query ) ;
2013-02-16 16:14:39 -08:00
instance_id = 0 ;
return false ;
}
}
2014-02-13 11:24:54 -06:00
} else {
2014-02-24 00:20:18 -06:00
instance_id = 0 ;
2013-02-16 16:14:39 -08:00
mysql_free_result ( result ) ;
2014-02-24 00:20:18 -06:00
return false ;
2013-02-16 16:14:39 -08:00
}
2014-02-13 11:24:54 -06:00
} else {
2013-02-16 16:14:39 -08:00
safe_delete_array ( query ) ;
2014-02-24 00:20:18 -06:00
instance_id = 0 ;
return false ;
2013-02-16 16:14:39 -08:00
}
instance_id = count ;
return true ;
}
//perhaps purge any expireds too
bool Database : : CreateInstance ( uint16 instance_id , uint32 zone_id , uint32 version , uint32 duration )
{
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
char * query = 0 ;
2014-02-13 11:24:54 -06:00
if ( RunQuery ( query , MakeAnyLenString ( & query , " INSERT INTO instance_list (id, zone, version, start_time, duration) "
2013-02-16 16:14:39 -08:00
" values(%lu, %lu, %lu, UNIX_TIMESTAMP(), %lu) " , ( unsigned long ) instance_id , ( unsigned long ) zone_id , ( unsigned long ) version , ( unsigned long ) duration ) , errbuf ) )
{
safe_delete_array ( query ) ;
return true ;
}
2013-05-06 13:07:41 -04:00
else
2013-02-16 16:14:39 -08:00
{
safe_delete_array ( query ) ;
return false ;
}
}
void Database : : PurgeExpiredInstances ( )
{
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
char * query = 0 ;
MYSQL_RES * result ;
MYSQL_ROW row ;
uint16 id = 0 ;
2014-02-13 11:24:54 -06:00
if ( RunQuery ( query , MakeAnyLenString ( & query , " SELECT id FROM instance_list where "
2013-02-16 16:14:39 -08:00
" (start_time+duration) <= UNIX_TIMESTAMP() and never_expires = 0 " ) , errbuf , & result ) )
{
safe_delete_array ( query ) ;
2013-05-06 13:07:41 -04:00
if ( mysql_num_rows ( result ) > 0 )
2013-02-16 16:14:39 -08:00
{
row = mysql_fetch_row ( result ) ;
2013-05-04 18:06:58 -07:00
while ( row ! = nullptr )
2013-02-16 16:14:39 -08:00
{
id = atoi ( row [ 0 ] ) ;
DeleteInstance ( id ) ;
row = mysql_fetch_row ( result ) ;
}
}
mysql_free_result ( result ) ;
}
2013-05-06 13:07:41 -04:00
else
2013-02-16 16:14:39 -08:00
{
safe_delete_array ( query ) ;
}
}
bool Database : : AddClientToInstance ( uint16 instance_id , uint32 char_id )
{
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
char * query = 0 ;
2014-02-13 11:24:54 -06:00
if ( RunQuery ( query , MakeAnyLenString ( & query , " INSERT INTO instance_list_player(id, charid) "
2013-02-16 16:14:39 -08:00
" values(%lu, %lu) " , ( unsigned long ) instance_id , ( unsigned long ) char_id ) , errbuf ) )
{
safe_delete_array ( query ) ;
return true ;
}
2013-05-06 13:07:41 -04:00
else
2013-02-16 16:14:39 -08:00
{
safe_delete_array ( query ) ;
return false ;
}
}
bool Database : : RemoveClientFromInstance ( uint16 instance_id , uint32 char_id )
{
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
char * query = 0 ;
2014-02-13 11:24:54 -06:00
if ( RunQuery ( query , MakeAnyLenString ( & query , " DELETE FROM instance_list_player WHERE id=%lu AND charid=%lu " ,
2013-02-16 16:14:39 -08:00
( unsigned long ) instance_id , ( unsigned long ) char_id ) , errbuf ) )
{
safe_delete_array ( query ) ;
return true ;
}
2013-05-06 13:07:41 -04:00
else
2013-02-16 16:14:39 -08:00
{
safe_delete_array ( query ) ;
return false ;
}
}
bool Database : : RemoveClientsFromInstance ( uint16 instance_id )
{
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
char * query = 0 ;
2014-02-13 11:24:54 -06:00
if ( RunQuery ( query , MakeAnyLenString ( & query , " DELETE FROM instance_list_player WHERE id=%lu " ,
2013-02-16 16:14:39 -08:00
( unsigned long ) instance_id ) , errbuf ) )
{
safe_delete_array ( query ) ;
return true ;
}
2013-05-06 13:07:41 -04:00
else
2013-02-16 16:14:39 -08:00
{
safe_delete_array ( query ) ;
return false ;
}
}
bool Database : : CheckInstanceExists ( uint16 instance_id )
{
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
char * query = 0 ;
MYSQL_RES * result ;
2014-02-13 11:24:54 -06:00
if ( RunQuery ( query , MakeAnyLenString ( & query , " SELECT * FROM instance_list where id=%u " , instance_id ) ,
2013-02-16 16:14:39 -08:00
errbuf , & result ) )
{
safe_delete_array ( query ) ;
2013-05-06 13:07:41 -04:00
if ( mysql_num_rows ( result ) ! = 0 )
2013-02-16 16:14:39 -08:00
{
mysql_free_result ( result ) ;
return true ;
}
mysql_free_result ( result ) ;
return false ;
}
2013-05-06 13:07:41 -04:00
else
2013-02-16 16:14:39 -08:00
{
safe_delete_array ( query ) ;
return false ;
}
return false ;
}
void Database : : BuryCorpsesInInstance ( uint16 instance_id )
{
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
char * query = 0 ;
MYSQL_RES * result ;
2013-05-06 13:07:41 -04:00
if ( RunQuery ( query , MakeAnyLenString ( & query , " UPDATE player_corpses SET IsBurried=1, instanceid=0 WHERE instanceid=%u " ,
2013-02-16 16:14:39 -08:00
instance_id ) , errbuf , & result ) )
{
mysql_free_result ( result ) ;
}
safe_delete_array ( query ) ;
}
uint16 Database : : GetInstanceVersion ( uint16 instance_id )
{
if ( instance_id < 1 )
return 0 ;
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
char * query = 0 ;
MYSQL_RES * result ;
MYSQL_ROW row ;
uint32 ret ;
2014-02-13 11:24:54 -06:00
if ( RunQuery ( query , MakeAnyLenString ( & query , " SELECT version FROM instance_list where id=%u " , instance_id ) ,
2013-02-16 16:14:39 -08:00
errbuf , & result ) )
{
safe_delete_array ( query ) ;
2013-05-06 13:07:41 -04:00
if ( mysql_num_rows ( result ) ! = 0 )
2013-02-16 16:14:39 -08:00
{
row = mysql_fetch_row ( result ) ;
ret = atoi ( row [ 0 ] ) ;
mysql_free_result ( result ) ;
2013-05-06 13:07:41 -04:00
return ret ;
2013-02-16 16:14:39 -08:00
}
else
{
mysql_free_result ( result ) ;
return 0 ;
}
}
2013-05-06 13:07:41 -04:00
else
2013-02-16 16:14:39 -08:00
{
safe_delete_array ( query ) ;
return 0 ;
}
return 0 ;
}
uint16 Database : : GetInstanceID ( const char * zone , uint32 charid , int16 version )
{
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
char * query = 0 ;
MYSQL_RES * result ;
MYSQL_ROW row ;
uint16 ret ;
2014-02-13 11:24:54 -06:00
if ( RunQuery ( query , MakeAnyLenString ( & query , " SELECT instance_list.id FROM instance_list, instance_list_player "
" WHERE instance_list.zone=%u AND instance_list.version=%u AND instance_list.id=instance_list_player.id AND "
" instance_list_player.charid=%u LIMIT 1; " , GetZoneID ( zone ) , version , charid , charid ) , errbuf , & result ) )
2013-02-16 16:14:39 -08:00
{
safe_delete_array ( query ) ;
2013-05-06 13:07:41 -04:00
if ( mysql_num_rows ( result ) ! = 0 )
2013-02-16 16:14:39 -08:00
{
row = mysql_fetch_row ( result ) ;
ret = atoi ( row [ 0 ] ) ;
mysql_free_result ( result ) ;
2013-05-06 13:07:41 -04:00
return ret ;
2013-02-16 16:14:39 -08:00
}
else
{
mysql_free_result ( result ) ;
return 0 ;
}
}
2013-05-06 13:07:41 -04:00
else
2013-02-16 16:14:39 -08:00
{
safe_delete_array ( query ) ;
return 0 ;
}
return 0 ;
}
uint16 Database : : GetInstanceID ( uint32 zone , uint32 charid , int16 version )
{
if ( ! zone )
return 0 ;
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
char * query = 0 ;
MYSQL_RES * result ;
MYSQL_ROW row ;
uint16 ret ;
2014-02-13 11:24:54 -06:00
if ( RunQuery ( query , MakeAnyLenString ( & query , " SELECT instance_list.id FROM instance_list, instance_list_player "
" WHERE instance_list.zone=%u AND instance_list.version=%u AND instance_list.id=instance_list_player.id AND "
" instance_list_player.charid=%u LIMIT 1; " , zone , version , charid ) , errbuf , & result ) )
2013-02-16 16:14:39 -08:00
{
safe_delete_array ( query ) ;
2013-05-06 13:07:41 -04:00
if ( mysql_num_rows ( result ) ! = 0 )
2013-02-16 16:14:39 -08:00
{
row = mysql_fetch_row ( result ) ;
ret = atoi ( row [ 0 ] ) ;
mysql_free_result ( result ) ;
2013-05-06 13:07:41 -04:00
return ret ;
2013-02-16 16:14:39 -08:00
}
else
{
mysql_free_result ( result ) ;
return 0 ;
}
}
2013-05-06 13:07:41 -04:00
else
2013-02-16 16:14:39 -08:00
{
safe_delete_array ( query ) ;
return 0 ;
}
return 0 ;
}
2014-01-18 23:34:16 -06:00
void Database : : GetCharactersInInstance ( uint16 instance_id , std : : list < uint32 > & charid_list ) {
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
char * query = 0 ;
MYSQL_RES * result ;
MYSQL_ROW row ;
2014-02-13 11:24:54 -06:00
if ( RunQuery ( query , MakeAnyLenString ( & query , " SELECT charid FROM instance_list_player WHERE id=%u " , instance_id ) , errbuf , & result ) ) {
2014-01-18 23:34:16 -06:00
safe_delete_array ( query ) ;
while ( ( row = mysql_fetch_row ( result ) ) )
{
charid_list . push_back ( atoi ( row [ 0 ] ) ) ;
}
mysql_free_result ( result ) ;
}
else {
LogFile - > write ( EQEMuLog : : Error , " Error in GetCharactersInInstace query '%s': %s " , query , errbuf ) ;
safe_delete_array ( query ) ;
}
}
2013-02-16 16:14:39 -08:00
void Database : : AssignGroupToInstance ( uint32 gid , uint32 instance_id )
{
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
char * query = 0 ;
MYSQL_RES * result ;
MYSQL_ROW row ;
uint32 zone_id = ZoneIDFromInstanceID ( instance_id ) ;
uint16 version = VersionFromInstanceID ( instance_id ) ;
2013-05-06 13:07:41 -04:00
if ( RunQuery ( query , MakeAnyLenString ( & query , " SELECT charid FROM group_id WHERE groupid=%u " , gid ) ,
2013-02-16 16:14:39 -08:00
errbuf , & result ) )
{
safe_delete_array ( query ) ;
2013-05-04 18:06:58 -07:00
while ( ( row = mysql_fetch_row ( result ) ) ! = nullptr )
2013-02-16 16:14:39 -08:00
{
uint32 charid = atoi ( row [ 0 ] ) ;
if ( GetInstanceID ( zone_id , charid , version ) = = 0 )
{
AddClientToInstance ( instance_id , charid ) ;
}
}
mysql_free_result ( result ) ;
}
2013-05-06 13:07:41 -04:00
else
2013-02-16 16:14:39 -08:00
{
safe_delete_array ( query ) ;
}
}
void Database : : AssignRaidToInstance ( uint32 rid , uint32 instance_id )
{
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
char * query = 0 ;
MYSQL_RES * result ;
MYSQL_ROW row ;
uint32 zone_id = ZoneIDFromInstanceID ( instance_id ) ;
uint16 version = VersionFromInstanceID ( instance_id ) ;
2013-05-06 13:07:41 -04:00
if ( RunQuery ( query , MakeAnyLenString ( & query , " SELECT charid FROM raid_members WHERE raidid=%u " , rid ) ,
2013-02-16 16:14:39 -08:00
errbuf , & result ) )
{
safe_delete_array ( query ) ;
2013-05-04 18:06:58 -07:00
while ( ( row = mysql_fetch_row ( result ) ) ! = nullptr )
2013-02-16 16:14:39 -08:00
{
uint32 charid = atoi ( row [ 0 ] ) ;
if ( GetInstanceID ( zone_id , charid , version ) = = 0 )
{
AddClientToInstance ( instance_id , charid ) ;
}
}
mysql_free_result ( result ) ;
}
2013-05-06 13:07:41 -04:00
else
2013-02-16 16:14:39 -08:00
{
safe_delete_array ( query ) ;
}
}
void Database : : FlagInstanceByGroupLeader ( uint32 zone , int16 version , uint32 charid , uint32 gid )
{
uint16 id = GetInstanceID ( zone , charid , version ) ;
if ( id ! = 0 )
return ;
char ln [ 128 ] ;
memset ( ln , 0 , 128 ) ;
strcpy ( ln , GetGroupLeadershipInfo ( gid , ln ) ) ;
uint32 l_charid = GetCharacterID ( ( const char * ) ln ) ;
uint16 l_id = GetInstanceID ( zone , l_charid , version ) ;
if ( l_id = = 0 )
return ;
AddClientToInstance ( l_id , charid ) ;
}
void Database : : FlagInstanceByRaidLeader ( uint32 zone , int16 version , uint32 charid , uint32 rid )
{
uint16 id = GetInstanceID ( zone , charid , version ) ;
if ( id ! = 0 )
return ;
uint32 l_charid = GetCharacterID ( GetRaidLeaderName ( rid ) ) ;
uint16 l_id = GetInstanceID ( zone , l_charid , version ) ;
if ( l_id = = 0 )
return ;
AddClientToInstance ( l_id , charid ) ;
}
void Database : : SetInstanceDuration ( uint16 instance_id , uint32 new_duration )
{
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
char * query = 0 ;
2014-02-13 11:24:54 -06:00
if ( RunQuery ( query , MakeAnyLenString ( & query , " UPDATE `instance_list` SET start_time=UNIX_TIMESTAMP(), "
2013-02-16 16:14:39 -08:00
" duration=%u WHERE id=%u " , new_duration , instance_id ) , errbuf ) )
{
safe_delete_array ( query ) ;
}
else
{
//error
safe_delete_array ( query ) ;
}
}
bool Database : : GlobalInstance ( uint16 instance_id )
{
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
char * query = 0 ;
MYSQL_RES * result ;
MYSQL_ROW row ;
bool ret ;
2014-02-13 11:24:54 -06:00
if ( RunQuery ( query , MakeAnyLenString ( & query , " SELECT is_global from instance_list where id=%u LIMIT 1 " , instance_id ) , errbuf , & result ) )
2013-02-16 16:14:39 -08:00
{
safe_delete_array ( query ) ;
row = mysql_fetch_row ( result ) ;
if ( row )
{
ret = ( atoi ( row [ 0 ] ) = = 1 ) ? true : false ;
}
else
{
mysql_free_result ( result ) ;
return false ;
}
}
2013-05-06 13:07:41 -04:00
else
2013-02-16 16:14:39 -08:00
{
safe_delete_array ( query ) ;
return false ;
}
return ret ;
}
void Database : : UpdateAdventureStatsEntry ( uint32 char_id , uint8 theme , bool win )
{
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
char * query = 0 ;
uint32 affected = 0 ;
std : : string field ;
if ( win )
{
switch ( theme )
{
case 1 :
{
field = " guk_wins " ;
break ;
}
case 2 :
{
field = " mir_wins " ;
break ;
}
case 3 :
{
field = " mmc_wins " ;
break ;
}
case 4 :
{
field = " ruj_wins " ;
break ;
}
case 5 :
{
field = " tak_wins " ;
break ;
}
default :
{
return ;
}
}
}
else
{
switch ( theme )
{
case 1 :
{
field = " guk_losses " ;
break ;
}
case 2 :
{
field = " mir_losses " ;
break ;
}
case 3 :
{
field = " mmc_losses " ;
break ;
}
case 4 :
{
field = " ruj_losses " ;
break ;
}
case 5 :
{
field = " tak_losses " ;
break ;
}
default :
{
return ;
}
}
}
if ( RunQuery ( query , MakeAnyLenString ( & query , " UPDATE `adventure_stats` SET %s=%s+1 WHERE player_id=%u " ,
2013-05-04 18:06:58 -07:00
field . c_str ( ) , field . c_str ( ) , char_id ) , errbuf , nullptr , & affected ) )
2013-02-16 16:14:39 -08:00
{
safe_delete_array ( query ) ;
}
else
{
//error
safe_delete_array ( query ) ;
}
if ( affected = = 0 )
{
if ( RunQuery ( query , MakeAnyLenString ( & query , " INSERT INTO `adventure_stats` SET %s=1, player_id=%u " ,
field . c_str ( ) , char_id ) , errbuf ) )
{
safe_delete_array ( query ) ;
}
else
{
//error
safe_delete_array ( query ) ;
}
}
}
2013-05-06 13:07:41 -04:00
bool Database : : GetAdventureStats ( uint32 char_id , uint32 & guk_w , uint32 & mir_w , uint32 & mmc_w , uint32 & ruj_w ,
2013-05-09 10:44:08 -04:00
uint32 & tak_w , uint32 & guk_l , uint32 & mir_l , uint32 & mmc_l , uint32 & ruj_l , uint32 & tak_l )
2013-02-16 16:14:39 -08:00
{
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
char * query = 0 ;
MYSQL_RES * result ;
MYSQL_ROW row ;
if ( RunQuery ( query , MakeAnyLenString ( & query , " SELECT `guk_wins`, `mir_wins`, `mmc_wins`, `ruj_wins`, `tak_wins`, "
2013-05-06 13:07:41 -04:00
" `guk_losses`, `mir_losses`, `mmc_losses`, `ruj_losses`, `tak_losses` FROM `adventure_stats` WHERE player_id=%u " ,
2013-02-16 16:14:39 -08:00
char_id ) , errbuf , & result ) )
{
safe_delete_array ( query ) ;
2013-05-04 18:06:58 -07:00
while ( ( row = mysql_fetch_row ( result ) ) ! = nullptr )
2013-02-16 16:14:39 -08:00
{
guk_w = atoi ( row [ 0 ] ) ;
mir_w = atoi ( row [ 1 ] ) ;
mmc_w = atoi ( row [ 2 ] ) ;
ruj_w = atoi ( row [ 3 ] ) ;
tak_w = atoi ( row [ 4 ] ) ;
guk_l = atoi ( row [ 5 ] ) ;
mir_l = atoi ( row [ 6 ] ) ;
mmc_l = atoi ( row [ 7 ] ) ;
ruj_l = atoi ( row [ 8 ] ) ;
tak_l = atoi ( row [ 9 ] ) ;
}
mysql_free_result ( result ) ;
return true ;
}
2013-05-06 13:07:41 -04:00
else
2013-02-16 16:14:39 -08:00
{
safe_delete_array ( query ) ;
return false ;
}
}
uint32 Database : : GetGuildDBIDByCharID ( uint32 char_id ) {
char errbuf [ MYSQL_ERRMSG_SIZE ] ;
char * query = 0 ;
MYSQL_RES * result ;
int retVal = 0 ;
if ( RunQuery ( query , MakeAnyLenString ( & query , " SELECT guild_id FROM guild_members WHERE char_id='%i' " , char_id ) , errbuf , & result ) ) {
if ( mysql_num_rows ( result ) = = 1 ) {
MYSQL_ROW row = mysql_fetch_row ( result ) ;
retVal = atoi ( row [ 0 ] ) ;
}
mysql_free_result ( result ) ;
}
else {
2013-05-22 16:17:19 -04:00
std : : cerr < < " Error in GetAccountIDByChar query ' " < < query < < " ' " < < errbuf < < std : : endl ;
2013-02-16 16:14:39 -08:00
}
safe_delete_array ( query ) ;
return retVal ;
}