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

📄 msginteract.cpp

📁 网络游戏魔域的服务端与客户端完整源代码 包括详细的说明文档与开发日志
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// MsgSteal.cpp: implementation of the CMsgInteract class.
//
//////////////////////////////////////////////////////////////////////
#include "AllMsg.h"
#include "3dGameMap.h"
#include "GamePlayerSet.h"
#include "Hero.h"
#include "GameDataSet.h"
#include "GameMsg.h"
#include "MagicData.h"
#include "../NdSound/NDSound.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMsgInteract::CMsgInteract()
{
	Init();
	m_pInfo	=(MSG_Info *)m_bufMsg;
}

CMsgInteract::~CMsgInteract()
{

}

//////////////////////////////////////////////////////////////////////
BOOL CMsgInteract::Create(USHORT usType, OBJID idSender, OBJID idTarget, USHORT usPosX, USHORT usPosY, USHORT usData0, USHORT usData1, OBJID idCopy)
{
	if (idSender == ID_NONE)
		return false;

	m_pInfo->unMsgSize		=sizeof(MSG_Info);
	m_pInfo->unMsgType		=_MSG_INTERACT;
	m_pInfo->dwTimeStamp	=::TimeGet();

	m_pInfo->usData0		=usData0;
	m_pInfo->usData1		=(usData1+0x100*(m_pInfo->dwTimeStamp%0x100))^0x3721;
	m_pInfo->idSender		=idSender;
	m_pInfo->idTarget		=idTarget;
	m_pInfo->unPosX			=usPosX;
	m_pInfo->unPosY			=usPosY;
	m_pInfo->unType			=usType;

	switch(usData0)
	{
	case 1000:
	case 1001:
	case 1002:
	case 1030:
	case 1125:
	case 1150:
	case 1165:
	case 1160:
		{
			CPlayer* pPlayer = g_objPlayerSet.GetPlayer(idCopy, true);
			if (pPlayer->IsMouseFocus())
				m_pInfo->usData1 ^= 0x6279;
		}
		break;
	}

//	if (_MSG_INTERACT == m_pInfo->unMsgType)
//		g_objGameMsg.AddMsg(_TXTATR_NORMAL, "INTERACT msg create.");

	return true;
}
//////////////////////////////////////////////////////////////////////
BOOL CMsgInteract::Create(USHORT usType, OBJID idSender, OBJID idTarget, OBJID idBullet)
{
	if (idSender == ID_NONE || idTarget == ID_NONE)
		return false;

	m_pInfo->unMsgSize		=sizeof(MSG_Info);
	m_pInfo->unMsgType		=_MSG_INTERACT;
	m_pInfo->dwTimeStamp	=::TimeGet();

	m_pInfo->idSender		=idSender;
	m_pInfo->idTarget		=idTarget;
	m_pInfo->unType			=usType;
	m_pInfo->idBullet		=idBullet;
	return true;
}
//////////////////////////////////////////////////////////////////////

BOOL CMsgInteract::Create(USHORT usType, OBJID idSender, OBJID idTarget, USHORT usPosX, USHORT usPosY, DWORD dwData)
{
	if (idSender == ID_NONE || idTarget == ID_NONE)
		return false;

	m_pInfo->unMsgSize		=sizeof(MSG_Info);
	m_pInfo->unMsgType		=_MSG_INTERACT;
	m_pInfo->dwTimeStamp	=::TimeGet();

	m_pInfo->idSender		=idSender;
	m_pInfo->idTarget		=idTarget;
	m_pInfo->unPosX			=usPosX;
	m_pInfo->unPosY			=usPosY;
	m_pInfo->unType			=usType;
	m_pInfo->dwData			=dwData;
	return true;
}

//////////////////////////////////////////////////////////////////////
BOOL CMsgInteract::Create(char* pbufMsg, DWORD dwMsgSize)
{
	if (!CNetMsg::Create(pbufMsg, dwMsgSize))
		return false;

	if(_MSG_INTERACT != this->GetType())
		return false;

	return true;
}

//////////////////////////////////////////////////////////////////////
void CMsgInteract::Process(void* pInfo)
{
#ifdef _MSGDEBUG
	::LogSave("Process MsgSteal, idStealer:%u, idTarget:%u, CurPos:(%d,%d)", 
						m_pInfo->idSender, 
						m_pInfo->idTarget, 
						m_pInfo->unPosX, 
						m_pInfo->unPosY);
#endif

	// get sender
	BOOL bIncludeHero = true;
	CPlayer* pSender = g_objPlayerSet.GetPlayer(m_pInfo->idSender, bIncludeHero);
	if (!pSender)
	{
		CMyPos posHero = g_objHero.GetAlignPos();
		//if (abs(posHero.x-(int)m_pInfo->unPosX) <= _BLOCK_SIZE
		//	&& abs(posHero.y-(int)m_pInfo->unPosY) <= _BLOCK_SIZE)
		{
			CMsgAction msg;
			if (msg.Create(g_objHero.GetID(), posHero.x, posHero.y, g_objHero.GetDir(), actionQueryPlayer, m_pInfo->idSender))
				msg.Send();
		}

	}

	CPlayer* pTarget	=g_objPlayerSet.GetPlayer(m_pInfo->idTarget, bIncludeHero);

	// ....
	switch(m_pInfo->unType)
	{
	case INTERACT_MAGICATTACK:
		{
			MagicTypeInfo infoMagicType; 
			if(!CMagic::s_objMagicData.GetMagicTypeInfo(m_pInfo->usData0, m_pInfo->usData1, infoMagicType))
				return;
			if(m_pInfo->idSender == g_objHero.GetID())
			{
				g_objHero.FlashLastAttackTime();							
				g_objHero.StartMagicBusy(infoMagicType.dwIntoneDuration + infoMagicType.dwMagicBreak + 3000);
				return;
			}
			//if(infoMagicType.dwSenderAction == _ACTION_INTONE_DURATION)
			{
				CCommand cmd;
				cmd.iType		=_COMMAND_EMOTION;
				cmd.iStatus		=_CMDSTATUS_BEGIN;
				cmd.nData		=_ACTION_STANDBY;
				if(pSender && pTarget)
				{
					CMyPos posSender, posTarget;
					pSender->GetPos(posSender);
					pSender->FlashLastAttackTime();							
					pTarget->FlashLastAttackTime();							
					pTarget->GetPos(posTarget);
					cmd.nDir = (g_objGameMap.GetDirection(posSender.x, posSender.y, posTarget.x, posTarget.y)+1)%7;
				}
				if(pSender && !pTarget)
				{
					CMyPos posSender, posTarget;
					pSender->GetPos(posSender);
					pSender->FlashLastAttackTime();							
					posTarget.x = m_pInfo->unPosX;
					posTarget.y = m_pInfo->unPosY;
					
					cmd.nDir = (g_objGameMap.GetDirection(posSender.x, posSender.y, posTarget.x, posTarget.y)+1)%7;
				}
				pSender->SetCommand(&cmd);
				pSender->m_objEffect.Add(infoMagicType.szIntoneEffect,false,0,pSender->GetLook());
			}
		}
		break;

	case INTERACT_COURT:
		{
			if (g_objPlayerSet.GetPlayer(m_pInfo->idSender))
				::PostCmd(CMD_BECOURT, m_pInfo->idSender);
		}
		break;

	case INTERACT_BUMP:
		{
			if(pSender && pTarget )
			{
				if ( pTarget->GetID() == g_objHero.GetID())
					g_objHero.SetIDWhoAttackMe(pSender->GetID());
				else
					pTarget->SetIDWhoAttackMe(pSender->GetID());
			}
			if(pSender && pTarget && pSender->GetID() == g_objHero.GetID())
				g_objHero.SetIDMyTarget(pTarget->GetID());
			int nForward	= m_pInfo->dwData/0x10000000;
			int	nDir		= (m_pInfo->dwData/0x01000000)%0x0f;
			CMyPos posTarget = { m_pInfo->unPosX, m_pInfo->unPosY };

			if (pSender)
			{
				// attacker
				if (pSender->GetID() != g_objHero.GetID())
				{
					pSender->ResetStepDir();

					CMyPos posSender;
					pSender->GetPos(posSender);

					if (nDir >= _MAX_DIRECTION)
					{
						pSender->SetPos(posTarget.x, posTarget.y);
					}
					else
					{
						DWORD dwType = 1;
						if (nForward > 0)
							dwType = 0;

						pSender->SetActionCmd(_ACTION_BUMP, nDir, dwType);

						if (posSender.x != posTarget.x-_DELTA_X[nDir]
								|| posSender.y != posTarget.y-_DELTA_Y[nDir])
						{
							pSender->SetPos(posTarget.x-_DELTA_X[nDir], posTarget.y-_DELTA_Y[nDir]);
						}
					}
				}
				else
				{			
					g_objHero.SetAlignPos(posTarget.x, posTarget.y);
				}
			}

			if (pTarget)
			{
				// target
				DWORD dwDamage	= m_pInfo->dwData&0x00ffffff;
				DWORD dwColor	= _COLOR_YELLOW;
				if (pTarget->GetID() == g_objHero.GetID())
				{	// target is hero
					dwColor = _COLOR_RED;

					if (dwDamage > 0)	// suc atk
					{
						if (nDir < _MAX_DIRECTION) 
						{
							CMyPos posHero;
							g_objHero.GetPos(posHero);

							if (posHero.x == posTarget.y 
									|| posHero.y == posTarget.y) 
							{	// yes so i must pop off as others
								if (!g_objHero.IsMoving())
									g_objHero.ResetActionData();

								g_objHero.SetActionCmd(_ACTION_POPOFF, nDir, 1);

								g_objHero.SetAlignPos(posHero.x+_DELTA_X[nDir], posHero.y+_DELTA_Y[nDir]);
							}
							else
							{	// no, do nothing but inform others my current postion
								CMsgAction msg;
								IF_SUC (msg.Create(g_objHero.GetID(), 0, 0, g_objHero.GetDir(), actionSynchro, posHero.x, posHero.y))
									msg.Send();
							}
						}
						else	// no bump movment
						{
							if (!g_objHero.IsMoving())
							{
								g_objHero.ResetActionData();
								g_objHero.SetActionCmd(_ACTION_BRUISE0, g_objHero.GetDir(pSender));
							}
						}
					}
					g_objHero.AddZoomNum(dwDamage, dwColor, 300, 30);
				}
				else
				{
					if (dwDamage > 0)	// suc atk
					{
						pTarget->ResetStepDir();

						if (nDir < _MAX_DIRECTION)
							pTarget->SetActionCmd(_ACTION_POPOFF, nDir, 1);
						else
							pTarget->SetActionCmd(_ACTION_BRUISE0, pTarget->GetDir(pSender));

						if (pTarget->IsNpc())
						{
							int nLife = (int)pTarget->GetData(CPlayer::_PLAYER_LIFE)-(int)dwDamage;
							pTarget->SetData(CPlayer::_PLAYER_LIFE, __max(0, nLife));
							//pTarget->SetLife(__max(0, nLife));
						}
					}
					pTarget->AddZoomNum(dwDamage, dwColor, 300, 30);
				}
			}
		}
		break;
	case INTERACT_MINE:
		{
			if(pSender && pTarget)
			{
				int nDr	= g_objHero.GetDir(pTarget);
				pSender->SetActionCmd(_ACTION_MINE, nDr);
				pSender->FlashLastAttackTime();
			}
			else if(pSender)
			{
				pSender->SetActionCmd(_ACTION_MINE);
				pSender->FlashLastAttackTime();
			}
		}
		break;
	case INTERACT_ATTACK:
		{
			if(pSender && pTarget )
			{
				if ( pTarget->GetID() == g_objHero.GetID())
					g_objHero.SetIDWhoAttackMe(pSender->GetID());
				else
					pTarget->SetIDWhoAttackMe(pSender->GetID());
			}
			OBJID idMyAttackTarget = 0;
			if(pSender && pTarget && (pSender->GetID() == g_objHero.GetID() || pTarget->IsMyPet()))
			{
				idMyAttackTarget = g_objHero.GetIDMyTarget();	
				if(pSender->GetID() == g_objHero.GetID() && !pTarget->IsMyPet())
				   g_objHero.SetIDMyTarget(pTarget->GetID());
			}
			if (pSender && pTarget && pSender->IsMyPet() && !pTarget->IsMyPet()) 
			{
				CPet* pPet = g_objHero.GetPetByID(pSender->GetID());
				if (pPet) 
					pPet->SetAtkTarget(pTarget->GetID());
			}
			if (pSender)
			{
				pSender->FlashLastAttackTime();							
				// attacker show
				if (g_objHero.GetID() == pSender->GetID())
				{
					
					if (g_objHero.m_bFirstAtk)
					{
						g_objHero.m_bFirstAtk = false;
						g_objHero.SetAttackTimes(0);
						if(idMyAttackTarget && g_objHero.GetCallPetAmount() && g_objHero.GetProfession() == PROFESSIONAL_WARRIOR)//群体攻击
						{
/*
							CMyPos posTarget ,posHero,posTemp[3];
							int nDirHero2Target;
							nDirHero2Target = g_objHero.GetDir(pTarget);
							pTarget->GetPos(posTarget);
							g_objHero.GetPos(posHero);
							int nDistance = g_objGameMap.GetDistance(posTarget.x,posTarget.y,posHero.x,posHero.y);
							posTemp[0].x = posTarget.x + _DELTA_X[nDirHero2Target+4]*nDistance;
							posTemp[0].y = posTarget.y + _DELTA_Y[nDirHero2Target+4]*nDistance;
							posTemp[1].x = posTarget.x + _DELTA_X[(nDirHero2Target+2)%8]*nDistance;
							posTemp[1].y = posTarget.y + _DELTA_Y[(nDirHero2Target+2)%8]*nDistance;	
							posTemp[2].x = posTarget.x + _DELTA_X[(nDirHero2Target+6)%8]*nDistance;
							posTemp[2].y = posTarget.y + _DELTA_Y[(nDirHero2Target+6)%8]*nDistance;
*/
							for(int i = 0;i < g_objHero.GetCallPetAmount();i++)
							{
							    CPet* pPet = g_objHero.GetPetByIndex(i);
								if(pPet&& !pPet->IsGhost())
								{
									pPet->LockAttack(pTarget);
//									OBJID id = pPet->GetID();
								}
							}
						}					
					}
					else
					{
						int nAction = 0;
						if(idMyAttackTarget && g_objHero.GetCallPetAmount() && g_objHero.GetProfession() == PROFESSIONAL_WARRIOR)//群体攻击
						{					
							int nAttackTime = pSender->GetAttackTimes();
							nAction = _ACTION_ATTACK0+nAttackTime;
							if(!pSender->IsMoving() && !pSender->IsAttacking())
							{	
								g_objHero.SetAttackTimes(nAttackTime >= 2?0:nAttackTime+1);	
#ifdef _DEBUG
								char sztemp[64];

⌨️ 快捷键说明

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