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

📄 objectplayer.cpp

📁 此为传奇游戏源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	m_tFeatureEx.dwWearColor	= 0xFFFF;
}

BOOL CPlayerObject::CheckTakeOnItem(WORD wWhere, _LPTUSERITEMRCD lpTItemRcd)
{
	TCHAR	wszMsg[64];
	char	szMsg[64];

	int		nNeed		= g_pStdItemSpecial[lpTItemRcd->nStdIndex].wNeed;
	int		nNeedLevel	= g_pStdItemSpecial[lpTItemRcd->nStdIndex].wNeedLevel;;
	int		nWeight		= g_pStdItemSpecial[lpTItemRcd->nStdIndex].wWeight;

	if (wWhere == U_DRESS)
	{
		if (lpTItemRcd->szMakeIndex[0] != 'B') return FALSE;

		if (g_pStdItemSpecial[lpTItemRcd->nStdIndex].wStdMode == 10)	// 巢磊渴
		{
			if (m_tFeature.btGender != 0)
			{
				LoadString(g_hInst, IDS_MALE_WEAR, wszMsg, sizeof(wszMsg)/sizeof(TCHAR));
				WideCharToMultiByte(CP_ACP, 0, wszMsg, -1, szMsg, sizeof(szMsg), NULL, NULL);
				SysMsg(szMsg, 0);

				return FALSE;
			}
		}
		else if (g_pStdItemSpecial[lpTItemRcd->nStdIndex].wStdMode == 11)	// 咯磊渴
		{
			if (m_tFeature.btGender != 1)
			{
				LoadString(g_hInst, IDS_FEMALE_WEAR, wszMsg, sizeof(wszMsg)/sizeof(TCHAR));
				WideCharToMultiByte(CP_ACP, 0, wszMsg, -1, szMsg, sizeof(szMsg), NULL, NULL);
				SysMsg(szMsg, 0);

				return FALSE;
			}
		}
	}
	   
	if ((wWhere == U_WEAPON) || (wWhere == U_RIGHTHAND))
	{
		if (m_WAbility.MaxHandWeight < nWeight)
		{
			LoadString(g_hInst, IDS_NOTENOUGH_VALUE, wszMsg, sizeof(wszMsg)/sizeof(TCHAR));
			WideCharToMultiByte(CP_ACP, 0, wszMsg, -1, szMsg, sizeof(szMsg), NULL, NULL);
			SysMsg(szMsg, 0);

			return FALSE;
		}
	}
	else
	{
		if (m_WAbility.MaxWearWeight < nWeight + m_pUserInfo->CalcWearWeightEx(wWhere))
		{
			LoadString(g_hInst, IDS_NOTENOUGH_WEIGHT, wszMsg, sizeof(wszMsg)/sizeof(TCHAR));
			WideCharToMultiByte(CP_ACP, 0, wszMsg, -1, szMsg, sizeof(szMsg), NULL, NULL);
			SysMsg(szMsg, 0);

			return FALSE;
		}
	}

	switch (nNeed)
	{
		case 0:
			if (m_WAbility.Level < nNeedLevel) goto _NOTENOUGH_VALUE;
			break;
		case 1:
			if (HIBYTE(m_WAbility.DC) < nNeedLevel) goto _NOTENOUGH_VALUE;
			break;
		case 2:
			if (HIBYTE(m_WAbility.MC) < nNeedLevel) goto _NOTENOUGH_VALUE;
			break;
		case 3:
			if (HIBYTE(m_WAbility.SC) < nNeedLevel) goto _NOTENOUGH_VALUE;
			break;
	}

	return TRUE;

_NOTENOUGH_VALUE:

	LoadString(g_hInst, IDS_NOTENOUGH_VALUE, wszMsg, sizeof(wszMsg)/sizeof(TCHAR));
	WideCharToMultiByte(CP_ACP, 0, wszMsg, -1, szMsg, sizeof(szMsg), NULL, NULL);
	SysMsg(szMsg, 0);

	return FALSE;
}

