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

233 lines
6.3 KiB
C++

#include "StdAfx.h"
#include ".\eventinventoryslotcontainer.h"
#include ".\EventItemSlot.h"
#include "Player.h"
#include <ItemInfoParser.h>
//_NA_001990_ACSYSTEM_ADD
#include "AchievementManager.h"
EventInventorySlotContainer::EventInventorySlotContainer(void)
{
Init( MAX_EVENT_INVENTORY_SLOT_NUM, SI_EVENT_INVENTORY );
m_eEventIvenState = EVENT_INVEN_STATE_UNAVAILABLE;
m_eEventIvenTransaction = EVENT_INVEN_TRANS_END;
}
EventInventorySlotContainer::~EventInventorySlotContainer(void)
{
}
SCSlot * EventInventorySlotContainer::CreateSlot()
{
return new EventItemSlot;
}
VOID EventInventorySlotContainer::InsertSlot( POSTYPE AtPos, EVENTSLOTEX & IN rSlotInfo )
{
if( rSlotInfo.m_ItemCode == 0 ) return;
if( rSlotInfo.m_ItemSeq == 0 ) return;
if( rSlotInfo.m_ItemCount == 0 ) return;
EventItemSlot& rSlot = (EventItemSlot&)GetSlot(AtPos);
rSlot.Serialize( rSlotInfo, SERIALIZE_STORE );
rSlot.SetPos( AtPos );
rSlot.SetSlotIdx( GetSlotIdx() );
++m_nSlotNum;
ASSERT( m_nSlotNum <= GetMaxSlotNum() );
}
VOID EventInventorySlotContainer::ClearAll()
{
SCItemSlotContainer::ClearAll();
Close();
}
VOID EventInventorySlotContainer::Close()
{
m_eEventIvenState = EVENT_INVEN_STATE_UNAVAILABLE;
m_eEventIvenTransaction = EVENT_INVEN_TRANS_END;
}
RC::eITEM_RESULT EventInventorySlotContainer::Open()
{
m_eEventIvenState = EVENT_INVEN_STATE_AVAILABLE;
return Select();
}
RC::eITEM_RESULT EventInventorySlotContainer::Select()
{
if( IsEventTransaction() ) return RC::RC_ITEM_EVENT_ALREADY_ANOTHER_TRANSACTION; /*RC::RC_EVENT_ALREADY_ANOTHER_TRANSACTION*/;
SetEventTransaction( EVENT_INVEN_TRANS_BEGIN_SELECT );
return RC::RC_ITEM_EVENT_SUCCESS /*RC::RC_EVENT_SUCCESS*/;
}
RC::eITEM_RESULT EventInventorySlotContainer::MoveItemToInventory( POSTYPE AtPos, DWORD & OUT ItemSeqOut )
{
if( IsEventTransaction() ) return RC::RC_ITEM_EVENT_ALREADY_ANOTHER_TRANSACTION; /*RC::RC_EVENT_ALREADY_ANOTHER_TRANSACTION*/;
SetEventTransaction( EVENT_INVEN_TRANS_BEGIN_SELECT );
if( AtPos >= GetMaxSlotNum() )
{
SUNLOG( eCRITICAL_LOG, _T("[Abuse]Hacking User:%s,Pos:%u"), m_pPlayer->GetCharName(), AtPos );
return RC::RC_ITEM_EVENT_FAILED /*RC::RC_EVENT_FAILED*/;
}
if( IsEmpty( AtPos) )
return RC::RC_ITEM_NOTEXIST_ITEM/* RC::RC_EVENT_NOTEXIST_EVENTITEM*/;
EventItemSlot & rSlot = (EventItemSlot &)GetSlot( AtPos );
if( !ItemInfoParser::Instance()->GetItemInfo(rSlot.GetCode()) )
return RC::RC_ITEM_INVALID_VALUE /*RC::RC_EVENT_INVALID_ITEMCODE*/;
SCItemSlot ItemSlot;
ItemSlot.SetCode(rSlot.GetCode());
m_TransactionInfo.m_ItemCode = rSlot.GetCode();
m_TransactionInfo.m_ItemCount = rSlot.GetNum();
m_TransactionInfo.m_DateTime = 0;
switch( ItemSlot.GetItemInfo()->m_ChargeSubType )
{
case eCHARGE_SUB_FIXED_AMOUNT:
case eCHARGE_SUB_FIXED_AMOUNT_EX:
case eCHARGE_SUB_FIXED_QUANTITY:
case eCHARGE_SUB_FIXED_AMOUNT_WAIT:
case eCHARGE_SUB_FATE:
case eCHARGE_SUB_COORDINATE_EX:
case eCHARGE_SUB_RIDER_WITH_PART:
case eCHARGE_SUB_RIDER_WITH_PART_NOTIMER:
case eCHARGE_SUB_FIXED_AMOUNT_EX2:
{
m_TransactionInfo.m_DateTime = rSlot.GetDateTime()*60;
}
break;
}
if( RC::RC_ITEM_SUCCESS != m_pPlayer->GetItemManager()->ReserveSpaceAllKindOfItem(
1, &m_TransactionInfo.m_ItemCode, &m_TransactionInfo.m_ItemCount, &m_TransactionInfo.m_DateTime,
NULL, NULL, NULL,
MAX_LOCKED_INFO_NUM, m_TransLockedInfo, &m_LockedCount ) )
{
return RC::RC_ITEM_ISNOTEMPTYSLOT /*RC::RC_EVENT_FULL_INVENTORY*/;
}
ItemSeqOut = static_cast<DWORD>(rSlot.GetSerial());
return RC::RC_ITEM_EVENT_SUCCESS /*RC::RC_EVENT_SUCCESS*/;
}
//////////////////////////////////////////////////////////////////////////
// 결과값을 받아서 처리하는 부분
//////////////////////////////////////////////////////////////////////////
VOID EventInventorySlotContainer::OnSelect( BOOL bSuccess, EVENT_ITEM_TOTAL_INFO_EX * IN pTotalInfo )
{
ASSERT( IsEventTransaction() );
SetEventTransaction( EVENT_INVEN_TRANS_END );
if( bSuccess )
{
if( GetSlotNum() > 0 ) SCItemSlotContainer::ClearAll();
for( int i = 0 ; i < pTotalInfo->m_Count ; ++i )
{
InsertSlot( i, pTotalInfo->m_Slot[i] );
}
}
else
{
}
}
VOID EventInventorySlotContainer::OnMoveItemToInventory( BOOL bSuccess, POSTYPE atPos, JUST_INVENTORY_TOTAL_INFO * OUT pTotalInfoOut )
{
ASSERT( IsEventTransaction() );
SetEventTransaction( EVENT_INVEN_TRANS_END );
if( bSuccess )
{
EventItemSlot EventSlot;
DeleteSlot( atPos, &EventSlot );
ASSERT( EventSlot.GetNum() != 0 );
const KindOfItemTag item_tag = { item_tag.Tag_None };
m_pPlayer->GetItemManager()->ObtainReservedAllKindOfItem(\
item_tag, m_TransLockedInfo, m_LockedCount, pTotalInfoOut);
SCItemSlot ItemSlot;
ItemSlot.SetCode(EventSlot.GetCode());
switch( ItemSlot.GetItemInfo()->m_ChargeSubType )
{
case eCHARGE_SUB_FIXED_AMOUNT:
case eCHARGE_SUB_FIXED_AMOUNT_EX:
case eCHARGE_SUB_FIXED_QUANTITY:
case eCHARGE_SUB_FIXED_AMOUNT_WAIT:
case eCHARGE_SUB_FATE:
case eCHARGE_SUB_COORDINATE_EX:
case eCHARGE_SUB_RIDER_WITH_PART:
case eCHARGE_SUB_RIDER_WITH_PART_NOTIMER:
case eCHARGE_SUB_FIXED_AMOUNT_EX2:
{
ItemSlot.SetDateTime( EventSlot.GetDateTime()*60 );
}
break;
}
// 로케트 베터리 이벤트 로그
GAMELOG->LogItemEx2( ITEM_EVENT_ROCKET, m_pPlayer, ItemSlot, 0, EventSlot.GetNum(),
EventSlot.GetSerial(), EventSlot.GetCode(), EventSlot.GetNum() );
//_NA_001990_ACSYSTEM_ADD
const BASE_ITEMINFO* item_info = ItemSlot.GetItemInfo();
int item_count = EventSlot.GetNum();
if (item_info->m_wACCode)
m_pPlayer->GetACManager()->ProcessItemObtain(item_info->m_Code, item_info->m_wACCode,
item_info->m_byACReferenceID, item_count);
}
else
{
}
}
VOID EventInventorySlotContainer::Serialize( EVENT_ITEM_TOTAL_INFO & rTotalInfo, eSERIALIZE se )
{
if( GetSlotNum() > MAX_EVENT_INVENTORY_SLOT_NUM )
{
SUNLOG( eCRITICAL_LOG, "[EventInventorySlotContainer] Invalid MaxSlotNum[%d/%d]", GetSlotNum(), MAX_EVENT_INVENTORY_SLOT_NUM );
return;
}
if( se == SERIALIZE_LOAD )
{
rTotalInfo.m_Count = GetSlotNum();
for( POSTYPE i = 0 ; i < GetSlotNum() ; ++i )
{
EventItemSlot & rSlot = (EventItemSlot&)GetSlot(i);
rTotalInfo.m_Slot[i].m_ItemCode = rSlot.GetCode();
rTotalInfo.m_Slot[i].m_ItemCount = rSlot.GetNum();
rTotalInfo.m_Slot[i].m_DateTime = rSlot.GetDateTime();
}
}
else
{
ASSERT( NULL );
}
}