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

170 lines
5.4 KiB
C++

#include "StdAfx.h"
#ifdef _NA_0_20110613_GAME_SHOP_RENEWAL
#include "UseExtendDateItemImplement.h"
#include <SCItemSlotContainer.h>
#include <ItemTypeList.h>
#include ".\ItemManager.h"
#include ".\Player.h"
UseExtendDateItemImplement::UseExtendDateItemImplement()
{
}
UseExtendDateItemImplement::~UseExtendDateItemImplement()
{
}
void UseExtendDateItemImplement::Implement(MSG_CG_ITEM_USE_EXTEND_DATE_SYN* recv_message)
{
Player* player = PlayerManager::Instance()->FindPlayerByUserKey(recv_message->m_dwKey);
ASSERT(player);
if(player == NULL)
return ;
if(!player->GetField())
{
SUNLOG( eCRITICAL_LOG, "[Handler_CG_ITEM_IMPL( CG_ITEM_USE_EXTEND_DATE_SYN )] Not Exist GameField" );
return;
}
RC::eITEM_RESULT result = Use_Extend_Date_Applier(player,
recv_message->extend_item_position_,
recv_message->target_item_position_);
if (result != RC::RC_ITEM_SUCCESS)
{
MSG_CG_ITEM_USE_EXTEND_DATE_NAK nak_message;
nak_message.error_code_ = result;
player->SendPacket(&nak_message, sizeof(nak_message));
return;
}
}
RC::eITEM_RESULT UseExtendDateItemImplement::Use_Extend_Date_Applier(Player* player,
POSTYPE applier_position,
POSTYPE target_position)
{
ItemManager* item_manager = player->GetItemManager();
if (!item_manager->ValidPos(SI_INVENTORY, applier_position, true))
return RC::RC_ITEM_INVALIDPOS;
if (!item_manager->ValidPos(SI_INVENTORY, target_position, true))
return RC::RC_ITEM_INVALIDPOS;
SCSlotContainer* slot_container = item_manager->GetItemSlotContainer(SI_INVENTORY);
if (!slot_container)
return RC::RC_ITEM_INVALIDPOS;
SCItemSlot& target_item_slot = (SCItemSlot&)slot_container->GetSlot(target_position);
const BASE_ITEMINFO* target_item_info = target_item_slot.GetItemInfo();
if (!target_item_info)
return RC::RC_ITEM_FAILED;
SCItemSlot& applier_item_slot = (SCItemSlot&)slot_container->GetSlot(applier_position);
const BASE_ITEMINFO* applier_item_info = applier_item_slot.GetItemInfo();
if (!applier_item_info)
return RC::RC_ITEM_FAILED;
if (applier_item_info->m_wType != eITEMTYPE_WASTE)
return RC::RC_ITEM_INVALID_TYPE;
if (target_item_slot.CanUseMixture(MIXTURE_PERIOD_EXTEND) == false)
return RC::RC_ITEM_IMPOSSIBLE_PERIOD_EXTEND;
// 정액제(대기) 타입인지 체크
if (!target_item_info->CanPeriodExtend())
return RC::RC_ITEM_CANNOT_EXTEND_DATE;
// 기간이 다된 아이템만 기간 연장을 할 수 있다.
if (!target_item_slot.IsExpiredWaitTime())
return RC::RC_ITEM_CANNOT_EXTEND_DATE;
// BASE_ITEMINFO::m_MaterialCode 에 연장할 날짜가 설정되어있다.
DWORD64 day = applier_item_info->m_MaterialCode;
if (day == 0)
{
SUNLOG(eCRITICAL_LOG, "Use_Extend_Date_Applier : day => 0");
return RC::RC_ITEM_CANNOT_EXTEND_DATE;
}
bool extend_date_flag = false;
switch (applier_item_info->m_byWasteType)
{
case eITEMWASTE_EXTEND_DATE_WEAPON:
{
if (!target_item_info->IsWeapon())
break;
if (target_item_info->m_wEqPos == eEQUIPCONTAINER_WEAPON)
extend_date_flag = true;
}
break;
case eITEMWASTE_EXTEND_DATE_ARMOR:
{
if (!target_item_info->IsArmor())
break;
if (target_item_info->m_wEqPos >= eEQUIPCONTAINER_ARMOR &&
target_item_info->m_wEqPos <= eEQUIPCONTAINER_SACCESSORY3)
extend_date_flag = true;
}
break;
case eITEMWASTE_EXTEND_DATE_RIDER:
{
if (!target_item_info->IsRiderItem())
break;
extend_date_flag = true;
}
break;
case eITEMWASTE_EXTEND_DATE_RIDER_PARTS:
{
if (!target_item_info->IsRiderPartsItem())
break;
if (eRIDER_PARTS_POS::StartIndex <= target_item_info->m_wEqPos &&
target_item_info->m_wEqPos < eRIDER_PARTS_POS::EndIndex)
extend_date_flag = true;
}
break;
default:
break;
}
if (extend_date_flag == false)
return RC::RC_ITEM_INVALID_TYPE;
GAMELOG->LogItem(ITEM_USE, player, 1, &applier_item_slot, &target_item_slot);
// 기간 연장 아이템 감소 또는 삭제
if( applier_item_slot.IsOverlap() && ( applier_item_slot.GetNum() > 1 ) )
slot_container->UpdateSlot(applier_position, -1);
else
{
// 아이템 삭제 로그
GAMELOG->LogItem(ITEM_DELETE, player, &applier_item_slot, 0, applier_item_slot.GetNum());
slot_container->DeleteSlot(applier_position, NULL);
}
// 기간을 연장한다.
DWORD64 extend_date = 86400 * day; // (86400 = 60*60*24, 1일을 초단위로 환산)
target_item_slot.SetDateTime(extend_date);
target_item_slot.SetExpiredWaitTime(false);
// 아이템 슬롯정보 변화를 알린다.
MSG_CG_ITEM_USE_EXTEND_DATE_ACK ack_message;
ack_message.extend_item_position_ = applier_position;
ack_message.target_item_position_ = target_item_slot.GetPos();
target_item_slot.CopyOut(ack_message.target_item_stream_);
player->SendPacket(&ack_message, sizeof(ack_message));
return RC::RC_ITEM_SUCCESS;
}
#endif //_NA_0_20110613_GAME_SHOP_RENEWAL