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

📄 objectplayer.cpp

📁 此为传奇游戏源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:

	fCGHI[0] = FALSE;
	fCGHI[1] = FALSE;
	fCGHI[2] = FALSE;
	fCGHI[3] = FALSE;

	BOOL fOldHumHideMode = m_fHumHideMode;

	ZeroMemory(&m_AddAbility, sizeof(m_AddAbility));

	m_WAbility = m_Ability;

	m_WAbility.Weight		= 0;
	m_WAbility.HandWeight	= 0;
	m_WAbility.WearWeight	= 0;

	_LPTUSERITEMRCD lpUserItemRcd = NULL;

	for (int i = U_DRESS; i <= U_RINGR; i++)
	{
		if (lpUserItemRcd = m_pUserInfo->GetAccessory(i))
		{
			g_pStdItemSpecial[lpUserItemRcd->nStdIndex].ApplyItemParameters(&m_AddAbility);

			if ( i == U_RIGHTHAND || i == U_WEAPON )
				m_WAbility.HandWeight += g_pStdItemSpecial[lpUserItemRcd->nStdIndex].wWeight;
			else
				m_WAbility.WearWeight += g_pStdItemSpecial[lpUserItemRcd->nStdIndex].wWeight; 

			if ( i == U_WEAPON )
				m_AddAbility.WeaponStrong = (BYTE)g_pStdItemSpecial[lpUserItemRcd->nStdIndex].dwRSource; // 公扁狼 碍档. 碍档啊 臭栏搁 肋 救 磺俺咙
		}
	}

	m_WAbility.Weight	= m_pUserInfo->CalcBagWeight();

	// BEGIN:篮脚贱
	if ((m_fFixedHideMode) && (m_wStatusArr[STATE_TRANSPARENT] > 0))
		m_fHumHideMode = TRUE;

	if (m_fHumHideMode)
	{
		if (!fOldHumHideMode)
		{
			m_nCharStatus = GetCharStatus();
			AddRefMsg(RM_CHARSTATUSCHANGED, m_sHitSpeed/*wparam*/, m_nCharStatus, 0, 0, NULL);
		}
	}
	else
	{
		if (fOldHumHideMode)
		{
			m_wStatusArr[STATE_TRANSPARENT] = 0;
			m_nCharStatus = GetCharStatus();
			AddRefMsg(RM_CHARSTATUSCHANGED, m_sHitSpeed/*wparam*/, m_nCharStatus, 0, 0, NULL);
		}
	}
	// END:篮脚贱

	RecalcHitSpeed();

	// BEGIN:Light (Candle)
	BYTE btOldLight = m_btLight;

	_LPTGENERALITEMRCD lpTItemRcd = m_pUserInfo->GetRightHand();

	if (lpTItemRcd)
	{
		if (lpTItemRcd->nDura > 0)
			m_btLight = 8;
		else
			m_btLight = 2;
	}
	else
		m_btLight = 2;

	if (btOldLight != m_btLight)
		AddRefMsg(RM_CHANGELIGHT, 0, 0, 0, 0, NULL);
	// END
	
	m_btAntiMagic		+= m_AddAbility.AntiMagic;
	m_btHitPoint		+= m_AddAbility.HIT;
	m_btSpeedPoint		+= m_AddAbility.SPEED;
	m_btAntiPoison		+= m_AddAbility.AntiPoison;
	m_btPoisonRecover	+= m_AddAbility.PoisonRecover;
	m_btHealthRecover	+= m_AddAbility.HealthRecover;
	m_btSpellRecover	+= m_AddAbility.SpellRecover;
	m_sHitSpeed			+= m_AddAbility.HitSpeed;
//   Luck := Luck + AddAbil.Luck;
//   Luck := Luck - AddAbil.UnLuck;

	m_WAbility.MaxHP	= m_Ability.MaxHP + m_AddAbility.HP;
	m_WAbility.MaxMP	= m_Ability.MaxMP + m_AddAbility.MP;
	m_WAbility.AC		= MAKEWORD(LOBYTE(m_AddAbility.AC)  + LOBYTE(m_Ability.AC),  HIBYTE(m_AddAbility.AC)  + HIBYTE(m_Ability.AC));
	m_WAbility.MAC		= MAKEWORD(LOBYTE(m_AddAbility.MAC) + LOBYTE(m_Ability.MAC), HIBYTE(m_AddAbility.MAC) + HIBYTE(m_Ability.MAC));
	m_WAbility.DC		= MAKEWORD(LOBYTE(m_AddAbility.DC)  + LOBYTE(m_Ability.DC),  HIBYTE(m_AddAbility.DC)  + HIBYTE(m_Ability.DC));
	m_WAbility.MC		= MAKEWORD(LOBYTE(m_AddAbility.MC)  + LOBYTE(m_Ability.MC),  HIBYTE(m_AddAbility.MC)  + HIBYTE(m_Ability.MC));
	m_WAbility.SC		= MAKEWORD(LOBYTE(m_AddAbility.SC)  + LOBYTE(m_Ability.SC),  HIBYTE(m_AddAbility.SC)  + HIBYTE(m_Ability.SC));

	if (m_wStatusArr[STATE_DEFENCEUP] > 0) // 规绢仿 惑铰
		m_WAbility.AC = MAKEWORD(LOBYTE(m_WAbility.AC), HIBYTE(m_WAbility.AC) + 2 + (m_Ability.Level / 7));

	if (m_wStatusArr[STATE_MAGDEFENCEUP] > 0) // 付亲仿 惑铰
		m_WAbility.MAC = MAKEWORD(LOBYTE(m_WAbility.MAC), HIBYTE(m_WAbility.MAC) + 2 + (m_Ability.Level / 7));

	UpdateProcess(this, RM_CHARSTATUSCHANGED, m_sHitSpeed/*wparam*/, m_nCharStatus, 0, 0, NULL);
}

void CPlayerObject::ServerGetMagicKeyChange(int nMagicID, int nUseKey)
{
	PLISTNODE pListNode = m_pUserInfo->m_lpTMagicRcd.GetHead();

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

		if (lptUserMagicRcd)
		{
			if (lptUserMagicRcd->btMagicID == nMagicID)
			{
				lptUserMagicRcd->btUseKey	= nUseKey;
				break;
			}
		}

		pListNode = m_pUserInfo->m_lpTMagicRcd.GetNext(pListNode);
	}
}

void CPlayerObject::SendMyMagics()
{
	char				szEncodeMsg[4096];
	int					nPos = 0;

	_TDEFAULTMESSAGE	DefMsg;

	int nCnt = m_pUserInfo->EncodeMyMagic(szEncodeMsg, sizeof(szEncodeMsg), nPos);

	szEncodeMsg[nPos] = '\0';

	fnMakeDefMessage(&DefMsg, SM_SENDMYMAGIC, 0, 0, 0, nCnt);

	SendSocket(&DefMsg, szEncodeMsg);
}

void CPlayerObject::SendBagItems()
{
	char				szEncodeMsg[8096];
	int					nCnt	= m_pUserInfo->m_lpTItemRcd.GetCount();
	int					nGenCnt = m_pUserInfo->m_lpTGenItemRcd.GetCount();
	int					nPos	= 0;

	_TCLIENTITEMRCD		tClientItemRcd;
	_TDEFAULTMESSAGE	DefMsg;

	if (nCnt)
	{
		PLISTNODE pListNode = m_pUserInfo->m_lpTItemRcd.GetHead();

		while (pListNode)
		{
			_LPTUSERITEMRCD	lptUserItemRcd = m_pUserInfo->m_lpTItemRcd.GetData(pListNode);

			if (lptUserItemRcd)
			{
				g_pStdItemSpecial[lptUserItemRcd->nStdIndex].GetStandardItem(&tClientItemRcd);
				g_pStdItemSpecial[lptUserItemRcd->nStdIndex].GetUpgradeStdItem(&tClientItemRcd, lptUserItemRcd);

				memcpy(tClientItemRcd.szMakeIndex, lptUserItemRcd->szMakeIndex, 12);
				
				tClientItemRcd.nDura		= lptUserItemRcd->nDura;
				tClientItemRcd.nDuraMax		= lptUserItemRcd->nDuraMax;

				if (strlen(lptUserItemRcd->szPrefixName))
					strcpy(tClientItemRcd.tStdItem.szPrefixName, lptUserItemRcd->szPrefixName);
				else
					ZeroMemory(tClientItemRcd.tStdItem.szPrefixName, sizeof(tClientItemRcd.tStdItem.szPrefixName));

				nPos +=	fnEncode6BitBufA((unsigned char *)&tClientItemRcd, &szEncodeMsg[nPos], sizeof(_TCLIENTITEMRCD), sizeof(szEncodeMsg) - nPos);

				szEncodeMsg[nPos++] = '/';
			}

			pListNode = m_pUserInfo->m_lpTItemRcd.GetNext(pListNode);
		}
	}

	if (nGenCnt)
	{
		char		szVal[5];

		ZeroMemory(szVal, sizeof(szVal));

		PLISTNODE pListNode = m_pUserInfo->m_lpTGenItemRcd.GetHead();

		while (pListNode)
		{
			_LPTGENERALITEMRCD	lptGenItemRcd = m_pUserInfo->m_lpTGenItemRcd.GetData(pListNode);

			if (lptGenItemRcd)
			{
				memcpy(tClientItemRcd.szMakeIndex, lptGenItemRcd->szMakeIndex, 12);
		
				tClientItemRcd.nDura		= lptGenItemRcd->nDura;
				tClientItemRcd.nDuraMax		= lptGenItemRcd->nDuraMax;

				g_pStdItemEtc[lptGenItemRcd->nStdIndex].GetStandardItem(&tClientItemRcd);

				nPos +=	fnEncode6BitBufA((unsigned char *)&tClientItemRcd, &szEncodeMsg[nPos], sizeof(_TCLIENTITEMRCD), sizeof(szEncodeMsg) - nPos);

				szEncodeMsg[nPos++] = '/';
			}

			pListNode = m_pUserInfo->m_lpTGenItemRcd.GetNext(pListNode);
		}
	}

	szEncodeMsg[nPos] = '\0';

	fnMakeDefMessage(&DefMsg, SM_BAGITEMS, (int)this, 0, 0, nCnt + nGenCnt);

	SendSocket(&DefMsg, szEncodeMsg);
}

void CPlayerObject::RecalcLevelAbilitys()
{
	int n;
	float nLevel = m_Ability.Level;

	switch (m_pUserInfo->m_THumanRcd.btJob)
	{
		case 2:		// 档荤
		{
            m_Ability.MaxHP			= 14 + ROUND((nLevel / 6 + 2.5) * nLevel);
            m_Ability.MaxMP			= 13 + ROUND((nLevel / 8)* 2.2 * nLevel);
            m_Ability.MaxWeight		= 50 + ROUND((nLevel / 4) * nLevel);
            m_Ability.MaxWearWeight = 15 + ROUND((nLevel / 50) * nLevel);
            m_Ability.MaxHandWeight = 12 + ROUND((nLevel / 42) * nLevel);

            n = (int)nLevel / 7;
            
			m_Ability.DC			= MAKEWORD(_MAX(n-1, 0), _MAX(1, n));
            m_Ability.MC			= 0;
            m_Ability.SC			= MAKEWORD(_MAX(n-1, 0), _MAX(1, n));
            m_Ability.AC			= 0;
            
			n = ROUND(nLevel / 6);

            m_Ability.MAC			= MAKEWORD(n / 2, n + 1);
		
			break;
		}
		case 1:		// 贱荤
		{
            m_Ability.MaxHP			= 14 + ROUND((nLevel / 15 + 1.8) * nLevel);
            m_Ability.MaxMP			= 13 + ROUND((nLevel / 5 + 2) * 2.2 * nLevel);
            m_Ability.MaxWeight		= 50 + ROUND((nLevel / 5) * nLevel);
            m_Ability.MaxWearWeight = 15 + ROUND((nLevel / 100) * nLevel);
            m_Ability.MaxHandWeight = 12 + ROUND((nLevel / 90) * nLevel);

            n = (int)nLevel / 7;

			m_Ability.DC			= MAKEWORD(_MAX(n-1, 0), _MAX(1, n));
            m_Ability.MC			= MAKEWORD(_MAX(n-1, 0), _MAX(1, n));
            m_Ability.SC			= 0;
            m_Ability.AC			= 0;
            m_Ability.MAC			= 0;

			break;
		}
		case 0:		// 傈荤
		{
            m_Ability.MaxHP			= 14 + ROUND((nLevel / 4 + 4) * nLevel);
            m_Ability.MaxMP			= 11 + (int)(nLevel * 2);
            m_Ability.MaxWeight		= 50 + ROUND((nLevel / 3) * nLevel);
            m_Ability.MaxWearWeight = 15 + ROUND((nLevel / 20) * nLevel);
            m_Ability.MaxHandWeight = 12 + ROUND((nLevel / 13) * nLevel);
            m_Ability.DC			= MAKEWORD(_MAX((int)(nLevel / 7) - 1, 1), _MAX(1, int(nLevel / 5)));
            m_Ability.SC			= 0;
            m_Ability.MC			= 0;
            m_Ability.AC			= MAKEWORD(0, int(nLevel / 7));
            m_Ability.MAC			= 0;

			break;
		}
	}

	if (m_Ability.HP > m_Ability.MaxHP) m_Ability.HP = m_Ability.MaxHP;
	if (m_Ability.MP > m_Ability.MaxMP) m_Ability.MP = m_Ability.MaxMP;
}

