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

📄 msgtrade.cpp

📁 网络游戏魔域的服务端与客户端完整源代码 包括详细的说明文档与开发日志
💻 CPP
字号:
// MsgTrade.cpp: implementation of the CMsgTrade class.
//
//////////////////////////////////////////////////////////////////////

#include <windows.h>
#include "AllMsg.h"
#include "User.h"
#include "SquareDeal.h"
#include "MapGroup.h"

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

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

CMsgTrade::~CMsgTrade()
{

}

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

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

	return true;
}

//-----------------------------------------------------
BOOL CMsgTrade::Create(unsigned short usAction, OBJID id)
{
	// reset
	this->Init();
	
	// fill
	m_unMsgType		= _MSG_TRADE;
	m_unMsgSize		= sizeof(MSG_Info);
	
	m_pInfo->usAction	= usAction;
	m_pInfo->id			= id;
	return true;
}

//-----------------------------------------------------
void CMsgTrade::Process(CGameSocket* pSocket)
{
#ifdef _MYDEBUG
	::LogSave("Process CMsgTrade, id:%u, action:%u", 
		m_pInfo->id,
		m_pInfo->usAction);
#endif
//	DEBUG_PROCESSMSG("TRADE",m_pInfo->id,m_pInfo->usAction,"",m_pInfo->nData,0);

	CUserPtr pUser	= UserManager()->GetUser(this);
	if (!pUser)
		return;

/*	if(pUser->GetLockKey())
	{
		pUser->SendSysMsg("请先打开保护锁。");
		return;
	}

	if (pUser->IsFighting())
	{
		pUser->SendSysMsg("错误:战斗中不能执行交易指令!");
		return;
	}

	if (pUser->GetTeam())
	{
		pUser->SendSysMsg("错误:组队状态不能执行交易指令!");
		return;
	}
*/
	DEBUG_TRY		// VVVVVVVVVVVVVVVVVVVVVVVVVVV
	switch(m_pInfo->usAction)
	{
	case _TRADE_APPLY:
		{
			if (m_pInfo->id == ID_NONE)
				return;

			OBJID	idTarget = m_pInfo->id;
			CUser* pTarget = NULL;
			if(!pUser->GetMap()->QueryObj(pUser->GetPosX(), pUser->GetPosY(), OBJ_USER, idTarget, IPP_OF(pTarget)))
			{
				pUser->SendSysMsg(STR_NO_TRADE_TARGET);
				return;
			}

			ISquareDeal* pSquareDeal = pUser->QuerySquareDeal();
			if(pSquareDeal)
			{
				LOGWARNING("玩家重复交易!");
				pSquareDeal->Release();
				return ;
			}

			if(pTarget->QuerySquareDeal())
			{
				pUser->SendSysMsg(STR_TARGET_TRADING);
				return ;
			}

			if (!pTarget->FetchApply(CUser::APPLY_TRADE, pUser->GetID()))
			{
				pUser->SetApply(CUser::APPLY_TRADE, idTarget);
				IF_NOT(this->Create(_TRADE_APPLY, pUser->GetID()))
					return;
				pTarget->SendMsg(this);
				pUser->SendSysMsg(STR_TRADING_REQEST_SENT);
				return;		// ok
			}

			if(!pUser->CreateSquareDeal(pTarget))		// 同时发送消息
			{
				pUser->SendSysMsg(STR_TARGET_TRADING);
				return;
			}
		}
		break;

	case _TRADE_QUIT:
		{
			ISquareDeal* pSquareDeal =	pUser->QuerySquareDeal();
			if(pSquareDeal)
			{
				// inform target
				CUserPtr pTarget	= pSquareDeal->GetTarget();
				if(pTarget)
				{
//					CHECK(this->Create(_TRADE_FALSE, 0));
//					pTarget->SendMsg(this);
				}

				// feed back
				{
//					CHECK(this->Create(_TRADE_FALSE, 0));
//					pUser->SendMsg(this);
				}

				pSquareDeal->Release();
			}
		}
		break;

	case _TRADE_OPEN:
		{
			ASSERT(!"_TRADE_OPEN");
		}
		break;

	case _TRADE_SUCCESS:
		{
			ASSERT(!"_TRADE_SUCCESS");
		}
		break;

	case _TRADE_FALSE:
		{
			ASSERT(!"_TRADE_FALSE");
		}
		break;

	case _TRADE_ADDITEM:
		{
			ISquareDeal* pSquareDeal =	pUser->QuerySquareDeal();
			if(!pSquareDeal)
				return;

			CItemPtr pItem	= pUser->GetItem(m_pInfo->id);
			if (!pItem || !pItem->IsExchangeEnable())
			{
				pUser->SendSysMsg(STR_NOT_FOR_TRADE);

				IF_OK(this->Create(_TRADE_ADDITEMFAIL, m_pInfo->id))
					pUser->SendMsg(this);
				return;
			}
			if (pItem->IsEudemon())
			{
				pUser->CallBackEudemon(pItem->GetID());
				pUser->DetachEudemon(pItem);
			}

			if(!pSquareDeal->AddItem(pItem))
			{
				IF_OK(this->Create(_TRADE_ADDITEMFAIL, m_pInfo->id))
					pUser->SendMsg(this);
				return;
			}
		}
		break;

	case _TRADE_ADDMONEY:
		{
			ISquareDeal* pSquareDeal =	pUser->QuerySquareDeal();
			if(!pSquareDeal)
				return;

			int	nAllMoney = pSquareDeal->AddMoney(m_pInfo->nData);		// return allmoney
			CHECK(this->Create(_TRADE_SELFMONEYALL, nAllMoney));
			pUser->SendMsg(this);

			if(nAllMoney <= 0)
				pUser->AddAttrib(_USERATTRIB_MONEY, 0, SYNCHRO_TRUE);		// recruit money(note: because set money once, so no conflict
		}
		break;

	case _TRADE_OK:
		{
			ISquareDeal* pSquareDeal =	pUser->QuerySquareDeal();
			if(!pSquareDeal)
				return;

			if(pSquareDeal->ClickOK())		// return true: 交易完成
				pSquareDeal->Release();
		}
		break;

	default:
		break;
	}
	DEBUG_CATCH2("switch(MSGTRADE) [%d]", m_pInfo->usAction)		// AAAAAAAAAAAAAAAA
}

⌨️ 快捷键说明

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