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

📄 processdbmsg.cpp

📁 真正的传奇源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		{
			PLISTNODE pListNode = xUserItemRcdList.GetHead();
			
			while (pListNode)
			{
				_LPTUSERITEMRCD	lptUserItemRcd = xUserItemRcdList.GetData(pListNode);
				
				if (lptUserItemRcd)
				{
					nPos += fnEncode6BitBufA((unsigned char *)lptUserItemRcd, &szEncodeMsg2[nPos], sizeof(_TUSERITEMRCD), sizeof(szEncodeMsg2) - nPos);
					
					pListNode = xUserItemRcdList.RemoveNode(pListNode);
					delete lptUserItemRcd;
				}
				else 
					pListNode = xUserItemRcdList.GetNext(pListNode);
			}
			
			if (nHorse)
				nPos += fnEncode6BitBufA((unsigned char *)&tHorseRcd, &szEncodeMsg2[nPos], sizeof(_THORSERCD), sizeof(szEncodeMsg2) - nPos);
		}
		
		szEncodeMsg2[nPos] = '\0';
		
		SendSocket(pServerInfo->m_sock, lpLoadHuman->nCertification, szEncodeMsg1, szEncodeMsg2, nPos);
	}
	else
	{
		fnMakeDefMessageA(&DefMsg, DBR_FAIL, nRecog, 0, 0, 0);
		fnEncodeMessageA(&DefMsg, szEncodeMsg1, sizeof(szEncodeMsg1));
		
		SendSocket(pServerInfo->m_sock, lpLoadHuman->nCertification, szEncodeMsg1, "Test", 4);
	}
}

char *SaveHumanMagicRcd(char *pszUserID, char *pszCharName, char *pszEncodeRcd, int nCount)
{
	char szTmp[1024];

	// Delete Magic Data
	CRecordset *pRec = GetDBManager()->CreateRecordset();
	sprintf(szTmp, "DELETE FROM TBL_CHARACTER_MAGIC WHERE FLD_CHARNAME = '%s'", pszCharName);
	pRec->Execute(szTmp);
	GetDBManager()->DestroyRecordset( pRec );

	// Update Magic Data
	char *pszEncode = pszEncodeRcd;
	_THUMANMAGICRCD	tUserMagicRcd;

	for (int i = 0; i < nCount; i++)
	{
		if ( memlen( pszEncode ) >= MAGICRCDBLOCKSIZE )
		{
			pRec = GetDBManager()->CreateRecordset();

			fnDecode6BitBufA( pszEncode, (char *) &tUserMagicRcd, sizeof( _THUMANMAGICRCD ) );

			sprintf(szTmp, "INSERT TBL_CHARACTER_MAGIC(FLD_LOGINID, FLD_CHARNAME, FLD_MAGICID, FLD_LEVEL, FLD_USEKEY, FLD_CURRTRAIN) VALUES "
							"( '%s', '%s', %d, %d, %d, %d )",
							pszUserID, pszCharName, tUserMagicRcd.btMagicID, tUserMagicRcd.btLevel, tUserMagicRcd.btUseKey, tUserMagicRcd.nCurrTrain);
			
			if ( !pRec->Execute( szTmp ) || pRec->GetRowCount() <= 0 )
				InsertLogMsg(_T("Save Human Magic Record 盎脚 坷幅"));
			
			GetDBManager()->DestroyRecordset( pRec );

			pszEncode += MAGICRCDBLOCKSIZE + 1;
		}
	}
		
	return pszEncode;
}

