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

📄 role.cpp

📁 网络游戏魔域源代码 测试可以完整变异
💻 CPP
📖 第 1 页 / 共 4 页
字号:
#pragma warning(disable:4786)
#include "basefunc.H"
#include "nd_bitmap.H"
#include "ani.H"
#include "3dgamemap.H"
#include "3droledata.H"
#include "3DRole.h"
#include "role.H"
#include "Hero.H"
#include "GameMsg.H"
#include "GameDataSet.H"
#include "GamePlayerSet.h"
#include "3DStatuary.h"
#include "3DTarget.h"
#include "3DTaskNpc.h"
#include "SynStone.h"
#include "BoothNpc.h"
#include "MagicItem.h"
#include "DiceView.h"
#include "TerrainNpcView.h"
#include "Item.h"
#include "Physics.h"

const int _MAX_ROLEDATA		=2;
const int _DEFAULT_JUMP_HEIGH = 120;

// static member
int CRole::s_nShadowType = SHADOW_REAL;//SHADOW_SIMPLE;//CRole::SHADOW_REAL;//SHADOW_SIMPLE;
float CRole::s_fBaseScale = 0.75f;
//--------------------------------------------------------------
void CRole::Init(void)
{
	memset(&m_Info, 0L, sizeof(m_Info));

	this->InitCommand();

	m_Info.iSize = 1;
	m_Info.iAddSize = 0;
	m_Info.iZoomPercent = 100;
	m_Info.objPath.SetSearchMethod(_ASTAR_CLOSE);	
	m_pIRoleView	=NULL;
	m_dwStatus	=USERSTATUS_NORMAL;

	m_tmLastAtk		= 0;
	m_tmDisappear	= 0;
	m_dwRoleAttribute = 0;
	m_Info.nFlyOffset = 0;
	m_nWhichLeg = 0;
	m_Info.bAdjustRun = false;
	m_Info.ucSprite = 255 ;
	m_Info.dwSpeed = 100;
	m_setCmd.clear();
	m_dwDisappear = 0; 
	m_dwDisappearLast = 0;
	m_dwCommandIndex = 0;
}

//--------------------------------------------------------------
BOOL CRole::Create(UINT uLook, int nViewType)
{
	if(uLook%2 == 0)
		m_Info.nSex = 1;
	else
		m_Info.nSex = 2;
	if(uLook > 6)
		this->SetRace(RACE_NONE);
	else
		this->SetRace((uLook+1)/2);
	m_Info.usLook = uLook;
	m_nViewType = nViewType;

	this->Disappear(500);
				
	switch(nViewType)
	{
	case _ROLE_VIEW_ROLE:
		{
			if (m_pIRoleView)
				SAFE_DELETE(m_pIRoleView);
			C3DRole* pRole =(C3DRole* )C3DRole::CreateNewView();
			pRole->SetGame3DEffectEx(&m_objEffect);
			m_pIRoleView = pRole; 
			if (!m_pIRoleView)
				return false;
			m_pIRoleView->SetVariable(_VAR_LOOK, uLook);
		}
		return true;
	case _ROLE_VIEW_STATUARY:
		if (m_pIRoleView)
			SAFE_DELETE(m_pIRoleView);
		m_pIRoleView	=C3DStatuary::CreateNewView();
		if (!m_pIRoleView)
			return false;
		m_pIRoleView->SetVariable(_VAR_LOOK, uLook);
		return true;
	case _ROLE_VIEW_TARGET:
		if (m_pIRoleView)
			SAFE_DELETE(m_pIRoleView);
		m_pIRoleView = C3DTarget::CreateNewView();
		m_pIRoleView->SetVariable(_VAR_LOOK, uLook);
		return true;
	case _ROLE_VIEW_TASKNPC:
		if (m_pIRoleView)
			SAFE_DELETE(m_pIRoleView);
		m_pIRoleView = C3DTaskNpc::CreateNewView();
		m_pIRoleView->SetVariable(_VAR_LOOK, uLook);
		return true;
	case _ROLE_VIEW_DICENPC:
		if (m_pIRoleView)
			SAFE_DELETE(m_pIRoleView);
		m_pIRoleView = CDiceView::CreateNewView();
		m_pIRoleView->SetVariable(_VAR_LOOK, uLook);
		return true;
	case _ROLE_VIEW_SYNSTONE:
		if (m_pIRoleView)
			SAFE_DELETE(m_pIRoleView);
		m_pIRoleView = CSynStone::CreateNewView();
		m_pIRoleView->SetVariable(_VAR_LOOK, uLook);
		return true;
	case _ROLE_VIEW_BOOTH:
		if (m_pIRoleView)
			SAFE_DELETE(m_pIRoleView);
		m_pIRoleView = CBoothNpc::CreateNewView();
		m_pIRoleView->SetVariable(_VAR_LOOK, uLook);
		return true;
	case _ROLE_VIEW_MAPMAGICOBJ:
		if(m_pIRoleView)
			SAFE_DELETE(m_pIRoleView);
		m_pIRoleView = CMagicItem::CreateNewView();
		m_pIRoleView->SetVariable(_VAR_LOOK, uLook);
		return true;
	default:
		return false;
	}
	return true;
}


//--------------------------------------------------------------

BOOL CRole::Create(UINT uLook, int nViewType, OBJID id, CMyPos pos)
{
	m_Info.usLook = uLook;
	m_nViewType = nViewType;
	switch(nViewType)
	{
	case _ROLE_VIEW_TERRAIN:
		if(m_pIRoleView)
			SAFE_DELETE(m_pIRoleView);
		m_pIRoleView = CTerrainNpcView::CreateNewView(uLook, id, pos);
		break;
	}
	this->Disappear(500);
	return true;
}

//--------------------------------------------------------------
void CRole::Destroy(void)
{
	if (m_pIRoleView)
		SAFE_DELETE(m_pIRoleView);

	m_objEffect.Clear();
	

	this->ClrAniEffect(NULL);
	int nAmount = m_setCmd.size();
	for(int i = 0; i < nAmount; i ++)
	{
		delete m_setCmd[i];
	}
	m_setCmd.clear();
	this->Init();
}

//--------------------------------------------------------------
void    CRole::SetFace(USHORT usFace)	
{
	m_Info.usFace=usFace;
	if(m_pIRoleView)
		m_pIRoleView->SetVariable(_VAR_HEAD, usFace);
}
//--------------------------------------------------------------
void CRole::AllotRes()
{
	if(!m_pIRoleView)
		m_pIRoleView = C3DRole::CreateNewView();
	MYASSERT(m_pIRoleView);
	this->SetLook(m_Info.usLook);

	this->Transform(m_Info.nTransformLook);

	this->SetHair(m_Info.usHair);

	this->SetArmor(m_Info.idArmorType);
	this->SetRWeapon(m_Info.idRWeaponType);
	this->SetLWeapon(m_Info.idLWeaponType);
	this->SetMount(m_Info.idMountType);
	this->SetArmet(m_Info.idArmetType);

}

//--------------------------------------------------------------
void CRole::SetLook(USHORT usLook)
{
	m_Info.usLook	=usLook;

	if(m_pIRoleView)
		m_pIRoleView->SetVariable(_VAR_LOOK, usLook);
}

//--------------------------------------------------------------
void CRole::SetHair(USHORT usHair)
{
//	if ((usHair%100) == 0)
//		usHair = 0;

	m_Info.usHair	=usHair;
	if(m_pIRoleView)
		m_pIRoleView->SetVariable(_VAR_HAIR, usHair);
}

//--------------------------------------------------------------
void CRole::InitCommand(void)
{
	m_Info.cmdProc.iType	=_COMMAND_STANDBY;
	m_Info.cmdProc.iStatus	=_CMDSTATUS_BEGIN;
	m_Info.cmdProc.posTarget.x	=0;
	m_Info.cmdProc.posTarget.y	=0;
}

//--------------------------------------------------------------
DWORD CRole::SetCommand(CCommand* pCommand)
{
	if (!pCommand)
		return 0;
	m_dwCommandIndex++;
	pCommand->dwIndex = m_dwCommandIndex;
	/*
	// reset action...
	if (_COMMAND_STANDBY != pCommand->iType)
	{
		// emotion, standby and action can be interrupted at any time.
		if (_COMMAND_STANDBY == m_Info.cmdProc.iType
				|| _COMMAND_EMOTION == m_Info.cmdProc.iType)
			this->ResetActionData();


		// cmd accomplished can be interrupted at andy time
		if (_CMDSTATUS_ACCOMPLISH == m_Info.cmdProc.iStatus)
		{
			if (_ACTION_STANDBY == m_Info.iActType 
					|| _ACTION_ALERT == m_Info.iActType			
					|| _ACTION_REST1 == m_Info.iActType
					|| _ACTION_REST2 == m_Info.iActType
					|| _ACTION_REST3 == m_Info.iActType)
				this->ResetActionData();
		}

		// die command can interrupt any command
		if (_COMMAND_DIE == pCommand->iType)
			this->ResetActionData(); 
	}
	*/

	// set command now
	if(pCommand->iType == _COMMAND_INTONE || pCommand->iType == _COMMAND_EMOTION || pCommand->iType == _COMMAND_ACTION)
	{
		if(((pCommand->nData == _ACTION_BRUISE0) || (pCommand->nData == _ACTION_DODGE0)) && (this->m_Info.cmdProc.iType == _COMMAND_EMOTION) && 
			(m_Info.cmdProc.nData == _ACTION_INTONE || m_Info.cmdProc.nData == _ACTION_INTONE_DURATION))
			return m_dwCommandIndex;
	}
	memcpy(&(m_Info.cmdProc), pCommand, sizeof(CCommand));
	return m_dwCommandIndex;
}

//--------------------------------------------------------------
int	CRole::GetCommandType(void)
{
	if (_CMDSTATUS_ACCOMPLISH == this->GetCommandStatus())
	{
		if(m_Info.nFlyOffset == 0)
			return _COMMAND_STANDBY;
		else
			return _COMMAND_FLOAT;
	}

	return m_Info.cmdProc.iType;
}

//--------------------------------------------------------------
DWORD CRole::GetFrameInterval(int nActType)
{
	DWORD dwMyIndex, dwInterval;
	if(m_pIRoleView)
	{
		dwMyIndex = this->GetLook()*1000000 + m_pIRoleView->GetVariable(_VAR_WEAPON_ACTION_DATA)*1000 + nActType;
		dwInterval = g_obj3DRoleData.GetActionTimeInterval(dwMyIndex);
	}
	else
	{
		dwInterval = 33;
	}

//	if (this->IsAttacking())
//	{
//		if (this->TestStatus(USERSTATUS_ATKSPEED) 
//			|| this->TestStatus(USERSTATUS_XPFULL)
			/*|| this->TestStatus(USERSTATUS_TORNADO))*/

//			dwInterval = dwInterval*2/3;
//	}
	/*else*/ if (this->IsMoving())
	{
		if(this->GetActionType() == _ACTION_JUMP)
		{
			// 取得跳跃距离
			double dbDicAll = sqrt(
				(m_Info.posActionBegin.x- m_Info.posActionEnd.x) * 
				(m_Info.posActionBegin.x - m_Info.posActionEnd.x) +
				(m_Info.posActionBegin.y - m_Info.posActionEnd.y) * 
				(m_Info.posActionBegin.y - m_Info.posActionEnd.y)
				);

			dwInterval = __max(33, (DWORD) (dwInterval*dbDicAll/300+1));
		}
		if(m_dwSpeedRate == 0)
			m_dwSpeedRate = 100;
		if(IsRunning())
		{
			if(this->TestStatus(USERSTATUS_TEAMLEADER)&&
				(
					this->TestStatus(USERSTATUS_TEAM_HEALTH)||
					this->TestStatus(USERSTATUS_TEAM_ATTACK)||
					this->TestStatus(USERSTATUS_TEAM_DEFENCE)||
					this->TestStatus(USERSTATUS_TEAM_SPEED)||
					this->TestStatus(USERSTATUS_TEAM_EXP)||
					this->TestStatus(USERSTATUS_TEAM_SPIRIT)||
					this->TestStatus(USERSTATUS_TEAM_CLEAN)
				)
			  )
				dwInterval = dwInterval*100/80;
			else
				dwInterval = dwInterval*100/m_dwSpeedRate;
		}
	}
	if(	this->GetActionType() == _ACTION_RUNL ||
		this->GetActionType() == _ACTION_RUNR)
		dwInterval = dwInterval*100/m_Info.dwSpeed;
//	if(this->TestStatus(USERSTATUS_XPFULL) && this->GetCommandType() == _COMMAND_LOCKATK)
//	{
//		dwInterval = dwInterval*1/2;
//	}
	if(dwInterval < 5)
		dwInterval = 5;
	return dwInterval; 
}

//--------------------------------------------------------------
void CRole::SetActionData(void)
{
	/*
	if (m_Info.posRush.x != 0 || m_Info.posRush.y != 0)	// speed up!
		m_Info.timeFrameInterval	/=2;
	*/
	CMyPos posRole;
	g_objGameMap.World2Cell(m_Info.posWorld.x, m_Info.posWorld.y, posRole.x, posRole.y);

	BOOL bPlaySound = g_objGameMap.IsPosVisible(posRole, 4);

	m_Info.iActFrameIndex	=0;
	BOOL bAccelerate = false;
/*	if(this->TestStatus(USERSTATUS_FLY))
	{
		switch(m_Info.iActType)
		{
		case _ACTION_JUMP:
			m_Info.iActType = _ACTION_FLY_MOVE;
			break;
		case _ACTION_STANDBY:
			m_Info.iActType = _ACTION_FLY_STANDBY;
			break;
		case _ACTION_WALKL:
		case _ACTION_WALKR:
		case _ACTION_WALKR_I:
		case _ACTION_WALKL_I:
		case _ACTION_RUNL:
		case _ACTION_RUNR:
			bAccelerate = true;
			m_Info.iActType = _ACTION_FLY_MOVE;
			break;

		case _ACTION_ATTACK0:
		case _ACTION_ATTACK1:
		case _ACTION_ATTACK2:
			m_Info.iActType = _ACTION_FLY_ATTACK;
			break;
		case _ACTION_FLY_STANDBY:
		case _ACTION_FLY_ALERT:
		case _ACTION_FLY_MOVE:
		case _ACTION_FLY_ATTACK:
		case _ACTION_FLY_DOWN:
		case _ACTION_FLY_UP:
		case _ACTION_FLY_DIE:
		case _ACTION_FLY_WOUND:
		case _ACTION_BODY0:
			break;
		case _ACTION_BRUISE0:
			m_Info.iActType = _ACTION_FLY_WOUND;
			break;
		default:
			m_Info.iActType = _ACTION_FLY_STANDBY;
			break;
		}
	}

⌨️ 快捷键说明

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