2024-12-21 10:04:04 +08:00
|
|
|
|
#include "StdAfx.h"
|
|
|
|
|
|
#include "DnItemTask.h"
|
|
|
|
|
|
#include "GameSendPacket.h"
|
|
|
|
|
|
#include "DnPlayerActor.h"
|
|
|
|
|
|
#include "DnDropItem.h"
|
|
|
|
|
|
#include "DNUserSession.h"
|
|
|
|
|
|
#include "DNLogConnection.h"
|
|
|
|
|
|
#include "DnEmblemFactory.h"
|
|
|
|
|
|
#include "DNMasterConnectionManager.h"
|
|
|
|
|
|
#include "DNLogConnection.h"
|
|
|
|
|
|
#include "DNUserSession.h"
|
|
|
|
|
|
#include "DNGameDataManager.h"
|
|
|
|
|
|
#include "TaskManager.h"
|
|
|
|
|
|
#include "DnGameTask.h"
|
|
|
|
|
|
#include "DNMissionSystem.h"
|
|
|
|
|
|
#include "DNDBConnectionManager.h"
|
|
|
|
|
|
#include "DnStateBlow.h"
|
|
|
|
|
|
#include "DnNPCActor.h"
|
|
|
|
|
|
#include "DNRestraint.h"
|
|
|
|
|
|
#include "DnSkillTask.h"
|
|
|
|
|
|
#include "DnPartyTask.h"
|
|
|
|
|
|
#include "DNDBConnection.h"
|
|
|
|
|
|
|
|
|
|
|
|
CDnItemTask::CDnItemTask(CDNGameRoom * pRoom)
|
|
|
|
|
|
: CTask( pRoom )
|
|
|
|
|
|
, CMultiSingleton<CDnItemTask, MAX_SESSION_COUNT>( pRoom )
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CDnItemTask::~CDnItemTask()
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CDnItemTask::Initialize()
|
|
|
|
|
|
{
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDnItemTask::Process( LOCAL_TIME LocalTime, float fDelta )
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CDnItemTask::OnDispatchMessage( CDNUserSession * pSession, int nMainCmd, int nSubCmd, char *pData, int nLen )
|
|
|
|
|
|
{
|
|
|
|
|
|
if (pSession->IsCertified() == false)
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_MOVEPACKET_SEQ, pSession, L"CDnItemTask::OnDispatchMessage RState[%d] UState[%d] SCMD[%d]\n", GetRoom()->GetRoomState(), pSession->GetState(), nSubCmd);
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
switch( nMainCmd ) {
|
|
|
|
|
|
case CS_ITEM: return OnRecvItemMessage( pSession, nSubCmd, pData, nLen );
|
|
|
|
|
|
case CS_ITEMGOODS: return OnRecvItemGoodsMessage( pSession, nSubCmd, pData, nLen );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CDnItemTask::OnRecvItemMessage( CDNUserSession * pSession, int nSubCmd, char *pData, int nLen )
|
|
|
|
|
|
{
|
|
|
|
|
|
switch( nSubCmd ) {
|
|
|
|
|
|
case eItem::CS_MOVEITEM: return OnRecvItemMoveItem( pSession, (CSMoveItem*)pData, nLen );
|
|
|
|
|
|
case eItem::CS_MOVECASHITEM: return OnRecvItemMoveCashItem( pSession, (CSMoveCashItem*)pData, nLen );
|
|
|
|
|
|
case eItem::CS_REMOVEITEM: return OnRecvItemRemoveItem( pSession, (CSRemoveItem*)pData, nLen );
|
|
|
|
|
|
case eItem::CS_REMOVECASH: return pSession->OnRecvItemMessage(nSubCmd, pData, nLen);
|
|
|
|
|
|
case eItem::CS_USEITEM: return OnRecvItemUseItem( pSession, (CSUseItem*)pData, nLen);
|
|
|
|
|
|
case eItem::CS_REBIRTH: return OnRecvRebirth( pSession, nLen );
|
|
|
|
|
|
case eItem::CS_REBIRTH_COIN: return OnRecvRebirthCoin( pSession, nLen );
|
|
|
|
|
|
#ifdef _ADD_NEWDISJOINT
|
|
|
|
|
|
case eItem::CS_DISJOINT_REQ: return OnRecvItemDisjoint( pSession, (CSItemDisjointReqNew* )pData, nLen );
|
|
|
|
|
|
#else
|
|
|
|
|
|
case eItem::CS_DISJOINT_REQ: return OnRecvItemDisjoint(pSession, (CSItemDisjointReq*)pData, nLen);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
case eItem::CS_COMPLETE_RANDOMITEM: return OnRecvItemCompleteRandomItem( pSession, (CSCompleteRandomItem *)pData, nLen );
|
|
|
|
|
|
case eItem::CS_CANCEL_RANDOMITEM: return OnRecvItemCancelRandomItem( pSession, pData, nLen );
|
|
|
|
|
|
case eItem::CS_SORTINVENTORY: return OnRecvItemSortInventory( pSession, (CSSortInventory*)pData, nLen );
|
|
|
|
|
|
case eItem::CS_ENCHANT: return OnRecvItemEnchant( pSession, (CSEnchantItem*)pData, nLen );
|
|
|
|
|
|
case eItem::CS_ENCHANTCOMPLETE: return OnRecvItemEnchantComplete( pSession, (CSEnchantItem*)pData, nLen );
|
|
|
|
|
|
case eItem::CS_ENCHANTCANCEL: return OnRecvItemEnchantCancel( pSession, nLen );
|
|
|
|
|
|
case eItem::CS_ITEM_COMPOUND_OPEN_REQ: return OnRecvItemCompoundOpenReq( pSession, reinterpret_cast<CSItemCompoundOpenReq*>(pData), nLen );
|
|
|
|
|
|
case eItem::CS_ITEM_COMPOUND_REQ: return OnrecvItemCompoundReq( pSession, reinterpret_cast<CSCompoundItemReq*>(pData), nLen );
|
|
|
|
|
|
case eItem::CS_ITEM_COMPOUND_CANCEL_REQ: return OnRecvItemCompoundCancelReq( pSession, reinterpret_cast<CSItemCompoundCancelReq*>(pData), nLen );
|
|
|
|
|
|
case eItem::CS_MODITEMEXPIREDATE: return OnRecvItemModitemExpireDate(pSession, (CSModItemExpireDate*)pData, nLen);
|
|
|
|
|
|
case eItem::CS_DELETE_PET_SKILL: return OnRecvItemDeletePetSkill(pSession, (CSPetSkillDelete*)pData, nLen);
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD> Item <20>ʿ<EFBFBD><CABF><EFBFBD> <20>˷<EFBFBD><CBB7>ִ<EFBFBD> <20>͵<EFBFBD>
|
|
|
|
|
|
case eItem::SC_PICKUP: return OnRecvItemPickupItem( pSession, (SCPickUp*)pData, nLen );
|
|
|
|
|
|
case eItem::SC_REFRESHQUESTINVEN: return OnRecvItemRefreshQItem( pSession, (SCRefreshQuestInven *)pData, nLen );
|
|
|
|
|
|
case eItem::SC_REMOVEQUESTITEM: return OnRecvItemRemoveQItem( pSession, (SCRemoveItem *)pData, nLen );
|
|
|
|
|
|
case eItem::SC_REFRESHINVEN: return OnRecvItemRefreshInven( pSession, (SCRefreshInven *)pData, nLen );
|
|
|
|
|
|
case eItem::SC_REFRESHCASHINVEN: return OnRecvItemRefreshCashInven( pSession, (SCRefreshCashInven *)pData, nLen );
|
|
|
|
|
|
case eItem::SC_REFRESHEQUIP: return OnRecvItemRefreshEquip( pSession, (SCRefreshEquip *)pData, nLen );
|
|
|
|
|
|
case eItem::CS_SORTWAREHOUSE: return OnRecvItemWarehouseSort(pSession, (CSSortWarehouse*)pData, nLen);
|
|
|
|
|
|
#if defined(PRE_ADD_EQUIPLOCK)
|
|
|
|
|
|
case eItem::CS_ITEM_LOCK_REQ: return pSession->OnRecvItemMessage(nSubCmd, pData, nLen);
|
|
|
|
|
|
case eItem::CS_ITEM_UNLOCK_REQ:return pSession->OnRecvItemMessage(nSubCmd, pData, nLen);
|
|
|
|
|
|
#endif // #if defined(PRE_ADD_EQUIPLOCK)
|
|
|
|
|
|
|
|
|
|
|
|
default: return ERROR_UNKNOWN_HEADER; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʾҴٸ<D2B4> <20><>¥ ó<><C3B3> <20><><EFBFBD>ϴ<EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȰŴ<C8B0>
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CDnItemTask::OnRecvItemGoodsMessage( CDNUserSession * pSession, int nSubCmd, char *pData, int nLen )
|
|
|
|
|
|
{
|
|
|
|
|
|
return pSession->OnRecvItemGoodsMessage(nSubCmd, pData, nLen);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CDnItemTask::OnRecvItemMoveItem( CDNUserSession *pSession, CSMoveItem *pPacket, int nLen )
|
|
|
|
|
|
{
|
|
|
|
|
|
if (sizeof(CSMoveItem) != nLen)
|
|
|
|
|
|
return ERROR_INVALIDPACKET;
|
|
|
|
|
|
|
|
|
|
|
|
// â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֵ<EFBFBD><D6B5><EFBFBD> Blind<6E><64><EFBFBD>·<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
|
|
|
|
|
|
if (!pSession->IsNoneWindowState() && !pSession->IsWindowState(WINDOW_BLIND))
|
|
|
|
|
|
{
|
|
|
|
|
|
int nRet = ERROR_ITEM_FAIL;
|
|
|
|
|
|
switch(pPacket->cMoveType)
|
|
|
|
|
|
{
|
|
|
|
|
|
case MoveType_EquipToInven: nRet = ERROR_ITEM_EQUIPTOINVEN_FAIL; break;
|
|
|
|
|
|
case MoveType_InvenToEquip: nRet = ERROR_ITEM_INVENTOEQUIP_FAIL; break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pSession->SendMoveItem(pPacket->cMoveType, pPacket->cSrcIndex, pPacket->cDestIndex, NULL, NULL, nRet);
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
// SyncWait <20><><EFBFBD>¿<EFBFBD><C2BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD><CCB5><EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD>մϴ<D5B4>. ( Ŭ<><EFBFBD><F3BFA1BC><EFBFBD> <20>ѹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ѹ<EFBFBD><D1B9><EFBFBD> üũ<C3BC>մϴ<D5B4>. )
|
|
|
|
|
|
if( CDnPartyTask::IsActive(GetRoom()) && !CDnPartyTask::GetInstance( GetRoom() ).IsSyncComplete() ) {
|
|
|
|
|
|
pSession->SendMoveItem(pPacket->cMoveType, pPacket->cSrcIndex, pPacket->cDestIndex, NULL, NULL, ERROR_ITEM_FAIL);
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
switch(pPacket->cMoveType)
|
|
|
|
|
|
{
|
|
|
|
|
|
case MoveType_Ware:
|
|
|
|
|
|
case MoveType_InvenToWare:
|
|
|
|
|
|
case MoveType_WareToInven:
|
|
|
|
|
|
{
|
|
|
|
|
|
if( pSession->GetItem()->OnRecvMoveItem( pPacket ) == true )
|
|
|
|
|
|
{
|
|
|
|
|
|
switch( pPacket->cMoveType )
|
|
|
|
|
|
{
|
|
|
|
|
|
case MoveType_InvenToWare:
|
|
|
|
|
|
{
|
|
|
|
|
|
if( pPacket->cSrcIndex != -1 )
|
|
|
|
|
|
RemoveInventoryItem( pSession, pPacket->cSrcIndex );
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
case MoveType_WareToInven:
|
|
|
|
|
|
{
|
|
|
|
|
|
if( pPacket->cDestIndex != -1 )
|
|
|
|
|
|
{
|
|
|
|
|
|
const TItem* pItemData = pSession->GetItem()->GetInventory( pPacket->cDestIndex );
|
|
|
|
|
|
if( pItemData && pItemData->nItemID > 0 )
|
|
|
|
|
|
{
|
|
|
|
|
|
CDnItem *pItem = CreateItem( pItemData );
|
|
|
|
|
|
InsertInventoryItem( pSession, pPacket->cDestIndex, pItem );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case MoveType_Equip:
|
|
|
|
|
|
{
|
|
|
|
|
|
if( pSession->GetActorHandle() && pSession->GetItem()->OnRecvMoveItem(pPacket) == true ) {
|
|
|
|
|
|
CDnPlayerActor *pActor = (CDnPlayerActor*)pSession->GetActorHandle().GetPointer();
|
|
|
|
|
|
if( pPacket->cSrcIndex != -1 ) {
|
|
|
|
|
|
if( pPacket->cSrcIndex < EQUIP_WEAPON1 )
|
|
|
|
|
|
pActor->DetachParts( (CDnParts::PartsTypeEnum)pPacket->cSrcIndex );
|
|
|
|
|
|
else
|
|
|
|
|
|
pActor->DetachWeapon( pPacket->cSrcIndex - EQUIP_WEAPON1 );
|
|
|
|
|
|
|
|
|
|
|
|
RemoveEquipItem( pSession, pPacket->cSrcIndex );
|
|
|
|
|
|
}
|
|
|
|
|
|
if( pPacket->cDestIndex != -1 ) {
|
|
|
|
|
|
if( pPacket->cDestIndex < EQUIP_WEAPON1 )
|
|
|
|
|
|
pActor->DetachParts( (CDnParts::PartsTypeEnum)pPacket->cDestIndex );
|
|
|
|
|
|
else
|
|
|
|
|
|
pActor->DetachWeapon( pPacket->cDestIndex - EQUIP_WEAPON1 );
|
|
|
|
|
|
|
|
|
|
|
|
RemoveEquipItem( pSession, pPacket->cDestIndex );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const TItem *pItemData = pSession->GetItem()->GetEquip( pPacket->cSrcIndex );
|
|
|
|
|
|
if( pItemData && pItemData->nItemID > 0 ) {
|
|
|
|
|
|
CDnItem *pItem = CreateItem( pItemData );
|
|
|
|
|
|
InsertEquipItem( pSession, pPacket->cSrcIndex, pItem );
|
|
|
|
|
|
|
|
|
|
|
|
if( pItem ) {
|
|
|
|
|
|
if( pPacket->cSrcIndex < EQUIP_WEAPON1 ) {
|
|
|
|
|
|
if( pItem->GetItemType() == ITEMTYPE_PARTS )
|
|
|
|
|
|
pActor->AttachParts( ((CDnParts*)pItem)->GetMySmartPtr(), (CDnParts::PartsTypeEnum)pPacket->cSrcIndex );
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
if( pItem->GetItemType() == ITEMTYPE_WEAPON )
|
|
|
|
|
|
pActor->AttachWeapon( ((CDnWeapon*)pItem)->GetMySmartPtr(), pPacket->cSrcIndex - EQUIP_WEAPON1 );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pItemData = pSession->GetItem()->GetEquip( pPacket->cDestIndex );
|
|
|
|
|
|
if( pItemData && pItemData->nItemID > 0 ) {
|
|
|
|
|
|
CDnItem *pItem = CreateItem( pItemData );
|
|
|
|
|
|
InsertEquipItem( pSession, pPacket->cDestIndex, pItem );
|
|
|
|
|
|
|
|
|
|
|
|
if( pItem ) {
|
|
|
|
|
|
if( pPacket->cDestIndex < EQUIP_WEAPON1 ) {
|
|
|
|
|
|
if( pItem->GetItemType() == ITEMTYPE_PARTS )
|
|
|
|
|
|
pActor->AttachParts( ((CDnParts*)pItem)->GetMySmartPtr(), (CDnParts::PartsTypeEnum)pPacket->cDestIndex );
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
if( pItem->GetItemType() == ITEMTYPE_WEAPON )
|
|
|
|
|
|
pActor->AttachWeapon( ((CDnWeapon*)pItem)->GetMySmartPtr(), pPacket->cDestIndex - EQUIP_WEAPON1 );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pActor->RefreshState();
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
case MoveType_Inven:
|
|
|
|
|
|
{
|
|
|
|
|
|
if( pSession->GetItem()->OnRecvMoveItem(pPacket) == true ) {
|
|
|
|
|
|
if( pPacket->cSrcIndex != -1 ) RemoveInventoryItem( pSession, pPacket->cSrcIndex );
|
|
|
|
|
|
if( pPacket->cDestIndex != -1 ) RemoveInventoryItem( pSession, pPacket->cDestIndex );
|
|
|
|
|
|
|
|
|
|
|
|
const TItem *pItemData = pSession->GetItem()->GetInventory( pPacket->cSrcIndex );
|
|
|
|
|
|
if( pItemData && pItemData->nItemID > 0 ) {
|
|
|
|
|
|
CDnItem *pItem = CreateItem( pItemData );
|
|
|
|
|
|
InsertInventoryItem( pSession, pPacket->cSrcIndex, pItem );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pItemData = pSession->GetItem()->GetInventory( pPacket->cDestIndex );
|
|
|
|
|
|
if( pItemData && pItemData->nItemID > 0 ) {
|
|
|
|
|
|
CDnItem *pItem = CreateItem( pItemData );
|
|
|
|
|
|
InsertInventoryItem( pSession, pPacket->cDestIndex, pItem );
|
|
|
|
|
|
}
|
|
|
|
|
|
} else
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MoveType_QuestInven:
|
|
|
|
|
|
{
|
|
|
|
|
|
if( pSession->GetItem()->OnRecvMoveItem(pPacket) == true ) {
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MoveType_EquipToInven:
|
|
|
|
|
|
{
|
|
|
|
|
|
if( pSession->GetActorHandle() && pSession->GetItem()->OnRecvMoveItem(pPacket) == true ) {
|
|
|
|
|
|
CDnPlayerActor *pActor = (CDnPlayerActor*)pSession->GetActorHandle().GetPointer();
|
|
|
|
|
|
if( pPacket->cSrcIndex != -1 ) {
|
|
|
|
|
|
if( pPacket->cSrcIndex < EQUIP_WEAPON1 )
|
|
|
|
|
|
pActor->DetachParts( (CDnParts::PartsTypeEnum)pPacket->cSrcIndex );
|
|
|
|
|
|
else
|
|
|
|
|
|
pActor->DetachWeapon( pPacket->cSrcIndex - EQUIP_WEAPON1 );
|
|
|
|
|
|
|
|
|
|
|
|
RemoveEquipItem( pSession, pPacket->cSrcIndex );
|
|
|
|
|
|
}
|
|
|
|
|
|
if( pPacket->cDestIndex != -1 ) {
|
|
|
|
|
|
RemoveInventoryItem( pSession, pPacket->cDestIndex );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const TItem *pItemData = pSession->GetItem()->GetEquip( pPacket->cSrcIndex );
|
|
|
|
|
|
if( pItemData && pItemData->nItemID > 0 ) {
|
|
|
|
|
|
CDnItem *pItem = CreateItem( pItemData );
|
|
|
|
|
|
InsertEquipItem( pSession, pPacket->cSrcIndex, pItem );
|
|
|
|
|
|
|
|
|
|
|
|
if( pItem ) {
|
|
|
|
|
|
if( pPacket->cSrcIndex < EQUIP_WEAPON1 ) {
|
|
|
|
|
|
if( pItem->GetItemType() == ITEMTYPE_PARTS )
|
|
|
|
|
|
pActor->AttachParts( ((CDnParts*)pItem)->GetMySmartPtr(), (CDnParts::PartsTypeEnum)pPacket->cSrcIndex );
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
if( pItem->GetItemType() == ITEMTYPE_WEAPON )
|
|
|
|
|
|
pActor->AttachWeapon( ((CDnWeapon*)pItem)->GetMySmartPtr(), pPacket->cSrcIndex - EQUIP_WEAPON1 );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pItemData = pSession->GetItem()->GetInventory( pPacket->cDestIndex );
|
|
|
|
|
|
if( pItemData && pItemData->nItemID > 0 ) {
|
|
|
|
|
|
CDnItem *pItem = CreateItem( pItemData );
|
|
|
|
|
|
InsertInventoryItem( pSession, pPacket->cDestIndex, pItem );
|
|
|
|
|
|
}
|
|
|
|
|
|
pActor->RefreshState();
|
|
|
|
|
|
} else
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MoveType_InvenToEquip:
|
|
|
|
|
|
{
|
|
|
|
|
|
if( pSession->GetActorHandle() && pSession->GetItem()->OnRecvMoveItem(pPacket) == true ) {
|
|
|
|
|
|
CDnPlayerActor *pActor = (CDnPlayerActor*)pSession->GetActorHandle().GetPointer();
|
|
|
|
|
|
|
|
|
|
|
|
if( pPacket->cSrcIndex != -1 ) {
|
|
|
|
|
|
RemoveInventoryItem( pSession, pPacket->cSrcIndex );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if( pPacket->cDestIndex != -1 ) {
|
|
|
|
|
|
if( pPacket->cDestIndex < EQUIP_WEAPON1 )
|
|
|
|
|
|
pActor->DetachParts( (CDnParts::PartsTypeEnum)pPacket->cDestIndex );
|
|
|
|
|
|
else
|
|
|
|
|
|
pActor->DetachWeapon( pPacket->cDestIndex - EQUIP_WEAPON1 );
|
|
|
|
|
|
|
|
|
|
|
|
RemoveEquipItem( pSession, pPacket->cDestIndex );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const TItem *pItemData = pSession->GetItem()->GetInventory( pPacket->cSrcIndex );
|
|
|
|
|
|
if( pItemData && pItemData->nItemID > 0 ) {
|
|
|
|
|
|
CDnItem *pItem = CreateItem( pItemData );
|
|
|
|
|
|
InsertInventoryItem( pSession, pPacket->cSrcIndex, pItem );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pItemData = pSession->GetItem()->GetEquip( pPacket->cDestIndex );
|
|
|
|
|
|
if( pItemData && pItemData->nItemID > 0 ) {
|
|
|
|
|
|
CDnItem *pItem = CreateItem( pItemData );
|
|
|
|
|
|
InsertEquipItem( pSession, pPacket->cDestIndex, pItem );
|
|
|
|
|
|
|
|
|
|
|
|
if( pItem ) {
|
|
|
|
|
|
if( pPacket->cDestIndex < EQUIP_WEAPON1 ) {
|
|
|
|
|
|
if( pItem->GetItemType() == ITEMTYPE_PARTS )
|
|
|
|
|
|
pActor->AttachParts( ((CDnParts*)pItem)->GetMySmartPtr(), (CDnParts::PartsTypeEnum)pPacket->cDestIndex );
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
if( pItem->GetItemType() == ITEMTYPE_WEAPON )
|
|
|
|
|
|
pActor->AttachWeapon( ((CDnWeapon*)pItem)->GetMySmartPtr(), pPacket->cDestIndex - EQUIP_WEAPON1 );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
pActor->RefreshState();
|
|
|
|
|
|
} else
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case MoveType_Glyph:
|
|
|
|
|
|
{
|
|
|
|
|
|
if( pSession->GetActorHandle() )
|
|
|
|
|
|
pSession->GetItem()->OnRecvMoveItem(pPacket);
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case MoveType_GlyphToInven:
|
|
|
|
|
|
{
|
|
|
|
|
|
if( pSession->GetActorHandle() )
|
|
|
|
|
|
pSession->GetItem()->OnRecvMoveItem(pPacket);
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case MoveType_InvenToGlyph:
|
|
|
|
|
|
{
|
|
|
|
|
|
if( pSession->GetActorHandle() && pSession->GetItem()->OnRecvMoveItem(pPacket) == true ) {
|
|
|
|
|
|
CDnPlayerActor *pActor = (CDnPlayerActor*)pSession->GetActorHandle().GetPointer();
|
|
|
|
|
|
|
|
|
|
|
|
if( pPacket->cSrcIndex != -1 ) {
|
|
|
|
|
|
RemoveInventoryItem( pSession, pPacket->cSrcIndex );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if( pPacket->cDestIndex != -1 ) {
|
|
|
|
|
|
pActor->DetachGlyph( (CDnGlyph::GlyphSlotEnum)pPacket->cDestIndex );
|
|
|
|
|
|
|
|
|
|
|
|
RemoveGlyphItem( pSession, pPacket->cDestIndex );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const TItem *pItemData = pSession->GetItem()->GetInventory( pPacket->cSrcIndex );
|
|
|
|
|
|
if( pItemData && pItemData->nItemID > 0 ) {
|
|
|
|
|
|
CDnItem *pItem = CreateItem( pItemData );
|
|
|
|
|
|
InsertInventoryItem( pSession, pPacket->cSrcIndex, pItem );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pItemData = pSession->GetItem()->GetGlyph( pPacket->cDestIndex );
|
|
|
|
|
|
if( pItemData && pItemData->nItemID > 0 ) {
|
|
|
|
|
|
CDnItem *pItem = CreateItem( pItemData );
|
|
|
|
|
|
InsertGlyphItem( pSession, pPacket->cDestIndex, pItem );
|
|
|
|
|
|
|
|
|
|
|
|
if( pItem ) {
|
|
|
|
|
|
pActor->AttachGlyph( ((CDnGlyph*)pItem)->GetMySmartPtr(), (CDnGlyph::GlyphSlotEnum)pPacket->cDestIndex );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
pActor->RefreshState();
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
#if defined(PRE_ADD_TALISMAN_SYSTEM)
|
|
|
|
|
|
case MoveType_Talisman:
|
|
|
|
|
|
{
|
|
|
|
|
|
if( pSession->GetActorHandle() && pSession->GetItem()->OnRecvMoveItem(pPacket) == true )
|
|
|
|
|
|
{
|
|
|
|
|
|
CDnPlayerActor *pActor = (CDnPlayerActor*)pSession->GetActorHandle().GetPointer();
|
|
|
|
|
|
if( pPacket->cSrcIndex != -1 )
|
|
|
|
|
|
{
|
|
|
|
|
|
pActor->DetachTalisman( pPacket->cSrcIndex );
|
|
|
|
|
|
RemoveTalismanItem( pSession, pPacket->cSrcIndex );
|
|
|
|
|
|
}
|
|
|
|
|
|
if( pPacket->cDestIndex != -1 )
|
|
|
|
|
|
{
|
|
|
|
|
|
pActor->DetachTalisman( pPacket->cDestIndex );
|
|
|
|
|
|
RemoveTalismanItem( pSession, pPacket->cDestIndex );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const TItem *pItemData = pSession->GetItem()->GetTalisman( pPacket->cSrcIndex );
|
|
|
|
|
|
if( pItemData && pItemData->nItemID > 0 ) {
|
|
|
|
|
|
CDnItem *pItem = CreateItem( pItemData );
|
|
|
|
|
|
|
|
|
|
|
|
if( pItem ) pActor->AttachTalisman(((CDnTalisman*)pItem)->GetMySmartPtr(), pPacket->cSrcIndex, g_pDataManager->GetTalismanSlotEfficiency(pPacket->cSrcIndex));
|
|
|
|
|
|
InsertTalismanItem( pSession, pPacket->cSrcIndex, pItem );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pItemData = pSession->GetItem()->GetTalisman( pPacket->cDestIndex );
|
|
|
|
|
|
if( pItemData && pItemData->nItemID > 0 ) {
|
|
|
|
|
|
CDnItem *pItem = CreateItem( pItemData );
|
|
|
|
|
|
|
|
|
|
|
|
if( pItem ) pActor->AttachTalisman(((CDnTalisman*)pItem)->GetMySmartPtr(), pPacket->cDestIndex, g_pDataManager->GetTalismanSlotEfficiency(pPacket->cDestIndex));
|
|
|
|
|
|
InsertTalismanItem( pSession, pPacket->cDestIndex, pItem );
|
|
|
|
|
|
}
|
|
|
|
|
|
pActor->RefreshState();
|
|
|
|
|
|
} else
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MoveType_TalismanToInven:
|
|
|
|
|
|
{
|
|
|
|
|
|
if( pSession->GetActorHandle() && pSession->GetItem()->OnRecvMoveItem(pPacket) == true ) {
|
|
|
|
|
|
CDnPlayerActor *pActor = (CDnPlayerActor*)pSession->GetActorHandle().GetPointer();
|
|
|
|
|
|
pActor->DetachTalisman( pPacket->cSrcIndex );
|
|
|
|
|
|
RemoveTalismanItem( pSession, pPacket->cSrcIndex );
|
|
|
|
|
|
|
|
|
|
|
|
const TItem *pItemData = pSession->GetItem()->GetInventory( pPacket->cDestIndex );
|
|
|
|
|
|
if( pItemData && pItemData->nItemID > 0 ) {
|
|
|
|
|
|
CDnItem *pItem = CreateItem( pItemData );
|
|
|
|
|
|
InsertInventoryItem( pSession, pPacket->cDestIndex, pItem );
|
|
|
|
|
|
}
|
|
|
|
|
|
pActor->RefreshState();
|
|
|
|
|
|
} else
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MoveType_InvenToTalisman:
|
|
|
|
|
|
{
|
|
|
|
|
|
if( pSession->GetActorHandle() && pSession->GetItem()->OnRecvMoveItem(pPacket) == true ) {
|
|
|
|
|
|
CDnPlayerActor *pActor = (CDnPlayerActor*)pSession->GetActorHandle().GetPointer();
|
|
|
|
|
|
|
|
|
|
|
|
if( pPacket->cSrcIndex != -1 ) {
|
|
|
|
|
|
RemoveInventoryItem( pSession, pPacket->cSrcIndex );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const TItem *pItemData = pSession->GetItem()->GetTalisman( pPacket->cDestIndex );
|
|
|
|
|
|
if( pItemData && pItemData->nItemID > 0 ) {
|
|
|
|
|
|
CDnItem *pItem = CreateItem( pItemData );
|
|
|
|
|
|
InsertTalismanItem( pSession, pPacket->cDestIndex, pItem );
|
|
|
|
|
|
if( pItem ) pActor->AttachTalisman( ((CDnTalisman*)pItem)->GetMySmartPtr(), pPacket->cDestIndex, g_pDataManager->GetTalismanSlotEfficiency(pPacket->cDestIndex) );
|
|
|
|
|
|
}
|
|
|
|
|
|
pActor->RefreshState();
|
|
|
|
|
|
} else
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return ERROR_UNKNOWN_HEADER;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CDnItemTask::OnRecvItemMoveCashItem( CDNUserSession * pSession, CSMoveCashItem *pPacket, int nLen )
|
|
|
|
|
|
{
|
|
|
|
|
|
if (sizeof(CSMoveCashItem) != nLen)
|
|
|
|
|
|
return ERROR_INVALIDPACKET;
|
|
|
|
|
|
if (!pSession->IsNoneWindowState())
|
|
|
|
|
|
{
|
|
|
|
|
|
int nRet = ERROR_ITEM_FAIL;
|
|
|
|
|
|
|
|
|
|
|
|
switch(pPacket->cMoveType)
|
|
|
|
|
|
{
|
|
|
|
|
|
case MoveType_CashEquipToCashInven: nRet = ERROR_ITEM_EQUIPTOINVEN_FAIL; break;
|
|
|
|
|
|
case MoveType_CashInvenToCashEquip: nRet = ERROR_ITEM_INVENTOEQUIP_FAIL; break;
|
|
|
|
|
|
|
|
|
|
|
|
case MoveType_VehicleBodyToVehicleInven:
|
|
|
|
|
|
case MoveType_VehicleInvenToVehicleBody:
|
|
|
|
|
|
case MoveType_VehiclePartsToCashInven:
|
|
|
|
|
|
case MoveType_CashInvenToVehicleParts:
|
|
|
|
|
|
nRet = ERROR_ITEM_INVENTOEQUIP_FAIL;
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case MoveType_PetInvenToPetBody:
|
|
|
|
|
|
{
|
|
|
|
|
|
nRet = ERROR_CANT_RECALL_PET_STATUS;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
pSession->SendMoveCashItem(pPacket->cMoveType, pPacket->cCashEquipIndex, NULL, pPacket->biCashInvenSerial, NULL, nRet);
|
|
|
|
|
|
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
// SyncWait <20><><EFBFBD>¿<EFBFBD><C2BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD><CCB5><EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD>մϴ<D5B4>. ( Ŭ<><EFBFBD><F3BFA1BC><EFBFBD> <20>ѹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ѹ<EFBFBD><D1B9><EFBFBD> üũ<C3BC>մϴ<D5B4>. )
|
|
|
|
|
|
if( CDnPartyTask::IsActive(GetRoom()) && !CDnPartyTask::GetInstance( GetRoom() ).IsSyncComplete() ) {
|
|
|
|
|
|
pSession->SendMoveCashItem(pPacket->cMoveType, pPacket->cCashEquipIndex, NULL, pPacket->biCashInvenSerial, NULL, ERROR_ITEM_FAIL);
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
switch(pPacket->cMoveType)
|
|
|
|
|
|
{
|
|
|
|
|
|
case MoveType_CashEquip:
|
|
|
|
|
|
{
|
|
|
|
|
|
if (pSession->GetActorHandle())
|
|
|
|
|
|
pSession->GetItem()->OnRecvMoveCashItem(pPacket);
|
|
|
|
|
|
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case MoveType_CashInven:
|
|
|
|
|
|
{
|
|
|
|
|
|
if (pSession->GetActorHandle())
|
|
|
|
|
|
pSession->GetItem()->OnRecvMoveCashItem(pPacket);
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case MoveType_CashEquipToCashInven:
|
|
|
|
|
|
{
|
|
|
|
|
|
const TItem *pBeforeEquip = pSession->GetItem()->GetCashEquip( pPacket->cCashEquipIndex );
|
|
|
|
|
|
INT64 biEquipSerial = (pBeforeEquip == NULL) ? 0 : pBeforeEquip->nSerial;
|
|
|
|
|
|
|
|
|
|
|
|
if( pSession->GetActorHandle() && pSession->GetItem()->OnRecvMoveCashItem(pPacket) == true ) {
|
|
|
|
|
|
CDnPlayerActor *pActor = (CDnPlayerActor*)pSession->GetActorHandle().GetPointer();
|
|
|
|
|
|
if( pPacket->cCashEquipIndex != -1 ) {
|
|
|
|
|
|
if( pPacket->cCashEquipIndex < CASHEQUIP_WEAPON1 )
|
|
|
|
|
|
pActor->DetachCashParts( (CDnParts::PartsTypeEnum)pPacket->cCashEquipIndex );
|
|
|
|
|
|
else if(pPacket->cCashEquipIndex == CASHEQUIP_WEAPON1 || pPacket->cCashEquipIndex == CASHEQUIP_WEAPON2)
|
|
|
|
|
|
{
|
|
|
|
|
|
pActor->DetachCashWeapon( pPacket->cCashEquipIndex - CASHEQUIP_WEAPON1 );
|
|
|
|
|
|
}
|
|
|
|
|
|
// <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD> <20><>Ţ <20><><EFBFBD><EFBFBD>ġ
|
|
|
|
|
|
else if(pPacket->cCashEquipIndex == CASHEQUIP_EFFECT)
|
|
|
|
|
|
{
|
|
|
|
|
|
pActor->SetVehicleEffectIndex(0);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
RemoveCashEquipItem( pSession, pPacket->cCashEquipIndex );
|
|
|
|
|
|
}
|
|
|
|
|
|
if( pPacket->biCashInvenSerial > 0 ) {
|
|
|
|
|
|
RemoveCashInventoryItem( pSession, pPacket->biCashInvenSerial );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const TItem *pEquip = pSession->GetItem()->GetCashEquip( pPacket->cCashEquipIndex );
|
|
|
|
|
|
if( pEquip && pEquip->nItemID > 0 ) {
|
|
|
|
|
|
CDnItem *pItem = CreateItem( pEquip );
|
|
|
|
|
|
InsertCashEquipItem( pSession, pPacket->cCashEquipIndex, pItem );
|
|
|
|
|
|
|
|
|
|
|
|
if( pItem ) {
|
|
|
|
|
|
if( pPacket->cCashEquipIndex < CASHEQUIP_WEAPON1 ) {
|
|
|
|
|
|
if( pItem->GetItemType() == ITEMTYPE_PARTS )
|
|
|
|
|
|
pActor->AttachCashParts( ((CDnParts*)pItem)->GetMySmartPtr(), (CDnParts::PartsTypeEnum)pPacket->cCashEquipIndex );
|
|
|
|
|
|
}
|
|
|
|
|
|
else if(pPacket->cCashEquipIndex == CASHEQUIP_WEAPON1 || pPacket->cCashEquipIndex == CASHEQUIP_WEAPON2)
|
|
|
|
|
|
{
|
|
|
|
|
|
if( pItem->GetItemType() == ITEMTYPE_WEAPON )
|
|
|
|
|
|
pActor->AttachCashWeapon( ((CDnWeapon*)pItem)->GetMySmartPtr(), pPacket->cCashEquipIndex - CASHEQUIP_WEAPON1 );
|
|
|
|
|
|
}
|
|
|
|
|
|
// <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD> <20><>Ţ <20><><EFBFBD><EFBFBD>ġ
|
|
|
|
|
|
else if(pPacket->cCashEquipIndex == CASHEQUIP_EFFECT)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(pItem->GetItemType() == ITEMTYPE_VEHICLEEFFECT)
|
|
|
|
|
|
pActor->SetVehicleEffectIndex(pItem->GetClassID());
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const TItem *pInven = pSession->GetItem()->GetCashInventory( biEquipSerial );
|
|
|
|
|
|
if( pInven && pInven->nItemID > 0 ) {
|
|
|
|
|
|
CDnItem *pItem = CreateItem( pInven );
|
|
|
|
|
|
InsertCashInventoryItem( pSession, pInven->nSerial, pItem );
|
|
|
|
|
|
}
|
|
|
|
|
|
pActor->RefreshState();
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case MoveType_CashInvenToCashEquip:
|
|
|
|
|
|
{
|
|
|
|
|
|
const TItem *pBeforeEquip = pSession->GetItem()->GetCashEquip( pPacket->cCashEquipIndex );
|
|
|
|
|
|
INT64 biSerial = (pBeforeEquip && (pBeforeEquip->nSerial > 0)) ? pBeforeEquip->nSerial : pPacket->biCashInvenSerial;
|
|
|
|
|
|
|
|
|
|
|
|
if( pSession->GetActorHandle() && pSession->GetItem()->OnRecvMoveCashItem(pPacket) == true ) {
|
|
|
|
|
|
CDnPlayerActor *pActor = (CDnPlayerActor*)pSession->GetActorHandle().GetPointer();
|
|
|
|
|
|
|
|
|
|
|
|
if( pPacket->biCashInvenSerial > 0 ) {
|
|
|
|
|
|
RemoveCashInventoryItem( pSession, pPacket->biCashInvenSerial );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if( pPacket->cCashEquipIndex != -1 ) {
|
|
|
|
|
|
if( pPacket->cCashEquipIndex < CASHEQUIP_WEAPON1 )
|
|
|
|
|
|
pActor->DetachCashParts( (CDnParts::PartsTypeEnum)pPacket->cCashEquipIndex );
|
|
|
|
|
|
else if(pPacket->cCashEquipIndex == CASHEQUIP_WEAPON1 || pPacket->cCashEquipIndex == CASHEQUIP_WEAPON2)
|
|
|
|
|
|
{
|
|
|
|
|
|
pActor->DetachCashWeapon( pPacket->cCashEquipIndex - CASHEQUIP_WEAPON1 );
|
|
|
|
|
|
}
|
|
|
|
|
|
// <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD> <20><>Ţ <20><><EFBFBD><EFBFBD>ġ
|
|
|
|
|
|
else if(pPacket->cCashEquipIndex == CASHEQUIP_EFFECT)
|
|
|
|
|
|
{
|
|
|
|
|
|
pActor->SetVehicleEffectIndex(0);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
RemoveCashEquipItem( pSession, pPacket->cCashEquipIndex );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const TItem *pInven = pSession->GetItem()->GetCashInventory( biSerial );
|
|
|
|
|
|
if( pInven && pInven->nItemID > 0 ) {
|
|
|
|
|
|
CDnItem *pItem = CreateItem( pInven );
|
|
|
|
|
|
InsertCashInventoryItem( pSession, pPacket->biCashInvenSerial, pItem );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const TItem *pEquip = pSession->GetItem()->GetCashEquip( pPacket->cCashEquipIndex );
|
|
|
|
|
|
if( pEquip && pEquip->nItemID > 0 ) {
|
|
|
|
|
|
CDnItem *pItem = CreateItem( pEquip );
|
|
|
|
|
|
InsertCashEquipItem( pSession, pPacket->cCashEquipIndex, pItem );
|
|
|
|
|
|
|
|
|
|
|
|
if( pItem ) {
|
|
|
|
|
|
if( pPacket->cCashEquipIndex < CASHEQUIP_WEAPON1 ) {
|
|
|
|
|
|
if( pItem->GetItemType() == ITEMTYPE_PARTS )
|
|
|
|
|
|
pActor->AttachCashParts( ((CDnParts*)pItem)->GetMySmartPtr(), (CDnParts::PartsTypeEnum)pPacket->cCashEquipIndex );
|
|
|
|
|
|
}
|
|
|
|
|
|
else if(pPacket->cCashEquipIndex == CASHEQUIP_WEAPON1 || pPacket->cCashEquipIndex == CASHEQUIP_WEAPON2)
|
|
|
|
|
|
{
|
|
|
|
|
|
if( pItem->GetItemType() == ITEMTYPE_WEAPON )
|
|
|
|
|
|
pActor->AttachCashWeapon( ((CDnWeapon*)pItem)->GetMySmartPtr(), pPacket->cCashEquipIndex - CASHEQUIP_WEAPON1 );
|
|
|
|
|
|
}
|
|
|
|
|
|
// <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD> <20><>Ţ <20><><EFBFBD><EFBFBD>ġ
|
|
|
|
|
|
else if(pPacket->cCashEquipIndex == CASHEQUIP_EFFECT)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(pItem->GetItemType() == ITEMTYPE_VEHICLEEFFECT)
|
|
|
|
|
|
pActor->SetVehicleEffectIndex(pItem->GetClassID());
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
pActor->RefreshState();
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case MoveType_CashGlyph:
|
|
|
|
|
|
{
|
|
|
|
|
|
if (pSession->GetActorHandle())
|
|
|
|
|
|
pSession->GetItem()->OnRecvMoveCashItem(pPacket);
|
|
|
|
|
|
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case MoveType_CashGlyphToCashInven:
|
|
|
|
|
|
{
|
|
|
|
|
|
const TItem *pBeforeGlyph = pSession->GetItem()->GetGlyph( pPacket->cCashEquipIndex );
|
|
|
|
|
|
INT64 biGlyphSerial = (pBeforeGlyph == NULL) ? 0 : pBeforeGlyph->nSerial;
|
|
|
|
|
|
|
|
|
|
|
|
if( pSession->GetActorHandle() && pSession->GetItem()->OnRecvMoveCashItem(pPacket) == true ) {
|
|
|
|
|
|
CDnPlayerActor *pActor = (CDnPlayerActor*)pSession->GetActorHandle().GetPointer();
|
|
|
|
|
|
if( pPacket->cCashEquipIndex != -1 ) {
|
|
|
|
|
|
pActor->DetachGlyph( (CDnGlyph::GlyphSlotEnum)pPacket->cCashEquipIndex );
|
|
|
|
|
|
|
|
|
|
|
|
RemoveGlyphItem( pSession, pPacket->cCashEquipIndex );
|
|
|
|
|
|
}
|
|
|
|
|
|
if( pPacket->biCashInvenSerial > 0 ) {
|
|
|
|
|
|
RemoveCashInventoryItem( pSession, pPacket->biCashInvenSerial );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const TItem *pEquip = pSession->GetItem()->GetGlyph( pPacket->cCashEquipIndex );
|
|
|
|
|
|
if( pEquip && pEquip->nItemID > 0 ) {
|
|
|
|
|
|
CDnItem *pItem = CreateItem( pEquip );
|
|
|
|
|
|
InsertGlyphItem( pSession, pPacket->cCashEquipIndex, pItem );
|
|
|
|
|
|
|
|
|
|
|
|
if( pItem ) {
|
|
|
|
|
|
pActor->AttachGlyph( ((CDnGlyph*)pItem)->GetMySmartPtr(), (CDnGlyph::GlyphSlotEnum)pPacket->cCashEquipIndex );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const TItem *pInven = pSession->GetItem()->GetCashInventory( biGlyphSerial );
|
|
|
|
|
|
if( pInven && pInven->nItemID > 0 ) {
|
|
|
|
|
|
CDnItem *pItem = CreateItem( pInven );
|
|
|
|
|
|
InsertCashInventoryItem( pSession, pInven->nSerial, pItem );
|
|
|
|
|
|
}
|
|
|
|
|
|
pActor->RefreshState();
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case MoveType_CashInvenToCashGlyph:
|
|
|
|
|
|
{
|
|
|
|
|
|
const TItem *pBeforeGlyph = pSession->GetItem()->GetGlyph( pPacket->cCashEquipIndex );
|
|
|
|
|
|
INT64 biSerial = (pBeforeGlyph && (pBeforeGlyph->nSerial > 0)) ? pBeforeGlyph->nSerial : pPacket->biCashInvenSerial;
|
|
|
|
|
|
|
|
|
|
|
|
if( pSession->GetActorHandle() && pSession->GetItem()->OnRecvMoveCashItem(pPacket) == true ) {
|
|
|
|
|
|
CDnPlayerActor *pActor = (CDnPlayerActor*)pSession->GetActorHandle().GetPointer();
|
|
|
|
|
|
|
|
|
|
|
|
if( pPacket->biCashInvenSerial > 0 ) {
|
|
|
|
|
|
RemoveCashInventoryItem( pSession, pPacket->biCashInvenSerial );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if( pPacket->cCashEquipIndex != -1 ) {
|
|
|
|
|
|
pActor->DetachGlyph( (CDnGlyph::GlyphSlotEnum)pPacket->cCashEquipIndex );
|
|
|
|
|
|
|
|
|
|
|
|
RemoveGlyphItem( pSession, pPacket->cCashEquipIndex );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const TItem *pInven = pSession->GetItem()->GetCashInventory( biSerial );
|
|
|
|
|
|
if( pInven && pInven->nItemID > 0 ) {
|
|
|
|
|
|
CDnItem *pItem = CreateItem( pInven );
|
|
|
|
|
|
InsertCashInventoryItem( pSession, pPacket->biCashInvenSerial, pItem );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const TItem *pEquip = pSession->GetItem()->GetGlyph( pPacket->cCashEquipIndex );
|
|
|
|
|
|
if( pEquip && pEquip->nItemID > 0 ) {
|
|
|
|
|
|
CDnItem *pItem = CreateItem( pEquip );
|
|
|
|
|
|
InsertGlyphItem( pSession, pPacket->cCashEquipIndex, pItem );
|
|
|
|
|
|
|
|
|
|
|
|
if( pItem ) {
|
|
|
|
|
|
pActor->AttachGlyph( ((CDnGlyph*)pItem)->GetMySmartPtr(), (CDnGlyph::GlyphSlotEnum)pPacket->cCashEquipIndex );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
pActor->RefreshState();
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
// Dungeon Ÿ<>Կ<EFBFBD><D4BF><EFBFBD><EFBFBD><EFBFBD> Ż<><C5BB><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰų<CFB0> , Ż<><C5BB> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ҽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> Dungeon <20><><EFBFBD>¶<EFBFBD><C2B6><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>صξ<D8B5><CEBE><EFBFBD><EFBFBD>ϴ<EFBFBD>.
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Dungeon<6F><6E><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD><CCB5>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̰<EFBFBD><CCB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD> <20>ϰ<EFBFBD><CFB0><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><EFBFBD><D7B7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ʰڽ<CAB0><DABD>ϴ<EFBFBD>.
|
|
|
|
|
|
|
|
|
|
|
|
case MoveType_VehicleBodyToVehicleInven:
|
|
|
|
|
|
{
|
|
|
|
|
|
TVehicle *pBeforeVehicleEquip = pSession->GetItem()->GetVehicleEquip();
|
|
|
|
|
|
INT64 biEquipSerial = (pBeforeVehicleEquip == NULL) ? 0 : pBeforeVehicleEquip->Vehicle[Vehicle::Slot::Body].nSerial;
|
|
|
|
|
|
|
|
|
|
|
|
if( pSession->GetActorHandle()) {
|
|
|
|
|
|
CDnPlayerActor *pActor = (CDnPlayerActor*)pSession->GetActorHandle().GetPointer();
|
|
|
|
|
|
if(!pActor)
|
|
|
|
|
|
return ERROR_ITEM_DONTMOVE; // <20>̷<EFBFBD><CCB7><EFBFBD> <20>ȵ˴ϴ<CBB4>.
|
|
|
|
|
|
|
|
|
|
|
|
CDnVehicleActor *pVehicleActor = pActor->GetMyVehicleActor();
|
|
|
|
|
|
if (!pVehicleActor || !pActor->IsVehicleMode()) return ERROR_ITEM_DONTMOVE; // <20><><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ°<CFB4><C2B0><EFBFBD> !!
|
|
|
|
|
|
|
|
|
|
|
|
if (pSession->GetItem()->OnRecvMoveCashItem(pPacket) != true) return ERROR_NONE;
|
|
|
|
|
|
|
|
|
|
|
|
if (pPacket->cCashEquipIndex != -1) {
|
|
|
|
|
|
for (int i = 0; i < Vehicle::Slot::Max; i++){
|
|
|
|
|
|
RemoveVehicleEquipItem(pSession, i);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if (pPacket->biCashInvenSerial > 0) {
|
|
|
|
|
|
RemoveVehicleInventoryItem(pSession, pPacket->biCashInvenSerial);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TVehicle *pEquipVehicle = pSession->GetItem()->GetVehicleEquip();
|
|
|
|
|
|
if (pEquipVehicle){
|
|
|
|
|
|
for (int i = 0; i < Vehicle::Slot::Max; i++){
|
|
|
|
|
|
if (pEquipVehicle->Vehicle[i].nItemID <= 0) continue;
|
|
|
|
|
|
CDnItem *pItem = CreateItem(&(pEquipVehicle->Vehicle[i]));
|
|
|
|
|
|
InsertVehicleEquipItem(pSession, pPacket->cCashEquipIndex, pItem);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const TItem *pInven = pSession->GetItem()->GetCashInventory(biEquipSerial);
|
|
|
|
|
|
if (pInven && pInven->nItemID > 0) {
|
|
|
|
|
|
CDnItem *pItem = CreateItem(pInven);
|
|
|
|
|
|
InsertCashInventoryItem(pSession, pInven->nSerial, pItem);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Rotha - <20>̰<EFBFBD><CCB0>쿡<EFBFBD><ECBFA1> Ż<><C5BB><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><DEBC><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>˴ϴ<CBB4>
|
|
|
|
|
|
pActor->UnRideVehicle();
|
|
|
|
|
|
pActor->RefreshState();
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case MoveType_VehicleInvenToVehicleBody:
|
|
|
|
|
|
{
|
|
|
|
|
|
TVehicle *pBeforeVehicleEquip = pSession->GetItem()->GetVehicleEquip();
|
|
|
|
|
|
INT64 biEquipSerial = (pBeforeVehicleEquip && (pBeforeVehicleEquip->Vehicle[Vehicle::Slot::Body].nSerial > 0)) ? pBeforeVehicleEquip->Vehicle[Vehicle::Slot::Body].nSerial : pPacket->biCashInvenSerial;
|
|
|
|
|
|
|
|
|
|
|
|
if (pSession->GetActorHandle()) {
|
|
|
|
|
|
CDnPlayerActor *pActor = (CDnPlayerActor*)pSession->GetActorHandle().GetPointer();
|
|
|
|
|
|
if(!pActor)
|
|
|
|
|
|
return ERROR_ITEM_DONTMOVE; // <20>̷<EFBFBD><CCB7><EFBFBD> <20>ȵ˴ϴ<CBB4>.
|
|
|
|
|
|
|
|
|
|
|
|
if (pActor->IsVehicleMode() && pActor->GetMyVehicleActor() )
|
|
|
|
|
|
pActor->UnRideVehicle();
|
|
|
|
|
|
|
|
|
|
|
|
if (pSession->GetItem()->OnRecvMoveCashItem(pPacket) != true) return ERROR_NONE;
|
|
|
|
|
|
|
|
|
|
|
|
if (pPacket->biCashInvenSerial > 0) {
|
|
|
|
|
|
RemoveVehicleInventoryItem(pSession, pPacket->biCashInvenSerial);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (pPacket->cCashEquipIndex != -1) {
|
|
|
|
|
|
RemoveVehicleEquipItem(pSession, pPacket->cCashEquipIndex);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const TItem *pInven = pSession->GetItem()->GetVehicleBodyInventory(biEquipSerial);
|
|
|
|
|
|
if (pInven) {
|
|
|
|
|
|
CDnItem *pItem = CreateItem(pInven);
|
|
|
|
|
|
InsertVehicleInventoryItem(pSession, pPacket->biCashInvenSerial, pItem);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TVehicle *pEquipVehicle = pSession->GetItem()->GetVehicleEquip();
|
|
|
|
|
|
|
|
|
|
|
|
if (pEquipVehicle) {
|
|
|
|
|
|
for (int i = 0; i < Vehicle::Slot::Max; i++){
|
|
|
|
|
|
if (pEquipVehicle->Vehicle[i].nItemID <= 0) continue;
|
|
|
|
|
|
CDnItem *pItem = CreateItem(&(pEquipVehicle->Vehicle[i]));
|
|
|
|
|
|
InsertVehicleEquipItem(pSession, pPacket->cCashEquipIndex, pItem);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Rotha - Ż<><C5BB><EFBFBD><EFBFBD> <20>¿<EFBFBD><C2BF>ϴ<EFBFBD>. //
|
|
|
|
|
|
pActor->RideVehicle(pEquipVehicle); // Tvehicle<6C><65> Ż<><C5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<CFB1><E2B6A7><EFBFBD><EFBFBD> Ż<><C5BB> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˾Ƽ<CBBE> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pActor->RefreshState();
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case MoveType_VehiclePartsToCashInven:
|
|
|
|
|
|
{
|
|
|
|
|
|
const TItem *pBeforeParts = pSession->GetItem()->GetVehiclePartsEquip( pPacket->cCashEquipIndex );
|
|
|
|
|
|
INT64 biPartsSerial = (pBeforeParts == NULL) ? 0 : pBeforeParts->nSerial;
|
|
|
|
|
|
|
|
|
|
|
|
if (pSession->GetActorHandle()) {
|
|
|
|
|
|
CDnPlayerActor *pActor = (CDnPlayerActor*)pSession->GetActorHandle().GetPointer();
|
|
|
|
|
|
if(!pActor)
|
|
|
|
|
|
return ERROR_ITEM_DONTMOVE; // <20>̷<EFBFBD><CCB7><EFBFBD> <20>ȵ˴ϴ<CBB4>.
|
|
|
|
|
|
|
|
|
|
|
|
CDnVehicleActor *pVehicleActor = pActor->GetMyVehicleActor();
|
|
|
|
|
|
if (!pVehicleActor || !pActor->IsVehicleMode()) return ERROR_ITEM_DONTMOVE; // Rotha - Ż<><C5BB> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ż<><C5BB><EFBFBD><EFBFBD> ź<><C5BA><EFBFBD>¿<EFBFBD><C2BF><EFBFBD> <20>۵<EFBFBD> <20>մϴ<D5B4>.
|
|
|
|
|
|
|
|
|
|
|
|
if (pSession->GetItem()->OnRecvMoveCashItem(pPacket) != true) return ERROR_NONE;
|
|
|
|
|
|
|
|
|
|
|
|
if( pPacket->cCashEquipIndex != -1 ) {
|
|
|
|
|
|
pVehicleActor->UnEquipItem(pPacket->cCashEquipIndex); // Rotha - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
RemoveVehicleEquipItem( pSession, pPacket->cCashEquipIndex );
|
|
|
|
|
|
}
|
|
|
|
|
|
if( pPacket->biCashInvenSerial > 0 ) {
|
|
|
|
|
|
RemoveCashInventoryItem( pSession, pPacket->biCashInvenSerial );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const TItem *pParts = pSession->GetItem()->GetVehiclePartsEquip( pPacket->cCashEquipIndex );
|
|
|
|
|
|
if( pParts && pParts->nItemID > 0 ) {
|
|
|
|
|
|
CDnItem *pItem = CreateItem( pParts );
|
|
|
|
|
|
InsertVehicleEquipItem( pSession, pPacket->cCashEquipIndex, pItem );
|
|
|
|
|
|
|
|
|
|
|
|
if( pItem )
|
|
|
|
|
|
pVehicleActor->EquipItem(*pParts); // Rotha - <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const TItem *pInven = pSession->GetItem()->GetCashInventory( biPartsSerial );
|
|
|
|
|
|
if( pInven && pInven->nItemID > 0 ) {
|
|
|
|
|
|
CDnItem *pItem = CreateItem( pInven );
|
|
|
|
|
|
InsertCashInventoryItem( pSession, pInven->nSerial, pItem );
|
|
|
|
|
|
}
|
|
|
|
|
|
pActor->RefreshState();
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case MoveType_CashInvenToVehicleParts:
|
|
|
|
|
|
{
|
|
|
|
|
|
const TItem *pBeforeParts = pSession->GetItem()->GetVehiclePartsEquip( pPacket->cCashEquipIndex );
|
|
|
|
|
|
INT64 biSerial = (pBeforeParts && (pBeforeParts->nSerial > 0)) ? pBeforeParts->nSerial : pPacket->biCashInvenSerial;
|
|
|
|
|
|
|
|
|
|
|
|
if( pSession->GetActorHandle()) {
|
|
|
|
|
|
CDnPlayerActor *pActor = (CDnPlayerActor*)pSession->GetActorHandle().GetPointer();
|
|
|
|
|
|
if(!pActor)
|
|
|
|
|
|
return ERROR_ITEM_DONTMOVE; // <20>̷<EFBFBD><CCB7><EFBFBD> <20>ȵ˴ϴ<CBB4>.
|
|
|
|
|
|
|
|
|
|
|
|
CDnVehicleActor *pVehicleActor = pActor->GetMyVehicleActor();
|
|
|
|
|
|
if (!pVehicleActor || !pActor->IsVehicleMode()) return ERROR_ITEM_DONTMOVE; // Rotha - ź <20><><EFBFBD>¿<EFBFBD><C2BF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
if (pSession->GetItem()->OnRecvMoveCashItem(pPacket) != true) return ERROR_NONE;
|
|
|
|
|
|
|
|
|
|
|
|
if( pPacket->biCashInvenSerial > 0 ) {
|
|
|
|
|
|
RemoveCashInventoryItem( pSession, pPacket->biCashInvenSerial );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if( pPacket->cCashEquipIndex != -1 ) {
|
|
|
|
|
|
pVehicleActor->UnEquipItem(pPacket->cCashEquipIndex); // Rotha - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
RemoveVehicleEquipItem( pSession, pPacket->cCashEquipIndex );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const TItem *pInven = pSession->GetItem()->GetCashInventory( biSerial );
|
|
|
|
|
|
if( pInven && pInven->nItemID > 0 ) {
|
|
|
|
|
|
CDnItem *pItem = CreateItem( pInven );
|
|
|
|
|
|
InsertCashInventoryItem( pSession, pPacket->biCashInvenSerial, pItem );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const TItem *pEquip = pSession->GetItem()->GetVehiclePartsEquip( pPacket->cCashEquipIndex );
|
|
|
|
|
|
if( pEquip && pEquip->nItemID > 0 ) {
|
|
|
|
|
|
CDnItem *pItem = CreateItem( pEquip );
|
|
|
|
|
|
InsertVehicleEquipItem( pSession, pPacket->cCashEquipIndex, pItem );
|
|
|
|
|
|
|
|
|
|
|
|
if( pItem )
|
|
|
|
|
|
pVehicleActor->EquipItem(*pEquip); // Rotha - <20><><EFBFBD><EFBFBD> }
|
|
|
|
|
|
}
|
|
|
|
|
|
pActor->RefreshState();
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case MoveType_PetBodyToPetInven:
|
|
|
|
|
|
case MoveType_PetInvenToPetBody:
|
|
|
|
|
|
case MoveType_PetPartsToCashInven:
|
|
|
|
|
|
case MoveType_CashInvenToPetParts:
|
|
|
|
|
|
{
|
|
|
|
|
|
if (pSession->GetItem()->OnRecvMoveCashItem(pPacket) != true)
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return ERROR_UNKNOWN_HEADER;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CDnItemTask::OnRecvItemRemoveItem( CDNUserSession *pSession, CSRemoveItem *pPacket, int nLen )
|
|
|
|
|
|
{
|
|
|
|
|
|
if (sizeof(CSRemoveItem) != nLen)
|
|
|
|
|
|
return ERROR_INVALIDPACKET;
|
|
|
|
|
|
|
|
|
|
|
|
if (pSession->IsTutorial()){
|
|
|
|
|
|
pSession->SendRemoveItem(pPacket->cType, pPacket->cSlotIndex, NULL, ERROR_ITEM_FAIL);
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (!pSession->IsNoneWindowState() && !pSession->IsWindowState(WINDOW_BLIND))
|
|
|
|
|
|
{
|
|
|
|
|
|
pSession->SendRemoveItem(pPacket->cType, pPacket->cSlotIndex, NULL, ERROR_ITEM_FAIL);
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (pSession->GetRestraint()->CheckRestraint(_RESTRAINTTYPE_TRADE) == false)
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
|
|
|
|
|
|
if( !pSession->GetActorHandle() )
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(PRE_ADD_EQUIPLOCK)
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD>尡 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ı<EFBFBD><C4B1><EFBFBD> <20><><EFBFBD>ƹ<EFBFBD><C6B9><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if (!GetRoom() || GetRoom()->bIsZombieMode())
|
|
|
|
|
|
{
|
|
|
|
|
|
pSession->SendRemoveItem(pPacket->cType, pPacket->cSlotIndex, NULL, ERROR_ITEM_FAIL);
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif // #if defined(PRE_ADD_EQUIPLOCK)
|
|
|
|
|
|
|
|
|
|
|
|
if( pSession->GetItem()->OnRecvRemoveItem( pPacket ) == false )
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
|
|
|
|
|
|
switch( pPacket->cType ) {
|
|
|
|
|
|
case ITEMPOSITION_EQUIP:
|
|
|
|
|
|
{
|
|
|
|
|
|
CDnPlayerActor *pActor = (CDnPlayerActor*)pSession->GetActorHandle().GetPointer();
|
|
|
|
|
|
|
|
|
|
|
|
if( pPacket->cSlotIndex < EQUIP_WEAPON1 )
|
|
|
|
|
|
pActor->DetachParts( (CDnParts::PartsTypeEnum)pPacket->cSlotIndex );
|
|
|
|
|
|
else
|
|
|
|
|
|
pActor->DetachWeapon( pPacket->cSlotIndex - EQUIP_WEAPON1 );
|
|
|
|
|
|
|
|
|
|
|
|
RemoveEquipItem( pSession, pPacket->cSlotIndex );
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD> <20>ڵ<EFBFBD><DAB5><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD><EFBFBD>µ<EFBFBD>..<2E><><EFBFBD><EFBFBD>.. ( <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.. )
|
|
|
|
|
|
const TItem *pItemData = pSession->GetItem()->GetEquip( pPacket->cSlotIndex );
|
|
|
|
|
|
if( pItemData && pItemData->nItemID > 0 ) {
|
|
|
|
|
|
CDnItem *pItem = CreateItem( pItemData );
|
|
|
|
|
|
InsertEquipItem( pSession, pPacket->cSlotIndex, pItem );
|
|
|
|
|
|
|
|
|
|
|
|
if( pItem ) {
|
|
|
|
|
|
if( pPacket->cSlotIndex < EQUIP_WEAPON1 ) {
|
|
|
|
|
|
if( pItem->GetItemType() == ITEMTYPE_PARTS )
|
|
|
|
|
|
pActor->AttachParts( ((CDnParts*)pItem)->GetMySmartPtr(), (CDnParts::PartsTypeEnum)pPacket->cSlotIndex );
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
if( pItem->GetItemType() == ITEMTYPE_WEAPON )
|
|
|
|
|
|
pActor->AttachWeapon( ((CDnWeapon*)pItem)->GetMySmartPtr(), pPacket->cSlotIndex - EQUIP_WEAPON1 );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
//
|
|
|
|
|
|
pActor->RefreshState();
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case ITEMPOSITION_INVEN:
|
|
|
|
|
|
{
|
|
|
|
|
|
RemoveInventoryItem( pSession, pPacket->cSlotIndex );
|
|
|
|
|
|
|
|
|
|
|
|
const TItem *pItemData = pSession->GetItem()->GetEquip( pPacket->cSlotIndex );
|
|
|
|
|
|
if( pItemData && pItemData->nItemID > 0 ) {
|
|
|
|
|
|
CDnItem *pItem = CreateItem( pItemData );
|
|
|
|
|
|
InsertInventoryItem( pSession, pPacket->cSlotIndex, pItem );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if( CDnPartyTask::IsActive(GetRoom()) ) CDnPartyTask::GetInstance(GetRoom()).UpdateGateInfo();
|
|
|
|
|
|
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case ITEMPOSITION_GLYPH:
|
|
|
|
|
|
{
|
|
|
|
|
|
CDnPlayerActor *pActor = (CDnPlayerActor*)pSession->GetActorHandle().GetPointer();
|
|
|
|
|
|
|
|
|
|
|
|
pActor->DetachGlyph( (CDnGlyph::GlyphSlotEnum)pPacket->cSlotIndex );
|
|
|
|
|
|
|
|
|
|
|
|
RemoveGlyphItem( pSession, pPacket->cSlotIndex );
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD> <20>ڵ<EFBFBD><DAB5><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD><EFBFBD>µ<EFBFBD>..<2E><><EFBFBD><EFBFBD>.. ( <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.. )
|
|
|
|
|
|
const TItem *pItemData = pSession->GetItem()->GetGlyph( (CDnGlyph::GlyphSlotEnum)pPacket->cSlotIndex );
|
|
|
|
|
|
if( pItemData && pItemData->nItemID > 0 ) {
|
|
|
|
|
|
CDnItem *pItem = CreateItem( pItemData );
|
|
|
|
|
|
InsertGlyphItem( pSession, pPacket->cSlotIndex, pItem );
|
|
|
|
|
|
|
|
|
|
|
|
if( pItem ) {
|
|
|
|
|
|
pActor->AttachGlyph( ((CDnGlyph*)pItem)->GetMySmartPtr(), (CDnGlyph::GlyphSlotEnum)pPacket->cSlotIndex );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
//
|
|
|
|
|
|
pActor->RefreshState();
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
#if defined(PRE_ADD_TALISMAN_SYSTEM)
|
|
|
|
|
|
case ITEMPOSITION_TALISMAN:
|
|
|
|
|
|
{
|
|
|
|
|
|
CDnPlayerActor *pActor = (CDnPlayerActor*)pSession->GetActorHandle().GetPointer();
|
|
|
|
|
|
pActor->DetachTalisman( pPacket->cSlotIndex );
|
|
|
|
|
|
RemoveTalismanItem( pSession, pPacket->cSlotIndex );
|
|
|
|
|
|
|
|
|
|
|
|
pActor->RefreshState();
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
case ITEMPOSITION_QUESTINVEN:
|
|
|
|
|
|
{
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return ERROR_UNKNOWN_HEADER;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CDnItemTask::OnRecvItemPickupItem( CDNUserSession *pSession, SCPickUp *pPacket, int nLen )
|
|
|
|
|
|
{
|
|
|
|
|
|
switch( pPacket->nRetCode ) {
|
|
|
|
|
|
case ERROR_NONE:
|
|
|
|
|
|
{
|
|
|
|
|
|
const TItem *pItemData = pSession->GetItem()->GetInventory( pPacket->PickUpItem.cSlotIndex );
|
|
|
|
|
|
if( pPacket->PickUpItem.cSlotIndex != -1 ) {
|
|
|
|
|
|
RemoveInventoryItem( pSession, pPacket->PickUpItem.cSlotIndex );
|
|
|
|
|
|
}
|
|
|
|
|
|
if (pItemData)
|
|
|
|
|
|
{
|
|
|
|
|
|
CDnItem *pItem = CreateItem( pItemData );
|
|
|
|
|
|
if( pItem ) {
|
|
|
|
|
|
InsertInventoryItem( pSession, pPacket->PickUpItem.cSlotIndex, pItem );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD> <20><> <20><> <20>ִ<EFBFBD>.
|
|
|
|
|
|
if( CDnPartyTask::IsActive(GetRoom()) ) CDnPartyTask::GetInstance(GetRoom()).UpdateGateInfo();
|
|
|
|
|
|
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CDnItemTask::OnRecvItemUseItem( CDNUserSession *pSession, CSUseItem *pPacket, int nLen )
|
|
|
|
|
|
{
|
|
|
|
|
|
if (sizeof(CSUseItem) != nLen)
|
|
|
|
|
|
return ERROR_INVALIDPACKET;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>˻<EFBFBD>
|
|
|
|
|
|
if( pSession->GetRestraint()->CheckRestraint(_RESTRAINTTYPE_TRADE) == false )
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¿<EFBFBD><C2BF><EFBFBD> <20><><EFBFBD>밡<EFBFBD><EBB0A1><EFBFBD><EFBFBD> <20>丮<EFBFBD><E4B8AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǵܽ<C7B4><DCBD><EFBFBD> OnRecvUseItem<65><6D><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ű<EFBFBD>
|
|
|
|
|
|
// Note <20>ѱ<EFBFBD>: <20><><EFBFBD><EFBFBD> <20><><EFBFBD>¿<EFBFBD><C2BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD>.
|
|
|
|
|
|
/*if( !pSession->GetActorHandle() )
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
|
|
|
|
|
|
if( pSession->GetActorHandle()->IsDie() )
|
|
|
|
|
|
return ERROR_NONE;*/
|
|
|
|
|
|
|
|
|
|
|
|
pSession->GetItem()->OnRecvUseItem(pPacket);
|
|
|
|
|
|
|
|
|
|
|
|
return ERROR_GENERIC_INVALIDREQUEST;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CDnItemTask::OnRecvItemRefreshQItem( CDNUserSession *pSession, SCRefreshQuestInven *pPacket, int nLen )
|
|
|
|
|
|
{
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CDnItemTask::OnRecvItemRemoveQItem( CDNUserSession *pSession, SCRemoveItem *pPacket, int nLen )
|
|
|
|
|
|
{
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CDnItemTask::OnRecvRebirth( CDNUserSession* pSession, int nLen )
|
|
|
|
|
|
{
|
|
|
|
|
|
if (nLen != 0)
|
|
|
|
|
|
return ERROR_INVALIDPACKET;
|
|
|
|
|
|
|
|
|
|
|
|
if (GetRoom()->GetRoomState() != _GAME_STATE_PLAY || pSession->GetState() != SESSION_STATE_GAME_PLAY)
|
|
|
|
|
|
{
|
|
|
|
|
|
_DANGER_POINT_MSG(L"if (GetRoom()->GetRoomState() != _GAME_STATE_PLAY)");
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pSession->SendBackToVillage(true);
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>Ȱ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD>
|
|
|
|
|
|
bool CDnItemTask::_bIsRebirth()
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20>̼<EFBFBD> Fail <20><><EFBFBD><EFBFBD><EFBFBD>̱<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ȱ <20>Ұ<EFBFBD><D2B0><EFBFBD><EFBFBD>մϴ<D5B4>.
|
|
|
|
|
|
CDnGameTask* pTask = (CDnGameTask*)CTaskManager::GetInstance(GetRoom()).GetTask( "GameTask" );
|
|
|
|
|
|
if( !pTask || pTask->IsDungeonFailed() )
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
|
// PvP<76>濡<EFBFBD><E6BFA1><EFBFBD><EFBFBD> <20><>Ȱ <20>Ұ<EFBFBD><D2B0><EFBFBD><EFBFBD>մϴ<D5B4>.
|
|
|
|
|
|
if( !GetRoom() || GetRoom()->bIsPvPRoom() )
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>۾<EFBFBD><DBBE>̵<EFBFBD><CCB5><EFBFBD> üũ
|
|
|
|
|
|
CDnItem* CDnItemTask::FindRebirthItem(CDNUserSession* pSession, int nAllowMapType, int nItemID)
|
|
|
|
|
|
{
|
|
|
|
|
|
std::vector<CDnItem *> rebirthItems;
|
|
|
|
|
|
ScanItemFromID(pSession->GetActorHandle(), nItemID, &rebirthItems);
|
|
|
|
|
|
if (rebirthItems.empty())
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
|
std::vector<CDnItem *>::iterator iter = rebirthItems.begin();
|
|
|
|
|
|
std::vector<CDnItem *>::iterator endIter = rebirthItems.end();
|
|
|
|
|
|
for (; iter != endIter; ++iter)
|
|
|
|
|
|
{
|
|
|
|
|
|
CDnItem* pItem = (*iter);
|
|
|
|
|
|
TItemData* pItemData = g_pDataManager->GetItemData( pItem->GetClassID() );
|
|
|
|
|
|
if (NULL == pItemData)
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20><>Ȱ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if (pItemData->nAllowMapType & nAllowMapType)
|
|
|
|
|
|
return pItem;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ȱ <20>Ұ<EFBFBD>
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CDnItemTask::OnRecvRebirthCoin( CDNUserSession* pSession, int nLen )
|
|
|
|
|
|
{
|
|
|
|
|
|
if (nLen != 0)
|
|
|
|
|
|
return ERROR_INVALIDPACKET;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if( pSession->GetState() != SESSION_STATE_GAME_PLAY)
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
|
|
|
|
|
|
bool bIsPartyRestore = false;
|
|
|
|
|
|
CDNGameRoom::PartyBackUpStruct BackupInfo;
|
|
|
|
|
|
if( GetRoom()->GetBackupPartyInfo( pSession->GetCharacterDBID(), BackupInfo ) == true )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( BackupInfo.nHPPercent > 0 )
|
|
|
|
|
|
bIsPartyRestore = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if( bIsPartyRestore == false && GetRoom()->GetPartyData(pSession)->nUsableRebirthCoin == 0 && GetRoom()->GetPartyData(pSession)->nUsableRebirthItemCoin == 0 )
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>Ȱ<EFBFBD><C8B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD>
|
|
|
|
|
|
if( !_bIsRebirth() )
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
|
|
|
|
|
|
DnActorHandle hActor = pSession->GetActorHandle();
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>巡<EFBFBD><E5B7A1> <20>ʻ<CABB><F3BFA1BC><EFBFBD> <20><>Ȱ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD> <20><> [2010/12/21 semozz]
|
|
|
|
|
|
const TMapInfo* pMapData = g_pDataManager->GetMapInfo( pSession->GetMapIndex() );
|
|
|
|
|
|
if (NULL == pMapData)
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
|
|
|
|
|
|
CDnWorld *pWorld = GetRoom()->GetWorld();
|
|
|
|
|
|
if (NULL == pWorld)
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
|
|
|
|
|
|
eDragonNestType _dragonNestType = pWorld->GetDragonNestType();
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD>巡<EFBFBD><E5B7A1><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD≯<EFBFBD>
|
|
|
|
|
|
bool isDragonNestMap = _dragonNestType == eDragonNestType::SeaDragon;
|
|
|
|
|
|
|
|
|
|
|
|
CDnItem* pRebirthItem = NULL;
|
|
|
|
|
|
if( !hActor->IsDie() || hActor->IsAppliedThisStateBlow(STATE_BLOW::BLOW_057))
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
|
|
|
|
|
|
bool isRebirthAble = false;
|
|
|
|
|
|
bool bUseRebirthItem = false;
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD> <20><>Ȱ <20><><EFBFBD><EFBFBD> üũ
|
|
|
|
|
|
if( bIsPartyRestore == false && GetRoom()->GetPartyData(pSession)->nUsableRebirthCoin == -1 )
|
|
|
|
|
|
{
|
|
|
|
|
|
//<2F><>Ȱ Ƚ<><C8BD> <20><><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD>
|
|
|
|
|
|
isRebirthAble = pSession->DecreaseRebirthCoin(1);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if ( bIsPartyRestore == false && GetRoom()->GetPartyData(pSession)->nUsableRebirthCoin > 0 )
|
|
|
|
|
|
{
|
|
|
|
|
|
//<2F><>Ȱ Ƚ<><C8BD> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
isRebirthAble = pSession->DecreaseRebirthCoin(1);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if ( bIsPartyRestore == false && !isRebirthAble && GetRoom()->GetPartyData(pSession)->ReverseItemList.size() > 0 && GetRoom()->GetPartyData(pSession)->nUsableRebirthItemCoin > 0 )
|
|
|
|
|
|
{
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ȱ üũ
|
|
|
|
|
|
for( std::list<int>::iterator itor = GetRoom()->GetPartyData(pSession)->ReverseItemList.begin(); itor != GetRoom()->GetPartyData(pSession)->ReverseItemList.end(); itor++ )
|
|
|
|
|
|
{
|
|
|
|
|
|
pRebirthItem = FindRebirthItem(pSession, pMapData->nAllowMapType, *itor);
|
|
|
|
|
|
if( pRebirthItem )
|
|
|
|
|
|
{
|
|
|
|
|
|
isRebirthAble = true;
|
|
|
|
|
|
bUseRebirthItem = true;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (isRebirthAble || bIsPartyRestore == true )
|
|
|
|
|
|
{
|
|
|
|
|
|
// Note : <20>̺<EFBFBD><CCBA>丮<EFBFBD><E4B8AE><EFBFBD><EFBFBD> <20><>Ȱ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> Ȯ<><C8AE><EFBFBD>Ѵ<EFBFBD>.
|
|
|
|
|
|
// <09><><EFBFBD><EFBFBD> <20>ִٸ<D6B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϳ<EFBFBD> <20>Ҹ<EFBFBD><D2B8>ϰ<EFBFBD> <20><>Ȱ <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>Ѵ<EFBFBD>.
|
|
|
|
|
|
if( hActor )
|
|
|
|
|
|
{
|
|
|
|
|
|
std::string strParam = "Coin";
|
|
|
|
|
|
if( bIsPartyRestore == true )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( BackupInfo.nHPPercent > 0 )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( BackupInfo.nHPPercent < 100 )
|
|
|
|
|
|
{
|
|
|
|
|
|
strParam.append("/");
|
|
|
|
|
|
strParam.append(boost::lexical_cast<std::string>(BackupInfo.nHPPercent));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if( BackupInfo.nSPPercent < 100 )
|
|
|
|
|
|
{
|
|
|
|
|
|
strParam.append("/");
|
|
|
|
|
|
strParam.append(boost::lexical_cast<std::string>(BackupInfo.nSPPercent));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
hActor->CmdAddStateEffect( NULL, STATE_BLOW::BLOW_057, 5000, strParam.c_str() );
|
|
|
|
|
|
|
|
|
|
|
|
// Note <20>ѱ<EFBFBD>: <20><>Ȱ <20><><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD>ƿ<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD> <20><>û <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>,
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> "Die" <20><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD><CCB6><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD>а<EFBFBD> <20>ǰ<EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>
|
|
|
|
|
|
// "Stand" <20><EFBFBD><D7BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. (<28><><EFBFBD>ɵ<EFBFBD> <20>Ŀ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ʿ<EFBFBD><CABF><EFBFBD> "Stand" <20><EFBFBD><D7BC><EFBFBD> <20><><EFBFBD><EFBFBD>µ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD> "Die" <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|
|
|
|
|
hActor->SetActionQueue( "Stand" );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pSession->GetEventSystem()->OnEvent( EventSystem::OnRebirth );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if( GetRoom()->GetPartyData(pSession)->nUsableRebirthCoin > 0 && bUseRebirthItem == false )
|
|
|
|
|
|
{
|
|
|
|
|
|
//<2F><><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>
|
|
|
|
|
|
if( bIsPartyRestore == false )
|
|
|
|
|
|
{
|
|
|
|
|
|
GetRoom()->GetPartyData(pSession)->nUsableRebirthCoin -= 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (GetRoom()->GetPartyData(pSession)->nUsableRebirthCoin <= 0)
|
|
|
|
|
|
GetRoom()->GetPartyData(pSession)->nUsableRebirthCoin = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
else if( GetRoom()->GetPartyData(pSession)->nUsableRebirthItemCoin > 0 && bUseRebirthItem == true )
|
|
|
|
|
|
{
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ȱ
|
|
|
|
|
|
if (!pSession->GetItem()->DeleteInventoryByItemID(pRebirthItem->GetClassID(), 1, DBDNWorldDef::UseItem::Use))
|
|
|
|
|
|
return ERROR_ITEM_FAIL;
|
|
|
|
|
|
|
|
|
|
|
|
GetRoom()->GetPartyData(pSession)->nUsableRebirthItemCoin -= 1;
|
|
|
|
|
|
|
|
|
|
|
|
if (GetRoom()->GetPartyData(pSession)->nUsableRebirthItemCoin <= 0)
|
|
|
|
|
|
GetRoom()->GetPartyData(pSession)->nUsableRebirthItemCoin = 0;
|
|
|
|
|
|
|
|
|
|
|
|
for( std::list<int>::iterator itor = GetRoom()->GetPartyData(pSession)->ReverseItemList.begin(); itor != GetRoom()->GetPartyData(pSession)->ReverseItemList.end(); itor++ )
|
|
|
|
|
|
pSession->SendSpecialRebirthItem( *itor, GetRoom()->GetPartyData(pSession)->nUsableRebirthItemCoin );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pSession->SendRebirthCoin(ERROR_NONE, GetRoom()->GetPartyData(pSession)->nUsableRebirthCoin, _REBIRTH_SELF, pSession->GetSessionID()); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
if( bIsPartyRestore == true )
|
|
|
|
|
|
GetRoom()->DelBackupPartyInfo( pSession->GetCharacterDBID() );
|
|
|
|
|
|
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CDnItemTask::OnRecvItemRefreshInven( CDNUserSession *pSession, SCRefreshInven *pPacket, int nLen )
|
|
|
|
|
|
{
|
|
|
|
|
|
RemoveInventoryItem( pSession, pPacket->ItemInfo.cSlotIndex );
|
|
|
|
|
|
|
|
|
|
|
|
if( pPacket->ItemInfo.Item.nItemID > 0 ) {
|
|
|
|
|
|
CDnItem *pItem = CreateItem( &pPacket->ItemInfo.Item );
|
|
|
|
|
|
InsertInventoryItem( pSession, pPacket->ItemInfo.cSlotIndex, pItem );
|
|
|
|
|
|
}
|
|
|
|
|
|
if( pPacket->bNewSign ) {
|
|
|
|
|
|
if( CDnPartyTask::IsActive(GetRoom()) ) CDnPartyTask::GetInstance(GetRoom()).UpdateGateInfo();
|
|
|
|
|
|
}
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CDnItemTask::OnRecvItemRefreshCashInven( CDNUserSession *pSession, SCRefreshCashInven *pPacket, int nLen )
|
|
|
|
|
|
{
|
|
|
|
|
|
for (int i = 0; i < pPacket->nCount; i++){
|
|
|
|
|
|
RemoveCashInventoryItem( pSession, pPacket->ItemList[i].nSerial );
|
|
|
|
|
|
|
|
|
|
|
|
if( pPacket->ItemList[i].nItemID > 0 && pPacket->ItemList[i].wCount > 0 ) {
|
|
|
|
|
|
CDnItem *pItem = CreateItem( &(pPacket->ItemList[i]) );
|
|
|
|
|
|
InsertCashInventoryItem( pSession, pPacket->ItemList[i].nSerial, pItem );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CDnItemTask::OnRecvItemRefreshEquip( CDNUserSession *pSession, SCRefreshEquip *pPacket, int nLen )
|
|
|
|
|
|
{
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CDnItemTask::OnRecvItemWarehouseSort(CDNUserSession *pSession, CSSortWarehouse * pPacket, int nLen)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (sizeof(CSSortWarehouse) - sizeof(pPacket->SlotInfo) + (sizeof(TSortSlot) * pPacket->cTotalCount) != nLen)
|
|
|
|
|
|
return ERROR_INVALIDPACKET;
|
|
|
|
|
|
|
|
|
|
|
|
if( !pSession->IsWindowState(WINDOW_BLIND) )
|
|
|
|
|
|
{
|
|
|
|
|
|
pSession->SendSortWarehouse(ERROR_GENERIC_INVALIDREQUEST);
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (pPacket->cTotalCount > WAREHOUSEMAX)
|
|
|
|
|
|
{
|
|
|
|
|
|
pSession->SendSortWarehouse(ERROR_GENERIC_INVALIDREQUEST);
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (pSession->GetItem()->SortWarehouse(pPacket)) pSession->SendSortWarehouse(ERROR_NONE);
|
|
|
|
|
|
else pSession->SendSortWarehouse(ERROR_GENERIC_INVALIDREQUEST);
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
#ifdef _ADD_NEWDISJOINT
|
|
|
|
|
|
int CDnItemTask::OnRecvItemDisjoint(CDNUserSession* pSession, CSItemDisjointReqNew* pPacket, int nLen)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (sizeof(CSItemDisjointReqNew) != nLen)
|
|
|
|
|
|
return ERROR_INVALIDPACKET;
|
|
|
|
|
|
|
|
|
|
|
|
if (pSession->GetRestraint()->CheckRestraint(_RESTRAINTTYPE_TRADE) == false)
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
|
|
|
|
|
|
int iResult = ERROR_NONE;
|
|
|
|
|
|
#ifdef _ADD_NEWDISJOINT
|
|
|
|
|
|
SCItemDisjointResNew *pResultPacket = new SCItemDisjointResNew();
|
|
|
|
|
|
ZeroMemory(pResultPacket, sizeof(SCItemDisjointResNew));
|
|
|
|
|
|
#endif
|
|
|
|
|
|
int nLastIndex = 0;
|
|
|
|
|
|
for (int k = 0; k < 4; k++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (pPacket->cSlotIndex[k] == 0 || pPacket->biItemSerial[k] == 0)
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
|
|
CDnItem* pItem = GetInventoryItem(pSession, pPacket->cSlotIndex[k]);
|
|
|
|
|
|
if (!pItem)
|
|
|
|
|
|
{
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (pItem->GetSerialID() != pPacket->biItemSerial[k]) return ERROR_ITEM_FAIL;
|
|
|
|
|
|
|
|
|
|
|
|
TItemData *pItemData = g_pDataManager->GetItemData(pItem->GetClassID());
|
|
|
|
|
|
int nItemID = pItem->GetClassID();
|
|
|
|
|
|
bool bSuccessDisjoint = false;
|
|
|
|
|
|
if (pItem && pItemData)
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ر<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ȯ<EFBFBD><C8AE> <20><>ġ<EFBFBD><C4A1> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><>.
|
|
|
|
|
|
// <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڽ<EFBFBD><DABD><EFBFBD> <20>÷<EFBFBD><C3B7>̾<EFBFBD><CCBE><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20>ϸ<EFBFBD> <20>ɱ.
|
|
|
|
|
|
DnActorHandle hNpc = CDnActor::FindActorFromUniqueID(pSession->GetGameRoom(), pPacket->nNpcUniqueID);
|
|
|
|
|
|
if (hNpc) {
|
|
|
|
|
|
int nDisjointType = 0;
|
|
|
|
|
|
if (hNpc->IsNpcActor()) {
|
|
|
|
|
|
CDnNPCActor *pNpc = static_cast<CDnNPCActor *>(hNpc.GetPointer());
|
|
|
|
|
|
nDisjointType = (pNpc->GetNpcData()) ? pNpc->GetNpcData()->nParam[0] : 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (pItem->CanDisjoint() && pItem->CanDisjointType(nDisjointType) && pItem->CanDisjointLevel(pSession->GetLevel()))
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20>ͼ<EFBFBD><CDBC≯鼭 <20><><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD>
|
|
|
|
|
|
bool bSealedItem = false;
|
|
|
|
|
|
if (pItemData->cReversion == ITEMREVERSION_BELONG && pItem->IsSoulbBound() == false)
|
|
|
|
|
|
bSealedItem = true;
|
|
|
|
|
|
if (!bSealedItem)
|
|
|
|
|
|
{
|
|
|
|
|
|
for (int i = 0; i < pPacket->nCount[k]; ++i)
|
|
|
|
|
|
{
|
|
|
|
|
|
bSuccessDisjoint = false;
|
|
|
|
|
|
iResult = ERROR_NONE;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>ش<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΰ<EFBFBD>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѱ<EFBFBD>.
|
|
|
|
|
|
if (pSession->CheckEnoughCoin(pItem->GetDisjointCost()))
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20>˾Ƽ<CBBE> <20><DEBE>Ƿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>θ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD> <20><>.
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
|
|
|
|
|
DNVector(CDnItem::DropItemStruct) VecDisjointItems;
|
|
|
|
|
|
pItem->GetDisjointItems(VecDisjointItems);
|
|
|
|
|
|
|
|
|
|
|
|
if (!VecDisjointItems.empty())
|
|
|
|
|
|
bSuccessDisjoint = true;
|
|
|
|
|
|
|
|
|
|
|
|
int nLocalItemID = pItem->GetClassID();
|
|
|
|
|
|
bool bDeleteItemResult = pSession->GetItem()->DeleteInventoryBySlot(pPacket->cSlotIndex[k], 1, pPacket->biItemSerial[k], DBDNWorldDef::UseItem::DeCompose);
|
|
|
|
|
|
_ASSERT(bDeleteItemResult);
|
|
|
|
|
|
if (bDeleteItemResult)
|
|
|
|
|
|
{
|
|
|
|
|
|
EtVector3 vPos = *hNpc->GetPosition();
|
|
|
|
|
|
|
|
|
|
|
|
// npc <20>ٶ<D9B6> <20><>ġ<EFBFBD><C4A1><EFBFBD><EFBFBD> 2 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŵ
|
|
|
|
|
|
vPos += (hNpc->GetMatEx()->m_vZAxis * 200.0f);
|
|
|
|
|
|
|
|
|
|
|
|
for (DWORD i = 0; i < VecDisjointItems.size(); ++i)
|
|
|
|
|
|
{
|
|
|
|
|
|
pResultPacket->nItemID[i + nLastIndex] = VecDisjointItems[i].nItemID;
|
|
|
|
|
|
pResultPacket->nCount[i + nLastIndex] = VecDisjointItems[i].nCount;
|
|
|
|
|
|
nLastIndex++;
|
|
|
|
|
|
|
|
|
|
|
|
//int nRotate = (int)(((VecDisjointItems[i].nSeed % 360) / (float)VecDisjointItems.size()) * i);
|
|
|
|
|
|
pSession->GetItem()->CreateInvenItem1(VecDisjointItems[i].nItemID, VecDisjointItems[i].nCount, -1, -1, DBDNWorldDef::AddMaterializedItem::ItemDecompose, 0, CREATEINVEN_ETC);
|
|
|
|
|
|
|
|
|
|
|
|
//RequestDropItem(STATIC_INSTANCE(CDnDropItem::s_dwUniqueCount)++, vPos, VecDisjointItems[i].nItemID,
|
|
|
|
|
|
// VecDisjointItems[i].nSeed, VecDisjointItems[i].nCount, nRotate, pSession->GetSessionID());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pSession->DelCoin(pItem->GetDisjointCost(), DBDNWorldDef::CoinChangeCode::DisjointTax, pSession->m_nClickedNpcID);
|
|
|
|
|
|
pSession->GetEventSystem()->OnEvent(EventSystem::OnItemDisjoint, 1, EventSystem::ItemID, nLocalItemID);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
iResult = ERROR_ITEM_FAIL; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵǴ<C8B5> <20>̻<EFBFBD><CCBB><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
iResult = ERROR_ITEM_INSUFFICIENCY_MONEY;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (iResult != ERROR_NONE)
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
iResult = ERROR_ITEM_CAN_NOT_DISJOINT;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
iResult = ERROR_ITEM_CAN_NOT_DISJOINT;
|
|
|
|
|
|
}
|
|
|
|
|
|
else iResult = ERROR_ITEM_FAIL;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
iResult = ERROR_ITEM_NOTFOUND; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD>..
|
|
|
|
|
|
pResultPacket->bSuccess = bSuccessDisjoint;
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
|
|
|
|
|
}
|
|
|
|
|
|
if (ERROR_NONE == iResult)
|
|
|
|
|
|
SendItemDisjointResNew(pSession, pResultPacket); //wtf
|
|
|
|
|
|
else
|
|
|
|
|
|
SendItemDisjointResNew(pSession, pResultPacket); // 0 <20><> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
return iResult;
|
|
|
|
|
|
}
|
|
|
|
|
|
#else
|
|
|
|
|
|
int CDnItemTask::OnRecvItemDisjoint(CDNUserSession* pSession, CSItemDisjointReq* pPacket, int nLen)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (sizeof(CSItemDisjointReq) != nLen)
|
|
|
|
|
|
return ERROR_INVALIDPACKET;
|
|
|
|
|
|
|
|
|
|
|
|
if (pSession->GetRestraint()->CheckRestraint(_RESTRAINTTYPE_TRADE) == false)
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
|
|
|
|
|
|
int iResult = ERROR_NONE;
|
|
|
|
|
|
|
|
|
|
|
|
CDnItem* pItem = GetInventoryItem(pSession, pPacket->cSlotIndex);
|
|
|
|
|
|
if (!pItem)
|
|
|
|
|
|
{
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (pItem->GetSerialID() != pPacket->biItemSerial) return ERROR_ITEM_FAIL;
|
|
|
|
|
|
#ifdef _ADD_NEWDISJOINT
|
|
|
|
|
|
SCItemDisjointResNew *pResultPacket = new SCItemDisjointResNew();
|
|
|
|
|
|
ZeroMemory(pResultPacket, sizeof(SCItemDisjointResNew));
|
|
|
|
|
|
#endif
|
|
|
|
|
|
TItemData *pItemData = g_pDataManager->GetItemData(pItem->GetClassID());
|
|
|
|
|
|
int nItemID = pItem->GetClassID();
|
|
|
|
|
|
bool bSuccessDisjoint = false;
|
|
|
|
|
|
if (pItem && pItemData)
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ر<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ȯ<EFBFBD><C8AE> <20><>ġ<EFBFBD><C4A1> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><>.
|
|
|
|
|
|
// <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڽ<EFBFBD><DABD><EFBFBD> <20>÷<EFBFBD><C3B7>̾<EFBFBD><CCBE><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20>ϸ<EFBFBD> <20>ɱ.
|
|
|
|
|
|
DnActorHandle hNpc = CDnActor::FindActorFromUniqueID(pSession->GetGameRoom(), pPacket->nNpcUniqueID);
|
|
|
|
|
|
if (hNpc) {
|
|
|
|
|
|
int nDisjointType = 0;
|
|
|
|
|
|
if (hNpc->IsNpcActor()) {
|
|
|
|
|
|
CDnNPCActor *pNpc = static_cast<CDnNPCActor *>(hNpc.GetPointer());
|
|
|
|
|
|
nDisjointType = (pNpc->GetNpcData()) ? pNpc->GetNpcData()->nParam[0] : 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (pItem->CanDisjoint() && pItem->CanDisjointType(nDisjointType) && pItem->CanDisjointLevel(pSession->GetLevel()))
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20>ͼ<EFBFBD><CDBC≯鼭 <20><><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD>
|
|
|
|
|
|
bool bSealedItem = false;
|
|
|
|
|
|
if (pItemData->cReversion == ITEMREVERSION_BELONG && pItem->IsSoulbBound() == false)
|
|
|
|
|
|
bSealedItem = true;
|
|
|
|
|
|
if (!bSealedItem)
|
|
|
|
|
|
{
|
|
|
|
|
|
for (int i = 0; i<pPacket->nCount; ++i)
|
|
|
|
|
|
{
|
|
|
|
|
|
bSuccessDisjoint = false;
|
|
|
|
|
|
iResult = ERROR_NONE;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>ش<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΰ<EFBFBD>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѱ<EFBFBD>.
|
|
|
|
|
|
if (pSession->CheckEnoughCoin(pItem->GetDisjointCost()))
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20>˾Ƽ<CBBE> <20><DEBE>Ƿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>θ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD> <20><>.
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
|
|
|
|
|
DNVector(CDnItem::DropItemStruct) VecDisjointItems;
|
|
|
|
|
|
pItem->GetDisjointItems(VecDisjointItems);
|
|
|
|
|
|
|
|
|
|
|
|
if (!VecDisjointItems.empty())
|
|
|
|
|
|
bSuccessDisjoint = true;
|
|
|
|
|
|
|
|
|
|
|
|
int nLocalItemID = pItem->GetClassID();
|
|
|
|
|
|
bool bDeleteItemResult = pSession->GetItem()->DeleteInventoryBySlot(pPacket->cSlotIndex, 1, pPacket->biItemSerial, DBDNWorldDef::UseItem::DeCompose);
|
|
|
|
|
|
_ASSERT(bDeleteItemResult);
|
|
|
|
|
|
if (bDeleteItemResult)
|
|
|
|
|
|
{
|
|
|
|
|
|
EtVector3 vPos = *hNpc->GetPosition();
|
|
|
|
|
|
|
|
|
|
|
|
// npc <20>ٶ<D9B6> <20><>ġ<EFBFBD><C4A1><EFBFBD><EFBFBD> 2 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŵ
|
|
|
|
|
|
vPos += (hNpc->GetMatEx()->m_vZAxis * 200.0f);
|
|
|
|
|
|
|
|
|
|
|
|
for (DWORD i = 0; i < VecDisjointItems.size(); ++i)
|
|
|
|
|
|
{
|
|
|
|
|
|
#ifdef _ADD_NEWDISJOINT
|
|
|
|
|
|
pResultPacket->nItemID[i] = VecDisjointItems[i].nItemID;
|
|
|
|
|
|
pResultPacket->nCount[i] = VecDisjointItems[i].nCount;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
int nRotate = (int)(((VecDisjointItems[i].nSeed % 360) / (float)VecDisjointItems.size()) * i);
|
|
|
|
|
|
RequestDropItem(STATIC_INSTANCE(CDnDropItem::s_dwUniqueCount)++, vPos, VecDisjointItems[i].nItemID,
|
|
|
|
|
|
VecDisjointItems[i].nSeed, VecDisjointItems[i].nCount, nRotate, pSession->GetSessionID());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pSession->DelCoin(pItem->GetDisjointCost(), DBDNWorldDef::CoinChangeCode::DisjointTax, pSession->m_nClickedNpcID);
|
|
|
|
|
|
pSession->GetEventSystem()->OnEvent(EventSystem::OnItemDisjoint, 1, EventSystem::ItemID, nLocalItemID);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
iResult = ERROR_ITEM_FAIL; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵǴ<C8B5> <20>̻<EFBFBD><CCBB><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
iResult = ERROR_ITEM_INSUFFICIENCY_MONEY;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (iResult != ERROR_NONE)
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
iResult = ERROR_ITEM_CAN_NOT_DISJOINT;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
iResult = ERROR_ITEM_CAN_NOT_DISJOINT;
|
|
|
|
|
|
}
|
|
|
|
|
|
else iResult = ERROR_ITEM_FAIL;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
iResult = ERROR_ITEM_NOTFOUND; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD>..
|
|
|
|
|
|
#ifdef _ADD_NEWDISJOINT
|
|
|
|
|
|
pResultPacket->bSuccess = bSuccessDisjoint;
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
|
|
|
|
|
if (ERROR_NONE == iResult)
|
|
|
|
|
|
SendItemDisjointResNew(pSession, pResultPacket); //wtf
|
|
|
|
|
|
else
|
|
|
|
|
|
SendItemDisjointResNew(pSession, pResultPacket); // 0 <20><> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
#else
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
|
|
|
|
|
if (ERROR_NONE == iResult)
|
|
|
|
|
|
SendItemDisjointRes(pSession, nItemID, bSuccessDisjoint);
|
|
|
|
|
|
else
|
|
|
|
|
|
SendItemDisjointRes(pSession, nItemID, bSuccessDisjoint); // 0 <20><> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
#endif
|
|
|
|
|
|
return iResult;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
int CDnItemTask::OnRecvItemCompleteRandomItem( CDNUserSession* pSession, CSCompleteRandomItem *pPacket, int nLen )
|
|
|
|
|
|
{
|
|
|
|
|
|
if (sizeof(CSCompleteRandomItem) != nLen)
|
|
|
|
|
|
return ERROR_INVALIDPACKET;
|
|
|
|
|
|
|
|
|
|
|
|
if( !pSession->GetItem()->IsValidRequestTimer( CDNUserItem::RequestType_UseRandomItem ) ) {
|
|
|
|
|
|
// <20><><EFBFBD>۳<EFBFBD>.
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pSession->GetItem()->CalcRandomItem( pPacket );
|
|
|
|
|
|
|
|
|
|
|
|
//UseItem<65><6D><EFBFBD><EFBFBD> WINDOW_PROGRESS<53><53><EFBFBD>·<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD>.
|
|
|
|
|
|
pSession->IsWindowStateNoneSet(WINDOW_PROGRESS);
|
|
|
|
|
|
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CDnItemTask::OnRecvItemCancelRandomItem( CDNUserSession* pSession, char *pPacket, int nLen )
|
|
|
|
|
|
{
|
|
|
|
|
|
if (nLen != 0)
|
|
|
|
|
|
return ERROR_INVALIDPACKET;
|
|
|
|
|
|
|
|
|
|
|
|
pSession->GetItem()->SetRequestTimer( CDNUserItem::RequestType_None, 0 );
|
|
|
|
|
|
pSession->BroadcastingEffect( EffectType_Random, EffectState_Cancel );
|
|
|
|
|
|
|
|
|
|
|
|
//UseItem<65><6D><EFBFBD><EFBFBD> WINDOW_PROGRESS<53><53><EFBFBD>·<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD>.
|
|
|
|
|
|
pSession->IsWindowStateNoneSet(WINDOW_PROGRESS);
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CDnItemTask::OnRecvItemSortInventory( CDNUserSession* pSession, CSSortInventory *pPacket, int nLen )
|
|
|
|
|
|
{
|
|
|
|
|
|
if (sizeof(CSSortInventory) - sizeof(pPacket->SlotInfo) + (sizeof(TSortSlot) * pPacket->cTotalCount) != nLen)
|
|
|
|
|
|
return ERROR_INVALIDPACKET;
|
|
|
|
|
|
|
|
|
|
|
|
CDNGameRoom::PartyStruct *pStruct = GetPartyData( pSession );
|
|
|
|
|
|
if (!pStruct) return ERROR_GENERIC_UNKNOWNERROR;
|
|
|
|
|
|
|
|
|
|
|
|
if ((pSession->GetItem()->SortInventory(pPacket)) && SortInventory(pSession, pPacket)){
|
|
|
|
|
|
pSession->SendSortInventory(ERROR_NONE);
|
|
|
|
|
|
}
|
|
|
|
|
|
else pSession->SendSortInventory(ERROR_GENERIC_INVALIDREQUEST);
|
|
|
|
|
|
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CDnItemTask::OnRecvItemEnchant( CDNUserSession* pSession, CSEnchantItem* pPacket, int nLen )
|
|
|
|
|
|
{
|
|
|
|
|
|
return pSession->ParseEnchant( pPacket, nLen );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CDnItemTask::OnRecvItemEnchantComplete( CDNUserSession* pSession, CSEnchantItem* pPacket, int nLen )
|
|
|
|
|
|
{
|
|
|
|
|
|
return pSession->ParseEnchantComplete( pPacket, nLen );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CDnItemTask::OnRecvItemEnchantCancel( CDNUserSession* pSession, int nLen )
|
|
|
|
|
|
{
|
|
|
|
|
|
return pSession->ParseEnchantCancel( nLen );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int CDnItemTask::OnRecvItemCompoundOpenReq( CDNUserSession* pSession, CSItemCompoundOpenReq* pPacket, int nLen )
|
|
|
|
|
|
{
|
|
|
|
|
|
return pSession->ParseItemCompound( pPacket, nLen );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CDnItemTask::OnrecvItemCompoundReq( CDNUserSession* pSession, CSCompoundItemReq* pPacket, int nLen )
|
|
|
|
|
|
{
|
|
|
|
|
|
return pSession->ParseItemCompoundComplete( pPacket, nLen );
|
|
|
|
|
|
}
|
|
|
|
|
|
int CDnItemTask::OnRecvItemCompoundCancelReq( CDNUserSession* pSession, CSItemCompoundCancelReq* pPacket, int nLen )
|
|
|
|
|
|
{
|
|
|
|
|
|
return pSession->ParseItemCompoundCancel( pPacket, nLen );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void CDnItemTask::PickUpItem( DnActorHandle hActor, DnDropItemHandle hDropItem, TPARTYITEMLOOTRULE LootRule )
|
|
|
|
|
|
{
|
|
|
|
|
|
#if defined(_CH)
|
|
|
|
|
|
CDNUserSession *pSession = NULL;
|
|
|
|
|
|
if( hActor && hActor->IsPlayerActor() ) pSession = ((CDnPlayerActor*)hActor.GetPointer())->GetUserSession();
|
|
|
|
|
|
if (pSession && (pSession->GetFCMState() != FCMSTATE_NONE)){ // 3<>ð<EFBFBD> <20>̻<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ޱ<EFBFBD> <20><><EFBFBD><EFBFBD> 090624
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
bool bPickup = true;
|
|
|
|
|
|
|
|
|
|
|
|
// ItemID <20><> 0 <20≯<EFBFBD> <20><><EFBFBD>̴<EFBFBD>!!
|
|
|
|
|
|
if( hDropItem->GetItemID() == 0 ) {
|
|
|
|
|
|
if( hDropItem->GetOverlapCount() < 1 ) return;
|
|
|
|
|
|
if( hDropItem->GetOverlapCount() < (int)GetPartyUserCount(CDNGameRoom::ePICKUPITEM) ) {
|
|
|
|
|
|
if( hActor )
|
|
|
|
|
|
{
|
|
|
|
|
|
CDnPlayerActor *pPlayer = static_cast<CDnPlayerActor *>(hActor.GetPointer());
|
|
|
|
|
|
if (!pPlayer->GetUserSession()->CheckMaxCoin(hDropItem->GetOverlapCount())){
|
|
|
|
|
|
pPlayer->GetUserSession()->SendPickUp(ERROR_ITEM_OVERFLOWMONEY, -1, NULL, 0);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
pPlayer->CmdAddCoin( hDropItem->GetOverlapCount(), DBDNWorldDef::CoinChangeCode::PickUp, 0, true );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
int nLiveUserCount = GetPartyUserCount(CDNGameRoom::ePICKUPITEM);
|
|
|
|
|
|
|
|
|
|
|
|
if( nLiveUserCount == 0 ) return;
|
|
|
|
|
|
int nCoin = hDropItem->GetOverlapCount() / nLiveUserCount;
|
|
|
|
|
|
int nDivide = hDropItem->GetOverlapCount() % nLiveUserCount;
|
|
|
|
|
|
for( DWORD i=0; i<GetUserCount(); i++ ) {
|
|
|
|
|
|
if( !GetUserData(i)->GetActorHandle() )
|
|
|
|
|
|
continue;
|
|
|
|
|
|
CDnPlayerActor *pPlayer = static_cast<CDnPlayerActor *>(GetUserData(i)->GetActorHandle().GetPointer());
|
|
|
|
|
|
if( pPlayer->IsDie() ) continue;
|
|
|
|
|
|
if( GetUserData(i)->bIsGMTrace() ) continue;
|
|
|
|
|
|
CDNUserSession* pUserSession = GetUserData(i);
|
|
|
|
|
|
if (pUserSession == NULL
|
|
|
|
|
|
#ifdef _CH
|
|
|
|
|
|
|| pUserSession->GetFCMState() != FCMSTATE_NONE
|
|
|
|
|
|
#endif
|
|
|
|
|
|
)
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
|
|
int nDropCoin = 0;
|
|
|
|
|
|
if( hActor == pPlayer ) {
|
|
|
|
|
|
nDropCoin = nCoin + nDivide;
|
|
|
|
|
|
if (!pPlayer->GetUserSession()->CheckMaxCoin(nCoin + nDivide)){
|
|
|
|
|
|
pPlayer->GetUserSession()->SendPickUp(ERROR_ITEM_OVERFLOWMONEY, -1, NULL, 0);
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
pPlayer->CmdAddCoin( nCoin + nDivide, DBDNWorldDef::CoinChangeCode::PickUp, 0, true );
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
if (!pPlayer->GetUserSession()->CheckMaxCoin(nCoin)){
|
|
|
|
|
|
pPlayer->GetUserSession()->SendPickUp(ERROR_ITEM_OVERFLOWMONEY, -1, NULL, 0);
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pPlayer->CmdAddCoin( nCoin, DBDNWorldDef::CoinChangeCode::PickUp, 0, true );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
hDropItem->Send( CDnDropItem::DPT_PICKUP, NULL );
|
|
|
|
|
|
|
|
|
|
|
|
if( hActor && hActor->IsPlayerActor() )
|
|
|
|
|
|
((CDnPlayerActor*)hActor.GetPointer())->UpdateGetItem();
|
|
|
|
|
|
|
|
|
|
|
|
SAFE_RELEASE_SPTR( hDropItem );
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>⼭ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ִ°<D6B4> üũ <20><><EFBFBD>ֽð<D6BD>
|
|
|
|
|
|
eItemTypeEnum Type = CDnItem::GetItemType( hDropItem->GetItemID() );
|
|
|
|
|
|
if( Type == ITEMTYPE_INSTANT ) {
|
|
|
|
|
|
int nItemID = hDropItem->GetItemID();
|
|
|
|
|
|
int nSeed = hDropItem->GetRandomSeed();
|
|
|
|
|
|
|
|
|
|
|
|
CDnItem *pItem = CDnItem::CreateItem( hActor->GetRoom(), nItemID, nSeed );
|
|
|
|
|
|
if( pItem ) {
|
|
|
|
|
|
pItem->ActivateSkillEffect( hActor );
|
|
|
|
|
|
SAFE_DELETE( pItem );
|
|
|
|
|
|
|
|
|
|
|
|
char szBuf[16] = { 0, };
|
|
|
|
|
|
DWORD dwUniqueID = hActor->GetUniqueID();
|
|
|
|
|
|
CMemoryStream Stream( szBuf, 16 );
|
|
|
|
|
|
Stream.Write( &dwUniqueID, sizeof(DWORD) );
|
|
|
|
|
|
Stream.Write( &nItemID, sizeof(int) );
|
|
|
|
|
|
Stream.Write( &nSeed, sizeof(int) );
|
|
|
|
|
|
|
|
|
|
|
|
hDropItem->Send( CDnDropItem::DPT_PICKUPINSTANT, &Stream );
|
|
|
|
|
|
|
|
|
|
|
|
if( hActor && hActor->IsPlayerActor() )
|
|
|
|
|
|
((CDnPlayerActor*)hActor.GetPointer())->UpdateGetItem();
|
|
|
|
|
|
|
|
|
|
|
|
SAFE_RELEASE_SPTR( hDropItem );
|
|
|
|
|
|
|
|
|
|
|
|
if( hActor && hActor->IsPlayerActor() )
|
|
|
|
|
|
((CDnPlayerActor*)hActor.GetPointer())->GetUserSession()->GetEventSystem()->OnEvent( EventSystem::OnItemUse, 1,EventSystem::ItemID, nItemID );
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
else hDropItem->Send( CDnDropItem::DPT_NOPICKUP, NULL );
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
CDNUserSession *pSession = NULL;
|
|
|
|
|
|
if( hActor && hActor->IsPlayerActor() ) pSession = ((CDnPlayerActor*)hActor.GetPointer())->GetUserSession();
|
|
|
|
|
|
if( pSession == NULL ) return;
|
|
|
|
|
|
int nItemID = hDropItem->GetItemID();
|
|
|
|
|
|
short wCount = hDropItem->GetOverlapCount();
|
|
|
|
|
|
int nRandomSeed = hDropItem->GetRandomSeed();
|
|
|
|
|
|
|
|
|
|
|
|
TItemData *pItemData = g_pDataManager->GetItemData(nItemID);
|
|
|
|
|
|
bool bProcessPickup = false;
|
|
|
|
|
|
|
|
|
|
|
|
int itemShareEnableCount = GetPartyUserCount(CDNGameRoom::ePICKUPITEM);
|
|
|
|
|
|
if (itemShareEnableCount > 1 && hDropItem->GetOwnerUniqueID() == -1 )
|
|
|
|
|
|
{
|
|
|
|
|
|
if (pItemData)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (pItemData->cReversion == ITEMREVERSION_BELONG) // todo : Check the dice game history of dropitem.
|
|
|
|
|
|
{
|
|
|
|
|
|
if (hDropItem->IsReversionItem() == false)
|
|
|
|
|
|
{
|
|
|
|
|
|
hDropItem->SetReversionItem(true);
|
|
|
|
|
|
hDropItem->LockReversionItem(true);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (hDropItem->IsReversionLocked())
|
|
|
|
|
|
{
|
|
|
|
|
|
if (pSession->GetGameRoom()->IsEnableAddRequestGetReversionItem(hDropItem))
|
|
|
|
|
|
{
|
|
|
|
|
|
TItem itemInfo;
|
|
|
|
|
|
#if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD)
|
|
|
|
|
|
pSession->GetItem()->MakeItemStruct(nItemID, itemInfo, 0, hDropItem->GetEnchantID());
|
|
|
|
|
|
#else // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD)
|
|
|
|
|
|
pSession->GetItem()->MakeItemStruct(nItemID, itemInfo);
|
|
|
|
|
|
#endif // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD)
|
|
|
|
|
|
hDropItem->MakeItemStruct( itemInfo );
|
|
|
|
|
|
TItemData *pItemData = g_pDataManager->GetItemData(nItemID);
|
|
|
|
|
|
if (pItemData)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (pItemData->cReversion == ITEMREVERSION_BELONG)
|
|
|
|
|
|
itemInfo.bSoulbound = pItemData->IsSealed ? false : true;
|
|
|
|
|
|
}
|
|
|
|
|
|
pSession->GetGameRoom()->AddRequestGetReversionItem(itemInfo, hDropItem);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bPickup = false;
|
|
|
|
|
|
bProcessPickup = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TItem pickupItemInfo;
|
|
|
|
|
|
if (bProcessPickup == false)
|
|
|
|
|
|
{
|
|
|
|
|
|
#if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD)
|
|
|
|
|
|
bPickup = pSession->GetItem()->OnRecvPickUp(pickupItemInfo, hDropItem->GetItemID(), hDropItem->GetOverlapCount(), hDropItem->GetRandomSeed(), hDropItem->GetOption(), hDropItem->GetEnchantID());
|
|
|
|
|
|
#else // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD)
|
|
|
|
|
|
bPickup = pSession->GetItem()->OnRecvPickUp(pickupItemInfo, hDropItem->GetItemID(), hDropItem->GetOverlapCount(), hDropItem->GetRandomSeed(), hDropItem->GetOption());
|
|
|
|
|
|
#endif // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if( bPickup ) {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ը<F0BFA1B0> SC_ITEM <20><><EFBFBD><EFBFBD> <20><EFBFBD><DEBC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// [<5B><><EFBFBD><EFBFBD>] [<5B> <20>ƾ<EFBFBD><C6BE><EFBFBD>]<5D><> <20>Ծ<EFBFBD><D4BE><EFBFBD><EFBFBD>ϴ<EFBFBD>. <20><><EFBFBD><EFBFBD> <20><EFBFBD><DEBC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ϴ<EFBFBD>
|
|
|
|
|
|
// DropItem <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ <20><><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD> <20>Ѵ<EFBFBD>.
|
|
|
|
|
|
char pBuffer[32];
|
|
|
|
|
|
CPacketCompressStream Stream( pBuffer, 32 );
|
|
|
|
|
|
|
|
|
|
|
|
bool bNameLink = true;
|
|
|
|
|
|
Stream.Write(&bNameLink, sizeof(bool));
|
|
|
|
|
|
// item information for name link.
|
|
|
|
|
|
Stream.Write(&pickupItemInfo.cLevel, sizeof(char));
|
|
|
|
|
|
Stream.Write(&pickupItemInfo.nRandomSeed, sizeof(int));
|
|
|
|
|
|
Stream.Write(&pickupItemInfo.wDur, sizeof(USHORT));
|
|
|
|
|
|
Stream.Write(&pickupItemInfo.cPotential, sizeof(char));
|
|
|
|
|
|
Stream.Write(&pickupItemInfo.cOption, sizeof(char));
|
|
|
|
|
|
Stream.Write(&pickupItemInfo.cSealCount, sizeof(char));
|
|
|
|
|
|
|
|
|
|
|
|
DWORD dwUniqueID = hActor->GetUniqueID();
|
|
|
|
|
|
Stream.Write( &LootRule, sizeof(char) );
|
|
|
|
|
|
switch( LootRule ) {
|
|
|
|
|
|
case ITEMLOOTRULE_RANDOM:
|
|
|
|
|
|
case ITEMLOOTRULE_NONE:
|
|
|
|
|
|
case ITEMLOOTRULE_OWNER:
|
|
|
|
|
|
case ITEMLOOTRULE_INORDER:
|
|
|
|
|
|
Stream.Write( &dwUniqueID, sizeof(DWORD) );
|
|
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
hDropItem->Send( CDnDropItem::DPT_PICKUP, &Stream );
|
|
|
|
|
|
|
|
|
|
|
|
if( hActor && hActor->IsPlayerActor() )
|
|
|
|
|
|
((CDnPlayerActor*)hActor.GetPointer())->UpdateGetItem();
|
|
|
|
|
|
|
|
|
|
|
|
SAFE_RELEASE_SPTR( hDropItem );
|
|
|
|
|
|
}
|
|
|
|
|
|
else hDropItem->Send( CDnDropItem::DPT_NOPICKUP, NULL );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
#if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD)
|
|
|
|
|
|
DnDropItemHandle CDnItemTask::RequestDropItem( DWORD dwUniqueID, EtVector3 &vPos, int nItemID, int nSeed, int nCount, short nRotate, UINT nOwnerSessionID, int nEchantID )
|
|
|
|
|
|
#else // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD)
|
|
|
|
|
|
DnDropItemHandle CDnItemTask::RequestDropItem( DWORD dwUniqueID, EtVector3 &vPos, int nItemID, int nSeed, int nCount, short nRotate, UINT nOwnerSessionID)
|
|
|
|
|
|
#endif // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD)
|
|
|
|
|
|
{
|
|
|
|
|
|
#if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD)
|
|
|
|
|
|
DnDropItemHandle hDropItemHandle = CDnDropItem::DropItem( GetRoom(), vPos, dwUniqueID, nItemID, nSeed, -1, nCount, nRotate, nOwnerSessionID, nEchantID );
|
|
|
|
|
|
#else // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD)
|
|
|
|
|
|
DnDropItemHandle hDropItemHandle = CDnDropItem::DropItem( GetRoom(), vPos, dwUniqueID, nItemID, nSeed, -1, nCount, nRotate, nOwnerSessionID );
|
|
|
|
|
|
#endif // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD)
|
|
|
|
|
|
if( hDropItemHandle )
|
|
|
|
|
|
{
|
|
|
|
|
|
for( DWORD i=0; i<GetUserCount(); i++ )
|
|
|
|
|
|
{
|
|
|
|
|
|
CDNUserSession* pGameSession = GetUserData(i);
|
|
|
|
|
|
if( pGameSession && pGameSession->GetState() == SESSION_STATE_GAME_PLAY )
|
|
|
|
|
|
SendGameCreateDropItem( pGameSession, dwUniqueID, vPos, nItemID, nSeed, hDropItemHandle->GetOption(), nCount, nRotate, nOwnerSessionID );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return hDropItemHandle;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CDnItem *CDnItemTask::CreateItem( const TItem *pInfo )
|
|
|
|
|
|
{
|
|
|
|
|
|
int nItemID = pInfo->nItemID;
|
|
|
|
|
|
eItemTypeEnum Type = CDnItem::GetItemType( nItemID );
|
|
|
|
|
|
CDnItem *pItem = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
if( nItemID == 0 ) return NULL;
|
|
|
|
|
|
switch( Type ) {
|
|
|
|
|
|
case ITEMTYPE_WEAPON:
|
|
|
|
|
|
pItem = CDnWeapon::CreateWeapon( GetRoom(), nItemID, pInfo->nRandomSeed, pInfo->cOption, pInfo->cLevel, pInfo->cPotential, false, false, pInfo->cSealCount, pInfo->bSoulbound );
|
|
|
|
|
|
break;
|
|
|
|
|
|
case ITEMTYPE_PARTS:
|
|
|
|
|
|
pItem = CDnParts::CreateParts( GetRoom(), nItemID, pInfo->nRandomSeed, pInfo->cOption, pInfo->cLevel, pInfo->cPotential, pInfo->cSealCount, pInfo->bSoulbound );
|
|
|
|
|
|
break;
|
|
|
|
|
|
case ITEMTYPE_GLYPH:
|
|
|
|
|
|
pItem = CDnGlyph::CreateGlyph( GetRoom(), nItemID, pInfo->nRandomSeed, pInfo->cOption, pInfo->cLevel, pInfo->cPotential, pInfo->cSealCount, pInfo->bSoulbound );
|
|
|
|
|
|
break;
|
|
|
|
|
|
#if defined(PRE_ADD_TALISMAN_SYSTEM)
|
|
|
|
|
|
case ITEMTYPE_TALISMAN:
|
|
|
|
|
|
pItem = CDnTalisman::CreateTalisman( GetRoom(), nItemID, pInfo->nRandomSeed, pInfo->cOption, pInfo->cLevel, pInfo->cPotential, pInfo->cSealCount, pInfo->bSoulbound );
|
|
|
|
|
|
break;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
default:
|
|
|
|
|
|
pItem = CDnItem::CreateItem( GetRoom(), nItemID, pInfo->nRandomSeed );
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
if( pItem == NULL ) {
|
|
|
|
|
|
#if defined (_WORK)
|
|
|
|
|
|
GetRoom()->GetDBConnection()->QueryUseItemEx( GetRoom()->GetDBThreadID(), GetRoom()->GetWorldSetID(), 0, DBDNWorldDef::UseItem::Destroy, pInfo->nSerial, pInfo->wCount, 0, 0, L"", true );
|
|
|
|
|
|
#else
|
|
|
|
|
|
_ASSERT( !"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>" );
|
|
|
|
|
|
#endif // #if defined (_WORK)
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
*pItem = *const_cast<TItem*>(pInfo);
|
|
|
|
|
|
|
|
|
|
|
|
return pItem;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CDnItemTask::InsertEquipItem( CDNUserSession *pSession, int nEquipIndex, CDnItem *pItem, bool bGenerationEvent )
|
|
|
|
|
|
{
|
|
|
|
|
|
CDNGameRoom::PartyStruct *pStruct = GetPartyData( pSession );
|
|
|
|
|
|
if( pStruct == NULL ) return false;
|
|
|
|
|
|
if( nEquipIndex < 0 || nEquipIndex >= EQUIPMAX ) return false;
|
|
|
|
|
|
if( pStruct->pEquip[nEquipIndex] ) return false;
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef _DEBUG
|
|
|
|
|
|
if (nEquipIndex >= EQUIPMAX)
|
|
|
|
|
|
_ASSERT(0);
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < EQUIPMAX; i++)
|
|
|
|
|
|
if (pStruct->pEquip[i] == pItem)
|
|
|
|
|
|
_ASSERT(0);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
pStruct->pEquip[nEquipIndex] = pItem;
|
|
|
|
|
|
|
|
|
|
|
|
if( bGenerationEvent ) {
|
|
|
|
|
|
pSession->GetEventSystem()->OnEvent( EventSystem::OnItemEquip, 1,
|
|
|
|
|
|
EventSystem::ItemID, pItem->GetClassID() );
|
|
|
|
|
|
|
|
|
|
|
|
char cLevel = 99;
|
|
|
|
|
|
for (int i = EQUIP_HELMET; i <= EQUIP_FOOT; i++){
|
|
|
|
|
|
if (!pStruct->pEquip[i]) cLevel = 0;
|
|
|
|
|
|
else if (cLevel > pStruct->pEquip[i]->GetEnchantLevel()) cLevel = pStruct->pEquip[i]->GetEnchantLevel();
|
|
|
|
|
|
if (cLevel == 0) break;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (cLevel > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
pSession->GetEventSystem()->OnEvent( EventSystem::OnItemEquip, 1,
|
|
|
|
|
|
EventSystem::AllPartsMinLevel, cLevel );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CDnItemTask::RemoveEquipItem( CDNUserSession *pSession, int nEquipIndex )
|
|
|
|
|
|
{
|
|
|
|
|
|
CDNGameRoom::PartyStruct *pStruct = GetPartyData( pSession );
|
|
|
|
|
|
if( pStruct == NULL ) return false;
|
|
|
|
|
|
if( nEquipIndex < 0 || nEquipIndex >= EQUIPMAX ) return false;
|
|
|
|
|
|
if( !pStruct->pEquip[nEquipIndex] ) return false;
|
|
|
|
|
|
|
|
|
|
|
|
SAFE_DELETE( pStruct->pEquip[nEquipIndex] );
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CDnItem *CDnItemTask::GetEquipItem( CDNUserSession *pSession, int nEquipIndex )
|
|
|
|
|
|
{
|
|
|
|
|
|
CDNGameRoom::PartyStruct *pStruct = GetPartyData( pSession );
|
|
|
|
|
|
if( pStruct == NULL ) return NULL;
|
|
|
|
|
|
if( nEquipIndex < 0 || nEquipIndex >= EQUIPMAX ) return NULL;
|
|
|
|
|
|
return pStruct->pEquip[nEquipIndex];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CDnItemTask::InsertCashEquipItem( CDNUserSession * pSession, int nEquipIndex, CDnItem *pItem, bool bGenerationEvent )
|
|
|
|
|
|
{
|
|
|
|
|
|
CDNGameRoom::PartyStruct *pStruct = GetPartyData( pSession );
|
|
|
|
|
|
if( pStruct == NULL ) return false;
|
|
|
|
|
|
if( nEquipIndex < 0 || nEquipIndex >= CASHEQUIPMAX ) return false;
|
|
|
|
|
|
if( pStruct->pCashEquip[nEquipIndex] ) return false;
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef _DEBUG
|
|
|
|
|
|
if (nEquipIndex >= CASHEQUIPMAX)
|
|
|
|
|
|
_ASSERT(0);
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < CASHEQUIPMAX; i++)
|
|
|
|
|
|
if (pStruct->pCashEquip[i] == pItem)
|
|
|
|
|
|
_ASSERT(0);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
pStruct->pCashEquip[nEquipIndex] = pItem;
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CDnItemTask::RemoveCashEquipItem( CDNUserSession * pSession, int nEquipIndex )
|
|
|
|
|
|
{
|
|
|
|
|
|
CDNGameRoom::PartyStruct *pStruct = GetPartyData( pSession );
|
|
|
|
|
|
if( pStruct == NULL ) return false;
|
|
|
|
|
|
if( nEquipIndex < 0 || nEquipIndex >= CASHEQUIPMAX ) return false;
|
|
|
|
|
|
if( !pStruct->pCashEquip[nEquipIndex] ) return false;
|
|
|
|
|
|
|
|
|
|
|
|
SAFE_DELETE( pStruct->pCashEquip[nEquipIndex] );
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CDnItem *CDnItemTask::GetCashEquipItem( CDNUserSession * pSession, int nEquipIndex )
|
|
|
|
|
|
{
|
|
|
|
|
|
CDNGameRoom::PartyStruct *pStruct = GetPartyData( pSession );
|
|
|
|
|
|
if( pStruct == NULL ) return NULL;
|
|
|
|
|
|
if( nEquipIndex < 0 || nEquipIndex >= CASHEQUIPMAX ) return NULL;
|
|
|
|
|
|
return pStruct->pCashEquip[nEquipIndex];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CDnItemTask::InsertGlyphItem( CDNUserSession * pSession, int nEquipIndex, CDnItem *pItem, bool bGenerationEvent )
|
|
|
|
|
|
{
|
|
|
|
|
|
CDNGameRoom::PartyStruct *pStruct = GetPartyData( pSession );
|
|
|
|
|
|
if( pStruct == NULL ) return false;
|
|
|
|
|
|
if( nEquipIndex < 0 || nEquipIndex >= GLYPHMAX ) return false;
|
|
|
|
|
|
if( pStruct->pGlyph[nEquipIndex] ) return false;
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef _DEBUG
|
|
|
|
|
|
if (nEquipIndex >= GLYPHMAX)
|
|
|
|
|
|
_ASSERT(0);
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < GLYPHMAX; i++)
|
|
|
|
|
|
if (pStruct->pGlyph[i] == pItem)
|
|
|
|
|
|
_ASSERT(0);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
pStruct->pGlyph[nEquipIndex] = pItem;
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CDnItemTask::RemoveGlyphItem( CDNUserSession * pSession, int nEquipIndex )
|
|
|
|
|
|
{
|
|
|
|
|
|
CDNGameRoom::PartyStruct *pStruct = GetPartyData( pSession );
|
|
|
|
|
|
if( pStruct == NULL ) return false;
|
|
|
|
|
|
if( nEquipIndex < 0 || nEquipIndex >= GLYPHMAX ) return false;
|
|
|
|
|
|
if( !pStruct->pGlyph[nEquipIndex] ) return false;
|
|
|
|
|
|
|
|
|
|
|
|
SAFE_DELETE( pStruct->pGlyph[nEquipIndex] );
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CDnItem *CDnItemTask::GetGlyphItem( CDNUserSession * pSession, int nEquipIndex )
|
|
|
|
|
|
{
|
|
|
|
|
|
CDNGameRoom::PartyStruct *pStruct = GetPartyData( pSession );
|
|
|
|
|
|
if( pStruct == NULL ) return NULL;
|
|
|
|
|
|
if( nEquipIndex < 0 || nEquipIndex >= GLYPHMAX ) return NULL;
|
|
|
|
|
|
return pStruct->pGlyph[nEquipIndex];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(PRE_ADD_TALISMAN_SYSTEM)
|
|
|
|
|
|
bool CDnItemTask::InsertTalismanItem( CDNUserSession * pSession, int nEquipIndex, CDnItem *pItem )
|
|
|
|
|
|
{
|
|
|
|
|
|
CDNGameRoom::PartyStruct *pStruct = GetPartyData( pSession );
|
|
|
|
|
|
if( pStruct == NULL ) return false;
|
|
|
|
|
|
if( nEquipIndex < 0 || nEquipIndex >= TALISMAN_MAX ) return false;
|
|
|
|
|
|
if( pStruct->pTalisman[nEquipIndex] ) return false;
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef _DEBUG
|
|
|
|
|
|
if (nEquipIndex >= TALISMAN_MAX)
|
|
|
|
|
|
_ASSERT(0);
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < TALISMAN_MAX; i++)
|
|
|
|
|
|
if (pStruct->pTalisman[i] == pItem)
|
|
|
|
|
|
_ASSERT(0);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
pStruct->pTalisman[nEquipIndex] = pItem;
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CDnItemTask::RemoveTalismanItem( CDNUserSession * pSession, int nEquipIndex )
|
|
|
|
|
|
{
|
|
|
|
|
|
CDNGameRoom::PartyStruct *pStruct = GetPartyData( pSession );
|
|
|
|
|
|
if( pStruct == NULL ) return false;
|
|
|
|
|
|
if( nEquipIndex < 0 || nEquipIndex >= TALISMAN_MAX ) return false;
|
|
|
|
|
|
if( !pStruct->pTalisman[nEquipIndex] ) return false;
|
|
|
|
|
|
|
|
|
|
|
|
SAFE_DELETE( pStruct->pTalisman[nEquipIndex] );
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CDnItem *CDnItemTask::GetTalismanItem( CDNUserSession * pSession, int nEquipIndex )
|
|
|
|
|
|
{
|
|
|
|
|
|
CDNGameRoom::PartyStruct *pStruct = GetPartyData( pSession );
|
|
|
|
|
|
if( pStruct == NULL ) return NULL;
|
|
|
|
|
|
if( nEquipIndex < 0 || nEquipIndex >= TALISMAN_MAX ) return NULL;
|
|
|
|
|
|
return pStruct->pTalisman[nEquipIndex];
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
bool CDnItemTask::InsertInventoryItem( CDNUserSession *pSession, int nSlotIndex, CDnItem *pItem )
|
|
|
|
|
|
{
|
|
|
|
|
|
CDNGameRoom::PartyStruct *pStruct = GetPartyData( pSession );
|
|
|
|
|
|
if( pStruct == NULL ) return false;
|
|
|
|
|
|
if( nSlotIndex < 0 || nSlotIndex >= INVENTORYMAX ) return false;
|
|
|
|
|
|
|
|
|
|
|
|
if( pStruct->pInventory[nSlotIndex] ) {
|
|
|
|
|
|
SAFE_DELETE( pStruct->pInventory[nSlotIndex] );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef _DEBUG
|
|
|
|
|
|
if (nSlotIndex >= INVENTORYMAX)
|
|
|
|
|
|
_ASSERT(0);
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < INVENTORYMAX; i++)
|
|
|
|
|
|
if (pStruct->pInventory[i] == pItem)
|
|
|
|
|
|
_ASSERT(0);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
pStruct->pInventory[nSlotIndex] = pItem;
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CDnItemTask::RemoveInventoryItem( CDNUserSession *pSession, int nSlotIndex )
|
|
|
|
|
|
{
|
|
|
|
|
|
CDNGameRoom::PartyStruct *pStruct = GetPartyData( pSession );
|
|
|
|
|
|
if( pStruct == NULL ) return false;
|
|
|
|
|
|
if( nSlotIndex < 0 || nSlotIndex >= INVENTORYMAX ) return false;
|
|
|
|
|
|
|
|
|
|
|
|
if( pStruct->pInventory[nSlotIndex] ) {
|
|
|
|
|
|
SAFE_DELETE( pStruct->pInventory[nSlotIndex] );
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CDnItem *CDnItemTask::GetInventoryItem( CDNUserSession *pSession, int nSlotIndex )
|
|
|
|
|
|
{
|
|
|
|
|
|
CDNGameRoom::PartyStruct *pStruct = GetPartyData( pSession );
|
|
|
|
|
|
if( pStruct == NULL ) return NULL;
|
|
|
|
|
|
if( nSlotIndex < 0 || nSlotIndex >= INVENTORYMAX ) return NULL;
|
|
|
|
|
|
return pStruct->pInventory[nSlotIndex];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CDnItemTask::InsertCashInventoryItem( CDNUserSession * pSession, INT64 biItemSerial, CDnItem *pItem )
|
|
|
|
|
|
{
|
|
|
|
|
|
CDNGameRoom::PartyStruct *pStruct = GetPartyData( pSession );
|
|
|
|
|
|
if( pStruct == NULL ) return false;
|
|
|
|
|
|
if (biItemSerial <= 0) return false;
|
|
|
|
|
|
|
|
|
|
|
|
std::map<INT64, CDnItem*>::iterator iter = pStruct->pMapCashInventory.find(biItemSerial);
|
|
|
|
|
|
if (iter != pStruct->pMapCashInventory.end()){
|
|
|
|
|
|
SAFE_DELETE(iter->second);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pStruct->pMapCashInventory[biItemSerial] = pItem;
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CDnItemTask::RemoveCashInventoryItem( CDNUserSession * pSession, INT64 biItemSerial )
|
|
|
|
|
|
{
|
|
|
|
|
|
CDNGameRoom::PartyStruct *pStruct = GetPartyData( pSession );
|
|
|
|
|
|
if( pStruct == NULL ) return false;
|
|
|
|
|
|
if (biItemSerial <= 0) return NULL;
|
|
|
|
|
|
|
|
|
|
|
|
std::map<INT64, CDnItem*>::iterator iter = pStruct->pMapCashInventory.find(biItemSerial);
|
|
|
|
|
|
if (iter != pStruct->pMapCashInventory.end()){
|
|
|
|
|
|
SAFE_DELETE(iter->second);
|
|
|
|
|
|
pStruct->pMapCashInventory.erase(iter);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CDnItem *CDnItemTask::GetCashInventoryItem( CDNUserSession * pSession, INT64 biItemSerial )
|
|
|
|
|
|
{
|
|
|
|
|
|
CDNGameRoom::PartyStruct *pStruct = GetPartyData( pSession );
|
|
|
|
|
|
if( pStruct == NULL ) return NULL;
|
|
|
|
|
|
if (biItemSerial <= 0) return NULL;
|
|
|
|
|
|
|
|
|
|
|
|
std::map<INT64, CDnItem*>::iterator iter = pStruct->pMapCashInventory.find(biItemSerial);
|
|
|
|
|
|
if (iter == pStruct->pMapCashInventory.end()) return NULL;
|
|
|
|
|
|
return iter->second;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CDnItemTask::InsertVehicleEquipItem( CDNUserSession * pSession, int nEquipIndex, CDnItem *pItem, bool bGenerationEvent/* = true*/ )
|
|
|
|
|
|
{
|
|
|
|
|
|
CDNGameRoom::PartyStruct *pStruct = GetPartyData( pSession );
|
|
|
|
|
|
if( pStruct == NULL ) return false;
|
|
|
|
|
|
if( nEquipIndex < Vehicle::Slot::Body || nEquipIndex >= Vehicle::Slot::Max ) return false;
|
|
|
|
|
|
if( pStruct->pVehicleEquip[nEquipIndex] ) return false;
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef _DEBUG
|
|
|
|
|
|
if (nEquipIndex >= Vehicle::Slot::Max)
|
|
|
|
|
|
_ASSERT(0);
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < Vehicle::Slot::Max; i++)
|
|
|
|
|
|
if (pStruct->pVehicleEquip[i] == pItem)
|
|
|
|
|
|
_ASSERT(0);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
pStruct->pVehicleEquip[nEquipIndex] = pItem;
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CDnItemTask::RemoveVehicleEquipItem( CDNUserSession * pSession, int nEquipIndex )
|
|
|
|
|
|
{
|
|
|
|
|
|
CDNGameRoom::PartyStruct *pStruct = GetPartyData( pSession );
|
|
|
|
|
|
if( pStruct == NULL ) return false;
|
|
|
|
|
|
if( nEquipIndex < Vehicle::Slot::Body || nEquipIndex >= Vehicle::Slot::Max ) return false;
|
|
|
|
|
|
if( !pStruct->pVehicleEquip[nEquipIndex] ) return false;
|
|
|
|
|
|
|
|
|
|
|
|
SAFE_DELETE( pStruct->pVehicleEquip[nEquipIndex] );
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CDnItem *CDnItemTask::GetVehicleEquipItem( CDNUserSession * pSession, int nEquipIndex )
|
|
|
|
|
|
{
|
|
|
|
|
|
CDNGameRoom::PartyStruct *pStruct = GetPartyData( pSession );
|
|
|
|
|
|
if( pStruct == NULL ) return NULL;
|
|
|
|
|
|
if( nEquipIndex < Vehicle::Slot::Body || nEquipIndex >= Vehicle::Slot::Max ) return false;
|
|
|
|
|
|
return pStruct->pVehicleEquip[nEquipIndex];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CDnItemTask::InsertVehicleInventoryItem( CDNUserSession * pSession, INT64 biItemSerial, CDnItem *pItem )
|
|
|
|
|
|
{
|
|
|
|
|
|
CDNGameRoom::PartyStruct *pStruct = GetPartyData( pSession );
|
|
|
|
|
|
if( pStruct == NULL ) return false;
|
|
|
|
|
|
if (biItemSerial <= 0) return false;
|
|
|
|
|
|
|
|
|
|
|
|
std::map<INT64, CDnItem*>::iterator iter = pStruct->pMapVehicleInventory.find(biItemSerial);
|
|
|
|
|
|
if (iter != pStruct->pMapVehicleInventory.end()){
|
|
|
|
|
|
SAFE_DELETE(iter->second);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pStruct->pMapVehicleInventory[biItemSerial] = pItem;
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CDnItemTask::RemoveVehicleInventoryItem( CDNUserSession * pSession, INT64 biItemSerial )
|
|
|
|
|
|
{
|
|
|
|
|
|
CDNGameRoom::PartyStruct *pStruct = GetPartyData( pSession );
|
|
|
|
|
|
if( pStruct == NULL ) return false;
|
|
|
|
|
|
if (biItemSerial <= 0) return NULL;
|
|
|
|
|
|
|
|
|
|
|
|
std::map<INT64, CDnItem*>::iterator iter = pStruct->pMapVehicleInventory.find(biItemSerial);
|
|
|
|
|
|
if (iter != pStruct->pMapVehicleInventory.end()){
|
|
|
|
|
|
SAFE_DELETE(iter->second);
|
|
|
|
|
|
pStruct->pMapVehicleInventory.erase(iter);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CDnItem *CDnItemTask::GetVehicleInventoryItem( CDNUserSession * pSession, INT64 biItemSerial )
|
|
|
|
|
|
{
|
|
|
|
|
|
CDNGameRoom::PartyStruct *pStruct = GetPartyData( pSession );
|
|
|
|
|
|
if( pStruct == NULL ) return NULL;
|
|
|
|
|
|
if (biItemSerial <= 0) return NULL;
|
|
|
|
|
|
|
|
|
|
|
|
std::map<INT64, CDnItem*>::iterator iter = pStruct->pMapVehicleInventory.find(biItemSerial);
|
|
|
|
|
|
if (iter == pStruct->pMapVehicleInventory.end()) return NULL;
|
|
|
|
|
|
return iter->second;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CDnItemTask::SortInventory( CDNUserSession *pSession, CSSortInventory *pSort)
|
|
|
|
|
|
{
|
|
|
|
|
|
CDNGameRoom::PartyStruct *pStruct = GetPartyData( pSession );
|
|
|
|
|
|
if( pStruct == NULL ) return false;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD> <20>ϱ<EFBFBD><CFB1><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̱<EFBFBD><CCB1><EFBFBD> ;<3B><>;
|
|
|
|
|
|
CDnItem* pNewInventory[INVENTORYMAX] = { 0, };
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < pSort->cTotalCount; i++){
|
|
|
|
|
|
if (pSort->SlotInfo[i].cCurrent < 0) continue;
|
|
|
|
|
|
pNewInventory[pSort->SlotInfo[i].cNew] = pStruct->pInventory[pSort->SlotInfo[i].cCurrent];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < INVENTORYMAX; i++){
|
|
|
|
|
|
pStruct->pInventory[i] = pNewInventory[i];
|
|
|
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CDnItemTask::InitializePlayerItem( CDNUserSession* pSession )
|
|
|
|
|
|
{
|
|
|
|
|
|
const TItem *pItemData;
|
|
|
|
|
|
CDnItem *pItem;
|
|
|
|
|
|
for( int j=0; j<EQUIPMAX; j++ )
|
|
|
|
|
|
{
|
|
|
|
|
|
pItemData = pSession->GetItem()->GetEquip( j );
|
|
|
|
|
|
if( !pItemData || pItemData->nItemID == 0 )
|
|
|
|
|
|
continue;
|
|
|
|
|
|
pItem = CreateItem( pItemData );
|
|
|
|
|
|
if( !pItem )
|
|
|
|
|
|
{
|
|
|
|
|
|
_ASSERT(0);
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
InsertEquipItem( pSession, j, pItem, false );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for( int j=0; j<CASHEQUIPMAX; j++ )
|
|
|
|
|
|
{
|
|
|
|
|
|
pItemData = pSession->GetItem()->GetCashEquip( j );
|
|
|
|
|
|
if( !pItemData || pItemData->nItemID == 0 )
|
|
|
|
|
|
continue;
|
|
|
|
|
|
pItem = CreateItem( pItemData );
|
|
|
|
|
|
if( !pItem )
|
|
|
|
|
|
{
|
|
|
|
|
|
_ASSERT(0);
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
InsertCashEquipItem( pSession, j, pItem, false );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for( int j=0; j<GLYPHMAX; j++ ) {
|
|
|
|
|
|
pItemData = pSession->GetItem()->GetGlyph(j);
|
|
|
|
|
|
if( !pItemData || pItemData->nItemID == 0 )
|
|
|
|
|
|
continue;
|
|
|
|
|
|
pItem = CreateItem( pItemData );
|
|
|
|
|
|
if( !pItem )
|
|
|
|
|
|
{
|
|
|
|
|
|
_ASSERT(0);
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
InsertGlyphItem( pSession, j, pItem, false );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(PRE_ADD_TALISMAN_SYSTEM)
|
|
|
|
|
|
for( int j=0; j<TALISMAN_MAX; j++ ) {
|
|
|
|
|
|
pItemData = pSession->GetItem()->GetTalisman(j);
|
|
|
|
|
|
if( !pItemData || pItemData->nItemID == 0 )
|
|
|
|
|
|
continue;
|
|
|
|
|
|
pItem = CreateItem( pItemData );
|
|
|
|
|
|
if( !pItem )
|
|
|
|
|
|
{
|
|
|
|
|
|
_ASSERT(0);
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
InsertTalismanItem( pSession, j, pItem );
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
for( int j=0; j<INVENTORYMAX; j++ )
|
|
|
|
|
|
{
|
|
|
|
|
|
pItemData = pSession->GetItem()->GetInventory( j );
|
|
|
|
|
|
if( !pItemData || pItemData->nItemID == 0 )
|
|
|
|
|
|
continue;
|
|
|
|
|
|
pItem = CreateItem( pItemData );
|
|
|
|
|
|
if( !pItem )
|
|
|
|
|
|
{
|
|
|
|
|
|
#if defined( _WORK )
|
|
|
|
|
|
const_cast<TItem*>(pItemData)->nItemID = 0;
|
|
|
|
|
|
#else
|
|
|
|
|
|
_ASSERT(0);
|
|
|
|
|
|
#endif // #if defined( _WORK )
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
InsertInventoryItem( pSession, j, pItem );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pSession->GetItem()->InitializePlayerCashItem(this);
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CDnItemTask::InitializePlayerItem()
|
|
|
|
|
|
{
|
|
|
|
|
|
const TItem *pItemData;
|
|
|
|
|
|
CDnItem *pItem;
|
|
|
|
|
|
CDNUserSession *pSession;
|
|
|
|
|
|
for( DWORD i=0; i<GetUserCount(); i++ ) {
|
|
|
|
|
|
pSession = GetUserData(i);
|
|
|
|
|
|
|
|
|
|
|
|
for( int j=0; j<EQUIPMAX; j++ ) {
|
|
|
|
|
|
pItemData = pSession->GetItem()->GetEquip(j);
|
|
|
|
|
|
if( !pItemData || pItemData->nItemID == 0 ) continue;
|
|
|
|
|
|
pItem = CreateItem( pItemData );
|
|
|
|
|
|
if( !pItem ) {
|
|
|
|
|
|
_ASSERT(0);
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
InsertEquipItem( pSession, j, pItem );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for( int j=0; j<CASHEQUIPMAX; j++ ) {
|
|
|
|
|
|
pItemData = pSession->GetItem()->GetCashEquip(j);
|
|
|
|
|
|
if( !pItemData || pItemData->nItemID == 0 ) continue;
|
|
|
|
|
|
pItem = CreateItem( pItemData );
|
|
|
|
|
|
if( !pItem ) {
|
|
|
|
|
|
_ASSERT(0);
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
InsertCashEquipItem( pSession, j, pItem );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for( int j=0; j<GLYPHMAX; j++ ) {
|
|
|
|
|
|
pItemData = pSession->GetItem()->GetGlyph(j);
|
|
|
|
|
|
if( !pItemData || pItemData->nItemID == 0 ) continue;
|
|
|
|
|
|
pItem = CreateItem( pItemData );
|
|
|
|
|
|
if( !pItem ) {
|
|
|
|
|
|
_ASSERT(0);
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
InsertGlyphItem( pSession, j, pItem );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(PRE_ADD_TALISMAN_SYSTEM)
|
|
|
|
|
|
for( int j=0; j<TALISMAN_MAX; j++ ) {
|
|
|
|
|
|
pItemData = pSession->GetItem()->GetTalisman(j);
|
|
|
|
|
|
if( !pItemData || pItemData->nItemID == 0 ) continue;
|
|
|
|
|
|
pItem = CreateItem( pItemData );
|
|
|
|
|
|
if( !pItem ) {
|
|
|
|
|
|
_ASSERT(0);
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
InsertTalismanItem( pSession, j, pItem );
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
for( int j=0; j<INVENTORYMAX; j++ ) {
|
|
|
|
|
|
pItemData = pSession->GetItem()->GetInventory(j);
|
|
|
|
|
|
if( !pItemData || pItemData->nItemID == 0 )
|
|
|
|
|
|
continue;
|
|
|
|
|
|
pItem = CreateItem( pItemData );
|
|
|
|
|
|
if( !pItem ) {
|
|
|
|
|
|
_ASSERT(0);
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
InsertInventoryItem( pSession, j, pItem );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pSession->GetItem()->InitializePlayerCashItem(this);
|
|
|
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CDnItemTask::ScanItemFromID( DnActorHandle hActor, int nItemTableID, std::vector<CDnItem *> *pVecResult )
|
|
|
|
|
|
{
|
|
|
|
|
|
for( DWORD i=0; i<GetUserCount(); i++ ) {
|
|
|
|
|
|
if( GetUserData(i)->GetActorHandle() == hActor ) {
|
|
|
|
|
|
int nCount = 0;
|
|
|
|
|
|
CDNGameRoom::PartyStruct *pStruct = GetPartyData(i);
|
|
|
|
|
|
if( pStruct == NULL ) continue;
|
|
|
|
|
|
//CDNSession::PartyStruct *pStruct = GetPartyData(i);
|
|
|
|
|
|
for( DWORD j=0; j<INVENTORYMAX; j++ ) {
|
|
|
|
|
|
CDnItem *pItem = pStruct->pInventory[j];
|
|
|
|
|
|
if( pItem == NULL ) continue;
|
|
|
|
|
|
if( pItem->GetClassID() == nItemTableID ) {
|
|
|
|
|
|
if( pVecResult ) pVecResult->push_back( pItem );
|
|
|
|
|
|
nCount += pItem->GetOverlapCount();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return nCount;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void CDnItemTask::RequestRebirthCoinUseAnyPlayer( CDNUserSession *pUser, CDNUserSession *pTarget )
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><>Ȱ<EFBFBD><C8B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD>
|
|
|
|
|
|
if( !_bIsRebirth() )
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
DnActorHandle hActor = pTarget->GetActorHandle();
|
|
|
|
|
|
|
|
|
|
|
|
if (pUser->GetRebirthCashCoin() > 0){
|
|
|
|
|
|
pUser->DelCashRebirthCoin(1);
|
|
|
|
|
|
|
|
|
|
|
|
// Note : <20>̺<EFBFBD><CCBA>丮<EFBFBD><E4B8AE><EFBFBD><EFBFBD> <20><>Ȱ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> Ȯ<><C8AE><EFBFBD>Ѵ<EFBFBD>.
|
|
|
|
|
|
// <09><><EFBFBD><EFBFBD> <20>ִٸ<D6B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϳ<EFBFBD> <20>Ҹ<EFBFBD><D2B8>ϰ<EFBFBD> <20><>Ȱ <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>Ѵ<EFBFBD>.
|
|
|
|
|
|
if( hActor )
|
|
|
|
|
|
{
|
|
|
|
|
|
hActor->CmdAddStateEffect( NULL, STATE_BLOW::BLOW_057, 5000, "Coin" );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pUser->GetEventSystem()->OnEvent( EventSystem::OnRebirthAny );
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
_ASSERT(0);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (GetRoom()->GetPartyData(pTarget)->nUsableRebirthCoin > 0){
|
|
|
|
|
|
GetRoom()->GetPartyData(pTarget)->nUsableRebirthCoin -= 1;
|
|
|
|
|
|
if (GetRoom()->GetPartyData(pTarget)->nUsableRebirthCoin <= 0) GetRoom()->GetPartyData(pTarget)->nUsableRebirthCoin = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pUser->SendRebirthCoin(ERROR_NONE, GetPartyData(pUser)->nUsableRebirthCoin, _REBIRTH_REBIRTHEE, pTarget->GetSessionID());
|
|
|
|
|
|
pTarget->SendRebirthCoin(ERROR_NONE, GetPartyData(pTarget)->nUsableRebirthCoin, _REBIRTH_REBIRTHER, pUser->GetSessionID());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CDnItemTask::FindInventoryItemFromItemType( CDNUserSession * pSession, eItemTypeEnum Type, std::vector<CDnItem *> &pVecResult )
|
|
|
|
|
|
{
|
|
|
|
|
|
CDNGameRoom::PartyStruct *pStruct = GetPartyData( pSession );
|
|
|
|
|
|
if( !pStruct ) return 0;
|
|
|
|
|
|
for( int i=0; i<INVENTORYMAX; i++ ) {
|
|
|
|
|
|
if( !pStruct->pInventory[i] ) continue;
|
|
|
|
|
|
if( pStruct->pInventory[i]->GetItemType() == Type )
|
|
|
|
|
|
pVecResult.push_back( pStruct->pInventory[i] );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return (int)pVecResult.size();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CDnItemTask::FindCashInventoryItemFromItemType( CDNUserSession * pSession, eItemTypeEnum Type, std::vector<CDnItem *> &pVecResult )
|
|
|
|
|
|
{
|
|
|
|
|
|
CDNGameRoom::PartyStruct *pStruct = GetPartyData( pSession );
|
|
|
|
|
|
if( !pStruct ) return 0;
|
|
|
|
|
|
|
|
|
|
|
|
std::map<INT64, CDnItem*>::iterator iter;
|
|
|
|
|
|
for (iter = pStruct->pMapCashInventory.begin(); iter != pStruct->pMapCashInventory.end(); ++iter){
|
|
|
|
|
|
if (iter->second->GetItemType() == Type)
|
|
|
|
|
|
pVecResult.push_back( iter->second );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return (int)pVecResult.size();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CDnItemTask::OnRecvItemModitemExpireDate( CDNUserSession *pSession, CSModItemExpireDate *pPacket, int nLen )
|
|
|
|
|
|
{
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ұ<EFBFBD><D2B0><EFBFBD>(Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. Ȯ<><C8AE> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <20>Ѵٸ<D1B4> <20><><EFBFBD>Ϲ<EFBFBD> <20><><EFBFBD><EFBFBD>)
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
|
|
|
|
|
|
if (sizeof(CSModItemExpireDate) != nLen)
|
|
|
|
|
|
return ERROR_INVALIDPACKET;
|
|
|
|
|
|
|
|
|
|
|
|
if( !pSession->GetActorHandle() )
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
|
|
|
|
|
|
// Note <20>ѱ<EFBFBD>: <20><><EFBFBD><EFBFBD> <20><><EFBFBD>¿<EFBFBD><C2BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD>.
|
|
|
|
|
|
if( pSession->GetActorHandle()->IsDie() )
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
|
|
|
|
|
|
CDNUserItem *pItem = pSession->GetItem();
|
|
|
|
|
|
if(!pItem)
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
|
|
|
|
|
|
const TItem *pExpendItem = pSession->GetItem()->GetCashInventory(pPacket->biExpireDateItemSerial);
|
|
|
|
|
|
bool bFlag = false; //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ
|
|
|
|
|
|
|
|
|
|
|
|
if(pExpendItem)
|
|
|
|
|
|
{
|
|
|
|
|
|
TItemData *pExpendItemData = g_pDataManager->GetItemData(pExpendItem->nItemID);
|
|
|
|
|
|
|
|
|
|
|
|
if(pExpendItemData)
|
|
|
|
|
|
{
|
|
|
|
|
|
int nMin = 0;
|
|
|
|
|
|
//<2F>Ⱓ<EFBFBD><E2B0A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ÿ<>Կ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><EFBFBD><DEB6><EFBFBD>
|
|
|
|
|
|
switch(pExpendItemData->nType)
|
|
|
|
|
|
{
|
|
|
|
|
|
case ITEMTYPE_PET_EXPIRE:
|
|
|
|
|
|
{
|
|
|
|
|
|
const TVehicle *pPet = pItem->GetVehicleInventory(pPacket->biItemSerial);
|
|
|
|
|
|
if(pPet)
|
|
|
|
|
|
{
|
|
|
|
|
|
TItemData *pPetItemData = g_pDataManager->GetItemData( pPet->Vehicle[Pet::Slot::Body].nItemID );
|
|
|
|
|
|
if( pPetItemData && pPetItemData->nType == ITEMTYPE_PET )
|
|
|
|
|
|
{
|
|
|
|
|
|
nMin = pExpendItemData->nTypeParam[0] * 24 * 60;
|
|
|
|
|
|
bFlag = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if(bFlag)
|
|
|
|
|
|
{
|
|
|
|
|
|
pItem->ModItemExpireDate(pPacket, nMin);
|
|
|
|
|
|
pItem->DeleteCashInventoryBySerial(pPacket->biExpireDateItemSerial,1,false); //<2F>Ⱓ<EFBFBD><E2B0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ModItemExpireDate() <20>Լ<EFBFBD> <20>ȿ<EFBFBD><C8BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CDnItemTask::OnRecvItemDeletePetSkill( CDNUserSession *pSession, CSPetSkillDelete *pPacket, int nLen )
|
|
|
|
|
|
{
|
|
|
|
|
|
if (sizeof(CSPetSkillDelete) != nLen)
|
|
|
|
|
|
return ERROR_INVALIDPACKET;
|
|
|
|
|
|
|
|
|
|
|
|
CDNUserItem *pItem = pSession->GetItem();
|
|
|
|
|
|
if(!pItem)
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
|
|
|
|
|
|
int nRet = pItem->DelPetSkill(pPacket->cSlotNum);
|
|
|
|
|
|
pSession->SendPetSkillDelete(nRet, pPacket->cSlotNum);
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|