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

📄 userinfo.cpp

📁 真正的传奇源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:

BOOL CUserInfo::UserDropGenItem(int nItemIndex, char *pszMakeIndex)
{
	if (!m_pxPlayerObject) return FALSE;

	if (m_lpTGenItemRcd.GetCount())
	{
		PLISTNODE pListNode = m_lpTGenItemRcd.GetHead();

		while (pListNode)
		{
			_LPTGENERALITEMRCD lpTItemRcd = m_lpTGenItemRcd.GetData(pListNode);
		
			if (memcmp(pszMakeIndex, lpTItemRcd->szMakeIndex, _MAKEITEMINDEX) == 0)
			{
				if (m_pxPlayerObject->DropItemDown((_LPTUSERITEMRCD)lpTItemRcd, 2, TRUE))
				{
//					delete lpTItemRcd;
					m_lpTGenItemRcd.RemoveNode(pListNode);

					m_pxPlayerObject->WeightChanged();

					return TRUE;
				}
			}

			pListNode = m_lpTGenItemRcd.GetNext(pListNode);
		}
	}

	return FALSE;
}

BOOL CUserInfo::IncGold(int nGold)
{
	if (m_THumanRcd.dwGold + nGold <= BAGGOLD)
	{
		m_THumanRcd.dwGold  += nGold;
		return TRUE;
	}

	return FALSE;
}

BOOL CUserInfo::DecGold(int nGold)
{
	if (m_THumanRcd.dwGold - nGold >= 0)
	{
		m_THumanRcd.dwGold  -= nGold;
		return TRUE;
	}

	return FALSE;
}

_LPTHUMANMAGICRCD CUserInfo::GetMagicRcdByKey(int nKey)
{
	PLISTNODE pListNode = m_lpTMagicRcd.GetHead();

	while (pListNode)
	{
		_LPTHUMANMAGICRCD	lptUserMagicRcd = m_lpTMagicRcd.GetData(pListNode);

		if (lptUserMagicRcd)
		{
			if (lptUserMagicRcd->btUseKey == nKey)
				return lptUserMagicRcd;
		}

		pListNode = m_lpTMagicRcd.GetNext(pListNode);
	}

	return NULL;
}

_LPTHUMANMAGICRCD CUserInfo::GetMagicRcdByID(int nID)
{
	PLISTNODE pListNode = m_lpTMagicRcd.GetHead();

	while (pListNode)
	{
		_LPTHUMANMAGICRCD	lptUserMagicRcd = m_lpTMagicRcd.GetData(pListNode);

		if (lptUserMagicRcd)
		{
			if (lptUserMagicRcd->btMagicID == nID)
				return lptUserMagicRcd;
		}

		pListNode = m_lpTMagicRcd.GetNext(pListNode);
	}

	return NULL;
}

_LPTGENERALITEMRCD CUserInfo::CanUseBujuk()
{
	_LPTGENERALITEMRCD lptItem = GetUseGenItem(m_THumanRcd.szTakeItem[U_ARMRINGL]);

	if (lptItem)
	{
		if (lptItem->szMakeIndex[0] == 'G')
		{
			int nIndex = GetGenItemStdIdx(lptItem->szMakeIndex);

			if (g_pStdItemEtc[nIndex].wStdMode == 25 || g_pStdItemEtc[nIndex].wStdMode == 5)
				return lptItem;
		}
	}

	return NULL;
}