void CPlayerObject::Initialize()
{
	if (!m_pUserInfo) return;

	m_dwLatestHitTime		= 0;
	m_nHitTimeOverCount		= 0;

	m_nCurrX		= m_pUserInfo->m_THumanRcd.nCX;
	m_nCurrY		= m_pUserInfo->m_THumanRcd.nCY;
	m_nDirection	= m_pUserInfo->m_THumanRcd.nDirection;
	m_pMap			= GetMap(m_pUserInfo->m_THumanRcd.szMapName);

	memcpy(m_szName, m_pUserInfo->m_szCharName, memlen(m_pUserInfo->m_szCharName));

	if (m_pMap)
	{
		AddProcess(this, RM_LOGON, 0, 0, 0, 0, NULL); 

		m_pMap->AddNewObject(m_nCurrX, m_nCurrY, OS_MOVINGOBJECT, this);

		AddRefMsg(RM_TURN, m_nDirection, m_nCurrX, m_nCurrY, 0, NULL);

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

		m_Ability.MaxExp	= NEEDEXPS[m_Ability.Level];

		RecalcLevelAbilitys();
		RecalcAbilitys();

		m_btBright = g_nMirDayTime;

		AddProcess(this, RM_ABILITY, 0, 0, 0, 0, NULL);
		AddProcess(this, RM_SUBABILITY, 0, 0, 0, 0, NULL);
		AddProcess(this, RM_DAYCHANGING, 0, 0, 0, 0, NULL);
		AddProcess(this, RM_SENDUSEITEMS, 0, 0, 0, 0, NULL);
		AddProcess(this, RM_SENDMYMAGIC, 0, 0, 0, 0, NULL);

		// BEGIN : Send Attack Mode Msg
		TCHAR	wszMsg[128];
		char	szMsg[128];

		LoadString(g_hInst, m_pUserInfo->GetAttackMode() + IDS_ATTACKMODE_ALL, wszMsg, sizeof(wszMsg)/sizeof(TCHAR));
		WideCharToMultiByte(CP_ACP, 0, wszMsg, -1, szMsg, sizeof(szMsg), NULL, NULL);
		SysMsg(szMsg, 1);

		LoadString(g_hInst, IDS_ATTACKMODE_CHGMODE, wszMsg, sizeof(wszMsg)/sizeof(TCHAR));
		WideCharToMultiByte(CP_ACP, 0, wszMsg, -1, szMsg, sizeof(szMsg), NULL, NULL);
		SysMsg(szMsg, 1);
		// END : Send Attack Mode Msg
	}
}
/*
void CPlayerObject::SendSocket(_LPTDEFAULTMESSAGE lpDefMsg, char *pszPacket)
{
	DWORD					dwBytesSends = 0;
	_TMSGHEADER				MsgHdr;

	MsgHdr.nCode			= 0xAA55AA55;
	MsgHdr.wIdent			= GM_DATA;
	MsgHdr.wUserGateIndex	= m_pUserInfo->m_nUserGateIndex;
	MsgHdr.wUserListIndex	= m_pUserInfo->m_nUserServerIndex;
	MsgHdr.nSocket			= m_pUserInfo->m_sock;

	if (lpDefMsg)
	{
		if (pszPacket)
		{
			int nLength = memlen(pszPacket);

			if (nLength >= 256) return;				// If pszPacket is too long.

			MsgHdr.nLength	= sizeof(_TDEFAULTMESSAGE) + nLength;

			m_pUserInfo->m_pGateInfo->OverlappedEx[1].DataBuf.len	= sizeof(_TMSGHEADER) + MsgHdr.nLength;

			memmove(m_pUserInfo->m_pGateInfo->OverlappedEx[1].Buffer, (char *)&MsgHdr, sizeof(_TMSGHEADER));
			memmove(&m_pUserInfo->m_pGateInfo->OverlappedEx[1].Buffer[sizeof(_TMSGHEADER)], lpDefMsg, sizeof(_TDEFAULTMESSAGE));
			memmove(&m_pUserInfo->m_pGateInfo->OverlappedEx[1].Buffer[sizeof(_TMSGHEADER) + sizeof(_TDEFAULTMESSAGE)], pszPacket, MsgHdr.nLength - sizeof(_TDEFAULTMESSAGE));
			
			m_pUserInfo->m_pGateInfo->OverlappedEx[1].Buffer[m_pUserInfo->m_pGateInfo->OverlappedEx[1].DataBuf.len] = '\0';
		}
		else
		{
			MsgHdr.nLength		= sizeof(_TDEFAULTMESSAGE);

			m_pUserInfo->m_pGateInfo->OverlappedEx[1].DataBuf.len = sizeof(_TMSGHEADER) + MsgHdr.nLength;

			memmove(m_pUserInfo->m_pGateInfo->OverlappedEx[1].Buffer, (char *)&MsgHdr, sizeof(_TMSGHEADER));
			memmove(&m_pUserInfo->m_pGateInfo->OverlappedEx[1].Buffer[sizeof(_TMSGHEADER)], lpDefMsg, sizeof(_TDEFAULTMESSAGE));
			m_pUserInfo->m_pGateInfo->OverlappedEx[1].Buffer[m_pUserInfo->m_pGateInfo->OverlappedEx[1].DataBuf.len] = '\0';
		}
	}
	else
	{
		int nLen		= (memlen(pszPacket) - 1);
		
		MsgHdr.nLength	= -(nLen);

		m_pUserInfo->m_pGateInfo->OverlappedEx[1].DataBuf.len = sizeof(_TMSGHEADER) + nLen;

		memmove(m_pUserInfo->m_pGateInfo->OverlappedEx[1].Buffer, (char *)&MsgHdr, sizeof(_TMSGHEADER));
		memmove(&m_pUserInfo->m_pGateInfo->OverlappedEx[1].Buffer[sizeof(_TMSGHEADER)], pszPacket, nLen);
		m_pUserInfo->m_pGateInfo->OverlappedEx[1].Buffer[m_pUserInfo->m_pGateInfo->OverlappedEx[1].DataBuf.len] = '\0';
	}

	m_pUserInfo->m_pGateInfo->OverlappedEx[1].nOvFlag		= OVERLAPPED_SEND;
	m_pUserInfo->m_pGateInfo->OverlappedEx[1].DataBuf.buf	= m_pUserInfo->m_pGateInfo->OverlappedEx[1].Buffer;

	WSASend(m_pUserInfo->m_pGateInfo->m_sock, &m_pUserInfo->m_pGateInfo->OverlappedEx[1].DataBuf, 1, &dwBytesSends, 0, (OVERLAPPED *)&m_pUserInfo->m_pGateInfo->OverlappedEx[1], NULL);
}
*/
BOOL CPlayerObject::DoRideHorse(int nDir, int fRideFlag)
{
//	if (fRideFlag == m_xAbility.m_fRideHorse)
//	{
/*		if (m_xAbility.m_fRideHorse)
			AddRefMsg(RM_RIDE, 0, 0, 0, 0, NULL);
		else
			AddRefMsg(RM_RIDE, 1, 0, 0, 0, NULL);
*/
//		return TRUE;
//	}

	return FALSE;
}

void CPlayerObject::MakeFeature()
{
	m_tFeature.btGender			= m_pUserInfo->GetGenderFeature();
	m_tFeature.btWear			= m_pUserInfo->GetDressFeature();
	m_tFeature.btHair			= m_pUserInfo->GetHairFeature();
	m_tFeature.btWeapon			= m_pUserInfo->GetWeaponFeature();

	m_tFeatureEx.btHorse		= m_pUserInfo->GetHorseFeatureEx();
	m_tFeatureEx.dwHairColor	= 0xFFFF;

⌨️ 快捷键说明

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