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

📄 msgpackage.cpp

📁 网络游戏魔域的服务端与客户端完整源代码 包括详细的说明文档与开发日志
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		break;
	case	MSGPACKAGE_TYPE_CHEST:
		// 异次元袋
		// add by zlong 2003-11-24
		switch(m_pInfo->ucAction)
		{
		case	MSGPACKAGE_QUERYLIST:
			{
				// CHEST
				OBJID	idChest	= m_pInfo->id;
				CItemPtr	pChestItem	= pUser->GetItem(idChest);
				if (!pChestItem || !pChestItem->IsChestItem())
					return ;
				pUser->QueryStorage()->SendStorageInfo(idChest, ITEMPOSITION_CHEST);
			}
			break;
		case	MSGPACKAGE_CHECKIN:
			{
				// ITEM
				OBJID	idItem = m_pInfo->idItem;
				CItemPtr pItem = pUser->GetItem(idItem);
				//不允许嵌套异次元袋,不允许存放不可交换或不可存储的物品
				if(!pItem || !pItem->IsExchangeEnable() || !pItem->IsStorageEnable() || pItem->IsChestItem())
				{
					pUser->SendSysMsg(STR_CANT_STORAGE);
					return ;
				}
				if (pItem->IsEudemon())
				{
					pUser->CallBackEudemon(pItem->GetID());
					pUser->DetachEudemon(pItem);
				}

				// CHEST
				OBJID	idChest = m_pInfo->id;
				CItemPtr	pChestItem	= pUser->GetItem(idChest);
				if (!pChestItem || !pChestItem->IsChestItem())
					return ;

				//异次元袋的容量和物品type_id绑定,容量 = (idType % 10 + 1) * 3
				OBJID idType	= pChestItem->GetInt(ITEMDATA_TYPE);
				if(pUser->QueryStorage()->GetStorageCount() >= (idType % 10 +1) * 3)
					return ;

				DEBUG_TRY	// VVVVVVVVVVVVVV
				pUser->PopItem(idItem, SYNCHRO_TRUE, UPDATE_FALSE);				// 先取,防作弊
				pUser->QueryStorage()->CheckIn(idChest, pItem, UPDATE_TRUE, ITEMPOSITION_CHEST);
				DEBUG_CATCH("MSGPACKAGE_CHECKIN") // AAAAAAAAAAAAAAAAA
			}
			break;
		case	MSGPACKAGE_CHECKOUT:
			{
				// CHEST
				OBJID	idChest = m_pInfo->id;
				OBJID	idItem = m_pInfo->idItem;
				CItemPtr	pChestItem	= pUser->GetItem(idChest);
				if (!pChestItem || !pChestItem->IsChestItem())
					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(idChest, idItem, UPDATE_FALSE, ITEMPOSITION_CHEST);		// 先取,防作弊
				if(!pItem)
					return ;
				pUser->AddItem(pItem, SYNCHRO_TRUE);
				// log
				if (pItem->IsNonsuchItem())
				{
					::MyLogSave("gmlog/Chest", "%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_CHECKIN") // AAAAAAAAAAAAAAAAA
			}
			break;
		default:
			ASSERT(!"action");
		}
		// GetAmount()
		break;
	// 幻兽孵化器
	case MSGPACKAGE_TYPE_EUDEMON_BROODER:
		{
			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->IsEudemonBrooderNpc())
						return ;

					CPackage* pPackage = pNpc->QueryEudemonBrooder()->QueryPackage(pUser->GetID());
					if (!pPackage)
						return;
					// 幻兽蛋的孵化应该在SendInfo之前进行,
					// 本来不想改动CPackage的,暂时就先改动吧。
					pPackage->SendInfo(pUser);
				}
				break;
			case MSGPACKAGE_CHECKIN:
				{
					// ITEM
					OBJID	idItem = m_pInfo->idItem;
					CItemPtr pItem = pUser->GetItem(idItem);
					if(!pItem || !pItem->IsStorageEnable() || !pItem->IsEudemonEgg())	// 只有幻兽蛋才可以放进来
					{
						pUser->SendSysMsg(STR_CANT_STORAGE);
						return ;
					}
					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->IsEudemonBrooderNpc())
						return ;
					if(pNpc->QueryEudemonBrooder()->IsPackageFull(pUser->GetID()))
						return ;
					CPackage* pPackage = pNpc->QueryEudemonBrooder()->QueryPackage(pUser->GetID());
					if (!pPackage)
						return;

					// 借用availabletime字段记录幻兽蛋开始孵化的时间
					pItem->SetInt(ITEMDATA_AVAILABLETIME, ::TimeGet(TIME_SECOND), true);
					
					DEBUG_TRY	// VVVVVVVVVVVVVV
					pUser->PopItem(idItem, SYNCHRO_TRUE, UPDATE_FALSE);				// 先取,防作弊
					pPackage->CheckIn(pUser, 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->IsEudemonBrooderNpc())
						return ;
					CPackage* pPackage = pNpc->QueryEudemonBrooder()->QueryPackage(pUser->GetID());
					if (!pPackage)
						return;
					if(pUser->IsItemFull(pPackage->GetWeight(idItem),
											pPackage->GetItemTypeByID(idItem),
											pPackage->GetItemAmountLimitByID(idItem)))
						return ;

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

					// 清除幻兽蛋的开始孵化时间记录
					pItem->SetInt(ITEMDATA_AVAILABLETIME, 0, true);
					pUser->AddItem(pItem, SYNCHRO_TRUE);

					// log
					if (pItem->IsNonsuchItem())
					{
						::MyLogSave("gmlog/Eudemon", "%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
				}
				break;
			default:
				ASSERT(!"action");
			}
		}
		break;
	// 幻兽仓库
	case MSGPACKAGE_TYPE_EUDEMON_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->IsEudemonStorageNpc())
						return ;
					CPackage* pPackage = pNpc->QueryEudemonStorage()->QueryPackage(pUser->GetID());
					if (!pPackage)
						return;

					pPackage->SendInfo(pUser);
				}
				break;
			case MSGPACKAGE_CHECKIN:
				{
					// ITEM
					OBJID	idItem = m_pInfo->idItem;
					CItemPtr pItem = pUser->GetItem(idItem);
					if(!pItem || !pItem->IsStorageEnable() 
						|| !(pItem->IsEudemon() || pItem->IsEudemonEgg()))	// 只有幻兽和幻兽蛋才允许放进来
					{
						pUser->SendSysMsg(STR_CANT_STORAGE);
						return ;
					}
					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->IsEudemonStorageNpc())
						return ;
					if(pNpc->QueryEudemonStorage()->IsPackageFull(pUser->GetID()))
						return ;
					CPackage* pPackage = pNpc->QueryEudemonStorage()->QueryPackage(pUser->GetID());
					if (!pPackage)
						return;

					DEBUG_TRY	// VVVVVVVVVVVVVV
					pUser->PopItem(idItem, SYNCHRO_TRUE, UPDATE_FALSE);				// 先取,防作弊
					pPackage->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->IsEudemonStorageNpc())
						return ;
					CPackage* pPackage = pNpc->QueryEudemonStorage()->QueryPackage(pUser->GetID());
					if (!pPackage)
						return;
					if(pUser->IsItemFull(pPackage->GetWeight(idItem),
											pPackage->GetItemTypeByID(idItem),
											pPackage->GetItemAmountLimitByID(idItem)))
						return ;

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

					// log
					if (pItem->IsNonsuchItem())
					{
						::MyLogSave("gmlog/Eudemon", "%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");
			}
		}
		break;
	default:
		ASSERT(!"type");
	}
	DEBUG_CATCH3("MsgPackage. type[%d], subtype[%d]", m_pInfo->ucType, m_pInfo->ucAction)	// AAAAAAAAAAAAAAA
}

⌨️ 快捷键说明

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