void CUserInfo::ProcessUserMessage(char *pszPacket)
{
	_LPTDEFAULTMESSAGE lpDefMsg = (_LPTDEFAULTMESSAGE)pszPacket;

	if (m_pxPlayerObject->m_fIsCapture)
	{
		if (m_pxPlayerObject->m_hCaptureFile)
		{
			DWORD	dwWrite = 0;

			fprintf(m_pxPlayerObject->m_hCaptureFile, "%d, %d, %d, %d, %d\r\n", lpDefMsg->wIdent, lpDefMsg->nRecog, lpDefMsg->wParam, lpDefMsg->wTag, lpDefMsg->wSeries);

			switch (lpDefMsg->wIdent)
			{
//				case CM_SAY:
				case CM_PICKUP:
				{
					char szDecodeMsg[512];
					int nPos = fnDecode6BitBufA(pszPacket + sizeof(_TDEFAULTMESSAGE), szDecodeMsg, sizeof(szDecodeMsg));
					szDecodeMsg[nPos] = '\0';

					fprintf(m_pxPlayerObject->m_hCaptureFile, "%s\r\n", szDecodeMsg);
				}
			}
		}
	}

	switch (lpDefMsg->wIdent)
	{
		case CM_HIT:
		case CM_POWERHIT:
		case CM_LONGHIT:
		case CM_WIDEHIT:
		case CM_HEAVYHIT:
		case CM_BIGHIT:
		case CM_FIREHIT:
			m_pxPlayerObject->AddProcess(m_pxPlayerObject, lpDefMsg->wIdent, lpDefMsg->wTag, LOWORD(lpDefMsg->nRecog), HIWORD(lpDefMsg->nRecog), lpDefMsg->wParam, NULL);
			break;
		case CM_TURN:
		case CM_WALK:
		case CM_RUN:
		case CM_SITDOWN:
		case CM_RIDE:
			m_pxPlayerObject->AddProcess(m_pxPlayerObject, lpDefMsg->wIdent, lpDefMsg->wTag, LOWORD(lpDefMsg->nRecog), HIWORD(lpDefMsg->nRecog), NULL);
			break;
/*		case CM_SAY:
			m_pxPlayerObject->AddProcess(m_pxPlayerObject, lpDefMsg->wIdent, 0, 0, 0, 0, pszPacket + sizeof(_TDEFAULTMESSAGE));
			break;*/
		case CM_SPELL:
			m_pxPlayerObject->AddProcess(m_pxPlayerObject, lpDefMsg->wIdent, 
														lpDefMsg->wTag/*MagicID*/, LOWORD(lpDefMsg->nRecog)/*TargetX*/, HIWORD(lpDefMsg->nRecog)/*TargetY*/, 
														MAKELONG(lpDefMsg->wSeries, lpDefMsg->wParam)/*TargetObj*/, NULL);
			break;
		case CM_TAKEONITEM:
		case CM_TAKEOFFITEM:
			m_pxPlayerObject->AddProcess(m_pxPlayerObject, lpDefMsg->wIdent, lpDefMsg->wSeries, lpDefMsg->nRecog, lpDefMsg->wParam, lpDefMsg->wTag, pszPacket + sizeof(_TDEFAULTMESSAGE));
			break;
        case CM_QUERYUSERNAME:
			m_pxPlayerObject->AddProcess(m_pxPlayerObject, lpDefMsg->wIdent, 0, lpDefMsg->nRecog, lpDefMsg->wParam, lpDefMsg->wTag, NULL);
			break;
		case CM_EAT:
		case CM_DROPITEM:
			m_pxPlayerObject->AddProcess(m_pxPlayerObject, lpDefMsg->wIdent, lpDefMsg->wSeries, 0, 0, 0, pszPacket + sizeof(_TDEFAULTMESSAGE));
			break;
		case CM_PICKUP:
			m_pxPlayerObject->AddProcess(m_pxPlayerObject, lpDefMsg->wIdent, lpDefMsg->wSeries, lpDefMsg->nRecog, lpDefMsg->wTag, lpDefMsg->wParam);
			break;
		default:
			m_pxPlayerObject->AddProcess(m_pxPlayerObject, lpDefMsg->wIdent, lpDefMsg->wSeries, lpDefMsg->nRecog, lpDefMsg->wTag, NULL);
	}
/*	case CM_QUERYUSERNAME:
            begin
               hum.SendMsg (hum, pmsg.Ident, 0, pmsg.Recog, pmsg.Param{x}, pmsg.Tag{y}, '');
            end;

         //string 颇扼皋磐啊 乐澜.
	case CM_DROPITEM:
	case CM_TAKEOFFITEM:
	case CM_EXCHGTAKEONITEM:
	case CM_MERCHANTDLGSELECT:
	case CM_MERCHANTQUERYSELLPRICE:
	case CM_MERCHANTQUERYREPAIRCOST:
	case CM_USERSELLITEM:
	case CM_USERREPAIRITEM:
	case CM_USERSTORAGEITEM:
	case CM_USERBUYITEM:
	case CM_USERGETDETAILITEM:
	case CM_CREATEGROUP:
	case CM_ADDGROUPMEMBER:
	case CM_DELGROUPMEMBER:
	case CM_DEALTRY:
	case CM_DEALADDITEM:
	case CM_DEALDELITEM:
	case CM_USERTAKEBACKSTORAGEITEM:
	case CM_USERMAKEDRUGITEM:
	case CM_GUILDADDMEMBER:
	case CM_GUILDDELMEMBER:
	case CM_GUILDUPDATENOTICE:
	case CM_GUILDUPDATERANKINFO:
         :
            begin
               hum.SendMsg (hum, pmsg.Ident, pmsg.Series, pmsg.Recog, pmsg.Param, pmsg.Tag, DecodeString(body));
            end;
	case CM_ADJUST_BONUS:
         :
            begin
               hum.SendMsg (hum, pmsg.Ident, pmsg.Series, pmsg.Recog, pmsg.Param, pmsg.Tag, body);
            end;
         else
            hum.SendMsg (hum, pmsg.Ident, pmsg.Series, pmsg.Recog, pmsg.Param, pmsg.Tag, '');
      end;
	}
/*
	char				szEncodeMsg[256];

	switch (lpDefMsg->wIdent)
	{
		case CM_TURN:
		{
			if (pUserInfo->m_pxPlayerObject->TurnXY(lpDefMsg->wTag, LOWORD(lpDefMsg->nRecog), HIWORD(lpDefMsg->nRecog)))
				memmove(szEncodeMsg, _MSG_GOOD, sizeof(_MSG_GOOD));
			else
				memmove(szEncodeMsg, _MSG_FAIL, sizeof(_MSG_FAIL));

			ValToAnsiStr(GetTickCount(), &szEncodeMsg[sizeof(_MSG_GOOD) - 1]);
			pUserInfo->m_pxPlayerObject->SendSocket(NULL, szEncodeMsg);
			break;
		}
		case CM_WALK:
		{
			if (pUserInfo->m_pxPlayerObject->WalkTo(lpDefMsg->wTag))
				memmove(szEncodeMsg, _MSG_GOOD, sizeof(_MSG_GOOD));
			else
				memmove(szEncodeMsg, _MSG_FAIL, sizeof(_MSG_FAIL));

			ValToAnsiStr(GetTickCount(), &szEncodeMsg[sizeof(_MSG_GOOD) - 1]);
			pUserInfo->m_pxPlayerObject->SendSocket(NULL, szEncodeMsg);
			break;
		}
		case CM_RUN:
		{
			if (pUserInfo->m_pxPlayerObject->RunTo(lpDefMsg->wTag))
				memmove(szEncodeMsg, _MSG_GOOD, sizeof(_MSG_GOOD));
			else
				memmove(szEncodeMsg, _MSG_FAIL, sizeof(_MSG_FAIL));

			ValToAnsiStr(GetTickCount(), &szEncodeMsg[sizeof(_MSG_GOOD) - 1]);
			pUserInfo->m_pxPlayerObject->SendSocket(NULL, szEncodeMsg);
			break;
		}
/*		case CM_HIT:
		{
			if (HitXY(lpProcessMsg->wIdent, lpProcessMsg->lParam1, lpProcessMsg->lParam2, lpProcessMsg->wParam))
				memmove(szEncodeMsg, _MSG_GOOD, sizeof(_MSG_GOOD));
			else
				memmove(szEncodeMsg, _MSG_FAIL, sizeof(_MSG_FAIL));

			ValToAnsiStr(GetTickCount(), &szEncodeMsg[sizeof(_MSG_GOOD) - 1]);
			SendSocket(NULL, szEncodeMsg);
			break;
		}
		case CM_RIDE:
		{
			if (DoRideHorse(lpProcessMsg->wParam, lpProcessMsg->lParam1))
				memmove(szEncodeMsg, _MSG_GOOD, sizeof(_MSG_GOOD));
			else
				memmove(szEncodeMsg, _MSG_FAIL, sizeof(_MSG_FAIL));

			ValToAnsiStr(GetTickCount(), &szEncodeMsg[sizeof(_MSG_GOOD) - 1]);
			SendSocket(NULL, szEncodeMsg);

			break;
		}
		case CM_SAY:
		{
			if (lpProcessMsg->pszData)
				ProcessForUserSaid(lpProcessMsg);
			break;
		}
		case CM_SPELL:
		{
			if (SpellXY(lpProcessMsg->wParam, lpProcessMsg->lParam1, lpProcessMsg->lParam2, lpProcessMsg->lParam3))
				memmove(szEncodeMsg, _MSG_GOOD, sizeof(_MSG_GOOD));
			else
				memmove(szEncodeMsg, _MSG_FAIL, sizeof(_MSG_FAIL));

			ValToAnsiStr(GetTickCount(), &szEncodeMsg[sizeof(_MSG_GOOD) - 1]);
			SendSocket(NULL, szEncodeMsg);

			break;
		}
		case CM_TAKEONITEM:
		{
			lpProcessMsg->pCharObject->m_tFeature.btGender	= lpProcessMsg->wParam;
			lpProcessMsg->pCharObject->m_tFeature.btWear	= HIBYTE(lpProcessMsg->lParam1);
			lpProcessMsg->pCharObject->m_tFeature.btHair	= LOBYTE(lpProcessMsg->lParam1);
			lpProcessMsg->pCharObject->m_tFeature.btWeapon	= lpProcessMsg->lParam2;

			//AddRefMsg(
			break;
		}
	} */
}