void SaveGenItemRcd(char *pszUserID, char *pszCharName, char *pszEncodeRcd, int nCount)
{
	char szTmp[1024];

	// Delete Magic Data
	CRecordset *pRec = GetDBManager()->CreateRecordset();
	sprintf(szTmp, "DELETE FROM TBL_CHARACTER_GENITEM WHERE FLD_CHARNAME = '%s'", pszCharName);
	pRec->Execute(szTmp);
	GetDBManager()->DestroyRecordset( pRec );

	// Update General Item Data
	sprintf( szTmp, "FLD_CHARNAME='%s'", pszCharName );

	CQueryManager query;

	char *pszEncode = pszEncodeRcd;
	_TGENITEMRCD tItemRcd;

	for (int i = 0; i < nCount; i++)
	{
		while ( memlen( pszEncode ) >= GENITEMRCDBLOCKSIZE )
		{
			pRec = GetDBManager()->CreateRecordset();
		
			ZeroMemory(&tItemRcd, sizeof(_TGENITEMRCD));

			fnDecode6BitBufA( pszEncode, (char *) &tItemRcd, sizeof( _TGENITEMRCD ) );

			sprintf(szTmp, "INSERT TBL_CHARACTER_GENITEM (FLD_LOGINID, FLD_CHARNAME, FLD_ITEMINDEX) VALUES "
							"( '%s', '%s', '%s' )", pszUserID, pszCharName, tItemRcd.szItem);

			if ( !pRec->Execute( szTmp ) || pRec->GetRowCount() <= 0 )
				InsertLogMsg(_T("Save General Item Record 盎脚 坷幅"));

			GetDBManager()->DestroyRecordset( pRec );

			pszEncode += (GENITEMRCDBLOCKSIZE + 1);
		}
	}
}

BOOL SaveHumanRcd(CServerInfo* pServerInfo, _LPTLOADHUMAN lpLoadHuman, _LPTHUMANRCD lptHumanRcd, int nRecog)
{
	char szSQL[1024];
	char szTakeItem[10][13];

	ZeroMemory(szTakeItem, sizeof(szTakeItem));

	for (int i = 0; i < 10; i++)
		memmove(szTakeItem[i], lptHumanRcd->szTakeItem[i], 12);

	sprintf(szSQL, "UPDATE TBL_CHARACTER SET FLD_JOB=%d, FLD_GENDER=%d, FLD_LEVEL=%d, FLD_DIRECTION=%d, FLD_CX=%d, FLD_CY=%d, "
						"FLD_MAPNAME='%s', FLD_GOLD=%d, FLD_HAIR=%d, FLD_DRESS_ID='%s', FLD_WEAPON_ID='%s', "
						"FLD_LEFTHAND_ID='%s', FLD_RIGHTHAND_ID='%s', FLD_HELMET_ID='%s', FLD_NECKLACE_ID='%s', "
						"FLD_ARMRINGL_ID='%s', FLD_ARMRINGR_ID='%s', FLD_RINGL_ID='%s', FLD_RINGR_ID='%s', FLD_EXP=%d "
						"WHERE FLD_CHARNAME='%s'",
						lptHumanRcd->btJob, lptHumanRcd->btGender, lptHumanRcd->szLevel, lptHumanRcd->nDirection,
						lptHumanRcd->nCX, lptHumanRcd->nCY, lptHumanRcd->szMapName, lptHumanRcd->dwGold,
						lptHumanRcd->szHair, szTakeItem[0], szTakeItem[1], szTakeItem[2], szTakeItem[3], szTakeItem[4], 
						szTakeItem[5], szTakeItem[6], szTakeItem[7], szTakeItem[8], szTakeItem[9], lptHumanRcd->nExp,
						lpLoadHuman->szCharName);

	CRecordset *pRec = GetDBManager()->CreateRecordset();

	if (!pRec->Execute( szSQL ) || pRec->GetRowCount() <= 0 )
	{
		InsertLogMsg(_T("Save Human Record 盎脚 坷幅"));
		GetDBManager()->DestroyRecordset( pRec );
		return FALSE;		
	}
	
	GetDBManager()->DestroyRecordset( pRec );

	return TRUE;
}

BOOL MakeNewItem(CServerInfo* pServerInfo, _LPTLOADHUMAN lpHumanLoad, _LPTMAKEITEMRCD lpMakeItemRcd, int nRecog)
{
	static char  g_szYesterDay[24];
	static UINT  g_nItemIndexCnt = 0;

	CRecordset *pRec;

	char szQuery[1024];
	char szDate[24];
	GetDate( szDate );

//	if (strcmp(szDate, g_szYesterDay) != 0)
//	{
		sprintf( szQuery, 
			"SELECT * FROM TBL_CHARACTER_ITEM WHERE FLD_STDTYPE = '%c' AND "
			"FLD_MAKEDATE = '%s' ORDER BY FLD_MAKEINDEX DESC",
			lpMakeItemRcd->szStdType, szDate );
		
		pRec = GetDBManager()->CreateRecordset();
		if ( pRec->Execute( szQuery ) && pRec->Fetch() )
		{
			g_nItemIndexCnt = atoi( pRec->Get( "FLD_MAKEINDEX" ) ) + 1;
		}
		GetDBManager()->DestroyRecordset( pRec );

		strcpy( g_szYesterDay, szDate );
//	}
//	else
//		g_nItemIndexCnt++;

	char szUserID[32];
	char szCharName[32];

	if (lpHumanLoad)
	{
		strcpy(szUserID, lpHumanLoad->szUserID);
		strcpy(szCharName, lpHumanLoad->szCharName);
	}
	else
	{
		strcpy(szUserID, "0");
		strcpy(szCharName, "LOMCN");
	}

	sprintf(szQuery, "INSERT TBL_CHARACTER_ITEM (FLD_LOGINID, FLD_CHARNAME, FLD_STDTYPE, FLD_MAKEDATE, FLD_MAKEINDEX, "
						"FLD_STDINDEX, FLD_DURA, FLD_DURAMAX, FLD_VALUE1, FLD_VALUE2, FLD_VALUE3, FLD_VALUE4, FLD_VALUE5, "
						"FLD_VALUE6, FLD_VALUE7, FLD_VALUE8, FLD_VALUE9, FLD_VALUE10, FLD_VALUE11, FLD_VALUE12, FLD_VALUE13, "
						"FLD_VALUE14, FLD_LASTOWNER, FLD_LASTACTION, FLD_PREFIXNAME) "
						"VALUES( '%s', '%s', '%c', '%s', '%05d', %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, '%s', %d, '%s' )", 
						szUserID, szCharName, lpMakeItemRcd->szStdType, g_szYesterDay, g_nItemIndexCnt,
						lpMakeItemRcd->nStdIndex, lpMakeItemRcd->nDura,	lpMakeItemRcd->nDuraMax, 
						lpMakeItemRcd->btValue[0], lpMakeItemRcd->btValue[1], lpMakeItemRcd->btValue[2], lpMakeItemRcd->btValue[3], 
						lpMakeItemRcd->btValue[5], lpMakeItemRcd->btValue[5], lpMakeItemRcd->btValue[6], lpMakeItemRcd->btValue[7], 
						lpMakeItemRcd->btValue[8], lpMakeItemRcd->btValue[9], lpMakeItemRcd->btValue[10], lpMakeItemRcd->btValue[11], 
						lpMakeItemRcd->btValue[12], lpMakeItemRcd->btValue[13], szCharName, 1, "");
	
	pRec = GetDBManager()->CreateRecordset();
	if ( !pRec->Execute( szQuery ) || pRec->GetRowCount() <= 0 )
	{
		GetDBManager()->DestroyRecordset( pRec );
		return FALSE;
	}
	GetDBManager()->DestroyRecordset( pRec );
	
	if ( pServerInfo )
	{
		// Send Packet to Game Server
		_TDEFAULTMESSAGE	DefMsg;
		_TUSERITEMRCD		UserItemRcd;
		
		char				szEncodeMsg1[24];
		char				szEncodeMsg2[128];
		int					nPos = 0;
		
		if (lpHumanLoad)
			fnMakeDefMessageA(&DefMsg, DBR_MAKEITEMRCD, nRecog, 0, 0, 0);
		else
			fnMakeDefMessageA(&DefMsg, DBR_MAKEITEMRCD2, nRecog, 0, 0, 0);

		fnEncodeMessageA(&DefMsg, szEncodeMsg1, sizeof(szEncodeMsg1));
		
		UserItemRcd.szMakeIndex[0] = lpMakeItemRcd->szStdType;
		
		memcpy( &UserItemRcd.szMakeIndex[1], g_szYesterDay, 6 );
		sprintf( &UserItemRcd.szMakeIndex[7], "%d", g_nItemIndexCnt );
		
		memcpy(&UserItemRcd.nStdIndex, &lpMakeItemRcd->nStdIndex, sizeof(_TUSERITEMRCD) - sizeof(UserItemRcd.szMakeIndex));
		
		nPos = fnEncode6BitBufA((unsigned char *)&UserItemRcd, szEncodeMsg2, sizeof(_TUSERITEMRCD), sizeof(szEncodeMsg2));
		
		SendSocket(pServerInfo->m_sock, 2, szEncodeMsg1, szEncodeMsg2, nPos);		
	}

	return TRUE;
}

