Files
2022-10-26 12:25:11 +08:00

3714 lines
121 KiB
C++

#include "StdAfx.h"
#include ".\handler_cg_item.h"
#include <Protocol_CG.h>
#include <Protocol_DG.h>
#include <PacketStruct_CG.h>
#include <PacketStruct_DG.h>
#include <PacketStruct_AG.h>
#include "Player.h"
#include "ItemManager.h"
#include "PlayerManager.h"
#include "GameServerEx.h"
#include <SCItemSlotContainer.h>
#include "GameField.h"
#include "Item.h"
#include "Sector.h"
#include "ObjectFactory.h"
#include "QuickManager.h"
#include "Map.h"
#include "GameServerEx.h"
#include "GameZone.h"
#include "ItemExpDistributor.h"
#include "StatisticsManager.h"
#include "ItemInfoParser.h"
#include "ExtraNPCManager.h"
#include "FunctionalRestrictManager.h"
#include "GuildWareHouseSlotContainer.h"
#include <ServerOptionParserEx.h>
#include "GameParty/NewGamePartyManager.h"
#include "InventorySlotContainer.h"
#include "Skill.h"
#include "PKScriptParser.h"
#include "GroupInfoParser.h"
#include "PlayerRider.h"
#include "RandomItemImplement.h" // [11/3/2009 namka199]
#include "CrystallizeImplement.h" // [11/3/2009 namka199]
#ifdef _NA_1419_20100121_ACCUMULATE_POINT
#include "AccumulatePointImplement.h"
#endif
#include "./Slot/EtherealizeImpl.h"
#include "ComposeOrDecomposeImplement.h"
// _NA_000251_20100727_SOCKET_SYSTEM
#include "./SocketSystem/SocketSystemImplement.h" // 家南 矫胶袍 备泅
#include "ImplementUtil.h"
#ifdef _NA_0_20110613_GAME_SHOP_RENEWAL
#include "UseExtendDateItemImplement.h"
#endif
#ifdef _NA_003740_20111122_RANDOM_ITEM
#include "RandomItemParser.h"
#endif // _NA_003740_20111122_RANDOM_ITEM
#include <AchievementManager.h>
//--------------------------------------------------------------------------------------------------
// changes, f100819.1L
const nsPacket::PacketHandlerInfo Handler_CG_ITEM::GetPacketHandlerNodes()
{
#define HANDLER_NODE_INFO(c, p, phase) { MAKEWORD(c, p), phase, Handler_CG_ITEM::On##p }
#define HANDLER_NODE_INFO_EOR() { 0, static_cast<ePHASE_SHIFT>(0), NULL }
static const nsPacket::PacketHandlerNode handlers_static_[] =
{
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_MOVE_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_PICK_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_PICK_MONEY_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_EXCHANGE_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_DROP_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_COMBINE_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_DIVIDE_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_USE_MOTION_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_USE_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_BUY_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_SELL_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_DELETE_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_REPAIR_DURA_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_PORTAL_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_CLEAR_COORD_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_QUICK_LINKITEM_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_QUICK_LINKSKILL_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_QUICK_UNLINK_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_QUICK_MOVE_SYN, PHASE_SERVICE),
// NOTE: f110216.2L, unused section
//HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_QUICK_UPDATE_LINKED_ITEM_CMD, PHASE_SERVICE),
// 炼钦
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_ENCHANT_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_ENCHANTUP_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_SOCKET_FILL_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_SOCKET_EXTRACT_SYN, PHASE_SERVICE),
//HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_ACCESSORY_CREATE_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_COMPOSE_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_CRYSTALIZE_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_EXTRASTONE_USE_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_INIT_STAT_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_INVENTORY_PWD_SETTING_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_INVENTORY_PWD_CHECK_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_INVENTORY_PWD_LOCKING_SYN , PHASE_SERVICE),
#ifdef __NA_001027_20080423_RANDOM_REWARD_EVENT_
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_EXCHANGE_REWARD_ITEM_SYN, PHASE_SERVICE),
#endif
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_HAMMER_OF_ALCHEMIST_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_VALIDATION_OF_REIHALT_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_REPURCHASE_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_USE_PET_ITEM_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_USE_PANDORA_ITEM_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_MOVE_PANDORA_ITEM_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_MOVE_ALL_PANDORA_ITEM_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_PANDORABOX_CLOSE_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_EQUIP_ETHER_DEVICE_SYN, PHASE_SERVICE),
{ MAKEWORD(CG_ITEM, CG_ITEM_USE_SKILL_ACTION_SYN), PHASE_SERVICE,
Handler_CG_ITEM::OnCG_ITEM_USE_SYN },
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_STAT_CHANGE_USE_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_STAT_CHANGE_SELECT_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_USE_CHANGE_PET_NAME_ITEM_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_ACTIVE_ETHER_BULLET_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_IDENTIFY_POSSESSION_SYN, PHASE_SERVICE),
//__NA_0_CASH_ITEM_RENEWAL_SUPERMASTER
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_FIXED_AMOUNT_EX_ITEM_FIRE_UP_SYN, PHASE_SERVICE),
//__NA001390_090915_RIDING_SYSTEM__
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_RIDER_CONTROL_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_RIDER_CONTROL_PARTS_SYN, PHASE_SERVICE),
//_NA_0_20091030_RANDOM_ITEM
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_USE_RANDOM_ITEM_SYN, PHASE_SERVICE),
#ifdef _NA_1419_20100121_ACCUMULATE_POINT
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_QUERY_ACCUMULATE_POINT_ITEM_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_USE_ACCUMULATE_POINT_SYN, PHASE_SERVICE),
#endif
//_NA000023_090323_ENHANCED_INVENTORY_SLOT_FUNCTIONALITY_
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_INVENTORY_CONFIG_CHANGE_SYN, PHASE_SERVICE),
//_NA000109_100427_ITEM_CUSTOMIZING_CONTENTS_
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_ETHERIA_CONTROL_SYN, PHASE_SERVICE),
//_NA_000096_20100527_CHANGE_CHARACTER_APPEARANCE_SYSTEM
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_CHANGE_CHARACTER_APPEARANCE_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_COMPOSE_OR_DECOMPOSE_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_GET_COMPOSITION_OR_DECOMPOSITION_HISTORIES_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_MODIFY_COMPOSITION_OR_DECOMPOSITION_HISTORIES_CMD, PHASE_SERVICE),
//_NA_000251_20100727_SOCKET_SYSTEM
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_RECREATE_SOCKET_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_IDENTIFY_SOCKET_CMD, PHASE_SERVICE),
#ifdef _NA_0_20110613_GAME_SHOP_RENEWAL
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_USE_EXTEND_DATE_SYN, PHASE_SERVICE),
#endif
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_RANDOMIZE_SYN, PHASE_SERVICE),
#ifdef _NA_008124_20150313_AWAKENING_SYSTEM
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_AWAKENING_SYN, PHASE_SERVICE),
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_EVOLUTION_SYN, PHASE_SERVICE),
#endif // _NA_008124_20150313_AWAKENING_SYSTEM
#ifdef _NA_008069_20150210_ADD_SPA_SYSTEM
HANDLER_NODE_INFO(CG_ITEM, CG_ITEM_SPA_COSTUME_CHANGE_SYN, PHASE_SERVICE),
#endif //_NA_008069_20150210_ADD_SPA_SYSTEM
HANDLER_NODE_INFO(CG_ITEM,CG_ITEM_WEB_DELETE_ACK,PHASE_SERVICE), //xiaomi 添加WEB 刪除裝備
#ifdef _20220329_ADD_EQU_RECOVERY
HANDLER_NODE_INFO(CG_ITEM,CG_ITEM_EQU_RECOVERY_SYN,PHASE_SERVICE),
#endif
HANDLER_NODE_INFO_EOR() // end of records
};
//
BOOST_STATIC_ASSERT(_countof(handlers_static_) >= 1);
nsPacket::PacketHandlerInfo return_value = { handlers_static_, _countof(handlers_static_) - 1 };
//
return return_value;
};
//--------------------------------------------------------------------------------------------------
static BOOL CheckProcessInventoryLock( Player* pPlayer, BYTE protocol, DWORD appendData = 0 )
{
ProtectorInventory& rPROTECT = pPlayer->GetWarehouseInventoryProtector().INVENTORY();
DWORD checkInvenLock = rPROTECT.IsUsable() ? ULONG_MAX : RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
if( ULONG_MAX == checkInvenLock )
return TRUE; // Pass
switch( protocol )
{
case CG_ITEM_ENCHANT_SYN:
{
MSG_CG_ITEM_ENCHANT_NAK msgNAK;
msgNAK.m_byErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
pPlayer->SendPacket( &msgNAK, sizeof(msgNAK) );
}
break;
case CG_ITEM_SOCKET_FILL_SYN:
{
MSG_CG_ITEM_SOCKET_FILL_NAK msgNAK;
msgNAK.m_dwErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
pPlayer->SendPacket( &msgNAK, sizeof(msgNAK) );
}
break;
case CG_ITEM_SOCKET_EXTRACT_SYN:
{
MSG_CG_ITEM_SOCKET_EXTRACT_NAK msgNAK;
msgNAK.m_dwErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
pPlayer->SendPacket( &msgNAK, sizeof(msgNAK) );
}
break;
case CG_ITEM_HAMMER_OF_ALCHEMIST_SYN:
{
MSG_CG_ITEM_HAMMER_OF_ALCHEMIST_NAK msgNAK;
msgNAK.m_dwErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
pPlayer->SendPacket( &msgNAK, sizeof(msgNAK) );
}
break;
case CG_ITEM_COMPOSE_SYN:
{
MSG_CG_ITEM_COMPOSE_NAK msgNAK;
msgNAK.m_byErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
pPlayer->SendPacket( &msgNAK, sizeof(msgNAK) );
}
break;
case CG_ITEM_CRYSTALIZE_SYN:
{
MSG_CG_ITEM_CRYSTALIZE_NAK msgNAK;
msgNAK.m_byErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
pPlayer->SendPacket( &msgNAK, sizeof(msgNAK) );
}
break;
case CG_ITEM_EXTRASTONE_USE_SYN:
{
MSG_CG_ITEM_EXTRASTONE_USE_NAK msgNAK;
msgNAK.m_byErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
pPlayer->SendPacket( &msgNAK, sizeof(msgNAK) );
}
break;
case CG_ITEM_PICK_SYN:
{
MSG_CG_ITEM_PICK_NAK msgNAK;
msgNAK.m_dwErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
pPlayer->SendPacket( &msgNAK, sizeof(msgNAK) );
}
break;
case CG_ITEM_DROP_SYN:
{
MSG_CG_ITEM_DROP_NAK msgNAK;
msgNAK.m_byCategory = CG_ITEM;
msgNAK.m_byProtocol = CG_ITEM_DROP_NAK;
msgNAK.m_dwErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
pPlayer->SendPacket( &msgNAK, sizeof(msgNAK) );
}
break;
case CG_ITEM_COMBINE_SYN:
{
MSG_CG_ITEM_COMBINE_NAK msgNAK;
msgNAK.m_byCategory = CG_ITEM;
msgNAK.m_byProtocol = CG_ITEM_COMBINE_NAK;
msgNAK.m_dwErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
pPlayer->SendPacket( &msgNAK, sizeof(msgNAK) );
}
break;
case CG_ITEM_DIVIDE_SYN:
{
MSG_CG_ITEM_DIVIDE_NAK msgNAK;
msgNAK.m_byErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
pPlayer->SendPacket( &msgNAK, sizeof(msgNAK) );
}
break;
case CG_ITEM_USE_SYN:
{
MSG_CG_ITEM_USE_NAK msgNAK;
msgNAK.m_ErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
pPlayer->SendPacket( &msgNAK, sizeof(msgNAK) );
}
break;
case CG_ITEM_SELL_SYN:
{
MSG_CG_ITEM_SELL_NAK msgNAK;
msgNAK.m_byCategory = CG_ITEM;
msgNAK.m_byProtocol = CG_ITEM_SELL_NAK;
msgNAK.m_dwErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
pPlayer->SendPacket( &msgNAK, sizeof(msgNAK) );
}
break;
case CG_ITEM_BUY_SYN:
{
MSG_CG_ITEM_BUY_NAK msgNAK;
msgNAK.m_dwErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
pPlayer->SendPacket( &msgNAK, sizeof(msgNAK) );
}
break;
case CG_ITEM_DROP_MONEY_SYN:
{
MSG_CG_ITEM_DROP_MONEY_NAK msgNAK;
msgNAK.m_byCategory = CG_ITEM;
msgNAK.m_byProtocol = CG_ITEM_DROP_MONEY_NAK;
msgNAK.m_dwErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
pPlayer->SendPacket( &msgNAK, sizeof(msgNAK) );
}
break;
case CG_ITEM_PICK_MONEY_SYN:
{
MSG_CG_ITEM_PICK_MONEY_NAK msgNAK;
msgNAK.m_dwFieldItemObjectKey = appendData;// dwFieldItemObjectKey;
msgNAK.m_dwErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
pPlayer->SendPacket( &msgNAK, sizeof(msgNAK) );
}
break;
case CG_ITEM_EXCHANGE_SYN:
{
MSG_CG_ITEM_EXCHANGE_NAK msgNAK;
msgNAK.m_byErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
pPlayer->SendPacket( &msgNAK, sizeof(msgNAK) );
}
break;
case CG_ITEM_QUICK_LINKITEM_SYN:
{
MSG_CG_ITEM_QUICK_LINKITEM_NAK msgNAK;
msgNAK.m_dwErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
pPlayer->SendPacket( &msgNAK, sizeof(msgNAK) );
}
break;
case CG_ITEM_QUICK_LINKSKILL_SYN:
{
//MSG_CG_ITEM_QUICK_LINKSKILL_NAK msgNAK;
//msgNAK.m_dwErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
//pPlayer->SendPacket( &msgNAK, sizeof(msgNAK) );
return TRUE;
}
case CG_ITEM_QUICK_UNLINK_SYN:
{
//MSG_CG_ITEM_QUICK_UNLINK_NAK msgNAK;
//msgNAK.m_dwErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
//pPlayer->SendPacket( &msgNAK, sizeof(msgNAK) );
return TRUE;
}
case CG_ITEM_QUICK_MOVE_SYN:
{
//MSG_CG_ITEM_QUICK_MOVE_NAK msgNAK;
//msgNAK.m_dwErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
//pPlayer->SendPacket( &msgNAK, sizeof(msgNAK) );
return TRUE;
}
case CG_ITEM_DELETE_SYN:
{
MSG_CG_ITEM_DELETE_NAK msgNAK;
msgNAK.m_byErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
pPlayer->SendPacket( &msgNAK, sizeof(msgNAK) );
}
break;
case CG_ITEM_REPAIR_DURA_SYN:
{
MSG_CG_ITEM_REPAIR_DURA_NAK msgNAK;
msgNAK.m_byErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
pPlayer->SendPacket( &msgNAK, sizeof(msgNAK) );
}
break;
case CG_ITEM_PORTAL_SYN:
{
MSG_CG_ITEM_USE_NAK msgNAK;
msgNAK.m_ErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
pPlayer->SendPacket( &msgNAK, sizeof(msgNAK) );
}
break;
case CG_ITEM_CLEAR_COORD_SYN:
{
MSG_CG_ITEM_USE_NAK msgNAK;
msgNAK.m_ErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
pPlayer->SendPacket( &msgNAK, sizeof(msgNAK) );
}
break;
case CG_ITEM_INIT_STAT_SYN:
{
MSG_CG_ITEM_INIT_STAT_NAK msgNAK;
msgNAK.m_ErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
pPlayer->SendPacket( &msgNAK, sizeof(msgNAK) );
}
break;
#ifdef __NA_001027_20080423_RANDOM_REWARD_EVENT_
case CG_ITEM_EXCHANGE_REWARD_ITEM_SYN:
{
MSG_CG_ITEM_EXCHANGE_REWARD_ITEM_NAK msgNAK;
msgNAK.m_ErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
pPlayer->SendPacket( &msgNAK, sizeof(msgNAK) );
}
break;
#endif
case CG_ITEM_VALIDATION_OF_REIHALT_SYN:
{
MSG_CG_ITEM_VALIDATION_OF_REIHALT_NAK NakMsg;
NakMsg.m_dwErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
pPlayer->SendPacket( &NakMsg, sizeof( NakMsg ));
}
break;
case CG_ITEM_USE_PET_ITEM_SYN:
{
MSG_CG_ITEM_USE_PET_ITEM_ACK AckMsg;
AckMsg.m_Result = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
pPlayer->SendPacket( &AckMsg, sizeof( AckMsg ) );
}
break;
case CG_ITEM_REPURCHASE_NAK:
{
MSG_CG_ITEM_REPURCHASE_NAK AckMsg;
AckMsg.m_ErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
pPlayer->SendPacket( &AckMsg, sizeof( AckMsg ) );
}
break;
case CG_ITEM_USE_PANDORA_ITEM_SYN:
case CG_ITEM_MOVE_PANDORA_ITEM_SYN:
case CG_ITEM_MOVE_ALL_PANDORA_ITEM_SYN:
return TRUE;
case CG_ITEM_EQUIP_ETHER_DEVICE_SYN:
{
MSG_CG_ITEM_EQUIP_ETHER_DEVICE_ACK AckMsg;
AckMsg.m_Result = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
pPlayer->SendPacket( &AckMsg, sizeof( AckMsg ) );
}
break;
case CG_ITEM_USE_CHANGE_PET_NAME_ITEM_SYN:
{
MSG_CG_ITEM_USE_CHANGE_PET_NAME_ITEM_ACK AckMsg;
AckMsg.m_ResultCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
pPlayer->SendPacket( &AckMsg, sizeof( AckMsg ) );
}
break;
case CG_ITEM_ACTIVE_ETHER_BULLET_SYN:
{
MSG_CG_ITEM_ACTIVE_ETHER_BULLET_ACK AckMsg;
AckMsg.m_ResultCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
pPlayer->SendPacket( &AckMsg, sizeof( AckMsg ) );
}
break;
case CG_ITEM_IDENTIFY_POSSESSION_SYN:
{
MSG_CG_ITEM_IDENTIFY_POSSESSION_ACK AckMsg;
AckMsg.m_ResultCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
pPlayer->SendPacket( &AckMsg, sizeof( AckMsg ) );
}
break;
//__NA_0_CASH_ITEM_RENEWAL_SUPERMASTER
case CG_ITEM_FIXED_AMOUNT_EX_ITEM_FIRE_UP_SYN:
{
MSG_CG_ITEM_FIXED_AMOUNT_EX_ITEM_FIRE_UP_ACK AckMsg;
AckMsg.m_ResultCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
pPlayer->SendPacket( &AckMsg, sizeof( AckMsg ) );
break;
}
case CG_ITEM_RIDER_CONTROL_SYN:
case CG_ITEM_RIDER_CONTROL_PARTS_SYN:
case CG_ITEM_ETHERIA_CONTROL_SYN: //_NA000109_100427_ITEM_CUSTOMIZING_CONTENTS_
{
// local handling
}
break;
#ifdef _NA_008124_20150313_AWAKENING_SYSTEM
case CG_ITEM_AWAKENING_SYN:
{
MSG_CG_ITEM_AWAKENING_ACK ack_msg;
ack_msg.result_code = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
pPlayer->SendPacket(&ack_msg, sizeof(ack_msg));
}
break;
case CG_ITEM_EVOLUTION_SYN:
{
MSG_CG_ITEM_EVOLUTION_ACK ack_msg;
ack_msg.result_code = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
pPlayer->SendPacket(&ack_msg, sizeof(ack_msg));
}
break;
#endif // _NA_008124_20150313_AWAKENING_SYSTEM
#ifdef _NA_008069_20150210_ADD_SPA_SYSTEM
case CG_ITEM_SPA_COSTUME_CHANGE_SYN:
{
MSG_CG_ITEM_SPA_COSTUME_CHANGE_NAK nak_packet;
nak_packet.error_code = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
pPlayer->SendPacket(&nak_packet, sizeof(nak_packet));
}
break;
#endif //_NA_008069_20150210_ADD_SPA_SYSTEM
default:
{
SUNLOG( eCRITICAL_LOG, _T("Unexpected Inventory Lock Check SYN %u\n"), protocol );
break;
}
}
return FALSE;
}
Handler_CG_ITEM::Handler_CG_ITEM()
{
}
Handler_CG_ITEM::~Handler_CG_ITEM()
{
}
Handler_CG_ITEM_IMPL( CG_ITEM_WEB_DELETE_ACK ) //xiaomi 添加處理WEB
{
__TOUCHED((pServerSession, pMsg, wSize));
MSG_CG_ITEM_WEB_DELETE_ACK *pRecvMsg = (MSG_CG_ITEM_WEB_DELETE_ACK*)pMsg;
Player *pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey );
if( !pPlayer ) return;
//{__NA001164_20081024_CHAR_WAY_POINT_ITEM
//傀捞器牢飘 府胶飘甫 烹茄 捞悼 饶贸府.
ItemManager* pItemManager = pPlayer->GetItemManager();
if( !pItemManager ) return;
ASSERT(pRecvMsg->m_ItemCode);
if (pRecvMsg->m_ItemCode == 0)
return;
SCSlotContainer * pContainer = (SCSlotContainer *)pItemManager->GetItemSlotContainer( SI_INVENTORY );
SCItemSlot & rItemSlot = (SCItemSlot &)pContainer->GetSlot( pRecvMsg->m_PortalPos );
POSTYPE item_position = INVALID_POSTYPE_VALUE;
if (rItemSlot.GetItemCode() == pRecvMsg->m_ItemCode)
{
item_position = pRecvMsg->m_PortalPos;
}
else
{
return;
}
if (item_position == INVALID_POSTYPE_VALUE)
return;
// 汗荐狼 倒 酒捞袍阑 昏力茄促.
RC::eITEM_RESULT rcResult = pPlayer->GetItemManager()->Delete( SI_INVENTORY, pRecvMsg->m_PortalPos, pRecvMsg->m_Dura, ITEM_WEB_EQU );
if( rcResult != RC::RC_ITEM_SUCCESS )
{
SUNLOG( eCRITICAL_LOG, "[MSG_AG_ITEM_DELETE] Cannot Delete WebItem! ErrorCode[%d]", rcResult );
return;
}
}
// 瘤匡锭 牢忙飘 包访 家胶 促 瘤匡巴~!
Handler_CG_ITEM_IMPL( CG_ITEM_ENCHANT_SYN )
{
__TOUCHED((pServerSession, pMsg, wSize));
MSG_CG_ITEM_ENCHANT_SYN * pRecvMsg = (MSG_CG_ITEM_ENCHANT_SYN *)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey );
ASSERT( pPlayer );
if( !pPlayer ) return ;
if( !pPlayer->GetField() )
{
SUNLOG( eCRITICAL_LOG, "[Handler_CG_ITEM_IMPL( CG_ITEM_ENCHANT_SYN )] Not Exist GameField" );
return;
}
RC::eITEM_RESULT rt;
if( g_ExtraNPCManager.IsLengthCanUseNPC(pRecvMsg->m_NPCCode, pPlayer, eNPC_TYPE_ITEM_MIX) )
{
if (!CheckProcessInventoryLock(pPlayer, CG_ITEM_ENCHANT_SYN))
{
return;
}
#ifdef _NA_003966_20111227_ADD_ENCHANT
const POSTYPE down_guard_item_pos = pRecvMsg->down_guard_item_pos;
#else
const POSTYPE down_guard_item_pos = INVALID_SLOT_POS;
#endif
rt = pPlayer->GetItemManager()->GetItemFunctionEnchant().Enchant(
pRecvMsg->m_TargetPos, down_guard_item_pos, (eENCHANT_OPTION)pRecvMsg->m_SuccessRateIndex);
}
else
{
rt = RC::RC_ITEM_LENGTH_CANNOT_USE_NPC;
}
switch( rt )
{
case RC::RC_ITEM_ENCHANT_SUCCESS:
{
// 己傍
MSG_CG_ITEM_ENCHANT_SUCCESS_ACK msg;
//msg.m_TargetPos = pRecvMsg->m_TargetPos;
pPlayer->SendPacket(&msg,sizeof(msg));
#ifdef _NA_003966_20111227_ADD_ENCHANT
AchievementManager* const ac_manager = pPlayer->GetACManager();
SCSlotContainer* const inventory = pPlayer->GetItemManager()->GetItemSlotContainer(SI_INVENTORY);
SCItemSlot& target_slot = static_cast<SCItemSlot&>(inventory->GetSlot(pRecvMsg->m_TargetPos));
ac_manager->ProcessEnchant(target_slot.GetItemCode(), target_slot.GetEnchant());
#endif
}
break;
case RC::RC_ITEM_ENCHANT_FAILED:
{
// 角菩
MSG_CG_ITEM_ENCHANT_FAILED_ACK msg;
msg.m_byErrorCode = rt;
pPlayer->SendPacket(&msg,sizeof(msg));
}
break;
case RC::RC_ITEM_ENCHANT_FAILED_AND_DESTROY:
case RC::RC_ITEM_ENCHANT_FAILED_AND_ENCHNAT_DOWN:
#ifdef _NA_007330_20140620_GUILD_SYSTEM_EXTENSION
case RC::RC_ITEM_ENCHANT_FAILED_AND_PREVENT:
#endif // _NA_007330_20140620_GUILD_SYSTEM_EXTENSION
{
// 角菩
MSG_CG_ITEM_ENCHANT_FAILED_ACK msg;
msg.m_byErrorCode = rt;
pPlayer->SendPacket(&msg,sizeof(msg));
}
break;
default:
{
MSG_CG_ITEM_ENCHANT_NAK msg;
ProtectorInventory& rPROTECT = pPlayer->GetWarehouseInventoryProtector().INVENTORY();
if( !rPROTECT.IsUsable() )
msg.m_byErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
else
msg.m_byErrorCode = rt;
pPlayer->SendPacket(&msg,sizeof(msg));
return;
}
}
g_StatisticsManager.PlusStatisticType( eSTATISTIC_ENCHANT_COUNT, 1 );
}
Handler_CG_ITEM_IMPL( CG_ITEM_ENCHANTUP_SYN )
{
__TOUCHED((pServerSession, pMsg, wSize));
/*
MSG_CG_ITEM_ENCHANTUP_SYN * pRecvMsg = (MSG_CG_ITEM_ENCHANTUP_SYN *)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey );
ASSERT( pPlayer );
if( !pPlayer ) return ;
BYTE Enchant = 0;
RC::eITEM_RESULT rt = pPlayer->GetItemManager()->Enchant( pRecvMsg->m_TargetPos, Enchant );
switch( rt )
{
case RC::RC_ITEM_ENCHANT_SUCCESS:
{
// 己傍
MSG_CG_ITEM_ENCHANTUP_ACK msg;
msg.m_TargetPos = pRecvMsg->m_TargetPos;
msg.m_TargetItemEnchant = Enchant;
pPlayer->SendPacket(&msg,sizeof(msg));
}
break;
case RC::RC_ITEM_ENCHANT_DOWN_FAILED:
{
// 角菩
// 促款
MSG_CG_ITEM_ENCHANTUP_ACK msg;
msg.m_TargetPos = pRecvMsg->m_TargetPos;
msg.m_TargetItemEnchant = Enchant;
pPlayer->SendPacket(&msg,sizeof(msg));
}
break;
case RC::RC_ITEM_ENCHANT_CRACK_FAILED:
{
// 角菩
// 家戈
MSG_CG_ITEM_ENCHANTUP_ACK msg;
msg.m_TargetPos = pRecvMsg->m_TargetPos;
msg.m_TargetItemEnchant = 0;
pPlayer->SendPacket(&msg,sizeof(msg));
}
break;
default:
{
MSG_CG_ITEM_ENCHANTUP_NAK msg;
msg.m_dwErrorCode = rt;
pPlayer->SendPacket(&msg,sizeof(msg));
}
}
*/
}
Handler_CG_ITEM_IMPL(CG_ITEM_SOCKET_FILL_SYN)
{
__TOUCHED((pServerSession, pMsg, wSize));
const MSG_CG_ITEM_SOCKET_FILL_SYN* const fill_syn =
static_cast<const MSG_CG_ITEM_SOCKET_FILL_SYN* const>(pMsg);
if (sizeof(*fill_syn) != wSize)
{
return;
}
Player* const requester = PlayerManager::Instance()->FindPlayerByUserKey(fill_syn->m_dwKey);
if (!requester)
{
return;
}
if (!requester->GetField())
{
SUNLOG(eCRITICAL_LOG, "[Handler_CG_ITEM_IMPL( CG_ITEM_SOCKET_FILL_SYN )] Not Exist GameField");
return;
}
if (!CheckProcessInventoryLock(requester, CG_ITEM_SOCKET_FILL_SYN))
{
return;
}
const RC::eITEM_RESULT fill_result = requester->GetItemManager()->GetItemFunctionSocket().
FillSocket(fill_syn->m_SocketItemPos, fill_syn->m_TargetPos);
switch(fill_result)
{
case RC::RC_ITEM_SUCCESS:
{
MSG_CG_ITEM_SOCKET_FILL_ACK fill_ack;
{
fill_ack.m_SocketItemPos = fill_syn->m_SocketItemPos;
fill_ack.m_TargetPos = fill_syn->m_TargetPos;
const SCItemSlot& target_slot =
static_cast<const SCItemSlot&>(
requester->GetItemManager()->GetItemSlotContainer(SI_INVENTORY)->GetSlot(
fill_ack.m_TargetPos));
target_slot.CopyOut(fill_ack.m_TargetItemStream);
}
requester->SendPacket(&fill_ack, sizeof(fill_ack));
}
break;
default:
{
MSG_CG_ITEM_SOCKET_FILL_NAK fill_nak;
{
const ProtectorInventory& inventory_protector =
requester->GetWarehouseInventoryProtector().INVENTORY();
if (!inventory_protector.IsUsable())
{
fill_nak.m_dwErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
}
else
{
fill_nak.m_dwErrorCode = fill_result;
}
//_NA_000251_20100727_SOCKET_SYSTEM
// NOTE: from waverix to hukim, need recheck the below code
fill_nak.target_item_code = 0;
if (fill_result != RC::RC_ITEM_INVALIDPOS)
{
const SCItemSlot& target_slot =
static_cast<const SCItemSlot&>(
requester->GetItemManager()->GetItemSlotContainer(SI_INVENTORY)->GetSlot(
fill_syn->m_TargetPos));
fill_nak.target_item_code = target_slot.GetItemCode();
};
}
requester->SendPacket(&fill_nak, sizeof(fill_nak));
return;
}
}
}
Handler_CG_ITEM_IMPL(CG_ITEM_SOCKET_EXTRACT_SYN)
{
__TOUCHED((pServerSession, pMsg, wSize));
const MSG_CG_ITEM_SOCKET_EXTRACT_SYN* const extract_syn =
static_cast<const MSG_CG_ITEM_SOCKET_EXTRACT_SYN* const>(pMsg);
if (sizeof(*extract_syn) != wSize)
{
return;
}
Player* const requester = PlayerManager::Instance()->FindPlayerByUserKey(extract_syn->m_dwKey);
if (!requester)
{
return;
}
if (!requester->GetField())
{
SUNLOG(eCRITICAL_LOG, "[Handler_CG_ITEM_IMPL( CG_ITEM_SOCKET_EXTRACT_SYN )] Not Exist GameField");
return;
}
if (!CheckProcessInventoryLock(requester, CG_ITEM_SOCKET_EXTRACT_SYN))
{
return;
}
const RC::eITEM_RESULT extract_result = \
requester->GetItemManager()->GetItemFunctionSocket().ExtractSocket(
extract_syn->m_ChargeIntemPos, extract_syn->m_TargetPos, extract_syn->m_SocketNum);
if (extract_result == RC::RC_ITEM_EXTRACTSOCKET_SUCCESS)
{
MSG_CG_ITEM_SOCKET_EXTRACT_SUCCESS_ACK extract_ack;
{
extract_ack.m_ChargeIntemPos = extract_syn->m_ChargeIntemPos;
extract_ack.m_TargetPos = extract_syn->m_TargetPos;
const SCItemSlot& socket_owner =
static_cast<const SCItemSlot&>(
requester->GetItemManager()->GetItemSlotContainer(SI_INVENTORY)->GetSlot(
extract_ack.m_TargetPos));
socket_owner.CopyOut(extract_ack.m_TargetItemStream);
}
requester->SendPacket(&extract_ack, sizeof(extract_ack));
return;
}
MSG_CG_ITEM_SOCKET_EXTRACT_NAK extract_nak;
{
const ProtectorInventory& inven_protector =
requester->GetWarehouseInventoryProtector().INVENTORY();
if (!inven_protector.IsUsable())
{
extract_nak.m_dwErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
}
else
{
extract_nak.m_dwErrorCode = extract_result;
}
}
requester->SendPacket(&extract_nak, sizeof(extract_nak));
}
Handler_CG_ITEM_IMPL(CG_ITEM_HAMMER_OF_ALCHEMIST_SYN)
{
__TOUCHED((pServerSession, pMsg, wSize));
MSG_CG_ITEM_HAMMER_OF_ALCHEMIST_SYN * pRecvMsg = (MSG_CG_ITEM_HAMMER_OF_ALCHEMIST_SYN *)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey );
ASSERT( pPlayer );
if( !pPlayer ) return;
if( !pPlayer->GetField() )
{
SUNLOG( eCRITICAL_LOG, "[Handler_CG_ITEM_IMPL( CG_ITEM_HAMMER_OF_ALCHEMIST_SYN )] Not Exist GameField" );
return;
}
if( !CheckProcessInventoryLock( pPlayer, CG_ITEM_HAMMER_OF_ALCHEMIST_SYN ) )
return;
RC::eITEM_RESULT rt = pPlayer->GetItemManager()->GetItemFunctionItemProperty().
UseHammerOfAlchemist(pRecvMsg->m_ChargeItemPos, pRecvMsg->m_TargetItemPos);
switch( rt )
{
case RC::RC_ITEM_SUCCESS:
{
MSG_CG_ITEM_HAMMER_OF_ALCHEMIST_ACK msg;
msg.m_ChargeItemPos = pRecvMsg->m_ChargeItemPos;
msg.m_TargetItemPos = pRecvMsg->m_TargetItemPos;
SCItemSlot & rSlot = (SCItemSlot &)pPlayer->GetItemManager()->GetItemSlotContainer(SI_INVENTORY)->GetSlot( pRecvMsg->m_TargetItemPos );
rSlot.CopyOut(msg.m_TargetItemStream);
pPlayer->SendPacket(&msg,sizeof(msg));
}
break;
default:
{
MSG_CG_ITEM_HAMMER_OF_ALCHEMIST_NAK msg;
ProtectorInventory& rPROTECT = pPlayer->GetWarehouseInventoryProtector().INVENTORY();
if( !rPROTECT.IsUsable() )
msg.m_dwErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
else
msg.m_dwErrorCode = rt;
pPlayer->SendPacket(&msg,sizeof(msg));
return;
}
}
}
/*
Handler_CG_ITEM_IMPL( CG_ITEM_ACCESSORY_CREATE_SYN )
{
MSG_CG_ITEM_ACCESSORY_CREATE_SYN * pRecvMsg = (MSG_CG_ITEM_ACCESSORY_CREATE_SYN *)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey );
ASSERT( pPlayer );
if( !pPlayer ) return ;
MSG_CG_ITEM_ACCESSORY_CREATE_ACK amsg;
RC::eITEM_RESULT rt = pPlayer->GetItemManager()->CreateAccessory( pRecvMsg->m_type, pRecvMsg->m_SocketItemPos, &amsg.m_ItemInfo );
switch( rt )
{
case RC::RC_ITEM_SUCCESS:
{
amsg.m_type = pRecvMsg->m_type;
amsg.m_SocketItemPos = pRecvMsg->m_SocketItemPos;
amsg.m_Money = pPlayer->GetMoney();
pPlayer->SendPacket(&amsg,amsg.GetSize());
}
break;
default:
{
MSG_CG_ITEM_ACCESSORY_CREATE_NAK msg;
msg.m_dwErrorCode = rt;
pPlayer->SendPacket(&msg,sizeof(msg));
}
}
}*/
Handler_CG_ITEM_IMPL( CG_ITEM_COMPOSE_SYN )
{
__TOUCHED((pServerSession, pMsg, wSize));
MSG_CG_ITEM_COMPOSE_SYN * pRecvMsg = (MSG_CG_ITEM_COMPOSE_SYN *)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey );
ASSERT( pPlayer );
if( !pPlayer ) return ;
if( !pPlayer->GetField() )
{
SUNLOG( eCRITICAL_LOG, "[Handler_CG_ITEM_IMPL( CG_ITEM_COMPOSE_SYN )] Not Exist GameField" );
return;
}
DURATYPE bySuccessNum = 0;
#ifdef _NA_007330_20140620_GUILD_SYSTEM_EXTENSION
DURATYPE byPreventNum = 0;
#endif // _NA_007330_20140620_GUILD_SYSTEM_EXTENSION
MSG_CG_ITEM_COMPOSE_SUCCESS_ACK amsg;
RC::eITEM_RESULT rt;
if( g_ExtraNPCManager.IsLengthCanUseNPC(pRecvMsg->m_NPCCode, pPlayer, eNPC_TYPE_ITEM_MIX) )
{
if( !CheckProcessInventoryLock( pPlayer, CG_ITEM_COMPOSE_SYN ) )
return;
#ifdef _NA_007330_20140620_GUILD_SYSTEM_EXTENSION
rt = pPlayer->GetItemManager()->Compose( pRecvMsg->m_ComposeListCode, pRecvMsg->m_byMakingNum, &amsg.m_ItemInfo, bySuccessNum, byPreventNum);
#else // _NA_007330_20140620_GUILD_SYSTEM_EXTENSION
rt = pPlayer->GetItemManager()->Compose( pRecvMsg->m_ComposeListCode, pRecvMsg->m_byMakingNum, &amsg.m_ItemInfo, bySuccessNum );
#endif // _NA_007330_20140620_GUILD_SYSTEM_EXTENSION
}
else
{
rt = RC::RC_ITEM_LENGTH_CANNOT_USE_NPC;
}
switch( rt )
{
case RC::RC_ITEM_COMPOSE_SUCCESS:
{
amsg.m_Money = pPlayer->GetMoney();
amsg.m_byMakingNum = pRecvMsg->m_byMakingNum;
amsg.m_bySuccessNum = bySuccessNum;
#ifdef _NA_007330_20140620_GUILD_SYSTEM_EXTENSION
amsg.m_byPreventNum = byPreventNum;
#endif // _NA_007330_20140620_GUILD_SYSTEM_EXTENSION
pPlayer->SendPacket(&amsg,amsg.GetSize());
}
break;
case RC::RC_ITEM_COMPOSE_FAILED:
{
MSG_CG_ITEM_COMPOSE_FAILED_ACK f_amsg;
f_amsg.m_Money = pPlayer->GetMoney();
#ifdef _NA_007330_20140620_GUILD_SYSTEM_EXTENSION
f_amsg.m_byPreventNum = byPreventNum;
#endif // _NA_007330_20140620_GUILD_SYSTEM_EXTENSION
pPlayer->SendPacket(&f_amsg,sizeof(f_amsg));
}
break;
default:
{
MSG_CG_ITEM_COMPOSE_NAK msg;
ProtectorInventory& rPROTECT = pPlayer->GetWarehouseInventoryProtector().INVENTORY();
if( !rPROTECT.IsUsable() )
msg.m_byErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
else
msg.m_byErrorCode = rt;
pPlayer->SendPacket(&msg,sizeof(msg));
return;
}
}
// 烹拌 沥焊 荐笼(己泅芒)
sITEM_COMPOSE_LIST * pListInfo = ItemComposeListParser::Instance()->GetComposeListInfo(pRecvMsg->m_ComposeListCode);
if( pListInfo->m_ItemType )
{
switch( pListInfo->m_ItemType )
{
case eITEMTYPE_RING:
{
g_StatisticsManager.PlusStatisticType( eSTATISTIC_COMPOSE_RING_LOW, 1 );
break;
}
case eITEMTYPE_NECKLACE:
{
g_StatisticsManager.PlusStatisticType( eSTATISTIC_COMPOSE_NECKLACE_LOW, 1 );
break;
}
// 努贰胶喊 漂荐 厩技辑府肺 函版
case eITEMTYPE_BERSERKER_SACCESSORY:
case eITEMTYPE_DRAGON_SACCESSORY:
case eITEMTYPE_VALKYRIE_SACCESSORY:
case eITEMTYPE_SHADOW_SACCESSORY:
case eITEMTYPE_ELEMENTALIST_SACCESSORY:
case eITEMTYPE_MYSTIC_SPECIAL_ACCESSORY1: // _NA_004965_20120613_NEW_CHARACTER_MYSTIC
case eITEMTYPE_HELLROID_SPECIAL_ACCESSORY1: //_NA_000000_20130812_NEW_CHARACTER_HELLROID
#ifdef _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE
case eITEMTYPE_WITCHBLADE_SPECIAL_ACCESSORY1:
#endif //_NA_007514_20140828_NEW_CHARACTER_WITCHBLADE
case eITEMTYPE_ALLCLASS_CHAOSEYE: //_NA_007827_20141117_ADD_ACCESSORY_TYPE
case eITEMTYPE_ELEMENTALIST_KALVUS_ACCESSORY: //_NA_007827_20141117_ADD_ACCESSORY_TYPE
case eITEMTYPE_BERSERKER_KALVUS_ACCESSORY: //_NA_007827_20141117_ADD_ACCESSORY_TYPE
case eITEMTYPE_DRAGON_KALVUS_ACCESSORY: //_NA_007827_20141117_ADD_ACCESSORY_TYPE
case eITEMTYPE_VALKYRIE_SHADOW_KALVUS_ACCESSORY: //_NA_007827_20141117_ADD_ACCESSORY_TYPE
case eITEMTYPE_MYSTIC_KALVUS_ACCESSORY: //_NA_007827_20141117_ADD_ACCESSORY_TYPE
case eITEMTYPE_HELLROID_WITCHBLADE_KALVUS_ACCESSORY: //_NA_007827_20141117_ADD_ACCESSORY_TYPE
{
g_StatisticsManager.PlusStatisticType( eSTATISTIC_COMPOSE_SOUL_SHEILD_LOW, 1 );
break;
}
}
}
}
Handler_CG_ITEM_IMPL( CG_ITEM_CRYSTALIZE_SYN )
{
__TOUCHED((pServerSession, pMsg, wSize));
CrystallizeImplement Implement;
Implement.DoMessageImplement( pMsg );
return;
}
Handler_CG_ITEM_IMPL( CG_ITEM_EXTRASTONE_USE_SYN )
{
__TOUCHED((pServerSession, pMsg, wSize));
MSG_CG_ITEM_EXTRASTONE_USE_SYN * pRecvMsg = (MSG_CG_ITEM_EXTRASTONE_USE_SYN *)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey );
ASSERT( pPlayer );
if( !pPlayer ) return ;
if( !pPlayer->GetField() )
{
SUNLOG( eCRITICAL_LOG, "[Handler_CG_ITEM_IMPL( CG_ITEM_EXTRASTONE_USE_SYN )] Not Exist GameField" );
return;
}
if( !CheckProcessInventoryLock( pPlayer, CG_ITEM_EXTRASTONE_USE_SYN ) )
return;
BYTE byValueIndex = 0;
RC::eITEM_RESULT rt = pPlayer->GetItemManager()->GetItemFunctionEnchant().UseExtraStone(
pRecvMsg->m_ExtraStonePos, pRecvMsg->m_TargetPos, byValueIndex);
switch( rt )
{
case RC::RC_ITEM_SUCCESS:
{
MSG_CG_ITEM_EXTRASTONE_USE_ACK amsg;
amsg.m_NOptionAttrValueIndex = byValueIndex;
pPlayer->SendPacket(&amsg,sizeof(amsg));
}
break;
default:
{
MSG_CG_ITEM_EXTRASTONE_USE_NAK msg;
ProtectorInventory& rPROTECT = pPlayer->GetWarehouseInventoryProtector().INVENTORY();
if( !rPROTECT.IsUsable() )
msg.m_byErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
else
msg.m_byErrorCode = rt;
pPlayer->SendPacket(&msg,sizeof(msg));
}
}
}
Handler_CG_ITEM_IMPL(CG_ITEM_MOVE_SYN)
{
__TOUCHED((pServerSession, pMsg, wSize));
const MSG_CG_ITEM_MOVE_SYN* const move_syn = static_cast<const MSG_CG_ITEM_MOVE_SYN* const>(pMsg);
Player* const player = PlayerManager::Instance()->FindPlayerByUserKey(move_syn->m_dwKey);
ASSERT(player != NULL);
if (player == NULL)
{
return;
}
if (player->GetField() == NULL)
{
SUNLOG(eCRITICAL_LOG, _T("[Handler_CG_ITEM_IMPL( CG_ITEM_MOVE_SYN )] Not Exist GameField"));
return;
}
if (wSize != sizeof(MSG_CG_ITEM_MOVE_SYN))
{
SUNLOG(eCRITICAL_LOG, _T("[RNDPROTOCOL_REPORT][SIZE] MSG_CG_ITEM_MOVE_SYN"));
return;
}
const SLOTIDX from_slot_type = move_syn->m_fromIndex;
const POSTYPE from_slot_position = move_syn->m_fromPos;
const SLOTIDX to_slot_type = move_syn->m_toIndex;
const POSTYPE to_slot_position = move_syn->m_toPos;
if ((from_slot_type == SI_INVENTORY || to_slot_type == SI_INVENTORY) &&
!CheckProcessInventoryLock(player, CG_ITEM_MOVE_SYN))
{
return;
}
#ifdef _NA_008679_20160202_REWORK_BATTLEGROUND
// 厘厚包访 捞悼 AND (傈厘抗距吝 OR 泅犁 傈厘)
// 傈厘 抗距/柳青吝老 版快 厘厚背眉 阂啊瓷
if ((from_slot_type == SI_EQUIPMENT || to_slot_type == SI_EQUIPMENT) &&
((player->GetBehave() == PLAYER_BEHAVE_RESERVATION_BATTLE_GROUND_ZONE) ||
player->IsThereBattleGroundZone() == true))
{
MSG_CG_ITEM_MOVE_NAK msg_nak;
msg_nak.m_dwErrorCode = RC::RC_ITEM_EQUIP_FAILED_BATTLEGROUND;
player->SendPacket(&msg_nak, sizeof(msg_nak));
return;
}
#endif //_NA_008679_20160202_REWORK_BATTLEGROUND
const DURATYPE move_quantity = move_syn->move_quantity_;
ItemManager* const item_manager = player->GetItemManager();
// CHANGES: f110418.1L
RC::eITEM_RESULT move_result = RC::RC_ITEM_SUCCESS;
if (nsSlot::ItemMoveImpl* impl = item_manager->GetItemMoveImpl()) {
move_result = impl->Move(from_slot_type, from_slot_position,
to_slot_type, to_slot_position,
move_quantity);
};
switch(move_result)
{
case RC::RC_ITEM_SUCCESS:
{
MSG_CG_ITEM_MOVE_ACK move_ack;
{
move_ack.m_fromIndex = from_slot_type;
move_ack.m_fromPos = from_slot_position;
move_ack.m_toIndex = to_slot_type;
move_ack.m_toPos = to_slot_position;
move_ack.move_quantity_ = move_quantity;
player->SendPacket(&move_ack, sizeof(move_ack));
}
// CHANGES: f110418.1L, moved logging parts to ItemMoveImpl
}
break;
case RC::RC_ITEM_INVALIDPOS:
default:
{
MSG_CG_ITEM_MOVE_NAK move_nak;
move_nak.m_byCategory = CG_ITEM;
move_nak.m_byProtocol = CG_ITEM_MOVE_NAK;
move_nak.m_dwErrorCode = move_result;
bool process_to_next = true;
if (process_to_next && (from_slot_type == SI_INVENTORY || to_slot_type == SI_INVENTORY))
{
const ProtectorInventory& inventory_protector =
player->GetWarehouseInventoryProtector().INVENTORY();
if (!inventory_protector.IsUsable())
{
move_nak.m_dwErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
process_to_next = false;
}
}
if (process_to_next && (from_slot_type == SI_WAREHOUSE || to_slot_type == SI_WAREHOUSE))
{
ProtectorWarehouse& warehouse_protector =
player->GetWarehouseInventoryProtector().WAREHOUSE();
if (!warehouse_protector.IsUsable())
{
move_nak.m_dwErrorCode = RC::RC_ITEM_WAREHOUSE_NEED_PASSWORD;
process_to_next = false;
}
}
player->SendPacket(&move_nak, sizeof(move_nak));
}
}
}
Handler_CG_ITEM_IMPL(CG_ITEM_PICK_SYN)
{
__TOUCHED((pServerSession, pMsg, wSize));
MSG_CG_ITEM_PICK_SYN* pRecvMsg = (MSG_CG_ITEM_PICK_SYN *)pMsg;
Player* pPlayer = PlayerManager::Instance()->FindPlayerByUserKey(pRecvMsg->m_dwKey);
if(!FlowControl::FCAssert(pPlayer != 0))
return;
if(!pPlayer->GetField()) {
SUNLOG(eCRITICAL_LOG, "[Handler_CG_ITEM_IMPL(CG_ITEM_PICK_SYN)] Not Exist GameField");
return;
}
{
BOOLEAN bIsValidSize = sizeof(MSG_CG_ITEM_PICK_SYN) == wSize;
if(bIsValidSize == 0) {
SUNLOG(eDEV_LOG, _T("[RNDPROTOCOL_REPORT][SIZE] MSG_CG_ITEM_PICK_SYN"));
return;
}
};
DWORD dwFieldItemObjectKey = pRecvMsg->m_dwFieldItemObjectKey;
if(!CheckProcessInventoryLock(pPlayer, CG_ITEM_PICK_SYN))
return;
static const SERVER_COMMON_OPTION& ServerOption =
ServerOptionParserEx::Instance()->GetServerOption();
MSG_CG_ITEM_PICK_ACK msgACK;
ItemManager* item_manager = pPlayer->GetItemManager();
#ifdef _NA_002399_20110323_ITEM_ROUTING_METHOD_CHANGE
RC::eITEM_RESULT ret = item_manager->PickParty(dwFieldItemObjectKey, ServerOption);
if(ret == RC::RC_ITEM_SUCCESS)
{
// nothing to do..
}
#else
RC::eITEM_RESULT ret = item_manager->Pick(dwFieldItemObjectKey, &msgACK.m_ItemInfo);
if(ret == RC::RC_ITEM_SUCCESS) {
pPlayer->SendPacket(&msgACK, msgACK.GetSize());
const sPOLICY_CHARACTER& rPolicyment = pPlayer->Policyment;
const BOOLEAN isBrdApply = !(rPolicyment.FIELD & rPolicyment.PCC_IN_SSQ_FIELD_PLAYER);
if(isBrdApply) {
// 酒捞袍 嚼垫阑 林函俊 舅赴促.
MSG_CG_ITEM_PICK_BRD msgBRD;
msgBRD.m_dwObjKey = pPlayer->GetObjectKey();
msgBRD.m_ItemCode = msgACK.m_ItemInfo.m_Slot[0].m_Stream.Part.wCode;
if(ServerOption.m_bItemPickUpMsgBrd != 0) {
pPlayer->SendPacketAround(&msgBRD, sizeof(msgBRD), FALSE);
}
if(ServerOption.m_bItemPickUpPartyMsgBrd != 0) {
WORD party_key = pPlayer->GetPartyState().GetPartyKey();
if(party_key != 0) {
NewGamePartyManager* pPartyManager = NewGamePartyManager::Instance();
pPartyManager->SendPacketAllMember(party_key, &msgBRD, sizeof(msgBRD));
}
}
}
}
#endif //_NA_002399_20110323_ITEM_ROUTING_METHOD_CHANGE
else { //ret != RC::RC_ITEM_SUCCESS
MSG_CG_ITEM_PICK_NAK msgNAK;
msgNAK.m_dwFieldItemObjectKey = dwFieldItemObjectKey;
msgNAK.m_dwErrorCode = ret;
pPlayer->SendPacket(&msgNAK, sizeof(msgNAK));
}
}
Handler_CG_ITEM_IMPL(CG_ITEM_DROP_SYN)
{
__TOUCHED((pServerSession, pMsg, wSize));
MSG_CG_ITEM_DROP_SYN * pRecvMsg = (MSG_CG_ITEM_DROP_SYN *)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey );
ASSERT( pPlayer );
if( !pPlayer ) return ;
if( !pPlayer->GetField() )
{
SUNLOG( eCRITICAL_LOG, "[Handler_CG_ITEM_IMPL( CG_ITEM_DROP_SYN )] Not Exist GameField" );
return;
}
if( !CheckProcessInventoryLock( pPlayer, CG_ITEM_DROP_SYN ) )
return;
RC::eITEM_RESULT rt = pPlayer->GetItemManager()->Drop( pRecvMsg->m_atIndex, pRecvMsg->m_atPos );
switch( rt )
{
case RC::RC_ITEM_SUCCESS:
{
MSG_CG_ITEM_DROP_ACK msg;
msg.m_byCategory = CG_ITEM;
msg.m_byProtocol = CG_ITEM_DROP_ACK;
msg.m_atIndex = pRecvMsg->m_atIndex;
msg.m_atPos = pRecvMsg->m_atPos;
pPlayer->SendPacket( &msg, sizeof( msg ) );
}
break;
default:
{
MSG_CG_ITEM_DROP_NAK msg;
msg.m_byCategory = CG_ITEM;
msg.m_byProtocol = CG_ITEM_DROP_NAK;
ProtectorInventory& rPROTECT = pPlayer->GetWarehouseInventoryProtector().INVENTORY();
if( !rPROTECT.IsUsable() )
msg.m_dwErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
else
msg.m_dwErrorCode = rt;
pPlayer->SendPacket(&msg,sizeof(msg));
}
}
}
Handler_CG_ITEM_IMPL(CG_ITEM_COMBINE_SYN)
{
__TOUCHED((pServerSession, pMsg, wSize));
const MSG_CG_ITEM_COMBINE_SYN* const combine_syn =
static_cast<const MSG_CG_ITEM_COMBINE_SYN* const>(pMsg);
Player* const player = PlayerManager::Instance()->FindPlayerByUserKey(combine_syn->m_dwKey);
ASSERT(player != NULL);
if (player == NULL)
{
return;
}
if (player->GetField() == NULL)
{
SUNLOG(eCRITICAL_LOG, _T("[Handler_CG_ITEM_IMPL( CG_ITEM_COMBINE_SYN )] Not Exist GameField"));
return;
}
if (wSize != sizeof(MSG_CG_ITEM_COMBINE_SYN))
{
SUNLOG(eCRITICAL_LOG, _T("[RNDPROTOCOL_REPORT][SIZE] MSG_CG_ITEM_COMBINE_SYN"));
return;
}
if (!CheckProcessInventoryLock(player, CG_ITEM_COMBINE_SYN))
{
return;
}
DURATYPE combine_quantity = combine_syn->combine_quantity_;
const RC::eITEM_RESULT combine_result = player->GetItemManager()->Combine(combine_syn->m_fromIndex,
combine_syn->m_fromPos,
combine_syn->m_toIndex,
combine_syn->m_toPos,
combine_quantity);
switch(combine_result)
{
case RC::RC_ITEM_SUCCESS:
{
MSG_CG_ITEM_COMBINE_ACK combine_ack;
combine_ack.m_byCategory = CG_ITEM;
combine_ack.m_byProtocol = CG_ITEM_COMBINE_ACK;
combine_ack.m_fromIndex = combine_syn->m_fromIndex;
combine_ack.m_toIndex = combine_syn->m_toIndex;
combine_ack.m_fromPos = combine_syn->m_fromPos;
combine_ack.m_toPos = combine_syn->m_toPos;
combine_ack.combine_quantity_ = combine_quantity;
player->SendPacket(&combine_ack, sizeof(combine_ack));
}
break;
default:
{
MSG_CG_ITEM_COMBINE_NAK combine_nak;
combine_nak.m_byCategory = CG_ITEM;
combine_nak.m_byProtocol = CG_ITEM_COMBINE_NAK;
const ProtectorInventory& inventory_protector =
player->GetWarehouseInventoryProtector().INVENTORY();
if (!inventory_protector.IsUsable())
{
combine_nak.m_dwErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
}
else
{
combine_nak.m_dwErrorCode = combine_result;
}
player->SendPacket(&combine_nak, sizeof(combine_nak));
}
}
}
Handler_CG_ITEM_IMPL( CG_ITEM_DIVIDE_SYN )
{
__TOUCHED((pServerSession, pMsg, wSize));
MSG_CG_ITEM_DIVIDE_SYN * pRecvMsg = (MSG_CG_ITEM_DIVIDE_SYN *)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey );
ASSERT( pPlayer );
if( !pPlayer ) return ;
if( !pPlayer->GetField() )
{
SUNLOG( eCRITICAL_LOG, "[Handler_CG_ITEM_IMPL( CG_ITEM_DIVIDE_SYN )] Not Exist GameField" );
return;
}
if( !CheckProcessInventoryLock( pPlayer, CG_ITEM_DIVIDE_SYN ) )
return;
RC::eITEM_RESULT rt = pPlayer->GetItemManager()->Divide( pRecvMsg->m_fromPos, pRecvMsg->m_toPos, pRecvMsg->m_fromNum, pRecvMsg->m_toNum );
switch( rt )
{
case RC::RC_ITEM_SUCCESS:
{
MSG_CG_ITEM_DIVIDE_ACK msg;
//msg.m_fromPos = pRecvMsg->m_fromPos;
//msg.m_toPos = pRecvMsg->m_toPos;
//msg.m_fromNum = pRecvMsg->m_fromNum;
//msg.m_toNum = pRecvMsg->m_toNum;
pPlayer->SendPacket( &msg, sizeof( msg ) );
}
break;
default:
{
MSG_CG_ITEM_DIVIDE_NAK msg;
ProtectorInventory& rPROTECT = pPlayer->GetWarehouseInventoryProtector().INVENTORY();
if( !rPROTECT.IsUsable() )
msg.m_byErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
else
msg.m_byErrorCode = rt;
pPlayer->SendPacket(&msg,sizeof(msg));
}
}
}
// 家葛己 酒捞袍父 贸府窃
Handler_CG_ITEM_IMPL(CG_ITEM_USE_SYN)
{
__TOUCHED((pServerSession, pMsg, wSize));
const MSG_CG_ITEM_USE_SYN* const item_use_syn = (MSG_CG_ITEM_USE_SYN*)pMsg;
Player* player = PlayerManager::Instance()->FindPlayerByUserKey(item_use_syn->m_dwKey);
if (player == NULL)
{
return;
}
if (player->GetField() == NULL)
{
SUNLOG(eCRITICAL_LOG, "[Handler_CG_ITEM_IMPL( CG_ITEM_USE_SYN )] Not Exist GameField");
return;
}
if (!CheckProcessInventoryLock(player, CG_ITEM_USE_SYN))
{
return;
}
SLOTCODE item_code = 0;
RC::eITEM_RESULT result = RC::RC_ITEM_SUCCESS;
ItemManager* const item_manager = player->GetItemManager();
if (item_manager->IsExtraPacketUse(item_use_syn->m_atIndex, item_use_syn->m_atPos))
{
result = RC::RC_ITEM_UNUSABLE_FUNCTION;
}
else if (item_use_syn->m_byProtocol == CG_ITEM_USE_SKILL_ACTION_SYN)
{
// 磊扁磊脚捞 酒囱 鸥牢俊霸 康氢阑 林绰 胶懦狼 版快 碍力 傍拜狼 咯何客 傍拜 鸥百 困摹啊 鞘夸.
const MSG_CG_ITEM_USE_SKILL_ACTION_SYN& recv_msg = \
static_cast<MSG_CG_ITEM_USE_SKILL_ACTION_SYN&>(*pMsg);
// TODO, f100831.3L, waverix, need check a packet integrity
SkillInfo skill_info_data(player, recv_msg);
result = item_manager->Use(recv_msg.m_atIndex, recv_msg.m_atPos, item_code,
&skill_info_data, skill_info_data.attack_propensity_);
}
else
{
result = item_manager->Use( item_use_syn->m_atIndex, item_use_syn->m_atPos, item_code );
}
switch (result)
{
#ifdef _NA_008404_20150712_MINIGAME_SYSTEM
case RC::RC_ITEM_FAILED_EXIST_SEPARATE_NAK_PACKET:
// 角菩沁瘤父 喊档狼 NAK 菩哦捞 粮犁茄促
#endif // _NA_008404_20150712_MINIGAME_SYSTEM
case RC::RC_ITEM_PROCESS_PENDING:
// 贸府啊 厚悼扁肺 捞风绢瘤哥, 溜矫 搬苞甫 雀脚且 荐 绝绰 版快
return;
case RC::RC_ITEM_SUCCESS:
{
const BASE_ITEMINFO* const item_info = ItemInfoParser::Instance()->GetItemInfo(item_code);
if (item_info == NULL)
{
break;
}
if (item_info->m_wType == eITEMTYPE_GUILDWAREHOUSE_SLOTCASH)
{
return;
}
if (item_info->IsMaterialWaste())
{
MSG_CG_ITEM_USE_ACK item_use_ack;
item_use_ack.m_atIndex = item_use_syn->m_atIndex;
item_use_ack.m_atPos = item_use_syn->m_atPos;
player->SendPacket(&item_use_ack, sizeof(item_use_ack));
}
if (item_info->m_dwEffectCode != Null_Value &&
item_use_syn->m_byProtocol != CG_ITEM_USE_SKILL_ACTION_SYN)
{
MSG_CG_ITEM_USE_BRD item_use_brd;
item_use_brd.m_dwObjKey = player->GetObjectKey();
item_use_brd.m_ItemCode = item_code;
player->SendPacketAround(&item_use_brd, sizeof(item_use_brd), FALSE);
}
if (item_info->m_byWasteType == eITEMWASTE_RETURNSCROLL)
{
// added by _NA_0_20100722_AUTO_SYSTEM
// 付瘤阜 蓖券 胶农费 困摹肺狼 捞悼阑 困秦 历厘秦敌促.
player->SetlastReturnScroll();
// 蓖券胶农费
MSG_AG_ZONE_RETURN_VILLAGE_ACK return_village_ack;
return_village_ack.m_wMapCode = player->GetPreVillageMapCode();
player->SendPacket(&return_village_ack, sizeof(return_village_ack));
}
else if (item_info->m_byWasteType == eITEMWASTE_UPSTONE)
{
// UP 棵扼皑
MSG_CG_CHARINFO_USERPOINT_CMD user_point_cmd;
user_point_cmd.m_TotalUP = player->GetCharInfo()->m_UserPoint;
player->SendPacket( &user_point_cmd, sizeof(user_point_cmd) );
}
if (item_info->m_wType == eITEMTYPE_REPAIR)
{
MSG_CG_ITEM_REPAIR_DURA_ACK repair_dura_ack;
repair_dura_ack.m_bAllRepair = true;
repair_dura_ack.m_Money = player->GetMoney();
player->SendPacket(&repair_dura_ack, sizeof(repair_dura_ack));
}
#ifdef _NA_008069_20150210_ADD_SPA_SYSTEM
if (item_info->m_wType == eITEMTYPE_SPA_WARP_SCROLL)
{
player->RemoveDragonTransformStatus();
MSG_AG_ZONE_SPA_ENTER_ACK enter_spa_packet;
enter_spa_packet.m_dwKey = player->GetUserKey();
enter_spa_packet.spa_mapcode = item_info->m_wSkillCode;
player->SendPacket(&enter_spa_packet, sizeof(enter_spa_packet));
}
#endif //_NA_008069_20150210_ADD_SPA_SYSTEM
}
break;
default:
{
MSG_CG_ITEM_USE_NAK item_use_nak;
const ProtectorInventory& inven_protector =
player->GetWarehouseInventoryProtector().INVENTORY();
if (!inven_protector.IsUsable())
{
item_use_nak.m_ErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
}
else
{
item_use_nak.m_ErrorCode = result;
}
player->SendPacket(&item_use_nak, sizeof(item_use_nak));
}
}
}
Handler_CG_ITEM_IMPL(CG_ITEM_SELL_SYN)
{
__TOUCHED((pServerSession, pMsg, wSize));
MSG_CG_ITEM_SELL_SYN* const item_sell_syn = static_cast<MSG_CG_ITEM_SELL_SYN* const>(pMsg);
Player* const player = PlayerManager::Instance()->FindPlayerByUserKey(item_sell_syn->m_dwKey);
ASSERT(player != NULL);
if (player == NULL)
{
return;
}
if (player->GetField() == NULL)
{
SUNLOG(eCRITICAL_LOG, _T("[Handler_CG_ITEM_IMPL( CG_ITEM_SELL_SYN )] Not Exist GameField"));
return;
}
if (wSize != sizeof(MSG_CG_ITEM_SELL_SYN))
{
SUNLOG(eDEV_LOG, _T("[RNDPROTOCOL_REPORT][SIZE] MSG_CG_ITEM_SELL_SYN"));
return;
}
item_sell_syn->Decode();
const DURATYPE sell_quantity = item_sell_syn->sell_quantity_;
RC::eITEM_RESULT sell_result;
if (g_ExtraNPCManager.IsLengthCanUseNPC(item_sell_syn->m_NPCCode, player, eNPC_TYPE_STORE))
{
if (!CheckProcessInventoryLock(player, CG_ITEM_SELL_SYN))
{
return;
}
sell_result = player->GetItemManager()->GetTradingImpl()->Sell(item_sell_syn->m_atIndex, item_sell_syn->m_atPos, sell_quantity);
}
else
{
sell_result = RC::RC_ITEM_LENGTH_CANNOT_USE_NPC;
}
switch(sell_result)
{
case RC::RC_ITEM_SUCCESS:
{
MSG_CG_ITEM_SELL_ACK sell_ack;
sell_ack.m_byCategory = CG_ITEM;
sell_ack.m_byProtocol = CG_ITEM_SELL_ACK;
sell_ack.m_atIndex = item_sell_syn->m_atIndex;
sell_ack.m_atPos = item_sell_syn->m_atPos;
sell_ack.m_Money = player->GetMoney();
sell_ack.sell_quantity_ = sell_quantity;
player->SendPacket(&sell_ack, sizeof(sell_ack));
}
break;
default:
{
MSG_CG_ITEM_SELL_NAK sell_nak;
sell_nak.m_byCategory = CG_ITEM;
sell_nak.m_byProtocol = CG_ITEM_SELL_NAK;
const ProtectorInventory& inventory_protector = player->GetWarehouseInventoryProtector().INVENTORY();
if (!inventory_protector.IsUsable())
{
sell_nak.m_dwErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
}
else
{
sell_nak.m_dwErrorCode = sell_result;
}
player->SendPacket(&sell_nak, sizeof(sell_nak));
}
}
}
Handler_CG_ITEM_IMPL(CG_ITEM_BUY_SYN)
{
__TOUCHED((pServerSession, pMsg, wSize));
const MSG_CG_ITEM_BUY_SYN* const item_buy_syn = static_cast<const MSG_CG_ITEM_BUY_SYN* const>(pMsg);
Player* const player = PlayerManager::Instance()->FindPlayerByUserKey(item_buy_syn->m_dwKey);
ASSERT(player != NULL);
if (player == NULL)
{
return;
}
if (player->GetField() == NULL)
{
SUNLOG(eCRITICAL_LOG, _T("[Handler_CG_ITEM_IMPL( CG_ITEM_BUY_SYN )] Not Exist GameField"));
return;
}
if (wSize != sizeof(MSG_CG_ITEM_BUY_SYN))
{
SUNLOG(eCRITICAL_LOG, _T("[RNDPROTOCOL_REPORT][SIZE] MSG_CG_ITEM_BUY_SYN"));
return;
}
MSG_CG_ITEM_BUY_ACK item_buy_ack;
RC::eITEM_RESULT item_buy_result;
if (g_ExtraNPCManager.IsLengthCanUseNPC(item_buy_syn->m_NPCCode, player, eNPC_TYPE_STORE))
{
if (!CheckProcessInventoryLock(player, CG_ITEM_BUY_SYN))
{
return;
}
const DURATYPE buy_quantity = item_buy_syn->buy_quantity_;
item_buy_result = player->GetItemManager()->GetTradingImpl()->Buy(
item_buy_syn->m_dwShopListID,
item_buy_syn->m_ShopTabIndex,
item_buy_syn->m_ShopItemIndex,
&item_buy_ack,
buy_quantity);
}
else
{
item_buy_result = RC::RC_ITEM_LENGTH_CANNOT_USE_NPC;
}
switch(item_buy_result)
{
case RC::RC_ITEM_SUCCESS:
{
player->SendPacket(&item_buy_ack, item_buy_ack.GetSize());
}
break;
default:
{
MSG_CG_ITEM_BUY_NAK item_buy_nak;
const ProtectorInventory& inventory_protector =
player->GetWarehouseInventoryProtector().INVENTORY();
if (!inventory_protector.IsUsable())
{
item_buy_nak.m_dwErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
}
else
{
item_buy_nak.m_dwErrorCode = item_buy_result;
}
player->SendPacket(&item_buy_nak, sizeof(item_buy_nak));
}
}
}
Handler_CG_ITEM_IMPL(CG_ITEM_DROP_MONEY_SYN)
{
__TOUCHED((pServerSession, pMsg, wSize));
MSG_CG_ITEM_DROP_MONEY_SYN * pRecvMsg = (MSG_CG_ITEM_DROP_MONEY_SYN *)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey );
ASSERT( pPlayer );
if( !pPlayer ) return ;
if( !pPlayer->GetField() )
{
SUNLOG( eCRITICAL_LOG, "[Handler_CG_ITEM_IMPL( CG_ITEM_DROP_MONEY_SYN )] Not Exist GameField" );
return;
}
if( !CheckProcessInventoryLock( pPlayer, CG_ITEM_DROP_MONEY_SYN ) )
return;
RC::eITEM_RESULT rt = pPlayer->GetItemManager()->DropMoney( pRecvMsg->m_dwDropMoney );
switch( rt )
{
case RC::RC_ITEM_SUCCESS:
{
GAMELOG->LogMoney( MONEY_DROP, pPlayer, pRecvMsg->m_dwDropMoney );
/* Nothing To Do */
}
break;
default:
{
MSG_CG_ITEM_DROP_MONEY_NAK msg;
msg.m_byCategory = CG_ITEM;
msg.m_byProtocol = CG_ITEM_DROP_MONEY_NAK;
ProtectorInventory& rPROTECT = pPlayer->GetWarehouseInventoryProtector().INVENTORY();
if( !rPROTECT.IsUsable() )
msg.m_dwErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
else
msg.m_dwErrorCode = rt;
pPlayer->SendPacket(&msg,sizeof(msg));
}
}
}
////////////////////////////////////////////////////////////////////////////
//// (WAVERIX) (090514) (REMOVE) 荤侩 救 窍绰 喉废 力芭
//class TotalLevelSum
//{
// float m_limitDistance;
// Player * m_pStandardPlayer;
// LEVELTYPE m_TotalLevelSum;
//public:
// TotalLevelSum( Player * pStandardPlayer ):m_TotalLevelSum(0),m_pStandardPlayer(pStandardPlayer){}
// ~TotalLevelSum(){}
//
// inline LEVELTYPE GetTotalLevelSum() { return m_TotalLevelSum; }
// inline VOID SetDistance( float limitDistance ) { m_limitDistance = limitDistance; }
//
// VOID operator()( Player * pPlayer )
// {
// if( m_limitDistance == 0.0f )
// {
// m_TotalLevelSum += pPlayer->GetLevel();
// }
// else
// {
// if( pPlayer->GetDist(m_pStandardPlayer) < m_limitDistance )
// {
// m_TotalLevelSum += pPlayer->GetLevel();
// }
// }
// }
//};
Handler_CG_ITEM_IMPL(CG_ITEM_PICK_MONEY_SYN)
{
__TOUCHED((pServerSession, pMsg, wSize));
MSG_CG_ITEM_PICK_MONEY_SYN * pRecvMsg = (MSG_CG_ITEM_PICK_MONEY_SYN *)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey );
ASSERT( pPlayer );
if( !pPlayer ) return ;
if( !pPlayer->GetField() )
{
SUNLOG( eCRITICAL_LOG, "[Handler_CG_ITEM_IMPL( CG_ITEM_PICK_MONEY_SYN )] Not Exist GameField" );
return;
}
BOOL bIsValidSize = (BOOL) ( sizeof(MSG_CG_ITEM_PICK_MONEY_SYN) == wSize );
if( !bIsValidSize )
{
SUNLOG( eDEV_LOG, _T("[RNDPROTOCOL_REPORT][SIZE] MSG_CG_ITEM_PICK_MONEY_SYN") );
return;
}
DWORD dwFieldItemObjectKey = pRecvMsg->m_dwFieldItemObjectKey;
if( !CheckProcessInventoryLock( pPlayer, CG_ITEM_PICK_MONEY_SYN, dwFieldItemObjectKey ) )
return;
if( !pPlayer->GetItemManager()->ValidState() )
{
MSG_CG_ITEM_PICK_MONEY_NAK msg;
msg.m_dwErrorCode = RC::RC_ITEM_INVALIDSTATE;
msg.m_dwFieldItemObjectKey = dwFieldItemObjectKey;
pPlayer->SendPacket( &msg, sizeof( msg ) );
return;
}
GameField * pField = pPlayer->GetField();
if( !pField || !pField->IsReady() ) return;
// CHANGES: f100503.3L, change the interface usage
// f110415.6L, changes using method to find simple. the internal process of SearchNeighborItem
// brutely has the object searching algorithm for each items.
Item* pItem = NULL;
;{
Object* object = pField->FindObject(MONEY_OBJECT, dwFieldItemObjectKey);
if (object && object->IsEqualObjectKind(MONEY_OBJECT) &&
object->IsDeleteReserved() == false)
{
pItem = static_cast<Item*>(object);
}
};
#if SUN_CODE_BACKUP
Item* pItem = pField->SearchNeighborItem(pPlayer->GetSectorIndex(), dwFieldItemObjectKey);
#endif
if( !pItem )
{
MSG_CG_ITEM_PICK_MONEY_NAK msg;
msg.m_dwErrorCode = RC::RC_ITEM_NOTEXISTITEMATFIELD;
msg.m_dwFieldItemObjectKey = dwFieldItemObjectKey;
pPlayer->SendPacket( &msg, sizeof( msg ) );
return;
}
ItemManager* pItemManager = pPlayer->GetItemManager();
if( !pItemManager )
return;
RC::eITEM_RESULT rt = pItemManager->CanPick( pItem );
if( rt != RC::RC_ITEM_SUCCESS )
{
MSG_CG_ITEM_PICK_MONEY_NAK msg;
msg.m_dwFieldItemObjectKey = dwFieldItemObjectKey;
ProtectorInventory& rPROTECT = pPlayer->GetWarehouseInventoryProtector().INVENTORY();
if( !rPROTECT.IsUsable() )
msg.m_dwErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
else
msg.m_dwErrorCode = rt;
pPlayer->SendPacket(&msg,sizeof(msg));
return;
}
MONEY DropMoney = pItem->GetMoney();
DWORD dwMonsterKey = pItem->GetFromMonsterKey();
WORD PartyKey = pPlayer->GetPartyState().GetPartyKey();
if(!PartyKey || dwMonsterKey == 0)
{
pPlayer->PickMoney(DropMoney, dwMonsterKey, pPlayer);
}
else
{
g_ItemExpDistributor.DistributeMoney( DropMoney, dwMonsterKey, pPlayer );
}
pField->DestroyObject( pItem );
}
Handler_CG_ITEM_IMPL( CG_ITEM_EXCHANGE_SYN )
{
__TOUCHED((pServerSession, pMsg, wSize));
MSG_CG_ITEM_EXCHANGE_SYN * pRecvMsg = (MSG_CG_ITEM_EXCHANGE_SYN *)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey );
ASSERT( pPlayer );
if( !pPlayer ) return ;
if( !pPlayer->GetField() )
{
SUNLOG( eCRITICAL_LOG, "[Handler_CG_ITEM_IMPL( CG_ITEM_EXCHANGE_SYN )] Not Exist GameField" );
return;
}
if( !CheckProcessInventoryLock( pPlayer, CG_ITEM_EXCHANGE_SYN ) )
return;
MSG_CG_ITEM_EXCHANGE_ACK amsg;
RC::eITEM_RESULT rt = pPlayer->GetItemManager()->GetTradingImpl()->Exchange(
pRecvMsg->m_atPos, &amsg.m_tagInventory );
switch( rt )
{
case RC::RC_ITEM_SUCCESS:
{
pPlayer->SendPacket( &amsg, amsg.GetSize() );
}
break;
default:
{
MSG_CG_ITEM_EXCHANGE_NAK msg;
ProtectorInventory& rPROTECT = pPlayer->GetWarehouseInventoryProtector().INVENTORY();
if( !rPROTECT.IsUsable() )
msg.m_byErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
else
msg.m_byErrorCode = rt;
pPlayer->SendPacket(&msg,sizeof(msg));
}
}
}
Handler_CG_ITEM_IMPL( CG_ITEM_QUICK_LINKITEM_SYN )
{
__TOUCHED((pServerSession, pMsg, wSize));
MSG_CG_ITEM_QUICK_LINKITEM_SYN * pRecvMsg = (MSG_CG_ITEM_QUICK_LINKITEM_SYN *)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey );
ASSERT( pPlayer );
if( !pPlayer ) return ;
if( !pPlayer->GetField() )
{
SUNLOG( eCRITICAL_LOG, "[Handler_CG_ITEM_IMPL( CG_ITEM_QUICK_LINKITEM_SYN )] Not Exist GameField" );
return;
}
if( !CheckProcessInventoryLock( pPlayer, CG_ITEM_QUICK_LINKITEM_SYN ) )
return;
RC::eQUICK_RESULT rt = pPlayer->GetQuickManager()->LinkItem( pRecvMsg->m_OrgPos, pRecvMsg->m_ToPos );
switch( rt )
{
case RC::RC_QUICK_SUCCESS:
{
MSG_CG_ITEM_QUICK_LINKITEM_ACK msg;
msg.m_OrgPos = pRecvMsg->m_OrgPos;
msg.m_ToPos = pRecvMsg->m_ToPos;
pPlayer->SendPacket( &msg, sizeof( msg ) );
}
break;
default:
{
MSG_CG_ITEM_QUICK_LINKITEM_NAK msg;
ProtectorInventory& rPROTECT = pPlayer->GetWarehouseInventoryProtector().INVENTORY();
if( !rPROTECT.IsUsable() )
msg.m_dwErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
else
msg.m_dwErrorCode = rt;
pPlayer->SendPacket(&msg,sizeof(msg));
}
}
}
Handler_CG_ITEM_IMPL( CG_ITEM_QUICK_LINKSKILL_SYN )
{
__TOUCHED((pServerSession, pMsg, wSize));
MSG_CG_ITEM_QUICK_LINKSKILL_SYN * pRecvMsg = (MSG_CG_ITEM_QUICK_LINKSKILL_SYN *)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey );
ASSERT( pPlayer );
if( !pPlayer ) return ;
if( !pPlayer->GetField() )
{
SUNLOG( eCRITICAL_LOG, "[Handler_CG_ITEM_IMPL( CG_ITEM_QUICK_LINKSKILL_SYN )] Not Exist GameField" );
return;
}
if( !CheckProcessInventoryLock( pPlayer, CG_ITEM_QUICK_LINKSKILL_SYN ) )
return;
RC::eQUICK_RESULT rt = pPlayer->GetQuickManager()->LinkSkill( pRecvMsg->m_SkillCode, pRecvMsg->m_ToPos );
switch( rt )
{
case RC::RC_QUICK_SUCCESS:
{
MSG_CG_ITEM_QUICK_LINKSKILL_ACK msg;
msg.m_SkillCode = pRecvMsg->m_SkillCode;
msg.m_ToPos = pRecvMsg->m_ToPos;
pPlayer->SendPacket( &msg, sizeof( msg ) );
}
break;
default:
{
MSG_CG_ITEM_QUICK_LINKSKILL_NAK msg;
ProtectorInventory& rPROTECT = pPlayer->GetWarehouseInventoryProtector().INVENTORY();
if( !rPROTECT.IsUsable() )
msg.m_dwErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
else
msg.m_dwErrorCode = rt;
pPlayer->SendPacket(&msg,sizeof(msg));
}
}
}
Handler_CG_ITEM_IMPL( CG_ITEM_QUICK_UNLINK_SYN )
{
__TOUCHED((pServerSession, pMsg, wSize));
MSG_CG_ITEM_QUICK_UNLINK_SYN * pRecvMsg = (MSG_CG_ITEM_QUICK_UNLINK_SYN *)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey );
ASSERT( pPlayer );
if( !pPlayer ) return ;
if( !pPlayer->GetField() )
{
// TODO: 扼捞宏 肺弊 苞促 免仿 巩力 烙矫 荐沥
// 努扼俊辑 菩摹 利侩登搁 荐沥登绰 巩力肺 努扼 菩摹 利侩傈鳖瘤 林籍 贸府
//SUNLOG( eCRITICAL_LOG, "[Handler_CG_ITEM_IMPL( CG_ITEM_QUICK_UNLINK_SYN )] Not Exist GameField" );
return;
}
if( !CheckProcessInventoryLock( pPlayer, CG_ITEM_QUICK_UNLINK_SYN ) )
return;
RC::eQUICK_RESULT rt = pPlayer->GetQuickManager()->Unlink( pRecvMsg->m_atPos );
switch( rt )
{
case RC::RC_QUICK_SUCCESS:
{
MSG_CG_ITEM_QUICK_UNLINK_ACK msg;
msg.m_atPos = pRecvMsg->m_atPos;
pPlayer->SendPacket( &msg, sizeof( msg ) );
}
break;
default:
{
MSG_CG_ITEM_QUICK_UNLINK_NAK msg;
ProtectorInventory& rPROTECT = pPlayer->GetWarehouseInventoryProtector().INVENTORY();
if( !rPROTECT.IsUsable() )
msg.m_dwErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
else
msg.m_dwErrorCode = rt;
pPlayer->SendPacket(&msg,sizeof(msg));
}
}
}
Handler_CG_ITEM_IMPL( CG_ITEM_QUICK_MOVE_SYN )
{
__TOUCHED((pServerSession, pMsg, wSize));
MSG_CG_ITEM_QUICK_MOVE_SYN * pRecvMsg = (MSG_CG_ITEM_QUICK_MOVE_SYN *)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey );
ASSERT( pPlayer );
if( !pPlayer ) return ;
if( !pPlayer->GetField() )
{
SUNLOG( eCRITICAL_LOG, "[Handler_CG_ITEM_IMPL( CG_ITEM_QUICK_MOVE_SYN )] Not Exist GameField" );
return;
}
if( !CheckProcessInventoryLock( pPlayer, CG_ITEM_QUICK_MOVE_SYN ) )
return;
RC::eQUICK_RESULT rt = pPlayer->GetQuickManager()->Move( pRecvMsg->m_fromPos, pRecvMsg->m_toPos );
switch( rt )
{
case RC::RC_QUICK_SUCCESS:
{
MSG_CG_ITEM_QUICK_MOVE_ACK msg;
msg.m_fromPos = pRecvMsg->m_fromPos;
msg.m_toPos = pRecvMsg->m_toPos;
pPlayer->SendPacket( &msg, sizeof( msg ) );
}
break;
default:
{
MSG_CG_ITEM_QUICK_MOVE_NAK msg;
ProtectorInventory& rPROTECT = pPlayer->GetWarehouseInventoryProtector().INVENTORY();
if( !rPROTECT.IsUsable() )
msg.m_dwErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
else
msg.m_dwErrorCode = rt;
pPlayer->SendPacket(&msg,sizeof(msg));
}
}
}
#if SUN_CODE_BACKUP
// NOTE: f110216.2L, unused section
// 狞浇吩狼 楷搬等 酒捞袍 沥焊甫 盎脚茄促. (C->G)
Handler_CG_ITEM_IMPL(CG_ITEM_QUICK_UPDATE_LINKED_ITEM_CMD)
{
__TOUCHED((pServerSession, pMsg, wSize));
const MSG_CG_ITEM_QUICK_UPDATE_LINKED_ITEM_CMD* update_cmd(NULL);
Player* requester(NULL);
if (!util::internal::CheckRequestMessage(pMsg, wSize, update_cmd, requester))
{
return;
}
int temp_result_code = 0;
if (!util::internal::CheckRequesterState(requester, __FUNCTION__, temp_result_code))
{
return;
}
QuickManager* const quick_slot_manager = requester->GetQuickManager();
quick_slot_manager->UpdateLinkedItem(update_cmd->target_quick_slot_position,
update_cmd->new_linked_item_container_type,
update_cmd->new_linked_item_position);
}
#endif
Handler_CG_ITEM_IMPL( CG_ITEM_DELETE_SYN )
{
__TOUCHED((pServerSession, pMsg, wSize));
MSG_CG_ITEM_DELETE_SYN * pRecvMsg = (MSG_CG_ITEM_DELETE_SYN *)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey );
ASSERT( pPlayer );
if( !pPlayer ) return ;
if( !pPlayer->GetField() )
{
SUNLOG( eCRITICAL_LOG, "[Handler_CG_ITEM_IMPL( CG_ITEM_DELETE_SYN )] Not Exist GameField" );
return;
}
if( !CheckProcessInventoryLock( pPlayer, CG_ITEM_DELETE_SYN ) )
return;
RC::eITEM_RESULT rt = pPlayer->GetItemManager()->Delete( pRecvMsg->m_AtPos );
switch( rt )
{
case RC::RC_ITEM_SUCCESS:
{
MSG_CG_ITEM_DELETE_ACK msg;
pPlayer->SendPacket( &msg, sizeof( msg ) );
}
break;
default:
{
MSG_CG_ITEM_DELETE_NAK msg;
ProtectorInventory& rPROTECT = pPlayer->GetWarehouseInventoryProtector().INVENTORY();
if( !rPROTECT.IsUsable() )
msg.m_byErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
else
msg.m_byErrorCode = rt;
pPlayer->SendPacket(&msg,sizeof(msg));
}
}
}
Handler_CG_ITEM_IMPL( CG_ITEM_REPAIR_DURA_SYN )
{
__TOUCHED((pServerSession, pMsg, wSize));
MSG_CG_ITEM_REPAIR_DURA_SYN* pRecvMsg = (MSG_CG_ITEM_REPAIR_DURA_SYN*)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey );
ASSERT( pPlayer );
if( !pPlayer ) return ;
if( !pPlayer->GetField() )
{
SUNLOG( eCRITICAL_LOG, "[Handler_CG_ITEM_IMPL( CG_ITEM_REPAIR_DURA_SYN )] Not Exist GameField" );
return;
}
if( !CheckProcessInventoryLock( pPlayer, CG_ITEM_REPAIR_DURA_SYN ) )
return;
RC::eITEM_RESULT rt = RC::RC_ITEM_FAILED;
if( g_ExtraNPCManager.IsLengthCanUseNPC(pRecvMsg->m_NPCCode, pPlayer, eNPC_TYPE_STORE) )
{
if (nsSlot::DurabilityImpl* const impl = pPlayer->GetItemManager()->GetDurabilityImpl()) {
rt = impl->Repair(pRecvMsg->m_bAllRepair, pRecvMsg->m_SlotIndex, pRecvMsg->m_SlotPos);
};
}
else
{
rt = RC::RC_ITEM_LENGTH_CANNOT_USE_NPC;
}
if( rt == RC::RC_ITEM_SUCCESS )
{
MSG_CG_ITEM_REPAIR_DURA_ACK ackMsg;
ackMsg.m_bAllRepair = pRecvMsg->m_bAllRepair;
ackMsg.m_SlotIndex = pRecvMsg->m_SlotIndex;
ackMsg.m_SlotPos = pRecvMsg->m_SlotPos;
ackMsg.m_Money = pPlayer->GetMoney();
pPlayer->SendPacket( &ackMsg, sizeof(ackMsg) );
}
else
{
MSG_CG_ITEM_REPAIR_DURA_NAK msg;
ProtectorInventory& rPROTECT = pPlayer->GetWarehouseInventoryProtector().INVENTORY();
if( !rPROTECT.IsUsable() )
msg.m_byErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
else
msg.m_byErrorCode = rt;
pPlayer->SendPacket(&msg,sizeof(msg));
}
}
Handler_CG_ITEM_IMPL( CG_ITEM_PORTAL_SYN )
{
__TOUCHED((pServerSession, pMsg, wSize));
MSG_CG_ITEM_PORTAL_SYN* pRecvMsg = (MSG_CG_ITEM_PORTAL_SYN*)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey );
if( !pPlayer ) return ;
if( !pPlayer->GetField() )
{
SUNLOG( eCRITICAL_LOG, "[Handler_CG_ITEM_IMPL( CG_ITEM_PORTAL_SYN )] Not Exist GameField" );
return;
}
if( !CheckProcessInventoryLock( pPlayer, CG_ITEM_PORTAL_SYN ) )
return;
RC::eITEM_RESULT rt = pPlayer->GetItemManager()->GetItemFunctionCoordinate().Portal(
pRecvMsg->m_CoordPos, pRecvMsg->m_PortalPos);
if( rt != RC::RC_ITEM_SUCCESS )
{
MSG_CG_ITEM_USE_NAK msg;
ProtectorInventory& rPROTECT = pPlayer->GetWarehouseInventoryProtector().INVENTORY();
if( !rPROTECT.IsUsable() )
msg.m_ErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
else
msg.m_ErrorCode = rt;
pPlayer->SendPacket(&msg,sizeof(msg));
}
}
Handler_CG_ITEM_IMPL( CG_ITEM_CLEAR_COORD_SYN )
{
__TOUCHED((pServerSession, pMsg, wSize));
MSG_CG_ITEM_CLEAR_COORD_SYN* pRecvMsg = (MSG_CG_ITEM_CLEAR_COORD_SYN*)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey );
if( !pPlayer ) return ;
if( !pPlayer->GetField() )
{
SUNLOG( eCRITICAL_LOG, "[Handler_CG_ITEM_IMPL( CG_ITEM_CLEAR_COORD_SYN )] Not Exist GameField" );
return;
}
if( !CheckProcessInventoryLock( pPlayer, CG_ITEM_CLEAR_COORD_SYN ) )
return;
RC::eITEM_RESULT rt = pPlayer->GetItemManager()->GetItemFunctionCoordinate().ClearCoord(
pRecvMsg->m_ClearPos, pRecvMsg->m_CoordPos);
if( rt != RC::RC_ITEM_SUCCESS )
{
MSG_CG_ITEM_USE_NAK msg;
ProtectorInventory& rPROTECT = pPlayer->GetWarehouseInventoryProtector().INVENTORY();
if( !rPROTECT.IsUsable() )
msg.m_ErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
else
msg.m_ErrorCode = rt;
pPlayer->SendPacket(&msg,sizeof(msg));
}
}
//檬扁拳 酒捞袍 荤侩
Handler_CG_ITEM_IMPL( CG_ITEM_INIT_STAT_SYN )
{
__TOUCHED((pServerSession, pMsg, wSize));
MSG_CG_ITEM_INIT_STAT_SYN* pRecvMsg = (MSG_CG_ITEM_INIT_STAT_SYN*)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey );
if( !pPlayer ) return;
if( !pPlayer->GetField() )
{
SUNLOG( eCRITICAL_LOG, "[Handler_CG_ITEM_IMPL( CG_ITEM_INIT_STAT_SYN )] Not Exist GameField" );
return;
}
if( !CheckProcessInventoryLock( pPlayer, CG_ITEM_INIT_STAT_SYN ) )
return;
RC::eITEM_RESULT rt = pPlayer->GetItemManager()->GetItemFunctionPlayerProperty().
InitStatItemUse(pRecvMsg->m_ItemSlotPos, pRecvMsg->m_wDecreaseValue);
if( rt == RC::RC_ITEM_SUCCESS )
{
MSG_CG_ITEM_INIT_STAT_ACK AckMsg;
AckMsg.m_ItemSlotPos = pRecvMsg->m_ItemSlotPos;
AckMsg.m_wDecreaseValue = pRecvMsg->m_wDecreaseValue;
pPlayer->SendPacket( &AckMsg, sizeof(AckMsg) );
}
else
{
MSG_CG_ITEM_INIT_STAT_NAK msg;
ProtectorInventory& rPROTECT = pPlayer->GetWarehouseInventoryProtector().INVENTORY();
if( !rPROTECT.IsUsable() )
msg.m_ErrorCode = RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
else
msg.m_ErrorCode = rt;
pPlayer->SendPacket(&msg,sizeof(msg));
}
}
Handler_CG_ITEM_IMPL( CG_ITEM_INVENTORY_PWD_CHECK_SYN )
{
__TOUCHED((pServerSession, pMsg, wSize));
Player* pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pMsg->m_dwKey );
ASSERT( pPlayer );
if( !pPlayer ) return;
if( !pPlayer->GetField() )
{
SUNLOG( eCRITICAL_LOG, "[Handler_CG_ITEM_IMPL( CG_ITEM_INVENTORY_PWD_CHECK_SYN )] Not Exist GameField" );
return;
}
if( g_FunctionalRestrictMgr.IsPossibleFunction( eFUNCTIONALRESTRICT_WAREINVEN_LOCK_BY_PWD ) )
{
WarehouseInventoryProtector& rPROTECTOR = pPlayer->GetWarehouseInventoryProtector();
rPROTECTOR.OnRecvCG_ITEM_INVENTORY_PWD_CHECK_SYN( (MSG_CG_ITEM_INVENTORY_PWD_CHECK_SYN*)pMsg, wSize );
}
else
{
MSG_CG_ITEM_INVENTORY_PWD_CHECK_NAK msgNAK;
pPlayer->SendPacket( &msgNAK, sizeof(msgNAK) );
}
}
Handler_CG_ITEM_IMPL( CG_ITEM_INVENTORY_PWD_SETTING_SYN )
{
__TOUCHED((pServerSession, pMsg, wSize));
Player* pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pMsg->m_dwKey );
ASSERT( pPlayer );
if( !pPlayer ) return;
if( !pPlayer->GetField() )
{
SUNLOG( eCRITICAL_LOG, "[Handler_CG_ITEM_IMPL( CG_ITEM_INVENTORY_PWD_SETTING_SYN )] Not Exist GameField" );
return;
}
if( g_FunctionalRestrictMgr.IsPossibleFunction( eFUNCTIONALRESTRICT_WAREINVEN_LOCK_BY_PWD ) )
{
WarehouseInventoryProtector& rPROTECTOR = pPlayer->GetWarehouseInventoryProtector();
rPROTECTOR.OnRecvCG_ITEM_INVENTORY_PWD_SETTING_SYN( (MSG_CG_ITEM_INVENTORY_PWD_SETTING_SYN*)pMsg, wSize );
}
else
{
MSG_CG_ITEM_INVENTORY_PWD_SETTING_NAK msgNAK;
pPlayer->SendPacket( &msgNAK, sizeof(msgNAK) );
}
}
Handler_CG_ITEM_IMPL( CG_ITEM_INVENTORY_PWD_LOCKING_SYN )
{
__TOUCHED((pServerSession, pMsg, wSize));
Player* pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pMsg->m_dwKey );
ASSERT( pPlayer );
if( !pPlayer ) return;
if( !pPlayer->GetField() )
{
SUNLOG( eCRITICAL_LOG, "[Handler_CG_ITEM_IMPL( CG_ITEM_INVENTORY_PWD_LOCKING_SYN )] Not Exist GameField" );
return;
}
if( g_FunctionalRestrictMgr.IsPossibleFunction( eFUNCTIONALRESTRICT_WAREINVEN_LOCK_BY_PWD ) )
{
WarehouseInventoryProtector& rPROTECTOR = pPlayer->GetWarehouseInventoryProtector();
rPROTECTOR.OnRecvCG_ITEM_INVENTORY_PWD_LOCKING_SYN( (MSG_CG_ITEM_INVENTORY_PWD_LOCKING_SYN*)pMsg, wSize );
}
else
{
MSG_CG_ITEM_INVENTORY_PWD_LOCKING_NAK msgNAK;
pPlayer->SendPacket( &msgNAK, sizeof(msgNAK) );
}
}
#ifdef __NA_001027_20080423_RANDOM_REWARD_EVENT_
Handler_CG_ITEM_IMPL(CG_ITEM_EXCHANGE_REWARD_ITEM_SYN)
{
__TOUCHED((pServerSession, pMsg, wSize));
MSG_CG_ITEM_EXCHANGE_REWARD_ITEM_SYN* pRecvMsg = (MSG_CG_ITEM_EXCHANGE_REWARD_ITEM_SYN*)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey );
if( !pPlayer ) return ;
if( !pPlayer->GetField() )
{
SUNLOG( eCRITICAL_LOG, "[Handler_CG_ITEM_IMPL( CG_ITEM_EXCHANGE_REWARD_ITEM_SYN )] Not Exist GameField" );
return;
}
if( !CheckProcessInventoryLock( pPlayer, CG_ITEM_EXCHANGE_REWARD_ITEM_SYN ) )
return;
MSG_CG_ITEM_EXCHANGE_REWARD_ITEM_ACK AckMsg;
RC::eITEM_RESULT rt = pPlayer->GetItemManager()->GetTradingImpl()->ExchangeRewardItem(
pRecvMsg->m_ItemCode, pRecvMsg->m_Count, &AckMsg.m_ItemInfo );
switch( rt )
{
case RC::RC_ITEM_SUCCESS:
{
pPlayer->SendPacket( &AckMsg, AckMsg.GetSize() );
}
break;
default:
{
MSG_CG_ITEM_EXCHANGE_REWARD_ITEM_NAK NakMsg;
NakMsg.m_ErrorCode = rt;
pPlayer->SendPacket( &NakMsg, sizeof( NakMsg ) );
}
}
}
#endif
Handler_CG_ITEM_IMPL(CG_ITEM_VALIDATION_OF_REIHALT_SYN)
{
__TOUCHED((pServerSession, pMsg, wSize));
MSG_CG_ITEM_VALIDATION_OF_REIHALT_SYN* pRecvMsg = (MSG_CG_ITEM_VALIDATION_OF_REIHALT_SYN*)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey );
ASSERT( pPlayer );
if( !pPlayer ) return;
if( !pPlayer->GetField() )
{
SUNLOG( eCRITICAL_LOG, "[Handler_CG_ITEM_IMPL( CG_ITEM_VALIDATION_OF_REIHALT_SYN )] Not Exist GameField" );
return;
}
if( !CheckProcessInventoryLock( pPlayer, CG_ITEM_VALIDATION_OF_REIHALT_SYN ) )
return;
RC::eITEM_RESULT rt = pPlayer->GetItemManager()->GetItemFunctionIdentity().IdentifyFateItem(
pRecvMsg->m_TargetItemPos);
switch( rt )
{
case RC::RC_ITEM_SUCCESS:
{
MSG_CG_ITEM_VALIDATION_OF_REIHALT_ACK AckMsg;
AckMsg.m_TargetItemPos = pRecvMsg->m_TargetItemPos;
SCItemSlot & rSlot = (SCItemSlot &)pPlayer->GetItemManager()->GetItemSlotContainer(SI_INVENTORY)->GetSlot( pRecvMsg->m_TargetItemPos );
rSlot.CopyOut(AckMsg.m_TargetItemStream);
pPlayer->SendPacket( &AckMsg, sizeof( AckMsg ));
}
break;
default:
{
MSG_CG_ITEM_VALIDATION_OF_REIHALT_NAK NakMsg;
NakMsg.m_dwErrorCode = rt;
pPlayer->SendPacket( &NakMsg, sizeof( NakMsg ));
}
}
}
Handler_CG_ITEM_IMPL(CG_ITEM_USE_PET_ITEM_SYN)
{
__TOUCHED((pServerSession, pMsg, wSize));
MSG_CG_ITEM_USE_PET_ITEM_SYN * pRecvMsg = (MSG_CG_ITEM_USE_PET_ITEM_SYN *)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey );
ASSERT( pPlayer );
if( !pPlayer ) return;
if( !pPlayer->GetField() )
{
SUNLOG( eCRITICAL_LOG, "[Handler_CG_ITEM_IMPL( CG_ITEM_USE_PET_ITEM_SYN )] Not Exist GameField" );
return;
}
if( !CheckProcessInventoryLock( pPlayer, CG_ITEM_USE_PET_ITEM_SYN ) )
return;
RC::eITEM_RESULT rt = pPlayer->GetItemManager()->GetItemFunctionPet().UsePetItem(
pRecvMsg->m_PetItemPos);
MSG_CG_ITEM_USE_PET_ITEM_ACK AckMeg;
AckMeg.m_PetItemPos = pRecvMsg->m_PetItemPos;
AckMeg.m_Result = rt;
pPlayer->SendPacket( &AckMeg, sizeof( AckMeg ));
}
// 魄档扼 惑磊甫 凯锭. (汗鼻酒捞袍阑 荤侩窍妨 茄促.)
Handler_CG_ITEM_IMPL(CG_ITEM_USE_PANDORA_ITEM_SYN)
{
__TOUCHED((pServerSession, pMsg, wSize));
// CHANGES: f110614.3L, logic arrangement
const MSG_CG_ITEM_USE_PANDORA_ITEM_SYN* const recv_msg =
static_cast<MSG_CG_ITEM_USE_PANDORA_ITEM_SYN*>(pMsg);
PLAYER_PTR_USERKEY(Player, player, recv_msg->m_dwKey);
GameField* const game_field = player->GetField();
GameZone* const game_zone = (game_field != NULL) ? game_field->GetGameZone() : NULL;
if (game_field == NULL || game_zone == NULL) {
return;
};
const sPOLICY_ZONE& zone_policy = game_zone->Policyment;
if (zone_policy.FIELD & zone_policy.ENABLE_SSQ_CONTROL) {
return;
};
if (!CheckProcessInventoryLock(player, CG_ITEM_USE_PANDORA_ITEM_SYN)) {
return;
};
//----------------------------------------------------------------------------------------------
POSTYPE Pos = recv_msg->m_InventoryPos;
struct FailResultHandler {
FailResultHandler(Player* player,POSTYPE pos)
: player_(player),_Pos(pos), result_(RC::RC_ITEM_LOTTO_OPEN_SUCCESS) { }
~FailResultHandler()
{
if (this->result_ != RC::RC_ITEM_LOTTO_OPEN_SUCCESS)
{
MSG_CG_ITEM_USE_PANDORA_ITEM_NAK msg_nak;
msg_nak.m_Result = this->result_;
msg_nak.m_InventoryPos=this->_Pos;
player_->SendPacket(&msg_nak, sizeof(msg_nak));
};
};
Player* const player_;
RC::eITEM_RESULT result_;
POSTYPE _Pos;
} result_handler(player,recv_msg->m_InventoryPos);
//----------------------------------------------------------------------------------------------
MSG_CG_ITEM_USE_PANDORA_ITEM_ACK msg_ack;
;{
msg_ack.m_Identity = false;
msg_ack.m_InventoryPos = recv_msg->m_InventoryPos;
ZeroMemory(&msg_ack.m_PandoraItemStream, sizeof(msg_ack.m_PandoraItemStream));
};
if (ItemManager* item_manager = player->GetItemManager())
{
result_handler.result_ = item_manager->GetItemFunctionLottery().PandoraBoxOpen(\
recv_msg->m_InventoryPos, &msg_ack.m_PandoraItemStream);
};
if (result_handler.result_ != RC::RC_ITEM_LOTTO_OPEN_SUCCESS) {
return;
};
// success process
msg_ack.m_Identity = true;
player->SendPacket(&msg_ack, sizeof(msg_ack));
return;
}
// 魄档扼 惑磊甫 摧阑 锭.
Handler_CG_ITEM_IMPL(CG_ITEM_PANDORABOX_CLOSE_SYN)
{
__TOUCHED((pServerSession, pMsg, wSize));
// CHANGES: f110614.3L, logic arrangement
const MSG_CG_ITEM_PANDORABOX_CLOSE_SYN* const recv_msg =
static_cast<MSG_CG_ITEM_PANDORABOX_CLOSE_SYN*>(pMsg);
PLAYER_PTR_USERKEY(Player, player, recv_msg->m_dwKey);
GameField* const game_field = player->GetField();
GameZone* const game_zone = (game_field != NULL) ? game_field->GetGameZone() : NULL;
if (game_field == NULL || game_zone == NULL) {
return;
};
const sPOLICY_ZONE& zone_policy = game_zone->Policyment;
if (zone_policy.FIELD & zone_policy.ENABLE_SSQ_CONTROL) {
return;
};
if (!CheckProcessInventoryLock(player, CG_ITEM_USE_PANDORA_ITEM_SYN)) { // ...
return;
};
//----------------------------------------------------------------------------------------------
RC::eITEM_RESULT close_result = RC::RC_ITEM_FAILED;
if (ItemManager* item_manager = player->GetItemManager())
{
close_result = item_manager->GetItemFunctionLottery().PandoraBoxClose(\
recv_msg->m_InventoryPos);
};
if (close_result != RC::RC_ITEM_PANDORABOX_CLOSE_SUCCESS)
{
MSG_CG_ITEM_PANDORABOX_CLOSE_NAK msg_nak;
msg_nak.m_Result = close_result;
player->SendPacket(&msg_nak, sizeof(msg_nak));
return;
};
// success process
MSG_CG_ITEM_PANDORABOX_CLOSE_ACK msg_ack;
player->SendPacket(&msg_ack, sizeof(msg_ack));
return;
}
Handler_CG_ITEM_IMPL(CG_ITEM_MOVE_PANDORA_ITEM_SYN)
{
__TOUCHED((pServerSession, pMsg, wSize));
const MSG_CG_ITEM_MOVE_PANDORA_ITEM_SYN* recv_msg =
static_cast<MSG_CG_ITEM_MOVE_PANDORA_ITEM_SYN*>(pMsg);
PLAYER_PTR_USERKEY(Player, player, recv_msg->m_dwKey);
GameField* const game_field = player->GetField();
GameZone* const game_zone = (game_field != NULL) ? game_field->GetGameZone() : NULL;
if (game_field == NULL || game_zone == NULL) {
return;
};
const sPOLICY_ZONE& zone_policy = game_zone->Policyment;
if (zone_policy.FIELD & zone_policy.ENABLE_SSQ_CONTROL) {
return;
};
if (!CheckProcessInventoryLock(player, CG_ITEM_MOVE_PANDORA_ITEM_SYN)) {
return;
};
//----------------------------------------------------------------------------------------------
struct FailResultHandler {
FailResultHandler(Player* player) : player_(player), result_(RC::RC_ITEM_SUCCESS) { }
~FailResultHandler()
{
if (this->result_ != RC::RC_ITEM_SUCCESS &&
this->result_ != RC::RC_ITEM_LOTTO_CONCRETIZE_SUCCESS)
{
MSG_CG_ITEM_MOVE_PANDORA_ITEM_NAK msg_nak;
msg_nak.m_Result = this->result_;
player_->SendPacket(&msg_nak, sizeof(msg_nak));
};
};
Player* const player_;
RC::eITEM_RESULT result_;
} result_handler(player);
//----------------------------------------------------------------------------------------------
if (player->GetBehave() != PLAYER_BEHAVE_DIALOG_OPEN_STATE) {
result_handler.result_ = RC::RC_ITEM_INVALIDSTATE;
return;
};
//----------------------------------------------------------------------------------------------
MSG_CG_ITEM_MOVE_PANDORA_ITEM_ACK msg_ack;
//----------------------------------------------------------------------------------------------
// lottery_item -> inventory, concretization
nsSlot::ItemFunctionLottery::ConcretizationResult concretization_arg = { NULL, };
concretization_arg.changed_lottery_item_stream = &msg_ack.m_PandoraItemStream;
concretization_arg.total_info = &msg_ack.m_InventoryInfo;
//
ItemManager* const item_manager = player->GetItemManager();
SCSlotContainer* const inventory_container = item_manager->GetItemSlotContainer(SI_INVENTORY);
result_handler.result_ = item_manager->GetItemFunctionLottery().ExtractLotteryItems(
false, recv_msg->m_InventoryPos, recv_msg->m_PandoraItemPosFrom,
inventory_container->GetEmptySlotNum(), &concretization_arg);
//----------------------------------------------------------------------------------------------
if ((result_handler.result_ != RC::RC_ITEM_SUCCESS) &&
(result_handler.result_ != RC::RC_ITEM_LOTTO_CONCRETIZE_SUCCESS))
{
return;
};
;{
msg_ack.m_Result = result_handler.result_;
msg_ack.m_InventoryPos = recv_msg->m_InventoryPos;
msg_ack.m_MoveInventory = 0; // unused;
msg_ack.m_Remove = (concretization_arg.result_value &
concretization_arg.eResult_RemoveLotteryItem) != 0;
};
//
player->SendPacket(&msg_ack, msg_ack.GetSize());
return;
}
Handler_CG_ITEM_IMPL(CG_ITEM_MOVE_ALL_PANDORA_ITEM_SYN)
{
__TOUCHED((pServerSession, pMsg, wSize));
const MSG_CG_ITEM_MOVE_ALL_PANDORA_ITEM_SYN* recv_msg =
static_cast<MSG_CG_ITEM_MOVE_ALL_PANDORA_ITEM_SYN*>(pMsg);
PLAYER_PTR_USERKEY(Player, player, recv_msg->m_dwKey);
GameField* const game_field = player->GetField();
GameZone* const game_zone = (game_field != NULL) ? game_field->GetGameZone() : NULL;
if (game_field == NULL || game_zone == NULL) {
return;
};
const sPOLICY_ZONE& zone_policy = game_zone->Policyment;
if (zone_policy.FIELD & zone_policy.ENABLE_SSQ_CONTROL) {
return;
};
if (!CheckProcessInventoryLock(player, CG_ITEM_MOVE_PANDORA_ITEM_SYN)) {
return;
};
//----------------------------------------------------------------------------------------------
struct FailResultHandler {
FailResultHandler(Player* player) : player_(player), result_(RC::RC_ITEM_SUCCESS) { }
~FailResultHandler()
{
if (this->result_ != RC::RC_ITEM_SUCCESS &&
this->result_ != RC::RC_ITEM_LOTTO_CONCRETIZE_SUCCESS)
{
MSG_CG_ITEM_MOVE_PANDORA_ITEM_NAK msg_nak;
msg_nak.m_Result = this->result_;
player_->SendPacket(&msg_nak, sizeof(msg_nak));
};
};
Player* player_;
RC::eITEM_RESULT result_;
} result_handler(player);
//----------------------------------------------------------------------------------------------
if (player->GetBehave() != PLAYER_BEHAVE_DIALOG_OPEN_STATE) {
result_handler.result_ = RC::RC_ITEM_INVALIDSTATE;
return;
};
//----------------------------------------------------------------------------------------------
MSG_CG_ITEM_MOVE_PANDORA_ITEM_ACK msg_ack;
//----------------------------------------------------------------------------------------------
// lottery_item -> inventory, concretization
nsSlot::ItemFunctionLottery::ConcretizationResult concretization_arg = { NULL, };
concretization_arg.changed_lottery_item_stream = &msg_ack.m_PandoraItemStream;
concretization_arg.total_info = &msg_ack.m_InventoryInfo;
//
ItemManager* const item_manager = player->GetItemManager();
SCSlotContainer* const inventory_container = item_manager->GetItemSlotContainer(SI_INVENTORY);
result_handler.result_ = item_manager->GetItemFunctionLottery().ExtractLotteryItems(
true, recv_msg->m_InventoryPos, 0, inventory_container->GetEmptySlotNum(), &concretization_arg);
//----------------------------------------------------------------------------------------------
if ((result_handler.result_ != RC::RC_ITEM_SUCCESS) &&
(result_handler.result_ != RC::RC_ITEM_LOTTO_CONCRETIZE_SUCCESS))
{
return;
};
;{
msg_ack.m_Result = result_handler.result_;
msg_ack.m_InventoryPos = recv_msg->m_InventoryPos;
msg_ack.m_MoveInventory = 0; // unused;
msg_ack.m_Remove = (concretization_arg.result_value &
concretization_arg.eResult_RemoveLotteryItem) != 0;
};
//
player->SendPacket(&msg_ack, msg_ack.GetSize());
return;
}
Handler_CG_ITEM_IMPL(CG_ITEM_REPURCHASE_SYN)
{
__TOUCHED((pServerSession, pMsg, wSize));
PACKET_PTR_CONVERT(MSG_CG_ITEM_REPURCHASE_SYN, pRecvMsg, pMsg);
PLAYER_PTR_USERKEY(Player, pPlayer, pRecvMsg->m_dwKey);
if( !pPlayer->GetField() )
{
SUNLOG( eCRITICAL_LOG, "[Handler_CG_ITEM_IMPL( CG_ITEM_REPURCHASE_SYN )] Not Exist GameField" );
return;
}
RC::eITEM_RESULT result = RC::RC_ITEM_SUCCESS;
if( g_ExtraNPCManager.IsLengthCanUseNPC(pRecvMsg->m_NPCCode, pPlayer, eNPC_TYPE_STORE) )
{
MSG_CG_ITEM_REPURCHASE_ACK msg;
result = pPlayer->GetItemManager()->GetTradingImpl()->Repurchase(
pRecvMsg->m_RepurchasePos, &msg.m_TotalInfo);
if(RC::RC_ITEM_SUCCESS == result)
{
msg.m_Money = pPlayer->GetMoney();
pPlayer->SendPacket( &msg, msg.GetSize() );
return;
}
}
ProtectorInventory& rPROTECT = pPlayer->GetWarehouseInventoryProtector().INVENTORY();
MSG_CG_ITEM_REPURCHASE_NAK msg;
msg.m_ErrorCode = (rPROTECT.IsUsable()) ? result : RC::RC_ITEM_INVENTORY_NEED_PASSWORD;
pPlayer->SendPacket(&msg,sizeof(msg));
}
Handler_CG_ITEM_IMPL(CG_ITEM_EQUIP_ETHER_DEVICE_SYN)
{
__TOUCHED((pServerSession, pMsg, wSize));
MSG_CG_ITEM_EQUIP_ETHER_DEVICE_SYN * pRecvMsg = (MSG_CG_ITEM_EQUIP_ETHER_DEVICE_SYN *)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey );
ASSERT( pPlayer );
if( !pPlayer ) return;
if( !pPlayer->GetField() )
{
SUNLOG( eCRITICAL_LOG, "[Handler_CG_ITEM_IMPL( CG_ITEM_EQUIP_ETHER_DEVICE_SYN )] Not Exist GameField" );
return;
}
if( !CheckProcessInventoryLock( pPlayer, CG_ITEM_EQUIP_ETHER_DEVICE_SYN ) )
return;
RC::eITEM_RESULT rt = pPlayer->GetItemManager()->GetItemFunctionEtherWeapon().
EquipEtherDeviceToWeapon(pRecvMsg->m_DeviceItemPos, pRecvMsg->m_WeaponItemPos);
MSG_CG_ITEM_EQUIP_ETHER_DEVICE_ACK AckMsg;
AckMsg.m_DeviceItemPos = pRecvMsg->m_DeviceItemPos;
AckMsg.m_WeaponItemPos = pRecvMsg->m_WeaponItemPos;
AckMsg.m_Result = rt;
pPlayer->SendPacket( &AckMsg, sizeof( AckMsg ));
}
Handler_CG_ITEM_IMPL(CG_ITEM_STAT_CHANGE_USE_SYN)
{
__TOUCHED((pServerSession, pMsg, wSize));
MSG_CG_ITEM_STAT_CHANGE_USE_SYN *pRecvMsg = (MSG_CG_ITEM_STAT_CHANGE_USE_SYN *)pMsg;
Player *pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey );
ASSERT( pPlayer );
if( !pPlayer ) return;
MSG_CG_ITEM_STAT_CHANGE_USE_ACK ack;
DWORD result = pPlayer->GetItemManager()->GetItemFunctionItemLimitation().\
ChangeItemStat_SelectItem(pRecvMsg->m_atIndex, pRecvMsg->m_atPos,
pRecvMsg->m_ChangeItemPos, &ack);
if( result != RC::RC_ITEM_SUCCESS )
{
MSG_CG_ITEM_STAT_CHANGE_USE_NAK nack;
nack.m_ErrorCode = result;
pPlayer->SendPacket( &nack, sizeof( MSG_CG_ITEM_STAT_CHANGE_USE_NAK));
return;
}
ack.m_atPos = pRecvMsg->m_atPos;
ack.m_ChangeItemPos = pRecvMsg->m_ChangeItemPos;
pPlayer->SendPacket( &ack, sizeof( MSG_CG_ITEM_STAT_CHANGE_USE_ACK));
}
Handler_CG_ITEM_IMPL(CG_ITEM_STAT_CHANGE_SELECT_SYN)
{
__TOUCHED((pServerSession, pMsg, wSize));
MSG_CG_ITEM_STAT_CHANGE_SELECT_SYN *pRecvMsg = (MSG_CG_ITEM_STAT_CHANGE_SELECT_SYN *)pMsg;
Player *pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey );
ASSERT( pPlayer );
if( !pPlayer ) return;
MSG_CG_ITEM_STAT_CHANGE_SELECT_ACK msg;
DWORD result = pPlayer->GetItemManager()->GetItemFunctionItemLimitation().ChangeItemStat(
pRecvMsg->m_SelectItemCode, pRecvMsg->m_bSelect);
if( RC::RC_ITEM_SUCCESS != result )
{
MSG_CG_ITEM_STAT_CHANGE_SELECT_NAK nack;
nack.m_ErrorCode = result;
pPlayer->SendPacket( &nack, sizeof( MSG_CG_ITEM_STAT_CHANGE_SELECT_NAK));
return;
}
::ZeroMemory( &msg.m_InventoryInfo, sizeof( INVENTORY_TOTAL_INFO));
pPlayer->GetItemManager()->SerializeInventoryTotalInfo( msg.m_InventoryInfo, SERIALIZE_LOAD);
pPlayer->SendPacket(&msg, sizeof(MSG_CG_ITEM_STAT_CHANGE_SELECT_ACK));
}
Handler_CG_ITEM_IMPL(CG_ITEM_USE_MOTION_SYN)
{
__TOUCHED((pServerSession, pMsg, wSize));
MSG_CG_ITEM_USE_MOTION_SYN *pRecvMsg = (MSG_CG_ITEM_USE_MOTION_SYN *)pMsg;
Player *pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey );
ASSERT( pPlayer );
if( !pPlayer ) return;
//.//
ItemManager* pItemMng = pPlayer->GetItemManager();
if( !pItemMng->ValidPos( pRecvMsg->m_atIndex, pRecvMsg->m_atPos, TRUE ) )
{
MSG_CG_ITEM_USE_MOTION_NAK nack;
nack.m_byErrorCode = RC::RC_ITEM_INVALIDPOS;
pPlayer->SendPacket( &nack, sizeof( MSG_CG_ITEM_USE_MOTION_NAK));
return;
}
SCSlotContainer * pAtContainer = pItemMng->GetItemSlotContainer( pRecvMsg->m_atIndex );
SCItemSlot & rAtSlot = (SCItemSlot &)pAtContainer->GetSlot( pRecvMsg->m_atPos );
RC::eITEM_RESULT rcResult = pPlayer->CanUseItem( rAtSlot.GetItemInfo() );
if( rcResult != RC::RC_ITEM_SUCCESS )
{
MSG_CG_ITEM_USE_MOTION_NAK nack;
nack.m_byErrorCode = rcResult;
pPlayer->SendPacket( &nack, sizeof( MSG_CG_ITEM_USE_MOTION_NAK));
return;
}
//.//
MSG_CG_ITEM_USE_MOTION_BRD brdMsg;
brdMsg.m_dwAttackerKey = pPlayer->GetObjectKey();
brdMsg.m_ItemCode = rAtSlot.GetItemCode();
brdMsg.m_wvMainTargetPos = pRecvMsg->m_wvMainTargetPos;
pPlayer->SendPacket( &brdMsg, sizeof(brdMsg) );
pPlayer->SendPacketAround( &brdMsg, sizeof(brdMsg), FALSE );
}
Handler_CG_ITEM_IMPL(CG_ITEM_USE_CHANGE_PET_NAME_ITEM_SYN)
{
__TOUCHED((pServerSession, pMsg, wSize));
MSG_CG_ITEM_USE_CHANGE_PET_NAME_ITEM_SYN * pRecvMsg = (MSG_CG_ITEM_USE_CHANGE_PET_NAME_ITEM_SYN *)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey );
ASSERT( pPlayer );
if( !pPlayer ) return;
if( !CheckProcessInventoryLock( pPlayer, CG_ITEM_USE_CHANGE_PET_NAME_ITEM_SYN ) )
return;
//努扼 救瓜绢.
pRecvMsg->m_PetName[MAX_PET_NAME_LENGTH] = '\0';
RC::eITEM_RESULT rt = pPlayer->GetItemManager()->GetItemFunctionPet().UseChangePetNameCard(
pRecvMsg->m_ItemPos, pRecvMsg->m_PetName);
MSG_CG_ITEM_USE_CHANGE_PET_NAME_ITEM_ACK AckMeg;
AckMeg.m_ResultCode = rt;
pPlayer->SendPacket( &AckMeg, sizeof( AckMeg ));
}
Handler_CG_ITEM_IMPL( CG_ITEM_ACTIVE_ETHER_BULLET_SYN )
{
__TOUCHED((pServerSession, pMsg, wSize));
MSG_CG_ITEM_ACTIVE_ETHER_BULLET_SYN * pRecvMsg = (MSG_CG_ITEM_ACTIVE_ETHER_BULLET_SYN *)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey );
ASSERT( pPlayer );
if( !pPlayer ) return;
MSG_CG_ITEM_ACTIVE_ETHER_BULLET_ACK AckMsg;
MSG_CG_ITEM_ETHER_ACTIVE_STATE_BRD BrdMsg;
AckMsg.m_ResultCode = RC::RC_ITEM_SUCCESS;
BrdMsg.m_dwPlayerKey = pPlayer->GetObjectKey();
BrdMsg.m_bActive = pRecvMsg->m_bActive;
//劝己拳
if( pRecvMsg->m_bActive )
{
#ifdef _NA_008679_20160202_REWORK_BATTLEGROUND
if (pPlayer->IsThereBattleGroundZone() == TRUE)
{
AckMsg.m_ResultCode = RC::RC_ITEM_CANNOT_USE_BATTLEGROUND;
pPlayer->SendPacket( &AckMsg, sizeof(AckMsg));
return;
}
#endif //_NA_008679_20160202_REWORK_BATTLEGROUND
if( !CheckProcessInventoryLock( pPlayer, CG_ITEM_ACTIVE_ETHER_BULLET_SYN ) )
return;
if( pPlayer->m_EtherManager.IsActive() )
{
AckMsg.m_ResultCode = RC::RC_ITEM_CAN_NOT_ACTIVE_ETHER_BULLET;
pPlayer->SendPacket( &AckMsg, sizeof(AckMsg));
return;
}
if( !pPlayer->m_EtherManager.ActiveBulletItem( pRecvMsg->m_ActiveBulletItemPos ) )
{
AckMsg.m_ResultCode = RC::RC_ITEM_CAN_NOT_ACTIVE_ETHER_BULLET;
pPlayer->SendPacket( &AckMsg, sizeof(AckMsg));
return;
}
tagEtherBulletInfo* pBulletInfo = pPlayer->m_EtherManager.GetBulletOption();
if( pBulletInfo )
{
AckMsg.m_BulletEffectCode = pBulletInfo->m_byEffectCode;
BrdMsg.m_BulletEffectCode = pBulletInfo->m_byEffectCode;
}
else
{
ASSERT(FALSE);
SUNLOG(eCRITICAL_LOG, "Not find BulletOption");
}
}
//厚劝己拳
else
{
if( !pPlayer->m_EtherManager.IsActive() )
{
AckMsg.m_ResultCode = RC::RC_ITEM_CAN_NOT_INACTIVE_ETHER_BULLET;
pPlayer->SendPacket( &AckMsg, sizeof(AckMsg));
return;
}
if( !pPlayer->m_EtherManager.InActiveBulletItem( pRecvMsg->m_ActiveBulletItemPos ) )
{
AckMsg.m_ResultCode = RC::RC_ITEM_CAN_NOT_INACTIVE_ETHER_BULLET;
pPlayer->SendPacket( &AckMsg, sizeof(AckMsg));
return;
}
}
//SUCCESS
pPlayer->SendPacket( &AckMsg, sizeof(AckMsg));
pPlayer->SendPacketAround( &BrdMsg, sizeof(BrdMsg), FALSE );
}
Handler_CG_ITEM_IMPL( CG_ITEM_IDENTIFY_POSSESSION_SYN )
{
__TOUCHED((pServerSession, pMsg, wSize));
MSG_CG_ITEM_IDENTIFY_POSSESSION_SYN * pRecvMsg = (MSG_CG_ITEM_IDENTIFY_POSSESSION_SYN *)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey );
ASSERT( pPlayer );
if( !pPlayer ) return;
if( !CheckProcessInventoryLock( pPlayer, CG_ITEM_IDENTIFY_POSSESSION_SYN ) )
return;
MSG_CG_ITEM_IDENTIFY_POSSESSION_ACK AckMeg;
RC::eITEM_RESULT rt = pPlayer->GetItemManager()->GetItemFunctionIdentity().\
IdentifyPossessionItem(pRecvMsg->m_ItemPos, AckMeg.m_PossessionItemStream);
AckMeg.m_ResultCode = rt;
AckMeg.m_PossessionItemPos = pRecvMsg->m_ItemPos;
pPlayer->SendPacket( &AckMeg, sizeof( AckMeg ));
}
//{__NA_0_CASH_ITEM_RENEWAL_SUPERMASTER
Handler_CG_ITEM_IMPL( CG_ITEM_FIXED_AMOUNT_EX_ITEM_FIRE_UP_SYN )
{
__TOUCHED((pServerSession, pMsg, wSize));
// (WAVERIX) (090918) (BUG-FIX) 荐欺规厘 酒捞袍 荤侩 夸没俊 措茄 贸府啊 己傍/角菩啊 备盒 绝捞
// 捞凤瘤绰 巩力 荐沥
MSG_CG_ITEM_FIXED_AMOUNT_EX_ITEM_FIRE_UP_SYN* pRecvMsg =
static_cast<MSG_CG_ITEM_FIXED_AMOUNT_EX_ITEM_FIRE_UP_SYN *>(pMsg);
Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey );
if(!FlowControl::FCAssert(pPlayer != 0))
return;
if( !CheckProcessInventoryLock( pPlayer, CG_ITEM_FIXED_AMOUNT_EX_ITEM_FIRE_UP_SYN ) )
return;
ItemManager* pItemManager = pPlayer->GetItemManager();
//if(!pItemManager) -> assert (pPlayer->GetItemManager() != 0); <- pre-aligned
// return;
BOOLEAN success = true;
RC::eITEM_RESULT rt = RC::RC_ITEM_SUCCESS;
if(success && !pItemManager->ValidState())
{ success = false, rt = RC::RC_ITEM_INVALIDSTATE; }
const POSTYPE requested_fireup_item_pos = pRecvMsg->m_FireUpItemPos;
SCSlotContainer* pContainer = 0;
if(success && !pItemManager->ValidPos(SI_INVENTORY, requested_fireup_item_pos))
{ success = false, rt = RC::RC_ITEM_INVALIDPOS; }
MSG_CG_ITEM_FIXED_AMOUNT_EX_ITEM_FIRE_UP_ACK msgACK;
if(success == 0) {
msgACK.m_ResultCode = rt;
msgACK.m_FireUpItemPos = requested_fireup_item_pos;
pPlayer->SendPacket(&msgACK, sizeof(msgACK));
return;
}
pContainer = pItemManager->GetItemSlotContainer(SI_INVENTORY);
SCItemSlot& rFireUpItemSlot = (SCItemSlot&)pContainer->GetSlot(requested_fireup_item_pos);
//if(success && !rFireUpItemSlot.GetItemInfo()) <- assert(rFireUpItemSlot.GetItemInfo() != 0)
//{ success = false, rt = RC::RC_ITEM_NOINFO; }
const BASE_ITEMINFO* pFireupItemInfo = rFireUpItemSlot.GetItemInfo();
if(success && pFireupItemInfo->m_Code == 0)
{ success = false, rt = RC::RC_ITEM_NOINFO; }
//犬厘 沥咀 鸥涝牢啊
if(success && pFireupItemInfo->m_ChargeSubType != eCHARGE_SUB_FIXED_AMOUNT_EX)
{ success = false, rt = RC::RC_ITEM_INVALID_TYPE; }
if(success) {
int slot_pos = 0;
for(; slot_pos < MAX_INVENTORY_SLOT_NUM; ++slot_pos) {
if(pContainer->IsEmpty(slot_pos))
continue;
if(slot_pos == requested_fireup_item_pos)
continue;
SCItemSlot& rItemSlot = (SCItemSlot &)pContainer->GetSlot(slot_pos);
const BASE_ITEMINFO* pSlotItemInfo = rItemSlot.GetItemInfo();
if(rItemSlot.GetSerial() != 0 &&
pSlotItemInfo->m_ChargeSubType == eCHARGE_SUB_FIXED_AMOUNT_EX &&
pSlotItemInfo->m_wType == pFireupItemInfo->m_wType &&
rItemSlot.IsProgressTime() )
{
break;
}
}
if(success && slot_pos != MAX_INVENTORY_SLOT_NUM)
{ success = false, rt = RC::RC_ITEM_ALREADY_FIREUP_ITEM_SAME_TYPE; }
}
if(success) {
assert(rt == RC::RC_ITEM_SUCCESS);
if(success && !rFireUpItemSlot.FireUp_DateTime())
{ success = false, rt = RC::RC_ITEM_FAILED; }
}
if(success) {
//(shogen)(090814) Log
GAMELOG->LogItem( ITEM_CHARGE_FIRST_EQUIP, pPlayer, &rFireUpItemSlot );
msgACK.m_ResultCode = rt;
msgACK.m_FireUpItemPos = requested_fireup_item_pos;
pPlayer->SendPacket(&msgACK, sizeof(msgACK));
static_cast<CInventorySlotContainer*>(pContainer)->OnUpdate(
rFireUpItemSlot, rFireUpItemSlot.GetNum());
pItemManager->SendItemChange(rFireUpItemSlot);
return;
}
assert(success == false);
// current status { fail }
msgACK.m_ResultCode = rt;
msgACK.m_FireUpItemPos = requested_fireup_item_pos;
pPlayer->SendPacket(&msgACK, sizeof(msgACK));
}
//}__NA_0_CASH_ITEM_RENEWAL_SUPERMASTER
//==================================================================================================
Handler_CG_ITEM_IMPL(CG_ITEM_RIDER_CONTROL_SYN)
{
__TOUCHED((pServerSession, pMsg, wSize));
const MSG_CG_ITEM_RIDER_CONTROL_SYN* pRecvMsg =
static_cast<MSG_CG_ITEM_RIDER_CONTROL_SYN*>(pMsg);
Player* const pPlayer = PlayerManager::Instance()->FindPlayerByUserKey(pRecvMsg->m_dwKey);
if(!FlowControl::FCAssert(pPlayer != 0))
return;
MSG_CG_ITEM_RIDER_CONTROL_BRD msgBRD;
msgBRD.Clear();
const RiderControl& header = pRecvMsg->header;
BOOLEAN success = header.request < header.eReq_Counts;
if(success == 0) {
msgBRD.SetUnknownFailed();
pPlayer->SendPacket(&msgBRD, msgBRD.GetSize());
return;
}
//滚弊荐沥:5799 巩惑泅 2010-02-03 葛电惫啊傍烹 牢亥遏吧赴惑鸥俊辑 家券拱 鸥绊 乐阑锭 傍拜给窍绰 坷幅 荐沥
if(header.eReq_SummonBattleRelease != header.request) //傈捧甫 困茄 家券秦力绰 牢亥遏阑 公矫茄促.
{
success = !!CheckProcessInventoryLock(pPlayer, CG_ITEM_RIDER_CONTROL_SYN);
if(success == 0) {
IPlayerRiderD::SetDefaultFailResult(header, &msgBRD.header, &msgBRD.data);
pPlayer->SendPacket(&msgBRD, msgBRD.GetSize());
return;
}
}
// 飘罚黎记捞唱 捞固 家券登绢 乐绰 惑怕 绊妨且 巴.
switch(header.request)
{
case header.eReq_SummonStart:
case header.eReq_SummonCancel:
case header.eReq_Summon:
case header.eReq_SummonRelease:
case header.eReq_SummonBattleRelease:
//case header.eReq_WaxGloss:
{ // accept fields
}
break;
default:
{
SUNLOG(eCRITICAL_LOG, "0|Can't Accept Request|%s|%d|",
pPlayer->GetCharName(), header.request);
msgBRD.SetUnknownFailed();
pPlayer->SendPacket(&msgBRD, msgBRD.GetSize());
return;
}
break;
}
assert(success != 0);
if(pPlayer->Rider.IsValidState() == 0)
pPlayer->Rider.Init(pPlayer);
PlayerRider& rider = pPlayer->Rider.Get();
PlayerRider::eResult result = rider.Route(header, &msgBRD.header, &msgBRD.data);
if(result == rider.eResult_1toN)
pPlayer->SendPacketAround(&msgBRD, msgBRD.GetSize(), true);
else
pPlayer->SendPacket(&msgBRD, msgBRD.GetSize());
}
Handler_CG_ITEM_IMPL(CG_ITEM_RIDER_CONTROL_PARTS_SYN)
{
__TOUCHED((pServerSession, pMsg, wSize));
const MSG_CG_ITEM_RIDER_CONTROL_PARTS_SYN* pRecvMsg =
static_cast<MSG_CG_ITEM_RIDER_CONTROL_PARTS_SYN*>(pMsg);
Player* const pPlayer = PlayerManager::Instance()->FindPlayerByUserKey(pRecvMsg->m_dwKey);
if(!FlowControl::FCAssert(pPlayer != 0))
return;
MSG_CG_ITEM_RIDER_CONTROL_PARTS_BRD msgBRD;
msgBRD.Clear();
const RiderControl& header = pRecvMsg->header;
BOOLEAN success = header.request < header.eReq_Counts;
if(success == 0) {
msgBRD.SetUnknownFailed();
pPlayer->SendPacket(&msgBRD, msgBRD.GetSize());
return;
}
success = !!CheckProcessInventoryLock(pPlayer, CG_ITEM_RIDER_CONTROL_PARTS_SYN);
if(success == 0) {
IPlayerRiderD::SetDefaultFailResult(header, &msgBRD.header, &msgBRD.data);
pPlayer->SendPacket(&msgBRD, msgBRD.GetSize());
return;
}
// 飘罚黎记捞唱 捞固 家券登绢 乐绰 惑怕 绊妨且 巴.
assert(success != 0);
PlayerRider::eResult result = PlayerRider::eResult_Fail;
switch(header.request)
{
case header.eReq_EquipParts:
case header.eReq_UnEquipParts:
{
if(pPlayer->Rider.IsValidState() == 0)
pPlayer->Rider.Init(pPlayer);
PlayerRider& rider = pPlayer->Rider.Get();
result = rider.Route(header, &msgBRD.header, &msgBRD.data);
}
break;
case header.eReq_WaxGloss: // <
{ // accept fields
result = PlayerRider::WaxGloss(header, &msgBRD.header, &msgBRD.data, pPlayer);
}
break;
default:
{
SUNLOG(eCRITICAL_LOG, "0|Can't Accept Request|%s|%d|",
pPlayer->GetCharName(), header.request);
msgBRD.SetUnknownFailed();
result = PlayerRider::eResult_Fail;
}
break;
}
if(result == PlayerRider::eResult_1toN)
pPlayer->SendPacketAround(&msgBRD, msgBRD.GetSize(), true);
else
pPlayer->SendPacket(&msgBRD, msgBRD.GetSize());
}
//_NA_0_20091030_RANDOM_ITEM
Handler_CG_ITEM_IMPL(CG_ITEM_USE_RANDOM_ITEM_SYN)
{
__TOUCHED((pServerSession, pMsg, wSize));
RandomItemImplement Implement;
Implement.DoMessageImplement( pMsg );
}
#ifdef _NA_1419_20100121_ACCUMULATE_POINT
Handler_CG_ITEM_IMPL(CG_ITEM_QUERY_ACCUMULATE_POINT_ITEM_SYN)
{
__TOUCHED((pServerSession, pMsg, wSize));
AccumulatePointImplement Implement;
Implement.DoMessageImplement( pMsg );
}
Handler_CG_ITEM_IMPL(CG_ITEM_USE_ACCUMULATE_POINT_SYN)
{
__TOUCHED((pServerSession, pMsg, wSize));
AccumulatePointImplement Implement;
Implement.DoMessageImplement( pMsg );
}
#endif
//_NA000023_090323_ENHANCED_INVENTORY_SLOT_FUNCTIONALITY_
Handler_CG_ITEM_IMPL(CG_ITEM_INVENTORY_CONFIG_CHANGE_SYN)
{
__TOUCHED((pServerSession, pMsg, wSize));
// (NOTE) (f100331.2L)
const MSG_CG_ITEM_INVENTORY_CONFIG_CHANGE_SYN* recv_msg = \
static_cast<MSG_CG_ITEM_INVENTORY_CONFIG_CHANGE_SYN*>(pMsg);
if (sizeof(*recv_msg) != wSize) { // pass
assert(sizeof(*recv_msg) != wSize);
return;
}
//
const DWORD user_key = recv_msg->m_dwKey;
Player* player = PlayerManager::Instance()->FindPlayerByUserKey(user_key);
if (player == NULL || player->GetField() == NULL) { // low level
return;
}
//
MSG_CG_ITEM_INVENTORY_CONFIG_CHANGE_ACK msg_ack;
// reply to client whatever the result is succeeds or fails.
bool succeed = player->UpdateInventoryConfig(recv_msg->changed);
__UNUSED(succeed);
msg_ack.changed = player->GetCharInfo()->m_InventoryConfig;
msg_ack.result = RC::RC_ITEM_SUCCESS;
player->SendPacket(&msg_ack, sizeof(msg_ack));
}
//_NA000109_100427_ITEM_CUSTOMIZING_CONTENTS_
Handler_CG_ITEM_IMPL(CG_ITEM_ETHERIA_CONTROL_SYN)
{
__TOUCHED((pServerSession, pMsg, wSize));
const MSG_CG_ITEM_ETHERIA_CONTROL_SYN* recv_msg = \
static_cast<MSG_CG_ITEM_ETHERIA_CONTROL_SYN*>(pMsg);
if (sizeof(*recv_msg) != wSize) { // pass
assert(sizeof(*recv_msg) != wSize);
return;
}
//
const DWORD user_key = recv_msg->m_dwKey;
Player* const player = PlayerManager::Instance()->FindPlayerByUserKey(user_key);
if (player == NULL || player->GetField() == NULL) { // low level
return;
}
//
MSG_CG_ITEM_ETHERIA_CONTROL_ACK msg_ack;
const EtheriaControl& header = recv_msg->header;
bool success = (header.request < header.eReq_Counts);
if (success == false)
{
msg_ack.SetUnknownFailed();
player->SendPacket(&msg_ack, msg_ack.GetSize());
return;
}
//
nsSlot::EtheriaFailHandler etheria_fail_handler(&msg_ack.header, &msg_ack.data, header, player);
//
success = CheckProcessInventoryLock(player, CG_ITEM_ETHERIA_CONTROL_SYN) != false;
if (success == false)
{
etheria_fail_handler.SetFailResult(msg_ack.header.eRet_ItemFailed,
RC::RC_ITEM_INVENTORY_NEED_PASSWORD, false);
player->SendPacket(&msg_ack, msg_ack.GetSize());
return;
}
//
assert(success != 0);
nsSlot::EtheriaImpl etherealizer;
player->SetupEtherealizer(&etherealizer);
nsSlot::EtheriaImpl::eResult notify_result = etherealizer.eResult_Fail;
switch (header.request)
{
case header.eReq_CastingStart:
case header.eReq_CastingCancel:
notify_result = etherealizer.Casting(header, &msg_ack.header, &msg_ack.data);
break;
case header.eReq_Extract:
notify_result = etherealizer.ExtractToEtheria(header, &msg_ack.header, &msg_ack.data);
break;
case header.eReq_Combine:
notify_result = etherealizer.CombineWithEtheria(header, &msg_ack.header, &msg_ack.data);
break;
default:
success = false;
etheria_fail_handler.SetFailResult(msg_ack.header.eRet_Failed, 0, false);
break;
}
//
if (success == false) {
etheria_fail_handler.OutputLog();
}
if (notify_result != etherealizer.eResult_1toN) {
player->SendPacket(&msg_ack, msg_ack.GetSize());
}
else {
MSG_CG_ITEM_ETHERIA_CONTROL_BRD msg_brd;
msg_brd.header = msg_ack.header;
msg_brd.data = msg_ack.data;
player->SendPacketAround(&msg_brd, msg_brd.GetSize());
}
}
//_NA_000096_20100527_CHANGE_CHARACTER_APPEARANCE_SYSTEM
Handler_CG_ITEM_IMPL(CG_ITEM_CHANGE_CHARACTER_APPEARANCE_SYN) // 某腐磐 寇葛 函版 酒捞袍 荤侩 夸没阑 贸府茄促.
{
__TOUCHED((pServerSession, pMsg, wSize));
MSG_CG_ITEM_CHANGE_CHARACTER_APPEARANCE_SYN* const change_syn =
static_cast<MSG_CG_ITEM_CHANGE_CHARACTER_APPEARANCE_SYN* const>(pMsg);
// 菩哦 农扁甫 八荤茄促.
if (sizeof(*change_syn) != wSize)
{
assert(sizeof(*change_syn) != wSize);
return;
}
// 敲饭捞绢甫 八荤茄促.
const PlayerManager* const player_manager = PlayerManager::Instance();
Player* const player = player_manager->FindPlayerByUserKey(change_syn->m_dwKey);
{
if (player == NULL)
{
return;
}
if (player->GetField() == NULL)
{
return;
}
}
// 某腐磐 寇葛 函版 酒捞袍阑 荤侩茄促.
ItemManager* const item_manager = player->GetItemManager();
const RC::eITEM_RESULT use_result =
item_manager->GetItemFunctionCustomization().UseChangeCharacterAppearanceItem(\
change_syn->item_position_, change_syn->character_appearance_);
// 肺弊甫 扁废茄促.
const eSUN_LOG_LEVEL log_type = RC::ItemResultUtil::IsSuccess(use_result) ?
eFULL_LOG : eCRITICAL_LOG;
::MessageOut(log_type,
_T("|%s|Result:%d|PlayerObjectKey:%u|PlayerCharName:%s|"),
__FUNCTION__,
use_result,
player->GetObjectKey(),
player->GetCharName());
// 某腐磐 寇葛 函版 搬苞甫 览翠茄促.
MSG_CG_CHARINFO_CHANGE_APPEARANCE_BRD change_brd;
{
change_brd.player_key_ = player->GetObjectKey();
change_brd.result_ = RC::ItemResultUtil::EnumToValue(use_result);
change_brd.character_appearance_ = change_syn->character_appearance_;
change_brd.item_position_ = change_syn->item_position_;
player->SendPacketAround(&change_brd, change_brd.GetSize());
}
}
Handler_CG_ITEM_IMPL(CG_ITEM_COMPOSE_OR_DECOMPOSE_SYN) // 酒捞袍 钦己 肚绰 盒秦 夸没阑 贸府茄促.
{
__UNUSED(pServerSession);
ComposeOrDecomposeImplement implement;
implement.HandleComposeOrDecompose(pMsg, wSize);
}
#ifdef _20220329_ADD_EQU_RECOVERY
Handler_CG_ITEM_IMPL(CG_ITEM_EQU_RECOVERY_SYN) // 酒捞袍 钦己 肚绰 盒秦 夸没阑 贸府茄促.
{
__UNUSED(pServerSession);
ComposeOrDecomposeImplement implement;
implement.HandleEquRecovery(pMsg, wSize);
}
#endif
// 己傍茄 钦己 肚绰 盒秦 郴开 夸没阑 贸府茄促.
Handler_CG_ITEM_IMPL(CG_ITEM_GET_COMPOSITION_OR_DECOMPOSITION_HISTORIES_SYN)
{
__UNUSED(pServerSession);
#ifdef _CN_000000_20130729_COMPOSE_OR_DECOMPOSE_HISTORY_BLOCK
#else
ComposeOrDecomposeImplement implement;
implement.HandleGetHistories(pMsg, wSize);
#endif // _CN_000000_20130729_COMPOSE_OR_DECOMPOSE_HISTORY_BLOCK
}
// 钦己 肚绰 盒秦 郴开 荐沥 夸没阑 贸府茄促.
Handler_CG_ITEM_IMPL(CG_ITEM_MODIFY_COMPOSITION_OR_DECOMPOSITION_HISTORIES_CMD)
{
__UNUSED(pServerSession);
ComposeOrDecomposeImplement implement;
implement.HandleModifyHistories(pMsg, wSize);
}
//_NA_000251_20100727_SOCKET_SYSTEM
Handler_CG_ITEM_IMPL(CG_ITEM_IDENTIFY_SOCKET_CMD) // 酒捞袍 家南 犬牢 夸没阑 贸府茄促.
{
__UNUSED(pServerSession);
SocketSystemImplement implement;
implement.HandleIdentifySocketMessage(pMsg, wSize);
}
Handler_CG_ITEM_IMPL(CG_ITEM_RECREATE_SOCKET_SYN) // 家南 促矫 积己 夸没阑 贸府茄促.
{
__UNUSED(pServerSession);
SocketSystemImplement impl;
impl.HandleRecreateSocket(pMsg, wSize);
}
#ifdef _NA_0_20110613_GAME_SHOP_RENEWAL
Handler_CG_ITEM_IMPL(CG_ITEM_USE_EXTEND_DATE_SYN)
{
__TOUCHED((pServerSession, pMsg, wSize));
UseExtendDateItemImplement implement;
implement.Implement((MSG_CG_ITEM_USE_EXTEND_DATE_SYN *)pMsg);
}
#endif
// _NA_003740_20111122_RANDOM_ITEM
Handler_CG_ITEM_IMPL(CG_ITEM_RANDOMIZE_SYN)
{
__UNUSED(pServerSession);
#ifdef _NA_003740_20111122_RANDOM_ITEM
using namespace util::internal;
const MSG_CG_ITEM_RANDOMIZE_SYN* request(NULL);
Player* requester(NULL);
if (CheckRequestMessage(pMsg, wSize, request, requester) == false)
{
return;
}
struct ErrorSender
{
explicit ErrorSender(Player& requester) : requester_(requester), result(RC::RC_ITEM_SUCCESS)
{
}
~ErrorSender()
{
if (result != RC::RC_ITEM_SUCCESS)
{
MSG_CG_ITEM_USE_NAK response;
response.m_ErrorCode = static_cast<BYTE>(result);
requester_.SendPacket(&response, sizeof(response));
}
}
int result;
private:
Player& requester_;
};
ErrorSender error_sender(*requester);
if (CheckRequesterState(requester, __FUNCTION__, error_sender.result) == false)
{
return;
}
ItemManager* const item_manager = requester->GetItemManager();
SCItemSlotContainer* const inventory = item_manager->GetItemSlotContainer(SI_INVENTORY);
const RandomItemParser* const parser = RandomItemParser::Instance();
SCItemSlot* request_item(NULL);
SCItemSlot* target_item(NULL);
if (parser->EnableItemRandomize(
*inventory,
request->request_item_pos,
request->target_item_pos,
request_item, target_item) == false)
{
SUNLOG(
eCRITICAL_LOG,
_T("|%s|酒捞袍阑 荤侩茄 罚待拳啊 阂啊瓷 钦聪促.|RequestItemPos = %d, TargetItemPos = %d, 某腐磐捞抚 = %s|"),
__FUNCTION__,
request->request_item_pos,
request->target_item_pos,
requester->GetCharName()
);
error_sender.result = RC::RC_ITEM_INVALID_VALUE;
return;
}
const RandomValueTypeGrade::Value type_grade =
static_cast<RandomValueTypeGrade::Value>(request_item->GetItemInfo()->m_wSubType);
if (target_item->Randomize(type_grade) == false)
{
SUNLOG(
eCRITICAL_LOG,
_T("|%s|酒捞袍 罚待拳俊 角菩 沁嚼聪促.|ItemCode = %d, 某腐磐捞抚 = %s|"),
__FUNCTION__,
target_item->GetItemInfo()->m_Code,
requester->GetCharName()
);
error_sender.result = RC::RC_ITEM_INVALID_VALUE;
return;
}
item_manager->SendItemChange(*target_item);
// 肺弊甫 扁废茄促.
{
TCHAR add_info[MAX_ADDINFO_SIZE] = { 0 };
target_item->RandomOptionToString<_countof(add_info)>(type_grade, add_info);
GAMELOG->LogItem(ITEM_RANDOMIZE_OPTION, requester, target_item, 0, 1, NULL, NULL, add_info);
}
const RC::eITEM_RESULT using_result = item_manager->UseItemByType(
eITEMTYPE_RANDOMIZE_ITEM, SI_INVENTORY, request->request_item_pos, true, __FUNCTION__);
if (using_result != RC::RC_ITEM_SUCCESS)
{
SUNLOG(
eCRITICAL_LOG,
_T("|%s|罚待拳 酒捞袍 荤侩俊 角菩 沁嚼聪促.|UsingResult = %d, ItemCode = %d, 某腐磐捞抚 = %s|"),
__FUNCTION__,
using_result,
request_item->GetItemInfo()->m_Code,
requester->GetCharName()
);
error_sender.result = using_result;
return;
}
MSG_CG_ITEM_RANDOMIZE_ACK response;
response.Init();
response.request_item_pos = request->request_item_pos;
response.target_item_pos = request->target_item_pos;
requester->SendPacket(&response, response.GetSize());
#endif // _NA_003740_20111122_RANDOM_ITEM
}
#ifdef _NA_008124_20150313_AWAKENING_SYSTEM
Handler_CG_ITEM_IMPL( CG_ITEM_AWAKENING_SYN )
{
__TOUCHED((pServerSession, pMsg, wSize));
MSG_CG_ITEM_AWAKENING_SYN * pRecvMsg = (MSG_CG_ITEM_AWAKENING_SYN *)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey );
ASSERT( pPlayer );
if( !pPlayer ) return ;
if( !pPlayer->GetField() )
{
return;
}
MSG_CG_ITEM_AWAKENING_ACK msg;
if (!CheckProcessInventoryLock(pPlayer, CG_ITEM_AWAKENING_SYN))
{
return;
}
msg.result_code = pPlayer->GetItemManager()->GetItemFunctionAwakening().Awakening(
pRecvMsg->equip_item_pos, pRecvMsg->material_item_pos, pRecvMsg->additive_item_pos);
pPlayer->SendPacket(&msg,sizeof(msg));
}
Handler_CG_ITEM_IMPL( CG_ITEM_EVOLUTION_SYN )
{
__TOUCHED((pServerSession, pMsg, wSize));
MSG_CG_ITEM_EVOLUTION_SYN * pRecvMsg = (MSG_CG_ITEM_EVOLUTION_SYN *)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayerByUserKey( pRecvMsg->m_dwKey );
ASSERT( pPlayer );
if( !pPlayer ) return ;
if( !pPlayer->GetField() )
{
return;
}
MSG_CG_ITEM_EVOLUTION_ACK msg;
if (!CheckProcessInventoryLock(pPlayer, CG_ITEM_EVOLUTION_SYN))
{
return;
}
msg.result_code = pPlayer->GetItemManager()->GetItemFunctionEvolution().Evolution(
pRecvMsg->equip_item_pos, pRecvMsg->additive_item_pos);
pPlayer->SendPacket(&msg, sizeof(msg));
}
#endif // _NA_008124_20150313_AWAKENING_SYSTEM
#ifdef _NA_008069_20150210_ADD_SPA_SYSTEM
Handler_CG_ITEM_IMPL( CG_ITEM_SPA_COSTUME_CHANGE_SYN )
{
__TOUCHED((pServerSession, pMsg, wSize));
MSG_CG_ITEM_SPA_COSTUME_CHANGE_SYN* syn_msg = static_cast<MSG_CG_ITEM_SPA_COSTUME_CHANGE_SYN*>(pMsg);
Player * player = PlayerManager::Instance()->FindPlayerByUserKey( syn_msg->m_dwKey );
ASSERT( player );
if( !player ) return ;
if( !player->GetField() )
{
return;
}
if (!CheckProcessInventoryLock(player, CG_ITEM_SPA_COSTUME_CHANGE_SYN)) {
return;
}
RC::eITEM_RESULT result =
player->GetPlayerSpaInfo()->SetSpaInfo(syn_msg->slotcontainer_type, syn_msg->item_pos);
if (result == RC::RC_ITEM_SUCCESS)
{
MSG_CG_ITEM_SPA_COSTUME_CHANGE_BRD brd_msg;
brd_msg.spa_ticket_code = player->GetPlayerSpaInfo()->GetSpaTicketCode();
brd_msg.player_object_key = player->GetObjectKey();
player->SendPacketAround(&brd_msg, sizeof(brd_msg));
}
else
{
MSG_CG_ITEM_SPA_COSTUME_CHANGE_NAK nak_msg;
nak_msg.error_code = result;
player->SendPacket(&nak_msg, sizeof(nak_msg));
}
}
#endif //_NA_008069_20150210_ADD_SPA_SYSTEM