void CUserInfo::Operate()
{
	if (GetTickCount() - m_pxPlayerObject->m_dwSearchTime >= m_pxPlayerObject->m_dwSearchTick)
	{
		m_pxPlayerObject->m_dwSearchTime = GetTickCount();
		m_pxPlayerObject->SearchViewRange();

		if (m_pxPlayerObject->m_btBright != g_nMirDayTime)
		{
			m_pxPlayerObject->m_btBright = g_nMirDayTime;
			m_pxPlayerObject->AddProcess(m_pxPlayerObject, RM_DAYCHANGING, 0, 0, 0, 0, NULL);
		}
	}

	m_pxPlayerObject->Operate();
}

void CUserInfo::CloseUserHuman()
{
	Lock();

	if (m_pxPlayerObject)
	{
		m_THumanRcd.nCX	= m_pxPlayerObject->m_nCurrX;
		m_THumanRcd.nCY	= m_pxPlayerObject->m_nCurrY;

		if (m_pxPlayerObject->m_nDirection >= 0 && m_pxPlayerObject->m_nDirection <= 7)
			m_THumanRcd.nDirection	= m_pxPlayerObject->m_nDirection;
		else
			m_THumanRcd.nDirection	= 4;

		if (m_pxPlayerObject->m_pMap)
		{
			ZeroMemory(m_THumanRcd.szMapName, sizeof(m_THumanRcd.szMapName));
			memcpy(m_THumanRcd.szMapName, m_pxPlayerObject->m_pMap->m_szMapName, memlen(m_pxPlayerObject->m_pMap->m_szMapName));
		}

		m_THumanRcd.szLevel = m_pxPlayerObject->m_Ability.Level;
		m_THumanRcd.nExp	= m_pxPlayerObject->m_Ability.Exp;
		m_THumanRcd.nExp	= m_pxPlayerObject->m_Ability.Exp;

		// Save Player Information Data
		SaveHumanToDB("192.168.0.200");
	}

	if (m_pxPlayerObject)
	{										  
		PLISTNODE pVisibleObjListNode = m_pxPlayerObject->m_xVisibleObjectList.GetHead();

		while (pVisibleObjListNode)
		{
			CVisibleObject* pVisibleObject = m_pxPlayerObject->m_xVisibleObjectList.GetData(pVisibleObjListNode);

			if (pVisibleObject) 
			{
				delete pVisibleObject;
				pVisibleObject = NULL;
			}

			pVisibleObjListNode = m_pxPlayerObject->m_xVisibleObjectList.RemoveNode(pVisibleObjListNode);
		}

		m_pxPlayerObject->m_pMap->RemoveObject(m_pxPlayerObject->m_nCurrX,m_pxPlayerObject->m_nCurrY,
												OS_MOVINGOBJECT, m_pxPlayerObject);
		
		m_pxPlayerObject->m_fIsAlive = FALSE;
	}

	PLISTNODE pListNode;

	// Remove User Item
	if (m_lpTItemRcd.GetCount())
	{
		pListNode = m_lpTItemRcd.GetHead();

		while (pListNode)
		{
			_LPTUSERITEMRCD lpUserItemRcd = m_lpTItemRcd.GetData(pListNode);

			if (lpUserItemRcd) 
			{
				delete lpUserItemRcd;
				lpUserItemRcd = NULL;
			}

			pListNode = m_lpTItemRcd.RemoveNode(pListNode);
		}
	}

	// Remove General User Item
	if (m_lpTGenItemRcd.GetCount())
	{
		pListNode = m_lpTGenItemRcd.GetHead();

		while (pListNode)
		{
			_LPTGENERALITEMRCD lpGenItemRcd = m_lpTGenItemRcd.GetData(pListNode);

			if (lpGenItemRcd) 
			{
				delete lpGenItemRcd;
				lpGenItemRcd = NULL;
			}

			pListNode = m_lpTGenItemRcd.RemoveNode(pListNode);
		}
	}

	// Remove User Magic Information
	if (m_lpTMagicRcd.GetCount())
	{
		pListNode = m_lpTMagicRcd.GetHead();

		while (pListNode)
		{
			_LPTHUMANMAGICRCD lpMagicRcd = m_lpTMagicRcd.GetData(pListNode);

			if (lpMagicRcd) 
			{
				delete lpMagicRcd;
				lpMagicRcd = NULL;
			}

			pListNode = m_lpTMagicRcd.RemoveNode(pListNode);
		}
	}

	if (m_pxPlayerObject)
		CloseAccount(m_szUserID, m_nCertification);

	m_bEmpty = true;
	Unlock();

	UpdateStatusBarUsers(FALSE);
}