void CPlayerObject::ServerGetTakeOnGenItem(WORD wWhere, char *pszItemIndex)
{
	_LPTGENERALITEMRCD	lpTGenItemRcd = NULL;
	_TDEFAULTMESSAGE	DefMsg;

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

		while (pListNode)
		{
			lpTGenItemRcd = m_pUserInfo->m_lpTGenItemRcd.GetData(pListNode);
		
			if (memcmp(pszItemIndex, lpTGenItemRcd->szMakeIndex, _MAKEITEMINDEX) == 0)
			{
				memcpy(m_pUserInfo->m_THumanRcd.szTakeItem[wWhere], lpTGenItemRcd->szMakeIndex, _MAKEITEMINDEX);

				RecalcAbilitys();

				LONG lFeature = GetFeatureToLong();

				AddProcess(this, RM_ABILITY, 0, 0, 0, 0, NULL);
				AddProcess(this, RM_SUBABILITY, 0, 0, 0, 0, NULL);

				fnMakeDefMessage(&DefMsg, SM_TAKEON_OK, lFeature, 0, 0, 0);
				SendSocket(&DefMsg, NULL);

				AddRefMsg(RM_FEATURECHANGED, 0, lFeature, 0, 0, NULL);

				return;
			}

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

	fnMakeDefMessage(&DefMsg, SM_TAKEON_FAIL, 2, 0, 0, 0);
	SendSocket(&DefMsg, NULL);
}

void CPlayerObject::ServerGetTakeOnItem(WORD wWhere, char *pszItemIndex)
{
	_TDEFAULTMESSAGE	DefMsg;

	_LPTUSERITEMRCD lpTItemRcd = m_pUserInfo->GetItem(pszItemIndex);
	
	if (lpTItemRcd)
	{
		if (CheckTakeOnItem(wWhere, lpTItemRcd))
		{
			memcpy(m_pUserInfo->m_THumanRcd.szTakeItem[wWhere], lpTItemRcd->szMakeIndex, _MAKEITEMINDEX);

			switch (wWhere)
			{
				case U_DRESS:
					m_tFeature.btWear = m_pUserInfo->GetDressFeature();
					break;
				case U_WEAPON:
					m_tFeature.btWeapon	= m_pUserInfo->GetWeaponFeature();
					break;
			}

			RecalcAbilitys();

			LONG lFeature = GetFeatureToLong();

			AddProcess(this, RM_ABILITY, 0, 0, 0, 0, NULL);
			AddProcess(this, RM_SUBABILITY, 0, 0, 0, 0, NULL);

			fnMakeDefMessage(&DefMsg, SM_TAKEON_OK, lFeature, 0, 0, 0);
			SendSocket(&DefMsg, NULL);

			AddRefMsg(RM_FEATURECHANGED, 0, lFeature, 0, 0, NULL);

			return;
		}
		else
		{
			fnMakeDefMessage(&DefMsg, SM_TAKEON_FAIL, 1, 0, 0, 0);
			SendSocket(&DefMsg, NULL);

			return;
		}
	}

	fnMakeDefMessage(&DefMsg, SM_TAKEON_FAIL, 2, 0, 0, 0);
	SendSocket(&DefMsg, NULL);
}

void CPlayerObject::ServerGetTakeOffItem(WORD wWhere, char *pszItemIndex)
{
	_LPTUSERITEMRCD		lpTItemRcd = NULL;
	_TDEFAULTMESSAGE	DefMsg;

//		PLISTNODE pListNode = m_pUserInfo->m_lpTItemRcd.GetHead();

//		while (pListNode)
//		{
//			lpTItemRcd = m_pUserInfo->m_lpTItemRcd.GetData(pListNode);
		
	if (memcmp(m_pUserInfo->m_THumanRcd.szTakeItem[wWhere], pszItemIndex, _MAKEITEMINDEX) == 0)
	{
		ZeroMemory(m_pUserInfo->m_THumanRcd.szTakeItem[wWhere], _MAKEITEMINDEX);
		memcpy(m_pUserInfo->m_THumanRcd.szTakeItem[wWhere], "0", 2);

		switch (wWhere)
		{
			case U_DRESS:
				m_tFeature.btWear = m_pUserInfo->GetDressFeature();
				break;
			case U_WEAPON:
				m_tFeature.btWeapon	= m_pUserInfo->GetWeaponFeature();
				break;
		}

		RecalcAbilitys();

		LONG lFeature = GetFeatureToLong();

		AddProcess(this, RM_ABILITY, 0, 0, 0, 0, NULL);
		AddProcess(this, RM_SUBABILITY, 0, 0, 0, 0, NULL);

		fnMakeDefMessage(&DefMsg, SM_TAKEOFF_OK, lFeature, 0, 0, 0);
		SendSocket(&DefMsg, NULL);

		AddRefMsg(RM_FEATURECHANGED, 0, lFeature, 0, 0, NULL);
	}
	else
	{
		fnMakeDefMessage(&DefMsg, SM_TAKEOFF_FAIL, 1, 0, 0, 0);
		SendSocket(&DefMsg, NULL);
	}
}

void CPlayerObject::SendMapName()
{
	if (m_pMap)
	{
		_TDEFAULTMESSAGE	DefMsg;
		char				szEncodeMsg[256];

		fnMakeDefMessage(&DefMsg, SM_MAPDESCRIPTION, 0, 0, 0, 0);

		int nPos = fnEncode6BitBufA((unsigned char *)m_pMap->m_szMapTextName, szEncodeMsg, memlen(m_pMap->m_szMapTextName) - 1, sizeof(szEncodeMsg));
		szEncodeMsg[nPos] = '\0';

		SendSocket(&DefMsg, szEncodeMsg);
	}
}

void CPlayerObject::SendNewMap()
{
	if (m_pMap)
	{
		_TDEFAULTMESSAGE	DefMsg;
		char				szEncodeMsg[256];
																			
		fnMakeDefMessage(&DefMsg, SM_NEWMAP, (int)this, m_nCurrX, m_nCurrY, MAKEWORD(DayBright(), m_pMap->m_btSeries));

		int nPos = fnEncode6BitBufA((unsigned char *)m_pMap->m_szMapName, szEncodeMsg, memlen(m_pMap->m_szMapName) - 1, sizeof(szEncodeMsg));
		szEncodeMsg[nPos] = '\0';

		SendSocket(&DefMsg, szEncodeMsg);
	}
}

BYTE CPlayerObject::DayBright()
{
	int n;
//               begin
//                  if PEnvir.Darkness then n := 1
//                  else
	if (m_btBright == 1)
		n = 0;
	else if (m_btBright == 3)
		n = 1;
	else
		n = 2;

/*                  if PEnvir.DayLight then n := 0; */

	return n;
}

void CPlayerObject::Run()
{
	if (RestoreHealSpell())
		Die();

	// 家券 坷宏璃飘 八荤
	if (m_xSlaveObjList.GetCount())
	{
		PLISTNODE pListNode = m_xSlaveObjList.GetHead();
	
		while (pListNode)
		{
			CCharObject* pCharObject = m_xSlaveObjList.GetData(pListNode);

			if (pCharObject)
			{
				if (pCharObject->m_fIsDead || pCharObject->m_fIsGhost || pCharObject->m_pMasterObject != this)
					pListNode = m_xSlaveObjList.RemoveNode(pListNode);
				else
					pListNode = m_xSlaveObjList.GetNext(pListNode);
			}
		}
	}

	CCharObject::Run();
}

WORD CPlayerObject::GetThisCharColor()
{
	return _CHAT_COLOR3;
}

void CPlayerObject::ServerGetButch(CCharObject* pCharObject, int nX, int nY, int nDir)
{
	if ((abs(nX - m_nCurrX) <= 2) && (abs(nY - m_nCurrY) <= 2))
	{
		if (m_pMap->IsValidObject(nX, nY, 2, pCharObject))
		{
			CAnimalObject* pAnimalObject = dynamic_cast<CAnimalObject*>(pCharObject);

			if (pAnimalObject)
			{
				if (pAnimalObject->m_fIsDead && !pAnimalObject->m_fSkeleton)
				{
					int n = 5 + rand() % 16;
					int m = 100 + rand() % 201;
												
					pAnimalObject->m_nMeatQuality	-= n;
					pAnimalObject->m_nBodyLeathery	-= m;

					if (pAnimalObject->m_nMeatQuality < 0) 
						pAnimalObject->m_nMeatQuality = 0;

					if (pAnimalObject->m_nBodyLeathery <= 0)
					{
	//               if (animal.RaceServer >= RC_ANIMAL) and (animal.RaceServer < RC_MONSTER) then begin  //荤娇鞍捞 绊扁甫林绰 巴父, 秦榜肺 函窃
	//                  animal.BoSkeleton := TRUE;
	//                  animal.ApplyMeatQuality;
	//                  animal.SendRefMsg (RM_SKELETON, animal.Dir, animal.CX, animal.CY, 0, '')
	//               end;
						pAnimalObject->m_fSkeleton = TRUE;
						pAnimalObject->AddRefMsg(RM_SKELETON, pAnimalObject->m_nDirection, pAnimalObject->m_nCurrX, pAnimalObject->m_nCurrY, 0, NULL);

//						if (!pAnimalObject->TakeCretBagItems())
//							SysMag("酒公巴档 掘瘤 给沁嚼聪促.", 0);

						pAnimalObject->m_nBodyLeathery = 50;
					}

					m_dwDeathTime = GetTickCount();
				}
			}
		}

		m_nDirection = nDir;
	}

	AddRefMsg(RM_BUTCH, nDir, m_nCurrX, m_nCurrY, 0, NULL);
}

BOOL CPlayerObject::SpellXY(int nKey, int nTargetX, int nTargetY, int nTargetObj)
{
	if (!m_pUserInfo) return FALSE;

	_LPTHUMANMAGICRCD	lptMagicRcd = m_pUserInfo->GetMagicRcdByKey(nKey);
	
	if (lptMagicRcd)
	{
		CMagicInfo*	pMagicInfo	= GetMagicInfo(lptMagicRcd->btMagicID);

		if (pMagicInfo)
		{
			int nSpellPoint = pMagicInfo->GetSpellPoint(lptMagicRcd->btLevel);

			switch (lptMagicRcd->btMagicID)
			{
				case _SKILL_ERGUM:
				{
					if (!m_pUserInfo->m_fLongHitSkill)
					{
						m_pUserInfo->AllowLongHitSkill(TRUE);
						SendSocket(NULL, "+LNG");
					}
					else
					{
						m_pUserInfo->AllowLongHitSkill(FALSE);
						SendSocket(NULL, "+ULNG");
					}

					return TRUE;
				}
				case _SKILL_BANWOL:
				{
					if (!m_pUserInfo->m_fWideHitSkill)
					{
						m_pUserInfo->AllowWideHitSkill(TRUE);
						SendSocket(NULL, "+WID");
					}
					else
					{
						m_pUserInfo->AllowWideHitSkill(FALSE);
						SendSocket(NULL, "+UWID");
					}

					return TRUE;
				}
				case _SKILL_FIRESWORD:
				{
					if (m_pUserInfo->AllowFireHitSkill())
					{
						DamageSpell(nSpellPoint);
						HealthSpellChanged();

						SendSocket(NULL, "+FIR");
					}

					return TRUE;
				}
			}

			if (m_WAbility.MP >= nSpellPoint)
			{
				DamageSpell(nSpellPoint);
				HealthSpellChanged();

				GetNextDirection(nTargetX, nTargetY);

				switch (lptMagicRcd->btMagicID)
				{
					case _SKILL_HANGMAJINBUB:
					case _SKILL_DEJIWONHO:
					case _SKILL_FIRECHARM:
					case _SKILL_FIRE:

⌨️ 快捷键说明

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