📄 dbagent.cpp
字号:
// DBAgent.cpp: implementation of the CDBAgent class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Aujard.h"
#include "DBAgent.h"
#include "AujardDlg.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
extern CRITICAL_SECTION g_LogFileWrite;
CDBAgent::CDBAgent()
{
}
CDBAgent::~CDBAgent()
{
}
BOOL CDBAgent::DatabaseInit()
{
// Main DB Connecting..
/////////////////////////////////////////////////////////////////////////////////////
m_pMain = (CAujardDlg*)AfxGetMainWnd();
CString strConnect;
strConnect.Format (_T("ODBC;DSN=%s;UID=%s;PWD=%s"), m_pMain->m_strGameDSN, m_pMain->m_strGameUID, m_pMain->m_strGamePWD );
m_GameDB.SetLoginTimeout (10);
if( !m_GameDB.Open(NULL,FALSE,FALSE,strConnect) )
{
AfxMessageBox("GameDB SQL Connection Fail...");
return FALSE;
}
strConnect.Format (_T("ODBC;DSN=%s;UID=%s;PWD=%s"), m_pMain->m_strAccountDSN, m_pMain->m_strAccountUID, m_pMain->m_strAccountPWD );
m_AccountDB.SetLoginTimeout (10);
if( !m_AccountDB.Open(NULL,FALSE,FALSE,strConnect) )
{
AfxMessageBox("AccountDB SQL Connection Fail...");
return FALSE;
}
m_AccountDB1.SetLoginTimeout (10);
if( !m_AccountDB1.Open(NULL,FALSE,FALSE,strConnect) )
{
AfxMessageBox("AccountDB1 SQL Connection Fail...");
return FALSE;
}
return TRUE;
}
void CDBAgent::ReConnectODBC(CDatabase *m_db, char *strdb, char *strname, char *strpwd)
{
char strlog[256]; memset( strlog, 0x00, 256);
CTime t = CTime::GetCurrentTime();
sprintf(strlog, "Try ReConnectODBC... \r\n");
m_pMain->WriteLogFile( strlog );
//m_pMain->m_LogFile.Write(strlog, strlen(strlog));
// DATABASE 楷搬...
CString strConnect;
strConnect.Format (_T("DSN=%s;UID=%s;PWD=%s"), strdb, strname, strpwd);
int iCount = 0;
DBProcessNumber( 1 );
do{
iCount++;
if( iCount >= 4 )
break;
m_db->SetLoginTimeout(10);
try
{
m_db->OpenEx((LPCTSTR )strConnect, CDatabase::noOdbcDialog);
}
catch( CDBException* e )
{
e->Delete();
}
}while(!m_db->IsOpen());
}
void CDBAgent::MUserInit(int uid)
{
_USER_DATA* pUser = NULL;
pUser = (_USER_DATA*)m_UserDataArray[uid];
if( !pUser )
return;
memset(pUser->m_id, 0x00, MAX_ID_SIZE+1);
memset(pUser->m_Accountid, 0x00, MAX_ID_SIZE+1);
pUser->m_bZone = 0;
pUser->m_curx = 0;
pUser->m_curz = 0;
pUser->m_cury = 0;
pUser->m_bNation = 0;
pUser->m_bRace = 0;
pUser->m_sClass = 0;
pUser->m_bHairColor = 0;
pUser->m_bRank = 0;
pUser->m_bTitle = 0;
pUser->m_bLevel = 0;
pUser->m_iExp = 0;
pUser->m_iLoyalty = 0;
pUser->m_bFace = 0;
pUser->m_bCity = 0;
pUser->m_bKnights = 0;
//pUser->m_sClan = 0;
pUser->m_bFame = 0;
pUser->m_sHp = 0;
pUser->m_sMp = 0;
pUser->m_sSp = 0;
pUser->m_bStr = 0;
pUser->m_bSta = 0;
pUser->m_bDex = 0;
pUser->m_bIntel = 0;
pUser->m_bCha = 0;
pUser->m_iGold = 0;
pUser->m_sBind = -1;
pUser->m_iBank = 0;
// 胶懦 檬扁拳
for(int i=0; i<9; i++) pUser->m_bstrSkill[i] = 0;
for(i = 0; i < SLOT_MAX+HAVE_MAX; i++) {// 馒侩肮荐 + 家蜡肮荐(14+28=42)
pUser->m_sItemArray[i].nNum = 0;
pUser->m_sItemArray[i].sDuration = 0;
pUser->m_sItemArray[i].sCount = 0;
}
for(i = 0; i < WAREHOUSE_MAX; i++) {
pUser->m_sWarehouseArray[i].nNum = 0;
pUser->m_sWarehouseArray[i].sDuration = 0;
pUser->m_sWarehouseArray[i].sCount = 0;
}
pUser->m_bLogout = 0;
pUser->m_bWarehouse = 0;
pUser->m_dwTime = 0;
}
BOOL CDBAgent::LoadUserData(char *userid, int uid)
{
SQLHSTMT hstmt;
SQLRETURN retcode;
BOOL retval;
_USER_DATA* pUser = NULL;
TCHAR szSQL[1024];
memset(szSQL, 0x00, 1024);
//wsprintf(szSQL, TEXT("{? = call LOAD_USER_DATA ('%s')}"), userid);
wsprintf(szSQL, TEXT("{call LOAD_USER_DATA ('%s', ?)}"), userid);
SQLCHAR Nation, Race, HairColor, Rank, Title, Level;
SQLINTEGER Exp, Loyalty, Gold, PX, PZ, PY, dwTime;
SQLCHAR Face, City, Fame, Authority, Points;
SQLSMALLINT Hp, Mp, Sp, sRet, Class, Bind, Knights;
SQLCHAR Str, Sta, Dex, Intel, Cha, Zone;
TCHAR strSkill[10], strItem[400], strSerial[400];
memset( strSkill, 0x00, 10 );
memset( strItem, 0x00, 400 );
memset( strSerial, 0x00, 400 );
SQLINTEGER Indexind = SQL_NTS;
hstmt = NULL;
DBProcessNumber( 2 );
char logstr[256];
memset( logstr, 0x00, 256);
sprintf( logstr, "LoadUserData : name=%s\r\n", userid );
//m_pMain->m_LogFile.Write(logstr, strlen(logstr));
retcode = SQLAllocHandle( (SQLSMALLINT)SQL_HANDLE_STMT, m_GameDB.m_hdbc, &hstmt );
if (retcode != SQL_SUCCESS) {
memset( logstr, 0x00, 256);
sprintf( logstr, "LoadUserData Fail 000 : name=%s\r\n", userid );
// m_pMain->m_LogFile.Write(logstr, strlen(logstr));
return FALSE;
}
retcode = SQLBindParameter(hstmt,1,SQL_PARAM_OUTPUT,SQL_C_SSHORT, SQL_SMALLINT,0,0, &sRet,0,&Indexind);
if (retcode != SQL_SUCCESS){
SQLFreeHandle((SQLSMALLINT)SQL_HANDLE_STMT,hstmt);
memset( logstr, 0x00, 256);
sprintf( logstr, "LoadUserData Fail : name=%s, retcode=%d\r\n", userid, retcode );
// m_pMain->m_LogFile.Write(logstr, strlen(logstr));
return FALSE;
}
retcode = SQLExecDirect (hstmt, (unsigned char *)szSQL, 1024);
if (retcode == SQL_SUCCESS) { //|| retcode == SQL_SUCCESS_WITH_INFO){
retcode = SQLFetch(hstmt);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){
SQLGetData(hstmt,1 ,SQL_C_TINYINT ,&Nation, 0, &Indexind);
SQLGetData(hstmt,2 ,SQL_C_TINYINT ,&Race, 0, &Indexind);
SQLGetData(hstmt,3 ,SQL_C_SSHORT , &Class, 0, &Indexind);
SQLGetData(hstmt,4 ,SQL_C_TINYINT ,&HairColor, 0, &Indexind);
SQLGetData(hstmt,5 ,SQL_C_TINYINT ,&Rank, 0, &Indexind);
SQLGetData(hstmt,6 ,SQL_C_TINYINT ,&Title, 0, &Indexind);
SQLGetData(hstmt,7 ,SQL_C_TINYINT ,&Level, 0, &Indexind);
SQLGetData(hstmt,8 ,SQL_C_LONG ,&Exp, 0, &Indexind);
SQLGetData(hstmt,9 ,SQL_C_LONG ,&Loyalty, 0, &Indexind);
SQLGetData(hstmt,10 ,SQL_C_TINYINT ,&Face, 0, &Indexind);
SQLGetData(hstmt,11 ,SQL_C_TINYINT ,&City, 0, &Indexind);
SQLGetData(hstmt,12 ,SQL_C_SSHORT ,&Knights, 0, &Indexind);
SQLGetData(hstmt,13 ,SQL_C_TINYINT ,&Fame, 0, &Indexind);
SQLGetData(hstmt,14 ,SQL_C_SSHORT ,&Hp, 0, &Indexind);
SQLGetData(hstmt,15 ,SQL_C_SSHORT ,&Mp, 0, &Indexind);
SQLGetData(hstmt,16 ,SQL_C_SSHORT ,&Sp, 0, &Indexind);
SQLGetData(hstmt,17 ,SQL_C_TINYINT ,&Str, 0, &Indexind);
SQLGetData(hstmt,18 ,SQL_C_TINYINT ,&Sta, 0, &Indexind);
SQLGetData(hstmt,19 ,SQL_C_TINYINT ,&Dex, 0, &Indexind);
SQLGetData(hstmt,20 ,SQL_C_TINYINT ,&Intel, 0, &Indexind);
SQLGetData(hstmt,21 ,SQL_C_TINYINT ,&Cha, 0, &Indexind);
SQLGetData(hstmt,22 ,SQL_C_TINYINT ,&Authority, 0, &Indexind);
SQLGetData(hstmt,23 ,SQL_C_TINYINT ,&Points, 0, &Indexind);
SQLGetData(hstmt,24 ,SQL_C_LONG ,&Gold, 0, &Indexind);
SQLGetData(hstmt,25 ,SQL_C_TINYINT ,&Zone, 0, &Indexind);
SQLGetData(hstmt,26 ,SQL_C_SSHORT ,&Bind, 0, &Indexind);
SQLGetData(hstmt,27 ,SQL_C_LONG ,&PX, 0, &Indexind);
SQLGetData(hstmt,28 ,SQL_C_LONG ,&PZ, 0, &Indexind);
SQLGetData(hstmt,29 ,SQL_C_LONG ,&PY, 0, &Indexind);
SQLGetData(hstmt,30 ,SQL_C_LONG ,&dwTime, 0, &Indexind);
SQLGetData(hstmt,31 ,SQL_C_CHAR ,strSkill, 10, &Indexind);
SQLGetData(hstmt,32 ,SQL_C_CHAR ,strItem, 400, &Indexind);
SQLGetData(hstmt,33 ,SQL_C_CHAR ,strSerial, 400, &Indexind);
retval =TRUE;
}
else {
memset( logstr, 0x00, 256);
sprintf( logstr, "LoadUserData Fail 222 : name=%s, retcode=%d\r\n", userid, retcode );
// m_pMain->m_LogFile.Write(logstr, strlen(logstr));
retval = FALSE;
}
}
else {
if( DisplayErrorMsg(hstmt) == -1 ) {
char logstr[256];
memset( logstr, 0x00, 256);
sprintf( logstr, "[Error-DB Fail] LoadUserData : name=%s\r\n", userid );
// m_pMain->m_LogFile.Write(logstr, strlen(logstr));
m_GameDB.Close();
if( !m_GameDB.IsOpen() ) {
ReConnectODBC( &m_GameDB, m_pMain->m_strGameDSN, m_pMain->m_strGameUID, m_pMain->m_strGamePWD );
return FALSE;
}
}
retval= FALSE;
memset( logstr, 0x00, 256);
sprintf( logstr, "LoadUserData Fail 333 : name=%s, retcode=%d\r\n", userid, retcode );
// m_pMain->m_LogFile.Write(logstr, strlen(logstr));
}
SQLFreeHandle((SQLSMALLINT)SQL_HANDLE_STMT,hstmt);
// 骏白 蜡历啊 酒聪促.
/* if(sRet == 0) {
memset( logstr, 0x00, 256);
sprintf( logstr, "LoadUserData Fail : name=%s, sRet= %d, retval=%d, nation=%d \r\n", userid, sRet, retval, Nation );
m_pMain->m_LogFile.Write(logstr, strlen(logstr));
return FALSE;
} */
if(retval == FALSE) {
memset( logstr, 0x00, 256);
sprintf( logstr, "LoadUserData Fail : name=%s, retval= %d \r\n", userid, retval );
// m_pMain->m_LogFile.Write(logstr, strlen(logstr));
return FALSE;
}
pUser = (_USER_DATA*)m_UserDataArray[uid];
if( !pUser ) {
memset( logstr, 0x00, 256);
sprintf( logstr, "LoadUserData point is Fail : name=%s, uid= %d \r\n", userid, uid );
// m_pMain->m_LogFile.Write(logstr, strlen(logstr));
return FALSE;
}
if( strlen(pUser->m_id) != 0 ) {
memset( logstr, 0x00, 256);
sprintf( logstr, "LoadUserData id length is null Fail : name=%s, \r\n", userid );
// m_pMain->m_LogFile.Write(logstr, strlen(logstr));
return FALSE;
}
if( dwTime != 0 ) {
char logstr[256]; memset( logstr, 0x00, 256);
sprintf( logstr, "[LoadUserData dwTime Error : name=%s, dwTime=%d\r\n", userid, dwTime );
// m_pMain->m_LogFile.Write(logstr, strlen(logstr));
TRACE(logstr);
}
if( pUser->m_bLogout ) { // 酒流 辆丰登瘤 臼篮 蜡历...
memset( logstr, 0x00, 256);
sprintf( logstr, "LoadUserData logout Fail : name=%s, logout= %d \r\n", userid, pUser->m_bLogout );
// m_pMain->m_LogFile.Write(logstr, strlen(logstr));
return FALSE;
}
memset( logstr, 0x00, 256);
sprintf( logstr, "LoadUserData Success : name=%s\r\n", userid );
//m_pMain->m_LogFile.Write(logstr, strlen(logstr));
strcpy(pUser->m_id, userid);
pUser->m_bZone = Zone;
pUser->m_curx = (float)(PX/100);
pUser->m_curz = (float)(PZ/100);
pUser->m_cury = (float)(PY/100);
pUser->m_bNation = Nation;
pUser->m_bRace = Race;
pUser->m_sClass = Class;
pUser->m_bHairColor = HairColor;
pUser->m_bRank = Rank;
pUser->m_bTitle = Title;
pUser->m_bLevel = Level;
pUser->m_iExp = Exp;
pUser->m_iLoyalty = Loyalty;
pUser->m_bFace = Face;
pUser->m_bCity = City;
pUser->m_bKnights = Knights;
// 累诀 : clan沥焊甫 罐酒客具 茄促
//pUser->m_sClan = clan;
pUser->m_bFame = Fame;
pUser->m_sHp = Hp;
pUser->m_sMp = Mp;
pUser->m_sSp = Sp;
pUser->m_bStr = Str;
pUser->m_bSta = Sta;
pUser->m_bDex = Dex;
pUser->m_bIntel = Intel;
pUser->m_bCha = Cha;
pUser->m_bAuthority = Authority;
pUser->m_bPoints = Points;
pUser->m_iGold = Gold;
pUser->m_sBind = Bind;
pUser->m_dwTime = dwTime+1;
CTime t= CTime::GetCurrentTime();
memset( logstr, 0x00, 256);
sprintf( logstr, "[LoadUserData %d-%d-%d]: name=%s, nation=%d, zone=%d, level, exp=%d, money=%d\r\n", t.GetHour(), t.GetMinute(), t.GetSecond(), userid, Nation, Zone, Level, Exp, Gold );
//m_pMain->m_LogFile.Write(logstr, strlen(logstr));
int index = 0, serial_index = 0;
for(int i=0; i<9; i++)
pUser->m_bstrSkill[i] = GetByte(strSkill, index);
index = 0;
DWORD itemid = 0;
short count = 0, duration = 0;
__int64 serial = 0;
_ITEM_TABLE* pTable = NULL;
for(i = 0; i < HAVE_MAX+SLOT_MAX; i++) // 馒侩肮荐 + 家蜡肮荐(14+28=42)
{
itemid = GetDWORD(strItem, index);
duration = GetShort(strItem, index );
count = GetShort(strItem, index);
serial = GetInt64(strSerial, serial_index ); // item serial number
pTable = m_pMain->m_ItemtableArray.GetData(itemid);
if( pTable ) {
pUser->m_sItemArray[i].nNum = itemid;
pUser->m_sItemArray[i].sDuration = duration;
pUser->m_sItemArray[i].nSerialNum = serial;
if( count > ITEMCOUNT_MAX )
pUser->m_sItemArray[i].sCount = ITEMCOUNT_MAX;
else if( pTable->m_bCountable && count <= 0 ) {
pUser->m_sItemArray[i].nNum = 0;
pUser->m_sItemArray[i].sDuration = 0;
pUser->m_sItemArray[i].sCount = 0;
pUser->m_sItemArray[i].nSerialNum = 0;
}
else {
if( count <= 0 )
pUser->m_sItemArray[i].sCount = 1;
pUser->m_sItemArray[i].sCount = count;
}
TRACE("%s : %d slot (%d : %I64d)\n", pUser->m_id, i, pUser->m_sItemArray[i].nNum, pUser->m_sItemArray[i].nSerialNum);
sprintf( logstr, "%s : %d slot (%d : %I64d)\n", pUser->m_id, i, pUser->m_sItemArray[i].nNum, pUser->m_sItemArray[i].nSerialNum);
//m_pMain->WriteLogFile( logstr );
//m_pMain->m_LogFile.Write(logstr, strlen(logstr));
}
else {
pUser->m_sItemArray[i].nNum = 0;
pUser->m_sItemArray[i].sDuration = 0;
pUser->m_sItemArray[i].sCount = 0;
pUser->m_sItemArray[i].nSerialNum = 0;
if( itemid > 0 ) {
sprintf( logstr, "Item Drop : name=%s, itemid=%d\r\n", userid, itemid );
m_pMain->WriteLogFile( logstr );
//m_pMain->m_LogFile.Write(logstr, strlen(logstr));
}
continue;
}
}
if( pUser->m_bLevel == 1 && pUser->m_iExp == 0 && pUser->m_iGold == 0) {
int empty_slot = 0;
for(int j=SLOT_MAX; j<HAVE_MAX+SLOT_MAX; j++) {
if( pUser->m_sItemArray[j].nNum == 0 ) {
empty_slot = j;
break;
}
}
if( empty_slot == HAVE_MAX+SLOT_MAX )
return retval;
switch( pUser->m_sClass ) {
case 101:
pUser->m_sItemArray[empty_slot].nNum = 120010000;
pUser->m_sItemArray[empty_slot].sDuration = 5000;
break;
case 102:
pUser->m_sItemArray[empty_slot].nNum = 110010000;
pUser->m_sItemArray[empty_slot].sDuration = 4000;
break;
case 103:
pUser->m_sItemArray[empty_slot].nNum = 180010000;
pUser->m_sItemArray[empty_slot].sDuration = 5000;
break;
case 104:
pUser->m_sItemArray[empty_slot].nNum = 190010000;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -