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

📄 role.cpp

📁 网络游戏魔域源代码 测试可以完整变异
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	else if(this->TestStatus(USERSTATUS_WOUND))
	{
		switch(m_Info.iActType)
		{
			case _ACTION_WALKL:
				m_Info.iActType = _ACTION_WALKL_I;
				break;
			case _ACTION_WALKR:
				m_Info.iActType = _ACTION_WALKR_I;
				break;
		}
	}
*/
	DWORD dwTerrain = g_objGameMap.GetTerrain(m_Info.posMap.x, m_Info.posMap.y);
	
	m_Info.iActFrameAmount	=m_pIRoleView->SetAction(m_Info.iActType, true, bPlaySound, m_Info.posWorld.x, m_Info.posWorld.y, true, dwTerrain);
	if(m_Info.cmdProc.nFrameEnd != 0 && m_Info.cmdProc.nFrameStart < m_Info.cmdProc.nFrameEnd)
	{
		m_Info.iActFrameAmount = m_Info.cmdProc.nFrameEnd - m_Info.cmdProc.nFrameStart;
		m_pIRoleView->SetVariable(_VAR_FRAME, m_Info.cmdProc.nFrameStart);
	}
	m_Info.timeFrameInterval = this->GetFrameInterval(m_Info.iActType);
	if(m_Info.cmdProc.nFrameInterval != 0)
		m_Info.timeFrameInterval = m_Info.cmdProc.nFrameInterval;
	if(bAccelerate)
		m_Info.timeFrameInterval = m_Info.timeFrameInterval/4;
	m_Info.timeFirstFrame	=::TimeGet();

	// map 3d effect of action 
	int nTerrain = g_objGameMap.GetTerrain(m_Info.posMap);
	const ActionMapEffectInfo* pInfo = g_obj3DRoleData.GetActionMapEffect(m_Info.usLook, m_Info.iActType, nTerrain);
	if (pInfo && pInfo->nShowTime == 0)	// effect show at begin of action
	{
		if (pInfo->nType == 0) 
		{
			C3DMapEffect* pEffect = g_objGameMap.Add3DMapEffect(m_Info.posWorld, (char*)pInfo->szEffect);
			if(pEffect && pInfo->bRotate)
			{
				pEffect->SetDir(pInfo->bRotate);
			}
		}
		else if (pInfo->nType == 1) 
		{
			m_objEffect.Add((char*)pInfo->szEffect,pInfo->bRotate,this->GetDir(),this->GetLook());
		}
	}

	// 极品帽子的特效
	ItemTypeInfo infoItem;
	if(!CItem::s_ItemData.GetItemTypeInfo(this->GetArmet(), infoItem))
	{
		this->m_objEffect.Delete("elf");
		return;
	}
	if(infoItem.ucRequiredLevel < 67)
	{
		this->m_objEffect.Delete("elf");
		return;
	}
	if(infoItem.uID%10 != 9)
	{
		this->m_objEffect.Delete("elf");
		return;
	}
	if(infoItem.uID/10000 != 11)
	{
		this->m_objEffect.Delete("elf");
		return;
	}
	if((m_Info.iActType != _ACTION_STANDBY) && 
		(m_Info.iActType != _ACTION_REST1) && 
		(m_Info.iActType != _ACTION_REST2) &&
		(m_Info.iActType != _ACTION_REST3) &&
		(m_Info.iActType != _ACTION_ALERT) &&		
		(m_Info.iActType != _ACTION_FLY_STANDBY))
	{
		this->m_objEffect.Delete("elf");
		return;
	}
	if(this->m_objEffect.TestEffect("elf"))
		return;
	this->m_objEffect.Add("elf",false,0,this->GetLook());

}

