Clone of UAS2 @ https://github.com/drudgedance/uas2

Database.cpp 102KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949
  1. /*
  2. * This file is part of UAS2.
  3. *
  4. * UAS2 is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License as published by
  6. * the Free Software Foundation; either version 2 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * UAS2 is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. * You should have received a copy of the GNU General Public License
  14. * along with UASv1; if not, write to the Free Software
  15. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  16. */
  17. /**
  18. * @file Database.cpp
  19. * Handles the general operations relating to the database.
  20. *
  21. * Includes the functionality to create accounts, create, delete, and load avatars,
  22. * and to initalize the Global Unique Identifier (GUID) values.
  23. */
  24. #include <winsock2.h>
  25. #include "DatFile.h"
  26. #include "Database.h"
  27. #include "WorldManager.h"
  28. #include "MasterServer.h"
  29. #define MAXBUFLEN MAX_PATH+32
  30. HENV cDatabase::m_hEnv = 0;
  31. HDBC cDatabase::m_hDBC = 0;
  32. HSTMT cDatabase::m_hStmt = 0;
  33. int cDatabase::wMaxModel = 0;
  34. char cDatabase::szModelName[1000][5];
  35. char cDatabase::szModelNumber[1000][3];
  36. char cDatabase::szDBIP[16];
  37. char cDatabase::szDBNAME[20];
  38. char cDatabase::szDBUSER[20];
  39. char cDatabase::szDBPASSWORD[20];
  40. int cDatabase::intDBType;
  41. /**
  42. * Loads the proper database driver based upon the selected database type.
  43. */
  44. void cDatabase::Load( )
  45. {
  46. char szDirBuff[MAX_PATH+1];
  47. SQLCHAR ConnStrIn[MAXBUFLEN];
  48. SQLCHAR ConnStrOut[MAXBUFLEN];
  49. SQLSMALLINT cbConnStrOut = 0;
  50. int index = GetCurrentDirectory(MAX_PATH, szDirBuff);
  51. if(szDirBuff[index] == '\\')
  52. szDirBuff[index] = '\n';
  53. //sprintf((char*)ConnStrIn, "FILEDSN=%s\\UAS_DB;", szDirBuff);
  54. switch(intDBType)
  55. {
  56. case 1:
  57. {
  58. sprintf((char*)ConnStrIn, "Driver={Microsoft Access Driver (*.mdb)};DBQ=%s;", cWorldManager::g_szAccessFile);//\\UASv1.2.mdb;", szDirBuff );
  59. break;
  60. }
  61. case 2:
  62. {
  63. sprintf((char*)ConnStrIn, "Driver={SQL Server};Server=%s;UserID=%s;Password=%s;Database=%s;", szDBIP,szDBUSER,szDBPASSWORD,szDBNAME);
  64. break;
  65. }
  66. case 3:
  67. {
  68. // sprintf((char*)ConnStrIn, "Driver={MySQL ODBC 3.51 Driver};Server=%s;User=%s;Password=%s;Database=%s;OPTION=3;", szDBIP,szDBUSER,szDBPASSWORD,szDBNAME);
  69. sprintf((char*)ConnStrIn, "Driver={MySQL ODBC 5.1 Driver};Server=%s;User=%s;Password=%s;Database=%s;OPTION=3;", szDBIP,szDBUSER,szDBPASSWORD,szDBNAME);
  70. break;
  71. }
  72. default:
  73. {
  74. sprintf((char*)ConnStrIn, "Driver={MySQL ODBC 5.1 Driver};Server=%s;User=%s;Password=%s;Database=%s;OPTION=3;", szDBIP,szDBUSER,szDBPASSWORD,szDBNAME);
  75. break;
  76. }
  77. }
  78. //
  79. RETCODE retcode;
  80. retcode = SQLAllocHandle(SQL_HANDLE_DBC, m_hEnv, (SQLHDBC FAR *)&m_hDBC); CHECKRETURN(1, SQL_HANDLE_DBC, m_hDBC, 1)
  81. retcode = SQLDriverConnect(m_hDBC, g_hWndMain, ConnStrIn, SQL_NTS, ConnStrOut, MAXBUFLEN, &cbConnStrOut, SQL_DRIVER_COMPLETE_REQUIRED ); CHECKRETURN(1, SQL_HANDLE_DBC, m_hDBC, 1)
  82. retcode = SQLAllocHandle( SQL_HANDLE_STMT, m_hDBC, &m_hStmt ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, 1)
  83. }
  84. void cDatabase::Unload( )
  85. {
  86. RETCODE retcode;
  87. retcode = SQLFreeHandle( SQL_HANDLE_STMT, m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  88. retcode = SQLDisconnect( m_hDBC ); CHECKRETURN( 1, SQL_HANDLE_DBC, m_hDBC, 1 )
  89. retcode = SQLFreeHandle( SQL_HANDLE_DBC, m_hDBC ); CHECKRETURN( 1, SQL_HANDLE_DBC, m_hDBC, 1 )
  90. }
  91. int cDatabase::InitializeSQLEnvironment( )
  92. {
  93. RETCODE retcode;
  94. retcode = SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &m_hEnv ); CHECKRETURN( 1, SQL_HANDLE_ENV, m_hEnv, 1 )
  95. retcode = SQLSetEnvAttr( m_hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER ); CHECKRETURN( 1, SQL_HANDLE_ENV, m_hEnv, 1 )
  96. return 0;
  97. }
  98. int cDatabase::FreeSQLEnvironment( )
  99. {
  100. RETCODE retcode = SQLFreeHandle( SQL_HANDLE_ENV, m_hEnv ); CHECKRETURN( 1, SQL_HANDLE_ENV, m_hEnv, 1 )
  101. return 0;
  102. }
  103. void cDatabase::SetupDB( int DBType, char* DBIP, char* DBNAME, char* DBUSER, char* DBPASSWORD )
  104. {
  105. memcpy(&szDBIP,DBIP,sizeof(szDBIP));
  106. memcpy(&szDBNAME,DBNAME,sizeof(szDBNAME));
  107. memcpy(&szDBUSER,DBUSER,sizeof(szDBUSER));
  108. memcpy(&szDBPASSWORD,DBPASSWORD,sizeof(szDBPASSWORD));
  109. intDBType = DBType;
  110. }
  111. void cDatabase::GetError( SQLSMALLINT type, SQLHANDLE *hptr )
  112. {
  113. SQLCHAR State[5];
  114. SQLINTEGER NativeError;
  115. SQLCHAR ErrorText[500];
  116. *ErrorText = 0;
  117. SQLGetDiagRec( type, *hptr, 1, State, &NativeError, ErrorText, 500, NULL );
  118. if(*ErrorText!=0)
  119. UpdateConsole( " <SQL> %s\r\n", ErrorText );
  120. }
  121. /**
  122. * Initializes the starting avatar GUID value.
  123. *
  124. * As GUIDs must be unique and persistent, saved avatars are consulted for their GUID values.
  125. * Database tables consulted: avatar.
  126. */
  127. void cDatabase::InitializeAvatarGUIDs( DWORD &dwGUIDCycle_Avatar )
  128. {
  129. char szCommand[100];
  130. RETCODE retcode;
  131. sprintf( szCommand, "SELECT MAX(AvatarGUID) FROM avatar;" );
  132. retcode = SQLPrepare( m_hStmt, (BYTE *)szCommand, SQL_NTS ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  133. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  134. retcode = SQLBindCol( m_hStmt, 1, SQL_C_ULONG, &dwGUIDCycle_Avatar, sizeof( DWORD ), NULL ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  135. retcode = SQLFetch( m_hStmt );
  136. if( retcode == SQL_NO_DATA )
  137. dwGUIDCycle_Avatar = 0x50000000;
  138. retcode = SQLCloseCursor( m_hStmt ); CHECKRETURN( 0, SQL_HANDLE_STMT, m_hStmt, NULL )
  139. retcode = SQLFreeStmt( m_hStmt, SQL_UNBIND ); CHECKRETURN( 0, SQL_HANDLE_STMT, m_hStmt, NULL )
  140. }
  141. /**
  142. * Initializes the starting item GUID value.
  143. *
  144. * As GUIDs must be unique and persistent, saved items are consulted for their GUID values.
  145. * Database tables consulted: items_instance_inventory and items_instance_ground.
  146. */
  147. void cDatabase::InitializeObjectGUIDs( DWORD &dwGUIDCycle_Object )
  148. {
  149. DWORD dwTempGUID = 0x80670000;
  150. char szCommand[100];
  151. RETCODE retcode;
  152. sprintf( szCommand, "SELECT MAX(GUID) FROM items_instance_inventory;" );
  153. retcode = SQLPrepare( m_hStmt, (BYTE *)szCommand, SQL_NTS ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  154. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  155. retcode = SQLBindCol( m_hStmt, 1, SQL_C_ULONG, &dwTempGUID, sizeof( DWORD ), NULL ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  156. retcode = SQLFetch( m_hStmt );
  157. retcode = SQLCloseCursor( m_hStmt ); CHECKRETURN( 0, SQL_HANDLE_STMT, m_hStmt, NULL )
  158. retcode = SQLFreeStmt( m_hStmt, SQL_UNBIND );
  159. dwGUIDCycle_Object = dwTempGUID;
  160. sprintf( szCommand, "SELECT MAX(GUID) FROM items_instance_ground;" );
  161. retcode = SQLPrepare( m_hStmt, (BYTE *)szCommand, SQL_NTS ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  162. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  163. retcode = SQLBindCol( m_hStmt, 1, SQL_C_ULONG, &dwTempGUID, sizeof( DWORD ), NULL ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  164. retcode = SQLFetch( m_hStmt );
  165. retcode = SQLCloseCursor( m_hStmt ); CHECKRETURN( 0, SQL_HANDLE_STMT, m_hStmt, NULL )
  166. retcode = SQLFreeStmt( m_hStmt, SQL_UNBIND );
  167. if( dwTempGUID > dwGUIDCycle_Object )
  168. dwGUIDCycle_Object = dwTempGUID;
  169. }
  170. /**
  171. * Initializes the starting allegiance ID value.
  172. */
  173. void cDatabase::InitializeAllegIDs( DWORD &dwIDAllegiance )
  174. {
  175. DWORD dwTempGUID = 0x0L;
  176. char szCommand[100];
  177. RETCODE retcode;
  178. sprintf( szCommand, "SELECT MAX(AllegianceID) FROM allegiance;" );
  179. retcode = SQLPrepare( m_hStmt, (BYTE *)szCommand, SQL_NTS ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  180. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  181. retcode = SQLBindCol( m_hStmt, 1, SQL_C_ULONG, &dwTempGUID, sizeof( DWORD ), NULL ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  182. retcode = SQLFetch( m_hStmt );
  183. retcode = SQLCloseCursor( m_hStmt ); CHECKRETURN( 0, SQL_HANDLE_STMT, m_hStmt, NULL )
  184. retcode = SQLFreeStmt( m_hStmt, SQL_UNBIND );
  185. if( dwTempGUID > dwIDAllegiance )
  186. dwIDAllegiance = dwTempGUID;
  187. }
  188. /**
  189. * Verifies the acount login information.
  190. */
  191. BOOL cDatabase::VerifyAccount( char* szUserName, char* szPassword, DWORD &dwAccountID, BOOL fCreate )
  192. {
  193. BOOL fNoRecords = FALSE;
  194. char Command[200];
  195. char szDBPassword[45];
  196. RETCODE retcode;
  197. sprintf( Command, "SELECT ID, Password FROM account WHERE UserName='%s';", szUserName );
  198. retcode = SQLPrepare( m_hStmt, (unsigned char *)Command, SQL_NTS ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  199. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  200. retcode = SQLBindCol( m_hStmt, 1, SQL_C_ULONG, &dwAccountID, sizeof( DWORD ), NULL ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  201. retcode = SQLBindCol( m_hStmt, 2, SQL_C_CHAR, szDBPassword, sizeof( szDBPassword ), NULL ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  202. retcode = SQLFetch( m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  203. if ( retcode == SQL_NO_DATA )
  204. fNoRecords = TRUE;
  205. retcode = SQLCloseCursor( m_hStmt ); CHECKRETURN( 0, SQL_HANDLE_STMT, m_hStmt, NULL )
  206. retcode = SQLFreeStmt( m_hStmt, SQL_UNBIND ); CHECKRETURN( 0, SQL_HANDLE_STMT, m_hStmt, NULL )
  207. if( fNoRecords )
  208. {
  209. if( fCreate )
  210. if( CreateAccount( szUserName, szPassword, dwAccountID ) )
  211. return TRUE;
  212. }
  213. else if( lstrcmpi( szPassword, szDBPassword ) == 0 )
  214. return TRUE;
  215. return FALSE;
  216. }
  217. /**
  218. * Creates a new account. A given account may create several characters on a given server.
  219. */
  220. BOOL cDatabase::CreateAccount( char* szUserName, char* szPassword, DWORD &dwAccountID )
  221. {
  222. UpdateConsole( " <SQL> Creating account ...\r\n" );
  223. BOOL fVerify = TRUE;
  224. char Command[200];
  225. RETCODE retcode;
  226. sprintf( Command, "INSERT INTO Account (UserName, Password) VALUES ('%s', '%s');", szUserName, szPassword );
  227. retcode = SQLPrepare( m_hStmt, (unsigned char *)Command, SQL_NTS ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  228. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  229. if( retcode == SQL_ERROR )
  230. fVerify = FALSE;
  231. retcode = SQLFreeStmt( m_hStmt, SQL_CLOSE ); CHECKRETURN( 0, SQL_HANDLE_STMT, m_hStmt, 1 )
  232. if( fVerify )
  233. return VerifyAccount( szUserName, szPassword, dwAccountID, FALSE );
  234. else
  235. return FALSE;
  236. }
  237. /**
  238. * Loads the list of avatars for a given account.
  239. * Used to send the client a list of its current characters.
  240. */
  241. void cDatabase::LoadAvatarList( DWORD dwAccountID, std::vector< cAvatarList > &AvatarList )
  242. {
  243. AvatarList.clear( );
  244. char szCommand[200];
  245. char szName[75];
  246. BYTE bAccessLevel;
  247. DWORD dwGUID;
  248. DWORD dwOwnerID;
  249. RETCODE retcode;
  250. sprintf( szCommand, "SELECT AvatarGUID, OwnerID, Name, AccessLevel FROM avatar WHERE OwnerID=%d;", dwAccountID );
  251. retcode = SQLPrepare( m_hStmt, (unsigned char *)szCommand, SQL_NTS); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  252. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  253. retcode = SQLBindCol( m_hStmt, 1, SQL_C_ULONG, &dwGUID, sizeof( DWORD ), NULL ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  254. retcode = SQLBindCol( m_hStmt, 2, SQL_C_ULONG, &dwOwnerID, sizeof( DWORD ), NULL ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  255. retcode = SQLBindCol( m_hStmt, 3, SQL_C_CHAR, szName, sizeof( szName ), NULL ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  256. retcode = SQLBindCol( m_hStmt, 4, SQL_C_USHORT, &bAccessLevel, sizeof( BYTE ), NULL ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  257. cAvatarList cAL;
  258. for ( int i = 0; SQLFetch( m_hStmt ) == SQL_SUCCESS; ++i )
  259. {
  260. cAL.m_dwGUID = dwGUID;
  261. cAL.m_dwOwnerID = dwOwnerID;
  262. cAL.m_strName.assign( ReturnNamePrefix( bAccessLevel ) );
  263. cAL.m_strName.append( szName );
  264. AvatarList.push_back( cAL );
  265. }
  266. retcode = SQLCloseCursor( m_hStmt ); CHECKRETURN( 0, SQL_HANDLE_STMT, m_hStmt, NULL )
  267. retcode = SQLFreeStmt( m_hStmt, SQL_UNBIND ); CHECKRETURN( 0, SQL_HANDLE_STMT, m_hStmt, NULL )
  268. }
  269. /**
  270. * Creates the database information for a newly created avatar.
  271. *
  272. * The following tables are populated:
  273. * avatar, avatar_skills, avatar_clothing_palettes, avatar_location, avatar_spells.
  274. */
  275. BOOL cDatabase::CreateAvatar( DWORD dwAccountID, CreateCharacterMessage &ccm, DWORD &dwNewAvatarGUID )
  276. {
  277. char szCommand[2048];
  278. RETCODE retcode;
  279. BOOL fAlreadyExists = TRUE;
  280. sprintf( szCommand, "SELECT ID FROM avatar WHERE Name='%s';", ccm.szName );
  281. retcode = SQLPrepare( m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  282. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  283. retcode = SQLFetch(m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  284. if( retcode == SQL_NO_DATA )
  285. fAlreadyExists = FALSE;
  286. retcode = SQLCloseCursor( m_hStmt ); CHECKRETURN( 0, SQL_HANDLE_STMT, m_hStmt, NULL )
  287. if( !fAlreadyExists )
  288. {
  289. dwNewAvatarGUID = cWorldManager::NewGUID_Avatar();
  290. //sprintf( szCommand, "INSERT INTO Avatar (AvatarGUID, OwnerID, Name, wModelNum, Race, Sex, SkinShade, HairColor, HairShade, HairStyle, EyeColor, Forehead, Nose, Chin, Class, Strength, StrengthBase, Endurance, EnduranceBase, Coordination, CoordinationBase, Quickness, QuicknessBase, Focus, FocusBase, Self, SelfBase, Birth) VALUES (%d, %d, '%s', 1, %d, %d, %f, %d, %f, %d, %d, %d, %d, %d, %d, 0, %d, 0, %d, 0, %d, 0, %d, 0, %d, 0, %d, %lu);"
  291. // , dwNewAvatarGUID, dwAccountID, ccm.szName, ccm.dwRace, ccm.dwSex, ccm.dblSkinShade, ccm.dwHairColor, ccm.dblHairShade, ccm.dwHairStyle, ccm.dwEyeColor, ccm.dwForeheadTexture, ccm.dwNoseTexture, ccm.dwChinTexture, ccm.dwProfession, ccm.dwStrength, ccm.dwEndurance, ccm.dwCoordination, ccm.dwQuickness, ccm.dwFocus, ccm.dwSelf, time(NULL) );
  292. sprintf( szCommand, "INSERT INTO Avatar (AvatarGUID, OwnerID, Name, wModelNum, Race, Sex, SkinShade, HairColor, HairShade, HairStyle, EyeColor, Forehead, Nose, Chin, Class, Strength, StrengthBase, Endurance, EnduranceBase, Coordination, CoordinationBase, Quickness, QuicknessBase, Focus, FocusBase, Self, SelfBase) VALUES (%d, %d, '%s', 1, %d, %d, %f, %d, %f, %d, %d, %d, %d, %d, %d, 0, %d, 0, %d, 0, %d, 0, %d, 0, %d, 0, %d);"
  293. , dwNewAvatarGUID, dwAccountID, ccm.szName, ccm.dwRace, ccm.dwSex, ccm.dblSkinShade, ccm.dwHairColor, ccm.dblHairShade, ccm.dwHairStyle, ccm.dwEyeColor, ccm.dwForeheadTexture, ccm.dwNoseTexture, ccm.dwChinTexture, ccm.dwProfession, ccm.dwStrength, ccm.dwEndurance, ccm.dwCoordination, ccm.dwQuickness, ccm.dwFocus, ccm.dwSelf );
  294. retcode = SQLPrepare( m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  295. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  296. retcode = SQLFreeStmt( m_hStmt, SQL_CLOSE ); CHECKRETURN( 0, SQL_HANDLE_STMT, m_hStmt, 1 )
  297. std::ostringstream ss;
  298. ss << "INSERT INTO avatar_skills (AvatarGUID, AxeStatus, BowStatus, CrossbowStatus, DaggerStatus, MaceStatus, MeleeDefenseStatus, MissileDefenseStatus, SpearStatus, StaffStatus, SwordStatus, ThrownWeaponsStatus, UnarmedCombatStatus, ArcaneLoreStatus, MagicDefenseStatus, ManaConversionStatus, AppraiseItemStatus, AssessPersonStatus, DeceptionStatus, HealingStatus, JumpStatus, LockpickStatus, RunStatus, AssessCreatureStatus, AppraiseWeaponStatus, AppraiseArmorStatus, AppraiseMagicItemStatus, CreatureEnchantmentStatus, ItemEnchantmentStatus, LifeMagicStatus, WarMagicStatus, LeadershipStatus, LoyaltyStatus, FletchingStatus, AlchemyStatus, CookingStatus) VALUES (" << dwNewAvatarGUID;
  299. for( int i=1; i<0x28; i++ )
  300. {
  301. //Cubem0j0: These are the Unknown skills
  302. if( (i==0x8) || (i==0x11) || (i==0x19) || (i==0x1A) )
  303. continue;
  304. else
  305. ss << ", " << ccm.dwSkillStatus[i];
  306. }
  307. ss << ");";
  308. retcode = SQLPrepare( m_hStmt, (unsigned char *)ss.str().c_str(), SQL_NTS ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  309. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  310. retcode = SQLFreeStmt( m_hStmt, SQL_CLOSE ); CHECKRETURN( 0, SQL_HANDLE_STMT, m_hStmt, 1 )
  311. /** Determine New Avatar Clothing **/
  312. /*
  313. 0x00000001 - blue-green
  314. 0x00000002 - teal
  315. 0x00000003 - violet
  316. 0x00000004 - light brown
  317. 0x00000005 - blue
  318. 0x00000006 - dark brown
  319. 0x00000007 - dark green
  320. 0x00000008 - light green
  321. 0x00000009 - white/gray/black
  322. 0x0000000A - turquoise
  323. 0x0000000B - magenta
  324. 0x0000000C - purple-blue
  325. 0x0000000D - purple
  326. 0x0000000E - red-brown
  327. 0x0000000F - dark purple
  328. 0x00000010 - brown
  329. 0x00000011 - yellow
  330. 0x00000012 - gold
  331. */
  332. DWORD apparelTypes[4] = { ccm.dwHatType,ccm.dwShirtType,ccm.dwPantsType,ccm.dwShoeType };
  333. DWORD apparelColors[4] = { ccm.dwHatColor,ccm.dwShirtColor,ccm.dwPantsColor,ccm.dwShoeColor };
  334. double apparelShades[4] = { ccm.dblHatShade,ccm.dblShirtShade,ccm.dblPantsShade,ccm.dblShoeShade };
  335. DWORD apparelModelNums[4];
  336. switch (ccm.dwRace)
  337. {
  338. case CHARDATA_RACE_ALUVIAN:
  339. {
  340. /* Aluvian
  341. Headgear:
  342. 0xFFFFFFFF - None
  343. 0x00000000 - Cloth Cap
  344. 0x00000001 - Cloth Cowl
  345. Shirt:
  346. 0x00000000 - Shirt
  347. 0x00000001 - Tunic
  348. 0x00000002 - Baggy Shirt
  349. 0x00000003 - Baggy Tunic
  350. 0x00000004 - Doublet
  351. 0x00000005 - Smock
  352. Trousers:
  353. 0x00000000 - Wide Breeches
  354. 0x00000001 - Trousers
  355. 0x00000002 - Pants
  356. Footwear:
  357. 0x00000000 - Leather Boots
  358. 0x00000001 - Shoes
  359. */
  360. switch (ccm.dwHatType)
  361. {
  362. case 0xFFFFFFFF: break;
  363. case 0x00000000: apparelModelNums[0] = 1973; break;
  364. case 0x00000001: apparelModelNums[0] = 1974; break;
  365. }
  366. switch (ccm.dwShirtType)
  367. {
  368. case 0x00000000: apparelModelNums[1] = 1972; break;
  369. case 0x00000001: apparelModelNums[1] = 1979; break;
  370. case 0x00000002: apparelModelNums[1] = 1934; break;
  371. case 0x00000003: apparelModelNums[1] = 1980; break;
  372. case 0x00000004: apparelModelNums[1] = 1935; break;
  373. case 0x00000005: apparelModelNums[1] = 1970; break;
  374. }
  375. switch (ccm.dwPantsType)
  376. {
  377. case 0x00000000: apparelModelNums[2] = 1971; break;
  378. case 0x00000001: apparelModelNums[2] = 1978; break;
  379. case 0x00000002: apparelModelNums[2] = 1977; break;
  380. }
  381. switch (ccm.dwShoeType)
  382. {
  383. case 0x00000000: apparelModelNums[3] = 1976; break;
  384. case 0x00000001: apparelModelNums[3] = 1975; break;
  385. }
  386. break;
  387. }
  388. case CHARDATA_RACE_GHARU:
  389. {
  390. /* Gharu'ndim
  391. Headgear:
  392. 0xFFFFFFFF - None
  393. 0x00000000 - Fez
  394. 0x00000001 - Qafiya
  395. 0x00000002 - Turban
  396. Shirt:
  397. 0x00000000 - Baggy Tunic
  398. 0x00000001 - Jerkin
  399. 0x00000002 - Loose Shirt
  400. 0x00000003 - Puffy Shirt
  401. 0x00000004 - Puffy Tunic
  402. 0x00000005 - Smock
  403. Trousers:
  404. 0x00000000 - Baggy Breeches
  405. 0x00000001 - Baggy Pants
  406. 0x00000002 - Pantaloons
  407. Footwear:
  408. 0x00000000 - Leather Boots
  409. 0x00000001 - Slippers
  410. */
  411. switch (ccm.dwHatType)
  412. {
  413. case 0xFFFFFFFF: break;
  414. case 0x00000000: apparelModelNums[0] = 1941; break;
  415. case 0x00000001: apparelModelNums[0] = 1936; break;
  416. case 0x00000002: apparelModelNums[0] = 1944; break;
  417. }
  418. switch (ccm.dwShirtType)
  419. {
  420. case 0x00000000: apparelModelNums[1] = 1980; break;
  421. case 0x00000001: apparelModelNums[1] = 1937; break;
  422. case 0x00000002: apparelModelNums[1] = 1942; break;
  423. case 0x00000003: apparelModelNums[1] = 1945; break;
  424. case 0x00000004: apparelModelNums[1] = 1946; break;
  425. case 0x00000005: apparelModelNums[1] = 1970; break;
  426. }
  427. switch (ccm.dwPantsType)
  428. {
  429. case 0x00000000: apparelModelNums[2] = 1940; break;
  430. case 0x00000001: apparelModelNums[2] = 1938; break;
  431. case 0x00000002: apparelModelNums[2] = 1943; break;
  432. }
  433. switch (ccm.dwShoeType)
  434. {
  435. case 0x00000000: apparelModelNums[3] = 1976; break;
  436. case 0x00000001: apparelModelNums[3] = 1939; break;
  437. }
  438. break;
  439. }
  440. case CHARDATA_RACE_SHO:
  441. {
  442. /* Sho
  443. Headgear:
  444. 0xFFFFFFFF - None
  445. 0x00000000 - Cloth Cap
  446. 0x00000001 - Kasa
  447. Shirt:
  448. 0x00000000 - Baggy Shirt
  449. 0x00000001 - Doublet
  450. 0x00000002 - Flared Shirt
  451. 0x00000003 - Flared Tunic
  452. 0x00000004 - Loose Shirt
  453. 0x00000005 - Loose Tunic
  454. Trousers:
  455. 0x00000000 - Flared Pants
  456. 0x00000001 - Loose Breeches
  457. 0x00000002 - Loose Pants
  458. Footwear:
  459. 0x00000000 - Leather Boots
  460. 0x00000001 - Shoes
  461. */
  462. switch (ccm.dwHatType)
  463. {
  464. case 0xFFFFFFFF: break;
  465. case 0x00000000: apparelModelNums[0] = 1973; break;
  466. case 0x00000001: apparelModelNums[0] = 1948; break;
  467. }
  468. switch (ccm.dwShirtType)
  469. {
  470. case 0x00000000: apparelModelNums[1] = 1934; break;
  471. case 0x00000001: apparelModelNums[1] = 1935; break;
  472. case 0x00000002: apparelModelNums[1] = 1950; break;
  473. case 0x00000003: apparelModelNums[1] = 1952; break;
  474. case 0x00000004: apparelModelNums[1] = 1942; break;
  475. case 0x00000005: apparelModelNums[1] = 1953; break;
  476. }
  477. switch (ccm.dwPantsType)
  478. {
  479. case 0x00000000: apparelModelNums[2] = 1947; break;
  480. case 0x00000001: apparelModelNums[2] = 1949; break;
  481. case 0x00000002: apparelModelNums[2] = 1951; break;
  482. }
  483. switch (ccm.dwShoeType)
  484. {
  485. case 0x00000000: apparelModelNums[3] = 1976; break;
  486. case 0x00000001: apparelModelNums[3] = 1975; break;
  487. }
  488. break;
  489. }
  490. }
  491. cItemModels *pcModel;
  492. cClothes *aClothes;
  493. for (int apparelIndex = 0; apparelIndex < 4; ++apparelIndex)
  494. {
  495. if (apparelTypes[apparelIndex] != 0xFFFFFFFF) //No clothing = 0xFFFFFFFF (-1)
  496. {
  497. pcModel = cItemModels::FindModel(apparelModelNums[apparelIndex]);
  498. aClothes = new cClothes(cWorldManager::NewGUID_Object(),dwNewAvatarGUID,apparelModelNums[apparelIndex],1.0,TRUE,0x0000,pcModel->m_strName,pcModel->m_strDescription,pcModel->m_dwValue, pcModel->m_wBurden);
  499. if (ccm.dwSex == 0) //female
  500. cPortalDat::LoadItemModel(aClothes, 0x0200004E, apparelColors[apparelIndex], apparelShades[apparelIndex]);
  501. else //male
  502. cPortalDat::LoadItemModel(aClothes, 0x02000001, apparelColors[apparelIndex], apparelShades[apparelIndex]);
  503. aClothes->m_dwOwnerID = dwNewAvatarGUID;
  504. aClothes->m_fEquipped = 2;
  505. aClothes->m_intColor = apparelColors[apparelIndex];
  506. char data[512];
  507. sprintf (data, "%d %d %d %d %s",apparelModelNums[apparelIndex],1,aClothes->m_intColor,aClothes->m_wIcon,"0");
  508. char szCommand[512];
  509. RETCODE retcode;
  510. sprintf( szCommand, "INSERT INTO items_instance_inventory (GUID, OwnerGUID, Equipped, Data) VALUES(%lu, %lu, %d, '%s');",aClothes->GetGUID(),dwNewAvatarGUID,2,data);
  511. retcode = SQLPrepare( cDatabase::m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  512. retcode = SQLExecute( cDatabase::m_hStmt ); CHECKRETURN(0, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  513. retcode = SQLFreeStmt( cDatabase::m_hStmt, SQL_CLOSE );
  514. for (int paletteIndex = 0; paletteIndex < aClothes->m_bWearPaletteChange; ++paletteIndex)
  515. {
  516. sprintf( szCommand, "INSERT INTO avatar_clothing_palettes ( ObjectGUID,VectorCount,NewPalette,Offset,Length ) VALUES (%lu,%d,'%04x','%02x','%02x');",aClothes->GetGUID(),paletteIndex+1,aClothes->m_WearVectorPal[paletteIndex].m_wNewPalette,aClothes->m_WearVectorPal[paletteIndex].m_ucOffset,aClothes->m_WearVectorPal[paletteIndex].m_ucLength );
  517. retcode = SQLPrepare( m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  518. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  519. retcode = SQLFreeStmt( m_hStmt, SQL_CLOSE );
  520. }
  521. }
  522. }
  523. //***********************Starting Locations***********************
  524. //*****AC:DM*****
  525. // 0 - Holtburg South: Landblock: A9B00014 X: 56.065 Y: 94.537 Z: 64.929 W: -0.985335 X: 0 Y: 0 Z: -0.170631
  526. // 0 - Holtburg South: Landblock: A9B00015 X: 63.333 Y: 104.547 Z: 64.574 W: -0.860791 X: 0 Y: 0 Z: -0.508959
  527. // 1 - Holtburg West: Landblock: A5B4002A X: 125.1 Y: 30.476 Z: 53.467 W: 0.983105 X: 0 Y: 0 Z: -0.183042
  528. // 1 - Holtburg West: Landblock: A5B40032 X: 144.833 Y: 33.441 Z: 52.005 W: -0.95051 X: 0 Y: 0 Z: -0.310693
  529. // 2 - Shoushi Southeast: Landblock: DE51001D X: 76.396 Y: 103.326 Z: 16.005 W: -0.990424 X: 0 Y: 0 Z: -0.138058
  530. // 2 - Shoushi Southeast: Landblock: DE51001D X: 87.589 Y: 101.218 Z: 15.144 W: -0.955041 X: 0 Y: 0 Z: -0.296475
  531. // 3 - Shoushi West: Landblock: D6550023 X: 97.4 Y: 63.8 Z: 52.005 W: 0.878817 X: 0 Y: 0 Z: -0.477159
  532. // 3 - Shoushi West: Landblock: D6550023 X: 107.8 Y: 61.7 Z: 52.005 W: 0.999048 X: 0 Y: 0 Z: -0.76041
  533. // 4 - Yaraq North: Landblock: 7D680012 X: 52.204 Y: 37.99 Z: 16.343 W: 0.335353 X: 0 Y: 0 Z: -0.942093
  534. // 4 - Yaraq North: Landblock: 7D680012 X: 60.712 Y: 37.987 Z: 16.343 W: 0.215281 X: 0 Y: 0 Z: -0.976552
  535. // 5 - Yaraq East: Landblock: 8164000D X: 32.599 Y: 103.123 Z: 30.734 W: -0.924113 X: 0 Y: 0 Z: -0.382119
  536. // 5 - Yaraq East: Landblock: 8164000D X: 37.984 Y: 111.845 Z: 31.166 W: -0.846806 X: 0 Y: 0 Z: -0.531901
  537. //*****AC:ToD*****
  538. // 0 - Holtburg: Landblock: 860201AD X: 41451E4F Y: C1E3DB23 Z: 3BA3D70A W: 3EAD8A54 X: 00000000 Y: 00000000 Z: 3F70DBA7
  539. // 0 - Holtburg: Landblock: 860301AD X: 41451E4F Y: C1E3DB23 Z: 3BA3D70A W: 3EAD8A54 X: 00000000 Y: 00000000 Z: 3F70DBA7
  540. // 0 - Holtburg: Landblock: 860401AD X: 41451E4F Y: C1E3DB23 Z: 3BA3D70A W: 3EAD8A54 X: 00000000 Y: 00000000 Z: 3F70DBA7
  541. // 0 - Holtburg: Landblock: 870201AD X: 41451E4F Y: C1E3DB23 Z: 3BA3D70A W: 3EAD8A54 X: 00000000 Y: 00000000 Z: 3F70DBA7
  542. // 0 - Holtburg: Landblock: 870301AD X: 41451E4F Y: C1E3DB23 Z: 3BA3D70A W: 3EAD8A54 X: 00000000 Y: 00000000 Z: 3F70DBA7
  543. // 1 - Shoushi: Landblock: 7F0301AD X: 41451E4F Y: C1E3DB23 Z: 3BA3D70A W: 3EAD8A54 X: 00000000 Y: 00000000 Z: 3F70DBA7
  544. // 1 - Shoushi: Landblock: 7F0401AD X: 41451E4F Y: C1E3DB23 Z: 3BA3D70A W: 3EAD8A54 X: 00000000 Y: 00000000 Z: 3F70DBA7
  545. // 1 - Shoushi: Landblock: 800201AD X: 41451E4F Y: C1E3DB23 Z: 3BA3D70A W: 3EAD8A54 X: 00000000 Y: 00000000 Z: 3F70DBA7
  546. // 1 - Shoushi: Landblock: 800301AD X: 41451E4F Y: C1E3DB23 Z: 3BA3D70A W: 3EAD8A54 X: 00000000 Y: 00000000 Z: 3F70DBA7
  547. // 1 - Shoushi: Landblock: 800401AD X: 41451E4F Y: C1E3DB23 Z: 3BA3D70A W: 3EAD8A54 X: 00000000 Y: 00000000 Z: 3F70DBA7
  548. // 2 - Yaraq: Landblock: 8C0401AD X: 41451E4F Y: C1E3DB23 Z: 3BA3D70A W: 3EAD8A54 X: 00000000 Y: 00000000 Z: 3F70DBA7
  549. // 2 - Yaraq: Landblock: 8D0201AD X: 41451E4F Y: C1E3DB23 Z: 3BA3D70A W: 3EAD8A54 X: 00000000 Y: 00000000 Z: 3F70DBA7
  550. // 2 - Yaraq: Landblock: 8D0301AD X: 41451E4F Y: C1E3DB23 Z: 3BA3D70A W: 3EAD8A54 X: 00000000 Y: 00000000 Z: 3F70DBA7
  551. // 2 - Yaraq: Landblock: 8D0401AD X: 41451E4F Y: C1E3DB23 Z: 3BA3D70A W: 3EAD8A54 X: 00000000 Y: 00000000 Z: 3F70DBA7
  552. // 2 - Yaraq: Landblock: 8E0201AD X: 41451E4F Y: C1E3DB23 Z: 3BA3D70A W: 3EAD8A54 X: 00000000 Y: 00000000 Z: 3F70DBA7
  553. // 3 - Sanamar: Landblock: 720201AD X: 41451E4F Y: C1E3DB23 Z: 3BA3D70A W: 3EAD8A54 X: 00000000 Y: 00000000 Z: 3F70DBA7
  554. // 3 - Sanamar: Landblock: 720301AD X: 41451E4F Y: C1E3DB23 Z: 3BA3D70A W: 3EAD8A54 X: 00000000 Y: 00000000 Z: 3F70DBA7
  555. // 3 - Sanamar: Landblock: 720401AD X: 41451E4F Y: C1E3DB23 Z: 3BA3D70A W: 3EAD8A54 X: 00000000 Y: 00000000 Z: 3F70DBA7
  556. // 3 - Sanamar: Landblock: 730201AD X: 41451E4F Y: C1E3DB23 Z: 3BA3D70A W: 3EAD8A54 X: 00000000 Y: 00000000 Z: 3F70DBA7
  557. // 3 - Sanamar: Landblock: 730301AD X: 41451E4F Y: C1E3DB23 Z: 3BA3D70A W: 3EAD8A54 X: 00000000 Y: 00000000 Z: 3F70DBA7
  558. int startLoc = 0 + int(2 * rand() / (RAND_MAX + 1.0)); //Each starting region has two distinct starting locations
  559. switch(ccm.dwStartingPlace)
  560. {
  561. case 0: //Holtburg South
  562. {
  563. if (startLoc == 0)
  564. sprintf( szCommand, "INSERT INTO avatar_location ( AvatarGUID,Landblock,Position_X,Position_Y,Position_Z,Orientation_W,Orientation_X,Orientation_Y,Orientation_Z,LS_Landblock,LS_Position_X,LS_Position_Y,LS_Position_Z,LS_Orientation_W,LS_Orientation_X,LS_Orientation_Y,LS_Orientation_Z) VALUES (%lu,'A9B00014','4260428F','42BD12F2','4281DBA6','BF7C3EEB','00000000','80000000','BE2EB9D8','A9B00007', '41ACB08A', '431291AA', '42680000', 'BF532C0D', '00000000', '00000000', 'BF10B6F8');", dwNewAvatarGUID );
  565. else
  566. sprintf( szCommand, "INSERT INTO avatar_location ( AvatarGUID,Landblock,Position_X,Position_Y,Position_Z,Orientation_W,Orientation_X,Orientation_Y,Orientation_Z,LS_Landblock,LS_Position_X,LS_Position_Y,LS_Position_Z,LS_Orientation_W,LS_Orientation_X,LS_Orientation_Y,LS_Orientation_Z) VALUES (%lu,'A9B00015','427D54FE','42D11810','428125E3','BF5C5CCA','00000000','80000000','BF024B20','A9B00007', '41ACB08A', '431291AA', '42680000', 'BF532C0D', '00000000', '00000000', 'BF10B6F8');", dwNewAvatarGUID );
  567. retcode = SQLPrepare( m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  568. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  569. retcode = SQLFreeStmt( m_hStmt, SQL_CLOSE );
  570. break;
  571. }
  572. case 1: //Holtburg West
  573. {
  574. if (startLoc == 0)
  575. sprintf( szCommand, "INSERT INTO avatar_location ( AvatarGUID,Landblock,Position_X,Position_Y,Position_Z,Orientation_W,Orientation_X,Orientation_Y,Orientation_Z,LS_Landblock,LS_Position_X,LS_Position_Y,LS_Position_Z,LS_Orientation_W,LS_Orientation_X,LS_Orientation_Y,LS_Orientation_Z) VALUES (%lu,'A5B4002A','42FA3333','41F3CED9','4255DE35','3F7BACC7','00000000','00000000','BE3B6F5C','A5B4003D', '432E1DB2', '42CE2560', '42380000', '3F6CBA12', '00000000', '00000000', 'BEC2E625');", dwNewAvatarGUID );
  576. else
  577. sprintf( szCommand, "INSERT INTO avatar_location ( AvatarGUID,Landblock,Position_X,Position_Y,Position_Z,Orientation_W,Orientation_X,Orientation_Y,Orientation_Z,LS_Landblock,LS_Position_X,LS_Position_Y,LS_Position_Z,LS_Orientation_W,LS_Orientation_X,LS_Orientation_Y,LS_Orientation_Z) VALUES (%lu,'A5B40032','4310D53F','4205C396','4250051F','BF7354A5','00000000','00000000','BE9F1324','A5B4003D', '432E1DB2', '42CE2560', '42380000', '3F6CBA12', '00000000', '00000000', 'BEC2E625');", dwNewAvatarGUID );
  578. retcode = SQLPrepare( m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  579. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  580. retcode = SQLFreeStmt( m_hStmt, SQL_CLOSE );
  581. break;
  582. }
  583. case 2: //Shoushi Southeast
  584. {
  585. if (startLoc == 0)
  586. sprintf( szCommand, "INSERT INTO avatar_location ( AvatarGUID,Landblock,Position_X,Position_Y,Position_Z,Orientation_W,Orientation_X,Orientation_Y,Orientation_Z,LS_Landblock,LS_Position_X,LS_Position_Y,LS_Position_Z,LS_Orientation_W,LS_Orientation_X,LS_Orientation_Y,LS_Orientation_Z) VALUES (%lu,'DE51001D','4298CAC1','42CEA6E9','41800A3D','BF7D8C6F','00000000','00000000','BE0D5F23','DE510016', '425A6666', '42F03333', '41800000', '42B1999A', '00000000', '00000000', '00000000');", dwNewAvatarGUID );
  587. else
  588. sprintf( szCommand, "INSERT INTO avatar_location ( AvatarGUID,Landblock,Position_X,Position_Y,Position_Z,Orientation_W,Orientation_X,Orientation_Y,Orientation_Z,LS_Landblock,LS_Position_X,LS_Position_Y,LS_Position_Z,LS_Orientation_W,LS_Orientation_X,LS_Orientation_Y,LS_Orientation_Z) VALUES (%lu,'DE51001D','42AF2D91','42CA6F9E','41724DD3','BF747D8B','00000000','00000000','BE97CB91','DE510016', '425A6666', '42F03333', '41800000', '42B1999A', '00000000', '00000000', '00000000');", dwNewAvatarGUID );
  589. retcode = SQLPrepare( m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  590. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  591. retcode = SQLFreeStmt( m_hStmt, SQL_CLOSE );
  592. break;
  593. }
  594. case 3: //Shoushi West
  595. {
  596. if (startLoc == 0)
  597. sprintf( szCommand, "INSERT INTO avatar_location ( AvatarGUID,Landblock,Position_X,Position_Y,Position_Z,Orientation_W,Orientation_X,Orientation_Y,Orientation_Z,LS_Landblock,LS_Position_X,LS_Position_Y,LS_Position_Z,LS_Orientation_W,LS_Orientation_X,LS_Orientation_Y,LS_Orientation_Z) VALUES (%lu,'D6550023','42C2CCCD','427F3333','4250051F','3F60FA28','00000000','00000000','BEF44E28','D655003C', '43286666', '42B0CCCD', '42300000', '4330B333', '00000000', '00000000', '00000000');", dwNewAvatarGUID );
  598. else
  599. sprintf( szCommand, "INSERT INTO avatar_location ( AvatarGUID,Landblock,Position_X,Position_Y,Position_Z,Orientation_W,Orientation_X,Orientation_Y,Orientation_Z,LS_Landblock,LS_Position_X,LS_Position_Y,LS_Position_Z,LS_Orientation_W,LS_Orientation_X,LS_Orientation_Y,LS_Orientation_Z) VALUES (%lu,'D6550023','42D7999A','4276CCCD','4250051F','3F7FC1A0','00000000','00000000','BF42AA3E','D655003C', '43286666', '42B0CCCD', '42300000', '4330B333', '00000000', '00000000', '00000000');", dwNewAvatarGUID );
  600. retcode = SQLPrepare( m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  601. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  602. retcode = SQLFreeStmt( m_hStmt, SQL_CLOSE );
  603. break;
  604. }
  605. case 4: //Yaraq North
  606. {
  607. if (startLoc == 0)
  608. sprintf( szCommand, "INSERT INTO avatar_location ( AvatarGUID,Landblock,Position_X,Position_Y,Position_Z,Orientation_W,Orientation_X,Orientation_Y,Orientation_Z,LS_Landblock,LS_Position_X,LS_Position_Y,LS_Position_Z,LS_Orientation_W,LS_Orientation_X,LS_Orientation_Y,LS_Orientation_Z) VALUES (%lu,'7D680012','4250D0E5','4217F5C3','4182BE77','3EABB365','00000000','00000000','BF712CFA','7D680021', '42D834BC', '4162A027', '41200000', '3F37C2B8', '00000000', '00000000', '3F323C63');", dwNewAvatarGUID );
  609. else
  610. sprintf( szCommand, "INSERT INTO avatar_location ( AvatarGUID,Landblock,Position_X,Position_Y,Position_Z,Orientation_W,Orientation_X,Orientation_Y,Orientation_Z,LS_Landblock,LS_Position_X,LS_Position_Y,LS_Position_Z,LS_Orientation_W,LS_Orientation_X,LS_Orientation_Y,LS_Orientation_Z) VALUES (%lu,'7D680012','4272D917','4217F2B0','4182BE77','3E5C7298','00000000','00000000','BF79FF53','7D680021', '42D834BC', '4162A027', '41200000', '3F37C2B8', '00000000', '00000000', '3F323C63');", dwNewAvatarGUID );
  611. retcode = SQLPrepare( m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  612. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  613. retcode = SQLFreeStmt( m_hStmt, SQL_CLOSE );
  614. break;
  615. }
  616. case 5: //Yaraq East
  617. {
  618. if (startLoc == 0)
  619. sprintf( szCommand, "INSERT INTO avatar_location ( AvatarGUID,Landblock,Position_X,Position_Y,Position_Z,Orientation_W,Orientation_X,Orientation_Y,Orientation_Z,LS_Landblock,LS_Position_X,LS_Position_Y,LS_Position_Z,LS_Orientation_W,LS_Orientation_X,LS_Orientation_Y,LS_Orientation_Z) VALUES (%lu,'8164000D','42026560','42CE3EFA','41F5DF3B','BF6C92AE','00000000','00000000','BEC3A516','81640007', '4199BDA5', '43140625', '41C00000', '3F1D5AE2', '00000000', '00000000', '3F49EDDF');", dwNewAvatarGUID );
  620. else
  621. sprintf( szCommand, "INSERT INTO avatar_location ( AvatarGUID,Landblock,Position_X,Position_Y,Position_Z,Orientation_W,Orientation_X,Orientation_Y,Orientation_Z,LS_Landblock,LS_Position_X,LS_Position_Y,LS_Position_Z,LS_Orientation_W,LS_Orientation_X,LS_Orientation_Y,LS_Orientation_Z) VALUES (%lu,'8164000D','4217EF9E','42DFB0A4','41F953F8','BF58C84F','00000000','00000000','BF082AAD','81640007', '4199BDA5', '43140625', '41C00000', '3F1D5AE2', '00000000', '00000000', '3F49EDDF');", dwNewAvatarGUID );
  622. retcode = SQLPrepare( m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  623. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  624. retcode = SQLFreeStmt( m_hStmt, SQL_CLOSE );
  625. break;
  626. }
  627. }
  628. //k109: Staring Spells based on skills
  629. int c_spell_id[8];
  630. int i_spell_id[8];
  631. int l_spell_id[8];
  632. int w_spell_id[8];
  633. int t_spell_count = 0;
  634. int s_spell_count = 0;
  635. //Creature Trained -- Invuln Other/Self I, Focus Self I
  636. if (ccm.dwSkillStatus[0x1F] == 2)
  637. {
  638. c_spell_id[0] = 17;
  639. c_spell_id[1] = 18;
  640. c_spell_id[2] = 1421;
  641. for(int s = 0; s < 3; s++)
  642. {
  643. t_spell_count += 1;
  644. AddSpell(dwNewAvatarGUID,t_spell_count,c_spell_id[s]);
  645. }
  646. }
  647. //Creature Specd -- Invuln Other/Self I, Focus Self I, Willpower Self I
  648. if (ccm.dwSkillStatus[0x1F] == 3)
  649. {
  650. c_spell_id[0] = 17;
  651. c_spell_id[1] = 18;
  652. c_spell_id[2] = 1421;
  653. c_spell_id[3] = 1445;
  654. for(int s = 0; s < 4; s++)
  655. {
  656. s_spell_count += 1;
  657. AddSpell(dwNewAvatarGUID,s_spell_count,c_spell_id[s]);
  658. }
  659. }
  660. //Item Trained -- Blood Drinker I, Impen I, Bludg Bane I, Swift Killer I
  661. if (ccm.dwSkillStatus[0x20] == 2)
  662. {
  663. i_spell_id[0] = 35;
  664. i_spell_id[1] = 49;
  665. i_spell_id[2] = 51;
  666. i_spell_id[3] = 1511;
  667. for(int s = 0; s < 4; s++)
  668. {
  669. t_spell_count += 1;
  670. AddSpell(dwNewAvatarGUID,t_spell_count,i_spell_id[s]);
  671. }
  672. }
  673. //Item Specd -- Blood Drinker I, Impen I, Bludg Bane I, Swift Killer I, Blade Bane I, Defender I
  674. if (ccm.dwSkillStatus[0x20] == 3)
  675. {
  676. i_spell_id[0] = 35;
  677. i_spell_id[1] = 49;
  678. i_spell_id[2] = 51;
  679. i_spell_id[3] = 1511;
  680. i_spell_id[4] = 37;
  681. i_spell_id[5] = 1599;
  682. for(int s = 0; s < 6; s++)
  683. {
  684. s_spell_count += 1;
  685. AddSpell(dwNewAvatarGUID,s_spell_count,i_spell_id[s]);
  686. }
  687. }
  688. //Life Trained -- Armor Other/Self I, Heal Other/Self I, Imperil I
  689. if (ccm.dwSkillStatus[0x21] == 2)
  690. {
  691. l_spell_id[0] = 23;
  692. l_spell_id[1] = 24;
  693. l_spell_id[2] = 5;
  694. l_spell_id[3] = 6;
  695. l_spell_id[4] = 25;
  696. for(int s = 0; s < 5; s++)
  697. {
  698. t_spell_count += 1;
  699. AddSpell(dwNewAvatarGUID,t_spell_count,l_spell_id[s]);
  700. }
  701. }
  702. //Life Specd -- Armor Other/Self I, Heal Other/Self I, Imperil I, Drain Health Other I, Harm Other I
  703. if (ccm.dwSkillStatus[0x21] == 3)
  704. {
  705. l_spell_id[0] = 23;
  706. l_spell_id[1] = 24;
  707. l_spell_id[2] = 5;
  708. l_spell_id[3] = 6;
  709. l_spell_id[4] = 25;
  710. l_spell_id[5] = 1237;
  711. l_spell_id[6] = 7;
  712. for(int s = 0; s < 7; s++)
  713. {
  714. s_spell_count += 1;
  715. AddSpell(dwNewAvatarGUID,s_spell_count,l_spell_id[s]);
  716. }
  717. }
  718. //War Trained -- Flame Bolt, Force Bolt, Frost Bolt, Shock Wave
  719. if (ccm.dwSkillStatus[0x22] == 2)
  720. {
  721. w_spell_id[0] = 27;
  722. w_spell_id[1] = 28;
  723. w_spell_id[2] = 86;
  724. w_spell_id[3] = 64;
  725. for(int s = 0; s < 4; s++)
  726. {
  727. t_spell_count += 1;
  728. AddSpell(dwNewAvatarGUID,t_spell_count,w_spell_id[s]);
  729. }
  730. }
  731. //War Specd
  732. if (ccm.dwSkillStatus[0x22] == 3)
  733. {
  734. w_spell_id[0] = 27;
  735. w_spell_id[1] = 28;
  736. w_spell_id[2] = 58;
  737. w_spell_id[3] = 64;
  738. w_spell_id[4] = 75;
  739. w_spell_id[5] = 86;
  740. w_spell_id[6] = 92;
  741. for(int s = 0; s < 7; s++)
  742. {
  743. s_spell_count += 1;
  744. AddSpell(dwNewAvatarGUID,s_spell_count,w_spell_id[s]);
  745. }
  746. }
  747. DWORD total_spells = s_spell_count += t_spell_count;
  748. sprintf( szCommand, "INSERT INTO Avatar_Spells ( OwnerGUID,dwSpellCount ) VALUES (%d,%d); ", dwNewAvatarGUID, total_spells);
  749. retcode = SQLPrepare( m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  750. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  751. retcode = SQLFreeStmt( m_hStmt, SQL_CLOSE );
  752. // UpdateConsole("Chin: %#x, Fore: %#x, Nose: %#x Skintone: %x04 \r\n", ccm.dwChinTexture, ccm.dwForeheadTexture, ccm.dwNoseTexture, ccm.dwSkinPalette);
  753. //Casting items
  754. if(total_spells > 0)
  755. {
  756. AddCasterItems(dwNewAvatarGUID);
  757. AddFoci(dwNewAvatarGUID,ccm);
  758. }
  759. //Add Starting Equipment
  760. AddGeneralItems(dwNewAvatarGUID);
  761. /* Racial Equipment */
  762. if (ccm.dwRace == CHARDATA_RACE_SHO)
  763. AddRaceItemsSho(dwNewAvatarGUID);
  764. if (ccm.dwRace == CHARDATA_RACE_GHARU)
  765. AddRaceItemsGharundim(dwNewAvatarGUID);
  766. if (ccm.dwRace == CHARDATA_RACE_ALUVIAN)
  767. AddRaceItemsAluvian(dwNewAvatarGUID);
  768. /* Profession Equipment */
  769. AddProfessionItems(dwNewAvatarGUID,ccm);
  770. }
  771. return !fAlreadyExists;
  772. }
  773. /**
  774. * Deletes the database information on a particular avatar.
  775. *
  776. * Entries are deleted from the following tables:
  777. * avatar, avatar_skills, avatar_location, avatar_spells, avatar_vector_spellbook,
  778. * avatar_vector_spelltabs, avatar_vector_equipped, avatar_clothing_palettes,
  779. * items_instance_inventory, avatar_comp_quests.
  780. */
  781. void cDatabase::DeleteAvatar( DWORD dwAvatarGUID )
  782. {
  783. char szCommand[256];
  784. // Remove record from the avatar table
  785. sprintf( szCommand, "DELETE FROM avatar WHERE AvatarGUID=%lu; ", dwAvatarGUID );
  786. RETCODE retcode;
  787. retcode = SQLPrepare( m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  788. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  789. retcode = SQLFreeStmt( m_hStmt, SQL_CLOSE ); CHECKRETURN( 0, SQL_HANDLE_STMT, m_hStmt, 1 )
  790. // Remove record from the avatar_skills table
  791. sprintf( szCommand, "DELETE FROM avatar_skills WHERE AvatarGUID=%lu; ", dwAvatarGUID );
  792. retcode = SQLPrepare( m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  793. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  794. retcode = SQLFreeStmt( m_hStmt, SQL_CLOSE ); CHECKRETURN( 0, SQL_HANDLE_STMT, m_hStmt, 1 )
  795. // Remove record from the avatar_location table
  796. sprintf( szCommand, "DELETE FROM avatar_location WHERE AvatarGUID=%lu; ", dwAvatarGUID );
  797. retcode = SQLPrepare( m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  798. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  799. retcode = SQLFreeStmt( m_hStmt, SQL_CLOSE ); CHECKRETURN( 0, SQL_HANDLE_STMT, m_hStmt, 1 )
  800. // Remove records from the avatar_spells table
  801. sprintf( szCommand, "DELETE FROM avatar_spells WHERE OwnerGUID=%lu; ", dwAvatarGUID );
  802. retcode = SQLPrepare( m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  803. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  804. retcode = SQLFreeStmt( m_hStmt, SQL_CLOSE ); CHECKRETURN( 0, SQL_HANDLE_STMT, m_hStmt, 1 )
  805. // Remove record from the avatar_vector_spellbook table
  806. sprintf( szCommand, "DELETE FROM avatar_vector_spellbook WHERE OwnerGUID=%lu; ", dwAvatarGUID );
  807. retcode = SQLPrepare( m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  808. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  809. retcode = SQLFreeStmt( m_hStmt, SQL_CLOSE ); CHECKRETURN( 0, SQL_HANDLE_STMT, m_hStmt, 1 )
  810. // Remove record from the avatar_vector_spelltabs table
  811. sprintf( szCommand, "DELETE FROM avatar_vector_spelltabs WHERE OwnerGUID=%lu; ", dwAvatarGUID );
  812. retcode = SQLPrepare( m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  813. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  814. retcode = SQLFreeStmt( m_hStmt, SQL_CLOSE ); CHECKRETURN( 0, SQL_HANDLE_STMT, m_hStmt, 1 )
  815. // Remove record from the avatar_vector_equipped table
  816. sprintf( szCommand, "DELETE FROM avatar_vector_equipped WHERE OwnerGUID=%lu; ", dwAvatarGUID );
  817. retcode = SQLPrepare( m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  818. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  819. retcode = SQLFreeStmt( m_hStmt, SQL_CLOSE ); CHECKRETURN( 0, SQL_HANDLE_STMT, m_hStmt, 1 )
  820. // Iterate through items in the avatar's inventory
  821. DWORD dwTempGUID;
  822. std::list< DWORD > lstInventory;
  823. sprintf( szCommand, "SELECT GUID FROM items_instance_inventory WHERE OwnerGUID=%lu; ", dwAvatarGUID );
  824. retcode = SQLPrepare( m_hStmt, (BYTE *)szCommand, SQL_NTS ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  825. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  826. retcode = SQLBindCol( m_hStmt, 1, SQL_C_ULONG, &dwTempGUID, sizeof( DWORD ), NULL ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  827. for ( int i = 0; SQLFetch( cDatabase::m_hStmt ) == SQL_SUCCESS; ++i )
  828. {
  829. lstInventory.push_back( dwTempGUID );
  830. }
  831. retcode = SQLCloseCursor( m_hStmt ); CHECKRETURN( 0, SQL_HANDLE_STMT, m_hStmt, NULL )
  832. retcode = SQLFreeStmt( m_hStmt, SQL_UNBIND );
  833. for ( std::list<DWORD>::iterator list_iter = lstInventory.begin(); list_iter != lstInventory.end(); ++list_iter )
  834. {
  835. // Remove the unique palettes for items in the avatar's inventory
  836. sprintf( szCommand, "DELETE FROM avatar_clothing_palettes WHERE ObjectGUID=%lu; ", *list_iter );
  837. retcode = SQLPrepare( m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  838. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  839. retcode = SQLFreeStmt( m_hStmt, SQL_CLOSE ); CHECKRETURN( 0, SQL_HANDLE_STMT, m_hStmt, 1 )
  840. }
  841. lstInventory.clear();
  842. // Remove the avatar's inventory
  843. sprintf( szCommand, "DELETE FROM items_instance_inventory WHERE OwnerGUID=%lu; ", dwAvatarGUID );
  844. retcode = SQLPrepare( m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  845. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  846. retcode = SQLFreeStmt( m_hStmt, SQL_CLOSE ); CHECKRETURN( 0, SQL_HANDLE_STMT, m_hStmt, 1 )
  847. //Remove quest records
  848. sprintf( szCommand, "DELETE FROM avatar_comp_quests WHERE AvatarGUID=%lu; ", dwAvatarGUID );
  849. retcode = SQLPrepare( m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  850. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  851. retcode = SQLFreeStmt( m_hStmt, SQL_CLOSE ); CHECKRETURN( 0, SQL_HANDLE_STMT, m_hStmt, 1 )
  852. /*
  853. // Remove record from the npc_vector_textures table
  854. sprintf( szCommand, "DELETE FROM npcs_vector_textures WHERE OwnerGUID=%lu; ", dwAvatarGUID );
  855. retcode = SQLPrepare( m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  856. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  857. retcode = SQLFreeStmt( m_hStmt, SQL_CLOSE ); CHECKRETURN( 0, SQL_HANDLE_STMT, m_hStmt, 1 )
  858. // Remove record from the npc_vector_palettes table
  859. sprintf( szCommand, "DELETE FROM npcs_vector_palettes WHERE OwnerGUID=%lu; ", dwAvatarGUID );
  860. retcode = SQLPrepare( m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  861. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  862. retcode = SQLFreeStmt( m_hStmt, SQL_CLOSE ); CHECKRETURN( 0, SQL_HANDLE_STMT, m_hStmt, 1 )
  863. // Remove record from the npc_vector_models table
  864. sprintf( szCommand, "DELETE FROM npcs_vector_models WHERE OwnerGUID=%lu; ", dwAvatarGUID );
  865. retcode = SQLPrepare( m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  866. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  867. retcode = SQLFreeStmt( m_hStmt, SQL_CLOSE ); CHECKRETURN( 0, SQL_HANDLE_STMT, m_hStmt, 1 )
  868. */
  869. }
  870. /**
  871. * Loads the database information on a particular avatar during login.
  872. *
  873. * Database tables consulted: avatar, avatar_skills, avatar_location,
  874. * houses_covenants, avatar_vector_spellbook, avatar_vector_spelltab,
  875. * items_instance_inventory.
  876. */
  877. void cDatabase::LoadAvatar( cAvatar* pcAvatar )
  878. {
  879. UINT dwGUID = pcAvatar->GetGUID( );
  880. DWORD dwAccountID;
  881. char szOptionsFlag[9];
  882. char dwLandblock[9];
  883. char dwPosX[9];
  884. char dwPosY[9];
  885. char dwPosZ[9];
  886. char dwOrientW[9];
  887. char dwOrientX[9];
  888. char dwOrientY[9];
  889. char dwOrientZ[9];
  890. char dwLSLandblock[9];
  891. char dwLSPosX[9];
  892. char dwLSPosY[9];
  893. char dwLSPosZ[9];
  894. char dwLSOrientW[9];
  895. char dwLSOrientX[9];
  896. char dwLSOrientY[9];
  897. char dwLSOrientZ[9];
  898. char dwCovLandblock[9];
  899. char dwCovPosX[9];
  900. char dwCovPosY[9];
  901. char dwCovPosZ[9];
  902. char dwCovOrientW[9];
  903. char dwCovOrientX[9];
  904. char dwCovOrientY[9];
  905. char dwCovOrientZ[9];
  906. char szCommand[512];
  907. DWORD dwAvatarsGUID;
  908. WORD dwHouseID;
  909. DWORD dwSpellID;
  910. float flCharge;
  911. WORD wSpellType;
  912. DWORD dwUnkA,dwUnkB;
  913. DWORD dwSpell;
  914. WORD intTab;
  915. WORD intCount;
  916. int i;
  917. RETCODE retcode;
  918. sprintf( szCommand, "SELECT * FROM avatar WHERE AvatarGUID=%lu;", dwGUID );
  919. retcode = SQLPrepare( m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  920. retcode = SQLExecute( m_hStmt ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  921. int iCol = 4;
  922. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_CHAR, pcAvatar->m_strCharacterName, sizeof( pcAvatar->m_strCharacterName ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  923. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_USHORT, &pcAvatar->m_bAccessLevel, sizeof( BYTE ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  924. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_USHORT, &pcAvatar->m_wModelNum, sizeof( WORD), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  925. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_FLOAT, &pcAvatar->m_flAScale, sizeof( pcAvatar->m_flScale ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  926. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_USHORT, &pcAvatar->m_wRace, sizeof( WORD ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  927. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_USHORT, &pcAvatar->m_wGender, sizeof( WORD ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  928. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_DOUBLE, &pcAvatar->m_dblSkinShade, sizeof( &pcAvatar->m_dblSkinShade ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  929. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_USHORT, &pcAvatar->m_wHairColor, sizeof( WORD ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  930. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_DOUBLE, &pcAvatar->m_dblHairShade, sizeof( &pcAvatar->m_dblHairShade ), NULL );CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  931. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_USHORT, &pcAvatar->m_wHairStyle, sizeof( WORD ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  932. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_USHORT, &pcAvatar->m_wEyeColor, sizeof( WORD ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  933. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_USHORT, &pcAvatar->m_wHead, sizeof( WORD ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  934. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_USHORT, &pcAvatar->m_wNose, sizeof( WORD ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  935. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_USHORT, &pcAvatar->m_wChin, sizeof( WORD ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  936. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_ULONG, &pcAvatar->m_dwTotalXP, sizeof( DWORD ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  937. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_ULONG, &pcAvatar->m_dwUnassignedXP, sizeof( DWORD ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  938. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_ULONG, &pcAvatar->m_cStats.m_dwLevel, sizeof( DWORD ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  939. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_USHORT, &pcAvatar->m_bTotalSkillCredits, sizeof( BYTE ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  940. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_USHORT, &pcAvatar->m_bSkillCredits, sizeof( BYTE ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  941. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_USHORT, &pcAvatar->m_wClass, sizeof( WORD ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  942. for(i = 0; i < 6; i++ )
  943. {
  944. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_ULONG, &pcAvatar->m_cStats.m_lpcAttributes[i].m_dwIncrement, sizeof( DWORD ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  945. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_ULONG, &pcAvatar->m_cStats.m_lpcAttributes[i].m_dwCurrent, sizeof( DWORD ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  946. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_ULONG, &pcAvatar->m_cStats.m_lpcAttributes[i].m_dwXP, sizeof( DWORD ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  947. }
  948. for(i = 0; i < 3; i++ )
  949. {
  950. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_ULONG, &pcAvatar->m_cStats.m_lpcVitals[i].m_dwIncreases, sizeof( DWORD ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  951. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_ULONG, &pcAvatar->m_cStats.m_lpcVitals[i].m_dwXP, sizeof( DWORD ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  952. }
  953. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_ULONG, &pcAvatar->m_fIsPK, sizeof( DWORD ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  954. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_ULONG, &pcAvatar->m_dwAllegianceID, sizeof( DWORD ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  955. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_ULONG, &pcAvatar->m_dwNumFollowers, sizeof( DWORD ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  956. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_ULONG, &pcAvatar->m_dwNumDeaths, sizeof( DWORD ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  957. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_CHAR, &szOptionsFlag, sizeof( szOptionsFlag ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  958. // retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_ULONG, &pcAvatar->m_dwBirth, sizeof( DWORD ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  959. // retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_ULONG, &pcAvatar->m_dwNumLogins, sizeof( DWORD ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  960. retcode = SQLFetch( m_hStmt ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  961. sscanf(szOptionsFlag,"%08x",&pcAvatar->m_dwOptions);
  962. pcAvatar->m_dwBirth = 0;
  963. pcAvatar->m_dwNumLogins = 0;
  964. retcode = SQLCloseCursor( m_hStmt ); CHECKRETURN(0, SQL_HANDLE_STMT, m_hStmt, NULL)
  965. retcode = SQLFreeStmt( m_hStmt, SQL_UNBIND ); CHECKRETURN(0, SQL_HANDLE_STMT, m_hStmt, NULL)
  966. cPortalDat::LoadStartingInfo( pcAvatar );
  967. sprintf( szCommand, "SELECT * FROM avatar_skills WHERE AvatarGUID=%lu;", dwGUID );
  968. retcode = SQLPrepare( m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  969. retcode = SQLExecute( m_hStmt ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  970. iCol = 3;
  971. for(i = 0; i < 40; i++ )
  972. {
  973. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_USHORT, &pcAvatar->m_cStats.m_lpcSkills[i].m_wID, sizeof( WORD ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  974. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_USHORT, &pcAvatar->m_cStats.m_lpcSkills[i].m_wStatus, sizeof( WORD ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  975. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_ULONG, &pcAvatar->m_cStats.m_lpcSkills[i].m_dwIncreases, sizeof( DWORD ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  976. pcAvatar->CalcSkill(i); // sets m_cStats.m_lpcSkills[i].m_dwTotal
  977. }
  978. retcode = SQLFetch( m_hStmt ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  979. retcode = SQLCloseCursor( m_hStmt ); CHECKRETURN(0, SQL_HANDLE_STMT, m_hStmt, NULL)
  980. retcode = SQLFreeStmt( m_hStmt, SQL_UNBIND ); CHECKRETURN(0, SQL_HANDLE_STMT, m_hStmt, NULL)
  981. pcAvatar->m_strName.assign( ReturnNamePrefix( pcAvatar->m_bAccessLevel ) );
  982. pcAvatar->m_strName.append( pcAvatar->m_strCharacterName );
  983. for(i = 0; i < 40; i++ )
  984. {
  985. pcAvatar->m_cStats.m_lpcSkills[i].m_dwXP = 0;
  986. if (pcAvatar->m_cStats.m_lpcSkills[i].m_wStatus == 3) //specialized
  987. sprintf( szCommand, "SELECT spec_exp FROM exp_table WHERE ID = %d;", pcAvatar->m_cStats.m_lpcSkills[i].m_dwIncreases );
  988. else if (pcAvatar->m_cStats.m_lpcSkills[i].m_wStatus == 2) //trained
  989. sprintf( szCommand, "SELECT trained_exp FROM exp_table WHERE ID = %d;", pcAvatar->m_cStats.m_lpcSkills[i].m_dwIncreases );
  990. retcode = SQLPrepare( m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  991. retcode = SQLExecute( m_hStmt );
  992. retcode = SQLBindCol( cDatabase::m_hStmt, 1, SQL_C_ULONG, &pcAvatar->m_cStats.m_lpcSkills[i].m_dwXP, sizeof( DWORD ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  993. retcode = SQLFetch( m_hStmt ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  994. retcode = SQLCloseCursor( m_hStmt ); CHECKRETURN(0, SQL_HANDLE_STMT, m_hStmt, NULL)
  995. retcode = SQLFreeStmt( m_hStmt, SQL_UNBIND ); CHECKRETURN(0, SQL_HANDLE_STMT, m_hStmt, NULL)
  996. }
  997. //Vitals
  998. pcAvatar->m_cStats.m_lpcVitals[0].m_lTrueCurrent = pcAvatar->m_cStats.m_lpcVitals[0].m_dwCurrent = floor((double)(pcAvatar->m_cStats.m_lpcAttributes[1].m_dwCurrent + pcAvatar->m_cStats.m_lpcAttributes[1].m_dwIncrement) / 2 + .5) + pcAvatar->m_cStats.m_lpcVitals[0].m_dwIncreases;
  999. pcAvatar->m_cStats.m_lpcVitals[1].m_lTrueCurrent = pcAvatar->m_cStats.m_lpcVitals[1].m_dwCurrent = (pcAvatar->m_cStats.m_lpcAttributes[1].m_dwCurrent + pcAvatar->m_cStats.m_lpcAttributes[1].m_dwIncrement) + pcAvatar->m_cStats.m_lpcVitals[1].m_dwIncreases;
  1000. pcAvatar->m_cStats.m_lpcVitals[2].m_lTrueCurrent = pcAvatar->m_cStats.m_lpcVitals[2].m_dwCurrent = (pcAvatar->m_cStats.m_lpcAttributes[5].m_dwCurrent + pcAvatar->m_cStats.m_lpcAttributes[5].m_dwIncrement) + pcAvatar->m_cStats.m_lpcVitals[2].m_dwIncreases;
  1001. //Location
  1002. sprintf( szCommand, "SELECT * FROM avatar_location WHERE AvatarGUID=%lu;", dwGUID );
  1003. retcode = SQLPrepare( m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  1004. retcode = SQLExecute( m_hStmt );
  1005. iCol = 3;
  1006. // Avatar location
  1007. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_CHAR, dwLandblock, sizeof( dwLandblock ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  1008. /* retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_FLOAT, &pcAvatar->m_Location.m_flX, sizeof( pcAvatar->m_Location.m_flX ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  1009. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_FLOAT, &pcAvatar->m_Location.m_flY, sizeof( pcAvatar->m_Location.m_flY ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  1010. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_FLOAT, &pcAvatar->m_Location.m_flZ, sizeof( pcAvatar->m_Location.m_flZ ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  1011. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_FLOAT, &pcAvatar->m_Location.m_flA, sizeof( pcAvatar->m_Location.m_flA ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  1012. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_FLOAT, &pcAvatar->m_Location.m_flB, sizeof( pcAvatar->m_Location.m_flB ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  1013. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_FLOAT, &pcAvatar->m_Location.m_flC, sizeof( pcAvatar->m_Location.m_flC ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  1014. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_FLOAT, &pcAvatar->m_Location.m_flW, sizeof( pcAvatar->m_Location.m_flW ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  1015. */ retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_CHAR, dwPosX, sizeof( dwPosX ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1016. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_CHAR, dwPosY, sizeof( dwPosY ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1017. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_CHAR, dwPosZ, sizeof( dwPosZ ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1018. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_CHAR, dwOrientW, sizeof( dwOrientW ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1019. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_CHAR, dwOrientX, sizeof( dwOrientX ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1020. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_CHAR, dwOrientY, sizeof( dwOrientY ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1021. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_CHAR, dwOrientZ, sizeof( dwOrientZ ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1022. // Lifestone location
  1023. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_CHAR, dwLSLandblock, sizeof( dwLSLandblock ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  1024. /* retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_FLOAT, &pcAvatar->m_LSLoc.m_flX, sizeof( pcAvatar->m_LSLoc.m_flX ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  1025. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_FLOAT, &pcAvatar->m_LSLoc.m_flY, sizeof( pcAvatar->m_LSLoc.m_flY ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  1026. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_FLOAT, &pcAvatar->m_LSLoc.m_flZ, sizeof( pcAvatar->m_LSLoc.m_flZ ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  1027. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_FLOAT, &pcAvatar->m_LSLoc.m_flA, sizeof( pcAvatar->m_LSLoc.m_flA ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  1028. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_FLOAT, &pcAvatar->m_LSLoc.m_flB, sizeof( pcAvatar->m_LSLoc.m_flB ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  1029. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_FLOAT, &pcAvatar->m_LSLoc.m_flC, sizeof( pcAvatar->m_LSLoc.m_flC ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  1030. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_FLOAT, &pcAvatar->m_LSLoc.m_flW, sizeof( pcAvatar->m_LSLoc.m_flW ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  1031. */ retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_CHAR, dwLSPosX, sizeof( dwLSPosX ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1032. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_CHAR, dwLSPosY, sizeof( dwLSPosY ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1033. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_CHAR, dwLSPosZ, sizeof( dwLSPosZ ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1034. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_CHAR, dwLSOrientW, sizeof( dwLSOrientW ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1035. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_CHAR, dwLSOrientX, sizeof( dwLSOrientX ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1036. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_CHAR, dwLSOrientY, sizeof( dwLSOrientY ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1037. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_CHAR, dwLSOrientZ, sizeof( dwLSOrientZ ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1038. retcode = SQLFetch( m_hStmt ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  1039. sscanf(dwLandblock,"%08x",&pcAvatar->m_Location.m_dwLandBlock);
  1040. sscanf(dwPosX,"%08x",&pcAvatar->m_Location.m_flX);
  1041. sscanf(dwPosY,"%08x",&pcAvatar->m_Location.m_flY);
  1042. sscanf(dwPosZ,"%08x",&pcAvatar->m_Location.m_flZ);
  1043. sscanf(dwOrientW,"%08x",&pcAvatar->m_Location.m_flA);
  1044. sscanf(dwOrientX,"%08x",&pcAvatar->m_Location.m_flB);
  1045. sscanf(dwOrientY,"%08x",&pcAvatar->m_Location.m_flC);
  1046. sscanf(dwOrientZ,"%08x",&pcAvatar->m_Location.m_flW);
  1047. sscanf(dwLSLandblock,"%08x",&pcAvatar->m_LSLoc.m_dwLandBlock);
  1048. sscanf(dwLSPosX,"%08x",&pcAvatar->m_LSLoc.m_flX);
  1049. sscanf(dwLSPosY,"%08x",&pcAvatar->m_LSLoc.m_flY);
  1050. sscanf(dwLSPosZ,"%08x",&pcAvatar->m_LSLoc.m_flZ);
  1051. sscanf(dwLSOrientW,"%08x",&pcAvatar->m_LSLoc.m_flA);
  1052. sscanf(dwLSOrientX,"%08x",&pcAvatar->m_LSLoc.m_flB);
  1053. sscanf(dwLSOrientY,"%08x",&pcAvatar->m_LSLoc.m_flC);
  1054. sscanf(dwLSOrientZ,"%08x",&pcAvatar->m_LSLoc.m_flW);
  1055. // House (covenant crystal) location
  1056. retcode = SQLCloseCursor( cDatabase::m_hStmt ); CHECKRETURN( 0, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL )
  1057. retcode = SQLFreeStmt( cDatabase::m_hStmt, SQL_UNBIND ); CHECKRETURN( 0, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL )
  1058. sprintf( szCommand, "SELECT * FROM avatar WHERE AvatarGUID = %lu;",dwGUID );
  1059. retcode = SQLPrepare( cDatabase::m_hStmt,(unsigned char *)szCommand, SQL_NTS ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1060. retcode = SQLExecute( cDatabase::m_hStmt );
  1061. retcode = SQLBindCol( cDatabase::m_hStmt, 3, SQL_C_ULONG, &dwAccountID, sizeof( dwAccountID ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, 1)
  1062. if (SQLFetch( cDatabase::m_hStmt ) != SQL_SUCCESS)
  1063. {
  1064. retcode = SQLCloseCursor( cDatabase::m_hStmt ); CHECKRETURN(0, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1065. retcode = SQLFreeStmt( cDatabase::m_hStmt, SQL_UNBIND );
  1066. } else {
  1067. retcode = SQLCloseCursor( cDatabase::m_hStmt ); CHECKRETURN(0, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1068. retcode = SQLFreeStmt( cDatabase::m_hStmt, SQL_UNBIND );
  1069. // sprintf( szCommand, "SELECT COUNT(houses_covenants.ID) FROM {oj avatar LEFT OUTER JOIN houses_covenants ON avatar.AvatarGUID=houses_covenants.OwnerID} WHERE avatar.OwnerID = %d;",AccountID );
  1070. bool owner = false;
  1071. dwAvatarsGUID = NULL;
  1072. sprintf( szCommand, "SELECT AvatarGUID FROM avatar WHERE OwnerID = %lu;",dwAccountID );
  1073. retcode = SQLPrepare( cDatabase::m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1074. retcode = SQLExecute( cDatabase::m_hStmt );
  1075. retcode = SQLBindCol( cDatabase::m_hStmt, 1, SQL_C_ULONG, &dwAvatarsGUID, sizeof( dwAvatarsGUID ), NULL );CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1076. DWORD avatarArray[10];
  1077. for ( i = 0; SQLFetch( cDatabase::m_hStmt ) == SQL_SUCCESS; ++i )
  1078. {
  1079. avatarArray[i] = dwAvatarsGUID;
  1080. }
  1081. retcode = SQLCloseCursor( cDatabase::m_hStmt ); CHECKRETURN(0, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1082. retcode = SQLFreeStmt( cDatabase::m_hStmt, SQL_UNBIND );
  1083. for ( i = 0; owner != true && i < 10; i++ )
  1084. {
  1085. sprintf( szCommand, "SELECT HouseID FROM houses_covenants WHERE OwnerID = %lu;",avatarArray[i] );
  1086. retcode = SQLPrepare( cDatabase::m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, 1)
  1087. retcode = SQLExecute( cDatabase::m_hStmt ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, 1)
  1088. retcode = SQLBindCol( cDatabase::m_hStmt, 1, SQL_C_ULONG, &dwHouseID, sizeof( WORD ), NULL ); CHECKRETURN( 1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL )
  1089. if (SQLFetch( cDatabase::m_hStmt ) == SQL_SUCCESS)
  1090. {
  1091. owner = true;
  1092. }
  1093. retcode = SQLCloseCursor( cDatabase::m_hStmt ); CHECKRETURN(0, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1094. retcode = SQLFreeStmt( cDatabase::m_hStmt, SQL_UNBIND );
  1095. }
  1096. if( owner == true ) {
  1097. //sprintf( szCommand, "SELECT houses_covenants.HouseID,houses_covenants.Landblock,houses_covenants.fl_X,houses_covenants.fl_Y,houses_covenants.fl_Z,houses_covenants.fl_heading,houses_covenants.Unknown_1,houses_covenants.Unknown_2,houses_covenants.Heading_2 FROM {oj avatar LEFT OUTER JOIN houses_covenants ON avatar.AvatarGUID=houses_covenants.OwnerID} WHERE avatar.OwnerID = %lu;",AccountID );
  1098. sprintf( szCommand, "SELECT HouseID,Landblock,Position_X,Position_Y,Position_Z,Orientation_W,Orientation_X,Orientation_Y,Orientation_Z FROM houses_covenants WHERE HouseID = %d;", dwHouseID );
  1099. retcode = SQLPrepare( cDatabase::m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, 1)
  1100. retcode = SQLExecute( cDatabase::m_hStmt ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, 1)
  1101. int iCol = 1;
  1102. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_USHORT, &pcAvatar->m_wHouseID, sizeof( WORD ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, 1)
  1103. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_CHAR, dwCovLandblock, sizeof( dwCovLandblock ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1104. /* retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_FLOAT, &pcAvatar->m_HRLoc.m_flX, sizeof( &pcAvatar->m_HRLoc.m_flX ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1105. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_FLOAT, &pcAvatar->m_HRLoc.m_flY, sizeof( &pcAvatar->m_HRLoc.m_flY ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1106. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_FLOAT, &pcAvatar->m_HRLoc.m_flZ, sizeof( &pcAvatar->m_HRLoc.m_flZ ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1107. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_FLOAT, &pcAvatar->m_HRLoc.m_flA, sizeof( &pcAvatar->m_HRLoc.m_flA ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1108. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_FLOAT, &pcAvatar->m_HRLoc.m_flB, sizeof( &pcAvatar->m_HRLoc.m_flB ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1109. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_FLOAT, &pcAvatar->m_HRLoc.m_flC, sizeof( &pcAvatar->m_HRLoc.m_flC ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1110. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_FLOAT, &pcAvatar->m_HRLoc.m_flW, sizeof( &pcAvatar->m_HRLoc.m_flW ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1111. */ retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_CHAR, dwCovPosX, sizeof( dwCovPosX ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1112. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_CHAR, dwCovPosY, sizeof( dwCovPosY ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1113. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_CHAR, dwCovPosZ, sizeof( dwCovPosZ ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1114. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_CHAR, dwCovOrientW, sizeof( dwCovOrientW ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1115. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_CHAR, dwCovOrientX, sizeof( dwCovOrientX ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1116. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_CHAR, dwCovOrientY, sizeof( dwCovOrientY ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1117. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_CHAR, dwCovOrientZ, sizeof( dwCovOrientZ ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1118. SQLFetch( cDatabase::m_hStmt );
  1119. sscanf(dwCovLandblock,"%08x",&pcAvatar->m_HRLoc.m_dwLandBlock);
  1120. sscanf(dwCovPosX,"%08x",&pcAvatar->m_HRLoc.m_flX);
  1121. sscanf(dwCovPosY,"%08x",&pcAvatar->m_HRLoc.m_flY);
  1122. sscanf(dwCovPosZ,"%08x",&pcAvatar->m_HRLoc.m_flZ);
  1123. sscanf(dwCovOrientW,"%08x",&pcAvatar->m_HRLoc.m_flA);
  1124. sscanf(dwCovOrientX,"%08x",&pcAvatar->m_HRLoc.m_flB);
  1125. sscanf(dwCovOrientY,"%08x",&pcAvatar->m_HRLoc.m_flC);
  1126. sscanf(dwCovOrientZ,"%08x",&pcAvatar->m_HRLoc.m_flW);
  1127. retcode = SQLCloseCursor( cDatabase::m_hStmt ); CHECKRETURN( 0, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL )
  1128. }
  1129. retcode = SQLFreeStmt( cDatabase::m_hStmt, SQL_UNBIND ); CHECKRETURN( 0, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL )
  1130. }
  1131. // Load the Primary Spell Info - Tells us the lengths of the Vectors to load
  1132. sprintf( szCommand, "SELECT * FROM avatar_spells WHERE OwnerGUID='%lu';", dwGUID); CHECKRETURN( 0, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL )
  1133. retcode = SQLPrepare( m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN( 0, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL )
  1134. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 0, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL )
  1135. iCol = 3;
  1136. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_USHORT, &pcAvatar->m_wSpellCount , sizeof( WORD ), NULL );
  1137. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_ULONG, &pcAvatar->m_dwSpellUnknown , sizeof( DWORD ), NULL );
  1138. //k109: This appears to be just the loading of the tabs. Spellcount only used in next section.
  1139. for(i=0;i < 7; i++)
  1140. {
  1141. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_ULONG, &pcAvatar->m_SpellTabs[i].dwTabCount , sizeof( DWORD ), NULL );
  1142. }
  1143. retcode = SQLFetch( m_hStmt ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  1144. retcode = SQLCloseCursor( m_hStmt ); CHECKRETURN(0, SQL_HANDLE_STMT, m_hStmt, NULL)
  1145. retcode = SQLFreeStmt( m_hStmt, SQL_UNBIND ); CHECKRETURN( 0, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL )
  1146. // Load Vector Spell Book into Array
  1147. if(pcAvatar->m_wSpellCount != 0)
  1148. { // If Spell Count = 0 than nothing to load
  1149. sprintf( szCommand, "SELECT * FROM avatar_vector_spellbook WHERE OwnerGUID=%lu;",pcAvatar->GetGUID());
  1150. retcode = SQLPrepare( m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN( 0, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL )
  1151. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 0, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL )
  1152. iCol = 4;
  1153. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_ULONG, &dwSpellID, sizeof( DWORD ), NULL );
  1154. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_FLOAT, &flCharge, sizeof( flCharge ), NULL );
  1155. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_USHORT, &wSpellType, sizeof( WORD), NULL );
  1156. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_ULONG, &dwUnkA, sizeof( DWORD ), NULL );
  1157. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_ULONG, &dwUnkB, sizeof( DWORD ), NULL );
  1158. for ( int intSB = 0; SQLFetch( m_hStmt ) == SQL_SUCCESS && intSB < pcAvatar->m_wSpellCount; intSB++ )
  1159. {
  1160. pcAvatar->m_SpellBook[intSB].dwSpell_ID = dwSpellID;
  1161. pcAvatar->m_SpellBook[intSB].flCharge = flCharge;
  1162. pcAvatar->m_SpellBook[intSB].wSpellType= wSpellType;
  1163. pcAvatar->m_SpellBook[intSB].dwUnknownA = dwUnkA;
  1164. pcAvatar->m_SpellBook[intSB].dwUnknownB = dwUnkB;
  1165. }
  1166. retcode = SQLCloseCursor( m_hStmt ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  1167. retcode = SQLFreeStmt( m_hStmt, SQL_UNBIND ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  1168. // Load Vector SpellTabs into Array
  1169. sprintf( szCommand, "SELECT * FROM avatar_vector_spelltabs WHERE OwnerGUID=%lu;",pcAvatar->GetGUID());
  1170. retcode = SQLPrepare( m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN( 0, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL )
  1171. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 0, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL )
  1172. iCol = 3;
  1173. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_USHORT, &intCount, sizeof( intCount ), NULL );
  1174. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_USHORT, &intTab, sizeof( intTab ), NULL );
  1175. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_ULONG, &dwSpell, sizeof( dwSpell ), NULL );
  1176. for ( int intST = 0; SQLFetch( m_hStmt ) == SQL_SUCCESS && intST < pcAvatar->m_wSpellCount; intST++ )
  1177. {
  1178. pcAvatar->m_SpellTabs[intTab].dwSpell_ID[intCount] = dwSpell;
  1179. }
  1180. retcode = SQLCloseCursor( m_hStmt ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  1181. retcode = SQLFreeStmt( m_hStmt, SQL_UNBIND ); CHECKRETURN(1, SQL_HANDLE_STMT, m_hStmt, NULL)
  1182. }// End Spell If
  1183. //////////////////// Start Inventory Stuff ////////////////
  1184. // Load Vector Inventory Count
  1185. sprintf( szCommand, "SELECT COUNT(ID) FROM items_instance_inventory WHERE OwnerGUID=%lu;",pcAvatar->GetGUID());
  1186. retcode = SQLPrepare( m_hStmt, (unsigned char *)szCommand, SQL_NTS );
  1187. retcode = SQLExecute( m_hStmt );
  1188. if(SQLFetch( m_hStmt ) == SQL_SUCCESS)
  1189. {
  1190. retcode = SQLBindCol( m_hStmt, iCol++, SQL_C_ULONG, &pcAvatar->m_dwInventoryCount, sizeof( pcAvatar->m_dwInventoryCount ), NULL );
  1191. }
  1192. else
  1193. {
  1194. pcAvatar->m_dwInventoryCount = 0;
  1195. }
  1196. retcode = SQLCloseCursor( m_hStmt );
  1197. retcode = SQLFreeStmt( m_hStmt, SQL_UNBIND );
  1198. // Load Vector Inventory into Array
  1199. if(pcAvatar->m_dwInventoryCount > 0)
  1200. { // Only do if there is actually something in the Inventory
  1201. DWORD ObjectGUID;
  1202. char data[512];
  1203. DWORD dwItemModelNumber;
  1204. DWORD dwItemAmount;
  1205. WORD wIcon;
  1206. // int intColor;
  1207. char spells[255];
  1208. sprintf( szCommand, "SELECT GUID,Data FROM items_instance_inventory WHERE OwnerGUID = %lu;",pcAvatar->GetGUID() );
  1209. retcode = SQLPrepare( cDatabase::m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1210. retcode = SQLExecute( cDatabase::m_hStmt ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1211. retcode = SQLBindCol( cDatabase::m_hStmt, 2, SQL_C_ULONG, &ObjectGUID, sizeof( DWORD ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1212. retcode = SQLBindCol( cDatabase::m_hStmt, 5, SQL_C_CHAR, &data, sizeof( data ), NULL ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1213. for ( int i = 0; SQLFetch( cDatabase::m_hStmt ) == SQL_SUCCESS; i++ )
  1214. {
  1215. sscanf(data,"%d %d %d %s",&dwItemModelNumber,&dwItemAmount,&wIcon,&spells);
  1216. cItemModels *pcModel = cItemModels::FindModel(dwItemModelNumber); //Find the model
  1217. for ( int intINV = 0; SQLFetch( m_hStmt ) == SQL_SUCCESS; intINV++ )
  1218. {
  1219. pcAvatar->m_vInventory[intINV].dwObjectGUID = ObjectGUID;
  1220. pcAvatar->m_vInventory[intINV].dwIsContainer = pcModel->m_isContainer;
  1221. }
  1222. }
  1223. retcode = SQLCloseCursor( m_hStmt ); CHECKRETURN( 0, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL )
  1224. retcode = SQLFreeStmt( m_hStmt, SQL_UNBIND ); CHECKRETURN( 0, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL )
  1225. }// End Inventory If
  1226. //////////////////// End Inventory Stuff ////////////////
  1227. }
  1228. /**
  1229. * Populates a list with the information on the name and location of dungeons.
  1230. */
  1231. BOOL cDatabase::LoadDungeonList( char strName, std::vector< cDungeonList > &DungeonList )
  1232. {
  1233. DungeonList.clear( );
  1234. cDungeonList cDL;
  1235. char szCommand[200];
  1236. char szName[75];
  1237. INT intID;
  1238. char dwLandblock[9];
  1239. char dwPosX[9];
  1240. char dwPosY[9];
  1241. char dwPosZ[9];
  1242. char dwOrientW[9];
  1243. // char dwOrientX[9];
  1244. // char dwOrientY[9];
  1245. // char dwOrientZ[9];
  1246. // float fPosX;
  1247. // float fPosY;
  1248. // float fPosZ;
  1249. // float fHeading;
  1250. RETCODE retcode;
  1251. sprintf( szCommand, "SELECT ID, Name, Landblock, Position_X, Position_Y, Position_Z, Heading FROM dungeons WHERE Name=%d;", strName );
  1252. int iCol = 1;
  1253. retcode = SQLPrepare( cDatabase::m_hStmt, (unsigned char *)szCommand, SQL_NTS); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  1254. retcode = SQLExecute( cDatabase::m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  1255. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_USHORT, &intID, sizeof( INT ), NULL ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  1256. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_CHAR, szName, sizeof( szName ), NULL ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  1257. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_CHAR, dwLandblock, sizeof( dwLandblock ), NULL ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  1258. /* retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_FLOAT, &fPosX, sizeof( &fPosX ), NULL ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  1259. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_FLOAT, &fPosY, sizeof( &fPosY ), NULL ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  1260. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_FLOAT, &fPosZ, sizeof( &fPosZ ), NULL ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  1261. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_FLOAT, &fHeading, sizeof( &fHeading ), NULL ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  1262. */ retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_CHAR, dwPosX, sizeof( dwPosX ), NULL ); CHECKRETURN( 1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1263. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_CHAR, dwPosY, sizeof( dwPosY ), NULL ); CHECKRETURN( 1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1264. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_CHAR, dwPosZ, sizeof( dwPosZ ), NULL ); CHECKRETURN( 1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1265. retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_CHAR, dwOrientW, sizeof( dwOrientW ), NULL ); CHECKRETURN( 1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1266. // retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_CHAR, dwOrientX, sizeof( dwOrientX ), NULL ); CHECKRETURN( 1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1267. // retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_CHAR, dwOrientY, sizeof( dwOrientY ), NULL ); CHECKRETURN( 1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1268. // retcode = SQLBindCol( cDatabase::m_hStmt, iCol++, SQL_C_CHAR, dwOrientZ, sizeof( dwOrientZ ), NULL ); CHECKRETURN( 1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1269. for ( int i = 0; SQLFetch( m_hStmt ) == SQL_SUCCESS; ++i ) {
  1270. sscanf(dwLandblock,"%08x",&cDL.m_dwLandblock);
  1271. sscanf(dwPosX,"%08x",&cDL.m_flLocX);
  1272. sscanf(dwPosY,"%08x",&cDL.m_flLocX);
  1273. sscanf(dwPosZ,"%08x",&cDL.m_flLocZ);
  1274. sscanf(dwOrientW,"%08x",&cDL.m_flHeading);
  1275. // sscanf(dwOrientX,"%08x",&cDL.m_flB);
  1276. // sscanf(dwOrientY,"%08x",&cDL.m_flC);
  1277. // sscanf(dwOrientZ,"%08x",&cDL.m_flW);
  1278. cDL.m_intID = intID;
  1279. cDL.m_strName = szName;
  1280. DungeonList.push_back( cDL );
  1281. }
  1282. retcode = SQLCloseCursor( m_hStmt ); CHECKRETURN( 0, SQL_HANDLE_STMT, m_hStmt, NULL )
  1283. retcode = SQLFreeStmt( m_hStmt, SQL_UNBIND ); CHECKRETURN( 0, SQL_HANDLE_STMT, m_hStmt, NULL )
  1284. if (SQL_SUCCESS) { return TRUE; }
  1285. if (!SQL_SUCCESS) { return FALSE; }
  1286. }
  1287. void cDatabase::InitializeMaxModel( )
  1288. {
  1289. char szCommand[150];
  1290. // char szMaxModel[150];
  1291. RETCODE retcode;
  1292. sprintf( szCommand, "SELECT MAX(ModelNUM) FROM npcs_models;" );
  1293. retcode = SQLPrepare( m_hStmt, (BYTE *)szCommand, SQL_NTS ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  1294. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  1295. retcode = SQLBindCol( m_hStmt, 1, SQL_C_ULONG, &wMaxModel, sizeof( wMaxModel ), NULL ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  1296. retcode = SQLFetch( m_hStmt );
  1297. if( retcode == SQL_NO_DATA )
  1298. wMaxModel = 0;
  1299. retcode = SQLCloseCursor( m_hStmt ); CHECKRETURN( 0, SQL_HANDLE_STMT, m_hStmt, NULL )
  1300. retcode = SQLFreeStmt( m_hStmt, SQL_UNBIND ); CHECKRETURN( 0, SQL_HANDLE_STMT, m_hStmt, NULL )
  1301. // sprintf( szMaxModel, " Max Model Number has been set to: %d.\r\n",wMaxModel );
  1302. // UpdateConsole((char *)szMaxModel);
  1303. // UpdateConsole("\r\n");
  1304. }
  1305. void cDatabase::LoadModelList( )
  1306. {
  1307. char szCommand[100];
  1308. // char szModels[150];
  1309. DWORD dwModelCount;
  1310. char szName[100];
  1311. WORD wModelNum;
  1312. RETCODE retcode;
  1313. sprintf( szCommand, "SELECT COUNT(ID) FROM npcs_models;" );
  1314. retcode = SQLPrepare( cDatabase::m_hStmt, (BYTE *)szCommand, SQL_NTS ); CHECKRETURN( 1, SQL_HANDLE_STMT, cDatabase::m_hStmt, 1 )
  1315. retcode = SQLExecute( cDatabase::m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, cDatabase::m_hStmt, 1 )
  1316. retcode = SQLBindCol( cDatabase::m_hStmt, 1, SQL_C_ULONG, &dwModelCount, sizeof( dwModelCount ), NULL ); CHECKRETURN( 1, SQL_HANDLE_STMT, cDatabase::m_hStmt, 1 )
  1317. retcode = SQLFetch( cDatabase::m_hStmt );
  1318. if( retcode == SQL_NO_DATA )
  1319. dwModelCount = 0;
  1320. retcode = SQLCloseCursor( cDatabase::m_hStmt ); CHECKRETURN( 0, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL )
  1321. retcode = SQLFreeStmt( cDatabase::m_hStmt, SQL_UNBIND ); CHECKRETURN( 0, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL )
  1322. // sprintf( szModels, " Loading %d models ... ",dwModelCount );
  1323. // UpdateConsole((char *)szModels);
  1324. sprintf( szCommand, "SELECT ModelNum, ModelName FROM npcs_models ORDER BY ModelNum;" );
  1325. retcode = SQLPrepare( m_hStmt, (BYTE *)szCommand, SQL_NTS ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  1326. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  1327. retcode = SQLBindCol( m_hStmt, 1, SQL_C_USHORT, &wModelNum, sizeof( wModelNum ), NULL ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  1328. retcode = SQLBindCol( m_hStmt, 2, SQL_C_CHAR, &szName, sizeof( szName ), NULL ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  1329. for ( int i = 0; SQLFetch( m_hStmt ) == SQL_SUCCESS; ++i )
  1330. {
  1331. sprintf( szModelName[i],"%s",szName );
  1332. sprintf( szModelNumber[i],"%d",wModelNum );
  1333. }
  1334. retcode = SQLCloseCursor( m_hStmt ); CHECKRETURN( 0, SQL_HANDLE_STMT, m_hStmt, NULL )
  1335. retcode = SQLFreeStmt( m_hStmt, SQL_UNBIND ); CHECKRETURN( 0, SQL_HANDLE_STMT, m_hStmt, NULL )
  1336. }
  1337. /**
  1338. * Adds items to the avatar's inventory table
  1339. */
  1340. void cDatabase::AddToInventoryDB(DWORD dwAvatarGUID, cObject* pcObj)
  1341. {
  1342. char data[512];
  1343. sprintf (data, "%d %d %d %d %s",pcObj->m_dwModel,pcObj->m_wStack,pcObj->m_intColor,pcObj->m_wIcon,"1");
  1344. char szCommand[512];
  1345. RETCODE retcode;
  1346. sprintf( szCommand, "INSERT INTO items_instance_inventory (GUID, OwnerGUID, Equipped, Data) VALUES(%lu, %lu, %d, '%s');",pcObj->m_dwGUID,dwAvatarGUID,0,data);
  1347. retcode = SQLPrepare( cDatabase::m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1348. retcode = SQLExecute( cDatabase::m_hStmt ); CHECKRETURN(0, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1349. retcode = SQLFreeStmt( cDatabase::m_hStmt, SQL_CLOSE );
  1350. }
  1351. /**
  1352. * Removes items from the avatar's inventory table
  1353. */
  1354. void cDatabase::RemoveFromInventoryDB(DWORD dwAvatarGUID, DWORD dwObjectGUID)
  1355. {
  1356. char szCommand[512];
  1357. RETCODE retcode;
  1358. sprintf( szCommand, "DELETE FROM items_instance_inventory WHERE OwnerGUID = %lu AND GUID = %lu;",dwAvatarGUID,dwObjectGUID);
  1359. retcode = SQLPrepare( cDatabase::m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1360. retcode = SQLExecute( cDatabase::m_hStmt ); CHECKRETURN(0, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1361. retcode = SQLFreeStmt( cDatabase::m_hStmt, SQL_CLOSE );
  1362. }
  1363. /**
  1364. * Adds spells to the avatars spell book.
  1365. *
  1366. * @param dwAvatarGUID = The Avatar GUID
  1367. * @param SpellCount = Total spell count for this Avatar
  1368. * @param SpellID = The ID of the spell to add
  1369. *
  1370. * Author: k109
  1371. */
  1372. void cDatabase::AddSpell (DWORD dwAvatarGUID, int SpellCount, int SpellID)
  1373. {
  1374. char szCommand[500];
  1375. RETCODE retcode;
  1376. sprintf( szCommand, "INSERT INTO avatar_vector_spellbook (OwnerGUID, ItemCount, dwSpellID, flCharge, intSpellType, dwUnknownA, dwUnknownB) VALUES(%lu,%d,%d,1,0,0,0);",dwAvatarGUID,SpellCount,SpellID);
  1377. retcode = SQLPrepare( m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  1378. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  1379. retcode = SQLFreeStmt( m_hStmt, SQL_CLOSE );
  1380. }
  1381. /**
  1382. * Adds spells to the avatar's spell tab.
  1383. *
  1384. * dwAvatarGUID = The Avatar GUID
  1385. * SpellID = The ID of the spell to add
  1386. * SpellCount = Total spell count for this Avatar
  1387. * TabID = ID of the Spell Tab
  1388. *
  1389. * Author: k109
  1390. */
  1391. void cDatabase::AddSpellToTab (DWORD dwAvatarGUID, int SpellID, int SpellCount, int TabID)
  1392. {
  1393. char szCommand[500];
  1394. RETCODE retcode;
  1395. sprintf( szCommand, "INSERT INTO avatar_vector_spelltabs (OwnerGUID, ItemCount, Tab_Num, dwSpellID) VALUES(%d,%d,%d,%d);",dwAvatarGUID,SpellCount,TabID,SpellID);
  1396. retcode = SQLPrepare( m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  1397. retcode = SQLExecute( m_hStmt ); CHECKRETURN( 1, SQL_HANDLE_STMT, m_hStmt, 1 )
  1398. retcode = SQLFreeStmt( m_hStmt, SQL_CLOSE );
  1399. }
  1400. void cDatabase::AddGeneralItems (DWORD dwAvatarGUID)
  1401. {
  1402. /*
  1403. pcModel = cItemModels::FindModel(2);
  1404. cPyreals *StartingCash = new cPyreals(cWorldManager::NewGUID_Object(),dwAvatarGUID,pcModel->m_dwModelID,pcModel->m_wIcon,pcModel->m_strName,pcModel->m_strDescription,pcModel->m_dwValue,10000,25000);
  1405. AddToInventoryDB(dwAvatarGUID, StartingCash);
  1406. */
  1407. cItemModels *pcModel;
  1408. pcModel = cItemModels::FindModel(1965);
  1409. cObject *CallingStone = new cGems(cWorldManager::NewGUID_Object(),dwAvatarGUID,pcModel->m_dwModelID,pcModel->m_wIcon,pcModel->m_strName,pcModel->m_strDescription,pcModel->m_dwValue, pcModel->m_wBurden);
  1410. AddToInventoryDB(dwAvatarGUID, CallingStone);
  1411. pcModel = cItemModels::FindModel(1964);
  1412. cObject *WelcomeLetter = new cBooks(cWorldManager::NewGUID_Object(),dwAvatarGUID,pcModel->m_dwModelID,pcModel->m_wIcon,pcModel->m_strName,pcModel->m_strDescription,pcModel->m_dwValue, pcModel->m_wBurden);
  1413. AddToInventoryDB(dwAvatarGUID, WelcomeLetter);
  1414. }
  1415. void cDatabase::AddRaceItemsAluvian (DWORD dwAvatarGUID)
  1416. {
  1417. cItemModels *pcModel;
  1418. pcModel = cItemModels::FindModel(218);
  1419. cObject *Bread = new cFood(cWorldManager::NewGUID_Object(),dwAvatarGUID,pcModel->m_dwModelID,pcModel->m_wIcon,pcModel->m_strName,pcModel->m_strDescription,pcModel->m_dwValue,5,pcModel->m_wBurden,2,5);
  1420. AddToInventoryDB(dwAvatarGUID, Bread);
  1421. pcModel = cItemModels::FindModel(1954);
  1422. cObject *Dagger = new cWeapon(cWorldManager::NewGUID_Object(),dwAvatarGUID,pcModel->m_dwModelID,1.0,TRUE,pcModel->m_wIcon,pcModel->m_strName,pcModel->m_strDescription,
  1423. pcModel->m_dwValue,pcModel->m_wBurden,pcModel->m_bWieldType,pcModel->m_dwIconHighlight,pcModel->m_fWorkmanship,pcModel->m_dwMaterialType,3,25,0x0D,0x04,.75,1,.5,0);
  1424. AddToInventoryDB(dwAvatarGUID, Dagger);
  1425. }
  1426. void cDatabase::AddRaceItemsGharundim (DWORD dwAvatarGUID)
  1427. {
  1428. cItemModels *pcModel;
  1429. pcModel = cItemModels::FindModel(218);
  1430. cObject *Bread = new cFood(cWorldManager::NewGUID_Object(),dwAvatarGUID,pcModel->m_dwModelID,pcModel->m_wIcon,pcModel->m_strName,pcModel->m_strDescription,pcModel->m_dwValue,5,pcModel->m_wBurden,2,5);
  1431. AddToInventoryDB(dwAvatarGUID, Bread);
  1432. pcModel = cItemModels::FindModel(1961);
  1433. cObject *Staff = new cWeapon(cWorldManager::NewGUID_Object(),dwAvatarGUID,pcModel->m_dwModelID,1.0,TRUE,pcModel->m_wIcon,pcModel->m_strName,pcModel->m_strDescription,
  1434. pcModel->m_dwValue,pcModel->m_wBurden,pcModel->m_bWieldType,pcModel->m_dwIconHighlight,pcModel->m_fWorkmanship,pcModel->m_dwMaterialType,3,25,0x0D,0x04,.75,1,.5,0);
  1435. AddToInventoryDB(dwAvatarGUID, Staff);
  1436. }
  1437. void cDatabase::AddRaceItemsSho (DWORD dwAvatarGUID)
  1438. {
  1439. cItemModels *pcModel;
  1440. pcModel = cItemModels::FindModel(266);
  1441. cObject *Apples = new cFood(cWorldManager::NewGUID_Object(),dwAvatarGUID,pcModel->m_dwModelID,pcModel->m_wIcon,pcModel->m_strName,pcModel->m_strDescription,pcModel->m_dwValue,5,pcModel->m_wBurden,2,5);
  1442. AddToInventoryDB(dwAvatarGUID, Apples);
  1443. pcModel = cItemModels::FindModel(1957);
  1444. cObject *Cestus = new cWeapon(cWorldManager::NewGUID_Object(),dwAvatarGUID,pcModel->m_dwModelID,1.0,TRUE,pcModel->m_wIcon,pcModel->m_strName,pcModel->m_strDescription,
  1445. pcModel->m_dwValue,pcModel->m_wBurden,pcModel->m_bWieldType,pcModel->m_dwIconHighlight,pcModel->m_fWorkmanship,pcModel->m_dwMaterialType,3,25,0x0D,0x04,.75,1,.5,0);
  1446. AddToInventoryDB(dwAvatarGUID, Cestus);
  1447. }
  1448. void cDatabase::AddCasterItems (DWORD dwAvatarGUID)
  1449. {
  1450. cItemModels *pcModel;
  1451. pcModel = cItemModels::FindModel(1966);
  1452. cObject *StarterWand = new cWands(cWorldManager::NewGUID_Object(),dwAvatarGUID,pcModel->m_dwModelID,1.0,TRUE,pcModel->m_wIcon,pcModel->m_strName,pcModel->m_strDescription,pcModel->m_dwValue, pcModel->m_wBurden);
  1453. AddToInventoryDB(dwAvatarGUID, StarterWand);
  1454. pcModel = cItemModels::FindModel(321); //Lead Scarabs
  1455. cObject *Scarabs = new cSpellComps(cWorldManager::NewGUID_Object(),dwAvatarGUID,pcModel->m_dwModelID,pcModel->m_wIcon,pcModel->m_strName,pcModel->m_strDescription,pcModel->m_dwValue,5,pcModel->m_wBurden);
  1456. Scarabs->m_wStack = 5;
  1457. AddToInventoryDB(dwAvatarGUID, Scarabs);
  1458. pcModel = cItemModels::FindModel(327); //Prismatic tapers
  1459. cObject *Tapers = new cSpellComps(cWorldManager::NewGUID_Object(),dwAvatarGUID,pcModel->m_dwModelID,pcModel->m_wIcon,pcModel->m_strName,pcModel->m_strDescription,pcModel->m_dwValue,5,pcModel->m_wBurden);
  1460. Tapers->m_wStack = 25;
  1461. AddToInventoryDB(dwAvatarGUID, Tapers);
  1462. }
  1463. void cDatabase::AddProfessionItems (DWORD dwAvatarGUID, CreateCharacterMessage &ccm)
  1464. {
  1465. cItemModels *pcModel;
  1466. if (ccm.dwSkillStatus[SKILL_HEALING] == 2 || ccm.dwSkillStatus[SKILL_HEALING] == 3)
  1467. {
  1468. pcModel = cItemModels::FindModel(290);
  1469. cHealingCon *kit = new cHealingCon(cWorldManager::NewGUID_Object(),dwAvatarGUID,pcModel->m_dwModelID,1.0,TRUE,pcModel->m_wIcon,pcModel->m_strName,pcModel->m_strDescription,pcModel->m_wBurden,pcModel->m_dwValue,pcModel->m_wUses,pcModel->m_wUseLimit);
  1470. AddToInventoryDB(dwAvatarGUID, kit);
  1471. }
  1472. if (ccm.dwSkillStatus[SKILL_LOCKPICK] == 2 || ccm.dwSkillStatus[SKILL_LOCKPICK] == 3)
  1473. {
  1474. pcModel = cItemModels::FindModel(188);
  1475. cLockpicks* Picks = new cLockpicks(cWorldManager::NewGUID_Object(),dwAvatarGUID,pcModel->m_dwModelID,1.0,TRUE,pcModel->m_wIcon,pcModel->m_strName,pcModel->m_strDescription,pcModel->m_wUses, pcModel->m_wUseLimit);
  1476. AddToInventoryDB(dwAvatarGUID, Picks);
  1477. }
  1478. if (ccm.dwSkillStatus[SKILL_AXE] == 2 || ccm.dwSkillStatus[SKILL_AXE] == 3)
  1479. {
  1480. pcModel = cItemModels::FindModel(1959);
  1481. cObject *Axe = new cWeapon(cWorldManager::NewGUID_Object(),dwAvatarGUID,pcModel->m_dwModelID,1.0,TRUE,pcModel->m_wIcon,pcModel->m_strName,pcModel->m_strDescription,
  1482. pcModel->m_dwValue,pcModel->m_wBurden,pcModel->m_bWieldType,pcModel->m_dwIconHighlight,pcModel->m_fWorkmanship,pcModel->m_dwMaterialType,3,25,0x0D,0x04,.75,1,.5,0);
  1483. AddToInventoryDB(dwAvatarGUID, Axe);
  1484. }
  1485. if (ccm.dwSkillStatus[SKILL_BOW] == 2 || ccm.dwSkillStatus[SKILL_BOW] == 3)
  1486. {
  1487. pcModel = cItemModels::FindModel(1955);
  1488. cObject *Shortbow = new cAmmo(cWorldManager::NewGUID_Object(),dwAvatarGUID,pcModel->m_dwModelID,pcModel->m_wIcon,pcModel->m_strName,pcModel->m_strDescription,pcModel->m_dwValue,pcModel->m_wBurden,1,1);
  1489. AddToInventoryDB(dwAvatarGUID, Shortbow);
  1490. pcModel = cItemModels::FindModel(147);
  1491. cObject *Arrows = new cAmmo(cWorldManager::NewGUID_Object(),dwAvatarGUID,pcModel->m_dwModelID,pcModel->m_wIcon,pcModel->m_strName,pcModel->m_strDescription,pcModel->m_dwValue,pcModel->m_wBurden,250,250);
  1492. Arrows->m_wStack = 250;
  1493. AddToInventoryDB(dwAvatarGUID, Arrows);
  1494. }
  1495. if (ccm.dwSkillStatus[SKILL_CROSSBOW] == 2 || ccm.dwSkillStatus[SKILL_CROSSBOW] == 3)
  1496. {
  1497. pcModel = cItemModels::FindModel(1962);
  1498. cObject *LightXbow = new cAmmo(cWorldManager::NewGUID_Object(),dwAvatarGUID,pcModel->m_dwModelID,pcModel->m_wIcon,pcModel->m_strName,pcModel->m_strDescription,pcModel->m_dwValue,pcModel->m_wBurden,1,1);
  1499. AddToInventoryDB(dwAvatarGUID, LightXbow);
  1500. pcModel = cItemModels::FindModel(145);
  1501. cObject *Quarrel = new cAmmo(cWorldManager::NewGUID_Object(),dwAvatarGUID,pcModel->m_dwModelID,pcModel->m_wIcon,pcModel->m_strName,pcModel->m_strDescription,pcModel->m_dwValue,pcModel->m_wBurden,250,250);
  1502. Quarrel->m_wStack = 250;
  1503. AddToInventoryDB(dwAvatarGUID, Quarrel);
  1504. }
  1505. if (ccm.dwSkillStatus[SKILL_DAGGER] == 2 || ccm.dwSkillStatus[SKILL_DAGGER] == 3)
  1506. {
  1507. pcModel = cItemModels::FindModel(1954);
  1508. cObject *Dagger = new cWeapon(cWorldManager::NewGUID_Object(),dwAvatarGUID,pcModel->m_dwModelID,1.0,TRUE,pcModel->m_wIcon,pcModel->m_strName,pcModel->m_strDescription,
  1509. pcModel->m_dwValue,pcModel->m_wBurden,pcModel->m_bWieldType,pcModel->m_dwIconHighlight,pcModel->m_fWorkmanship,pcModel->m_dwMaterialType,3,25,0x0D,0x04,.75,1,.5,0);
  1510. AddToInventoryDB(dwAvatarGUID, Dagger);
  1511. }
  1512. if (ccm.dwSkillStatus[SKILL_MACE] == 2 || ccm.dwSkillStatus[SKILL_MACE] == 3)
  1513. {
  1514. pcModel = cItemModels::FindModel(1958);
  1515. cObject *Mace = new cWeapon(cWorldManager::NewGUID_Object(),dwAvatarGUID,pcModel->m_dwModelID,1.0,TRUE,pcModel->m_wIcon,pcModel->m_strName,pcModel->m_strDescription,
  1516. pcModel->m_dwValue,pcModel->m_wBurden,pcModel->m_bWieldType,pcModel->m_dwIconHighlight,pcModel->m_fWorkmanship,pcModel->m_dwMaterialType,3,25,0x0D,0x04,.75,1,.5,0);
  1517. AddToInventoryDB(dwAvatarGUID, Mace);
  1518. }
  1519. if (ccm.dwSkillStatus[SKILL_SPEAR] == 2 || ccm.dwSkillStatus[SKILL_SPEAR] == 3)
  1520. {
  1521. pcModel = cItemModels::FindModel(1960);
  1522. cObject *Spear = new cWeapon(cWorldManager::NewGUID_Object(),dwAvatarGUID,pcModel->m_dwModelID,1.0,TRUE,pcModel->m_wIcon,pcModel->m_strName,pcModel->m_strDescription,
  1523. pcModel->m_dwValue,pcModel->m_wBurden,pcModel->m_bWieldType,pcModel->m_dwIconHighlight,pcModel->m_fWorkmanship,pcModel->m_dwMaterialType,3,25,0x0D,0x04,.75,1,.5,0);
  1524. AddToInventoryDB(dwAvatarGUID, Spear);
  1525. }
  1526. if (ccm.dwSkillStatus[SKILL_STAFF] == 2 || ccm.dwSkillStatus[SKILL_STAFF] == 3)
  1527. {
  1528. pcModel = cItemModels::FindModel(1961);
  1529. cObject *Staff = new cWeapon(cWorldManager::NewGUID_Object(),dwAvatarGUID,pcModel->m_dwModelID,1.0,TRUE,pcModel->m_wIcon,pcModel->m_strName,pcModel->m_strDescription,
  1530. pcModel->m_dwValue,pcModel->m_wBurden,pcModel->m_bWieldType,pcModel->m_dwIconHighlight,pcModel->m_fWorkmanship,pcModel->m_dwMaterialType,3,25,0x0D,0x04,.75,1,.5,0);
  1531. AddToInventoryDB(dwAvatarGUID, Staff);
  1532. }
  1533. if (ccm.dwSkillStatus[SKILL_SWORD] == 2 || ccm.dwSkillStatus[SKILL_SWORD] == 3)
  1534. {
  1535. pcModel = cItemModels::FindModel(1956);
  1536. cObject *Sword = new cWeapon(cWorldManager::NewGUID_Object(),dwAvatarGUID,pcModel->m_dwModelID,1.0,TRUE,pcModel->m_wIcon,pcModel->m_strName,pcModel->m_strDescription,
  1537. pcModel->m_dwValue,pcModel->m_wBurden,pcModel->m_bWieldType,pcModel->m_dwIconHighlight,pcModel->m_fWorkmanship,pcModel->m_dwMaterialType,3,25,0x0D,0x04,.75,1,.5,0);
  1538. AddToInventoryDB(dwAvatarGUID, Sword);
  1539. }
  1540. if (ccm.dwSkillStatus[SKILL_THROWN_WEAPONS] == 2 || ccm.dwSkillStatus[SKILL_THROWN_WEAPONS] == 3)
  1541. {
  1542. pcModel = cItemModels::FindModel(1963);
  1543. cObject *Atlatl = new cAmmo(cWorldManager::NewGUID_Object(),dwAvatarGUID,pcModel->m_dwModelID,pcModel->m_wIcon,pcModel->m_strName,pcModel->m_strDescription,pcModel->m_dwValue,pcModel->m_wBurden,1,1);
  1544. AddToInventoryDB(dwAvatarGUID, Atlatl);
  1545. pcModel = cItemModels::FindModel(155);
  1546. cObject *Darts = new cAmmo(cWorldManager::NewGUID_Object(),dwAvatarGUID,pcModel->m_dwModelID,pcModel->m_wIcon,pcModel->m_strName,pcModel->m_strDescription,pcModel->m_dwValue,pcModel->m_wBurden,250,250);
  1547. Darts->m_wStack = 250;
  1548. AddToInventoryDB(dwAvatarGUID, Darts);
  1549. }
  1550. }
  1551. void cDatabase::AddFoci(DWORD dwAvatarGUID, CreateCharacterMessage &ccm)
  1552. {
  1553. cItemModels *pcModel;
  1554. if (ccm.dwSkillStatus[SKILL_WAR_MAGIC] == 2 || ccm.dwSkillStatus[SKILL_WAR_MAGIC] == 3)
  1555. {
  1556. pcModel = cItemModels::FindModel(287);
  1557. cObject *Foci = new cFoci(cWorldManager::NewGUID_Object(),dwAvatarGUID,pcModel->m_dwModelID,1.0,TRUE,pcModel->m_wIcon,pcModel->m_strName,pcModel->m_strDescription,pcModel->m_dwValue, pcModel->m_wBurden);
  1558. AddToInventoryDB(dwAvatarGUID, Foci);
  1559. }
  1560. if (ccm.dwSkillStatus[SKILL_LIFE_MAGIC] == 2 || ccm.dwSkillStatus[SKILL_LIFE_MAGIC] == 3)
  1561. {
  1562. pcModel = cItemModels::FindModel(286);
  1563. cObject *Foci = new cFoci(cWorldManager::NewGUID_Object(),dwAvatarGUID,pcModel->m_dwModelID,1.0,TRUE,pcModel->m_wIcon,pcModel->m_strName,pcModel->m_strDescription,pcModel->m_dwValue, pcModel->m_wBurden);
  1564. AddToInventoryDB(dwAvatarGUID, Foci);
  1565. }
  1566. if (ccm.dwSkillStatus[SKILL_ITEM_ENCHANTMENT] == 2 || ccm.dwSkillStatus[SKILL_ITEM_ENCHANTMENT] == 3)
  1567. {
  1568. pcModel = cItemModels::FindModel(289);
  1569. cObject *Foci = new cFoci(cWorldManager::NewGUID_Object(),dwAvatarGUID,pcModel->m_dwModelID,1.0,TRUE,pcModel->m_wIcon,pcModel->m_strName,pcModel->m_strDescription,pcModel->m_dwValue, pcModel->m_wBurden);
  1570. AddToInventoryDB(dwAvatarGUID, Foci);
  1571. }
  1572. if (ccm.dwSkillStatus[SKILL_CREATURE_ENCHANTMENT] == 2 || ccm.dwSkillStatus[SKILL_CREATURE_ENCHANTMENT] == 3)
  1573. {
  1574. pcModel = cItemModels::FindModel(288);
  1575. cObject *Foci = new cFoci(cWorldManager::NewGUID_Object(),dwAvatarGUID,pcModel->m_dwModelID,1.0,TRUE,pcModel->m_wIcon,pcModel->m_strName,pcModel->m_strDescription,pcModel->m_dwValue, pcModel->m_wBurden);
  1576. AddToInventoryDB(dwAvatarGUID, Foci);
  1577. }
  1578. }
  1579. void cDatabase::SaveCharacterFlags(DWORD dwAvatarGUID, DWORD Flags)
  1580. {
  1581. char szCommand[100];
  1582. RETCODE retcode;
  1583. sprintf( szCommand, "UPDATE avatar SET OptionsFlag = ('%08x') WHERE AvatarGUID = %lu;",Flags,dwAvatarGUID);
  1584. retcode = SQLPrepare( cDatabase::m_hStmt, (unsigned char *)szCommand, SQL_NTS ); CHECKRETURN(1, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1585. retcode = SQLExecute( cDatabase::m_hStmt );
  1586. retcode = SQLCloseCursor( cDatabase::m_hStmt ); CHECKRETURN(0, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1587. retcode = SQLFreeStmt( cDatabase::m_hStmt, SQL_UNBIND ); CHECKRETURN(0, SQL_HANDLE_STMT, cDatabase::m_hStmt, NULL)
  1588. }
  1589. /**
  1590. * Converts 32-bit hexadecimal values to floating point numbers.
  1591. *
  1592. * Expects hexadecimal input. Returns a float value.
  1593. */
  1594. float cDatabase::Hex2Float (DWORD hexValue)
  1595. {
  1596. char charArrayValue[9];
  1597. float floatValue;
  1598. sscanf(charArrayValue,"%08x",&floatValue);
  1599. return floatValue;
  1600. }
  1601. /**
  1602. * Converts floating point numbers to 32-bit hexadecimal values.
  1603. *
  1604. * Expects float input. Returns DWORD.
  1605. */
  1606. DWORD cDatabase::Float2Hex (float floatValue)
  1607. {
  1608. union
  1609. {
  1610. float f;
  1611. unsigned char b[sizeof(float)];
  1612. } v = { floatValue };
  1613. size_t s;
  1614. // char c[8];
  1615. // Big Endian
  1616. // for ( s = 0; s < sizeof(v.b); ++s) { sprintf(c, "%02X", v.b[s]); }
  1617. // Little Endian
  1618. // for ( s = sizeof(v.b); s > 0; --s) { sprintf(c, "%02X", v.b[i-s]); }
  1619. char c1[2], c2[2], c3[2], c4[2];
  1620. char hexTemp[9];
  1621. DWORD hexValue;
  1622. s = sizeof(v.b);
  1623. sprintf(c1, "%02X", v.b[s-1]);
  1624. sprintf(c2, "%02X", v.b[s-2]);
  1625. sprintf(c3, "%02X", v.b[s-3]);
  1626. sprintf(c4, "%02X", v.b[s-4]);
  1627. int i, j;
  1628. i = j = 0;
  1629. while(c1[i]) { hexTemp[i] = c1[i]; ++i;}
  1630. j = 0;
  1631. while(c2[j]) { hexTemp[i] = c2[j]; ++i; ++j; }
  1632. j = 0;
  1633. while(c3[j]) { hexTemp[i] = c3[j]; ++i; ++j; }
  1634. j = 0;
  1635. while(c4[j]) { hexTemp[i] = c4[j]; ++i; ++j; }
  1636. hexTemp[i] = '\0';
  1637. sscanf(hexTemp,"%08x",&hexValue);
  1638. return hexValue;
  1639. }