⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dbagent.cpp

📁 骑士游戏部分源代码。
💻 CPP
📖 第 1 页 / 共 4 页
字号:
// 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 + -