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

📄 handler_cg_trigger.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 CPP
字号:

#include "stdafx.h"
#include ".\Handler_CG_TRIGGER.h"
#include "Field.h"
#include "TriggerManager.h"
#include "TriggerMsg.h"
#include "Player.h"
#include "MissionManager.h"
#include "MissionRewardParser.h"
#include "ItemInfoParser.h"
#include "ItemManager.h"
#include <SCSlotContainer.h>

Handler_CG_TRIGGER::Handler_CG_TRIGGER()
{

}
Handler_CG_TRIGGER::~Handler_CG_TRIGGER()
{
}

VOID Handler_CG_TRIGGER::OnCG_TRIGGER_CLICK_OBJECT_SYN( ServerSession * pServerSession, MSG_BASE * pMsg, WORD wSize )
{
	MSG_CG_TRIGGER_CLICK_OBJECT_SYN * pRecvMsg = (MSG_CG_TRIGGER_CLICK_OBJECT_SYN *)pMsg;

	Player * pPlayer = PlayerManager::Instance()->FindPlayer( pRecvMsg->m_dwKey );
	ASSERT( pPlayer );
	if( !pPlayer ) return ;

	Field *pField = pPlayer->GetField();
	if( !pField ) return;

	TRIGGER_CLICK_OBJECT msg;
	msg.m_eObjectType	= (eOBJECT_TYPE)0;
	msg.m_dwObjectKey	= pRecvMsg->m_dwClickedObjectKey;
	msg.m_dwUserKey		= pPlayer->GetUserKey();
	pField->GetTriggerManager()->OnMsg(&msg);
	
}

VOID Handler_CG_TRIGGER::OnCG_TRIGGER_ENTER_AREA_SYN( ServerSession * pServerSession, MSG_BASE * pMsg, WORD wSize )
{
	MSG_CG_TRIGGER_ENTER_AREA_SYN * pRecvMsg = (MSG_CG_TRIGGER_ENTER_AREA_SYN *)pMsg;

	Player * pPlayer = PlayerManager::Instance()->FindPlayer( pRecvMsg->m_dwKey );

	// 烙矫肺 猾促.!!!!努扼甫 困秦
	//ASSERT( pPlayer );
	if( !pPlayer ) return ;

	TRIGGER_ENTER_AREA msg;
	msg.m_dwUserKey		= pPlayer->GetUserKey();
	msg.m_AreaID		= pRecvMsg->m_iAreaID;
	if( pPlayer->GetField() )
		pPlayer->GetField()->GetTriggerManager()->OnEnterArea( &msg );
}

VOID Handler_CG_TRIGGER::OnCG_TRIGGER_LEAVE_AREA_SYN( ServerSession * pServerSession, MSG_BASE * pMsg, WORD wSize )
{
	MSG_CG_TRIGGER_LEAVE_AREA_SYN * pRecvMsg = (MSG_CG_TRIGGER_LEAVE_AREA_SYN *)pMsg;

	Player * pPlayer = PlayerManager::Instance()->FindPlayer( pRecvMsg->m_dwKey );
	ASSERT( pPlayer );
	if( !pPlayer ) return ;

	TRIGGER_LEAVE_AREA msg;
	msg.m_dwUserKey		= pPlayer->GetUserKey();
	msg.m_AreaID		= pRecvMsg->m_iAreaID;
	if( pPlayer->GetField() )
		pPlayer->GetField()->GetTriggerManager()->OnLeaveArea( &msg );
}

Handler_CG_TRIGGER_IMPL( CG_TRIGGER_REWARD_SYN )
{
	MSG_CG_TRIGGER_REWARD_SYN * pRecvMsg = (MSG_CG_TRIGGER_REWARD_SYN *)pMsg;

	Player * pPlayer = PlayerManager::Instance()->FindPlayer( pRecvMsg->m_dwKey );
	ASSERT( pPlayer );
	if( !pPlayer ) return ;


	MissionManager * pMGR = pPlayer->GetMissionManager();
	if( pMGR->GetMissionState(pRecvMsg->m_Num) != MISSION_REWARD )
	{
		MSG_CG_TRIGGER_REWARD_NAK nmsg;
		nmsg.m_dwErrorCode = 4116;
		pPlayer->SendPacket( &nmsg, sizeof(nmsg) );
		return;
	}
	ASSERT( pMGR->GetMissionPoint(pRecvMsg->m_Num) != 0 );

	BASE_MissionReward * pRewardInfo = MissionRewardParser::Instance()->GetMissionReward( pRecvMsg->m_Num );
	if( !pRewardInfo )
	{
		MSG_CG_TRIGGER_REWARD_NAK nmsg;
		nmsg.m_dwErrorCode = 4117;
		pPlayer->SendPacket( &nmsg, sizeof(nmsg) );
		return;
	}


	eCHAR_TYPE type = pPlayer->GetCharType();
	
	ItemManager * pItemMGR = pPlayer->GetItemManager();
	SCSlotContainer * pInventory = (SCSlotContainer *)pItemMGR->GetItemSlotContainer(SI_INVENTORY);
	SCSlotContainer * pTmpInventory = (SCSlotContainer *)pItemMGR->GetItemSlotContainer(SI_TEMPINVENTORY);

	MSG_CG_TRIGGER_REWARD_ACK amsg;
	POSTYPE		InPosNum;
	POS_INFO	InPos[MAX_WAREHOUSE_SLOT_NUM];
	POSTYPE		InTmpPosNum;
	POS_INFO	InTmpPos[MAX_WAREHOUSE_SLOT_NUM];
	
	amsg.m_ItemInfo.m_InvenCount = 0;
	amsg.m_ItemInfo.m_TmpInvenCount = 0;
	if( pMGR->GetMissionPoint(pRecvMsg->m_Num) == 1 )
	{
		// 霉锅掳 焊惑芒
		BOOL bCan = TRUE;
		REWARD1_ITEM_INFO & ItemInfo = pRewardInfo->m_Item1Info[type];
		for( INT i = 0 ; i < REWARD1_ITEM_INFO::MAX_REWARD1_ITEM_NUM ; ++i )
		{
			if( pRecvMsg->m_SelectedItem & (MSG_CG_TRIGGER_REWARD_SYN::ITEM1_SELECTED << i) )
			{
				SLOTCODE ItemCode = ItemInfo.m_RewardItemCode[i];
				POSTYPE need_num = ItemInfo.m_Quantity[i];
				if( ItemCode == 0 || need_num == 0 ) continue;
				BASE_ITEMINFO * pInfo = ItemInfoParser::Instance()->GetItemInfo(ItemCode);ASSERT(pInfo);
				if( !pItemMGR->CheckInsertItemDup( pInventory, ItemCode, pInfo->m_byDupNum, need_num, InPosNum, InPos ) )
				{
					if( !pItemMGR->CheckInsertItemDup( pTmpInventory, ItemCode, pInfo->m_byDupNum, need_num, InTmpPosNum, InTmpPos ) )
					{
						bCan = FALSE;
						break;
					}
				}
			}
		}
		if( !bCan )
		{
			MSG_CG_TRIGGER_REWARD_NAK nmsg;
			nmsg.m_dwErrorCode = 4118;
			pPlayer->SendPacket( &nmsg, sizeof(nmsg) );
			return;
		}

		for( INT i = 0 ; i < REWARD1_ITEM_INFO::MAX_REWARD1_ITEM_NUM ; ++i )
		{
			if( pRecvMsg->m_SelectedItem & (MSG_CG_TRIGGER_REWARD_SYN::ITEM1_SELECTED << i) )
			{
				SLOTCODE ItemCode = ItemInfo.m_RewardItemCode[i];
				POSTYPE need_num = ItemInfo.m_Quantity[i];
				if( ItemCode == 0 || need_num == 0 ) continue;

				BASE_ITEMINFO * pInfo = ItemInfoParser::Instance()->GetItemInfo(ItemCode);ASSERT(pInfo);
				pItemMGR->CheckInsertItemDup( pInventory, ItemCode, pInfo->m_byDupNum, need_num, InPosNum, InPos );
				pItemMGR->CheckInsertItemDup( pTmpInventory, ItemCode, pInfo->m_byDupNum, need_num, InTmpPosNum, InTmpPos );

				ASSERT( InPosNum != 0 );

				// 叼官牢 酒捞袍捞 登绰 仇牢瘤 酒囱瘤 犬牢秦辑 登绰 仇捞搁 叼官牢 吧绢霖促
				if( pInfo->IsArmor() || pInfo->IsWeapon() )
				{
					// 叼官牢 酒捞袍捞骨肺 Obtain俊 鞘夸茄 SCItemSlot 流立 累己
					SCItemSlot ItemSlot;
					ItemSlot.SetCode( ItemCode );
					ItemSlot.SetSet( ItemInfo.m_bRewardItemCode );

					pItemMGR->Obtain( SI_INVENTORY, ItemSlot, InPosNum, InPos, amsg.m_ItemInfo.m_InvenCount, &amsg.m_ItemInfo.m_Slot[amsg.m_ItemInfo.m_InvenCount+amsg.m_ItemInfo.m_TmpInvenCount] );
					if( InTmpPosNum != 0 ) 
						pItemMGR->Obtain( SI_TEMPINVENTORY, ItemSlot, InTmpPosNum, InTmpPos, amsg.m_ItemInfo.m_TmpInvenCount, &amsg.m_ItemInfo.m_Slot[amsg.m_ItemInfo.m_InvenCount+amsg.m_ItemInfo.m_TmpInvenCount] );
				}
				else
				{
					// 叼官牢捞 酒聪骨肺 弊成 Obtain
					pItemMGR->Obtain( SI_INVENTORY, ItemCode, InPosNum, InPos, amsg.m_ItemInfo.m_InvenCount, &amsg.m_ItemInfo.m_Slot[amsg.m_ItemInfo.m_InvenCount+amsg.m_ItemInfo.m_TmpInvenCount] );
					if( InTmpPosNum != 0 ) 
						pItemMGR->Obtain( SI_TEMPINVENTORY, ItemCode, InTmpPosNum, InTmpPos, amsg.m_ItemInfo.m_TmpInvenCount, &amsg.m_ItemInfo.m_Slot[amsg.m_ItemInfo.m_InvenCount+amsg.m_ItemInfo.m_TmpInvenCount] );
				}
			}
		}
		// 捣 焊惑
//		pPlayer->SetMoney( pPlayer->GetMoney() + ItemInfo.m_RewardMoney );
		pPlayer->PlusMoney( ItemInfo.m_RewardMoney );	// SetMoney肺 捣 冈绰 何盒 傈何 PlusMoney()肺 背眉吝(泅芒)
		amsg.m_Money = pPlayer->GetMoney();
		// 版氰摹 焊惑
		pPlayer->AddExp( ItemInfo.m_RewardEXP );
	}
	else
	{
		// 滴锅掳 焊惑芒
		BOOL bCan = TRUE;
		REWARD2_ITEM_INFO & ItemInfo = pRewardInfo->m_Item2Info[type];
		for( INT i = 0 ; i < REWARD2_ITEM_INFO::MAX_REWARD2_ITEM_NUM ; ++i )
		{
			SLOTCODE ItemCode = ItemInfo.m_RewardItemCode[i];
			POSTYPE need_num = ItemInfo.m_Quantity[i];
			if( ItemCode == 0 || need_num == 0 ) continue;
			BASE_ITEMINFO * pInfo = ItemInfoParser::Instance()->GetItemInfo(ItemCode);ASSERT(pInfo);
			if( !pItemMGR->CheckInsertItemDup( pInventory, ItemCode, pInfo->m_byDupNum, need_num, InPosNum, InPos ) )
			{
				if( !pItemMGR->CheckInsertItemDup( pTmpInventory, ItemCode, pInfo->m_byDupNum, need_num, InTmpPosNum, InTmpPos ) )
				{
					bCan = FALSE;
					break;
				}
			}
		}
		if( !bCan )
		{
			MSG_CG_TRIGGER_REWARD_NAK nmsg;
			nmsg.m_dwErrorCode = 4119;
			pPlayer->SendPacket( &nmsg, sizeof(nmsg) );
			return;
		}
		BOOL rt = FALSE;
		RC::eITEM_RESULT ret = RC::RC_ITEM_SUCCESS;
		for( INT i = 0 ; i < REWARD2_ITEM_INFO::MAX_REWARD2_ITEM_NUM ; ++i )
		{
			SLOTCODE ItemCode = ItemInfo.m_RewardItemCode[i];
			POSTYPE need_num = ItemInfo.m_Quantity[i];
			if( ItemCode == 0 || need_num == 0 ) continue;
			BASE_ITEMINFO * pInfo = ItemInfoParser::Instance()->GetItemInfo(ItemCode);ASSERT(pInfo);
			pItemMGR->CheckInsertItemDup( pInventory, ItemCode, pInfo->m_byDupNum, need_num, InPosNum, InPos );
			ASSERT( InPosNum != 0 );
			pItemMGR->Obtain( SI_INVENTORY, ItemCode, InPosNum, InPos, amsg.m_ItemInfo.m_InvenCount, &amsg.m_ItemInfo.m_Slot[amsg.m_ItemInfo.m_InvenCount+amsg.m_ItemInfo.m_TmpInvenCount] );
		
			rt = pItemMGR->CheckInsertItemDup( pTmpInventory, ItemCode, pInfo->m_byDupNum, need_num, InTmpPosNum, InTmpPos );
			ASSERT( rt );
			if( InTmpPosNum != 0 ) 
				pItemMGR->Obtain( SI_TEMPINVENTORY, ItemCode, InTmpPosNum, InTmpPos, amsg.m_ItemInfo.m_TmpInvenCount, &amsg.m_ItemInfo.m_Slot[amsg.m_ItemInfo.m_InvenCount+amsg.m_ItemInfo.m_TmpInvenCount] );
		}
		// 捣 焊惑
//		pPlayer->SetMoney( pPlayer->GetMoney() + ItemInfo.m_RewardMoney );
		pPlayer->PlusMoney( ItemInfo.m_RewardMoney );	// SetMoney肺 捣 冈绰 何盒 傈何 PlusMoney()肺 背眉吝(泅芒)
		amsg.m_Money = pPlayer->GetMoney();
		// 版氰摹 焊惑
		pPlayer->AddExp( ItemInfo.m_RewardEXP );

		// 罚待 焊惑 - 2瞒俊父
		RANDOM_REWARD_ITEM_INFO &	RandItemInfo =  pRewardInfo->m_RandItemInfo[type];
		BYTE						byRandNum = rand() % 100, nTotalNum = 0;

		for( INT i = 0 ; i < RANDOM_REWARD_ITEM_INFO::MAX_RANDOM_REWARD_ITEM_NUM ; i++ )
		{
			// 焊惑栏肺 够 临鳖~?
			if( byRandNum < nTotalNum + RandItemInfo.m_byDropRewardrate[i] )
			{
				nTotalNum += RandItemInfo.m_byDropRewardrate[i];	// continue 且 版快甫 措厚窍咯 +秦 敌促

				// i锅掳 酒捞袍捞 焊惑袍捞 等促
				SLOTCODE ItemCode = RandItemInfo.m_RandomRewradItemCode[i];
				POSTYPE need_num = 1;
				if( ItemCode == 0 )
				{
					continue;
				}

				BASE_ITEMINFO * pInfo = ItemInfoParser::Instance()->GetItemInfo(ItemCode);ASSERT(pInfo);
				pItemMGR->CheckInsertItemDup( pInventory, ItemCode, pInfo->m_byDupNum, need_num, InPosNum, InPos );
				pItemMGR->CheckInsertItemDup( pTmpInventory, ItemCode, pInfo->m_byDupNum, need_num, InTmpPosNum, InTmpPos );

				ASSERT( InPosNum != 0 );
				pItemMGR->Obtain( SI_INVENTORY, ItemCode, InPosNum, InPos, amsg.m_ItemInfo.m_InvenCount, &amsg.m_ItemInfo.m_Slot[amsg.m_ItemInfo.m_InvenCount+amsg.m_ItemInfo.m_TmpInvenCount] );
				if( InTmpPosNum != 0 ) 
					pItemMGR->Obtain( SI_TEMPINVENTORY, ItemCode, InTmpPosNum, InTmpPos, amsg.m_ItemInfo.m_TmpInvenCount, &amsg.m_ItemInfo.m_Slot[amsg.m_ItemInfo.m_InvenCount+amsg.m_ItemInfo.m_TmpInvenCount] );
				break;
			}
			nTotalNum += RandItemInfo.m_byDropRewardrate[i];
		}
	}

	pPlayer->SendPacket( &amsg, amsg.GetSize() );
	pMGR->SetMissionState(pRecvMsg->m_Num, MISSION_NONE);
}

⌨️ 快捷键说明

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