void CUserInfo::SaveHumanToDB(char *pszUserAddr)
{
	_TDEFAULTMESSAGE	Def;
	_TLOADHUMAN			tLoadHuman;
	char				szEncodeMsg1[24];
	char				szEncodeMsg2[8192];

	fnMakeDefMessage(&Def, DB_SAVEHUMANRCD, (int)this, m_lpTMagicRcd.GetCount(), m_lpTGenItemRcd.GetCount(), 0);

	memcpy(tLoadHuman.szUserID, m_szUserID, memlen(m_szUserID));
	memcpy(tLoadHuman.szCharName, m_szCharName, memlen(m_szCharName));
	memcpy(tLoadHuman.szUserAddr, pszUserAddr, memlen(pszUserAddr));
	tLoadHuman.nCertification	= m_nCertification;
	
	int nPos = fnEncodeMessageA(&Def, szEncodeMsg1, sizeof(szEncodeMsg1));
	szEncodeMsg1[nPos] = '\0';
	nPos = fnEncode6BitBufA((unsigned char *)&tLoadHuman, szEncodeMsg2, sizeof(_TLOADHUMAN), sizeof(szEncodeMsg2));
	nPos += fnEncode6BitBufA((unsigned char *)&m_THumanRcd, &szEncodeMsg2[nPos], sizeof(_THUMANRCD), sizeof(szEncodeMsg2) - nPos);

	// BEGIN:Add Magic Information
	EncodeMyMagicToServer(szEncodeMsg2, sizeof(szEncodeMsg2) - nPos, nPos);
	// END

	// BEGIN:Add General Item Information
	EncodeGenItem(szEncodeMsg2, sizeof(szEncodeMsg2) - nPos, nPos);
	// END

	szEncodeMsg2[nPos] = '\0';

	SendRDBSocket(tLoadHuman.nCertification, szEncodeMsg1, szEncodeMsg2, nPos);
}

