📄 handler_cg_trigger.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 + -