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

📄 actor.cpp

📁 传奇2客户端源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
{
	WORD	wTargetX, wTargetY;
	INT		nTargetID;
	CMagic* pxMagic;

	m_wPosX      = lpPacketMsg->stDefMsg.wParam;
	m_wPosY		 = lpPacketMsg->stDefMsg.wTag;
	m_bCurrDir	 = lpPacketMsg->stDefMsg.wSeries;

	MESSAGEBODYW stMsgBodyW;
	fnDecode6BitBuf(lpPacketMsg->szEncodeData, (char*)&stMsgBodyW, sizeof(MESSAGEBODYW));
	wTargetX = stMsgBodyW.wParam1;
	wTargetY = stMsgBodyW.wParam2;
	nTargetID = MAKELONG(stMsgBodyW.wTag1, stMsgBodyW.wTag2);

	switch ( m_stFeature.bDress )
	{
	case 33:				// 街档尝秦榜.
		pxMagic = new CMagic;
		pxMagic->CreateMagic(_MONMAGIC_DUALAXE, m_wPosX, m_wPosY, wTargetX, wTargetY, this, nTargetID);
		g_xGameProc.m_xMagicList.AddNode(pxMagic);
		SetMotionFrame(_MT_MON_ATTACK_A, m_bCurrDir);
		break;
	case 46:				// 促农.
		pxMagic = new CMagic;
		pxMagic->CreateMagic(_MONMAGIC_CHIM, m_wPosX, m_wPosY, wTargetX, wTargetY, this, nTargetID);
		g_xGameProc.m_xMagicList.AddNode(pxMagic);
		SetMotionFrame(_MT_MON_ATTACK_A, m_bCurrDir);
		break;
	case 82:				// 付泵荤.
		pxMagic = new CMagic;
		pxMagic->CreateMagic(_MONMAGIC_MAARROW, m_wPosX, m_wPosY, wTargetX, wTargetY, this, nTargetID);
		g_xGameProc.m_xMagicList.AddNode(pxMagic);
		SetMotionFrame(_MT_MON_ATTACK_A, m_bCurrDir);
		break;
	}
}


VOID CActor::OnHit(LPPACKETMSG lpPacketMsg)
{
	BYTE bDir;
	bDir	= lpPacketMsg->stDefMsg.wSeries;
	m_wPosX = lpPacketMsg->stDefMsg.wParam;
	m_wPosY = lpPacketMsg->stDefMsg.wTag;
	SetMotionFrame(_MT_MON_ATTACK_A, bDir);

	// 阁胶磐老锭.
	if ( m_stFeature.bGender == _GENDER_MON )
	{
		CMagic* pxMagic;
		switch ( m_stFeature.bDress )
		{
		case 9:		// 沸.
			pxMagic = new CMagic;
			pxMagic->CreateMagic(_MONMAGIC_EXPLODE, m_wPosX, m_wPosY, m_wPosX, m_wPosY, this);
			g_xGameProc.m_xMagicList.AddNode(pxMagic);
			break;
		case 5:		// 官捻啊福唱.
			pxMagic = new CMagic;
			pxMagic->CreateMagic(_MONMAGIC_BLACK1, m_wPosX, m_wPosY, m_wPosX, m_wPosY, this);
			g_xGameProc.m_xMagicList.AddNode(pxMagic);
			break;
		case 19:		// 饭叼啊福唱.
			pxMagic = new CMagic;
			pxMagic->CreateMagic(_MONMAGIC_RED1, m_wPosX, m_wPosY, m_wPosX, m_wPosY, this);
			g_xGameProc.m_xMagicList.AddNode(pxMagic);
			break;
		case 45:		// 快搁蓖空. 
			pxMagic = new CMagic;
			pxMagic->CreateMagic(_MONMAGIC_COWGHOST, m_wPosX, m_wPosY, m_wPosX, m_wPosY, this);
			g_xGameProc.m_xMagicList.AddNode(pxMagic);
			break;
		case 90:		// 脚荐.
			pxMagic = new CMagic;
			pxMagic->CreateMagic(_MONMAGIC_SINSU, m_wPosX, m_wPosY, m_wPosX, m_wPosY, this);
			g_xGameProc.m_xMagicList.AddNode(pxMagic);
			break;
		case 43:		// 拳堪快搁蓖.
			pxMagic = new CMagic;
			pxMagic->CreateMagic(_MONMAGIC_COWFLAME, m_wPosX, m_wPosY, m_wPosX, m_wPosY, this);
			g_xGameProc.m_xMagicList.AddNode(pxMagic);
			break;
		case 85:		// 林付空.
			pxMagic = new CMagic;
			pxMagic->CreateMagic(_MONMAGIC_JUMAWANG, m_wPosX, m_wPosY, m_wPosX, m_wPosY, this);
			g_xGameProc.m_xMagicList.AddNode(pxMagic);
			break;
		case 67:		// 盟锋脚.
			pxMagic = new CMagic;
			pxMagic->CreateMagic(_MONMAGIC_BIGGINE_ATT, m_wPosX, m_wPosY, m_wPosX, m_wPosY, this);
			g_xGameProc.m_xMagicList.AddNode(pxMagic);
			break;	
		case 75:		// 禁扁唱规.
			pxMagic = new CMagic;
			pxMagic->CreateMagic(_MONMAGIC_SSEGI, m_wPosX, m_wPosY, m_wPosX, m_wPosY, this);
			g_xGameProc.m_xMagicList.AddNode(pxMagic);
			break;	
		case 94:		// 荤绢.
			pxMagic = new CMagic;
			pxMagic->CreateMagic(_MONMAGIC_SANDFISH, m_wPosX, m_wPosY, m_wPosX, m_wPosY, this);
			g_xGameProc.m_xMagicList.AddNode(pxMagic);
			break;	
		case 98:		// 惑鞭鲍拱.
			m_dwCurrEffectFrame = 50;
			m_dwFstEffectFrame  = 50;
			m_dwEndEffectFrame  = 60;
			m_bEffectFrame		= 0;
			m_bEffectFrameCnt	= _DEFAULT_SPELLFRAME;
			LoadEffect(&g_xGameProc.m_xImage, _MONMAGIC_NUMAGUMGI, bDir);
			m_bUseSwordEffect = TRUE;
			break;	
		default :
			break;
		}
	}
}

VOID CActor::StruckMsgReassign()
{
	INT			nCnt;
	SHORT		shLeftMsgCnt;
	LPPACKETMSG	lpPacketMsg;

	lpPacketMsg  = NULL;
	shLeftMsgCnt = m_xPacketQueue.GetCount();

	if ( shLeftMsgCnt > 1 )
	{
		for ( nCnt = 0; nCnt < shLeftMsgCnt; nCnt++ )
		{
			lpPacketMsg = (LPPACKETMSG)m_xPacketQueue.PopQ();
			if ( lpPacketMsg )
			{
				if ( lpPacketMsg->stDefMsg.wIdent == SM_STRUCK )
				{
					SAFE_DELETE(lpPacketMsg);
				}
				else
				{
					m_xPacketQueue.PushQ((BYTE*)lpPacketMsg);
				}
			}
		}
	}
}


/******************************************************************************************************************

	窃荐疙 : CActor::UpdatePacketState()

	累己磊 : 
	累己老 : 

	格利   : 
	免仿   : BOOL 

	[老磊][荐沥磊] : 荐沥郴侩

*******************************************************************************************************************/
BOOL CActor::UpdatePacketState()
{
	LPPACKETMSG	lpPacketMsg = NULL;

	if ( m_bCurrMtn == _MT_MON_STAND )
	{
		SHORT shLeftMsgCnt = m_xPacketQueue.GetCount();

		if ( shLeftMsgCnt > 0 )
		{
			lpPacketMsg = (LPPACKETMSG)m_xPacketQueue.PopQ();

			if ( shLeftMsgCnt >= 3 )		m_bMsgHurryCheck = TRUE;
			else							m_bMsgHurryCheck = FALSE;

			if ( lpPacketMsg )
			{
				switch ( lpPacketMsg->stDefMsg.wIdent )
				{
					case SM_NOWDEATH:
					case SM_DEATH:				{	OnDeath(lpPacketMsg);				break;	}
					case SM_WALK:				{	OnWalk(lpPacketMsg);				break;	}
					case SM_TURN:				{	OnTurn(lpPacketMsg);				break;	}
					case SM_DIGUP:				{	OnDigup(lpPacketMsg);				break;	}
					case SM_DIGDOWN:			{	OnDigDown(lpPacketMsg);				break;	}
					case SM_FEATURECHANGED:		{	OnFeatureChanged(lpPacketMsg);		break;	}
					case SM_OPENHEALTH:			{	OnOpenHealth(lpPacketMsg);			break;	}
					case SM_CLOSEHEALTH:		{	OnCloseHealth(lpPacketMsg);			break;	}
					case SM_CHANGELIGHT:		{	OnChangeLight(lpPacketMsg);			break;	}
					case SM_CHANGENAMECOLOR:	{	OnChangeNameClr(lpPacketMsg);		break;	}
					case SM_USERNAME:			{	OnUserName(lpPacketMsg);			break;	}
					case SM_HEALTHSPELLCHANGED:	{	OnHealthSpellChanged(lpPacketMsg);	break;	}
					case SM_BACKSTEP:			{	OnBackStep(lpPacketMsg);			break;	}
					case SM_STRUCK:				{	OnStruck(lpPacketMsg);				break;	}
					case SM_HIT:				{	OnHit(lpPacketMsg);					break;	}
					case SM_FLYAXE:				{	OnFlyAxe(lpPacketMsg);				break;	}
					case SM_LIGHTING:			{	OnLighting(lpPacketMsg);			break;	}
					case SM_SKELETON:
						OnWalk(lpPacketMsg);
						break;
					default:
					{										
						break;	
					}
				}
			}
			SAFE_DELETE(lpPacketMsg);
			return TRUE;
		}
	}
	return FALSE;
}



/******************************************************************************************************************

	窃荐疙 : CActor::LoadEffect()

	累己磊 : 
	累己老 : 

	格利   : 
	涝仿   : CImageHandler* pxImgHandler
	         WORD wEffectNum
	         BYTE bDir
	免仿   : BOOL 

	[老磊][荐沥磊] : 荐沥郴侩

*******************************************************************************************************************/
BOOL CActor::LoadEffect(CImageHandler* pxImgHandler, WORD wEffectNum, BYTE bDir)
{
	WORD wFileType;
	LPEFFECTSPRINFO pstEffect = g_xSpriteInfo.GetEffectInfo(wEffectNum);

	if ( pstEffect )
	{
		m_bEffectImgIdx = pstEffect->wImgIdx;		

		m_dwFstEffectFrame = pstEffect->dwFstFrm;
		m_dwEndEffectFrame = pstEffect->dwEndFrm;

		if ( bDir )
		{
			m_dwFstEffectFrame = m_dwFstEffectFrame + bDir*10;
			m_dwEndEffectFrame = m_dwEndEffectFrame + bDir*10;
		}
		m_dwCurrEffectFrame = m_dwFstEffectFrame;
		m_bEffectFrame = 0;

		m_bLightRadius[0] = pstEffect->bLightRadius[0];
		m_bLightRadius[1] = pstEffect->bLightRadius[1];

		m_bLightColor[0][0]	= pstEffect->bLightColor[0][0];
		m_bLightColor[0][1]	= pstEffect->bLightColor[0][1];
		m_bLightColor[0][2]	= pstEffect->bLightColor[0][2];
		
		m_bLightColor[1][0]	= pstEffect->bLightColor[1][0];
		m_bLightColor[1][1]	= pstEffect->bLightColor[1][1];
		m_bLightColor[1][2]	= pstEffect->bLightColor[1][2];

		for ( INT nCnt = m_dwFstEffectFrame; nCnt < m_dwEndEffectFrame; nCnt++ )
		{
			if ( m_bEffectImgIdx == _IMAGE_MAGIC )
			{
				wFileType = _TEXTR_FILE_MAGIC;
			}
			else if ( m_bEffectImgIdx == _IMAGE_MONMAGIC )
			{
				wFileType = _TEXTR_FILE_MONMAGIC;
			}

			pxImgHandler->AddTextr(wFileType, m_bEffectImgIdx, nCnt);
		}
		return TRUE;

	}
	return FALSE;
}



/******************************************************************************************************************

	窃荐疙 : CActor::DrawEffect()

	累己磊 : 
	累己老 : 

	格利   : 
	免仿   : BOOL 

	[老磊][荐沥磊] : 荐沥郴侩

*******************************************************************************************************************/
BOOL CActor::DrawEffect()
{
	if ( g_xMainWnd.Get3DDevice() )
	{
		if( SUCCEEDED(g_xMainWnd.Get3DDevice()->BeginScene()) )
		{
			WORD	  wFileType;
			D3DVECTOR vTrans;
			D3DMATRIX matTrans;
			D3DMATRIX matScale;
			D3DMATRIX matRot;
			D3DMATRIX matWorld;
			D3DMATRIX matWorldOriginal;

			g_xMainWnd.Get3DDevice()->GetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);

			D3DMATERIAL7 mtrl;
			CWHWilImageData* pxWilImg;

			if ( m_bUseEffect || m_bUseSwordEffect )
			{
				BOOL bIndexSetted = FALSE;
				if ( m_bUseEffect )
				{
					pxWilImg = &g_xGameProc.m_xImage.m_xImageList[m_bEffectImgIdx];
					bIndexSetted = pxWilImg->NewSetIndex(m_dwCurrEffectFrame);
				}
				else
				{
					pxWilImg = &g_xGameProc.m_xImage.m_xImageList[m_bEffectImgIdx];
					m_dwCurrEffectFrame = m_dwFstEffectFrame + m_dwCurrFrame - m_dwFstFrame;
					bIndexSetted = pxWilImg->NewSetIndex(m_dwCurrEffectFrame);
				}

				if ( bIndexSetted )
				{
 					vTrans.x = (FLOAT)m_shScrnPosX+(FLOAT)pxWilImg->m_lpstNewCurrWilImageInfo->shWidth/2+pxWilImg->m_lpstNewCurrWilImageInfo->shPX-400; 
					vTrans.y = (FLOAT)-m_shScrnPosY-(FLOAT)pxWilImg->m_lpstNewCurrWilImageInfo->shHeight/2-pxWilImg->m_lpstNewCurrWilImageInfo->shPY+300; 
					vTrans.z = 0;
					D3DUtil_SetTranslateMatrix(matTrans, vTrans);
					D3DUtil_SetScaleMatrix(matScale, (FLOAT)pxWilImg->m_lpstNewCurrWilImageInfo->shWidth, (FLOAT)pxWilImg->m_lpstNewCurrWilImageInfo->shHeight, 0.0f);
					D3DMath_MatrixMultiply(matWorld, matScale, matTrans);
					g_xMainWnd.Get3DDevice()->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorld);

					if ( m_bEffectImgIdx == _IMAGE_MAGIC )
					{
						wFileType = _TEXTR_FILE_MAGIC;
					}
					else if ( m_bEffectImgIdx == _IMAGE_MONMAGIC )
					{
						wFileType = _TEXTR_FILE_MONMAGIC;
					}
					LPDIRECTDRAWSURFACE7 lpddsTextr = g_xGameProc.m_xImage.GetTextrImg(wFileType, m_bEffectImgIdx, m_dwCurrEffectFrame);
					g_xMainWnd.Get3DDevice()->SetTexture(0, lpddsTextr);
//					g_xMainWnd.Get3DDevice()->SetTexture(0, D3DWILTextr_GetSurface(pxWilImg->m_szWilFileName, m_dwCurrEffectFrame));

					D3DUtil_InitMaterial(mtrl, 
										 (FLOAT)255/255.0f,
										 (FLOAT)255/255.0f, 
										 (FLOAT)255/255.0f);
					mtrl.diffuse.a = 0/255.0f;
					g_xMainWnd.Get3DDevice()->SetMaterial(&mtrl);

					SetBlendRenderState(g_xMainWnd.Get3DDevice(), _BLEND_LIGHTINV, mtrl);
					g_xMainWnd.Get3DDevice()->DrawPrimitive(D3DPT_TRIANGLESTRIP, D3DFVF_VERTEX, m_avBoard, 4, NULL);

					// 盔惑汗蓖.
					ZeroMemory(&mtrl, sizeof(mtrl));
					mtrl.diffuse.r = mtrl.diffuse.g = mtrl.diffuse.b = 0.1f;
					mtrl.ambient.r = mtrl.ambient.g = mtrl.ambient.b = 1.0f;
					g_xMainWnd.Get3DDevice()->SetMaterial(&mtrl);

					ResetBlendenderState(g_xMainWnd.Get3DDevice());
					g_xMainWnd.Get3DDevice()->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
				}


				if ( m_bUseEffect )
				{
					if ( m_bEffectFrame < m_bEffectFrameCnt / 2 )
					{
						m_bLightRadius[0] = m_bEffectFrame;
						m_bLightRadius[1] = m_bEffectFrame+1;
					}
					else
					{
						m_bLightRadius[0] = m_bEffectFrameCnt - m_bEffectFrame -1;
						m_bLightRadius[1] = m_bEffectFrameCnt - m_bEffectFrame;
					}
					
					g_xGameProc.m_xLightFog.SetLightRadiusWithRing(
													  m_shScrnPosX + _CELL_WIDTH/2,
							  						  m_shScrnPosY + _CELL_HEIGHT/2, 
													  m_bLightRadius[0], m_bLightColor[0][0], m_bLightColor[0][1], m_bLightColor[0][2], 
													  m_bLightRadius[1], m_bLightColor[1][0], m_bLightColor[1][1], m_bLightColor[1][2]);
				}
				else if ( m_bUseSwordEffect )
				{
					if ( m_dwEndEffectFrame - m_dwFstEffectFrame > 8 )
					{
						m_bLightRadius[0] = (m_dwCurrEffectFrame - m_dwFstEffectFrame)/2 + 2;
						m_bLightRadius[1] = (m_dwCurrEffectFrame - m_dwFstEffectFrame)/2 + 3;
					}
					else
					{
						m_bLightRadius[0] = m_dwCurrEffectFrame - m_dwFstEffectFrame + 2;
						m_bLightRadius[1] = m_dwCurrEffectFrame - m_dwFstEffectFrame + 3;
					}
					g_xGameProc.m_xLightFog.SetLightRadiusWithRing(
													  m_shScrnPosX + _CELL_WIDTH/2,
							  						  m_shScrnPosY + _CELL_HEIGHT/2, 
													  m_bLightRadius[0], m_bLightColor[0][0], m_bLightColor[0][1], m_bLightColor[0][2], 
													  m_bLightRadius[1], m_bLightColor[1][0], m_bLightColor[1][1], m_bLightColor[1][2]);
				}

			}

			g_xMainWnd.Get3DDevice()->EndScene();

			return S_OK;
		}
	}
	return E_FAIL;
}



/******************************************************************************************************************

	窃荐疙 : CActor::UpdateMotionState()

	累己磊 : 
	累己老 : 

⌨️ 快捷键说明

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