//--------------------------------------------------------------
void CRole::ResetActionData(void)
{
	if(m_Info.cmdProc.iType == _COMMAND_DIE)
		return;
	if ((this->GetID() == g_objHero.GetID() || this->IsMyPet())
			&& this->IsMoving())
		return;

	if (_CMDSTATUS_BEGIN == m_Info.cmdProc.iStatus)
		this->ProcessCommand();

	m_Info.iActFrameIndex	= m_Info.iActFrameAmount;
	m_Info.posWorld			= m_Info.posActionEnd;
	m_Info.nZ				= m_Info.nZ;
	g_objGameMap.World2Cell(m_Info.posWorld.x, m_Info.posWorld.y, m_Info.posMap.x, m_Info.posMap.y);
	g_objGameMap.World2Screen(m_Info.posWorld.x, m_Info.posWorld.y, m_Info.posScr.x, m_Info.posScr.y);
}

//--------------------------------------------------------------
// return true means this action is end
BOOL CRole::ProcessAction(void)
{	
	if(this->GetID() == g_objHero.GetID() && 
		m_Info.cmdProc.iType != _COMMAND_RUN)
	{
		g_objHero.m_nFastRunSetp = 0; 
	}
	if(m_Info.cmdProc.nFrameEnd != 0 && m_Info.cmdProc.nFrameStart < m_Info.cmdProc.nFrameEnd)
	{
		if(m_Info.iActFrameIndex >= m_Info.cmdProc.nFrameEnd)
			return true;
	}
	if(m_Info.iActFrameIndex >= m_Info.iActFrameAmount)
	{
		m_Info.bAdjustDir = false;
		return true;
	}
	// get the current frame index
	DWORD timeCurrent	=::TimeGet();
	m_Info.iActFrameIndex	=(timeCurrent-m_Info.timeFirstFrame+m_Info.timeFrameInterval/2)/m_Info.timeFrameInterval;
	if (m_Info.iActFrameIndex > m_Info.iActFrameAmount)
		m_Info.iActFrameIndex	=m_Info.iActFrameAmount;

	// set world pos
	m_Info.posWorld.x	=m_Info.posActionBegin.x;
	m_Info.posWorld.y	=m_Info.posActionBegin.y;
	m_Info.nZ = m_Info.nPosActionBeginZ;
	// now get the world pos of role
	int nDeltaX	=m_Info.posActionEnd.x-m_Info.posActionBegin.x;
	int nDeltaY	=m_Info.posActionEnd.y-m_Info.posActionBegin.y;
	int nDeltaZ =m_Info.nPosActionEndZ-m_Info.nPosActionBeginZ;

	if (nDeltaX != 0 || nDeltaY != 0)
	{
		DWORD timeCost	=__max(1, m_Info.timeFrameInterval*m_Info.iActFrameAmount);
		DWORD timePass	=__min(timeCost, timeCurrent-m_Info.timeFirstFrame);
		
		DWORD dwKey = m_pIRoleView ? m_pIRoleView->GetVariable(_VAR_ACTION_DATA) : 0;
		CONST CActionCtrlInfo* pInfo = g_obj3DRoleData.GetActionCtrlInfo(dwKey);
		if (pInfo)
		{
			// 求当前的运动位移百分比
			int nTimePercent = __min(100, 100 * timePass / timeCost);
			for (int i = 0; i < pInfo->nSection; i++)
			{
				if (nTimePercent < pInfo->nTimePercent[i])
					break;
			}

			if (i < pInfo->nSection)
			{
				// 求上一段的绝对时间
				int nPreSectionTimePercent = (i <= 0) ? 0 : pInfo->nTimePercent[i - 1];
				int nPreSectionTime = timeCost * nPreSectionTimePercent / 100;

				// 此段的间隔时间
				int nSectionTime = timeCost * pInfo->nTimePercent[i] / 100 - nPreSectionTime;

				// 当前时间在段时间中的百分比例, 注意加上0.5是为了4舍5入
				int nSectionPassTimePercent = 0.5f + 100.0f * (timePass - nPreSectionTime) / __max(1, nSectionTime);
				if (nSectionPassTimePercent > 100)
					nSectionPassTimePercent = 100;

				
				// 上一段的位移百分比
				int nPreSectionMovePercent = (i <= 0) ? 0 : pInfo->nMovePercent[i - 1];

				// 求出当前时间的位移百分比
				int nMovePercent = nPreSectionMovePercent + (pInfo->nMovePercent[i] - nPreSectionMovePercent) * nSectionPassTimePercent / 100;


				// 得出当前世界坐标
				DOUBLE dbChangeX = 1.0 * nDeltaX * nMovePercent / 100;
				DOUBLE dbChangeY = 1.0 * nDeltaY * nMovePercent / 100;
				
				m_Info.posWorld.x = m_Info.posActionBegin.x + ::Double2Int(dbChangeX);
				m_Info.posWorld.y = m_Info.posActionBegin.y + ::Double2Int(dbChangeY);
			}
			else
			{
				m_Info.posWorld = m_Info.posActionEnd;
			}
		}
		else
		{
			DOUBLE dbChangeX	=1.0*nDeltaX*timePass/timeCost;
			DOUBLE dbChangeY	=1.0*nDeltaY*timePass/timeCost;

			m_Info.posWorld.x	=m_Info.posActionBegin.x + ::Double2Int(dbChangeX);
			m_Info.posWorld.y	=m_Info.posActionBegin.y + ::Double2Int(dbChangeY);
		}
		DOUBLE dbChangeZ	=1.0*nDeltaZ*timePass/timeCost;

		m_Info.nZ	=m_Info.nPosActionBeginZ + ::Double2Int(dbChangeZ);
		if(m_Info.nZ != 0)
			int fdafa=1;

	}
	else
	{
	}
	
	// get map pos according world pos
	g_objGameMap.World2Cell(m_Info.posWorld.x, m_Info.posWorld.y, m_Info.posMap.x, m_Info.posMap.y);

	// get screen pos of role
	g_objGameMap.World2Screen(m_Info.posWorld.x, m_Info.posWorld.y, m_Info.posScr.x, m_Info.posScr.y);


	// shall we show the last frame of action?
	if(m_Info.cmdProc.nFrameEnd != 0 && m_Info.cmdProc.nFrameStart < m_Info.cmdProc.nFrameEnd
		&& m_Info.iActFrameIndex >= m_Info.cmdProc.nFrameEnd)
	{
		// map 3d effect of action 
		int nTerrain = g_objGameMap.GetTerrain(m_Info.posMap);
		const ActionMapEffectInfo* pInfo = g_obj3DRoleData.GetActionMapEffect(m_Info.usLook, m_Info.iActType, nTerrain);
		if (pInfo && pInfo->nShowTime == 1)	// effect show at end of action
		{
			if (pInfo->nType == 0) 
			{
				C3DMapEffect* pEffect = g_objGameMap.Add3DMapEffect(m_Info.posWorld, (char*)pInfo->szEffect);
				if(pEffect && pInfo->bRotate)
				{
					pEffect->SetDir(pInfo->bRotate);
				}
			}
			else if (pInfo->nType == 1) 
			{
				m_objEffect.Add((char*)pInfo->szEffect,pInfo->bRotate,this->GetDir(),this->GetLook());
			}
		}

		{
			m_Info.bAdjustDir = false;
			return true;
		}

	}
	else
	if(m_Info.iActFrameIndex >= m_Info.iActFrameAmount)
	{
		// map 3d effect of action 
		int nTerrain = g_objGameMap.GetTerrain(m_Info.posMap);
		const ActionMapEffectInfo* pInfo = g_obj3DRoleData.GetActionMapEffect(m_Info.usLook, m_Info.iActType, nTerrain);
		if (pInfo && pInfo->nShowTime == 1)	// effect show at end of action
		{
			if (pInfo->nType == 0) 
			{
				C3DMapEffect* pEffect = g_objGameMap.Add3DMapEffect(m_Info.posWorld, (char*)pInfo->szEffect);
				if(pEffect && pInfo->bRotate)
				{
					pEffect->SetDir(pInfo->bRotate);
				}
			}
			else if (pInfo->nType == 1) 
			{
				m_objEffect.Add((char*)pInfo->szEffect,pInfo->bRotate,this->GetDir(),this->GetLook());
			}
		}

		{
			m_Info.bAdjustDir = false;
			return true;
		}
	}
	else
		return false;
}