UINT WINAPI ProcessDBMsg(LPVOID lpParameter)
{
	while (TRUE)
	{
		if (g_fTerminated) return 0L;

		_LPTSENDBUFF pSendBuff = (_LPTSENDBUFF)g_DBMsgQ.PopQ();

		if (pSendBuff)
		{
			switch (pSendBuff->DefMsg.wIdent)
			{
				case DB_LOADHUMANRCD:
					GetLoadHumanRcd(pSendBuff->pServerInfo, &pSendBuff->HumanLoad, pSendBuff->DefMsg.nRecog);
					break;
				case DB_SAVEHUMANRCD:
				{
					SaveHumanRcd(pSendBuff->pServerInfo, &pSendBuff->HumanLoad, (_LPTHUMANRCD)pSendBuff->lpbtAddData, pSendBuff->DefMsg.nRecog);
					char *pszData = SaveHumanMagicRcd(pSendBuff->HumanLoad.szUserID, pSendBuff->HumanLoad.szCharName, (char *)pSendBuff->lpbtAddData2, pSendBuff->DefMsg.wParam);
					SaveGenItemRcd(pSendBuff->HumanLoad.szUserID, pSendBuff->HumanLoad.szCharName, pszData, pSendBuff->DefMsg.wTag);
					break;
				}
				case DB_MAKEITEMRCD:
					MakeNewItem(pSendBuff->pServerInfo, &pSendBuff->HumanLoad, (_LPTMAKEITEMRCD)pSendBuff->lpbtAddData, pSendBuff->DefMsg.nRecog);
					break;
				case DB_MAKEITEMRCD2:
				{
					_LPTUSERITEMRCD lptUserItemRcd = (_LPTUSERITEMRCD)pSendBuff->lpbtAddData;
					_TMAKEITEMRCD	tMakeItemRcd;

					tMakeItemRcd.szStdType	= lptUserItemRcd->szMakeIndex[0];
					tMakeItemRcd.nStdIndex	= lptUserItemRcd->nStdIndex;
					tMakeItemRcd.nDura		= lptUserItemRcd->nDura;
					tMakeItemRcd.nDuraMax	= lptUserItemRcd->nDuraMax;
					memcpy(tMakeItemRcd.btValue, lptUserItemRcd->btValue, sizeof(lptUserItemRcd->btValue));

					MakeNewItem(pSendBuff->pServerInfo, NULL, &tMakeItemRcd, pSendBuff->DefMsg.nRecog);
					break;
				}
			} // switch

			delete pSendBuff;
		} // if (pSendBuff)

		SleepEx(1, TRUE);
	}

	return 0L;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -