//------------------------------------------------------------------------------ // // (C) 2005 y2jinc //------------------------------------------------------------------------------ #include "SunClientPrecompiledHeader.h" #include "itemmanager.h" #include #include #include #include "QuickSlot.h" #include "StyleSlot.h" #include "MouseHandler.h" #include "EquipmentContainer.h" #include #include #include "Hero.h" #include "InventoryDialog.h" #include "ShopDialog.h" #include "InterfaceManager.h" #include "Item.h" #include "ObjectManager.h" #ifdef _NA_003923_20120130_GUILD_RENEWAL_MOD_WAREHOUSE_SLOT_NUM #include "uiGuildMan/uiGuildMan_def.h" #include "GuildSystem/uiGuildWareHouse.h" #include "uiBankMan/uiBankDef.h" #include "uiBankMan/uiBankDialog.h" #else #include "uiGuildWareHouse/uiGuildWareHouse.h" #include "BankDialog.h" #endif //_NA_003923_20120130_GUILD_RENEWAL_MOD_WAREHOUSE_SLOT_NUM #include "EquipmentContainer.h" #include "DummySlotContainer.h" #include "DummyItemSlot.h" #include "ItemCompositeParser.h" #include #include "ChatDialog.h" #include "StyleContainer.h" #include "SkillInfoParser.h" #include "StyleInfoParser.h" #include "ShopInfoParser.h" #include "HeroActionInput.h" #include "uiTrade/uiTrade.h" #include "SCSkillSlot.h" #include "QuickContainer.h" #include "SlotKeyGenerator.h" #include "ItemFormula.h" #include "PlayerAttributes.h" #include "SoundEffect.h" #include "ItemSoundInfoParser.h" #include "EventInventoryDialog.h" #ifdef __NA_001358_ENCHANT_UNIFICATION #else //__NA_001358_ENCHANT_UNIFICATION #include "EnchantDialog2.h" #endif //__NA_001358_ENCHANT_UNIFICATION #include "ItemAttrCalculator.h" #include "Application.h" #include "uiHelpMan/uiHelpMan.h" //#include "uiItemComposite/uiItemComposite.h" #include "ItemETCCompositeDlg.h" #include "uiitemtotalcomposite/uiItemTotalComposite.h" #include "CompetitionScene.h" #include "globalfunc.h" #include "uiSystemMan/uiSystemMan.h" #include "uiQuestMan/uiQuestMan.h" #include "HeroActionInput.h" #include "uiCashItemShopExtensionBuy/uiCashItemShopExtensionBuy.h" #include "LotteryInventoryDialog.h" #include "uiSkillMan/uiNewSkillMan.h" #include "RiderInventoryDialog.h" #include "uiTradeMan/uiTradeMan_def.h" #include "uiVendorMan/uiVendorMan_def.h" #include "ItemTypeList.h" #include "uiCharacterStatusMan/uiCharacterStatusMan.h" #include "uiCharaterAccumulatePointDialog/uiCharaterAccumulatePointDialog.h" #include "uiDominationTowerMan/uiDominationTowerMan.h" #ifdef _YMS_AUTOBOT_GAME #include "Autobot/Autobot.h" #include "Interface/uiAutobot/uiAutobotPlay.h" #include "Interface/uiAutobot/uiAutobotConditionBattle.h" #endif //_YMS_AUTOBOT_GAME #include "uiItemCompositeMan/uiItemCompositeMan.h" #include "uiItemCube.h" #include "uiSkillMan/uiNewSkillMan.h" #include "uiPerkDialog/uiPerkDialog.h" #ifdef _NA_20101011_HEIM_LOTTO_CASH_TICKET #include "uiLottoMan/uiLottoMan.h" #include "uiLottoNumInput/uiLottoNumInput.h" #endif//_NA_20101011_HEIM_LOTTO_CASH_TICKET #include "uiSocketMan/uiSocketMan.h" #include "uiSocketComposite/uiSocketComposite.h" #include "uiAreaConquestMan/uiAreaConquestMan.h" #include "PacketRequestManager.h" #include "uiGuideSystemMan/uiGuideSystemMan.h" #include "TotalGuideParser.h" #ifdef _NA_002935_20110704_ITEM_SCORE #include "HeroEquipmentContainer.h" #endif //_NA_002935_20110704_ITEM_SCORE #ifdef _NA_003033_20110831_DICECAST_ITEM_ROUTING #include "uiPartyMan/uiPartyMan.h" #include "AppearanceManager.h" #include "DiceCastManager.h" #endif //_NA_003033_20110831_DICECAST_ITEM_ROUTING #ifdef _NA004034_20120102_POINT_WALLET_SYSTEM #include "CurrencyInfoParser.h" #endif //_NA004034_20120102_POINT_WALLET_SYSTEM #ifdef _NA_000000_20140120_SMART_NPC_SYSTEM #include "uiSmartNpcDialogMan/uiSmartNpcDialogReply.h" #endif //_NA_000000_20140120_SMART_NPC_SYSTEM #ifdef _NA_008121_20150311_EQUIPMENT_AWAKENING_SYSTEM #include "uiEquipmentAwakeningMan/uiEquipmentAwakeningMan.h" #include "uiEquipmentAwakeningMan/uiEquipmentAwakeningDialog.h" #endif // _NA_008121_20150311_EQUIPMENT_AWAKENING_SYSTEM #ifdef _NA_008121_20150318_EQUIPMENT_EVOLUTION_SYSTEM #include "uiEquipmentEvolutionMan/uiEquipmentEvolutionMan.h" #include "uiEquipmentEvolutionMan/uiEquipmentEvolutionDialog.h" #endif // _NA_008121_20150318_EQUIPMENT_EVOLUTION_SYSTEM #ifdef _NA_008679_20160202_REWORK_BATTLEGROUND #include "ChaosSystem/ChaosSystemData.h" #endif //_NA_008679_20160202_REWORK_BATTLEGROUND #define MODFLOAT(ratio) ((ratio)<0 ? (-0.5f):(0.5f)) //(???&?????? ????,????? ????????(??©ª?????)) MSG_CG_ITEM_SELL_SYN g_ItemSellSyn; using namespace RC; BOOL IsEnablePickupDistance(WzVector &vItemPos) { WzVector wzVec1 = vItemPos - g_pHero->GetPosition(); float fLength = VectorLength(&wzVec1); if (fLength <= DISTANCE_SPACE_GET_ITEM) { return TRUE; } return FALSE; } // eATTR_AUTO_ITEM_PICK_UP ?? ???? 1~99 ??? ??????? [11/10/2010 iforall] // eATTR_AUTO_ITEM_PICK_UP ?? ???? 100~ ??? ????????? // ???????? ???????¥è? ?????? 100????? ???? ??? ?????????? ???????. // ????????? 100????? ?????? ?????? ?????? // ?????????(??:1) ?? ??????/???? ?????? ?????? ??©ª??? 1????? ???? ?? ?? ???, // ??? ?¬Ü???? ????? ??????????? ???? 100???? ????. BOOL IsAutoPickupMoney(WzVector& vItemPos) { if (g_pHero == NULL) { return FALSE; } if (IsEnablePickupDistance(vItemPos) == FALSE) { return FALSE; } if (g_pHero->GetPlayerAttribute()->GetAutoPickup() > 0) { g_pHero->SetPetEmotion(E_AUTO_PICK_ITEM); return TRUE; } return FALSE; } BOOL IsAutoPickupItem(WzVector& vItemPos) { if (g_pHero == NULL) { return FALSE; } if (IsEnablePickupDistance(vItemPos) == FALSE) { return FALSE; } if (g_pHero->GetPlayerAttribute()->GetAutoPickup() >= 100) { g_pHero->SetPetEmotion(E_AUTO_PICK_ITEM); return TRUE; } return FALSE; } ItemManager::ItemManager() { } ItemManager::~ItemManager() { assert(0 == m_UpdateItemSlotMap.size()); m_UpdateItemSlotMap.clear(); update_owner_list_.clear(); } BOOL ItemManager::Init() { return TRUE; } VOID ItemManager::Release() { } VOID ItemManager::Update() { } SCItemSlot* ItemManager::GetInventoryItem( POSTYPE slot_index ) { if( slot_index == INVALID_SLOT_POS ) { return NULL; } if( SCSlotContainer* container = GetContainer( SI_INVENTORY ) ) { return (SCItemSlot*)(&container->GetSlot(slot_index)); } return NULL; } SCSlotContainer* ItemManager::GetContainer( SLOTIDX ContainerIndex ) { SCSlotContainer * pAtContainer = NULL; if ( !g_pHero ) { return NULL; } switch (ContainerIndex) { case SI_VENDOR_SELL: { pAtContainer = GET_DIALOG(IM_VENDOR_MANAGER::VENDOR_SELL)->GetSlotContainer(); } break; case SI_INVENTORY: { InventoryDialog * pDlg = GET_CAST_DIALOG( InventoryDialog, IM_INVENTORY_MANAGER::INVEN_DLG ); pAtContainer = static_cast(pDlg); } break; case SI_EQUIPMENT: { pAtContainer = g_pHero->GetSlotContainer(SI_EQUIPMENT); } break; case SI_SKILL: { pAtContainer = g_InterfaceManager.GetUISkillSlotContainer(); } break; case SI_WAREHOUSE: { #ifdef _NA_003923_20120130_GUILD_RENEWAL_MOD_WAREHOUSE_SLOT_NUM uiBankDialog *pBankDlg = GET_CAST_DIALOG(uiBankDialog, IM_BANK_MANAGER::BANK_DIALOG); #else BankDialog *pBankDlg = GET_CAST_DIALOG(BankDialog, IM_BANK_MANAGER::BANK_DIALOG); #endif //_NA_003923_20120130_GUILD_RENEWAL_MOD_WAREHOUSE_SLOT_NUM pAtContainer = static_cast(pBankDlg); } break; case SI_NPCSTORE: { ShopDialog * pDlg = static_cast( g_InterfaceManager.GetDialog( InterfaceManager::DIALOG_SHOP ) ); pAtContainer = static_cast(pDlg); } break; case SI_QUICK: { pAtContainer = g_pHero->GetSlotContainer(SI_QUICK); } break; case SI_TRADE: { pAtContainer = GET_DIALOG( IM_TRADE_MANAGER::TRADE )->GetSlotContainer(); } break; case SI_ENCHANT: { #ifdef __NA_001358_ENCHANT_UNIFICATION // no operation #else //__NA_001358_ENCHANT_UNIFICATION EnchantDialog * pDlg = (EnchantDialog *)g_InterfaceManager.GetDialog( InterfaceManager::DIALOG_ENCHANT ); pAtContainer = pDlg->GetEnchantContainer(); #endif //__NA_001358_ENCHANT_UNIFICATION } break; #ifdef _NA_003966_20111227_ADD_ENCHANT case SI_ENCHANT_OPTION: { EnchantDialog * pDlg = (EnchantDialog *)g_InterfaceManager.GetDialog( InterfaceManager::DIALOG_ENCHANT ); pAtContainer = pDlg->GetEnchantOptionItemContainer(); } break; #endif // _NA_003966_20111227_ADD_ENCHANT case SI_EXTENSION: { #ifdef _NA_0_20110613_GAME_SHOP_RENEWAL //! ?????? ?????????? ???? ??? #else uiCashItemShopExtensionBuy * pDlg = (uiCashItemShopExtensionBuy *)g_InterfaceManager.GetDialog( InterfaceManager::DIALOG_CASH_ITEM_SHOP_EXTENSION_BUY ); pAtContainer = static_cast(pDlg); #endif //#ifdef _NA_0_20110613_GAME_SHOP_RENEWAL } break; case SI_STYLE: { StyleContainer * pDlg = (StyleContainer *)g_InterfaceManager.GetDialog( InterfaceManager::DIALOG_STYLE_CONTAINER ); pAtContainer = static_cast(pDlg); } break; case SI_EVENT_INVENTORY: { EventInventoryDialog * pDlg = GET_CAST_DIALOG( EventInventoryDialog, IM_INVENTORY_MANAGER::EVENTINVEN_DLG ); pAtContainer = static_cast(pDlg); } break; case SI_ITEM_COMPOSE: { } break; case SI_ITEM_ETC_COMPOSE: { ItemETCCompositeDlg * pDlg = (ItemETCCompositeDlg *)g_InterfaceManager.GetDialog( InterfaceManager::DIALOG_ITEM_ETC_COMPOSE ); pAtContainer = static_cast(pDlg); } break; case SI_GUILDWAREHOUSE: { #ifdef _NA_003923_20120217_GUILD_RENEWAL_UI_GUILD_MANAGER DWORD dialog_id = uiGuildWareHouse::kDialog_ID; #else DWORD dialog_id = IM_GUILD_MANAGER::GUILD_WAREHOUSE; #endif //_NA_003923_20120217_GUILD_RENEWAL_UI_GUILD_MANAGER uiGuildWareHouse * pDlg = GET_CAST_DIALOG(uiGuildWareHouse, dialog_id); pAtContainer = static_cast(pDlg); } break; case SI_LOTTERY: { LotteryInventoryDialog* pDlg = GET_CAST_DIALOG( LotteryInventoryDialog, IM_INVENTORY_MANAGER::LOTTERYINVEN_DLG ); pAtContainer = pDlg->GetSlotContainer(); } break; case SI_RIDER: { RiderInventoryDialog *pDlg = GET_CAST_DIALOG( RiderInventoryDialog, IM_INVENTORY_MANAGER::RIDERINVEN_DLG ); pAtContainer = pDlg->GetSlotContainer(); } break; #ifdef _YMS_AUTOBOT_GAME case SI_AUTOMATIC_INFO: { uiAutobotConditionBattle* dialog = GET_CAST_DIALOG(uiAutobotConditionBattle, uiAutobotConditionBattle::kDialog_ID); if (dialog) { pAtContainer = dialog->GetSlotContainer(); } } break; #endif //_YMS_AUTOBOT_GAME case SI_PERK: { uiPerkDialog* ui_prek_dialog = GET_CAST_DIALOG(uiPerkDialog, IM_SKILL_MANAGER::SKILL_PERK_DLG); if (ui_prek_dialog != NULL) { pAtContainer = static_cast(ui_prek_dialog); } } break; case SI_CUBE: { uiItemCube* dialog = GET_CAST_DIALOG(uiItemCube, IM_ITEM_COMPOSITE_MANAGER::ITEM_CUBE); if (dialog) { pAtContainer = dialog->GetSlotContainer(); } } break; case SI_SOCKET_COMPOSITE: { uiSocketComposite* dialog = GET_CAST_DIALOG(uiSocketComposite, IM_SOCKET_MANAGER::SOCKET_COMPOSITE); if (dialog) { pAtContainer = dialog->GetSlotContainer(); } } break; #ifdef _NA_000000_20140120_SMART_NPC_SYSTEM case SI_SMARTNPC: { uiSmartNpcDialogReply* dialog = GET_CAST_DIALOG(uiSmartNpcDialogReply, IM_SMARTNPCDIALOG_MANAGER::SMARTNPCDIALOG_REPLY); if (dialog) { pAtContainer = dialog->GetSlotContainer(); } } break; #endif //_NA_000000_20140120_SMART_NPC_SYSTEM #ifdef _NA_008121_20150311_EQUIPMENT_AWAKENING_SYSTEM case SI_EQUIPMENT_AWAKENING: { uiEquipmentAwakeningDialog* dialog = GET_CAST_DIALOG(uiEquipmentAwakeningDialog, IM_EQUIPMENT_AWAKENING_MANAGER::EQUIPMENT_AWAKENING_DIALOG); if (dialog) { pAtContainer = dialog->GetEquipmentWakeupContainer(); } } break; #endif // _NA_008121_20150311_EQUIPMENT_AWAKENING_SYSTEM #ifdef _NA_008121_20150318_EQUIPMENT_EVOLUTION_SYSTEM case SI_EQUIPMENT_EVOLUTION: { uiEquipmentEvolutionDialog* dialog = GET_CAST_DIALOG(uiEquipmentEvolutionDialog, IM_EQUIPMENT_EVOLUTION_MANAGER::EQUIPMENT_EVOLUTION_DIALOG); if (dialog) { pAtContainer = dialog->GetEquipmentEvolutionContainer(); } } break; #endif // _NA_008121_20150318_EQUIPMENT_EVOLUTION_SYSTEM default: pAtContainer = NULL; } return pAtContainer; } SolarDialog * ItemManager::GetItemContainerDialog(SLOTIDX ContainerIndex) { InterfaceManager::eDIALOG_ID eDialogID; switch (ContainerIndex) { case SI_VENDOR_SELL: eDialogID = InterfaceManager::DIALOG_VENDOR_SELL; break; case SI_EQUIPMENT: eDialogID = InterfaceManager::DIALOG_EQUIP; break; case SI_INVENTORY: eDialogID = InterfaceManager::DIALOG_INVENTORY; break; case SI_QUICK: eDialogID = InterfaceManager::DIALOG_QUICK; break; case SI_STYLE: eDialogID = InterfaceManager::DIALOG_STYLE_CONTAINER; break; case SI_SKILL: return g_InterfaceManager.GetUISkillCurrentDialog(); case SI_WAREHOUSE: return GET_DIALOG(IM_BANK_MANAGER::BANK_DIALOG); break; case SI_NPCSTORE: eDialogID = InterfaceManager::DIALOG_SHOP; break; case SI_ENCHANT: case SI_ENCHANT_OPTION: eDialogID = InterfaceManager::DIALOG_ENCHANT; break; case SI_EXTENSION: eDialogID = InterfaceManager::DIALOG_CASH_ITEM_SHOP_EXTENSION_BUY; break; case SI_TRADE: eDialogID = InterfaceManager::DIALOG_TRADE; break; case SI_EVENT_INVENTORY: eDialogID = InterfaceManager::DIALOG_EVENT_INVENTORY; break; case SI_ITEM_COMPOSE: eDialogID = InterfaceManager::DIALOG_ITEM_COMPOSITE; break; case SI_ITEM_ETC_COMPOSE: eDialogID = InterfaceManager::DIALOG_ITEM_ETC_COMPOSE; break; case SI_GUILDWAREHOUSE: { #ifdef _NA_003923_20120217_GUILD_RENEWAL_UI_GUILD_MANAGER DWORD dialog_id = uiGuildWareHouse::kDialog_ID; #else DWORD dialog_id = IM_GUILD_MANAGER::GUILD_WAREHOUSE; #endif //_NA_003923_20120217_GUILD_RENEWAL_UI_GUILD_MANAGER return GET_DIALOG(dialog_id); } break; case SI_LOTTERY: { return GET_CAST_DIALOG( LotteryInventoryDialog, IM_INVENTORY_MANAGER::LOTTERYINVEN_DLG ); } break; case SI_RIDER: { return GET_CAST_DIALOG( RiderInventoryDialog, IM_INVENTORY_MANAGER::RIDERINVEN_DLG ); } break; case SI_AUTOMATIC_INFO: { #ifdef _YMS_AUTOBOT_GAME return GET_CAST_DIALOG(uiAutobotConditionBattle, uiAutobotConditionBattle::kDialog_ID); #endif //_YMS_AUTOBOT_GAME } break; case SI_CUBE: { return GET_CAST_DIALOG(uiItemCube, IM_ITEM_COMPOSITE_MANAGER::ITEM_CUBE); } break; case SI_PERK: { return GET_DIALOG(IM_SKILL_MANAGER::SKILL_PERK_DLG); } break; case SI_SOCKET_COMPOSITE: { return GET_DIALOG(IM_SOCKET_MANAGER::SOCKET_COMPOSITE); } break; #ifdef _NA_000000_20140120_SMART_NPC_SYSTEM case SI_SMARTNPC: { return GET_DIALOG(IM_SMARTNPCDIALOG_MANAGER::SMARTNPCDIALOG_REPLY); } break; #endif //_NA_000000_20140120_SMART_NPC_SYSTEM #ifdef _NA_008121_20150311_EQUIPMENT_AWAKENING_SYSTEM case SI_EQUIPMENT_AWAKENING: { return GET_DIALOG(IM_EQUIPMENT_AWAKENING_MANAGER::EQUIPMENT_AWAKENING_DIALOG); } break; #endif // _NA_008121_20150311_EQUIPMENT_AWAKENING_SYSTEM #ifdef _NA_008121_20150318_EQUIPMENT_EVOLUTION_SYSTEM case SI_EQUIPMENT_EVOLUTION: { return GET_DIALOG(IM_EQUIPMENT_EVOLUTION_MANAGER::EQUIPMENT_EVOLUTION_DIALOG); } break; #endif // _NA_008121_20150318_EQUIPMENT_EVOLUTION_SYSTEM default: eDialogID = InterfaceManager::DIALOG_MAX; break; } return g_InterfaceManager.GetDialog( eDialogID ); } //============================================================================================================================= /** @remarks ?????? ????????? ?????? ???. @param [in] AtSlotIdx ??? ??????? ?¥å??? [out] POSTYPE & rPosOut ?????? ??????? */ BOOL ItemManager::GetEmptySlotPos(SLOTIDX AtSlotIdx, POSTYPE & OUT rPosOut) { SCSlotContainer * pContainer = GetContainer(AtSlotIdx); assert(pContainer); if (!pContainer) { return FALSE; } return pContainer->GetEmptyPos( rPosOut ); } //---------------------------------------------------------------------------- /** @desc ??? ???????? ?????? ??? ???? ????? ?????? ??? @param [in] rSlot : ??? ?????? ???? [out] rEqPosOut : ??? ?????? ????? ???¢¥?. */ BOOL ItemManager::GetEquipPosition(SCSlot & rSlot, POSTYPE & OUT rEqPosOut) { assert(rSlot.GetSlotType() == ST_ITEM); if (rSlot.GetSlotType() != ST_ITEM) { // return FALSE; } SCItemSlot & rItemSlot = (SCItemSlot &)rSlot; //?????????? if(!rItemSlot.IsContainValidItem()) { return FALSE; } const BASE_ITEMINFO * pItemInfo = rItemSlot.GetItemInfo(); if (!pItemInfo) { return FALSE; } switch ( pItemInfo->m_wEqPos ) { case eEQUIPCONTAINER_WEAPON: case eEQUIPCONTAINER_ARMOR: case eEQUIPCONTAINER_PROTECTOR: case eEQUIPCONTAINER_HELMET: case eEQUIPCONTAINER_PANTS: case eEQUIPCONTAINER_BOOTS: case eEQUIPCONTAINER_GLOVE: case eEQUIPCONTAINER_BELT: case eEQUIPCONTAINER_SHIRTS: case eEQUIPCONTAINER_NECKLACE: rEqPosOut = (POSTYPE)pItemInfo->m_wEqPos; break; case eEQUIPCONTAINER_SACCESSORY1: case eEQUIPCONTAINER_SACCESSORY2: case eEQUIPCONTAINER_SACCESSORY3: { SCSlotContainer *pContainer = this->GetContainer(SI_EQUIPMENT); if (!pContainer) { return FALSE; } if (pContainer->IsEmpty(eEQUIPCONTAINER_SACCESSORY1) == TRUE) { rEqPosOut = eEQUIPCONTAINER_SACCESSORY1; } else if (pContainer->IsEmpty(eEQUIPCONTAINER_SACCESSORY2) == TRUE) { rEqPosOut = eEQUIPCONTAINER_SACCESSORY2; } else // if (pContainer->IsEmpty(eEQUIPCONTAINER_SACCESSORY3)) { rEqPosOut = eEQUIPCONTAINER_SACCESSORY3; } } break; case eEQUIPCONTAINER_RING1: case eEQUIPCONTAINER_RING2: { SCSlotContainer * pContainer = this->GetContainer(SI_EQUIPMENT); if (!pContainer) { return FALSE; } if ( pContainer->IsEmpty( eEQUIPCONTAINER_RING1 ) ) { rEqPosOut = eEQUIPCONTAINER_RING1; } else if ( pContainer->IsEmpty( eEQUIPCONTAINER_RING2 ) ) { rEqPosOut = eEQUIPCONTAINER_RING2; } else { rEqPosOut = eEQUIPCONTAINER_RING1; } } break; case eEQUIPCONTAINER_CHARGE1: case eEQUIPCONTAINER_CHARGE2: case eEQUIPCONTAINER_CHARGE3: case eEQUIPCONTAINER_CHARGE4: case eEQUIPCONTAINER_CHARGE5: { int iExtraChargeItemSlot = 0; if( g_pHero && g_pHero->GetCharInfo() ) { iExtraChargeItemSlot = g_pHero->GetCharInfo()->m_ExtraEquipCashSlotCount; } SCSlotContainer * pContainer = this->GetContainer(SI_EQUIPMENT); if (!pContainer) { return FALSE; } if ( pContainer->IsEmpty( eEQUIPCONTAINER_CHARGE1 ) ) { rEqPosOut = eEQUIPCONTAINER_CHARGE1; } else if ( pContainer->IsEmpty( eEQUIPCONTAINER_CHARGE2 ) ) { rEqPosOut = eEQUIPCONTAINER_CHARGE2; } else if ( pContainer->IsEmpty( eEQUIPCONTAINER_CHARGE3 ) ) { rEqPosOut = eEQUIPCONTAINER_CHARGE3; } else if( iExtraChargeItemSlot == 2) { if( pContainer->IsEmpty( eEQUIPCONTAINER_CHARGE4) ) { rEqPosOut = eEQUIPCONTAINER_CHARGE4; } else if ( pContainer->IsEmpty( eEQUIPCONTAINER_CHARGE5) ) { rEqPosOut = eEQUIPCONTAINER_CHARGE5; } else { rEqPosOut = eEQUIPCONTAINER_CHARGE1; } } else { rEqPosOut = eEQUIPCONTAINER_CHARGE1; } } break; case eEQUIPCONTAINER_PC_ROOM1: case eEQUIPCONTAINER_PC_ROOM2: case eEQUIPCONTAINER_PC_ROOM3: { SCSlotContainer * pContainer = this->GetContainer(SI_EQUIPMENT); if (!pContainer) { return FALSE; } bool bAvaliblePcRoomItem = pContainer && g_pHero && g_pHero->GetPCBangMode(); if( bAvaliblePcRoomItem ) { if( pContainer->IsEmpty(eEQUIPCONTAINER_PC_ROOM1)) { rEqPosOut = eEQUIPCONTAINER_PC_ROOM1; } else if( pContainer->IsEmpty(eEQUIPCONTAINER_PC_ROOM2)) { rEqPosOut = eEQUIPCONTAINER_PC_ROOM2; } else if( pContainer->IsEmpty(eEQUIPCONTAINER_PC_ROOM3)) { rEqPosOut = eEQUIPCONTAINER_PC_ROOM3; } else { rEqPosOut = eEQUIPCONTAINER_PC_ROOM1; } } else { return FALSE; } } break; default: { assert(!"???? ???????? ???!!"); return FALSE; } break; } return TRUE; } //------------------------------------------------------------------------------------------- /** ???? ??????? Name String ID?? ???¢¥?. */ DWORD ItemManager::GetCompositeNameID(eITEMCOMPOSITECODE eCode) { DWORD dwStrID = 0; switch ( eCode ) { case eITEMCOMPOSITE_LOW_ENCHANT: case eITEMCOMPOSITE_MEDIUM_ENCHANT: case eITEMCOMPOSITE_HIGH_ENCHANT: dwStrID = 744; break; case eITEMCOMPOSITE_RANK_UP: dwStrID = 763; break; case eITEMCOMPOSITE_RANK_DOWN: dwStrID = 864; break; case eITEMCOMPOSITE_EXTRACT_SOCKET: dwStrID = 9528; break; case eITEMCOMPOSITE_ADD_SOCKET: dwStrID = 9523; break; case eITEMCOMPOSITE_LOW_RING: dwStrID = 9504; break; case eITEMCOMPOSITE_HIGH_RING: dwStrID = 9506; break; case eITEMCOMPOSITE_LOW_NECKLACE: dwStrID = 9505; break; case eITEMCOMPOSITE_HIGH_NECKLACE: dwStrID = 9507; break; case eITEMCOPOSITE_PROTECTION_CRYSTAL: dwStrID = 9502; break; case eITEMCOPOSITE_SHANING_CRYSTAL: dwStrID = 9503; break; case eITEMCOPOSITE_SOUL_SHEILD_LOW: dwStrID = 9517; break; case eITEMCOPOSITE_SOUL_SHEILD_HIGH: dwStrID = 9508; break; case eITEMCOPOSITE_SOUL_ARMLET_LOW: dwStrID = 9520; break; case eITEMCOPOSITE_SOUL_ARMLET_HIGH: dwStrID = 9516; break; case eITEMCOPOSITE_SOUL_WING_LOW: dwStrID = 9518; break; case eITEMCOPOSITE_SOUL_WING_HIGH: dwStrID = 9509; break; case eITEMCOPOSITE_SOUL_EYE_LOW: dwStrID = 9519; break; case eITEMCOPOSITE_SOUL_EYE_HIGH: dwStrID = 9510; break; case eITEMCOPOSITE_EXTRASTONE_CREATE: dwStrID = 9511; break; case eITEMCOPOSITE_CRYSTALIZE: dwStrID = 9500; break; case eITEMCOPOSITE_ZARD: dwStrID = 3412; break; case eITEMCOMPOSITE_HEIM_ENCHANT: dwStrID = 719; break; case eITEMCOMPOSITE_CASH_ENCHANT: dwStrID = 720; break; #ifdef _NA_008121_20150311_EQUIPMENT_AWAKENING_SYSTEM case eITEMCOMPOSITE_EQUIPMENT_WAKEUP: dwStrID = 4000; break; #endif // _NA_008121_20150311_EQUIPMENT_AWAKENING_SYSTEM #ifdef _NA_008121_20150318_EQUIPMENT_EVOLUTION_SYSTEM case eITEMCOMPOSITE_EQUIPMENT_EVOLUTION: dwStrID = 3999; break; #endif // _NA_008121_20150318_EQUIPMENT_EVOLUTION_SYSTEM case eITEMCOMPOSITE_NONE: break; } return dwStrID; } //------------------------------------------------------------------------------------------- /** ?????? ?????????? */ WORD ItemManager::GetItemCount(SLOTIDX AtSlotIdx, CODETYPE ItemCode) { WORD item_count = 0; SCSlotContainer* slot_container = GetContainer(AtSlotIdx); if (slot_container == NULL) { return item_count; } POSTYPE max_slot = slot_container->GetMaxSlotNum(); for (POSTYPE slot_index = 0; slot_index < max_slot; ++slot_index) { if (slot_container->ValidPos(slot_index) == false) { continue; } SCSlot& slot_ref = slot_container->GetSlot(slot_index); if (slot_ref.GetCode() == ItemCode) { item_count += slot_ref.GetNum(); } } return item_count; } //------------------------------------------------------------------------------ WORD ItemManager::GetItemCount(SLOTIDX AtSlotIdx, eITEMTYPE item_type, eWASTETYPE waste_type) { SCSlotContainer* slot_container = GetContainer(AtSlotIdx); if (slot_container == NULL) { return 0; } WORD item_count = 0; for (int i = 0; i < slot_container->GetMaxSlotNum(); ++i) { if ((slot_container->IsEmpty(i) == TRUE) || (slot_container->GetSlot(i).GetSlotType() != ST_ITEM)) { continue; } SCItemSlot& item_slot = (SCItemSlot&)(slot_container->GetSlot(i)); const BASE_ITEMINFO* item_info = item_slot.GetItemInfo(); if (item_info != NULL) { if ((item_info->m_wType == item_type) && (item_info->m_byWasteType == waste_type)) { item_count += item_slot.GetNum(); } } } return item_count; } //---------------------------------------------------------------------------- /** ???? ????????? ?????? ???????? ??. */ BOOL ItemManager::IsEmptySlotPos(SLOTIDX AtSlotIdx, POSTYPE Pos) { SCSlotContainer * pContainer = GetContainer(AtSlotIdx); assert(pContainer); if (!pContainer) { return FALSE; } return BOOL( pContainer->IsEmpty(Pos) ); } //---------------------------------------------------------------------------- /** */ DWORD ItemManager::GetItemSound(eSLOT_SOUND_TYPE eSoundType, SCItemSlot * pItemSlot) { if ( !pItemSlot ) { return DWORD(-1); } const BASE_ITEMINFO * pItemInfo = pItemSlot->GetItemInfo(); if ( !pItemInfo ) { return DWORD(-1); } BASE_ItemSoundInfo * pSoundInfo = ItemSoundInfoParser::Instance()->GetItemSoundInfo( pItemInfo->m_nSoundIndex ); if ( !pSoundInfo ) { return DWORD(-1); } switch (eSoundType) { case eSLOT_SOUND_TYPE_PICK: return pSoundInfo->m_dw_PickDefault; break; case eSLOT_SOUND_TYPE_PUT: return pSoundInfo->m_dw_PutDefault; break; case eSLOT_SOUND_TYPE_EQUIP: return pSoundInfo->m_dw_PutWear; break; case eSLOT_SOUND_TYPE_UNEQUIP: return pSoundInfo->m_dw_RemoveWear; break; case eSLOT_SOUND_TYPE_LINK: return pSoundInfo->m_dw_LinkQslot; break; case eSLOT_SOUND_TYPE_UNLINK: return pSoundInfo->m_dw_UnlinkQslot; break; case eSLOT_SOUND_TYPE_DUMP: return pSoundInfo->m_dw_Dump; break; default: return DWORD(-1); break; } } //---------------------------------------------------------------------------- /** */ DWORD ItemManager::GetSkillSound(eSLOT_SOUND_TYPE eSoundType, SCSkillSlot * pSkillSlot) { if ( !pSkillSlot ) { return DWORD(-1); } switch (eSoundType) { case eSLOT_SOUND_TYPE_PICK: return UI_SOUND_SKILL_ICON_PICK; break; case eSLOT_SOUND_TYPE_PUT: return UI_SOUND_SKILL_ICON_DROP; break; case eSLOT_SOUND_TYPE_EQUIP: case eSLOT_SOUND_TYPE_UNEQUIP: case eSLOT_SOUND_TYPE_LINK: return UI_SOUND_SKILL_ICON_DROP; break; case eSLOT_SOUND_TYPE_UNLINK: case eSLOT_SOUND_TYPE_DUMP: default: return DWORD(-1); break; } } //---------------------------------------------------------------------------- /** */ VOID ItemManager::PlaySlotSound( eSLOT_SOUND_TYPE eSoundType, SCSlot * pSlot ) { if ( !pSlot ) { return; } DWORD dwSoundID = 0; eSlotType SlotType = pSlot->GetSlotType(); switch (SlotType) { case ST_ITEM: { dwSoundID = GetItemSound(eSoundType, (SCItemSlot *)pSlot); } break; case ST_SKILL: { dwSoundID = GetSkillSound(eSoundType, (SCSkillSlot *)pSlot); } break; case ST_STYLE_QUICK: { dwSoundID = GetSkillSound(eSoundType, (SCSkillSlot*)(0xFFFFFFFF)); } break; case ST_QUICK: { QuickSlot * pQuickSlot = (QuickSlot *)pSlot; switch ( pQuickSlot->GetOrgSlotType() ) { case ST_ITEM: { dwSoundID = GetItemSound(eSoundType, (SCItemSlot *)pQuickSlot->GetOrgSlot()); } break; case ST_SKILL: { dwSoundID = GetSkillSound(eSoundType, (SCSkillSlot *)pQuickSlot->GetOrgSlot()); } break; } } break; case ST_DUMMY_ITEM: { DummyItemSlot * pDummySlot = (DummyItemSlot *)pSlot; SCItemSlot * pItemSlot = (SCItemSlot *)pDummySlot->GetOrgSlot(); if ( !pItemSlot ) { dwSoundID = DWORD(-1); } else { dwSoundID = GetItemSound(eSoundType, pItemSlot); } } break; default: break; } g_SoundEffect.PlayUI( dwSoundID ); } //---------------------------------------------------------------------------- /** */ CODETYPE ItemManager::InsertInventoryTotalInfo( eINSERTTOTALTYPE eType, INVENTORY_TOTAL_INFO & rTotalInfo) { CODETYPE itemcode = 0; SCSlotContainer *pContainer = GetContainer(SI_INVENTORY); SUN_ASSERT(pContainer); if (!pContainer) { return itemcode; } // // total info set ITEMSLOTEX * pSlot = rTotalInfo.m_Slot; POSTYPE start = 0; POSTYPE total = rTotalInfo.m_InvenCount; SCItemSlot ItemBuf; TCHAR szText[INTERFACE_STRING_LENGTH], szMessage[INTERFACE_STRING_LENGTH]; TCHAR szItemName[MAX_PATH]; const BASE_ITEMINFO * pBaseItemInfo = NULL; InventoryDialog * pInvenDlg = GET_CAST_DIALOG( InventoryDialog, IM_INVENTORY_MANAGER::INVEN_DLG ); SUN_ASSERT(pInvenDlg); // ?????? ???????? ?????? ?????? ??? Insert ???. for(POSTYPE i=start;iIsEmpty(pSlot[i].m_Pos)) { pContainer->InsertSlot(pSlot[i].m_Pos, ItemBuf); } else { if(pInvenDlg) pInvenDlg->SetUpdateQuest(false); pContainer->DeleteSlot(pSlot[i].m_Pos, NULL); if(pInvenDlg) pInvenDlg->SetUpdateQuest(true); pContainer->InsertSlot(pSlot[i].m_Pos, ItemBuf); } pBaseItemInfo = ItemBuf.GetItemInfo(); if (pBaseItemInfo) { ZeroMemory(szItemName,sizeof(szItemName)); GameFunc::GetItemName(&ItemBuf, pBaseItemInfo, szItemName, MAX_PATH); itemcode = pBaseItemInfo->m_Code; } switch ( eType ) { case BUY: { if ( pBaseItemInfo ) { // [%s] ???????? ???? ????????. g_InterfaceManager.GetInterfaceString( eST_NAMECODE_BUY_ITEM, szText, INTERFACE_STRING_LENGTH ); _stprintf( szMessage, szText, szItemName ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage, CHAT_TYPE_SYSTEM ); } else { assert(!"?????? ?????? ?????!!"); } } break; case PICK: { if ( pBaseItemInfo ) { // [%s] ???????? ??? ??????. g_InterfaceManager.GetInterfaceString( eST_NAMECODE_GET_ITEM, szText, INTERFACE_STRING_LENGTH ); _stprintf(szMessage, szText, szItemName ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT,szMessage, CHAT_TYPE_SYSTEM); if( GAMEOPTION->GetPickUpItemNotify() ) { GameFramework::GetCurrentScene()->InserCenterTextMessage( szMessage, eType ); } uiHelpMan* helpMan = static_cast(g_InterfaceManager.GetUserInterfaceManager(UIMAN_HELP)); if (helpMan) { helpMan->CheckHelpMessage(eHK_ITEM, (SLOTCODE)pBaseItemInfo->m_Code, (BOOL)ItemBuf.IsLimited()); } uiGuideSystemMan* guide_manager = static_cast(g_InterfaceManager.GetUserInterfaceManager(UIMAN_GUIDE_SYSTEM)); if (guide_manager) { guide_manager->CheckHelpMessage(TotalGuideNotice::kGetItem, TotalGuideNotice::kItemCode, pBaseItemInfo->m_Code); guide_manager->CheckHelpMessage(TotalGuideNotice::kGetItem, TotalGuideNotice::kItemType, pBaseItemInfo->m_wType); //????? or ??????? or ??? ??? if (ItemBuf.IsDivine()) { guide_manager->CheckHelpMessage(TotalGuideNotice::kGetItem, TotalGuideNotice::kItemStatus, TotalGuideNotice::kDivine); //?????(1)/???????(2)/???(3) } else if (ItemBuf.IsEtheriaItem()) { guide_manager->CheckHelpMessage(TotalGuideNotice::kGetItem, TotalGuideNotice::kItemStatus, TotalGuideNotice::kEtheriaItem); } else if (ItemBuf.IsShellItem()) { guide_manager->CheckHelpMessage(TotalGuideNotice::kGetItem, TotalGuideNotice::kItemStatus, TotalGuideNotice::kShellItem); } //???? or ????? ??? if ((pBaseItemInfo->m_bUse == true) && // ?????? ???????? ??—©?? (Strcmp(pBaseItemInfo->m_szColor,_T("7875DF")) == 0)) // ???? ???? : 7875DF { guide_manager->CheckHelpMessage(TotalGuideNotice::kGetItem, TotalGuideNotice::kItemRareAndElite, TotalGuideNotice::kRare); // ????(1),?????(2) } else if (pBaseItemInfo->IsElite()) { guide_manager->CheckHelpMessage(TotalGuideNotice::kGetItem, TotalGuideNotice::kItemRareAndElite, TotalGuideNotice::kElite); // ????(1),?????(2) } } } else { assert(!"?????? ?????? ?????!!"); } } break; case CREATE: { if ( pBaseItemInfo ) { // [%s] ???????? ???? ????????. const int c_iCreateItem = 70270; g_InterfaceManager.GetInterfaceString( c_iCreateItem, szText, INTERFACE_STRING_LENGTH ); _stprintf(szMessage, szText, szItemName ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT,szMessage, CHAT_TYPE_SYSTEM); } else { assert(!"?????? ?????? ?????!!"); } } break; case REWARD: { if ( pBaseItemInfo ) { // [%s] ???????? ???? ???????. const int c_iRewardItem = 70271; g_InterfaceManager.GetInterfaceString( c_iRewardItem, szText, INTERFACE_STRING_LENGTH ); _stprintf(szMessage, szText, szItemName ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT,szMessage, CHAT_TYPE_SYSTEM); if( GAMEOPTION->GetPickUpItemNotify() ) { g_InterfaceManager.GetInterfaceString( c_iRewardItem, szText, INTERFACE_STRING_LENGTH ); _stprintf(szMessage, szText, szItemName ); GameFramework::GetCurrentScene()->InserCenterTextMessage( szMessage, eType); } } else { assert(!"?????? ?????? ?????!!"); } } break; case EVENT: { if ( pBaseItemInfo ) { // [%s] ???????? ???? ?¥ê??????? ???? ??????. g_InterfaceManager.GetInterfaceString( eST_REWARDITEM, szText, INTERFACE_STRING_LENGTH ); Sprintf(szMessage, szText, szItemName ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT,szMessage, CHAT_TYPE_SYSTEM); } else { assert(!"?????? ?????? ?????!!"); } } break; case QUEST_OBTAIN: { if ( pBaseItemInfo ) { // [%s] ???????? ???? ???????. const int c_iRewardItem = 70271; g_InterfaceManager.GetInterfaceString( c_iRewardItem, szText, INTERFACE_STRING_LENGTH ); _stprintf(szMessage, szText, szItemName ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT,szMessage, CHAT_TYPE_SYSTEM); if( GAMEOPTION->GetPickUpItemNotify() ) { g_InterfaceManager.GetInterfaceString( eST_NAMECODE_GET_ITEM, szText, INTERFACE_STRING_LENGTH ); _stprintf(szMessage, szText, szItemName ); GameFramework::GetCurrentScene()->InserCenterTextMessage( szMessage, eType ); } } else { assert(!"?????? ?????? ?????!!"); } } break; case POINT_REWARD: { if ( pBaseItemInfo ) { // [%s] ???????? ???? ???????. g_InterfaceManager.GetInterfaceString( 70271, szText, INTERFACE_STRING_LENGTH ); _stprintf(szMessage, szText, szItemName ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT,szMessage, CHAT_TYPE_SYSTEM); uiCharaterAccumulatePointDialog* accumulatepoint_dialog = GET_CAST_DIALOG(uiCharaterAccumulatePointDialog, IM_CHARACTERSTATUS_MANAGER::CHARACTER_ACCUMULATEPOINT_DLG); if (accumulatepoint_dialog) { accumulatepoint_dialog->InserRewardMessage(szMessage); } } } break; case CUBE: { if (pBaseItemInfo) { // 3408: %s ???????? ????????????. g_InterfaceManager.GetInterfaceString(3408, szText, INTERFACE_STRING_LENGTH); _stprintf(szMessage, szText, szItemName); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT,szMessage, CHAT_TYPE_SYSTEM); } } break; case SOCKET_COMPOSTE: { if (pBaseItemInfo) { // 6493: ????????. %s?? ????????????. g_InterfaceManager.GetInterfaceString(6493, szText, INTERFACE_STRING_LENGTH); _stprintf(szMessage, szText, szItemName); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT,szMessage, CHAT_TYPE_SYSTEM); uiSocketComposite* dialog = GET_CAST_DIALOG(uiSocketComposite, IM_SOCKET_MANAGER::SOCKET_COMPOSITE); if (dialog && dialog->IsVisibleWindow()) { DummyItemSlot DummyItem; SCItemSlot& from_item_slot = (SCItemSlot&)pContainer->GetSlot(pSlot[i].m_Pos); if ((from_item_slot.GetItemInfo() != NULL) || (from_item_slot.GetSlotType() == ST_ITEM)) { assert(&from_item_slot); DummyItem.Clear(); DummyItem.SetOrgSlot(&from_item_slot); DummyItem.SetFromContainerIdx(SI_INVENTORY); DummyItem.SetFromPosition(pSlot[i].m_Pos); DummyItem.SetSlotType(ST_ITEM); dialog->SetMessage(uiSocketComposite::SOCKET_COMPOSITE_INFO_STRING3, szMessage); SCSlotContainer* socket_composite_container_ptr = ItemManager::Instance()->GetContainer(SI_SOCKET_COMPOSITE); socket_composite_container_ptr->InsertSlot(uiSocketComposite::SOCKET_COMPOSITE_SLOT_RESULT_ITEM, DummyItem); } } } } break; } } // play sound if(eType != POINT_REWARD) { ItemManager::Instance()->PlaySlotSound(eSLOT_SOUND_TYPE_PUT, (SCSlot *)&ItemBuf); } return itemcode; } //------------------------------------------------------------------------------------------- /** */ BOOL ItemManager::InsertJustInventory(eINSERTTOTALTYPE eType, JUST_INVENTORY_TOTAL_INFO & rTotalInfo) { SCSlotContainer *pContainer = GetContainer(SI_INVENTORY); SUN_ASSERT(pContainer); if (!pContainer) { GlobalFunc::OutputMsg_Notice( eOUTPUT_MSG_TOP_SHOW | eOUTPUT_MSG_CHAT, _T("Invalid inventory container. Please try reconnect.")); return FALSE; } // // total info set ITEMSLOTEX * pSlot = rTotalInfo.m_Slot; POSTYPE start = 0; POSTYPE total = rTotalInfo.m_Count; SCItemSlot ItemBuf; TCHAR szText[INTERFACE_STRING_LENGTH], szMessage[INTERFACE_STRING_LENGTH]; TCHAR szItemName[MAX_PATH]; const BASE_ITEMINFO * pBaseItemInfo = NULL; InventoryDialog * pInvenDlg = GET_CAST_DIALOG( InventoryDialog, IM_INVENTORY_MANAGER::INVEN_DLG ); SUN_ASSERT(pInvenDlg); // ?????? ???????? ?????? ?????? ??? Insert ???. for(POSTYPE i = start; i < total; ++i) { ItemBuf.Clear(); ItemBuf.Copy( pSlot[i].m_Stream ); if (pContainer->IsEmpty(pSlot[i].m_Pos)) { pContainer->InsertSlot(pSlot[i].m_Pos, ItemBuf); } else { if(pInvenDlg) pInvenDlg->SetUpdateQuest(false); pContainer->DeleteSlot(pSlot[i].m_Pos, NULL); if(pInvenDlg) pInvenDlg->SetUpdateQuest(true); pContainer->InsertSlot(pSlot[i].m_Pos, ItemBuf); } pBaseItemInfo = ItemBuf.GetItemInfo(); if (pBaseItemInfo) { ZeroMemory(szItemName,sizeof(szItemName)); GameFunc::GetItemName(&ItemBuf, pBaseItemInfo, szItemName, MAX_PATH); } switch ( eType ) { case BUY: { if ( pBaseItemInfo ) { // [%s] ???????? ???? ????????. g_InterfaceManager.GetInterfaceString( eST_NAMECODE_BUY_ITEM, szText, INTERFACE_STRING_LENGTH ); _stprintf( szMessage, szText, szItemName ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage, CHAT_TYPE_SYSTEM ); } else { assert(!"?????? ?????? ?????!!"); } } break; case PICK: { if ( pBaseItemInfo ) { // [%s] ???????? ??? ??????. g_InterfaceManager.GetInterfaceString(eST_NAMECODE_GET_ITEM, szText, INTERFACE_STRING_LENGTH ); _stprintf( szMessage, szText, szItemName ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT,szMessage, CHAT_TYPE_SYSTEM); if( GAMEOPTION->GetPickUpItemNotify() ) { GameFramework::GetCurrentScene()->InserCenterTextMessage( szMessage, eType ); } uiHelpMan* helpMan = static_cast(g_InterfaceManager.GetUserInterfaceManager(UIMAN_HELP)); if (helpMan) { helpMan->CheckHelpMessage(eHK_ITEM, (SLOTCODE)pBaseItemInfo->m_Code, (BOOL)ItemBuf.IsLimited()); } uiGuideSystemMan* guide_manager = static_cast(g_InterfaceManager.GetUserInterfaceManager(UIMAN_GUIDE_SYSTEM)); if (guide_manager) { guide_manager->CheckHelpMessage(TotalGuideNotice::kGetItem, pBaseItemInfo->GetSubTypeDetail(), pBaseItemInfo->m_Code); } } else { assert(!"?????? ?????? ?????!!"); } } break; case CREATE: { if ( pBaseItemInfo ) { // [%s] ???????? ???? ????????. const int c_iCreateItem = 70270; g_InterfaceManager.GetInterfaceString( c_iCreateItem, szText, INTERFACE_STRING_LENGTH ); _stprintf(szMessage, szText, szItemName ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT,szMessage, CHAT_TYPE_SYSTEM); } else { assert(!"?????? ?????? ?????!!"); } } break; case REWARD: { if ( pBaseItemInfo ) { // [%s] ???????? ???? ???????. const int c_iRewardItem = 70271; g_InterfaceManager.GetInterfaceString( c_iRewardItem, szText, INTERFACE_STRING_LENGTH ); _stprintf(szMessage, szText, szItemName ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT,szMessage, CHAT_TYPE_SYSTEM); if( GAMEOPTION->GetPickUpItemNotify() ) { g_InterfaceManager.GetInterfaceString( eST_NAMECODE_GET_ITEM, szText, INTERFACE_STRING_LENGTH ); _stprintf(szMessage, szText, szItemName ); GameFramework::GetCurrentScene()->InserCenterTextMessage( szMessage, eType ); } } else { assert(!"?????? ?????? ?????!!"); } } break; case EVENT: { if ( pBaseItemInfo ) { // [%s] ???????? ???? ?¥ê??????? ???? ??????. g_InterfaceManager.GetInterfaceString( eST_REWARDITEM, szText, INTERFACE_STRING_LENGTH ); Sprintf(szMessage, szText, szItemName ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT,szMessage, CHAT_TYPE_SYSTEM); } else { assert(!"?????? ?????? ?????!!"); } } break; case QUEST_OBTAIN: { if ( pBaseItemInfo ) { // [%s] ???????? ???? ???????. const int c_iRewardItem = 70271; g_InterfaceManager.GetInterfaceString( c_iRewardItem, szText, INTERFACE_STRING_LENGTH ); _stprintf(szMessage, szText, szItemName ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT,szMessage, CHAT_TYPE_SYSTEM); if( GAMEOPTION->GetPickUpItemNotify() ) { g_InterfaceManager.GetInterfaceString( eST_NAMECODE_GET_ITEM, szText, INTERFACE_STRING_LENGTH ); _stprintf(szMessage, szText, szItemName ); GameFramework::GetCurrentScene()->InserCenterTextMessage( szMessage, eType ); } } else { assert(!"?????? ?????? ?????!!"); } } break; case PRESENT: { if ( pBaseItemInfo ) { // [%s] ?????? ????????????. g_InterfaceManager.GetInterfaceString( 5978, szText, INTERFACE_STRING_LENGTH ); Sprintf(szMessage, szText, szItemName ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT,szMessage, CHAT_TYPE_SYSTEM); } else { assert(!"?????? ?????? ?????!!"); } } case SHOP_STORAGE: { if ( pBaseItemInfo ) { // [%s] ???????? ???? ????????. g_InterfaceManager.GetInterfaceString( eST_NAMECODE_BUY_ITEM, szText, INTERFACE_STRING_LENGTH ); _stprintf( szMessage, szText, szItemName ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage, CHAT_TYPE_SYSTEM ); } else { assert(!"?????? ?????? ?????!!"); } } break; } } // play sound ItemManager::Instance()->PlaySlotSound(eSLOT_SOUND_TYPE_PUT, (SCSlot *)&ItemBuf); return TRUE; } //------------------------------------------------------------------------------------------- /** ?¥ê??????? ??? ???????? ???????. */ BOOL ItemManager::DeleteInventoryTotalInfo( eDELETETOTALTYPE eType, SLOTIDX AtSlotIdx, INVEN_DELETE_TOTAL_INFO & rDeleteTotalInfo) { SCSlotContainer * pContainer = GetContainer(AtSlotIdx); assert(pContainer); if ( !pContainer ) { return FALSE; } for (int i = 0; i < rDeleteTotalInfo.m_Count; ++i) { BOOL bDelete = DeleteItem(AtSlotIdx, rDeleteTotalInfo.m_Slot[i].m_Pos, rDeleteTotalInfo.m_Slot[i].m_Num); assert(bDelete); if ( !bDelete ) { return FALSE; } } return TRUE; } //---------------------------------------------------------------------- /** InsertEventTotalInfo desc : EventInventory?? ???????? ??? ??¢¥?. author : y2jinc date : 2006. 1. 20 */ BOOL ItemManager::InsertEventTotalInfo( EVENT_ITEM_TOTAL_INFO & rTotalInfo) { SCSlotContainer * pContainer = GetContainer(SI_EVENT_INVENTORY); assert(pContainer); BOOL bRet = TRUE; // // total info set EVENTSLOT * pEventSlot = rTotalInfo.m_Slot; POSTYPE start = 0; POSTYPE total = rTotalInfo.m_Count; assert( pContainer->GetMaxSlotNum() >= EVENT_ITEM_TOTAL_INFO::MAX_SLOT_NUM ); SCItemSlot TempEventItem; if ( pContainer ) { for ( int i = 0; i < total; ++i) { TempEventItem.Clear(); // ????????? ???? / ??? ??? ????? ??????? ???. TempEventItem.SetCode(pEventSlot[i].m_ItemCode); TempEventItem.SetNum(pEventSlot[i].m_ItemCount); pContainer->InsertSlot( i, TempEventItem ); } } return bRet; } //---------------------------------------------------------------------- /** IsExistEmptySlotFromInventoryTotal desc : Inventory / TempInventory ?? ?????? ?????? ????? ????? ??? author : y2jinc date : 2005. 9. 5 */ BOOL ItemManager::IsExistEmptySlotFromInventoryTotal() { POSTYPE EmptyPos; if ( this->GetEmptySlotPos(SI_INVENTORY, EmptyPos) ) { return TRUE; } return FALSE; } //------------------------------------------------------------------------------------------- /** */ BOOL ItemManager::Test_InsertItemAtInventory( CODETYPE ItemCode, int ItemNum ) { SCSlotContainer * pContainer = GetContainer(SI_INVENTORY); if (ItemNum < 0 ) return FALSE; POSTYPE EmptyPos; if ( !this->GetEmptySlotPos(SI_INVENTORY, EmptyPos) ) { return FALSE; } BASE_ITEMINFO * pInfo = ItemInfoParser::Instance()->GetItemInfo( ItemCode ); if ( !pInfo ) { GlobalFunc::DebugOutputMsg(eOUTPUT_MSG_CENTER_SHOW, _T("?????? ??? %d ?? ??? ?? ??? ????!!"), ItemCode); return FALSE; } SCItemSlot TempItem; TempItem.SetCode((SLOTCODE)ItemCode); if ( TempItem.IsOverlap() ) { if ( ItemNum > pInfo->m_byDupNum ) { // ???????????? ???????? ??? ??? TempItem.SetNum(pInfo->m_byDupNum); pContainer->InsertSlot(EmptyPos, TempItem); int iRemainNum = ItemNum-pInfo->m_byDupNum; return Test_InsertItemAtInventory(ItemCode, iRemainNum); } else { TempItem.SetNum(ItemNum); pContainer->InsertSlot(EmptyPos, TempItem); } } else { pContainer->InsertSlot(EmptyPos, TempItem); return Test_InsertItemAtInventory(ItemCode, --ItemNum); } return TRUE; } //------------------------------------------------------------------------------------------- /** */ VOID ItemManager::RepairItem( SLOTIDX AtSlotIdx, POSTYPE pos ) { SCSlotContainer *pContainer = GetContainer(AtSlotIdx); if (pContainer) { if (pContainer->IsEmpty(pos)) { SUN_ASSERT_MSG(0, "pContainer->IsEmpty return TRUE"); return; } SCSlot & rSlot = pContainer->GetSlot( pos ); if (ST_ITEM != rSlot.GetSlotType()) { SUN_ASSERT_MSG(0, "ST_ITEM != rSlot.GetSlotType()"); return; } SCItemSlot & rItemSlot = (SCItemSlot &)rSlot; if (rItemSlot.IsContainValidItem() == false) { return; } if(rItemSlot.IsLimited() && rItemSlot.GetDura() < rItemSlot.GetMaxDura()) { if (rItemSlot.DecreasingMaxDura() == FALSE) { return; } } if (rItemSlot.WithDura() == false) { return; } rItemSlot.SetDura( rItemSlot.GetMaxDura() ); } } //------------------------------------------------------------------------------------------- /** */ VOID ItemManager::RepairItemAll( SLOTIDX AtSlotIdx ) { SCSlotContainer * pContainer = GetContainer(AtSlotIdx); if ( pContainer ) { for ( POSTYPE pos = 0; pos < pContainer->GetMaxSlotNum(); ++pos) { if ( pContainer->IsEmpty( pos ) ) { continue; } SCSlot & rSlot = pContainer->GetSlot( pos ); if ( ST_ITEM != rSlot.GetSlotType() ) { continue; } SCItemSlot & rItemSlot = (SCItemSlot &)rSlot; if (rItemSlot.IsContainValidItem() == false) { continue; } if(rItemSlot.IsBlocked()) { continue; } if(rItemSlot.IsLimited() && rItemSlot.GetDura() < rItemSlot.GetMaxDura()) { if (rItemSlot.DecreasingMaxDura() == FALSE) { continue; } } if (rItemSlot.WithDura() == false) { continue; } rItemSlot.SetDura(rItemSlot.GetMaxDura()); } } } //------------------------------------------------------------------------------------------- /** */ MONEY ItemManager::GetPriceRepairItemAll( SLOTIDX AtSlotIdx ) { MONEY RepairMoney = 0; SCSlotContainer * pContainer = GetContainer(AtSlotIdx); if ( pContainer ) { for ( POSTYPE pos = 0; pos < pContainer->GetMaxSlotNum(); ++pos) { if ( pContainer->IsEmpty( pos ) ) { continue; } SCSlot & rSlot = pContainer->GetSlot( pos ); if ( ST_ITEM != rSlot.GetSlotType() ) { continue; } SCItemSlot& rItemSlot = static_cast(rSlot); if (rItemSlot.IsContainValidItem() == false) { continue; } if (rItemSlot.IsLimited() && (rItemSlot.GetLimitedDuraMax() <= 2)) { continue; } if (rItemSlot.WithDura() == false) { continue; } RepairMoney += rItemSlot.GetPriceForRepair(); } #ifdef _NA_007330_20140620_GUILD_SYSTEM_EXTENSION // ??? ??? int ratio = g_pHero->GetPlayerAttribute()->GetAttrValue(eATTR_SHOP_REPAIR_HEIM_RATIO); if (ratio != 0 && RepairMoney > 0) { bool is_plus = false; if (ratio > 0) is_plus = true; MONEY percent_value = 0; ratio = abs(ratio); percent_value = RepairMoney / 100 * ratio; if (is_plus) { RepairMoney += percent_value; } else { RepairMoney -= percent_value; } } #endif // _NA_007330_20140620_GUILD_SYSTEM_EXTENSION } return RepairMoney; } //------------------------------------------------------------------------------------------- /** */ BOOL ItemManager::IsExistRepairItem( SLOTIDX AtSlotIdx ) { BOOL bExistRepairItem = FALSE; SCSlotContainer * pContainer = GetContainer(AtSlotIdx); if ( pContainer ) { for ( POSTYPE pos = 0; pos < pContainer->GetMaxSlotNum(); ++pos) { if ( pContainer->IsEmpty( pos ) ) { continue; } SCSlot & rSlot = pContainer->GetSlot( pos ); if ( ST_ITEM != rSlot.GetSlotType() ) { continue; } SCItemSlot & rItemSlot = (SCItemSlot &)rSlot; if (rItemSlot.IsContainValidItem() == false) { continue; } if ( !rItemSlot.WithDura() ) { continue; } const BASE_ITEMINFO * pItemInfo = rItemSlot.GetItemInfo(); if( !pItemInfo ) { continue; } if ( rItemSlot.GetDura() >= rItemSlot.GetMaxDura() ) { continue; } bExistRepairItem = TRUE; break; } } return bExistRepairItem; } //------------------------------------------------------------------------------ bool ItemManager::IsExistRepairItem(SLOTIDX AtSlotIdx, DURATYPE less_dura) { SCSlotContainer* pContainer = GetContainer(AtSlotIdx); if (pContainer) { for (POSTYPE pos = 0; pos < pContainer->GetMaxSlotNum(); ++pos) { if (pContainer->IsEmpty(pos)) { continue; } SCSlot & rSlot = pContainer->GetSlot(pos); if (ST_ITEM != rSlot.GetSlotType()) { continue; } SCItemSlot & rItemSlot = (SCItemSlot &)rSlot; if (rItemSlot.IsContainValidItem() == false) { continue; } if (!rItemSlot.WithDura()) { continue; } const BASE_ITEMINFO * pItemInfo = rItemSlot.GetItemInfo(); if (pItemInfo == NULL) { continue; } if (rItemSlot.GetDura() >= less_dura) { continue; } return true; } } return false; } //------------------------------------------------------------------------------------------- /** */ BOOL ItemManager::IsExistLimitedItem( SLOTIDX AtSlotIdx ) { SCSlotContainer * pContainer = GetContainer(AtSlotIdx); if ( pContainer ) { for ( POSTYPE pos = 0; pos < pContainer->GetMaxSlotNum(); ++pos) { if ( pContainer->IsEmpty( pos ) ) { continue; } SCSlot & rSlot = pContainer->GetSlot( pos ); if ( ST_ITEM != rSlot.GetSlotType() ) { continue; } SCItemSlot & rItemSlot = (SCItemSlot &)rSlot; if(rItemSlot.IsLimited()) return TRUE; } } return FALSE; } //------------------------------------------------------------------------------ /** */ VOID ItemManager::MoveItemWithDiv() { SCSlotContainer * pFromContainer = g_pHero->GetSlotContainer( div_fromIdx ); if( !pFromContainer) return; SCSlotContainer * pToContainer = g_pHero->GetSlotContainer( div_toIdx ); if( !pToContainer ) return; SolarDialog * pFromContainerDlg = ItemManager::Instance()->GetItemContainerDialog(div_fromIdx); assert(pFromContainerDlg); SolarDialog * pToContainerDlg = ItemManager::Instance()->GetItemContainerDialog(div_toIdx); assert(pToContainerDlg); SCItemSlot& FromSlot = (SCItemSlot &)pFromContainer->GetSlot(div_fromPos); FromSlot.SetNum(div_fromNum); ItemUnitRenderer::RenderUnit * pRenderUnit1 = pFromContainerDlg->GetItemUnitRender()->GetItemUnit( FromSlot.GetSerial() ); if (pRenderUnit1) { pRenderUnit1->m_altNum = 0; pRenderUnit1->m_isDiv = false; } if( TRUE == pToContainer->IsEmpty( div_toPos ) ) { InventoryDialog * pInvenDlg = GET_CAST_DIALOG( InventoryDialog, IM_INVENTORY_MANAGER::INVEN_DLG ); if(pInvenDlg) { pInvenDlg->SetUpdateQuest(false); } // ?? ???? ??? pToContainer->InsertSlot( div_toPos, FromSlot ); if(pInvenDlg) { pInvenDlg->SetUpdateQuest(true); } SCItemSlot& ToSlot = (SCItemSlot &)pToContainer->GetSlot(div_toPos); ToSlot.SetNum(div_toNum); uiItemTotalcomposite * pTotalComposite = GET_CAST_DIALOG( uiItemTotalcomposite, IM_ITEM_COMPOSITE_MANAGER::ITEM_TOTAL_COMPOSITE ); if ( pTotalComposite->IsVisible() ) pTotalComposite->updateInfo(); ItemUnitRenderer::RenderUnit * pRenderUnit2 = pToContainerDlg->GetItemUnitRender()->GetItemUnit( ToSlot.GetSerial() ); if (pRenderUnit2) { pRenderUnit2->m_altNum = 0; pRenderUnit2->m_isDiv = false; } } } VOID ItemManager::MoveItem(SLOTIDX fromIdx, SLOTIDX toIdx, POSTYPE fromPos, POSTYPE toPos, DURATYPE itemCount) { SCSlotContainer * pFromContainer = g_pHero->GetSlotContainer( fromIdx ); if( !pFromContainer ) return; SCSlotContainer * pToContainer = g_pHero->GetSlotContainer( toIdx ); if( !pToContainer ) return; bool bUpdateOnOff = false; InventoryDialog * pInvenDlg = GET_CAST_DIALOG( InventoryDialog, IM_INVENTORY_MANAGER::INVEN_DLG ); if ((SI_INVENTORY == fromIdx) && (SI_INVENTORY == toIdx) && pInvenDlg) { bUpdateOnOff = true; pInvenDlg->SetUpdateQuest(false); } SCItemSlot FromSlot; pFromContainer->DeleteSlot( fromPos, &FromSlot ); if(bUpdateOnOff) pInvenDlg->SetUpdateQuest(true); if( TRUE == pToContainer->IsEmpty( toPos ) ) { if(bUpdateOnOff) pInvenDlg->SetUpdateQuest(false); DURATYPE remain_item_count = (FromSlot.GetNum()-itemCount); if (itemCount != 0)// ???? ??? { FromSlot.SetNum(itemCount); } // ?? ???? ??? pToContainer->InsertSlot( toPos, FromSlot ); if (itemCount != 0)// ???? ??? { FromSlot.SetNum(remain_item_count); pFromContainer->InsertSlot(fromPos, FromSlot); } if(bUpdateOnOff) pInvenDlg->SetUpdateQuest(true); } else { if(bUpdateOnOff == true) { pInvenDlg->SetUpdateQuest(false); } // ??? SCItemSlot ToSlot; pToContainer->DeleteSlot( toPos, &ToSlot ); pFromContainer->InsertSlot( fromPos, ToSlot ); pToContainer->InsertSlot( toPos, FromSlot ); if(bUpdateOnOff == true) { pInvenDlg->SetUpdateQuest(true); } } //------------------------------------------------------------------------------ const BASE_ITEMINFO* item_info = FromSlot.GetItemInfo(); #ifdef _YMS_AUTOBOT_GAME if (item_info->m_wType == eITEMTYPE_AUTO_HUNTING) { uiAutobotPlay* play = GET_CAST_DIALOG(uiAutobotPlay, uiAutobotPlay::kDialog_ID); if (play != NULL) { if ((fromIdx != SI_EQUIPMENT) && (toIdx == SI_EQUIPMENT)) { //! ???? play->ShowInterface(TRUE); } else if ((fromIdx == SI_EQUIPMENT) && (toIdx != SI_EQUIPMENT)) { //??? if (Autobot::Instance()->IsStarted()) { Autobot::Instance()->Stop(false); } play->ShowInterface(FALSE); } } } #endif //_YMS_AUTOBOT_GAME //------------------------------------------------------------------------------ if (item_info->m_wType == eITEMTYPE_WINGS) { if ((fromIdx == SI_EQUIPMENT) && (toIdx != SI_EQUIPMENT)) { if (g_pHero->is_spread_wings()) { g_pHero->set_spread_wings(false); } } } // ?????? ???? if ( SI_EQUIPMENT == fromIdx) { // ??? ItemManager::Instance()->PlaySlotSound(eSLOT_SOUND_TYPE_UNEQUIP, &FromSlot); } else if (SI_EQUIPMENT == toIdx) { // ???? ItemManager::Instance()->PlaySlotSound(eSLOT_SOUND_TYPE_EQUIP, &FromSlot); } else { ItemManager::Instance()->PlaySlotSound(eSLOT_SOUND_TYPE_PUT, &FromSlot); } } /** SCSlotContainer???? DummySlotContainer ?? ????????? ??? */ VOID LinkDummyItem( SLOTIDX fromIdx, SLOTIDX toIdx, POSTYPE fromPos, POSTYPE toPos ) { SCSlotContainer * pFromContainer = ItemManager::Instance()->GetContainer( fromIdx ); DummySlotContainer * pToContainer = (DummySlotContainer * )ItemManager::Instance()->GetContainer( toIdx ); SCItemSlot & FromItemSlot = (SCItemSlot &)pFromContainer->GetSlot(fromPos); DummyItemSlot ToDummyItemSlot; // ???? ???????? Set???. ToDummyItemSlot.SetOrgSlot( &FromItemSlot ); ToDummyItemSlot.SetFromContainerIdx(fromIdx); ToDummyItemSlot.SetFromPosition(fromPos); pToContainer->DeleteSlot( toPos, NULL ); pFromContainer->InsertSlot( fromPos, ToDummyItemSlot ); ItemManager::Instance()->PlaySlotSound(eSLOT_SOUND_TYPE_PUT, &FromItemSlot); } VOID ItemManager::TradeBuyItem( SLOTIDX fromIdx, SLOTIDX toIdx, POSTYPE fromPos, POSTYPE toPos ) { SCSlotContainer * pFromContainer = g_pHero->GetSlotContainer( fromIdx ); SCSlotContainer * pToContainer = g_pHero->GetSlotContainer( toIdx ); if( !pToContainer) return; SCItemSlot FromSlot; if( FALSE == pToContainer->IsEmpty( toPos ) ) { // ?????? ?????? ????????. SCItemSlot ToSlot; pToContainer->InsertSlot( toPos, ToSlot ); } } VOID ItemManager::TradeSellItem( SLOTIDX fromIdx, SLOTIDX toIdx, POSTYPE fromPos, POSTYPE toPos ) { SCSlotContainer * pFromContainer = g_pHero->GetSlotContainer( fromIdx ); if( !pFromContainer) return; SCSlotContainer * pToContainer = g_pHero->GetSlotContainer( toIdx ); SCItemSlot FromSlot; if( FALSE == pFromContainer->IsEmpty( fromPos ) ) { // ????? ?????? ????. pFromContainer->DeleteSlot( fromPos, NULL ); } } VOID ItemManager::SimplexMoveLinkItem( SLOTIDX AtIndex, POSTYPE fromPos, POSTYPE toQuickPos ) { switch (AtIndex) { case SI_AUTOMATIC_INFO: case SI_QUICK: { moveLinkItem( AtIndex, fromPos, toQuickPos ); } break; case SI_STYLE: { moveLinkStyle( AtIndex, fromPos, toQuickPos ); } break; default: { assert(!"??????? ???? ???? - ?? ???"); } break; } } VOID ItemManager::moveLinkItem( SLOTIDX AtIndex, POSTYPE fromQuickPos, POSTYPE toQuickPos ) { if (!g_pHero) return; SCSlotContainer * pFromContainer = g_pHero->GetSlotContainer( AtIndex ); if( !pFromContainer) return; SCSlotContainer * pToContainer = g_pHero->GetSlotContainer( AtIndex ); if( !pToContainer) return; QuickSlot FromSlot; pFromContainer->DeleteSlot( fromQuickPos, &FromSlot ); if( TRUE == pToContainer->IsEmpty( toQuickPos ) ) { pToContainer->InsertSlot( toQuickPos, FromSlot ); } else { // ???.. QuickSlot ToSlot; pToContainer->DeleteSlot( toQuickPos, &ToSlot ); pFromContainer->InsertSlot( fromQuickPos, ToSlot ); pToContainer->InsertSlot( toQuickPos, FromSlot ); } ItemManager::Instance()->PlaySlotSound(eSLOT_SOUND_TYPE_LINK, (SCSlot *)&FromSlot); } //--------------------------------------------------------------------- /** @pre - g_pHero != NULL - AtIndex == SI_STYLE - @post */ VOID ItemManager::moveLinkStyle( SLOTIDX AtIndex, POSTYPE fromQuickPos, POSTYPE toQuickPos ) { if (!g_pHero) return; SCSlotContainer * pFromContainer = g_pHero->GetSlotContainer( AtIndex ); if( !pFromContainer) return; SCSlotContainer * pToContainer = g_pHero->GetSlotContainer( AtIndex ); if( !pToContainer) return; StyleSlot FromSlot; pFromContainer->DeleteSlot( fromQuickPos, &FromSlot ); if( TRUE == pToContainer->IsEmpty( toQuickPos ) ) { pToContainer->InsertSlot( toQuickPos, FromSlot ); } else { // ???.. StyleSlot ToSlot; pToContainer->DeleteSlot( toQuickPos, &ToSlot ); pFromContainer->InsertSlot( fromQuickPos, ToSlot ); pToContainer->InsertSlot( toQuickPos, FromSlot ); } ItemManager::Instance()->PlaySlotSound(eSLOT_SOUND_TYPE_LINK, (SCSlot *)&FromSlot); } //------------------------------------------------------------------------------ void ItemManager::AutobotLinkItem(SLOTIDX from_container_index, POSTYPE from_pos, POSTYPE to_pos, SLOTCODE org_code) { if (g_pHero == NULL) { return; } SCSlotContainer* from_container = g_pHero->GetSlotContainer(from_container_index); if (from_container == NULL) { return; } SCSlotContainer* to_container = g_pHero->GetSlotContainer(SI_AUTOMATIC_INFO); if (to_container == NULL) { return; } SCSlot& slot = from_container->GetSlot(from_pos); QuickSlot quick_slot; quick_slot.Clear(); BASE_ITEMINFO* item_info = ItemInfoParser::Instance()->GetItemInfo(org_code); if (item_info == NULL) { assert(!"????? ???? ??? ???."); return; } BOOL bRet = TRUE; if (from_pos == QUICK_SLOT_NULL_VALUE) { bRet = FALSE; } else { if (SCItemSlot::CanEquip(item_info)) { //no operation } else { // ?????? ?????? (????..) if (from_container->IsEmpty(from_pos)) { bRet = ItemManager::Instance()->FindFirstItem(org_code, from_pos); } else { if (slot.GetCode() != org_code) { bRet = ItemManager::Instance()->FindFirstItem(org_code , from_pos); } } } } SCSlot& from_slot = from_container->GetSlot(from_pos); if (bRet == FALSE) { // ?????? ???? quick_slot.SetOrgCode(org_code); quick_slot.SetOrgSlotIndex(from_container_index); quick_slot.SetOrgPos(from_pos); quick_slot.SetOrgSlotType(ST_ITEM); quick_slot.SetOrgSlot(&from_slot); quick_slot.SetOverlapCount(0); quick_slot.SetStatus(SLOT_RENDER_STATE_DEACTIVATED); } else { // ???? ???? quick_slot.SetOrgCode(from_slot.GetCode()); quick_slot.SetOrgSlotIndex(from_container_index); quick_slot.SetOrgPos(from_pos); // ???????? ?????? ?¥ê????? ???? ???? ????? ???. quick_slot.SetOrgSlotType(ST_ITEM); quick_slot.SetOrgSlot(&from_slot); quick_slot.SetStatus(SLOT_RENDER_STATE_ACTIVATED); SCItemSlot& from_item_slot = static_cast(from_slot); if (from_item_slot.IsOverlap()) { if(item_info->m_wType == eITEMTYPE_ETHER_BULLET) { quick_slot.SetOverlapCount(from_slot.GetNum()); } else { quick_slot.SetOverlapCount(GetOverlapItemCount(from_slot.GetCode())); } } else { quick_slot.SetOverlapCount(0); } } to_container->DeleteSlot(to_pos, NULL ); to_container->InsertSlot(to_pos, quick_slot); } //------------------------------------------------------------------------------ void ItemManager::AutobotLinkSkill(POSTYPE to_pos, SLOTCODE org_code) { if (g_pHero == NULL) { return; } BASE_SKILLINFO* skill_info = (BASE_SKILLINFO*)SkillInfoParser::Instance()->GetSkillInfo(org_code); if (skill_info == NULL) { return; } // ??? SCSlotContainer* to_container = g_pHero->GetSlotContainer(SI_AUTOMATIC_INFO); if (to_container == NULL) { return; } SCSkillSlot* skill_slot = const_cast(GetSkillSlotByCode(org_code)); if (skill_slot == NULL) { return; } const SkillScriptInfo* skill_script_info = SkillInfoParser::Instance()->GetSkillInfo(org_code); if (skill_script_info == NULL) { return; } if (skill_script_info->m_SkillClassCode != skill_slot->GetSkillInfo()->m_SkillClassCode) { assert(false && "?????? ??????¢¥?!!" ); return; } QuickSlot quick_slot; quick_slot.Clear(); quick_slot.SetOrgSlotIndex(SI_SKILL); quick_slot.SetOrgCode(skill_slot->GetCode()); // ????????? Code?? ??? quick_slot.SetOrgSlotType(ST_SKILL); quick_slot.SetOrgSlot(skill_slot); // ??????? ????? ???????. if (to_container->IsEmpty(to_pos)) { to_container->InsertSlot( to_pos, quick_slot ); } else { to_container->DeleteSlot(to_pos, NULL); to_container->InsertSlot(to_pos, quick_slot); } } //------------------------------------------------------------------------ /** OrgCode?? ??????????? ???? ???. @remark - ???? ??????? ?? ???? ???????? ??????? ????????. ???? ???????? ??? ????? ???? ???????? ????? ????? ?????? ????????. ?????? ???????? ?¥ê??????? ????????? ??? ????? ?????? ???? ????? ????? ??? */ VOID ItemManager::QuickLinkItem( SLOTIDX atIndex, POSTYPE OrgPos, POSTYPE toQuickPos, SLOTCODE OrgCode /*= 0*/) { if (!g_pHero) { return; } SCSlotContainer *pFromContainer = g_pHero->GetSlotContainer( atIndex ); SUN_ASSERT(pFromContainer); if (!pFromContainer) { return; } SCSlotContainer *pToContainer = g_pHero->GetSlotContainer( SI_QUICK ); SUN_ASSERT(pToContainer); if (!pToContainer) { return; } QuickSlot TempQuickSlot; TempQuickSlot.Clear(); POSTYPE FromPos = OrgPos; BASE_ITEMINFO * pItemInfo = ItemInfoParser::Instance()->GetItemInfo( OrgCode ); if ( !pItemInfo ) { assert(!"????? ???? ??? ???."); OrgCode; return; } BOOL bRet = TRUE; if ( FromPos == QUICK_SLOT_NULL_VALUE) { bRet = FALSE; } else { if (SCItemSlot::CanEquip(pItemInfo)) { // ???? ?????????. if (pFromContainer->IsEmpty(FromPos)) { bRet = FALSE; } else { SCSlot & rSlot = pFromContainer->GetSlot(OrgPos); if (rSlot.GetCode() != OrgCode) { bRet = FALSE; } } } else { // ?????? ?????? (????..) if (pFromContainer->IsEmpty(FromPos)) { bRet = ItemManager::Instance()->FindFirstItem(OrgCode, FromPos); } else { SCSlot & rSlot = pFromContainer->GetSlot(OrgPos); if (rSlot.GetCode() != OrgCode) { bRet = ItemManager::Instance()->FindFirstItem(OrgCode , FromPos); } } } } SCSlot & rFromSlot = pFromContainer->GetSlot( FromPos ); if (!bRet) { // ?????? ???? TempQuickSlot.SetOrgCode( OrgCode ); TempQuickSlot.SetOrgSlotIndex( atIndex ); TempQuickSlot.SetOrgPos(INVALID_POSTYPE_VALUE/*OrgPos*/); //??????? / ?????? / SUNKR-262 ?????? ??????? ????? ????? ???? ???? TempQuickSlot.SetOrgSlotType( ST_ITEM ); /* ## Scene ?????? ??? ?¥á??? ??? ??????? ??? ???? ????? ???? ???? ???? ## 2006/06/22 lammy */ TempQuickSlot.SetOrgSlot( &rFromSlot ); /* ## */ TempQuickSlot.SetOverlapCount(0); assert(OrgCode != 0); TempQuickSlot.SetStatus( SLOT_RENDER_STATE_DEACTIVATED ); } else { // ???? ???? TempQuickSlot.SetOrgCode(rFromSlot.GetCode()); TempQuickSlot.SetOrgSlotIndex(atIndex); TempQuickSlot.SetOrgPos(OrgPos); // ???????? ?????? ?¥ê????? ???? ???? ????? ???. TempQuickSlot.SetOrgSlotType(ST_ITEM); TempQuickSlot.SetOrgSlot(&rFromSlot); TempQuickSlot.SetStatus(SLOT_RENDER_STATE_ACTIVATED); SCItemSlot& rFromItemSlot = (SCItemSlot&)rFromSlot; if (rFromItemSlot.IsOverlap()) { //GS_BUG_FIX:????? ???????????,?????????? ??????? ??????????? if (pItemInfo->m_wType == eITEMTYPE_ETHER_BULLET) { TempQuickSlot.SetOverlapCount(rFromSlot.GetNum()); } else { TempQuickSlot.SetOverlapCount(GetOverlapItemCount(rFromSlot.GetCode())); } } else { TempQuickSlot.SetOverlapCount(0); } } pToContainer->DeleteSlot(toQuickPos, NULL); pToContainer->InsertSlot(toQuickPos, TempQuickSlot); } //--------------------------------------- /* ?????????? ??? ??? */ VOID ItemManager::QuickLinkSkill( SLOTIDX atIndex, SLOTCODE OrgCode, POSTYPE toQuickPos ) { if (!g_pHero) return; BASE_SKILLINFO * pSkillInfo = (BASE_SKILLINFO *)SkillInfoParser::Instance()->GetSkillInfo(OrgCode); if (pSkillInfo) { // ??? SCSlotContainer *pToContainer = g_pHero->GetSlotContainer( SI_QUICK ); SUN_ASSERT(pToContainer); if (!pToContainer) { return; } SCSkillSlot *pOrgSkillSlot = const_cast(GetSkillSlotByCode(OrgCode)); SUN_ASSERT(pOrgSkillSlot); if (!pOrgSkillSlot) { return; } QuickSlot TempQuickSlot; TempQuickSlot.Clear(); TempQuickSlot.SetOrgSlotIndex( SI_SKILL ); SUN_ASSERT( OrgCode == pOrgSkillSlot->GetCode() && "?????? ??????¢¥?!!" ); TempQuickSlot.SetOrgCode( pOrgSkillSlot->GetCode() ); // ????????? Code?? ??? TempQuickSlot.SetOrgSlotType( ST_SKILL ); TempQuickSlot.SetOrgSlot( pOrgSkillSlot ); // ??????? ????? ???????. if (pToContainer->IsEmpty(toQuickPos)) { pToContainer->InsertSlot( toQuickPos, TempQuickSlot ); } else { pToContainer->DeleteSlot( toQuickPos, NULL ); pToContainer->InsertSlot(toQuickPos, TempQuickSlot); } } else { assert(0); } } //--------------------------------------- /* ????? ???????? ????? ??? */ VOID ItemManager::StyleLink(SLOTCODE OrgCode, POSTYPE toQuickPos ) { if (!g_pHero) return; ROOT_SKILLINFO *pInfo = SkillInfoParser::Instance()->GetInfo(OrgCode); assert( pInfo ); if( !pInfo ) return; BASE_SKILLINFO * pSkillInfo = NULL; BASE_STYLEINFO * pStyleInfo = NULL; if (pInfo->IsSkill()) { pSkillInfo = (BASE_SKILLINFO *)pInfo; } else { pStyleInfo = (BASE_STYLEINFO *)pInfo; } if (pStyleInfo) { // ??? SCSlotContainer *pToContainer = g_pHero->GetSlotContainer( SI_STYLE ); SUN_ASSERT(pToContainer); if (!pToContainer) { return; } SCSkillSlot *pOrgSkillSlot = const_cast(GetSkillSlotByCode(OrgCode)); SUN_ASSERT(pOrgSkillSlot); if (!pOrgSkillSlot) { return; } StyleContainer * pStyleDlg = (StyleContainer *)ItemManager::Instance()->GetItemContainerDialog(SI_STYLE); if (!pStyleDlg) { return; } if (pStyleDlg->IsExistSameCodeItem(pOrgSkillSlot->GetCode())) { SUN_ASSERT_MSG(0, "pStyleDlg->IsExistSameCodeItem(pOrgSkillSlot->GetCode()) == TRUE"); return; } StyleSlot TempStyleSlot; TempStyleSlot.Clear(); TempStyleSlot.SetOrgCode( OrgCode ); // ????????? Code?? ??? TempStyleSlot.SetOrgSlotType( ST_SKILL ); TempStyleSlot.SetOrgSlot( pOrgSkillSlot ); // ??????? ????? ???????. if (pToContainer->IsEmpty(toQuickPos)) { pToContainer->InsertSlot( toQuickPos, TempStyleSlot ); } else { pToContainer->DeleteSlot( toQuickPos, NULL ); pToContainer->InsertSlot(toQuickPos, TempStyleSlot); } } else { assert(0); } } VOID ItemManager::CopyItem( SLOTIDX fromIdx, SLOTIDX toIdx, POSTYPE fromPos, POSTYPE toPos ) { SCSlotContainer * pFromContainer = this->GetContainer( fromIdx ); assert (pFromContainer); SCSlotContainer * pToContainer = this->GetContainer( toIdx ); assert (pToContainer); SCSlot & rSlot = pFromContainer->GetSlot( fromPos); pToContainer->InsertSlot( toPos, rSlot ); } //-------------------------------------------------------------------- // ?????? composite ???? ??? BOOL ItemManager::SpendCompositeMaterials( eITEMCOMPOSITECODE eItemCompositeType, SLOTIDX fromSlotIndex) { SCSlotContainer *pAtContainer = GetContainer(fromSlotIndex); if (!pAtContainer) { return FALSE; } // ????? ?????????? ?????. int iMaterialsIndex = 0; int iSlotIndex = 0; int iDeleteMaterialCount = 0; int iRemainDeleteMaterialCount = 0; CODETYPE DeleteMaterialCode = 0; SCItemSlot DeleteItemSlot; sITEMCOMPOSITE *pItemComposite = NULL; pItemComposite = ItemCompositeParser::Instance()->GetCompositeInfo(eItemCompositeType ); if (!pItemComposite) { assert(0); return FALSE; } for (; iMaterialsIndex < pItemComposite->m_byMatCount; ++iMaterialsIndex) { iRemainDeleteMaterialCount = iDeleteMaterialCount = pItemComposite->m_sCompositeMaterials[iMaterialsIndex].m_bySpendMaterialNum; DeleteMaterialCode = pItemComposite->m_sCompositeMaterials[iMaterialsIndex].m_dwCompositeMaterialCode; for (iSlotIndex = 0; iSlotIndex < pAtContainer->GetMaxSlotNum(); ++iSlotIndex) { if (iRemainDeleteMaterialCount < 1) break; if (pAtContainer->IsEmpty(iSlotIndex)) continue; SCItemSlot & rGetItemSlot = (SCItemSlot &)pAtContainer->GetSlot(iSlotIndex); if (rGetItemSlot.GetCode() != DeleteMaterialCode) continue; if (rGetItemSlot.IsOverlap()) { // ??? ???? ??? count ?? ????? ????????. int iCurCount = rGetItemSlot.GetNum(); int iCurRemainCnt = iCurCount - iRemainDeleteMaterialCount; if (0 == iCurRemainCnt) { pAtContainer->DeleteSlot(iSlotIndex, &DeleteItemSlot); break; } else if (iCurRemainCnt > 0) { // ????? ????? rGetItemSlot.SetNum( iCurRemainCnt ); break; } else if (iCurRemainCnt < 0) { pAtContainer->DeleteSlot(iSlotIndex, &DeleteItemSlot); // ??????? ?????. iRemainDeleteMaterialCount -= iCurCount; } } else { pAtContainer->DeleteSlot(iSlotIndex, &DeleteItemSlot); } } } return TRUE; } ////////////////////////////////////////////////////////////////////////// // Send Packet ???? VOID ItemManager::SendItemMoveMsg(SLOTIDX fromIdx, SLOTIDX toIdx, POSTYPE fromPos, POSTYPE toPos, DURATYPE ItemCount) { MSG_CG_ITEM_MOVE_SYN msg; msg.m_byCategory = CG_ITEM; msg.m_byProtocol = CG_ITEM_MOVE_SYN; msg.m_fromIndex = fromIdx; msg.m_toIndex = toIdx; msg.m_fromPos = fromPos; msg.m_toPos = toPos; msg.move_quantity_ = ItemCount; // ?????? ??? ????? ?????????? ????? ??. SCSlotContainer* pFromContainer = GetContainer(fromIdx); SCSlotContainer* pToContainer = GetContainer(toIdx); if (pFromContainer && pToContainer) { if ((fromPos < pFromContainer->GetMaxSlotNum()) && (toPos < pToContainer->GetMaxSlotNum())) { assert(pFromContainer->GetSlot(fromPos).GetSlotType() == ST_ITEM); assert(pToContainer->GetSlot(toPos).GetSlotType() == ST_ITEM); SCItemSlot& rFromItemSlot = (SCItemSlot&)pFromContainer->GetSlot(fromPos); SCItemSlot& rToItemFromSlot = (SCItemSlot&)pToContainer->GetSlot(toPos); if (rFromItemSlot.GetLaxLock()->IsLock() || rToItemFromSlot.GetLaxLock()->IsLock()) { //70130 ??? ???????? ?????????????. NoticeReasonItemErrorCode(RC_ITEM_INVALIDPOS); MouseHandler::Instance()->RollbackItemAtHand(); return; } if (rFromItemSlot.IsLocked() || rToItemFromSlot.IsLocked()) { MouseHandler::Instance()->RollbackItemAtHand(); return; } if ((toIdx == SI_EQUIPMENT) && (pToContainer->IsEmpty(toPos) == FALSE)) { if (CanUnEquipItem(toPos, TRUE) == FALSE) { return; } } #ifdef _NA_008679_20160202_REWORK_BATTLEGROUND // ???? ???? ?? ??? ???? ????? ??? ????/????/??? ???? if ((toIdx == SI_EQUIPMENT) || (fromIdx == SI_EQUIPMENT)) { if ((ChaosSystem::GetBattleGroundData().is_on_reservation()) || (GlobalFunc::IsBattleGroundScene() == TRUE)) { NoticeReasonItemErrorCode(RC_ITEM_EQUIP_FAILED_BATTLEGROUND); MouseHandler::Instance()->RollbackItemAtHand(); return; } } #endif //_NA_008679_20160202_REWORK_BATTLEGROUND } } GlobalFunc::SendPacket(CI_GAMESERVERIDX, &msg, sizeof(msg)); if (!GENERALPARAM->IsNet()) { MSG_CG_ITEM_MOVE_ACK SendPacketAck; SendPacketAck.m_fromIndex = fromIdx; SendPacketAck.m_toIndex = toIdx; SendPacketAck.m_fromPos = fromPos; SendPacketAck.m_toPos = toPos; g_pApplication->AddVirtualPacket(CI_GAMESERVERIDX, (BYTE*)&SendPacketAck, sizeof(SendPacketAck)); } } //------------------------------------------------------------------------------ /** */ VOID ItemManager::SendItemMoveMsgWithDiv(SLOTIDX fromIdx, SLOTIDX toIdx, POSTYPE fromPos, POSTYPE toPos, DURATYPE fromNum, DURATYPE toNum ) { div_fromIdx = fromIdx; div_toIdx = toIdx; div_fromPos = fromPos; div_toPos = toPos; div_fromNum = fromNum; div_toNum = toNum; MSG_CG_ITEM_DIVIDE_SYN msg; msg.m_fromPos = fromPos; msg.m_toPos = toPos; msg.m_fromNum = fromNum; msg.m_toNum = toNum; //------------------------------------------------------------------------------ if (PacketRequestManager::Instance()->is_sent(msg.m_byCategory, msg.m_byProtocol) == true) { MouseHandler::Instance()->RollbackItemAtHand(); return; } //------------------------------------------------------------------------------ // ?????? ??? ????? ?????????? ????? ??. SCSlotContainer * pFromContainer = GetContainer(fromIdx); SCSlotContainer * pToContainer = GetContainer(toIdx); if (pFromContainer && pToContainer) { if (fromPos < pFromContainer->GetMaxSlotNum() && toPos < pToContainer->GetMaxSlotNum() ) { assert(pFromContainer->GetSlot(fromPos).GetSlotType() == ST_ITEM ); assert(pToContainer->GetSlot(toPos).GetSlotType() == ST_ITEM ); SCItemSlot & rFromItemSlot = (SCItemSlot &)pFromContainer->GetSlot( fromPos ); SCItemSlot & rToItemFromSlot = (SCItemSlot &)pToContainer->GetSlot( toPos ); if ( rFromItemSlot.IsLocked() || rToItemFromSlot.IsLocked() ) { MouseHandler::Instance()->RollbackItemAtHand(); return; } } } //------------------------------------------------------------------------------ MSG_CG_ITEM_DIVIDE_SYN* syn = new MSG_CG_ITEM_DIVIDE_SYN; MSG_CG_ITEM_DIVIDE_ACK* ack = new MSG_CG_ITEM_DIVIDE_ACK; MSG_CG_ITEM_DIVIDE_NAK* nak = new MSG_CG_ITEM_DIVIDE_NAK; PacketRequestManager::Instance()->PushPacket(syn, ack, nak, sizeof(MSG_CG_ITEM_DIVIDE_SYN), PACKET_WAITING_MILLISECOND, false); //------------------------------------------------------------------------------ GlobalFunc::SendPacket( CI_GAMESERVERIDX, &msg, sizeof(msg) ); if ( !GENERALPARAM->IsNet() ) { MSG_CG_ITEM_DIVIDE_ACK msg; g_pApplication->AddVirtualPacket(CI_GAMESERVERIDX, (BYTE *)&msg, sizeof(msg) ); } } //------------------------------------------------------------------------------------------- /** */ VOID ItemManager::SendItemRepairMsg( SLOTIDX AtIdx, POSTYPE Pos, bool bAllRepair /* = FALSE */ ) { MSG_CG_ITEM_REPAIR_DURA_SYN SendPackt; SendPackt.m_SlotIndex = AtIdx; SendPackt.m_bAllRepair = (bool)bAllRepair; SendPackt.m_SlotPos = Pos; SendPackt.m_NPCCode = g_HeroInput.GetClickedNpcCode(); GlobalFunc::SendPacketToGameServer(&SendPackt, sizeof(SendPackt)); if ( !GENERALPARAM->IsNet() ) { MSG_CG_ITEM_REPAIR_DURA_ACK SendPacktAck; SendPacktAck.m_bAllRepair = (bool)bAllRepair; SendPacktAck.m_SlotIndex = AtIdx; SendPacktAck.m_Money = 11; g_pApplication->AddVirtualPacket(CI_GAMESERVERIDX, (BYTE*)&SendPacktAck, sizeof(SendPacktAck)); } } void SendItemSell( bool b ) { if( b ) { GlobalFunc::SendPacket( CI_GAMESERVERIDX, &g_ItemSellSyn, sizeof( MSG_CG_ITEM_SELL_SYN ) ); } } VOID ItemManager::SendSellMsg(SLOTIDX atIndex, POSTYPE atPos, DURATYPE ItemCount, eENCHANTLEVEL popup_enchant_level) { SCSlotContainer *pContainer = GetContainer(atIndex); if (!pContainer) { return; } if (pContainer->IsEmpty(atPos)) { return; } SCItemSlot & rItemSlot = (SCItemSlot &)pContainer->GetSlot(atPos); if ( !rItemSlot.GetItemInfo() ) { return; } if ( 0 == rItemSlot.GetItemInfo()->m_ExchangedItem ) { g_ItemSellSyn.m_byCategory = CG_ITEM; g_ItemSellSyn.m_byProtocol = CG_ITEM_SELL_SYN; g_ItemSellSyn.m_atIndex = atIndex; g_ItemSellSyn.m_atPos = atPos; g_ItemSellSyn.m_NPCCode = g_HeroInput.GetClickedNpcCode(); g_ItemSellSyn.sell_quantity_ = ItemCount; // ??? ????(?? 0) g_ItemSellSyn.Encode(); //if( rItemSlot.GetEnchantLV() > ENCHANT_LOW ) if( rItemSlot.GetEnchantLV() > popup_enchant_level ) { // 5096 ?????? ?????©£?????? GlobalFunc::SysConfirmBox( g_InterfaceManager.GetInterfaceString( 5096 ), SendItemSell ); } else { GlobalFunc::SendPacket( CI_GAMESERVERIDX, &g_ItemSellSyn, sizeof(MSG_CG_ITEM_SELL_SYN) ); } } else { m_PendingExchangeContainIdx = atIndex; MSG_CG_ITEM_EXCHANGE_SYN ItemExchangeSyn; m_PendingExchangeItemPos = ItemExchangeSyn.m_atPos = atPos; GlobalFunc::SendPacket( CI_GAMESERVERIDX, &ItemExchangeSyn, sizeof(MSG_CG_ITEM_EXCHANGE_SYN) ); } } VOID ItemManager::SendBuyMsg( DWORD dwShopListID, SLOTCODE ItemCode, BYTE byTabIndex, POSTYPE ItemPos, DURATYPE ItemCount) { SHOPINFO * pShopInfo = ShopInfoParser::Instance()->GetShopList(dwShopListID); assert(byTabIndex < SHOPINFO::_MAX_TAB_NUM); assert(ItemPos < SHOPINFO::_MAX_SELLITEM_NUM); MSG_CG_ITEM_BUY_SYN ItemBuySyn; ItemBuySyn.m_byCategory = CG_ITEM; ItemBuySyn.m_byProtocol = CG_ITEM_BUY_SYN; ItemBuySyn.m_dwShopListID = dwShopListID; ItemBuySyn.m_ShopTabIndex = byTabIndex; ItemBuySyn.m_ShopItemIndex = ItemPos; ItemBuySyn.buy_quantity_ = ItemCount; ItemBuySyn.m_NPCCode = g_HeroInput.GetClickedNpcCode(); GlobalFunc::SendPacket( CI_GAMESERVERIDX, &ItemBuySyn, sizeof(MSG_CG_ITEM_BUY_SYN) ); } VOID ItemManager::SendPickupItem(DWORD ItemObjectKey) { MSG_CG_ITEM_PICK_SYN SendPacket; SendPacket.m_dwFieldItemObjectKey = ItemObjectKey; GlobalFunc::SendPacket(CI_GAMESERVERIDX, &SendPacket, sizeof(MSG_CG_ITEM_PICK_SYN) ); } VOID ItemManager::SendPickupMoney(DWORD ItemObjectKey) { MSG_CG_ITEM_PICK_MONEY_SYN SendPacket; SendPacket.m_dwFieldItemObjectKey = ItemObjectKey; GlobalFunc::SendPacket( CI_GAMESERVERIDX, &SendPacket, sizeof(MSG_CG_ITEM_PICK_MONEY_SYN) ); } void ItemManager::SendPickUpItemObject(Item* item_object) { if (item_object == NULL) { return; } switch (item_object->GetItemType()) { case ITEM_RENDER_INFO::eFIELDITEM_ITEM: { SendPickupItem(item_object->GetObjectKey()); } break; case ITEM_RENDER_INFO::eFIELDITEM_MONEY: { SendPickupMoney(item_object->GetObjectKey()); } break; } } void _callback_ItemManager_SendDropItemMsg(bool bYes) { if (bYes) { ItemManager::Instance()->VerifiedSendDropItemMsg(); } else { if (MouseHandler::Instance()->IsExistItemAtHand()) MouseHandler::Instance()->RollbackItemAtHand(); } } //------------------------------------------------------------------------------ /** */ VOID ItemManager::VerifiedSendDropItemMsg() { MSG_CG_ITEM_DROP_SYN SendPacket; SendPacket.m_byCategory = CG_ITEM; SendPacket.m_byProtocol = CG_ITEM_DROP_SYN; SendPacket.m_atIndex = m_verify_dropFromIdx; SendPacket.m_atPos = m_verify_dropFromPos; GlobalFunc::SendPacket( CI_GAMESERVERIDX, &SendPacket, sizeof(MSG_CG_ITEM_DROP_SYN)); if ( !GENERALPARAM->IsNet() ) { MSG_CG_ITEM_DROP_ACK SendPacketAck; SendPacketAck.m_atIndex = m_verify_dropFromIdx; SendPacketAck.m_atPos = m_verify_dropFromPos; g_pApplication->AddVirtualPacket(CI_GAMESERVERIDX, (BYTE*)&SendPacketAck, sizeof(SendPacketAck) ); } } VOID ItemManager::SendDropItemMsg(SLOTIDX FromIdx, POSTYPE FromPos) { TCHAR szMessage[INTERFACE_STRING_LENGTH]; if (!MouseHandler::Instance()->IsExistItemAtHand()) { return; } SCSlotContainer* pContainer = GetContainer(FromIdx); if (pContainer) { SCItemSlot& rItemSlot = (SCItemSlot&)pContainer->GetSlot(FromPos); if (rItemSlot.GetLaxLock()->IsLock()) { //5347 ???????? ???? ?? ???? ???????? NoticeReasonItemErrorCode(RC_ITEM_CANNNOT_DROPSTATE); MouseHandler::Instance()->RollbackItemAtHand(); return; } } #ifdef _JBH_ADD_BLOCK_HIGH_VALUE_ITEM_DRPO SCSlotContainer* pContainer = GetContainer(FromIdx); if (pContainer) { SCItemSlot& rItemSlot = (SCItemSlot&)pContainer->GetSlot(FromPos); if (rItemSlot.IsOverlap() == FALSE) { if (rItemSlot.IsDivine() || (rItemSlot.GetEnchant() >= 5)) { // 1601 ?????? ???????? ???? ?? ???????. g_InterfaceManager.GetInterfaceString(eST_NOT_DROP_HIGH_VALUE_ITEM, szMessage, INTERFACE_STRING_LENGTH); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage); MouseHandler::Instance()->RollbackItemAtHand(); return; } } } #endif m_verify_dropFromIdx = FromIdx; m_verify_dropFromPos = FromPos; // ???????? ???? ?????©£?????? 5100 g_InterfaceManager.GetInterfaceString(5100, szMessage, INTERFACE_STRING_LENGTH); uiSystemMan* pSystemMan = (uiSystemMan*)g_InterfaceManager.GetUserInterfaceManager(UIMAN_SYSTEM); if(pSystemMan) { pSystemMan->Sys_ConfirmLock(szMessage, _callback_ItemManager_SendDropItemMsg); } MouseHandler::Instance()->RollbackItemAtHand(); } //------------------------------------------------------------------------------------------- /** */ VOID ItemManager::SendDeleteItemMsg( POSTYPE FromPos ) { if( ! IsItemDeleteAvalibeState(FromPos) ) { return; } MSG_CG_ITEM_DELETE_SYN SendPacket; SendPacket.m_AtPos = FromPos; GlobalFunc::SendPacket( CI_GAMESERVERIDX, &SendPacket, sizeof(MSG_CG_ITEM_DELETE_SYN)); if ( !GENERALPARAM->IsNet() ) { MSG_CG_ITEM_DELETE_ACK SendPacketAck; g_pApplication->AddVirtualPacket(CI_GAMESERVERIDX, (BYTE*)&SendPacketAck, sizeof(SendPacketAck) ); } } VOID ItemManager::SendQuickItemLinkMsg( POSTYPE atPos, POSTYPE ToPos) { MSG_CG_ITEM_QUICK_LINKITEM_SYN SendPacket; SendPacket.m_OrgPos = atPos; SendPacket.m_ToPos = ToPos; GlobalFunc::SendPacket(CI_GAMESERVERIDX, &SendPacket, sizeof(SendPacket)); if ( !GENERALPARAM->IsNet() ) { MSG_CG_ITEM_QUICK_LINKITEM_ACK SendPacketAck; SendPacketAck.m_OrgPos = atPos; SendPacketAck.m_ToPos = ToPos; g_pApplication->AddVirtualPacket(CI_GAMESERVERIDX, (BYTE*)&SendPacketAck, sizeof(SendPacketAck) ); } } //--------------------------------------------------------------- // ?? ??????? ???? ??? VOID ItemManager::SendQuickSkillLinkMsg( SLOTCODE OrgCode, POSTYPE ToPos) { MSG_CG_ITEM_QUICK_LINKSKILL_SYN SendPacket; SendPacket.m_SkillCode = OrgCode; SendPacket.m_ToPos = ToPos; GlobalFunc::SendPacket(CI_GAMESERVERIDX, &SendPacket, sizeof(SendPacket)); if ( !GENERALPARAM->IsNet() ) { MSG_CG_ITEM_QUICK_LINKSKILL_ACK SendPacketAck; SendPacketAck.m_SkillCode = OrgCode; SendPacketAck.m_ToPos = ToPos; g_pApplication->AddVirtualPacket(CI_GAMESERVERIDX, (BYTE*)&SendPacketAck, sizeof(SendPacketAck) ); } } VOID ItemManager::SendSimplexMoveLinkMsg(POSTYPE fromPos, POSTYPE ToQuickPos) { MSG_CG_ITEM_QUICK_MOVE_SYN SendPacket; SendPacket.m_fromPos = fromPos; SendPacket.m_toPos = ToQuickPos; GlobalFunc::SendPacket( CI_GAMESERVERIDX, &SendPacket, sizeof(SendPacket) ); if ( !GENERALPARAM->IsNet() ) { MSG_CG_ITEM_QUICK_MOVE_ACK SendPacketAck; SendPacketAck.m_fromPos = fromPos; SendPacketAck.m_toPos = ToQuickPos; g_pApplication->AddVirtualPacket(CI_GAMESERVERIDX, (BYTE*)&SendPacketAck, sizeof(SendPacketAck) ); } } VOID ItemManager::SendQuickItemRemoveMsg( POSTYPE AtPos) { MSG_CG_ITEM_QUICK_UNLINK_SYN Sendpacket; Sendpacket.m_atPos = AtPos; GlobalFunc::SendPacket( CI_GAMESERVERIDX, &Sendpacket, sizeof(Sendpacket) ); if ( !GENERALPARAM->IsNet() ) { MSG_CG_ITEM_QUICK_UNLINK_ACK SendPacketAck; SendPacketAck.m_atPos = AtPos; g_pApplication->AddVirtualPacket(CI_GAMESERVERIDX, (BYTE*)&SendPacketAck, sizeof(SendPacketAck) ); } } //////////////////////////////////////////////////////////////////////////////// //--------------------------------------------------------------- // ????? ???? VOID ItemManager::SendQuickStyleLinkMsg(SLOTCODE OrgCode, POSTYPE ToPos) { MSG_CG_STYLE_LINK_SYN SendPacket; SendPacket.m_StyleCode = OrgCode; SendPacket.m_ToPos = ToPos; GlobalFunc::SendPacket( CI_GAMESERVERIDX, &SendPacket, sizeof(SendPacket) ); if ( !GENERALPARAM->IsNet() ) { MSG_CG_STYLE_LINK_ACK SendPacketAck; SendPacketAck.m_StyleCode = OrgCode; SendPacketAck.m_ToPos = ToPos; g_pApplication->AddVirtualPacket(CI_GAMESERVERIDX, (BYTE*)&SendPacketAck, sizeof(SendPacketAck) ); } } VOID ItemManager::SendQuickStyleMoveLinkMsg(POSTYPE fromPos, POSTYPE ToPos) { MSG_CG_STYLE_LINKMOVE_SYN SendPacket; SendPacket.m_fromPos = fromPos; SendPacket.m_toPos = ToPos; GlobalFunc::SendPacket( CI_GAMESERVERIDX, &SendPacket, sizeof(SendPacket) ); if ( !GENERALPARAM->IsNet() ) { MSG_CG_STYLE_LINKMOVE_ACK SendPacketAck; SendPacketAck.m_fromPos = fromPos; SendPacketAck.m_toPos = ToPos; g_pApplication->AddVirtualPacket(CI_GAMESERVERIDX, (BYTE*)&SendPacketAck, sizeof(SendPacketAck) ); } } VOID ItemManager::SendQuickStyleRemoveMsg(POSTYPE AtPos ) { MSG_CG_STYLE_UNLINK_SYN SendPacket; SendPacket.m_atPos = AtPos; GlobalFunc::SendPacket( CI_GAMESERVERIDX, &SendPacket, sizeof(SendPacket) ); if ( !GENERALPARAM->IsNet() ) { MSG_CG_STYLE_UNLINK_ACK SendPacketAck; SendPacketAck.m_atPos = AtPos; g_pApplication->AddVirtualPacket(CI_GAMESERVERIDX, (BYTE*)&SendPacketAck, sizeof(SendPacketAck) ); } } ////////////////////////////////////////////////////////////////////////// VOID ItemManager::SendWareHouseItemAllSyn() { MSG_CG_WAREHOUSE_START_SYN SendPacket; GlobalFunc::SendPacket(CI_GAMESERVERIDX, &SendPacket, sizeof(SendPacket)); } BOOL ItemManager::CanEquipClass(Player * pPlayer, const BASE_ITEMINFO * pInfo ) const { // class ??? if( !pPlayer || !pInfo) return FALSE; switch ( (eCHAR_TYPE)pPlayer->GetClass() ) { case eCHAR_BERSERKER: { if (!pInfo->m_wEqClass1) { return FALSE; } } break; case eCHAR_DRAGON: { if (!pInfo->m_wEqClass2) { return FALSE; } } break; case eCHAR_SHADOW: { if (!pInfo->m_wEqClass3) { return FALSE; } } break; case eCHAR_VALKYRIE: { if (!pInfo->m_wEqClass4) { return FALSE; } } break; case eCHAR_MAGICIAN: { if (!pInfo->m_wEqClass5) { return FALSE; } } break; case eCHAR_MYSTIC: //_NA_004965_20120613_NEW_CHARACTER_MYSTIC { if (!pInfo->m_wEqClass6) { return FALSE; } } break; case eCHAR_HELLROID: //_NA_000000_20130812_NEW_CHARACTER_HELLROID { if (!pInfo->m_wEqClass7) { return FALSE; } } break; case eCHAR_WITCHBLADE: //_NA_007514_20140828_NEW_CHARACTER_WITCHBLADE { if (!pInfo->m_wEqClass8) { return FALSE; } } break; } return TRUE; } //---------------------------------------------------------------------------- /** */ BOOL ItemManager::CanEquipLimit( SCItemSlot & rItemSlot, BOOL bOuputMsg) { TCHAR szMessage[INTERFACE_STRING_LENGTH]; TCHAR szResult[INTERFACE_STRING_LENGTH]; TCHAR szItem[INTERFACE_STRING_LENGTH]; if (!g_pHero) { return FALSE; } if ( !ValidLimitStr( rItemSlot ) ) { if ( bOuputMsg ) { // ?? ????? ?????? [%s] ???????? ???? ?? ?? ??????? g_InterfaceManager.GetInterfaceString( eST_ITEM_EQUIP_LIMIT_STR, szMessage, INTERFACE_STRING_LENGTH ); g_InterfaceManager.GetItemName( rItemSlot.GetCode(), szItem, INTERFACE_STRING_LENGTH ); _stprintf( szResult, szMessage, szItem); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szResult ); } return FALSE; } if ( !ValidLimitDex( rItemSlot ) ) { if ( bOuputMsg ) { // ??©ª ????? ?????? [%s] ???????? ???? ?? ?? ??????? g_InterfaceManager.GetInterfaceString( eST_ITEM_EQUIP_LIMIT_DEX, szMessage, INTERFACE_STRING_LENGTH ); g_InterfaceManager.GetItemName( rItemSlot.GetCode(), szItem, INTERFACE_STRING_LENGTH ); _stprintf( szResult, szMessage, szItem); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szResult ); } return FALSE; } if ( !ValidLimitInt( rItemSlot ) ) { if ( bOuputMsg ) { // ???? ?????? [%s] ???????? ???? ?? ?? ??????? g_InterfaceManager.GetInterfaceString( eST_ITEM_EQUIP_LIMIT_INT, szMessage, INTERFACE_STRING_LENGTH ); g_InterfaceManager.GetItemName( rItemSlot.GetCode(), szItem, INTERFACE_STRING_LENGTH ); _stprintf( szResult, szMessage, szItem); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szResult ); } return FALSE; } if ( !ValidLimitLevel( rItemSlot ) ) { if ( bOuputMsg ) { // ???? ?????? [%s] ???????? ???? ?? ?? ??????? g_InterfaceManager.GetInterfaceString( eST_ITEM_EQUIP_LIMIT_LEVEL, szMessage, INTERFACE_STRING_LENGTH ); g_InterfaceManager.GetItemName( rItemSlot.GetCode(), szItem, INTERFACE_STRING_LENGTH ); _stprintf( szResult, szMessage, szItem); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szResult ); } return FALSE; } if ( !ValidLimitSkillExp1( rItemSlot ) ) { if ( bOuputMsg ) { // ????? ?????? [%s] ???????? ???? ?? ?? ??????? g_InterfaceManager.GetInterfaceString( eST_ITEM_EQUIP_LIMIT_EXP, szMessage, INTERFACE_STRING_LENGTH ); g_InterfaceManager.GetItemName( rItemSlot.GetCode(), szItem, INTERFACE_STRING_LENGTH ); _stprintf( szResult, szMessage, szItem); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szResult ); } return FALSE; } if ( !ValidLimitSkillExp2( rItemSlot ) ) { if ( bOuputMsg ) { // ????? ?????? [%s] ???????? ???? ?? ?? ??????? g_InterfaceManager.GetInterfaceString( eST_ITEM_EQUIP_LIMIT_EXP, szMessage, INTERFACE_STRING_LENGTH ); g_InterfaceManager.GetItemName( rItemSlot.GetCode(), szItem, INTERFACE_STRING_LENGTH ); _stprintf( szResult, szMessage, szItem); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szResult ); } return FALSE; } if ( !ValidLimitVit( rItemSlot ) ) { if ( bOuputMsg ) { // ??? ?????? [%s] ???????? ???? ?? ?? ??????? g_InterfaceManager.GetInterfaceString( eST_ITEM_EQUIP_LIMIT_VIT, szMessage, INTERFACE_STRING_LENGTH ); g_InterfaceManager.GetItemName( rItemSlot.GetCode(), szItem, INTERFACE_STRING_LENGTH ); _stprintf( szResult, szMessage, szItem); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szResult ); } return FALSE; } if ( !ValidLimitSpr( rItemSlot ) ) { if ( bOuputMsg ) { // ???? ?????? [%s] ???????? ???? ?? ?? ??????? g_InterfaceManager.GetInterfaceString( eST_ITEM_EQUIP_LIMIT_INT, szMessage, INTERFACE_STRING_LENGTH ); g_InterfaceManager.GetItemName( rItemSlot.GetCode(), szItem, INTERFACE_STRING_LENGTH ); _stprintf( szResult, szMessage, szItem); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szResult ); } return FALSE; } return TRUE; } BOOL ItemManager::CanEquipByGender(Player* pPlayer, const BASE_ITEMINFO* pInfo) { if ((pPlayer == NULL) || (pInfo == NULL)) { return FALSE; } BYTE gender = static_cast(pPlayer->GetGender()); bool can_equip = pInfo->IsCanUseGender(gender); return (can_equip == true) ? TRUE : FALSE; } //------------------------------------------------------------------------------------------- /** */ BOOL ItemManager::ValidLimitAll( SHORT Player_Limit, SHORT Item_Limit ) const { PlayerAttributes * pCharInfo = g_pHero->GetPlayerAttribute(); BASE_PLAYERINFO * pPlayInfo = g_pHero->GetCharInfo(); // ?????????? ???? ??? ???? ???? ??? - ???? ???????? ???? ???(??????:091102) short decrease_limit_stat = pCharInfo->GetDecreaseLimitStat(); if( Player_Limit + decrease_limit_stat >= Item_Limit ) return TRUE; return FALSE; } //---------------------------------------------------------------------------- /** */ BOOL ItemManager::ValidLimitStr( SCItemSlot & ItemSlot ) const { // ??????? ???? ?????? PlayerAttributes * pCharInfo = g_pHero->GetPlayerAttribute(); BASE_PLAYERINFO * pPlayInfo = g_pHero->GetCharInfo(); BASE_ITEMINFO * pInfo = ItemInfoParser::Instance()->GetItemInfo( ItemSlot.GetCode() ); if( !pInfo ) return FALSE; WORD LimitStr = pInfo->m_wLimitStr; if( 0 == LimitStr ) return TRUE; if( ItemSlot.GetItemInfo()->IsWeapon() ) { if( ItemSlot.IsDivine() ) { LimitStr = pInfo->m_wDivLimitStr; } LimitStr= GlobalFunc::CalcLimitStat( LimitStr, &ItemSlot); } #ifdef _NA002823_WINGS_EQUIPMENTS_EXTENTION else if( ItemSlot.GetItemInfo()->IsArmor() || ItemSlot.IsWingItem()) #else else if( ItemSlot.GetItemInfo()->IsArmor()) #endif //_NA002823_WINGS_EQUIPMENTS_EXTENTION { // Divine ?????? ?????? ??? ???? : ???? ???? LimitStr???? ???. if( ItemSlot.IsDivine() ) { LimitStr = pInfo->m_wDivLimitStr; } LimitStr= GlobalFunc::CalcLimitStat( LimitStr, &ItemSlot); } else { DEBUG_CODE( if(LimitStr!=0) DISPMSG("??????????!???(%s)??????0?????\n", pInfo->m_pszName ); ); } return ValidLimitAll( GetSTR(pCharInfo), LimitStr); } //---------------------------------------------------------------------------- /** */ BOOL ItemManager::ValidLimitDex( SCItemSlot & ItemSlot ) const { PlayerAttributes * pCharInfo = g_pHero->GetPlayerAttribute(); BASE_PLAYERINFO * pPlayInfo = g_pHero->GetCharInfo(); BASE_ITEMINFO * pInfo = ItemInfoParser::Instance()->GetItemInfo( ItemSlot.GetCode() ); if( !pInfo ) return FALSE; WORD LimitDex = pInfo->m_wLimitDex; if( 0 == LimitDex ) return TRUE; if( ItemSlot.GetItemInfo()->IsWeapon() ) { if( ItemSlot.IsDivine() ) { LimitDex = pInfo->m_wDivLimitDex; } LimitDex = GlobalFunc::CalcLimitStat( LimitDex, &ItemSlot); } #ifdef _NA002823_WINGS_EQUIPMENTS_EXTENTION else if( ItemSlot.GetItemInfo()->IsArmor() || ItemSlot.IsWingItem()) #else else if( ItemSlot.GetItemInfo()->IsArmor()) #endif //_NA002823_WINGS_EQUIPMENTS_EXTENTION { // Divine ?????? ?????? ??? ???? : ???? ???? LimitStr???? ???.S if( ItemSlot.IsDivine() ) { LimitDex = pInfo->m_wDivLimitDex; } LimitDex= GlobalFunc::CalcLimitStat( LimitDex, &ItemSlot); } else { DEBUG_CODE( if(LimitDex!=0) DISPMSG("??????????!???(%s)??????0?????\n", pInfo->m_pszName ); ); } // ???? ???? return ValidLimitAll( GetDEX(pCharInfo), LimitDex); } //---------------------------------------------------------------------------- /** */ BOOL ItemManager::ValidLimitInt( SCItemSlot & ItemSlot ) const { PlayerAttributes * pCharInfo = g_pHero->GetPlayerAttribute(); BASE_PLAYERINFO * pPlayInfo = g_pHero->GetCharInfo(); BASE_ITEMINFO * pInfo = ItemInfoParser::Instance()->GetItemInfo( ItemSlot.GetCode() ); if( !pInfo ) return FALSE; WORD LimitInt = pInfo->m_wLimitInt; if( 0 == LimitInt ) return TRUE; if( ItemSlot.GetItemInfo()->IsWeapon() ) { if( ItemSlot.IsDivine() ) { LimitInt = pInfo->m_wDivLimitInt; } LimitInt = GlobalFunc::CalcLimitStat( LimitInt, &ItemSlot); } #ifdef _NA002823_WINGS_EQUIPMENTS_EXTENTION else if( ItemSlot.GetItemInfo()->IsArmor() || ItemSlot.IsWingItem()) #else else if( ItemSlot.GetItemInfo()->IsArmor()) #endif //_NA002823_WINGS_EQUIPMENTS_EXTENTION { // Divine ?????? ?????? ??? ???? : ???? ???? LimitStr???? ???. if( ItemSlot.IsDivine() == 1 ) { LimitInt = pInfo->m_wDivLimitInt; } LimitInt= GlobalFunc::CalcLimitStat( LimitInt, &ItemSlot); } else { DEBUG_CODE( if(LimitInt!=0) DISPMSG("??????????!???(%s)??????0?????\n", pInfo->m_pszName ); ); } // ???? ???? return ValidLimitAll( GetINT(pCharInfo), LimitInt); } //---------------------------------------------------------------------------- /** */ BOOL ItemManager::ValidLimitLevel( SCItemSlot & ItemSlot ) const { PlayerAttributes * pCharInfo = g_pHero->GetPlayerAttribute(); BASE_PLAYERINFO * pPlayInfo = g_pHero->GetCharInfo(); BASE_ITEMINFO * pInfo = ItemInfoParser::Instance()->GetItemInfo( ItemSlot.GetCode() ); if( !pInfo ) return FALSE; WORD LimitLV = pInfo->m_LimitEqLevel; if( 0 == LimitLV ) return TRUE; // ???? ???? if( g_pHero->GetLevel() < LimitLV ) { return FALSE; } return TRUE; } //---------------------------------------------------------------------------- /** */ BOOL ItemManager::ValidLimitSkillExp1( SCItemSlot & ItemSlot ) const { PlayerAttributes * pCharInfo = g_pHero->GetPlayerAttribute(); BASE_PLAYERINFO * pPlayInfo = g_pHero->GetCharInfo(); BASE_ITEMINFO * pInfo = ItemInfoParser::Instance()->GetItemInfo( ItemSlot.GetCode() ); if( !pInfo ) return FALSE; WORD LimitSkill = pInfo->m_wLimitSkil1; if( 0 == LimitSkill ) return TRUE; if( ItemSlot.GetItemInfo()->IsWeapon() ) { if( ItemSlot.IsDivine() ) { LimitSkill = pInfo->m_wDivLimitSkill1; } LimitSkill= GlobalFunc::CalcLimitStat( LimitSkill, &ItemSlot); } #ifdef _NA002823_WINGS_EQUIPMENTS_EXTENTION else if( ItemSlot.GetItemInfo()->IsArmor() || ItemSlot.IsWingItem()) #else else if( ItemSlot.GetItemInfo()->IsArmor()) #endif //_NA002823_WINGS_EQUIPMENTS_EXTENTION { if( ItemSlot.IsDivine() ) { LimitSkill = pInfo->m_wDivLimitSkill1; } LimitSkill= GlobalFunc::CalcLimitStat( LimitSkill, &ItemSlot); } else { DEBUG_CODE( if(LimitSkill!=0) DISPMSG("??????????!???(%s)??????0?????\n", pInfo->m_pszName ); ); } // ???? ???? return ValidLimitAll( GetExperty1(pCharInfo), LimitSkill); } //---------------------------------------------------------------------------- /** */ BOOL ItemManager::ValidLimitSkillExp2( SCItemSlot & ItemSlot ) const { PlayerAttributes * pCharInfo = g_pHero->GetPlayerAttribute(); BASE_PLAYERINFO * pPlayInfo = g_pHero->GetCharInfo(); BASE_ITEMINFO * pInfo = ItemInfoParser::Instance()->GetItemInfo( ItemSlot.GetCode() ); if( !pInfo ) return FALSE; WORD LimitSkill = pInfo->m_wLimitSkil2; if( 0 == LimitSkill ) return TRUE; if( ItemSlot.GetItemInfo()->IsWeapon() ) { if( ItemSlot.IsDivine() ) { LimitSkill = pInfo->m_wDivLimitSkill2; } LimitSkill = GlobalFunc::CalcLimitStat( LimitSkill, &ItemSlot); } #ifdef _NA002823_WINGS_EQUIPMENTS_EXTENTION else if( ItemSlot.GetItemInfo()->IsArmor() || ItemSlot.IsWingItem()) #else else if( ItemSlot.GetItemInfo()->IsArmor()) #endif //_NA002823_WINGS_EQUIPMENTS_EXTENTION { if( ItemSlot.IsDivine() ) { LimitSkill = pInfo->m_wDivLimitSkill2; } LimitSkill = GlobalFunc::CalcLimitStat( LimitSkill, &ItemSlot); } else { DEBUG_CODE( if(LimitSkill!=0) DISPMSG("??????????!???(%s)??????0?????\n", pInfo->m_pszName ); ); } // ???? ???? return ValidLimitAll( GetExperty2(pCharInfo), LimitSkill); } BOOL ItemManager::ValidLimitVit( SCItemSlot & ItemSlot ) const { PlayerAttributes * pCharInfo = g_pHero->GetPlayerAttribute(); BASE_PLAYERINFO * pPlayInfo = g_pHero->GetCharInfo(); const BASE_ITEMINFO * pInfo = ItemSlot.GetItemInfo(); WORD LimitVit = pInfo->m_wLimitVit; if( 0 == LimitVit ) return TRUE; if( ItemSlot.GetItemInfo()->IsWeapon() ) { if( ItemSlot.IsDivine() ) { LimitVit = pInfo->m_wDivLimitVit; } LimitVit= GlobalFunc::CalcLimitStat( LimitVit, &ItemSlot); } #ifdef _NA002823_WINGS_EQUIPMENTS_EXTENTION else if( ItemSlot.GetItemInfo()->IsArmor() || ItemSlot.IsWingItem()) #else else if( ItemSlot.GetItemInfo()->IsArmor()) #endif //_NA002823_WINGS_EQUIPMENTS_EXTENTION { // Divine ?????? ?????? ??? ???? : ???? ???? LimitVit???? ???. if( ItemSlot.IsDivine() ) { LimitVit = pInfo->m_wDivLimitVit; } LimitVit = GlobalFunc::CalcLimitStat( LimitVit, &ItemSlot); } else { //DEBUG_CODE( if(LimitVit!=0) SUNLOG( eFULL_LOG, "[CEquipmentSlotContainer::ValidLimitVit] ??????????!???(%s)??????0?????", pInfo->m_pszName ); ); assert(!"??????????!???(%s)??????0?????"); } // ???? ???? return ValidLimitAll( GetVIT(pCharInfo), LimitVit ); } BOOL ItemManager::ValidLimitSpr( SCItemSlot & ItemSlot ) const { PlayerAttributes * pCharInfo = g_pHero->GetPlayerAttribute(); BASE_PLAYERINFO * pPlayInfo = g_pHero->GetCharInfo(); const BASE_ITEMINFO * pInfo = ItemSlot.GetItemInfo(); if(!pInfo) return FALSE; WORD LimitSpr = pInfo->m_wLimitSpr; if( 0 == LimitSpr ) return TRUE; if( ItemSlot.GetItemInfo()->IsWeapon() ) { if( ItemSlot.IsDivine() ) { LimitSpr = pInfo->m_wDivLimitSpr; } LimitSpr = GlobalFunc::CalcLimitStat( LimitSpr, &ItemSlot); } #ifdef _NA002823_WINGS_EQUIPMENTS_EXTENTION else if( ItemSlot.GetItemInfo()->IsArmor() || ItemSlot.IsWingItem()) #else else if( ItemSlot.GetItemInfo()->IsArmor()) #endif //_NA002823_WINGS_EQUIPMENTS_EXTENTION { // Divine ?????? ?????? ??? ???? : ???? ???? LimitStr???? ???. if( ItemSlot.IsDivine() ) { LimitSpr = pInfo->m_wDivLimitSpr; } LimitSpr = GlobalFunc::CalcLimitStat( LimitSpr, &ItemSlot); } else { assert(!"??????????!???(%s)??????0?????"); } // ???? ???? return ValidLimitAll( GetSPR(pCharInfo), LimitSpr ); } //---------------------------------------------------------------------------- /** @remark [prev] pSlot == [Item], [Skill], [Quick] @return true, false */ BOOL ItemManager::CanLinkQuick( SLOTIDX AtIndex, POSTYPE ToPos, const SCSlot * IN pSlot) { if (!pSlot) { return FALSE; } TCHAR szMessage[INTERFACE_STRING_LENGTH]; if (ST_ITEM != pSlot->GetSlotType() && ST_SKILL != pSlot->GetSlotType() && ST_QUICK != pSlot->GetSlotType()) { // ??????? ??????? ????? ?¡À? ???? ?? ?????? g_InterfaceManager.GetInterfaceString( eST_QUICK_LINK_ONLY_ITEM_AND_SKILL, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); return FALSE; } if (pSlot->GetSlotType() == ST_ITEM) { SCItemSlot * pItemSlot = (SCItemSlot *)pSlot; const BASE_ITEMINFO * pInfo = pItemSlot->GetItemInfo(); if (!pInfo) { return FALSE; } // ???? / ??? ?????? ?????? if (pInfo->m_byMaterialType < eITEM_MATERIAL_TYPE_CAN_EQUIP || (pItemSlot->IsEtheriaItem() || pItemSlot->IsShellItem()) ) { // ???? ?? ??? ?????? ??????? ?? ??? ?©ª? ?? ???. g_InterfaceManager.GetInterfaceString( eST_ITEM_MATERIAL_TYPE_CAN_EQUIP, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); return FALSE; } } else if (pSlot->GetSlotType() == ST_SKILL) { ROOT_SKILLINFO *pInfo = SkillInfoParser::Instance()->GetInfo(pSlot->GetCode()); if (!pInfo->IsSkill()) { // ??????? ????? ??? ?¡À????? ?? ??????. g_InterfaceManager.GetInterfaceString( eST_STYLE_ONLY_STYLE_SLOT, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); return FALSE; } } return TRUE; } //---------------------------------------------------------------------------- /** */ BOOL ItemManager::CanLinkStyleQuick( SLOTIDX AtIndex, POSTYPE ToPos, const SCSlot * IN pSlot) { if (!pSlot) { return FALSE; } TCHAR szMessage[INTERFACE_STRING_LENGTH]; if (ST_SKILL != pSlot->GetSlotType() && ST_STYLE_QUICK != pSlot->GetSlotType()) { // ????? ? ???? ??????? ????? ?¡À? ???? ?? ??????. g_InterfaceManager.GetInterfaceString( eST_STYLE_SLOT_ONLY_ITEM_AND_SKILL, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); return FALSE; } if (pSlot->GetSlotType() == ST_SKILL) { ROOT_SKILLINFO *pInfo = SkillInfoParser::Instance()->GetInfo(pSlot->GetCode()); if (pInfo->IsSkill()) { // ????? ?? ??? ?¡À????? ?? ??????. g_InterfaceManager.GetInterfaceString( eST_STYLE_NOT_QUICK_SLOT, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); return FALSE; } } StyleContainer *pContainer = (StyleContainer *)GetContainer(SI_STYLE); if (!pContainer) { return FALSE; } // ??? ???????? ??? ?????? ??? // ?????? ??????. if (!pContainer->IsEmpty(ToPos)) { return FALSE; } if (ST_STYLE_QUICK == pSlot->GetSlotType()) { StyleSlot * pQuickSlot = (StyleSlot *)pSlot; if ( pContainer->IsExistSameCodeItem(pQuickSlot->GetOrgCode()) || pContainer->IsExistSameSerialItem(pQuickSlot->GetSerial()) ) { // ??? ??? ?????? ????? ??????. g_InterfaceManager.GetInterfaceString( eST_SLOT_NOT_EMPTY, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); return FALSE; } } else { if ( pContainer->IsExistSameCodeItem(pSlot->GetCode() ) || pContainer->IsExistSameSerialItem(pSlot->GetSerial() ) ) { // ??? ??? ?????? ????? ??????. g_InterfaceManager.GetInterfaceString( eST_SLOT_NOT_EMPTY, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); return FALSE; } } return TRUE; } //---------------------------------------------------------------------------- /** */ eRANK_LEVEL ItemManager::GetCompRankLevel(SCItemSlot & rItemSlot ) { switch (rItemSlot.GetRank()) { case RANK_F: case RANK_E: case RANK_D: case RANK_C: return RANK_LOW; case RANK_B: case RANK_MA: case RANK_A: return RANK_MIDDLE; case RANK_PA: case RANK_MS: case RANK_S: case RANK_PS: return RANK_HIGH; } assert( !"????? ???????." ); return RANK_LOW; } //---------------------------------------------------------------------------- /** */ eENCHANTLEVEL ItemManager::GetCompEnchantLevel(SCItemSlot & rItemSlot ) { switch( rItemSlot.GetEnchant() ) { case 0: case 1: case 2: case 3: case 4: case 5: return ENCHANT_LOW; case 6: case 7: case 8: return ENCHANT_MIDDLE; case 9: case 10: case 11: case 12: return ENCHANT_HIGH; #ifdef _NA_003966_20111227_ADD_ENCHANT case 13: case 14: case 15: return ENCHANT_HIGHEST; #endif //_NA_003966_20111227_ADD_ENCHANT } assert( !"????? ??©­?????." ); return ENCHANT_LOW; } BOOL ItemManager::CanMoveEquipItem( SLOTIDX AtIndex, POSTYPE AtPos, BOOL bOutputMsg /*= FALSE*/ ) { if (!g_pHero) { return FALSE; } SCSlotContainer *pAtContainer = g_pHero->GetSlotContainer( AtIndex ); if (!pAtContainer) { return FALSE; } // ??? ??©ø?? if (pAtContainer->IsEmpty(AtPos)) { return FALSE; } SCItemSlot & rItemSlot = (SCItemSlot &)pAtContainer->GetSlot(AtPos ); if ( !rItemSlot.GetItemInfo() ) { return FALSE; } POSTYPE EQPos = 255; BOOL bCorrectPos = GetEquipPosition(rItemSlot, EQPos); EQPos = AtPos; if (!bCorrectPos ) { return FALSE; } BOOL bEmpty = IsEmptySlotPos(AtIndex, EQPos); if (bEmpty) { // ????? return TRUE; } else { // ??????? ???? ??? ??? // 1. ??? ?? ?? ???? ( ???? ??????? ??? ???????? ) BOOL bUnEquipItem = CanUnEquipItem(EQPos, TRUE); if ( !bUnEquipItem ) { return FALSE; } } return TRUE; } //---------------------------------------------------------------------------- /** */ BOOL ItemManager::CanMoveUnEquipItem( SLOTIDX AtIndex, POSTYPE AtPos, BOOL bOutputMsg /*= FALSE*/ ) { if (!g_pHero) return FALSE; SCSlotContainer * pAtContainer = g_pHero->GetSlotContainer( AtIndex ); if( !pAtContainer) return FALSE; // ??? ??©ø?? if ( pAtContainer->IsEmpty( AtPos ) ) return FALSE; SCItemSlot & rItemSlot = (SCItemSlot &)pAtContainer->GetSlot(AtPos ); if ( !rItemSlot.GetItemInfo() ) { return FALSE; } POSTYPE EQPos = 255; BOOL bCorrectPos = GetEquipPosition(rItemSlot, EQPos); EQPos = AtPos; if (!bCorrectPos ) { return FALSE; } BOOL bEmpty = IsEmptySlotPos(AtIndex, EQPos); if (bEmpty) { // ????? return TRUE; } else { // ??????? ???? ??? ??? // 1. ??? ?? ?? ???? ( ???? ??????? ??? ???????? ) BOOL bUnEquipItem = CanUnEquipItem(EQPos, TRUE); if ( !bUnEquipItem ) { return FALSE; } } return TRUE; } //------------------------------------------------------------------------------------------- /** */ BOOL ItemManager::CanUnEquipItem( POSTYPE ToPos, BOOL bOutputMsg) { return TRUE; //?????? ????? ??????????. } //---------------------------------------------------------------------------- /** */ BOOL ItemManager::CanEquip( SLOTIDX AtIndex,POSTYPE AtPos, POSTYPE ToPos, BOOL bOutputMsg /*= TRUE*/, BOOL bTransformCheck ) { if (!g_pHero) return FALSE; if(bTransformCheck && g_pHero->GetTransformData().GetTransFormProcessType()!=TRANSFORM_PROCESS_NONE) { return FALSE; } if(g_pHero->IsTransForm()&&bTransformCheck) { return FALSE; } SCSlotContainer * pAtContainer = g_pHero->GetSlotContainer( AtIndex ); if( !pAtContainer) return FALSE; // ??? ??©ø?? if( pAtContainer->IsEmpty( AtPos ) ) return FALSE; SCSlot & rFromSlot = pAtContainer->GetSlot( AtPos ); assert(rFromSlot.GetSlotType() == ST_ITEM); if (rFromSlot.GetSlotType() != ST_ITEM ) { return FALSE; } BASE_ITEMINFO * pInfo = ItemInfoParser::Instance()->GetItemInfo( rFromSlot.GetCode() ); if (!pInfo) { return FALSE; } // ???? ???????? if( 0 == pInfo->m_byMaterialType ) { return FALSE; } TCHAR szMessage[INTERFACE_STRING_LENGTH]; // ???? ???? ???????? ? if ( !CanEquipClass(g_pHero, pInfo ) ) { if ( bOutputMsg ) { // ?????? ?? ???? ????? ????. g_InterfaceManager.GetInterfaceString( eST_CAN_NOT_EQUIP_CLASS, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); } return FALSE; } if (CanEquipByGender(g_pHero, pInfo) == FALSE) { if ( bOutputMsg ) { // 70294 ?????? ?? ???? ????? ????.(eST_CAN_NOT_EQUIP_CLASS) g_InterfaceManager.GetInterfaceString(eST_CAN_NOT_EQUIP_CLASS, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage); } return FALSE; } SCSlotContainer * pContainer= g_pHero->GetSlotContainer( SI_EQUIPMENT ); //????? ??? ???????? ?????? ??? if(pInfo->m_wType==eITEMTYPE_ELEMENTALIST_KALBUS_ACCESSORY&&pContainer) { //??? ???? ????? ??? SCSlot & rAcc1Slot = pContainer->GetSlot( EquipmentContainer::EQUIP_SACCESSORY1 ); BASE_ITEMINFO * pItemInfo = ItemInfoParser::Instance()->GetItemInfo( rAcc1Slot.GetCode() ); //1 if(pItemInfo&& pItemInfo->m_wType==eITEMTYPE_ELEMENTALIST_KALBUS_ACCESSORY) { if(ToPos== EquipmentContainer::EQUIP_SACCESSORY2|| ToPos== EquipmentContainer::EQUIP_SACCESSORY3) { if ( bOutputMsg ) { // ??? ???????? ??? ???? ??? ???? g_InterfaceManager.GetInterfaceString( eST_NOT_USE_DUPLICATION, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); } return FALSE; } } //2 SCSlot & rAcc2Slot = pContainer->GetSlot( EquipmentContainer::EQUIP_SACCESSORY2 ); pItemInfo = ItemInfoParser::Instance()->GetItemInfo( rAcc2Slot.GetCode() ); if(pItemInfo&& pItemInfo->m_wType==eITEMTYPE_ELEMENTALIST_KALBUS_ACCESSORY) { if(ToPos== EquipmentContainer::EQUIP_SACCESSORY1|| ToPos== EquipmentContainer::EQUIP_SACCESSORY3) { if ( bOutputMsg ) { // ??? ???????? ??? ???? ??? ???? g_InterfaceManager.GetInterfaceString( eST_NOT_USE_DUPLICATION, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); } return FALSE; } } //3 SCSlot & rAcc3Slot = pContainer->GetSlot( EquipmentContainer::EQUIP_SACCESSORY3 ); pItemInfo = ItemInfoParser::Instance()->GetItemInfo( rAcc3Slot.GetCode() ); if(pItemInfo&& pItemInfo->m_wType==eITEMTYPE_ELEMENTALIST_KALBUS_ACCESSORY) { if(ToPos== EquipmentContainer::EQUIP_SACCESSORY1|| ToPos== EquipmentContainer::EQUIP_SACCESSORY2) { if ( bOutputMsg ) { // ??? ???????? ??? ???? ??? ???? g_InterfaceManager.GetInterfaceString( eST_NOT_USE_DUPLICATION, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); } return FALSE; } } } if (GENERALPARAM->IsNet()) { // ???? ????. if ( !CanEquipLimit((SCItemSlot &)rFromSlot, bOutputMsg)) { return FALSE; } } // ????¥å? ???? ??????? switch( pInfo->m_wEqPos ) { case eEQUIPCONTAINER_PROTECTOR: { return BOOL(ToPos == EquipmentContainer::EQUIP_PROTECTOR ); } break; case eEQUIPCONTAINER_RING1: case eEQUIPCONTAINER_RING2: { return BOOL(ToPos == EquipmentContainer::EQUIP_RING1 || ToPos == EquipmentContainer::EQUIP_RING2 ); } break; case eEQUIPCONTAINER_WEAPON: { return BOOL(ToPos == EquipmentContainer::EQUIP_WEAPON1 ); } break; case eEQUIPCONTAINER_SHIRTS: { return BOOL(ToPos == EquipmentContainer::EQUIP_SHIRTS ); } break; case eEQUIPCONTAINER_BOOTS: { return BOOL(ToPos == EquipmentContainer::EQUIP_BOOTS ); } break; case eEQUIPCONTAINER_PANTS: { return BOOL(ToPos == EquipmentContainer::EQUIP_PANTS ); } break; case eEQUIPCONTAINER_BELT: { return BOOL(ToPos == EquipmentContainer::EQUIP_BELT ); } break; case eEQUIPCONTAINER_HELMET: { return BOOL(ToPos == EquipmentContainer::EQUIP_HELMET ); } break; case eEQUIPCONTAINER_ARMOR: { return BOOL(ToPos == EquipmentContainer::EQUIP_ARMOR ); } break; case eEQUIPCONTAINER_GLOVE: { return BOOL(ToPos == EquipmentContainer::EQUIP_GLOVE ); } break; case eEQUIPCONTAINER_NECKLACE: { return BOOL(ToPos == EquipmentContainer::EQUIP_NECKLACE ); } break; case eEQUIPCONTAINER_SACCESSORY1: case eEQUIPCONTAINER_SACCESSORY2: case eEQUIPCONTAINER_SACCESSORY3: { return BOOL(ToPos == EquipmentContainer::EQUIP_SACCESSORY1 || ToPos == EquipmentContainer::EQUIP_SACCESSORY2 || ToPos == EquipmentContainer::EQUIP_SACCESSORY3); } break; case eEQUIPCONTAINER_CHARGE1: case eEQUIPCONTAINER_CHARGE2: case eEQUIPCONTAINER_CHARGE3: case eEQUIPCONTAINER_CHARGE4: case eEQUIPCONTAINER_CHARGE5: { int iExtraChargeItemSlot = 0; if( g_pHero && g_pHero->GetCharInfo() ) { iExtraChargeItemSlot = g_pHero->GetCharInfo()->m_ExtraEquipCashSlotCount; } bool bCanEquip = (ToPos == EquipmentContainer::EQUIP_CHARGE1|| ToPos == EquipmentContainer::EQUIP_CHARGE2 || ToPos == EquipmentContainer::EQUIP_CHARGE3); if( iExtraChargeItemSlot == 2) { bCanEquip = (bCanEquip || ToPos == EquipmentContainer::EQUIP_CHARGE4 || ToPos == EquipmentContainer::EQUIP_CHARGE5); } return bCanEquip; } #ifdef _GS_GSP_REMOVE_PCROOM_SLOT //no operation #else case eEQUIPCONTAINER_PC_ROOM1: case eEQUIPCONTAINER_PC_ROOM2: case eEQUIPCONTAINER_PC_ROOM3: { return BOOL(ToPos == EquipmentContainer::EQUIP_PC_ROOM1 || ToPos == EquipmentContainer::EQUIP_PC_ROOM2 || ToPos == EquipmentContainer::EQUIP_PC_ROOM3); } break; #endif//_GS_GSP_REMOVE_PCROOM_SLOT default: { return FALSE; } } return TRUE; } BOOL ItemManager::IsExistCompositeMaterials( eITEMCOMPOSITECODE eItemCompositeType, SLOTIDX fromSlotIndex) { sITEMCOMPOSITE *pInfo = ItemCompositeParser::Instance()->GetCompositeInfo(eItemCompositeType); if (!pInfo) { return FALSE; } SCSlotContainer *pContainer = GetContainer( fromSlotIndex ); if (!pContainer) { return FALSE; } BOOL bRet = FALSE; // ??? ?????? int i = 0; for (; i < pInfo->m_byMatCount; ++i) { CODETYPE ItemCode = pInfo->m_sCompositeMaterials[i].m_dwCompositeMaterialCode; int iMaterialCount = pInfo->m_sCompositeMaterials[i].m_bySpendMaterialNum; int iAccMaterialCount = 0; // ???? Count BASE_ITEMINFO * pBaseInfo = (BASE_ITEMINFO *)ItemInfoParser::Instance()->GetItemInfo(ItemCode); if (!pBaseInfo) { // ?????? ?????? ????????. return FALSE; } int iSlotIndex = 0; for (; iSlotIndex < pContainer->GetMaxSlotNum(); ++iSlotIndex ) { if (pContainer->IsEmpty(iSlotIndex)) continue; SCItemSlot & rItemSlot = (SCItemSlot &)pContainer->GetSlot(iSlotIndex); // ?????? ??? ?????? if (rItemSlot.GetCode() == ItemCode) { if ( iMaterialCount > 1) { iMaterialCount -= rItemSlot.GetNum(); if (iMaterialCount <= 0) { bRet = TRUE; break; } } else { iMaterialCount = 0; bRet = TRUE; break; } } } if ( iMaterialCount > 0 ) { return FALSE; } } // ??? ?? if (g_pHero && g_pHero->GetMoney() >= pInfo->m_Money ) { bRet = TRUE; } else { bRet = FALSE; } return bRet; } int ItemManager::GetSlotIndex(SLOTIDX FromSlotIdx,eWASTETYPE type) { SCSlotContainer * pContainer = GetContainer( FromSlotIdx ); if ( !pContainer ) { return -1; } for ( int i = 0; i < pContainer->GetMaxSlotNum(); ++i) { if ( pContainer->IsEmpty(i) ) continue; SCSlot & rSlot = pContainer->GetSlot(i); BASE_ITEMINFO * pItemInfo = ItemInfoParser::Instance()->GetItemInfo( rSlot.GetCode() ); if ( pItemInfo &&pItemInfo->m_byWasteType==type) { return i; } } return -1; } BOOL ItemManager::IsExistItem(SLOTIDX from_slot_index, CODETYPE item_code, int item_num, ItemType* item_type_ptr/* = NULL*/, DWORD item_type_index/* = 0*/) { SCSlotContainer* container_ptr = GetContainer(from_slot_index); if (container_ptr == NULL) { return FALSE; } if (item_num <= 0) { return FALSE; } BASE_ITEMINFO* item_info_ptr = ItemInfoParser::Instance()->GetItemInfo(item_code); if (item_info_ptr == NULL) { return FALSE; } BOOL is_exist = FALSE; //?????? ????? ??????????????? ?????? ????? ???ø»????? int max_slot_num = container_ptr->GetMaxSlotNum(); bool is_found_item = false; for (int slot_pos = 0; slot_pos < max_slot_num; ++slot_pos) { if (container_ptr->IsEmpty(slot_pos)) { continue; } is_found_item = false; SCItemSlot& item_slot_ref = static_cast(container_ptr->GetSlot(slot_pos)); if (item_slot_ref.GetCode() == item_code) { //???????????(??©­,???,???) ?????? ?????? if(item_type_ptr != NULL) { if((item_slot_ref.GetEnchant() == item_type_ptr->GetEnchant()) && (item_slot_ref.GetRank() == item_type_ptr->GetRank()) && (nsSlot::ItemTypeChanger::IsEqualItemType(item_slot_ref, item_type_ptr) == true)) { is_found_item = true; } } else { if (item_type_index == 0) { if ((item_slot_ref.IsEtheriaItem() == false) && (item_slot_ref.IsShellItem() == false)) { is_found_item = true; } } else { DWORD item_type_value = nsSlot::ItemTypeChanger::GetKindOfItemType(item_slot_ref); if ((item_type_index - 1) == item_type_value) { is_found_item = true; } } } if (is_found_item == true) { if (item_slot_ref.GetNum() >= item_num) { is_exist = TRUE; break; } else { item_num -= item_slot_ref.GetNum(); } } } } return is_exist; } BOOL ItemManager::SpendItem(SLOTIDX from_slot_index, CODETYPE item_code, int item_num, ItemType* item_type_ptr/* = NULL*/, DWORD item_type_index/* = 0*/) { SCSlotContainer* container_ptr = GetContainer(from_slot_index); if (container_ptr == NULL) { return FALSE; } if (item_num <= 0) { return FALSE; } BASE_ITEMINFO* item_info = ItemInfoParser::Instance()->GetItemInfo(item_code); if (item_info == NULL) { return FALSE; } BOOL result = FALSE; bool is_found_item = false; int max_slot_num = container_ptr->GetMaxSlotNum(); for (int slot_pos = 0; slot_pos < max_slot_num; ++slot_pos) { if (container_ptr->IsEmpty(slot_pos)) { continue; } is_found_item = false; SCItemSlot& item_slot_ref = static_cast(container_ptr->GetSlot(slot_pos)); if (item_slot_ref.GetCode() == item_code) { //???????????(??©­,???,???) ?????? ?????? if(item_type_ptr) { if ((item_slot_ref.GetEnchant() == item_type_ptr->GetEnchant()) && (item_slot_ref.GetRank() == item_type_ptr->GetRank()) && (nsSlot::ItemTypeChanger::IsEqualItemType(item_slot_ref, item_type_ptr) == true)) { is_found_item = true; } } else { if (item_type_index == 0) { if ((item_slot_ref.IsEtheriaItem() == false) && (item_slot_ref.IsShellItem() == false)) { is_found_item = true; } } else { DWORD item_type_value = nsSlot::ItemTypeChanger::GetKindOfItemType(item_slot_ref); if ((item_type_index - 1) == item_type_value) { is_found_item = true; } } } if (is_found_item == true) { if ( item_slot_ref.GetNum() < item_num ) { item_num -= item_slot_ref.GetNum(); container_ptr->DeleteSlot(slot_pos, NULL); } else if (item_slot_ref.GetNum() == item_num) { container_ptr->DeleteSlot(slot_pos, NULL); result = TRUE; break; } else { item_slot_ref.SetNum(item_slot_ref.GetNum() - item_num); result = TRUE; break; } } } } return result; } //------------------------------------------------------------------------------------------- /** */ BOOL ItemManager::DeleteItem(SLOTIDX FromSlotIdx, POSTYPE FromPos, int iItemNum, eDELETETOTALTYPE eDeleteType /*= DELETE_NONE*/) { TCHAR szItemName[INTERFACE_STRING_LENGTH]; TCHAR szMessage[INTERFACE_STRING_LENGTH] = {0,}; TCHAR szResult[INTERFACE_STRING_LENGTH] = {0,}; SCSlotContainer * pContainer = GetContainer( FromSlotIdx ); if ( !pContainer ) { return FALSE; } if ( iItemNum <= 0 ) { return FALSE; } if ( pContainer->IsEmpty(FromPos) ) { return FALSE; } SCItemSlot & rSlot = (SCItemSlot &)pContainer->GetSlot(FromPos); g_InterfaceManager.GetItemName( rSlot.GetCode(), szItemName, INTERFACE_STRING_LENGTH ); if ( rSlot.GetNum() > iItemNum ) { rSlot.SetNum( rSlot.GetNum() - iItemNum ); } else { pContainer->DeleteSlot(FromPos, NULL); } switch (eDeleteType) { case COMPOSE_USE: { g_InterfaceManager.GetInterfaceString( 5709, szMessage, INTERFACE_STRING_LENGTH); Snprintf( szResult, INTERFACE_STRING_LENGTH-1, szMessage, szItemName); } break; case QUEST_DELETE: { g_InterfaceManager.GetInterfaceString( 5709, szMessage, INTERFACE_STRING_LENGTH); Snprintf( szResult, INTERFACE_STRING_LENGTH-1, szMessage, szItemName); } break; case DELETE_STAT_INIT_ITEM: { // 5952 [%s]?????? %d???? ??????????. g_InterfaceManager.GetInterfaceString( 5952, szMessage, INTERFACE_STRING_LENGTH); Snprintf( szResult, INTERFACE_STRING_LENGTH-1, szMessage, szItemName, iItemNum); if (g_pHero) { g_pHero->OnUseItemWithCoolTime( rSlot.GetCode() ); } } break; default: return TRUE; break; } GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szResult); return TRUE; } BOOL ItemManager::DeleteItemCmd(SLOTIDX FromSlotIdx, POSTYPE FromPos, int iItemNum, eITEM_DELETE_RESULT eDeleteType) { TCHAR szItemName[INTERFACE_STRING_LENGTH]; TCHAR szMessage[INTERFACE_STRING_LENGTH] = {0,}; TCHAR szResult[INTERFACE_STRING_LENGTH] = {0,}; SCSlotContainer* pContainer = GetContainer(FromSlotIdx); if (!pContainer) { return FALSE; } if (iItemNum <= 0) { return FALSE; } if (pContainer->IsEmpty(FromPos)) { return FALSE; } SCItemSlot& rSlot = (SCItemSlot&)pContainer->GetSlot(FromPos); g_InterfaceManager.GetItemName( rSlot.GetCode(), szItemName, INTERFACE_STRING_LENGTH ); if (rSlot.GetNum() > iItemNum) { rSlot.SetNum(rSlot.GetNum() - iItemNum); } else { if (rSlot.IsWayPointItem()) { // 6040 ?????? ???? ???©£??? ???????????. TCHAR szWayPointDeleteMsg[INTERFACE_STRING_LENGTH] = {0,}; g_InterfaceManager.GetInterfaceString(6040, szWayPointDeleteMsg, INTERFACE_STRING_LENGTH); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT,szWayPointDeleteMsg); } #ifdef _YMS_AUTOBOT_GAME const BASE_ITEMINFO* item_info = rSlot.GetItemInfo(); if ((item_info != NULL) && (item_info->m_wType == eITEMTYPE_AUTO_HUNTING)) { //! ???????? ???? ??? ??????? ?????? ??????. Autobot::Instance()->Stop(true); g_InterfaceManager.ShowDialog(uiAutobotPlay::kDialog_ID, FALSE); } #endif //_YMS_AUTOBOT_GAME pContainer->DeleteSlot(FromPos, NULL); } switch (eDeleteType) { case RC_ITEM_DELETE_EXPIRED_CHARGE_ITEM: // ????? ?????? ??? ?? ????. { // 5870 [%s] ???????? ??? ???? ?????? ????????????. g_InterfaceManager.GetInterfaceString( 5870, szMessage, INTERFACE_STRING_LENGTH); Snprintf( szResult, INTERFACE_STRING_LENGTH-1, szMessage, szItemName); uiSystemMan* pSystemMan = (uiSystemMan*)g_InterfaceManager.GetUserInterfaceManager(UIMAN_SYSTEM); if (pSystemMan) { pSystemMan->Sys_Verify(szResult); } return TRUE; } break; case RC_ITEM_DELETE_PORTAL_SUCCESS: { // ITEM_USE_ACK ?????? ??? DELETE?? ???????? ???? ???. if (g_pHero) { g_pHero->OnUseItemWithCoolTime(rSlot.GetCode()); } } break; case RC_ITEM_DELETE_PROTECT_DROP: { //5952 [%s]?????? %d???? ??????????. g_InterfaceManager.GetInterfaceString( 5952, szMessage, INTERFACE_STRING_LENGTH); Snprintf( szResult, INTERFACE_STRING_LENGTH-1, szMessage, szItemName, iItemNum); } break; case RC_ITEM_DELETE_REVENGE_STONE: default: return TRUE; break; } GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szResult); return TRUE; } BOOL ItemManager::AutoRegisterCompositeMaterials( eITEMCOMPOSITECODE eItemCompositeType, SLOTIDX atSlotIndex /*= SI_ENCHANT*/, SLOTIDX fromSlotIndex /*= SI_INVENTORY*/) { sITEMCOMPOSITE * pInfo = ItemCompositeParser::Instance()->GetCompositeInfo(eItemCompositeType); SCSlotContainer * pAtContainer = ItemManager::Instance()->GetContainer(atSlotIndex); SCSlotContainer * pFromContainer = ItemManager::Instance()->GetContainer(fromSlotIndex); // ??? ??????? ??? BOOL bRet = FALSE; // ??? ?????? int i = 0; for (; i < pInfo->m_byMatCount; ++i) { CODETYPE ItemCode = pInfo->m_sCompositeMaterials[i].m_dwCompositeMaterialCode; int iMaterialCount = pInfo->m_sCompositeMaterials[i].m_bySpendMaterialNum; SCItemSlot ItemSlot; ItemSlot.SetCode((SLOTCODE)ItemCode); ItemSlot.SetNum(iMaterialCount); pAtContainer->InsertSlot(i+1, ItemSlot); } return TRUE; } int ItemManager::GetOverlapItemCount( CODETYPE code, SLOTIDX AtIndex/* = SI_INVENTORY*/) { int iCount = 0; SCSlotContainer *pAtContainer = ItemManager::Instance()->GetContainer(AtIndex); if (!pAtContainer) { return iCount; } for (int i = 0; i < pAtContainer->GetMaxSlotNum(); ++i) { if (pAtContainer->IsEmpty(i)) continue; SCSlot & rSlot = pAtContainer->GetSlot(i); if ( code != rSlot.GetCode() ) continue; iCount += rSlot.GetNum(); } return iCount; } BOOL ItemManager::FindActiveChargeItem(eITEMTYPE eItemTypeInfo, POSTYPE & OUT rOutPos, SLOTIDX AtIndex) { SCSlotContainer *pAtContainer = ItemManager::Instance()->GetContainer(AtIndex); if (!pAtContainer) { return FALSE; } for (int i = 0; i < pAtContainer->GetMaxSlotNum(); ++i) { if (pAtContainer->IsEmpty(i)) continue; SCSlot & rSlot = pAtContainer->GetSlot(i); if ( rSlot.GetSlotType() == ST_ITEM ) { SCItemSlot & rItemSlot = (SCItemSlot &)rSlot; if ( rItemSlot.GetItemInfo()->m_wType == eItemTypeInfo) { BYTE charge_subtype = rItemSlot.GetItemRuleInfo().charge_sub_type; //1.???? ?????:????????? if (charge_subtype == eCHARGE_SUB_FIXED_AMOUNT) { rOutPos = i; return TRUE; }//2.????? ?????:????? ???? else if(charge_subtype == eCHARGE_SUB_FIXED_AMOUNT_EX && rItemSlot.IsProgressTime()) { rOutPos = i; return TRUE; } } } } return FALSE; } //------------------------------------------------------------------------------ /** FindFirstItem author : y2jinc desc : ?????? ?????? ???????? ?????? ??? ?????????? ??????? ???????? ???¡Æ ????? ???? ?????????. param : POSTYPE & OUT rOutPos - ???¡Æ ??? ???? ???????? ???? FALSE ?? ???????. */ BOOL ItemManager::FindFirstItem( CODETYPE code, POSTYPE & OUT rOutPos, SLOTIDX AtIndex /*= SI_INVENTORY*/) { SCSlotContainer * pAtContainer = ItemManager::Instance()->GetContainer(AtIndex); for (int i = 0; i < pAtContainer->GetMaxSlotNum(); ++i) { if (pAtContainer->IsEmpty(i)) continue; SCSlot & rSlot = pAtContainer->GetSlot(i); if (rSlot.GetCode() == code) { rOutPos = i; return TRUE; } } return FALSE; } BOOL ItemManager::FindFirstItem( eITEMTYPE eItemTypeInfo, POSTYPE & OUT rOutPos, SLOTIDX AtIndex /*= SI_INVENTORY*/) { SCSlotContainer * pAtContainer = ItemManager::Instance()->GetContainer(AtIndex); for (int i = 0; i < pAtContainer->GetMaxSlotNum(); ++i) { if (pAtContainer->IsEmpty(i)) continue; SCSlot & rSlot = pAtContainer->GetSlot(i); if ( rSlot.GetSlotType() == ST_ITEM ) { SCItemSlot & rItemSlot = (SCItemSlot &)rSlot; if ( rItemSlot.GetItemInfo()->m_wType == eItemTypeInfo) { rOutPos = i; return TRUE; } } } return FALSE; } //------------------------------------------------------------------------------ SCItemSlot* ItemManager::FindFirstItemSlot(SLOTIDX AtSlotIdx, eITEMTYPE item_type) { SCSlotContainer* slot_container = GetContainer(AtSlotIdx); if (slot_container == NULL) { return NULL; } POSTYPE max_slot = slot_container->GetMaxSlotNum(); for (int i = 0; i < max_slot; ++i) { if ((slot_container->IsEmpty(i) == TRUE) || (slot_container->GetSlot(i).GetSlotType() != ST_ITEM)) { continue; } SCItemSlot& item_slot = (SCItemSlot&)(slot_container->GetSlot(i)); const BASE_ITEMINFO* item_info = item_slot.GetItemInfo(); if (item_info != NULL) { if (item_info->m_wType == item_type) { return &item_slot; } } } return NULL; } //------------------------------------------------------------------------------ SCItemSlot* ItemManager::FindFirstItemSlot(SLOTIDX AtSlotIdx, eITEMTYPE item_type, eWASTETYPE waste_type) { SCSlotContainer* slot_container = GetContainer(AtSlotIdx); if (slot_container == NULL) { return NULL; } POSTYPE max_slot = slot_container->GetMaxSlotNum(); for (int i = 0; i < max_slot; ++i) { if ((slot_container->IsEmpty(i) == TRUE) || (slot_container->GetSlot(i).GetSlotType() != ST_ITEM)) { continue; } SCItemSlot& item_slot = (SCItemSlot&)(slot_container->GetSlot(i)); const BASE_ITEMINFO* item_info = item_slot.GetItemInfo(); if (item_info != NULL) { if ((item_info->m_wType == item_type) && (item_info->m_byWasteType == waste_type)) { return &item_slot; } } } return NULL; } //------------------------------------------------------------------------------ SCItemSlot* ItemManager::FindFirstItemSlot(SLOTIDX AtSlotIdx, SLOTCODE item_code) { SCSlotContainer* slot_container = GetContainer(AtSlotIdx); if (slot_container == NULL) { return NULL; } POSTYPE max_slot = slot_container->GetMaxSlotNum(); for (POSTYPE i = 0; i < max_slot; ++i) { if ((slot_container->IsEmpty(i) == TRUE) || (slot_container->GetSlot(i).GetSlotType() != ST_ITEM)) { continue; } SCItemSlot& item_slot = (SCItemSlot&)(slot_container->GetSlot(i)); if (item_slot.GetCode() == item_code) { return &item_slot; } } return NULL; } //------------------------------------------------------------------------------ SCItemSlot* ItemManager::FindFirstItemSlot(SLOTIDX AtSlotIdx, SLOTCODE item_code, NUMTYPE less_count) { SCSlotContainer* slot_container = GetContainer(AtSlotIdx); if (slot_container == NULL) { return NULL; } POSTYPE max_slot = slot_container->GetMaxSlotNum(); for (int i = 0; i < max_slot; ++i) { if ((slot_container->IsEmpty(i) == TRUE) || (slot_container->GetSlot(i).GetSlotType() != ST_ITEM)) { continue; } SCItemSlot& item_slot = (SCItemSlot&)(slot_container->GetSlot(i)); if ((item_slot.GetCode() == item_code) && (item_slot.GetNum() <= less_count)) { return &item_slot; } } return NULL; } //------------------------------------------------------------------------------ /** UpdateQuickInfo author : y2jinc desc : ?????????? ?????? ???????. */ VOID ItemManager::UpdateQuickInfo(eSlotContainerIndex container_index) { SCSlotContainer* pAtContainer = g_pHero->GetSlotContainer(container_index); if (!pAtContainer) { return; } SCSlotContainer* pInvenContainer = g_pHero->GetSlotContainer(SI_INVENTORY); if (!pInvenContainer) { return; } // skill?? ???? ?????????. // quick slot ?? ???????? ?????? ?????? ??????. for (int i = 0; i < pAtContainer->GetMaxSlotNum(); ++i) { if (pAtContainer->IsEmpty(i)) { continue; } QuickSlot& rQuickSlot = (QuickSlot&)pAtContainer->GetSlot(i); switch (rQuickSlot.GetOrgSlotType()) { case ST_ITEM: { POSTYPE FromPos; BASE_ITEMINFO* pItemInfo = NULL; pItemInfo = ItemInfoParser::Instance()->GetItemInfo(rQuickSlot.GetOrgCode()); if (!pItemInfo) { continue; } if (pItemInfo->IsCanUseWaste()) { BOOL bRet = ItemManager::Instance()->FindFirstItem(rQuickSlot.GetOrgCode(), FromPos); if (!bRet) { rQuickSlot.SetOverlapCount(0); rQuickSlot.SetStatus( SLOT_RENDER_STATE_DEACTIVATED ); rQuickSlot.SetOrgPos(INVALID_POSTYPE_VALUE); continue; } //GS_BUG_FIX:????? ???????????,???¡Æ ???????? ??????????¢¥? if (pItemInfo->m_wType == eITEMTYPE_ETHER_BULLET) { FromPos = rQuickSlot.GetOrgPos(); } rQuickSlot.SetOrgPos(FromPos); SCItemSlot& rItemSlot = (SCItemSlot&)pInvenContainer->GetSlot(FromPos); rQuickSlot.SetStatus(SLOT_RENDER_STATE_ACTIVATED); if (rItemSlot.IsOverlap()) { int OverlapCount = this->GetOverlapItemCount(rQuickSlot.GetOrgCode()); //GS_BUG_FIX:????? ???????????,?????????? ??????? ??????????? if (pItemInfo->m_wType == eITEMTYPE_ETHER_BULLET) { OverlapCount = rItemSlot.GetNum(); } assert(OverlapCount > 0); rQuickSlot.SetOverlapCount(OverlapCount); rQuickSlot.SetOrgSlot(&rItemSlot); } else { if (pItemInfo->m_wType == eITEMTYPE_ETHER_BULLET) { rQuickSlot.SetOverlapCount(0); rQuickSlot.SetStatus(SLOT_RENDER_STATE_DEACTIVATED); } } } else if (pItemInfo->IsCanOnlyUseWaste() || SCItemSlot::CanEquip(pItemInfo)) { SCSlotContainer* pFromContainer = GetContainer(rQuickSlot.GetOrgSlotIndex()); if (!pFromContainer) { rQuickSlot.SetStatus(SLOT_RENDER_STATE_DEACTIVATED); continue; } //GS_BUGFIX_QUICK:????? ???? ????? ???? ????? if (rQuickSlot.GetOrgSlotIndex() == SI_EQUIPMENT) { rQuickSlot.SetStatus(SLOT_RENDER_STATE_DEACTIVATED); continue; } if (pFromContainer->IsEmpty(rQuickSlot.GetOrgPos())) { // unlink if (container_index == SI_QUICK) { InventoryDialog* inventory_dialog = GET_CAST_DIALOG(InventoryDialog, IM_INVENTORY_MANAGER::INVEN_DLG); if (inventory_dialog != NULL) { QuickContainer* quick_container = (QuickContainer*)pAtContainer; if (quick_container->is_item_move() == false) { SendQuickItemRemoveMsg(i); } } } rQuickSlot.SetStatus(SLOT_RENDER_STATE_DEACTIVATED); continue; } SCSlot& rOrgSlot = pFromContainer->GetSlot(rQuickSlot.GetOrgPos()); if (rOrgSlot.GetCode() != rQuickSlot.GetOrgCode()) { rQuickSlot.SetStatus(SLOT_RENDER_STATE_DEACTIVATED); continue; } rQuickSlot.SetStatus(SLOT_RENDER_STATE_ACTIVATED); } } break; case ST_SKILL: break; } } } //---------------------------------------------------------------------------- /** ?? ??? ????? ??? ???? ?????? ???? ??????? */ VOID ItemManager::UpdateQuickForEquipItemAll() { SCSlotContainer *pAtContainer = g_pHero->GetSlotContainer( SI_QUICK); SUN_ASSERT(pAtContainer); if (!pAtContainer) { return; } SCSlotContainer *pEquipContainer = g_pHero->GetSlotContainer( SI_EQUIPMENT); SUN_ASSERT(pEquipContainer); if (!pEquipContainer) { return; } if (!g_pHero) { return; } for (int i = 0; i < pAtContainer->GetMaxSlotNum(); i++) { if ( pAtContainer->IsEmpty(i) ) { continue; } QuickSlot & rQuickSlot = (QuickSlot &)pAtContainer->GetSlot(i); if (rQuickSlot.GetOrgSlotType() != ST_ITEM) { continue; } BASE_ITEMINFO * pItemInfo = ItemInfoParser::Instance()->GetItemInfo( rQuickSlot.GetOrgCode() ); assert(pItemInfo); if (!pItemInfo) { OutputDebugStringA("UpdateQuickForEquipItem:: ????? ????!!>> ??? ????? ???!!"); continue; } if (SCItemSlot::CanEquip(pItemInfo) == false) { continue; } SLOTIDX OrgSlotIdx = rQuickSlot.GetOrgSlotIndex(); POSTYPE OrgPos = rQuickSlot.GetOrgPos(); SCSlotContainer * pOrgContainer = this->GetContainer( OrgSlotIdx ); if ( !pOrgContainer ) { continue; } SCSlot & rSlot = pOrgContainer->GetSlot( OrgPos ); if ( rSlot.GetCode() != rQuickSlot.GetOrgCode() ) { // ???? ??????? ??? ???? ????? // ??????? ??? ???????? ????? ???? if ( !pEquipContainer->IsEmpty( (POSTYPE)pItemInfo->m_wEqPos ) ) { SCSlot & rSlot = pEquipContainer->GetSlot( (POSTYPE)pItemInfo->m_wEqPos ); if ( rSlot.GetCode() == rQuickSlot.GetOrgCode() ) { rQuickSlot.SetOrgSlotIndex(SI_EQUIPMENT ); rQuickSlot.SetOrgPos( (POSTYPE)pItemInfo->m_wEqPos ); assert( !pEquipContainer->IsEmpty( (POSTYPE)pItemInfo->m_wEqPos ) ); rQuickSlot.SetStatus( SLOT_RENDER_STATE_ACTIVATED ); continue; } } // ?¥ê??????? ??? ???? ???????? ?????????? ??????????. BOOL bRet = this->FindFirstItem( rQuickSlot.GetOrgCode(), OrgPos ); if (bRet) { rQuickSlot.SetOrgSlotIndex( SI_INVENTORY ); rQuickSlot.SetOrgPos( OrgPos ); rQuickSlot.SetStatus( SLOT_RENDER_STATE_ACTIVATED ); } else { rQuickSlot.SetStatus( SLOT_RENDER_STATE_DEACTIVATED ); rQuickSlot.SetOrgSlot(NULL); } } else { rQuickSlot.SetStatus( SLOT_RENDER_STATE_ACTIVATED ); } } } //---------------------------------------------------------------------------- /** ??????? ???? ??????? ????? ??????? ????. */ VOID ItemManager::UpdateValidQuickItem() { SCSlotContainer * pAtContainer = g_pHero->GetSlotContainer( SI_QUICK); assert(pAtContainer); if (!g_pHero) return; for (int i = 0; i < pAtContainer->GetMaxSlotNum(); i++) { if ( pAtContainer->IsEmpty(i) ) { continue; } QuickSlot & rQuickSlot = (QuickSlot &)pAtContainer->GetSlot(i); if ( ST_ITEM != rQuickSlot.GetOrgSlotType() ) { continue; } SCSlotContainer * pFromContainer = GetContainer(rQuickSlot.GetOrgSlotIndex()); if (!pFromContainer) { rQuickSlot.SetStatus( SLOT_RENDER_STATE_DEACTIVATED ); continue; } if ( pFromContainer->IsEmpty( rQuickSlot.GetOrgPos() ) ) { rQuickSlot.SetStatus( SLOT_RENDER_STATE_DEACTIVATED ); continue; } SCSlot & rOrgSlot = pFromContainer->GetSlot( rQuickSlot.GetOrgPos() ); if (rOrgSlot.GetCode() != rQuickSlot.GetOrgCode() ) { rQuickSlot.SetStatus( SLOT_RENDER_STATE_DEACTIVATED ); continue; } rQuickSlot.SetStatus( SLOT_RENDER_STATE_ACTIVATED ); } } VOID ItemManager::UseEquipmentItem( SLOTIDX AtIndex, POSTYPE AtPos ) { if (!g_pHero) return; if( AtIndex != SI_EQUIPMENT ) return; SCSlotContainer * pAtContainer = g_pHero->GetSlotContainer( AtIndex ); if( !pAtContainer) return; if( pAtContainer->IsEmpty( AtPos ) ) return; SCSlotContainer * pToContainer = g_pHero->GetSlotContainer( SI_INVENTORY ); POSTYPE emptyPos = 0; if( pToContainer->GetEmptyPos( emptyPos ) ) { SendItemMoveMsg( AtIndex, SI_INVENTORY, AtPos, emptyPos ); } else { // ?¥ê????? ???????? ?????? ????????. return ; } } void ItemManager::IncItemCount( SLOTIDX AtIndex, POSTYPE AtPos, int Count ) { SCSlotContainer * pAtContainer = g_pHero->GetSlotContainer( AtIndex ); if ( !pAtContainer ) { return; } SCSlot& rFromSlot = pAtContainer->GetSlot( AtPos ); WORD wCount = (WORD)rFromSlot.GetNum(); if (wCount+Count > 0 ) { rFromSlot.SetNum((DURATYPE)wCount+Count); pAtContainer->UpdateSlot(AtPos, rFromSlot); } else { SCItemSlot ItemSlot; pAtContainer->DeleteSlot(AtPos, &ItemSlot); } } VOID ItemManager::UseInventoryItem( SLOTIDX AtIndex, POSTYPE AtPos ) { SCSlotContainer * pAtContainer = g_pHero->GetSlotContainer( AtIndex ); if ( !pAtContainer ) { return; } if ( AtPos >= pAtContainer->GetMaxSlotNum() ) { ASSERT(!"Invalid Item Position!!"); return; } if ( pAtContainer->IsEmpty( AtPos ) ) { return; } SCSlot & rFromSlot = pAtContainer->GetSlot( AtPos ); //< 1. ???????? ?????¢¥?. // m_byMaterialType 0 : ???, ??? ??? // 1 : ???? ???? // 2 : ??? ???? // 3 : ????, ??? ???? BASE_ITEMINFO * pInfo = ItemInfoParser::Instance()->GetItemInfo( rFromSlot.GetCode() ); if (!pInfo) return; DWORD dwItemCode = rFromSlot.GetCode(); #ifdef _NA_20101011_HEIM_LOTTO_CASH_TICKET uiLottoNumInput* pLottoNumInput= GET_CAST_DIALOG(uiLottoNumInput, IM_LOTTO_MANAGER::LOTTO_NUMINPUT_DLG); if(dwItemCode == 7293 && pLottoNumInput)// ©¦?? ???? ??????(7293) ??¥é? { pLottoNumInput->SendLottoEntrySyn(); pLottoNumInput->ShowInterface(FALSE); } #endif//_NA_20101011_HEIM_LOTTO_CASH_TICKET switch( pInfo->m_byMaterialType ) { case eITEM_MATERIAL_TYPE_NOT_USE_CAN_DELETE: case eITEM_MATERIAL_TYPE_CAN_USE://< ??? { IncItemCount( AtIndex, AtPos, -1 ); } break; default: break; } if (g_pHero) { g_pHero->OnUseItemWithCoolTime(dwItemCode); } if (GameFramework::GetCurrentScene()->GetType() == SCENE_TYPE_CHUNTING) { BASE_ITEMINFO * pItemInfo = (BASE_ITEMINFO *)ItemInfoParser::Instance()->GetItemInfo(dwItemCode); g_CompetitionScene.OnUsePotion(pItemInfo); } #ifdef _NA_000000_20130521_DAILY_QUEST_RESET_ITEM //????????? ???????? ??????????? ???? ?? ??? if(pInfo->IsDailyQeustResetItem()) { if(g_pHero) { WzVector vPos = g_pHero->GetSkillEffectPos(eSKILLEFFECT_POS_BODY ); HANDLE hHandle = GlobalFunc::CreateEffectBeUpToOption(StrToWzID("A896"), vPos, g_pHero->GetObjectKey()); CEffectBody* pBody = g_pEffectManager->GetEffectPtrHandle(hHandle); if (pBody && pBody->IsLoop()) { g_pEffectManager->RemoveEffectPtr(hHandle); } } } #endif } void ItemManager::AddItemForSingleMode( DWORD dwObjectKey, DWORD dwID ) { Item * pItem = static_cast(g_ObjectManager.Add( dwObjectKey, ITEM_OBJECT, dwID )); // 1?? ?????? if( pItem ) { pItem->SetPosition( g_pHero->GetVisiblePos() ); } } BOOL ItemManager::AddFieldItem( const ITEM_RENDER_INFO * pItemInfo ) { DWORD dwObjectKey = 0; CODETYPE ItemCode = 0; ITEM_RENDER_INFO::eFIELDITEMTYPE eFieldItemType = ITEM_RENDER_INFO::eFIELDITEM_ITEM; WzVector WzvVec; dwObjectKey = pItemInfo->m_dwObjectKey; eFieldItemType = (ITEM_RENDER_INFO::eFIELDITEMTYPE)pItemInfo->m_byFieldItemType; if ( g_ObjectManager.GetObject(dwObjectKey) ) { assert(!"?? ?????? ??? ???¢®?!!"); return FALSE; } SetVector( &WzvVec, pItemInfo->m_fPos[0], pItemInfo->m_fPos[1], pItemInfo->m_fPos[2]); Item* item_object = NULL; bool is_auto_pick_up = false; if (eFieldItemType == ITEM_RENDER_INFO::eFIELDITEM_ITEM) { item_object = static_cast(g_ObjectManager.Add( dwObjectKey, ITEM_OBJECT, pItemInfo->m_ItemStream.Part.wCode)); // 1?? ?????? if (item_object != NULL) { item_object->SetItem((ITEMSTREAMEX&)pItemInfo->m_ItemStream); } else { return FALSE; } if (IsAutoPickupItem(WzvVec) == TRUE) { if (uiAreaConquestMan::CanPickACItem(item_object, true) == true) { is_auto_pick_up = true; } } } else { item_object = static_cast(g_ObjectManager.Add(dwObjectKey, ITEM_OBJECT, 0 )); if (IsAutoPickupMoney(WzvVec)) { is_auto_pick_up = true; } #ifdef _ADD_CHARGE_ITEM_AUTO_GET_HAIM else if ((GameFramework::GetCurrentScene()->GetType() == SCENE_TYPE_CHUNTING) || (GameFramework::GetCurrentScene()->GetType() == SCENE_TYPE_MISSION)) { if ((g_pHero != NULL) && (g_pHero->GetPCBangMode() != 0)) { if (IsEnablePickupDistance(WzvVec)) { is_auto_pick_up = true; } } } #endif if (item_object) { item_object->SetMoney((DWORD)pItemInfo->m_Money); } else { return FALSE; } } if (is_auto_pick_up == true) { SendPickUpItemObject(item_object); } item_object->SetPosition(WzvVec); item_object->SetOwner(pItemInfo->m_dwOwnerPlayerKey); #ifdef _NA_003033_20110831_DICECAST_ITEM_ROUTING if (pItemInfo->dicecast_item_type_ != 0) { uiPartyMan* partyMan = GET_DIALOG_MANAGER(uiPartyMan, UIMAN_PARTY); if (partyMan && partyMan->IsPartyMember(pItemInfo->m_dwOwnerPlayerKey)) { item_object->set_is_dice_item(true); // ?????? ????? ?????? ????? ??? APPEARANCEINFO appearInfo; ZeroMemory(&appearInfo,sizeof(appearInfo)); appearInfo.ObjectType = APPEARANCEINFO::ITEM; appearInfo.ItemCode = pItemInfo->m_ItemStream.Part.wCode; appearInfo.is_dice_item = true; item_object->SetDiceAppearance(&appearInfo); } } #endif //_NA_003033_20110831_DICECAST_ITEM_ROUTING item_object->set_expire_time_for_owner(pItemInfo->m_dwRemainedTime); bool is_can_get; if (item_object->GetItemType() == ITEM_RENDER_INFO::eFIELDITEM_MONEY) { is_can_get = GlobalFunc::CanGetHaim(item_object); } else { is_can_get = GlobalFunc::IsMyItem(item_object); } if ((is_can_get == false) #ifdef _NA_003033_20110831_DICECAST_ITEM_ROUTING || (pItemInfo->dicecast_item_type_ != 0) #endif //_NA_003033_20110831_DICECAST_ITEM_ROUTING ) { item_object->set_is_can_get_item(false); AddOwnerList(dwObjectKey); } return TRUE; } VOID ItemManager::SendTopOfTrialItemMsg( POSTYPE atPos ) { MSG_CG_ZONE_CREATE_TOP_OF_TRIAL_SYN SendPacketAck; SendPacketAck.m_ItemPos = atPos; GlobalFunc::SendPacket(CI_GAMESERVERIDX, (BYTE *)&SendPacketAck, sizeof(SendPacketAck)); } VOID ItemManager::SendItemUseMsg(SLOTIDX atIndex, POSTYPE atPos) { MSG_CG_ITEM_USE_SYN SendPacket; SendPacket.m_byCategory = CG_ITEM; SendPacket.m_byProtocol = CG_ITEM_USE_SYN; SendPacket.m_atIndex = atIndex; SendPacket.m_atPos = atPos; GlobalFunc::SendPacket( CI_GAMESERVERIDX, &SendPacket, sizeof(SendPacket) ); if ( !GENERALPARAM->IsNet() ) { if(atIndex==SI_INVENTORY) { MessageforItem(atPos); UseInventoryItem(atIndex,atPos); } } } VOID ItemManager::SendItemCombineMsg(SLOTIDX fromIndex, SLOTIDX toIndex, POSTYPE fromPos, POSTYPE toPos, DURATYPE itemCount) { MSG_CG_ITEM_COMBINE_SYN SendPacket; SendPacket.m_byCategory = CG_ITEM; SendPacket.m_byProtocol = CG_ITEM_COMBINE_SYN; SendPacket.m_fromIndex = fromIndex; SendPacket.m_toIndex = toIndex; SendPacket.m_fromPos = fromPos; SendPacket.m_toPos = toPos; SendPacket.combine_quantity_ = itemCount; GlobalFunc::SendPacket( CI_GAMESERVERIDX, &SendPacket, sizeof(SendPacket) ); } VOID ItemManager::SendItemPortalMsg( POSTYPE CoordPos, POSTYPE PortalPos ) { MSG_CG_ITEM_PORTAL_SYN SendPacket; SendPacket.m_CoordPos = CoordPos; SendPacket.m_PortalPos = PortalPos; GlobalFunc::SendPacket( CI_GAMESERVERIDX, &SendPacket, sizeof(SendPacket) ); if ( !GENERALPARAM->IsNet() ) { // ?????? ???? ack ??? ?? ???????. MSG_CG_ITEM_USE_ACK SendPacketAck; SendPacketAck.m_atIndex = SI_INVENTORY; SendPacketAck.m_atPos = PortalPos; // ??? ????? ?????? } } ////////////////////////////////////////////////////////////////////////// // ?????? ???? ???? VOID ItemManager::SendStatInitItem( POSTYPE FromPos, int iNum) { MSG_CG_ITEM_INIT_STAT_SYN SendPacket; SendPacket.m_ItemSlotPos = FromPos; SendPacket.m_wDecreaseValue = iNum; GlobalFunc::SendPacketToGameServer(&SendPacket, sizeof(SendPacket)); if ( !GENERALPARAM->IsNet() ) { MSG_CG_ITEM_INIT_STAT_ACK SendPacketAck; SendPacketAck.m_wDecreaseValue = iNum; if (g_pApplication) g_pApplication->AddVirtualPacket( CI_GAMESERVERIDX, (BYTE*)&SendPacketAck, sizeof(SendPacketAck)); } } VOID ItemManager::SetIndexPosInStatChangePkt(SLOTIDX Idx, POSTYPE Pos) { m_Item_Stat_Change_Use_Syn.m_atIndex = Idx; m_Item_Stat_Change_Use_Syn.m_atPos = Pos; } VOID ItemManager::SetChangeItemPosInStatChangePkt(POSTYPE ChangeItemPos) { m_Item_Stat_Change_Use_Syn.m_ChangeItemPos = ChangeItemPos; } VOID ItemManager::SendStatChangeItem() { GlobalFunc::SendPacket( CI_GAMESERVERIDX, &m_Item_Stat_Change_Use_Syn, sizeof(m_Item_Stat_Change_Use_Syn) ); } VOID ItemManager::NoticeReasonItemErrorCode(DWORD dwErrCode) { TCHAR szMessage[INTERFACE_STRING_LENGTH] = {0,}; int DisplayOption = eOUTPUT_MSG_CHAT; switch ((eITEM_RESULT)dwErrCode) { case RC_ITEM_INVALIDSTATE: { //??? ???? ?? ?? ??? ???¡Æ? ?????. g_InterfaceManager.GetInterfaceString( eST_RC_ITEM_INVALIDSTATE, szMessage, INTERFACE_STRING_LENGTH ); } break; case RC_ITEM_CANNOT_CREATE_TOTEMNPC: { // ?????? ??????? ???????. g_InterfaceManager.GetInterfaceString( 5379, szMessage, INTERFACE_STRING_LENGTH ); } break; case RC_ITEM_INVALIDPOS: { // ??? ????? ????? ???? ?? ???????. g_InterfaceManager.GetInterfaceString( eST_RC_ITEM_INVALIDPOS, szMessage, INTERFACE_STRING_LENGTH ); } break; case RC_ITEM_EMPTYSLOT: // ???????? ?????? ??????. { // ??? ????? ?????? ??????. // ??? g_InterfaceManager.GetInterfaceString( eST_TARGET_SLOT_IS_EMPTY, szMessage, INTERFACE_STRING_LENGTH ); } break; case RC_ITEM_NOTEXISTITEMATFIELD: // ??? ???????? ???????? ??¢¥?. { // ??? ???????? ???????? ??¢¥?. g_InterfaceManager.GetInterfaceString( eST_RC_ITEM_NOTEXISTITEMATFIELD, szMessage, INTERFACE_STRING_LENGTH ); } break; case RC_ITEM_NOINFO: // Code?? ?????? ?????? ?????? ???????? ??¢¥?. { // Code?? ?????? ?????? ?????? ???????? ??¢¥?. g_InterfaceManager.GetInterfaceString( eST_RC_ITEM_NOINFO, szMessage, INTERFACE_STRING_LENGTH ); } break; case RC_ITEM_NOSPACEININVENTORY: // ?¥ê????? ?? ?????? ????. { // ?¥ê????? ?? ?????? ???? g_InterfaceManager.GetInterfaceString( eST_RC_ITEM_NOSPACEININVENTORY, szMessage, INTERFACE_STRING_LENGTH ); } break; case RC_ITEM_INVALIDSTATEOFPLAYER: // ?¡À???? ???¡Æ? ?????? { // ?¡À???? ???¡Æ? ?????? g_InterfaceManager.GetInterfaceString( eST_RC_ITEM_INVALIDSTATEOFPLAYER, szMessage, INTERFACE_STRING_LENGTH ); } break; case RC_ITEM_INVALIDPOSFORDROPITEM: // ????? ???????? ????? ????????. { // ????? ???????? ????? ????????. g_InterfaceManager.GetInterfaceString( eST_RC_ITEM_INVALIDPOSFORDROPITEM, szMessage, INTERFACE_STRING_LENGTH ); } break; case RC_ITEM_DBP_ASYNC: // DBP?¥ê??? ????????? ?©ª??? ??? ??? ???? { g_InterfaceManager.GetInterfaceString( eST_RC_ITEM_DBP_ASYNC, szMessage, INTERFACE_STRING_LENGTH ); } break; case RC_ITEM_COOLTIME_ERROR: // ??????? ?????? ????. { g_InterfaceManager.GetInterfaceString( eST_RC_ITEM_COOLTIME_ERROR, szMessage, INTERFACE_STRING_LENGTH ); } break; // Combine case RC_ITEM_ITEMCODENOTEQUAL: // ?????? ??? ?????. { // ?????? ??? ?????. g_InterfaceManager.GetInterfaceString( eST_RC_ITEM_ITEMCODENOTEQUAL, szMessage, INTERFACE_STRING_LENGTH ); } break; // use case RC_ITEM_ISNOTWASTEITEM: // ??? ???????? ????. { // ??? ???????? ????. g_InterfaceManager.GetInterfaceString( eST_RC_ITEM_ISNOTWASTEITEM, szMessage, INTERFACE_STRING_LENGTH ); } break; case RC_ITEM_PORTION_USE_LIMIT: { //5361 ???? ??? ???????? ???? ?? ??? ??? ?? ?? ???????. g_InterfaceManager.GetInterfaceString( 5361, szMessage, INTERFACE_STRING_LENGTH ); } break; case RC_ITEM_CAN_USE_FIELD: { //5360 ??????? ????? ?? ??????. g_InterfaceManager.GetInterfaceString( 5360, szMessage, INTERFACE_STRING_LENGTH ); } break; case RC_ITEM_INVALID_TYPE: { //5937 ??? ????? ????? ?? ??? ?????? ?????? ?????. g_InterfaceManager.GetInterfaceString( 5937, szMessage, INTERFACE_STRING_LENGTH ); } break; //case RC_ITEM_FIELD_IS_NULL: // { // g_InterfaceManager.GetInterfaceString( 5938, szMessage, INTERFACE_STRING_LENGTH ); // } // break; case RC_ITEM_UNABLE_FUNCTION_FOR_CUR_ZONE: { // 5938 ???? ?????????? ????? ???????? ???? ???????. g_InterfaceManager.GetInterfaceString( 5938, szMessage, INTERFACE_STRING_LENGTH ); } break; case RC_ITEM_CANNOT_MOVE_TO_THE_AREA: { // 5939 ??? ????? ????? ?? ???????. g_InterfaceManager.GetInterfaceString( 5939, szMessage, INTERFACE_STRING_LENGTH ); } break; case RC_ITEM_CANNOT_LEARN_SKILL: { // 5940 ????? ?????? ?? ???????. g_InterfaceManager.GetInterfaceString( 5940, szMessage, INTERFACE_STRING_LENGTH ); } break; case RC_ITEM_CANNOT_FIND_PLAYER_TO_MOVE: { // 5941 ?????????? ????? ??? ?? ???????. g_InterfaceManager.GetInterfaceString( 5941, szMessage, INTERFACE_STRING_LENGTH ); } break; case RC_ITEM_NOT_STORE_COORD: { // 5942 ????? ?????? ???? ??????. g_InterfaceManager.GetInterfaceString( 5942, szMessage, INTERFACE_STRING_LENGTH ); } break; case RC_ITEM_ALREADY_STORE_COORD: { // 5943 ??? ????? ????????. g_InterfaceManager.GetInterfaceString( 5943, szMessage, INTERFACE_STRING_LENGTH ); } break; case RC_ITEM_CANNOT_STORE_COORD_AT_THIS_AREA: { // 5944 ??? ????????? ????? ?????? ?? ???????. g_InterfaceManager.GetInterfaceString( 5944, szMessage, INTERFACE_STRING_LENGTH ); } break; case RC_ITEM_CANNOT_DELETE_FOR_SHORT_COUNT: { // 5945 ???? ???????? ?????? ???????? ??????. g_InterfaceManager.GetInterfaceString( 5945, szMessage, INTERFACE_STRING_LENGTH ); } break; // sell case RC_ITEM_INVALIDSHOPLISTID: // dwShopListID?? ????????. { // ????? ???? ID?? ????????? g_InterfaceManager.GetInterfaceString( eST_RC_ITEM_INVALIDSHOPLISTID, szMessage, INTERFACE_STRING_LENGTH ); } break; case RC_ITEM_OUTOFSHOPITEMINDEX: // shop???? ?????? ?????? ?¥å????? ????. { // ???????? ?????? ???????? ?????. g_InterfaceManager.GetInterfaceString( eST_RC_ITEM_OUTOFSHOPITEMINDEX, szMessage, INTERFACE_STRING_LENGTH ); } break; case RC_ITEM_INSUFFICIENT_MONEY: case RC_ITEM_HAVENOTMONEY: // ???? ????. { // ?????? ????????. g_InterfaceManager.GetInterfaceString( eST_RC_ITEM_HAVENOTMONEY, szMessage, INTERFACE_STRING_LENGTH ); g_HeroInput.PlayNotEnoughMoneySound(); } break; // buy case RC_ITEM_ISNOTEMPTYSLOT: // ?? ?????? ???? ?? ???. { // ?? ?????? ???? ?? ???. g_InterfaceManager.GetInterfaceString( eST_RC_ITEM_ISNOTEMPTYSLOT, szMessage, INTERFACE_STRING_LENGTH ); } break; case RC_ITEM_HAVENOTSPACE: // ?????? ???????. { // ?????? ??????? g_InterfaceManager.GetInterfaceString( eST_RC_ITEM_HAVENOTSPACE, szMessage, INTERFACE_STRING_LENGTH ); InventoryDialog* pDlg = GET_CAST_DIALOG(InventoryDialog, IM_INVENTORY_MANAGER::INVEN_DLG); if (pDlg) { int nCount = pDlg->GetSlotNum(); int nMax = (g_pHero->GetCharInfo()->m_ExtraInventoryTabCount + pDlg->GetMaxInvenChargeNum()) * pDlg->GetMaxInvenSlotNum(); if ( nCount == nMax ) { WzColor color = WzColor_RGB(197, 47, 47); TCHAR szMessage[INTERFACE_STRING_LENGTH]; g_InterfaceManager.GetInterfaceString(5661, szMessage, INTERFACE_STRING_LENGTH-1); g_InterfaceManager.ShowCenterMessageBox(szMessage, 5000, &color, FALSE ); } } } break; case RC_ITEM_INVALIDVALUE: // ????? ???? ???. { // ????? ?????? ???. g_InterfaceManager.GetInterfaceString( eST_RC_ITEM_INVALIDVALUE, szMessage, INTERFACE_STRING_LENGTH ); } break; // pick #ifdef _JBH_ADD_ITEM_OVER_PLAYING_TIME_MESSAGE case RC_ITEM_OVER_PLAYING_TIME: { // 6047 : ??¥å? ?????? ?????? ???????? ??? ?? ???????. g_InterfaceManager.GetInterfaceString(6047, szMessage, INTERFACE_STRING_LENGTH ); } break; #endif ///..... // drop case RC_ITEM_ERRORDROPMONEY: { // ???? ?????? ?????. #ifdef _DEBUG g_InterfaceManager.GetInterfaceString( eST_RC_ITEM_ERRORDROPMONEY, szMessage, INTERFACE_STRING_LENGTH ); #endif } break; case RC_ITEM_ENCHANT_DOWN_FAILED: { g_InterfaceManager.GetInterfaceString( eST_RC_ITEM_ENCHANT_DOWN_FAILED, szMessage, INTERFACE_STRING_LENGTH ); } break; case RC_ITEM_ENCHANT_HAVENOTMETERIALS: { // ??©­??? ????? ??? ???????. g_InterfaceManager.GetInterfaceString( eST_RC_ITEM_ENCHANT_HAVENOTMETERIALS, szMessage, INTERFACE_STRING_LENGTH ); } break; // rankup case RC_ITEM_INVALID_CONDITION: // ?? ????? ???? ??¢¥?. { // Rankup ?? ????? ???????? ??????. g_InterfaceManager.GetInterfaceString( eST_RC_ITEM_INVALID_CONDITION, szMessage, INTERFACE_STRING_LENGTH ); } break; case RC_ITEM_CANNT_RANKUP_ITEM: { // Rankup ??? ???????. g_InterfaceManager.GetInterfaceString( eST_RC_ITEM_CANNT_RANKUP_ITEM, szMessage, INTERFACE_STRING_LENGTH ); } break; // socket case RC_ITEM_FULLSOCKET: // ?????? ?? ???. { g_InterfaceManager.GetInterfaceString( eST_RC_ITEM_FULLSOCKET, szMessage, INTERFACE_STRING_LENGTH ); } break; case RC_ITEM_EXTRACTSOCKET_FAILED: case RC_ITEM_SOCKET_FAILED_TO_EXTRACT_BY_RATIO: { // ???????? ???? g_InterfaceManager.GetInterfaceString( eST_RC_ITEM_EXTRACTSOCKET_FAILED, szMessage, INTERFACE_STRING_LENGTH ); } break; case RC_ITEM_UNUSABLE_FUNCTION: { //5345 ??? ?? ?? ???? ???????. g_InterfaceManager.GetInterfaceString( 5345, szMessage, INTERFACE_STRING_LENGTH ); } break; case RC_ITEM_INVALID_VALUE: { //5346 ????? ???? ????. g_InterfaceManager.GetInterfaceString( 5346, szMessage, INTERFACE_STRING_LENGTH ); } break; case RC_ITEM_CANNNOT_DROPSTATE: { //5347 ???????? ???? ?? ???? ????????. g_InterfaceManager.GetInterfaceString( 5347, szMessage, INTERFACE_STRING_LENGTH ); } break; case RC_ITEM_NOTEXIST_ITEM: { //5348 ???????? ???????? ??????. g_InterfaceManager.GetInterfaceString( 5348, szMessage, INTERFACE_STRING_LENGTH ); } break; case RC_ITEM_CANNOT_SELL_ITEM: { //5349 ???? ???????? ???? ??????????. g_InterfaceManager.GetInterfaceString( 5349, szMessage, INTERFACE_STRING_LENGTH ); } break; case RC_ITEM_CANNOT_TRADE_ITEM: { //5350 ????? ???????? ???? ??????????. g_InterfaceManager.GetInterfaceString( 5350, szMessage, INTERFACE_STRING_LENGTH ); } break; case RC_ITEM_CANNOT_DROP_ITEM: { //5351 ???? ?? ???? ??????????. g_InterfaceManager.GetInterfaceString( 5351, szMessage, INTERFACE_STRING_LENGTH ); } break; case RC_ITEM_CANNOT_EXCHANGE_ITEM: { //5352 ??? ?? ?? ???? ??????????. g_InterfaceManager.GetInterfaceString( 5352, szMessage, INTERFACE_STRING_LENGTH ); } break; case RC_ITEM_CANNOT_MOVE_OTHER_SLOT_ITEM: { //5353 ??? ???????? ??? ?? ?? ???? ??????????. g_InterfaceManager.GetInterfaceString( 5353, szMessage, INTERFACE_STRING_LENGTH ); } break; case RC_ITEM_CANNOT_DESTROY_ITEM: { //5354 ?©¥? ?? ?? ???? ??????????. g_InterfaceManager.GetInterfaceString( 5354, szMessage, INTERFACE_STRING_LENGTH ); } break; case RC_ITEM_CANNOT_PICKUP_OBSERVER: { //5355 ???? ???¢¯????? ???????? ?????? ?? ???????. g_InterfaceManager.GetInterfaceString( 5355, szMessage, INTERFACE_STRING_LENGTH ); } break; case RC_ITEM_UNABLE_FUNCTION_FOR_CURR_LEVEL: { // ???? ???????? ????? ?? ???? ???????. g_InterfaceManager.GetInterfaceString(eST_NOT_USE_CURRENT_LEVEL , szMessage ,INTERFACE_STRING_LENGTH); } break; // ??????, ???? case RC_ITEM_DONT_NEED_TO_REPAIR: //< ?????? ??? ???? { //5134 ?????? ???? ??????????. g_InterfaceManager.GetInterfaceString(5134 , szMessage ,INTERFACE_STRING_LENGTH); } break; case RC_ITEM_CANNOT_REPAIR_ITEM: //< ?????? ??????? ??????????. { //5135 ?????? ?? ??? ???????? ?????. g_InterfaceManager.GetInterfaceString(5135 , szMessage ,INTERFACE_STRING_LENGTH); } break; case RC_ITEM_COMPOSE_INVALID_LOCATION: //< ?????? ?? ???? ??????. { //5136 NPC?? ????? ??? ?????? ?????? ?? ???????. g_InterfaceManager.GetInterfaceString(5136 , szMessage ,INTERFACE_STRING_LENGTH); } break; case RC_ITEM_COMPOSE_LIMIT_CLASS: //< ?????? ?? ???? ?????????. { //5137 ?????? ?? ???? ????? ????. g_InterfaceManager.GetInterfaceString(5137, szMessage ,INTERFACE_STRING_LENGTH); } break; case RC_ITEM_UNABLE_FUNCTION_FOR_CHAOSTATE: //< ??????¢¯????? ????? ?? ???? ??????. { //5275 ??? ???¢¯????? ????? ???????? ??????. g_InterfaceManager.GetInterfaceString(5275, szMessage ,INTERFACE_STRING_LENGTH); } break; case RC_ITEM_CANNOT_USE_QUEST_ACCEPT_ITEM: //< ????? ???? ???????? ????? ?? ???????. { // 5138 ?????? ???? ??? ????? ???? ???????? ????? ?? ???????. g_InterfaceManager.GetInterfaceString(5138, szMessage ,INTERFACE_STRING_LENGTH); } break; case RC_ITEM_CANNOT_RANKUP_ELITE: //< ????? ?????? ????? ??? { //5377 ????? ???????? ??????? ???????? ??????. g_InterfaceManager.GetInterfaceString(5377, szMessage ,INTERFACE_STRING_LENGTH); } break; case RC_ITEM_CANNOT_CRYSTALIZE_ELITE: //< ????? ?????? ????? ??? { //5376 ????? ???????? ??????? ???????? ??????. g_InterfaceManager.GetInterfaceString(5376, szMessage ,INTERFACE_STRING_LENGTH); } break; case RC_ITEM_CANNOT_RANKUP_UNIQUE: //< ????? ?????? ????? ??? { //5374 ????? ???????? ??????? ???????? ??????. g_InterfaceManager.GetInterfaceString(5374, szMessage ,INTERFACE_STRING_LENGTH); } break; case RC_ITEM_CANNOT_CRYSTALIZE_UNIQUE: //< ????? ?????? ????? ??? { //5373 ????? ???????? ??????? ???????? ??????. g_InterfaceManager.GetInterfaceString(5373, szMessage ,INTERFACE_STRING_LENGTH); } break; case RC_ITEM_UNABLE_FUNCTION_FOR_TRANSFORMATION://< ??????¢¯????? ????? ?? ???? ??????. { // 5139 ???? ???¢¯????? ????? ???????? ??????. g_InterfaceManager.GetInterfaceString(5139, szMessage ,INTERFACE_STRING_LENGTH); } break; case RC_ITEM_LENGTH_CANNOT_USE_NPC: //< NPC?? ????? ?? ???? ???. { //5141 ????? ??? ????? ???????? ??????. g_InterfaceManager.GetInterfaceString(5141, szMessage ,INTERFACE_STRING_LENGTH); } break; case RC_ITEM_DBG_WRONG_PACKET: //< ????? ??? ???? { //5142 ?????? ???????????. g_InterfaceManager.GetInterfaceString(5142, szMessage ,INTERFACE_STRING_LENGTH); } break; case RC_ITEM_CANNOT_ADD_EXTRAINVENTORY: //< ????? ????? ?¥ê????? ????? ?? ????. { //5143 ????? ?¥ê????? ?? ??? ????? ?? ???????. g_InterfaceManager.GetInterfaceString(5143, szMessage ,INTERFACE_STRING_LENGTH); } break; case RC_ITEM_DONT_EXIST_TO_REPAIR: { //85225 ?????? ???????? ??????? g_InterfaceManager.GetInterfaceString(85225, szMessage ,INTERFACE_STRING_LENGTH); } break; case RC_ITEM_NOT_MIXTURE: { //5146 ????? ????? ?? ???? ??????????. g_InterfaceManager.GetInterfaceString( 5146 , szMessage ,INTERFACE_STRING_LENGTH); } break; case RC_ITEM_NOT_INVENTORY: { //5876 ?¥ê????????? ?????? ?? ??????. g_InterfaceManager.GetInterfaceString(5876, szMessage ,INTERFACE_STRING_LENGTH); } break; case RC_ITEM_INVALID_SOCKET_NUM: //< ?????? ?????? ????? ?????? ????. { // 5956 ???? ??? ???? ?? ????? ???? ???????. g_InterfaceManager.GetInterfaceString(5956, szMessage ,INTERFACE_STRING_LENGTH); } break; case RC_ITEM_SOCKET_HAS_NOT_OPTION: //< ???????? ???? ???????? ?????? ???? ????? ????. { //5875 ???? ????? ???? ?????? ?? ???????. g_InterfaceManager.GetInterfaceString(5875, szMessage ,INTERFACE_STRING_LENGTH); } break; case RC_ITEM_SOCKET_DIFFERENT_LEVEL: //< ??,?????? ??? ???? ????? ?????? ?? ???????. { //5881 ????? ?? ????? ??? ???? ????? ?????? ?? ???????. g_InterfaceManager.GetInterfaceString(5881, szMessage ,INTERFACE_STRING_LENGTH); } break; case RC_ITEM_SOKET_NOT_RUNE_ITEM: //< ??? ???????? '????? ??'?? ????. { //5882 ????? ?? ???????? ?????. g_InterfaceManager.GetInterfaceString(5882, szMessage ,INTERFACE_STRING_LENGTH); } break; case RC_ITEM_ISNOT_PARTY_MEMBER: //< ??????? ???? ???????? ??? ??? ?? ???????. { //5955 ??? ???¢¯????? ????? ????????. g_InterfaceManager.GetInterfaceString(5955, szMessage ,INTERFACE_STRING_LENGTH); } break; case RC_ITEM_NOT_UNEQUIP_ALL: //< ??? ??? ???????? ???? ???????. { //5884 ???????? ??????? ??? ???¢¯??? ??? ????? ????. g_InterfaceManager.GetInterfaceString(5884, szMessage ,INTERFACE_STRING_LENGTH); DisplayOption |= eOUTPUT_MSG_TOP_SHOW; } break; case RC_ITEM_NOT_MORE_DECREASE: //< ?? ??? ?????? ?????? ?? ????. { //5883 ©¦???? ?? ?????? ??????? ?? ??? ????? ?? ???????. g_InterfaceManager.GetInterfaceString(5883, szMessage ,INTERFACE_STRING_LENGTH); } break; case RC_ITEM_LESS_FOR_USE: //< ??? ???????? ??????. { // 5702 ??? ????????. g_InterfaceManager.GetInterfaceString(5702, szMessage ,INTERFACE_STRING_LENGTH); } break; case RC_ITEM_CANNOT_USE_MULTI_ALL_ITEM: //< ????? ???? ???????? ?????? ????? ?? ????. { //5888 ?? ???? ???? ???????? ????? ????? ????????. ?? ??? ????? ?? ???????. g_InterfaceManager.GetInterfaceString(5888, szMessage ,INTERFACE_STRING_LENGTH); } break; case RC_ITEM_MONSTER_SUMMON_FAILED: //< ???? ??? ???????? ????? ?????????? ????? ???? ???? { //5726 ???? ??? ???????? ?????????? ?????????? ????? ?????? ?????? ??????????. g_InterfaceManager.GetInterfaceString(5726, szMessage,INTERFACE_STRING_LENGTH); } break; case RC_ITEM_WAREHOUSE_NEED_PASSWORD: { // ????? ??? ????????. g_InterfaceManager.GetInterfaceString(5571, szMessage,INTERFACE_STRING_LENGTH); } break; case RC_ITEM_INVENTORY_NEED_PASSWORD: //< ??? ???????. { // ?¥ê????? ???? ????? ??? ????????. g_InterfaceManager.GetInterfaceString(5572, szMessage,INTERFACE_STRING_LENGTH); } break; case RC_ITEM_INVENTORY_INVALID_PASSWORD: //< ????? ???????. case RC_ITEM_INVENTORY_ALREADY_TRANSACTION: //< ??? ??????? ?????????. case RC_ITEM_INVENTORY_PWD_SETTING_FLOW_VIOLATION: //< ??? ???????? ?¡À¥ï®œ ??????????. case RC_ITEM_CANNOT_MOVE_WAREHOUSE_ITEM: { // ????? ????? ?? ???? ??????????. g_InterfaceManager.GetInterfaceString(5891, szMessage,INTERFACE_STRING_LENGTH); } break; case RC_ITEM_CANNOT_RANKDOWN_ELITE: { // ????? ???????? ?????? ??? ??????? 6862 g_InterfaceManager.GetInterfaceString( 6862, szMessage ); } break; case RC_ITEM_CANNOT_RANKDOWN_UNIQUE: { // ????? ???????? ?????? ??? ??????? 6863 g_InterfaceManager.GetInterfaceString( 6863, szMessage ); } break; case RC_ITEM_NOT_RANK_DOWN_TO_E_RANK_ITEM: { // E??? ???????? ?????? ??? ??????? 5892 g_InterfaceManager.GetInterfaceString( 5892, szMessage ); } break; case RC_ITEM_IMPOSSIBLE_PERIOD_EXTEND: case RC_ITEM_CANNOT_EXTEND_DATE: { // 5899 ?? ?????? ?????? ???????? ?????. g_InterfaceManager.GetInterfaceString( 5899, szMessage ); } break; case RC_ITEM_DONOT_HAVE_OWNERSHIP: { g_InterfaceManager.GetInterfaceString( 5217, szMessage ); } break; case RC_ITEM_CANNOT_REPAIR_MAX_DURA_TWO_OVER: { //< ??? ?????? 2????????? ??? ???? g_InterfaceManager.GetInterfaceString( 6053, szMessage ); } break; case RC_ITEM_NOT_LIMITED_ITEM: { //< ??????? ???????? ??? g_InterfaceManager.GetInterfaceString( 6054, szMessage ); } break; case RC_ITEM_OVER_REPAIR_COUNT: { // 6865 ?????? ???? ????? ??? ?? ??? ?????? ???????? ??????. g_InterfaceManager.GetInterfaceString( 6865, szMessage ); } break; case RC_ITEM_CANNOT_RANKUP_LIMITED: { // 6051 ??????? ???????? ??????? ???????? ??????. g_InterfaceManager.GetInterfaceString( 6051, szMessage ); } break; case RC_ITEM_CANNOT_EXTEND_CASH_SLOT: { //5312 ??? ?????? ?? ??? ????? ?? ??????? g_InterfaceManager.GetInterfaceString(5312, szMessage); } break; case RC_ITEM_CANNOT_DO_THIS_FOR_CHARGEITEM: { //5313 ????? ??????? ???? ?? ????? ??? ?? ?? ???????. g_InterfaceManager.GetInterfaceString(5313, szMessage); } break; case RC_ITEM_EVENT_ALREADY_ANOTHER_TRANSACTION: //< [????] ??? ??? ?????? ??????????. ????? ??? ????????. { //??? ??? ?????? ??????????. ????? ??? ????????. g_InterfaceManager.GetInterfaceString( eST_RC_ITEM_UNKNOWNERROR, szMessage); } break; case RC_ITEM_EVENT_CANNOT_MOVE_TO_INVENTORY: //< [????] Can't Move EventInven->Inven { //EventInven->Inven g_InterfaceManager.GetInterfaceString( eST_RC_ITEM_UNKNOWNERROR, szMessage); } break; case RC_ITEM_ALREADY_REGISTER_AC_ITEM: { //5124 ?? AC ???????? ?? ??? ????? ?? ???????. g_InterfaceManager.GetInterfaceString(5124 , szMessage); } break; case RC_ITEM_CANT_PICKABLE_BY_LENGTH: { //5315 ???????? ?????? ?? ???? ???????. g_InterfaceManager.GetInterfaceString(5315, szMessage); } break; case RC_ITEM_CAN_NOT_EQUIP: { //5091 ???????? ?????? ?? ???????. g_InterfaceManager.GetInterfaceString(5091, szMessage); } break; case RC_ITEM_GUILDWAREHOUSE_USENOT_SLOT_BY_GRADE: // ??? ????? ???? ????? ?? ???? ???? { //7189 ??? ????? ???? ????? ?? ???? ????????. g_InterfaceManager.GetInterfaceString(7189, szMessage); } break; case RC_ITEM_GUILDWAREHOUSE_USENOT_SLOT_BY_CASHITEM: //©¦?????? ???? ????? ?? ???? ???? { //7190 ©¦?? ???????? ???? ?????? ??? ????????. g_InterfaceManager.GetInterfaceString(7190, szMessage); } break; case RC_ITEM_GUILDWAREHOUSE_NOEN_OUT_RIGHT: //??? ????? ?? ?????? ????. { //7191 ??? ??? ??? ?????? ???????. g_InterfaceManager.GetInterfaceString(7191, szMessage); } break; case RC_ITEM_GUILDWAREHOUSE_OPEN_USENOT_CASHITEM: { //7223 ??? ????? ???? ???? ?? ??? ??? ??????? ????? ?? ???????. g_InterfaceManager.GetInterfaceString(7223, szMessage); } break; case RC_ITEM_GUILDWAREHOUSE_NONE_USENOT_CASHITEM: { //7229 ???? ??? ???? ??? ??? ??? ???????? ????? ?? ???????. g_InterfaceManager.GetInterfaceString(7229, szMessage); } break; case RC_ITEM_GUILDWAREHOUSE_NONE_USE_RIGHT: { //7230 ??? ??? ??????? ©¦?????? ????? ?????? ???????. g_InterfaceManager.GetInterfaceString(7230, szMessage); } break; #ifdef __JP_000899_20080318_ENCHANT_RANKUP_LOCALIZE case RC_ITEM_RANKUP_FAILED_AND_DESTROY: { //4554 ??????? ??????????! g_InterfaceManager.GetInterfaceString( 4554, szMessage ); } break; #endif case RC_ITEM_ETHER_DEVICE_USE_ONLY_TO_WEAPON: { //6122 ????? ????????? ?????? ????????????. g_InterfaceManager.GetInterfaceString(6122, szMessage); } break; case RC_ITEM_ALREADY_EQUIP_ETHER_DEVICE: { //6123 ????? ????????? ??? ??????? ??????. g_InterfaceManager.GetInterfaceString(6123, szMessage); } break; case RC_ITEM_NOT_EQUIP_ETHER_DEVICE: { //6124 ????? ????????? ???? ??? ??????????. g_InterfaceManager.GetInterfaceString(6124, szMessage); } break; case RC_ITEM_ALREADY_CHARGE_ETHER_BULLET: { //6125 ????? ???? ??? ??????? ??????. g_InterfaceManager.GetInterfaceString(6125, szMessage); } break; case RC_ITEM_NOT_SUMMONED_PET: { //6397 ????? ???? ???? g_InterfaceManager.GetInterfaceString(6397, szMessage,INTERFACE_STRING_LENGTH); } break; case RC_ITEM_WINDOW_ALREADY_OENDEDSTATE: { //5385 ??? ??? ??????????. g_InterfaceManager.GetInterfaceString(5385, szMessage); } break; case RC_ITEM_CAN_NOT_ACTIVE_ETHER_BULLET: { //6119 ????? ???? ???? ?? ?? ???? g_InterfaceManager.GetInterfaceString(6119, szMessage,INTERFACE_STRING_LENGTH); } break; case RC_ITEM_CAN_NOT_INACTIVE_ETHER_BULLET: { //6120 ????? ???? ?????? ?? ?? ???? g_InterfaceManager.GetInterfaceString(6120, szMessage,INTERFACE_STRING_LENGTH); } break; case RC_ITEM_CANT_EQUIP_WEAPON: { //5754: ?????????? ?? ???????. g_InterfaceManager.GetInterfaceString(5754, szMessage,INTERFACE_STRING_LENGTH); } break; case RC_ITEM_CANNOT_SKILL_ACTION: { //5253 : ???????? ??????????????. g_InterfaceManager.GetInterfaceString(5253, szMessage, INTERFACE_STRING_LENGTH); } break; case RC_ITEM_CAN_USE_ONLY_CHAO: { //5280: ??? ?????? ????? ?? ???.(??????? ????) g_InterfaceManager.GetInterfaceString(5280, szMessage,INTERFACE_STRING_LENGTH); } break; case RC_ITEM_CANNOT_USE_PLAYER_LEVEL: { //< ??? ?????? ?????? ??? g_InterfaceManager.GetInterfaceString( 5297, szMessage,INTERFACE_STRING_LENGTH); } break; case RC_ITEM_ALREADY_FIREUP_ITEM_SAME_TYPE: { //< ??? ???? ????? ???????? ???? ??????. g_InterfaceManager.GetInterfaceString( 6158, szMessage,INTERFACE_STRING_LENGTH); } break; case RC_ITEM_ALREADY_EXTRACTED_TO_ETHERIA: { //6090: ??? ???????? ????? ???????. g_InterfaceManager.GetInterfaceString( 6090, szMessage, INTERFACE_STRING_LENGTH); } break; case RC_ITEM_CANT_EXTRACT_TO_ETHERIA: { //6091: ?? ???????? ??????? ?????? ?????????. g_InterfaceManager.GetInterfaceString( 6091, szMessage, INTERFACE_STRING_LENGTH); } break; case RC_ITEM_CANT_COMBINED_WITH_ITEM: { //< ??? ???????? ?????? ?? ???????. g_InterfaceManager.GetInterfaceString(6094, szMessage, INTERFACE_STRING_LENGTH); } break; case RC_ITEM_CANT_COMBINED_WITH_DIFFERENT_ITEM: { //6095: ???? ?????? ?????? ?? ??????. g_InterfaceManager.GetInterfaceString(6095, szMessage, INTERFACE_STRING_LENGTH); } break; case RC_ITEM_UNAVAILABLE_TARGET: { // 3433 ?????? ??? ???????? ?????? ???????. g_InterfaceManager.GetInterfaceString(3433, szMessage, INTERFACE_STRING_LENGTH); } break; case RC_ITEM_NOT_FRIEND: { // 3434 ??? ???????? ??? ?????????? ????? ?? ??????. g_InterfaceManager.GetInterfaceString(3434, szMessage, INTERFACE_STRING_LENGTH); } break; case RC_ITEM_HEIM_LOTTO_TICKET_MAX_REACHED: { //5889: ??? ?????? ?????? ?????? ???????????. g_InterfaceManager.GetInterfaceString(5889,szMessage); } break; case RC_ITEM_NOT_UNIDENTIFIED_SOCKET:// ????? ?????? ???? { //6486: ??? ???????? ???? ?????? ??? ??¥å?????, ???? ???????? ????? g_InterfaceManager.GetInterfaceString(5889,szMessage, INTERFACE_STRING_LENGTH); } break; case RC_ITEM_IS_SHORT_HAVE_ITEM: // ?????? ??? ???????? ??????? ???? ???? ???????? ???????. { TCHAR item_name[INTERFACE_STRING_LENGTH] = {0,}; TCHAR temp_string[INTERFACE_STRING_LENGTH] = {0,}; //47638 %s(??)?? ??????? ??? ???????? ?????? ?? ???????. g_InterfaceManager.GetInterfaceString(47638, temp_string, INTERFACE_STRING_LENGTH); ShopDialog* shop_dialog = static_cast(g_InterfaceManager.GetDialog(InterfaceManager::DIALOG_SHOP)); if (shop_dialog) { CODETYPE item_code = shop_dialog->currency_item_code(); g_InterfaceManager.GetItemName(item_code, item_name); } Sprintf(szMessage, temp_string, item_name); } break; case RC_ITEM_IS_SHORT_HAVE_ACCUMULATEPOINT: // ???? ????? ???????? ??????? ???? ???? ??????? ???????. { // 47639 ??????????? ??????? ??? ???????? ?????? ?? ???????. g_InterfaceManager.GetInterfaceString(47639, szMessage, INTERFACE_STRING_LENGTH); } break; #ifdef _NA_20100307_BETAKEY_SYSTEM case RC_ITEM_CANNOT_EQUIPMENT_BETAKEY: //??? ?????? ?????? ???? ?????? ??????? ???? ?????????. { // 70542 ?????? ???? ??? ??? ??? ?????? ?? ???????. g_InterfaceManager.GetInterfaceString(70542, szMessage, INTERFACE_STRING_LENGTH); } break; case RC_ITEM_CANNOT_USE_BETAKEY: //??? ?????? ?????? ???? ?????? ?????? ???? ?????????. { // 70543 ?????? ???? ??? ??? ??? ????? ?? ???????. g_InterfaceManager.GetInterfaceString(70543, szMessage, INTERFACE_STRING_LENGTH); } break; #endif//_NA_20100307_BETAKEY_SYSTEM // _NA_003027_20111013_HONOR_SYSTEM case RC_ITEM_BUY_ERROR_OF_FAME: { // 6516 ??? ???????? ??????? ???? ???? ????? ???????. g_InterfaceManager.GetInterfaceString(6516, szMessage, INTERFACE_STRING_LENGTH); } break; case RC_ITEM_BUY_ERROR_OF_REPUTE: { // 6517 ??? ???????? ??????? ???? ???? ????? ???????. g_InterfaceManager.GetInterfaceString(6517, szMessage, INTERFACE_STRING_LENGTH); } break; #ifdef _NA004034_20120102_POINT_WALLET_SYSTEM case RC_ITEM_FAILED_TO_EXCHANGE_CURRENCY_ITEM_BY_LIMIT: { // 70701 ?? ??? ??? ???????? ?????? ???? ?? ???????. g_InterfaceManager.GetInterfaceString(70701, szMessage, INTERFACE_STRING_LENGTH); } break; case RC_ITEM_FAILED_TO_BUY_BY_POINT: { // ... ShopDialog* shop_dialog = static_cast(g_InterfaceManager.GetDialog(InterfaceManager::DIALOG_SHOP)); if (shop_dialog != NULL) { DWORD currency_code = shop_dialog->currency_item_code(); CurrencyInfoParser::CurrencyInfo* currency_info = CurrencyInfoParser::Instance()->GetCurrencyInfo(currency_code); if (currency_info != NULL) { TCHAR currency_name[INTERFACE_STRING_LENGTH] = {'\0', }; g_InterfaceManager.GetInterfaceString(currency_info->currency_name_code, currency_name); // 47638 %s(??)?? ??????? ??? ???????? ?????? ?? ???????. g_InterfaceManager.GetInterfaceStringFormat( szMessage, INTERFACE_STRING_LENGTH, 47638, currency_name); } } } break; #endif //_NA004034_20120102_POINT_WALLET_SYSTEM case RC_ITEM_DEAD_OWNER: { // 5691 ??? ???????? ???????? ???? ©¦????? ???? ???????? ????? ?? ???? ????????. g_InterfaceManager.GetInterfaceString(5691, szMessage, INTERFACE_STRING_LENGTH); } break; case RC_ITEM_BUY_ERROR_GUILD_LEVEL: { // 6871 ????? ?????? ???? ???? g_InterfaceManager.GetInterfaceString(6871, szMessage, INTERFACE_STRING_LENGTH); } break; case RC_ITEM_BUY_ERROR_GUILD_EXP: { // 6872 ?????? ?????? ???? ???? g_InterfaceManager.GetInterfaceString(6872, szMessage, INTERFACE_STRING_LENGTH); } break; #ifdef _NA_006689_20130503_CANNOTUSE_BUFFITEM case RC_ITEM_CANNOT_USE_ALREADY_APPLY_HIGHRANK_BUFF: { // 6880 ???? ?????? ?? ???? ????? ???? ?????? ??? ??????. ??? ?????? ????? ???? ?? ??????? ??????. g_InterfaceManager.GetInterfaceString(6880, szMessage, INTERFACE_STRING_LENGTH); } break; #endif // _NA_006689_20130503_CANNOTUSE_BUFFITEM #ifdef _NA_000000_20130521_DAILY_QUEST_RESET_ITEM case RC_ITEM_CANNOT_USE: { g_InterfaceManager.GetInterfaceString(5267, szMessage, INTERFACE_STRING_LENGTH); } break; #endif #ifdef _NA_008679_20160202_REWORK_BATTLEGROUND case RC_ITEM_EQUIP_FAILED_BATTLEGROUND: // ???????????????, ???????? ??? ???? ????? { // 3547 ???? ??????, ??? ???? ???¥ï????? ??? ???????? ????? ?? ???????. g_InterfaceManager.GetInterfaceString(3547, szMessage, INTERFACE_STRING_LENGTH); } break; case RC_ITEM_CANNOT_USE_BATTLEGROUND: // ?????????? ????? ?? ???? ?????? { // 3546 ?????? ????? ?? ???? ?????? ????. g_InterfaceManager.GetInterfaceString(3546, szMessage, INTERFACE_STRING_LENGTH); } break; #endif //_NA_008679_20160202_REWORK_BATTLEGROUND case RC_ITEM_FAILED: case RC_ITEM_UNKNOWNERROR: // ??? ???? ????, ????????????? ????? ?????? ??? ????? ???? ?????? ??? default: { // ??? ???? ????! g_InterfaceManager.GetInterfaceString( eST_RC_ITEM_UNKNOWNERROR, szMessage, INTERFACE_STRING_LENGTH ); } break; } GlobalFunc::OutputMsg_Notice( DisplayOption, szMessage ); } VOID ItemManager::AddUpdateItemSlot( SCSlot * pItemSlot ) { SCItemSlot * pRefItemSlot = (SCItemSlot *)pItemSlot; if ( !pRefItemSlot ) return; if (IsChargeItem(pRefItemSlot) == false) { return; } BYTE charge_subtype = pRefItemSlot->GetItemRuleInfo().charge_sub_type; switch (charge_subtype) { case eCHARGE_SUB_RIDER_WITH_PART: case eCHARGE_SUB_FIXED_AMOUNT: case eCHARGE_SUB_FIXED_AMOUNT_EX: case eCHARGE_SUB_FIXED_QUANTITY: case eCHARGE_SUB_COORDINATE_EX: // ???? ???. break; // ???????? ????? ???????. default: return; break; } UPDATE_ITEMSLOT_ITR itr = m_UpdateItemSlotMap.find((VOID *)pItemSlot); if ( itr == m_UpdateItemSlotMap.end() ) { m_UpdateItemSlotMap.insert( UPDATE_ITEMSLOT_PAIR((VOID *)pItemSlot, pItemSlot) ); } else { assert(0); } } VOID ItemManager::RemoveUpdateItemSlot( SCSlot * pItemSlot ) { UPDATE_ITEMSLOT_ITR itr = m_UpdateItemSlotMap.find((VOID *)pItemSlot); if ( itr != m_UpdateItemSlotMap.end() ) { m_UpdateItemSlotMap.erase(itr); } } //---------------------------------------------------------------------------- /** ?¥ê???, ?????¥ê???, ???? ?¥ê???, ????? ??? ?????? ?????? ??????? ???. */ VOID ItemManager::UpdateItemSlot() { UPDATE_ITEMSLOT_ITR itr = m_UpdateItemSlotMap.begin(); for (; itr != m_UpdateItemSlotMap.end(); ++itr) { SCItemSlot * pItemSlot = (SCItemSlot *)itr->second; pItemSlot->Update((BOOL)g_pHero->GetPCBangMode()); } } VOID ItemManager::ClearUpdateItemSlot() { m_UpdateItemSlotMap.clear(); } bool ItemManager::CanPeriodExtend(SCItemSlot* item_slot) { if (item_slot == NULL) { return false; } BYTE charge_subtype = item_slot->GetItemRuleInfo().charge_sub_type; if (charge_subtype != eCHARGE_SUB_FIXED_AMOUNT_WAIT && charge_subtype != eCHARGE_SUB_FATE && charge_subtype != eCHARGE_SUB_RIDER_WITH_PART) { return false; } return true; } bool ItemManager::IsChargeItem(SCItemSlot* item_slot) { if (item_slot == NULL) { return false; } if ((item_slot->GetItemRuleInfo().IsEnableTimer() == false) && (item_slot->GetItemRuleInfo().IsEnableCoord() == false)) { return false; } return true; } #ifdef _NA_003033_20110831_DICECAST_ITEM_ROUTING bool ItemManager::CheckDrawDiceItem() { //????????? ?????? dicecast ????? ??? ???????? ????? ???????. Item *item_ptr; Object *object; SCObject sc_object; Object_Map_Itr object_itr = g_ObjectManager.GetBegin(); Object_Map_Itr object_itr_end = g_ObjectManager.GetEnd(); for( ; object_itr != object_itr_end; ++object_itr) { object = static_cast(object_itr->second); if (0 == object) { continue; } sc_object = (object_itr->second)->GetSCObject(); // ?????????? if (sc_object.GetObjectType() == ITEM_OBJECT) { item_ptr = static_cast(object); if (item_ptr->is_dice_item() == true) { return true; } } } return false; } #endif //_NA_003033_20110831_DICECAST_ITEM_ROUTING void ItemManager::UpdateOwnerList() { //????? ???? std::vector::iterator list_iter = update_owner_list_.begin(); std::vector::iterator list_iter_end = update_owner_list_.end(); while (list_iter != list_iter_end) { DWORD item_object_key = (*list_iter); Item* item_temp = static_cast(g_ObjectManager.GetObject(item_object_key)); if (item_temp == NULL) { list_iter = update_owner_list_.erase(list_iter); list_iter_end = update_owner_list_.end(); continue; } bool Is_changed = item_temp->UpdateOwner(); //?©£? ?????? ?? ?©£? ????? ???? if (Is_changed == true) { list_iter = update_owner_list_.erase(list_iter); list_iter_end = update_owner_list_.end(); item_temp->set_is_can_get_item(true); #ifdef _NA_003033_20110831_DICECAST_ITEM_ROUTING item_temp->set_is_dice_item(false); #endif //_NA_003033_20110831_DICECAST_ITEM_ROUTING continue; } #ifdef _NA_003033_20110831_DICECAST_ITEM_ROUTING if (item_temp->is_dice_item() == false) #endif //_NA_003033_20110831_DICECAST_ITEM_ROUTING { bool is_can_get = false; if (item_temp->GetItemType() == ITEM_RENDER_INFO::eFIELDITEM_MONEY) { is_can_get = GlobalFunc::CanGetHaim(item_temp); } else { is_can_get = GlobalFunc::IsMyItem(item_temp); //???? ?? ??? ?????? ????? } item_temp->set_is_can_get_item(is_can_get); if (is_can_get == true) { list_iter = update_owner_list_.erase(list_iter); list_iter_end = update_owner_list_.end(); continue; } } ++list_iter; } } void ItemManager::AddOwnerList(DWORD item_key) { update_owner_list_.push_back(item_key); } void ItemManager::ClearOwnerList() { update_owner_list_.clear(); } void ItemManager::UpdateCanGetACItem(SLOTCODE item_code) { //????????? ?????? ??? AC???????? *??©ª? ??????? Item *item_ptr; Object *object; SCObject sc_object; Object_Map_Itr object_itr = g_ObjectManager.GetBegin(); for( object_itr = g_ObjectManager.GetBegin() ; object_itr != g_ObjectManager.GetEnd() ; ++object_itr ) { object = static_cast(object_itr->second); if (0 == object) { return; } sc_object = (object_itr->second)->GetSCObject(); // ?????????? if( sc_object.GetObjectType() == ITEM_OBJECT ) { item_ptr = static_cast(object); if (item_ptr->GetItemSlot().GetItemInfo()->m_Code == item_code) { item_ptr->set_is_can_get_item(false); } } } } void ItemManager::UpdateMyItem() { //????????? ?????? ???????? *??©ª? ??????? Item *item_ptr; Object *object; SCObject sc_object; Object_Map_Itr object_itr = g_ObjectManager.GetBegin(); for( object_itr = g_ObjectManager.GetBegin() ; object_itr != g_ObjectManager.GetEnd() ; ++object_itr ) { object = static_cast(object_itr->second); if (0 == object) { return; } sc_object = (object_itr->second)->GetSCObject(); // ?????????? if( sc_object.GetObjectType() == ITEM_OBJECT ) { item_ptr = static_cast(object); bool is_can_get; if (item_ptr->GetItemType() == ITEM_RENDER_INFO::eFIELDITEM_MONEY) { is_can_get = GlobalFunc::CanGetHaim(item_ptr); } else { is_can_get = GlobalFunc::IsMyItem(item_ptr); } item_ptr->set_is_can_get_item(is_can_get); if ((is_can_get == false) #ifdef _NA_003033_20110831_DICECAST_ITEM_ROUTING || (item_ptr->is_dice_item() == true) #endif //_NA_003033_20110831_DICECAST_ITEM_ROUTING ) { AddOwnerList(item_ptr->GetObjectKey()); } } } } //---------------------------------------------------------------------------- /** */ const SCSkillSlot * ItemManager::GetSkillSlotByCode(CODETYPE code) { uiSkillMan* ui_skill_man = GET_DIALOG_MANAGER(uiSkillMan, UIMAN_SKILL); if (ui_skill_man == NULL) { return NULL; } return ui_skill_man->GetSkillSlotByCode(code); } BOOL ItemManager::IsItemDeleteAvalibeState(POSTYPE pos) { SCSlotContainer* pInventory = g_pHero->GetSlotContainer(SI_INVENTORY); if (pInventory) { SCItemSlot& rItemSlot = (SCItemSlot&)pInventory->GetSlot(pos); BOOL bAvailbeState = TRUE; if (rItemSlot.GetLaxLock()->IsLock()) { bAvailbeState = FALSE; MouseHandler::Instance()->UnLockWasteDeleteItem(); } if (rItemSlot.IsLocked()) { bAvailbeState = FALSE; NoticeReasonItemErrorCode(RC_ITEM_INVALIDPOS); } if (bAvailbeState == FALSE) { TCHAR szMessage[INTERFACE_STRING_LENGTH] = {0,}; //5311 ????? ??????????? ?????? ?? ???????. g_InterfaceManager.GetInterfaceString(5311, szMessage, INTERFACE_STRING_LENGTH); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage); return FALSE; } } return TRUE; } bool ItemManager::SetItemLock(SLOTIDX slotIndex, POSTYPE atPos, bool bLock) { if( slotIndex != SI_INVENTORY ) { assert(!"?¥ê????? ??? ??????? Lock?? ????????."); return false; } SCSlotContainer * pContainer = ItemManager::Instance()->GetContainer( SI_INVENTORY );; if( pContainer ) { SCItemSlot & pTargetItem = ( SCItemSlot&) pContainer->GetSlot(atPos); pTargetItem.SetLock(bLock); return true; } return false; } ////////////////////////////////////////////////////////////////////////// void ItemManager::MessageforItem(POSTYPE ItemPos) //??????? ?? ??? ??? ???? ??? ???? { SCSlotContainer * pFromContainer = ItemManager::Instance()->GetContainer( SI_INVENTORY ); SCItemSlot& SlotTemp = (SCItemSlot&)pFromContainer->GetSlot(ItemPos); const BASE_ITEMINFO* pItemInfo = SlotTemp.GetItemInfo(); TCHAR szMessage[INTERFACE_STRING_LENGTH] = {0,}; if(eITEMWASTE_STAT_POINT_UP == pItemInfo->m_byWasteType) { g_InterfaceManager.GetInterfaceString(5070, szMessage, INTERFACE_STRING_LENGTH); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CENTER_SHOW , szMessage ); } else if(eITEMWASTE_GUILDWAREHOUSE_SLOTCASH == pItemInfo->m_byWasteType) { //6172 ?????????? ??? ????? ?????? ??? ????????. g_InterfaceManager.GetInterfaceString(6172, szMessage, INTERFACE_STRING_LENGTH); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CENTER_SHOW , szMessage ); } else if (eITEMTYPE_EXTEND_CHARACTER_SLOT == pItemInfo->m_wType) { //5992 ©¦???? ?????? ?????????? ??? ????????. ©¦???? ????????? ????? ????????. g_InterfaceManager.GetInterfaceString(5992, szMessage, INTERFACE_STRING_LENGTH); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CENTER_SHOW , szMessage ); } } ////////////////////////////////////////////////////////////////////////// //-------------------------------------------------------------------------------------------------- /** ??????? ?????????? ??(?????,?¥ì?????????,???,?????,???)??? */ bool ItemManager::IsInvalidEtheriaExtract(POSTYPE slot_pos, POSTYPE etherealizer_pos) { SCSlotContainer* slot_container = GetContainer(SI_INVENTORY); if (slot_container == NULL) { return false; } SCItemSlot& etherealizer_item = (SCItemSlot&)slot_container->GetSlot(etherealizer_pos); if ((etherealizer_item.IsContainValidItem() == FALSE)|| (etherealizer_item.GetItemInfo()->m_wType != eITEMTYPE_ETHEREALIZER)) { return false; } SCItemSlot& slot_item = (SCItemSlot&)slot_container->GetSlot(slot_pos); if (slot_item.IsContainValidItem() == FALSE) { return false; } RC::eITEM_RESULT result; if (slot_item.CanExtractToEtheria(&result) == false) { NoticeReasonItemErrorCode(result); return false; } return true; } //-------------------------------------------------------------------------------------------------- /** ??????? ©¦???????(C2S) */ void ItemManager::SendEtheriaCastingStart(POSTYPE slot_pos, POSTYPE etherealizer_pos) { if (g_pHero == NULL) { return; } //????????¢¯????? ????? if (g_pHero->IsRiding()) { //6093:????? ??? ????????¢¯????? ?????? ?????????. GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CENTER_SHOW , g_InterfaceManager.GetInterfaceString(6093)); return; } if (g_pHero->GetCurState() == STATE::SUMMON_RIDER) { return; } //???? ??? uiInventoryMan* inventory_manager = GET_DIALOG_MANAGER(uiInventoryMan, UIMAN_INVENTORY); if (inventory_manager != NULL) { inventory_manager->LockInventorySlot(slot_pos); inventory_manager->LockInventorySlot(etherealizer_pos); } // ??????? ©¦?????????? MSG_CG_ITEM_ETHERIA_CONTROL_SYN send_packet; send_packet.header.request = send_packet.header.eReq_CastingStart; send_packet.header.args.extract.slot_pos = slot_pos; send_packet.header.args.extract.etherealizer_pos = etherealizer_pos; GlobalFunc::SendPacket(CI_GAMESERVERIDX, &send_packet, sizeof(send_packet)); } //-------------------------------------------------------------------------------------------------- /** ??????? ???????(C2S) */ void ItemManager::SendEtheriaExtractPacket(POSTYPE slot_pos, POSTYPE etherealizer_pos) { // ??????? ???? ??? ???????(??????,????????????) MSG_CG_ITEM_ETHERIA_CONTROL_SYN send_packet; send_packet.header.request = send_packet.header.eReq_Extract; send_packet.header.args.extract.slot_pos = slot_pos; send_packet.header.args.extract.etherealizer_pos = etherealizer_pos; GlobalFunc::SendPacket(CI_GAMESERVERIDX, &send_packet, sizeof(send_packet)); } //-------------------------------------------------------------------------------------------------- /** ??????? ???????(C2S) */ void ItemManager::SendEtheriaCombinationPacket(POSTYPE to_pos, POSTYPE from_pos) { // ??????? ???? ??? ???????(??????,????????????) MSG_CG_ITEM_ETHERIA_CONTROL_SYN send_packet; send_packet.header.request = send_packet.header.eReq_Combine; send_packet.header.args.combine.from_etheria = from_pos; send_packet.header.args.combine.to_shell = to_pos; GlobalFunc::SendPacket(CI_GAMESERVERIDX, &send_packet, sizeof(send_packet)); } //-------------------------------------------------------------------------------------------------- /** ???? ??? ???????? ?? ???? ???????? ???? ??? */ bool ItemManager::IsInvalidSocketIdentify(POSTYPE slot_pos, POSTYPE socket_item_pos) { SCSlotContainer* slot_container = GetContainer(SI_INVENTORY); if (slot_container == NULL) { return false; } SCItemSlot& slot_item = (SCItemSlot&)slot_container->GetSlot(slot_pos); if (slot_item.IsContainValidItem() == FALSE) { return false; } // RC::eITEM_RESULT result; int socket_number = -1; switch (slot_item.GetSocketIdentifyType()) { case eSOCKET_UNIDENTIFIED_ITEM://????? case eSOCKET_IDENTIFIED_ITEM://?????????¥å? { socket_number = 0; } break; case eSOCKET_IDENTIFY_NOT_PROCESS: // ???? ??? case eSOCKET_FAIL_IDENTIFY_PROCESS:// ???? 0???? ?????? default: socket_number = -1; break; } if (socket_number < -1) { NoticeReasonItemErrorCode(RC::RC_ITEM_NOT_MIXTURE); } return true; } #ifdef _NA_0_20111012_ITEM_DATE_EXTEND // ?????? ?????? namespace local_extend_item_data { POSTYPE local_source_position, local_target_position; void _OnComfirmExtendItemData( bool yes ) { if( yes ) { MSG_CG_ITEM_USE_EXTEND_DATE_SYN msg; msg.extend_item_position_ = local_source_position; msg.target_item_position_ = local_target_position; GlobalFunc::SendPacket(CI_GAMESERVERIDX, &msg, sizeof(msg)); } } }; void ItemManager::SendExtendItemDate(POSTYPE source_pos, POSTYPE target_pos ) { SCSlotContainer* slot_container = GetContainer(SI_INVENTORY); if (slot_container == NULL) { return; } SCItemSlot& target_item = (SCItemSlot&)slot_container->GetSlot(target_pos); SCItemSlot& source_item = (SCItemSlot&)slot_container->GetSlot(source_pos); // target itemname TCHAR target_name[MAX_ITEMNAME_LENGTH]; g_InterfaceManager.GetItemName( target_item.GetItemCode(), target_name, MAX_ITEMNAME_LENGTH ); // extend date TCHAR extend_data[1024]; wsprintf( extend_data, "%d", source_item.GetItemInfo()->m_MaterialCode ); // [%s] [%s] use ok? TCHAR message[INTERFACE_STRING_LENGTH]; g_InterfaceManager.GetInterfaceString( 2567, message, INTERFACE_STRING_LENGTH); TCHAR result[INTERFACE_STRING_LENGTH]; wsprintf( result, message, target_name, extend_data ); //Snprintf( result, INTERFACE_STRING_LENGTH-1, target_name, message ); local_extend_item_data::local_source_position = source_pos; local_extend_item_data::local_target_position = target_pos; uiSystemMan* pSystemMan = (uiSystemMan*)g_InterfaceManager.GetUserInterfaceManager(UIMAN_SYSTEM); pSystemMan->Sys_Confirm(result, local_extend_item_data::_OnComfirmExtendItemData); } #endif//_NA_0_20111012_ITEM_DATE_EXTEND #ifdef _NA_003740_20111122_RANDOM_ITEM namespace local_randomize_item { POSTYPE local_source_position, local_target_position; void _OnConfirm( bool yes ) { if( yes ) { MSG_CG_ITEM_RANDOMIZE_SYN msg; msg.request_item_pos = local_source_position; msg.target_item_pos = local_target_position; GlobalFunc::SendPacket(CI_GAMESERVERIDX, &msg, sizeof(msg)); } } }; void ItemManager::SendRandomizeItem(POSTYPE source_pos, POSTYPE target_pos ) { RandomItemParser* parser = RandomItemParser::Instance(); SCItemSlotContainer* inventory = (SCItemSlotContainer*)g_pHero->GetSlotContainer( SI_INVENTORY ); SCItemSlot* request_item; SCItemSlot* target_item; if( parser->EnableItemRandomize( *inventory, source_pos, target_pos, request_item, target_item ) ) { SCItemSlot& target_item = (SCItemSlot&)inventory->GetSlot(target_pos); // target itemname TCHAR target_name[MAX_ITEMNAME_LENGTH]; g_InterfaceManager.GetItemName( target_item.GetItemCode(), target_name, MAX_ITEMNAME_LENGTH ); TCHAR message[INTERFACE_STRING_LENGTH]; g_InterfaceManager.GetInterfaceString( 6322, message, INTERFACE_STRING_LENGTH); //[%s]??????? ?©£??? ????? ????? ????? ??? ?¥ï???©£?????? \n(???? ????? ??? ??????? ???¥ï? ????? ??? ?¥ï? ????.) TCHAR buffer[INTERFACE_STRING_LENGTH]; wsprintf(buffer, message, target_name ); local_randomize_item::local_source_position = source_pos; local_randomize_item::local_target_position = target_pos; uiSystemMan* pSystemMan = (uiSystemMan*)g_InterfaceManager.GetUserInterfaceManager(UIMAN_SYSTEM); pSystemMan->Sys_Confirm(buffer, local_randomize_item::_OnConfirm ); } else { // 5146 ????? ??? ?? ?? ???? ??????????. TCHAR buffer[INTERFACE_STRING_LENGTH]; g_InterfaceManager.GetInterfaceString(5146, buffer, INTERFACE_STRING_LENGTH); GlobalFunc::OutputMsg_SysMsg(buffer); } } #endif