//--------------------------------------------------------------
// return true if accomplished the command processed
BOOL CRole::ProcessCommand(void)
{
	if (m_Info.cmdProc.iStatus == _CMDSTATUS_ACCOMPLISH)
	{
		// set default cmd
		if(m_Info.nFlyOffset == 0)
			m_Info.cmdProc.iType	= _COMMAND_STANDBY;
		else
			m_Info.cmdProc.iType	= _COMMAND_FLOAT;
		m_Info.cmdProc.iStatus  = _CMDSTATUS_BEGIN;
	}

	BOOL bAccomlished	=true;
	switch(m_Info.cmdProc.iType)
	{
	case _COMMAND_WALK:
		bAccomlished	=Walk();
		break;

	case _COMMAND_RUN:
		bAccomlished	=Run();
		break;

	case _COMMAND_JUMP:
		bAccomlished	=Jump();
		break;

	case _COMMAND_FOLLOW:
		bAccomlished	=Follow();
		break;

	case _COMMAND_EMOTION:
		bAccomlished	=Emotion();
		break;

	case _COMMAND_POSE:
		bAccomlished	=Pose();
		break;
	case _COMMAND_INTONE:
	case _COMMAND_ACTION:
		bAccomlished	=Action();
		break;

	case _COMMAND_ATTACK:
	case _COMMAND_SPATTACK:
		bAccomlished	=Attack();
		break;

	case _COMMAND_LOCKBOOTH:
		bAccomlished	=LockBooth();
		break;

	case _COMMAND_LOCKATK:
		bAccomlished	=LockAtk();
		break;

	case _COMMAND_BUMP:
		bAccomlished	=Bump();
		break;

	case _COMMAND_TEAMFOLLOW:
		bAccomlished	=TeamFollow();
		break;

	case _COMMAND_RUSHATK:
		bAccomlished	=RushAtk();
		break;

	case _COMMAND_DIE:
		bAccomlished	=Die();
		break;

	case _COMMAND_WALKFORWARD:
		bAccomlished	=WalkForward();
		break;

	case _COMMAND_RUNFORWARD:
		bAccomlished	=RunForward();
		break;

	case _COMMAND_PICKUP:
		bAccomlished	=PickUp();
		break;

/*	case _COMMAND_INTONE:
		bAccomlished	=InTone();
		break;
*/
	case _COMMAND_MINE:
		bAccomlished	=Mine();
		break;
	case _COMMAND_TAKEOFF:
		bAccomlished	=TakeOff();
		break;
	case _COMMAND_LANDING:
		bAccomlished	=Landing();
		break;
	case _COMMAND_FLOAT:
		bAccomlished	=Float();
		break;
	case _COMMAND_KONGFU:
		bAccomlished	=Kongfu();
		break;
	default:
		bAccomlished	=StandBy();
		break;

	}

	/*
	if (bAccomlished)
		this->ClrRushPos();
	*/

	return bAccomlished;
}

//--------------------------------------------------------------
void CRole::Process(void* pInfo)
{
	this->ProcessAniEffect();

	if (this->ProcessAction())
	{
		this->ProcessCommand();
		this->SetActionData();
	}

	if (this->GetActionType() == _ACTION_WALKL ||
			this->GetActionType() == _ACTION_WALKR ||
				this->GetActionType() == _ACTION_RUNL ||
					this->GetActionType() == _ACTION_RUNR)
	{
		CMyPos posCurrent = m_Info.posMap;
		CMyPos posPreStep;
		int nDir = this->GetDir();
		if(nDir > 3)
			g_objGameMap.World2Cell(m_Info.posActionEnd.x, m_Info.posActionEnd.y, posPreStep.x, posPreStep.y);

⌨️ 快捷键说明

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