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

📄 msgpackage.cpp

📁 网络游戏魔域的服务端与客户端完整源代码 包括详细的说明文档与开发日志
💻 CPP
📖 第 1 页 / 共 2 页
字号:
////////////////////////////////////////////////////////////////
//
//		MsgPackage.cpp
//

#include "AllMsg.h"
#include "package.h"
#include "MapGroup.h"
#include "Npc.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMsgPackage::CMsgPackage()
{
	Init();
	m_pInfo	=(MSG_Info *)m_bufMsg;
}

CMsgPackage::~CMsgPackage()
{

}
//////////////////////////////////////////////////////////////////////
BOOL CMsgPackage::Create(int nAction,OBJID id , OBJID idItem, UCHAR ucType)
{
	CHECKF(id != ID_NONE && idItem != ID_NONE);

	// init
	this->Init();

	// fill info now
	m_unMsgSize		= sizeof(MSG_Info);
	m_unMsgType		= _MSG_PACKAGE;

	m_pInfo->id			= id;
	m_pInfo->ucAction	= nAction;
	m_pInfo->ucType		= ucType;	//MSGPACKAGE_TYPE_NONE;						// 无意义
	m_pInfo->idItem		= idItem;

	return true;
}

//////////////////////////////////////////////////////////////////////
BOOL CMsgPackage::Create(int nAction, OBJID id, const MsgPackageItemInfo* buf, int nSize, UCHAR ucType)
{
	CHECKF(buf && nSize >= 0 && nSize <= PACKAGE_LIMIT);

	// init
	this->Init();

	// fill info now
	m_unMsgSize		= sizeof(MSG_Info) + (nSize-1) * sizeof(MsgPackageItemInfo);
	m_unMsgType		= _MSG_PACKAGE;

	m_pInfo->id			= id;
	m_pInfo->ucAction	= nAction;
	m_pInfo->ucType		= ucType;
	m_pInfo->usSize		= nSize;

	if(nSize > 0)
		memcpy(&m_pInfo->setItemInfo, buf, nSize * sizeof(MsgPackageItemInfo));

	return true;
}

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

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

	return true;
}

