Files
Sun1602/Server/GameServer/Slot/ItemFunctionItemProperty.cpp
2022-10-26 12:25:11 +08:00

106 lines
3.3 KiB
C++

#include "stdafx.h"
#include "./ItemManager_ItemFunction.h"
#include "ItemManager.h"
#include "InventorySlotContainer.h"
//==================================================================================================
namespace nsSlot {
;
// NOTE: sub-manager is implemented to decompose ItemManager.
// this object has not extra members and virtual function table except the instance of ItemManager.
BOOST_STATIC_ASSERT(sizeof(nsSlot::ItemFunctionItemProperty) == sizeof(ItemManager*) * 2);
}; //end of namespace
//==================================================================================================
// CHANGES: f110611.1L, moved from ItemManager_Use_EXCEPTION_PACKET.cpp
RC::eITEM_RESULT nsSlot::ItemFunctionItemProperty::UseHammerOfAlchemist(
POSTYPE ChargeItemPos, POSTYPE TargetPos)
{
SCSlotContainer * pContainer = root_->GetItemSlotContainer(SI_INVENTORY);
if (!root_->ValidState())
return RC::RC_ITEM_INVALIDSTATE;
if (!root_->ValidPos(SI_INVENTORY, ChargeItemPos))
return RC::RC_ITEM_INVALIDPOS;
if (!root_->ValidPos(SI_INVENTORY, TargetPos))
return RC::RC_ITEM_INVALIDPOS;
SCItemSlot & rChargeItemSlot = (SCItemSlot &)pContainer->GetSlot(ChargeItemPos);
if (!rChargeItemSlot.GetItemInfo())
return RC::RC_ITEM_NOINFO;
SCItemSlot & rTargetItemSlot = (SCItemSlot &)pContainer->GetSlot(TargetPos);
if (!rTargetItemSlot.GetItemInfo())
return RC::RC_ITEM_NOINFO;
//연금술사의 망치를 사용했는가?
if (rChargeItemSlot.GetItemInfo()->m_wType != eITEMTYPE_HAMMER_OF_ALCHEMIST ||
(rChargeItemSlot.GetNum() == 0))
{
return RC::RC_ITEM_INVALID_TYPE;
};
//수리 대상이 리미티드 아이템인가?
if (!rTargetItemSlot.IsLimited())
return RC::RC_ITEM_NOT_LIMITED_ITEM;
// 명공의 망치 내구도 체크
if (!rTargetItemSlot.IsNeedToRepair())
return RC::RC_ITEM_DONT_NEED_TO_REPAIR;
#ifdef __NA_1024_MODIFY_LIMITED_ITEM_REPAIR_COUNT
//수리 가능 횟수 체크 안하는걸로 변경
#else
//수리 가능 횟수 체크
if (rTargetItemSlot.GetLimitedRepairCount() <= 0)
return RC::RC_ITEM_OVER_REPAIR_COUNT;
#endif
//쿨타임 체크
RC::eITEM_RESULT rcResult = root_->player_->CanUseItem(rChargeItemSlot.GetItemInfo());
if (rcResult != RC::RC_ITEM_SUCCESS)
return rcResult;
//수리
rTargetItemSlot.RepairMaxDura();
rTargetItemSlot.SetDura(rTargetItemSlot.GetMaxDura());
GAMELOG->LogItem(ITEM_USE, root_->player_, &rChargeItemSlot);
//연금술사의 망치(유료 아이템) 삭제
root_->Lose(pContainer, ChargeItemPos, 1);
WORD wCoolTimeType = rChargeItemSlot.GetItemInfo()->m_wCoolTimeType;
//쿨타임
root_->player_->ResetUseItem(wCoolTimeType);
return RC::RC_ITEM_SUCCESS;
}
// CHANGES: f110611.1L, moved from ItemManager_Use_EXCEPTION_PACKET.cpp
#ifdef _NA_002050_20110216_ADD_GENDER
// 캐릭터 슬롯 확장 아이템을 사용한다.
RC::eITEM_RESULT nsSlot::ItemFunctionItemProperty::UseExtendCharSlotItem(
const SLOTIDX inven_type, const POSTYPE inven_position)
{
if (inven_type != SI_INVENTORY)
{
return RC::RC_ITEM_INVALIDPOS;
}
MSG_DG_OTHER_EXTEND_CHAR_SLOT_SYN msg;
{
msg.Init();
msg.extend_item_position = inven_position;
}
root_->player_->SendToGameDBPServer(&msg, msg.GetSize());
return RC::RC_ITEM_PROCESS_PENDING;
}
#endif