void CUserInfo::CloseAccount(char *pszName, int nCertification)
{
	char	szMsg[256];
	int		nLen = memlen(pszName) - 1;

	szMsg[0] = '%';
	szMsg[1] = 'S';

	memcpy(&szMsg[2], pszName, nLen);

	szMsg[nLen + 2] = '/';

	char *pszPos = ValToAnsiStr(nCertification, &szMsg[nLen + 3]);

	*pszPos++	= '$';
	*pszPos		= '\0';

	send(g_clsock, szMsg, memlen(szMsg) - 1, 0);
}

void CUserInfo::DoClientCertification(char *pszPacket)
{
	char szDecodePacket[64];
	char *pszDecodePacket = &szDecodePacket[0];
	char *pszPos;

	if (m_btCurrentMode == USERMODE_NOTICE)
	{
		int nLen = memlen(pszPacket);

		if (pszPos = (char *)memchr(pszPacket, '!', nLen))
		{
			*pszPos = '\0';

			//             uid  chr	 cer  ver  startnew
			// pszPacket **SSSS/SSSS/SSSS/SSSS/1
			nLen = fnDecode6BitBufA(pszPacket + 2, szDecodePacket, sizeof(szDecodePacket));
			szDecodePacket[nLen] = '\0';

			if (*pszDecodePacket == '*' && *(pszDecodePacket + 1) == '*')
			{
				pszDecodePacket += 2;

				if (!(pszPos = (char *)memchr(pszDecodePacket, '/', nLen))) return;

				*pszPos++ = '\0';
				nLen -= (pszPos - pszDecodePacket);
				memmove(m_szUserID, pszDecodePacket, (pszPos - pszDecodePacket));
				pszDecodePacket = pszPos;

				if (!(pszPos = (char *)memchr(pszDecodePacket, '/', nLen))) return;

				*pszPos++ = '\0';
				nLen -= (pszPos - pszDecodePacket);
				memmove(m_szCharName, pszDecodePacket, (pszPos - pszDecodePacket));
				pszDecodePacket = pszPos;

				if (!(pszPos = (char *)memchr(pszDecodePacket, '/', nLen))) return;

				*pszPos++ = '\0';
				nLen -= (pszPos - pszDecodePacket);
				m_nCertification = AnsiStrToVal(pszDecodePacket);
				pszDecodePacket = pszPos;

				if (!(pszPos = (char *)memchr(pszDecodePacket, '/', nLen))) return;

				*pszPos++ = '\0';
				nLen -= (pszPos - pszDecodePacket);
				m_nClientVersion = AnsiStrToVal(pszDecodePacket);
				pszDecodePacket = pszPos;

				m_btCurrentMode = USERMODE_LOGIN;
//				(*pszDecodePacket == '0' ? StartNew = TRUE : StartNew = FALSE);

				// INSERT:Check pay bill.

//				if (pUserInfo->m_nCertification >= 30)
//				{

//					LoadPlayer(pUserInfo);
//				}
	/*				else
				{
					// INSERT:Close User
				} */
			}
		}
	}
}

⌨️ 快捷键说明

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