//////////////////////////////////////////////////////////////////////
void CMsgPackage::Process(CGameSocket* pSocket)
{
	DEBUG_TRY	// VVVVVVVVVVVVVVVVVVVVVVVVVV
	CUserPtr pUser = UserManager()->GetUser(this);
	CHECK(pUser);

	switch(m_pInfo->ucType)
	{
	case MSGPACKAGE_TYPE_AUCTION_STORAGE:
		{
			switch(m_pInfo->ucAction)
			{
			case MSGPACKAGE_QUERYLIST:
				{
				// NPC
				OBJID	idNpc = m_pInfo->id;
				CNpc* pNpc = NULL;
				if(!pUser->GetMap()->QueryObj(pUser->GetPosX(), pUser->GetPosY(), OBJ_NPC, idNpc, IPP_OF(pNpc)))
					return ;
				if(!pNpc->IsAuctionNpc())
					return ;
                DEBUG_TRY
				pUser->QueryStorage()->SendStorageInfo(idNpc,ITEMPOSITION_AUCTION_STORAGE);
				DEBUG_CATCH("QueryStorage()->SendStorageInfo Error")
			//	pUser->SendStorageInfo(idNpc,ITEMPOSITION_AUCTION_STORAGE);
				}
				break;
			case MSGPACKAGE_CHECKOUT:
				{
				// NPC
				OBJID	idNpc = m_pInfo->id;
				OBJID	idItem = m_pInfo->idItem;
				CNpc* pNpc = NULL;
				if(!pUser->GetMap()->QueryObj(pUser->GetPosX(), pUser->GetPosY(), OBJ_NPC, idNpc, IPP_OF(pNpc)))
					return ;
				if(!pNpc->IsAuctionNpc())
					return ;
/*				if(pUser->IsItemFull(pUser->QueryStorage()->GetWeight(idItem),
										pUser->QueryStorage()->GetItemType(idItem),
										pUser->QueryStorage()->GetAmountLimit(idItem)))
					return ;*/

				// ITEM
				DEBUG_TRY	// VVVVVVVVVVVVVV
				CItemPtr pItem = pUser->QueryStorage()->CheckOut(idNpc, idItem, UPDATE_FALSE,ITEMPOSITION_AUCTION_STORAGE);		// 先取,防作弊
				if(!pItem)
					return ;
				pUser->AddItem(pItem, SYNCHRO_TRUE);
//				pNpc->QueryAuction()->QueryPackage()->CheckOut(idItem);
				DEBUG_CATCH("MSGPACKAGE_AUCTION_CHECKOUT")
				}
				break;
			}
		}
		break;
	case	MSGPACKAGE_TYPE_STORAGE:
		switch(m_pInfo->ucAction)
		{
		case	MSGPACKAGE_QUERYLIST:
			{
				// NPC
				OBJID	idNpc = m_pInfo->id;
				CNpc* pNpc = NULL;
				if(!pUser->GetMap()->QueryObj(pUser->GetPosX(), pUser->GetPosY(), OBJ_NPC, idNpc, IPP_OF(pNpc)))
					return ;
				if(!pNpc->IsStorageNpc())
					return ;

				pUser->QueryStorage()->SendStorageInfo(idNpc);
			}
			break;
		case	MSGPACKAGE_CHECKIN:
			{
				// ITEM
				OBJID	idItem = m_pInfo->idItem;
				CItemPtr pItem = pUser->GetItem(idItem);
				if(!pItem || !pItem->IsStorageEnable() && !pItem->IsChestItem())	// enable store chest
				{
					pUser->SendSysMsg(STR_CANT_STORAGE);
					return ;
				}

				// NPC
				OBJID	idNpc = m_pInfo->id;
				CNpc* pNpc = NULL;
				if(!pUser->GetMap()->QueryObj(pUser->GetPosX(), pUser->GetPosY(), OBJ_NPC, idNpc, IPP_OF(pNpc)))
					return ;
				if(!pNpc->IsStorageNpc())
					return ;
				int nSize = pNpc->GetStorageSize();
				if(nSize == 0)
					nSize	= USER_PACKAGE_SIZE;		// 冗错
				if(pUser->QueryStorage()->GetStorageCount() >= nSize)
//				if(pUser->QueryStorage()->GetStorageCount() >= pNpc->GetStorageSize())
					return ;

				DEBUG_TRY	// VVVVVVVVVVVVVV
				pUser->PopItem(idItem, SYNCHRO_TRUE, UPDATE_FALSE);				// 先取,防作弊
				pUser->QueryStorage()->CheckIn(idNpc, pItem, UPDATE_TRUE);
				DEBUG_CATCH("MSGPACKAGE_CHECKIN") // AAAAAAAAAAAAAAAAA
			}
			break;
		case	MSGPACKAGE_CHECKOUT:
			{
				// NPC
				OBJID	idNpc = m_pInfo->id;
				OBJID	idItem = m_pInfo->idItem;
				CNpc* pNpc = NULL;
				if(!pUser->GetMap()->QueryObj(pUser->GetPosX(), pUser->GetPosY(), OBJ_NPC, idNpc, IPP_OF(pNpc)))
					return ;
				if(!pNpc->IsStorageNpc())
					return ;
				if(pUser->IsItemFull(pUser->QueryStorage()->GetWeight(idItem),
										pUser->QueryStorage()->GetItemType(idItem),
										pUser->QueryStorage()->GetAmountLimit(idItem)))
					return ;

				// ITEM
				DEBUG_TRY	// VVVVVVVVVVVVVV
				CItemPtr pItem = pUser->QueryStorage()->CheckOut(idNpc, idItem, UPDATE_FALSE);		// 先取,防作弊
				if(!pItem)
					return ;
				pUser->AddItem(pItem, SYNCHRO_TRUE);
				DEBUG_CATCH("MSGPACKAGE_CHECKIN") // AAAAAAAAAAAAAAAAA
			}
			break;
		default:
			ASSERT(!"action");
		}
		break;
	case	MSGPACKAGE_TYPE_TRUNK:
		switch(m_pInfo->ucAction)
		{
		case	MSGPACKAGE_QUERYLIST:
			{
				// NPC
				OBJID	idNpc = m_pInfo->id;
				CNpc* pNpc = NULL;
				if(!pUser->GetMap()->QueryObj(pUser->GetPosX(), pUser->GetPosY(), OBJ_NPC, idNpc, IPP_OF(pNpc)))
					return ;
				if(!pNpc->IsTrunkNpc())
					return ;

				pNpc->QueryTrunk()->QueryPackage()->SendInfo(pUser);
			}
			break;
		case	MSGPACKAGE_CHECKIN:
			{
				// ITEM
				OBJID	idItem = m_pInfo->idItem;
				CItemPtr pItem = pUser->GetItem(idItem);
				if(!pItem || !pItem->IsExchangeEnable() || !pItem->IsStorageEnable())
				{
					pUser->SendSysMsg(STR_CANT_STORAGE);
					return ;
				}
				if (pItem->IsEudemon())
				{
					pUser->CallBackEudemon(pItem->GetID());
					pUser->DetachEudemon(pItem);
				}

				// NPC
				OBJID	idNpc = m_pInfo->id;
				CNpc* pNpc = NULL;
				if(!pUser->GetMap()->QueryObj(pUser->GetPosX(), pUser->GetPosY(), OBJ_NPC, idNpc, IPP_OF(pNpc)))
					return ;
				if(!pNpc->IsTrunkNpc())
					return ;
				if(pNpc->QueryTrunk()->IsPackageFull())
					return ;

				DEBUG_TRY	// VVVVVVVVVVVVVV
				pUser->PopItem(idItem, SYNCHRO_TRUE, UPDATE_FALSE);				// 先取,防作弊
				pNpc->QueryTrunk()->QueryPackage()->CheckIn(pUser, pItem, UPDATE_TRUE);
				DEBUG_CATCH("MSGPACKAGE_CHECKIN") // AAAAAAAAAAAAAAAAA

				if(pNpc->IsShelfNpc())
					pNpc->SendSelfToBlock();
			}
			break;
		case	MSGPACKAGE_CHECKOUT:
			{
				// NPC
				OBJID	idNpc = m_pInfo->id;
				OBJID	idItem = m_pInfo->idItem;
				CNpc* pNpc = NULL;
				if(!pUser->GetMap()->QueryObj(pUser->GetPosX(), pUser->GetPosY(), OBJ_NPC, idNpc, IPP_OF(pNpc)))
					return ;
				if(!pNpc->IsTrunkNpc())
					return ;
				if(!pNpc->IsOwnerOf(pUser, CNpc::MATE_ENABLE))
					return ;
				if(pUser->IsItemFull(pNpc->QueryTrunk()->QueryPackage()->GetWeight(idItem),
										pNpc->QueryTrunk()->QueryPackage()->GetItemTypeByID(idItem),
										pNpc->QueryTrunk()->QueryPackage()->GetItemAmountLimitByID(idItem)))
					return ;

				// ITEM
				DEBUG_TRY	// VVVVVVVVVVVVVV
				CItemPtr pItem = pNpc->QueryTrunk()->QueryPackage()->CheckOut(pUser, idItem, UPDATE_FALSE);		// 先取,防作弊
				if(!pItem)
					return ;
				pUser->AddItem(pItem, SYNCHRO_TRUE);

				// log
				if (pItem->IsNonsuchItem())
				{
					::MyLogSave("gmlog/Trunk", "%s(%u) checkout item:[id=%u, type=%u], dur=%d, max_dur=%d", 
							pUser->GetName(),
							pUser->GetID(),
							pItem->GetID(), 
							pItem->GetInt(ITEMDATA_TYPE),
							pItem->GetInt(ITEMDATA_AMOUNT),
							pItem->GetInt(ITEMDATA_AMOUNTLIMIT));
				}
				DEBUG_CATCH("MSGPACKAGE_CHECKOUT") // AAAAAAAAAAAAAAAAA

				if(pNpc->IsShelfNpc())
					pNpc->SendSelfToBlock();
			}
			break;
		default:
			ASSERT(!"action");
		}

⌨️ 快捷键说明

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