⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vendorslotcontainer.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 CPP
字号:
#include "StdAfx.h"
#include ".\vendorslotcontainer.h"
#include ".\VendorSlot.h"
#include ".\Player.h"
#include ".\ItemManager.h"
#include <SCItemSlotContainer.h>
#include <StructInPacket.h>


VendorSlotContainer::VendorSlotContainer(void)
{
	Init( MAX_PERSONAL_VENDOR_SLOT_NUM, SI_VENDOR_BUY );
	m_ObserverPlayerHash.Initialize( MAX_PERSONAL_VENDOR_SLOT_NUM );
}

VendorSlotContainer::~VendorSlotContainer(void)
{
	DestroyVendor();
}

VOID VendorSlotContainer::Init( POSTYPE MaxSlotSize, SLOTIDX SlotIdx )
{
	m_nSlotNum		= 0;
	m_SlotIdx		= SlotIdx;
	m_nMaxSlotNum	= MaxSlotSize;
	m_ppSlotArray	= new SCSlot*[MaxSlotSize];
	for(POSTYPE i=0;i<MaxSlotSize;++i)
		m_ppSlotArray[i] = new VendorSlot;
	ClearAll();
}

VOID VendorSlotContainer::DestroyVendor()
{
	Player * pPlayer = NULL;
	m_ObserverPlayerHash.SetFirst();
	while( (pPlayer = m_ObserverPlayerHash.GetNext()) != NULL )
	{
		pPlayer->SetVendorContainer(NULL);
		pPlayer->SetBehave(PLAYER_BEHAVE_IDLE_STATE);
	}
	m_ObserverPlayerHash.RemoveAll();
}

BOOL VendorSlotContainer::CreateVendor( Player * pEstablisher, TCHAR * pszTitle, ESTABLISHER_VENDOR_TOTAL_INFO & IN TotalInfo )
{
	//檬扁拳
	ClearAll();

	ASSERT( m_ObserverPlayerHash.GetDataNum() == 0 );
	memcpy( m_pszVendorTitle, pszTitle, sizeof(TCHAR)*MAX_VENDOR_TITLE_LENGTH );

	// 干滚 檬扁拳
	m_pEstablishedPlayer = pEstablisher;

	SCSlotContainer * pInventory = pEstablisher->GetItemManager()->GetItemSlotContainer(SI_INVENTORY);
	
	// 惑痢芒俊 VendorSlot Item 盲框
	BOOL rt = TRUE;
	VendorSlot slot;
	POSTYPE orgPos = 0;
	POSTYPE vendorPos = 0;
	for( POSTYPE i = 0  ; i < TotalInfo.m_Count ; ++i )
	{
		orgPos = TotalInfo.m_Slot[i].m_OrgPos;
		if( !pInventory->ValidPos(orgPos) ) return FALSE;
		if( pInventory->IsEmpty(orgPos) ) return FALSE;
		
		SCItemSlot & rItemSlot = (SCItemSlot & )pInventory->GetSlot(orgPos);
		if( rItemSlot.GetNum() < TotalInfo.m_Slot[i].m_Dura ) return FALSE;

		vendorPos = TotalInfo.m_Slot[i].m_VendorPos;
		if( !ValidPos(vendorPos) || !IsEmpty(vendorPos) ) return FALSE;

		slot.Create( rItemSlot, TotalInfo.m_Slot[i].m_Dura, TotalInfo.m_Slot[i].m_Money );
		rt = InsertSlot( vendorPos, slot );
		ASSERT( rt );
	}


	
	return rt;
}

BOOL VendorSlotContainer::ModifySlot( POSTYPE AtPos, VENDOR_ITEMSLOT & IN SlotInfo )
{
	SCSlotContainer * pInventory = m_pEstablishedPlayer->GetItemManager()->GetItemSlotContainer(SI_INVENTORY);

	POSTYPE orgPos = SlotInfo.m_OrgPos;
	if( !pInventory->ValidPos(orgPos) ) return FALSE;
	if( pInventory->IsEmpty(orgPos) ) return FALSE;

	SCItemSlot & rItemSlot = (SCItemSlot & )pInventory->GetSlot(orgPos);
	if( rItemSlot.GetNum() < SlotInfo.m_Dura ) return FALSE;
	
	POSTYPE vendorPos = SlotInfo.m_VendorPos;
	if( !ValidPos(vendorPos) ) return FALSE;

	VendorSlot slot;
	slot.Create( rItemSlot, SlotInfo.m_Dura, SlotInfo.m_Money );
	if( IsEmpty(vendorPos) )
	{
		BOOL rt = InsertSlot( vendorPos, slot );
		ASSERT( rt );
	}
	else
		UpdateSlot( vendorPos, slot );

	return TRUE;
}

VOID VendorSlotContainer::GetTotalInfo( VENDOR_TOTAL_INFO & OUT VendorTotalInfo )
{
	VendorTotalInfo.m_Count = 0;
	for( POSTYPE i = 0  ; i < GetMaxSlotNum() ; ++i )
	{
		if( !IsEmpty(i) )
		{
			VendorSlot & rSlot = (VendorSlot & )GetSlot(i);
			rSlot.CopyOut(VendorTotalInfo.m_Slot[VendorTotalInfo.m_Count]);
			++VendorTotalInfo.m_Count;
		}
	}
}
BOOL VendorSlotContainer::IsLocked( POSTYPE AtPos )
{
	ASSERT( AtPos < GetMaxSlotNum() );

	return ((VendorSlot*)(m_ppSlotArray[AtPos]))->IsLocked();
}

VOID VendorSlotContainer::SetLock( POSTYPE AtPos, BOOL val )
{
	ASSERT( AtPos < GetMaxSlotNum() );
	((VendorSlot*)(m_ppSlotArray[AtPos]))->SetLock(val);
}
VOID VendorSlotContainer::AddObserver( Player * pPlayer )
{
	ASSERT( NULL == m_ObserverPlayerHash.GetData( pPlayer->GetObjectKey() ) );
	m_ObserverPlayerHash.Add( pPlayer, pPlayer->GetObjectKey() );
}
VOID VendorSlotContainer::RemoveObserver( Player * pPlayer )
{
	ASSERT( NULL != m_ObserverPlayerHash.GetData( pPlayer->GetObjectKey() ) );
	m_ObserverPlayerHash.Remove( pPlayer->GetObjectKey() );
}

BOOL VendorSlotContainer::IsEmpty( POSTYPE AtPos )
{
	return ( m_ppSlotArray[AtPos]->GetSerial() == 0 );
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -