📄 exchangeroom.cpp
字号:
#include "stdafx.h"
#include "ExchangeRoom.h"
#include "ExchangeManager.h"
#include "mapdbmsgparser.h"
#include "Player.h"
#include "ItemManager.h"
CExchangeRoom::CExchangeRoom()
{
}
CExchangeRoom::~CExchangeRoom()
{
}
void CExchangeRoom::Init( CPlayer* pPlayer1, CPlayer* pPlayer2 )
{
sEXCHANGECONTAINER ExchangeContainer;
m_ExchangeData[0].pPlayer = pPlayer1;
m_ExchangeData[0].bExchange = FALSE;
m_ExchangeData[0].bLock = FALSE;
m_ExchangeData[0].dwMoney = 0;
m_ExchangeData[0].nAddItemNum = 0;
ZeroMemory( m_ExchangeData[0].ItemInfo, sizeof(ITEMBASE)*MAX_EXCHANGEITEM );
m_ExchangeData[1].pPlayer = pPlayer2;
m_ExchangeData[1].bExchange = FALSE;
m_ExchangeData[1].bLock = FALSE;
m_ExchangeData[1].dwMoney = 0;
m_ExchangeData[1].nAddItemNum = 0;
ZeroMemory( m_ExchangeData[1].ItemInfo, sizeof(ITEMBASE)*MAX_EXCHANGEITEM );
ExchangeContainer.pRoom = this;
ExchangeContainer.nMyIndex = 0;
ExchangeContainer.pOpPlayer = pPlayer2;
pPlayer1->SetExchangeContainer( &ExchangeContainer );
ExchangeContainer.nMyIndex = 1;
ExchangeContainer.pOpPlayer = pPlayer1;
pPlayer2->SetExchangeContainer( &ExchangeContainer );
m_nExchangeState = EXCS_WAITING;
}
void CExchangeRoom::Exit()
{
//item lock 钱扁
CItemSlot* pItemSlot = NULL;
POSTYPE ItemPos;
for( int j = 0 ; j < 2 ; ++j )
for( int i = 0 ; i < m_ExchangeData[j].nAddItemNum ; ++i )
{
ItemPos = m_ExchangeData[j].ItemInfo[i].Position;
pItemSlot = m_ExchangeData[j].pPlayer->GetSlot( ItemPos );
if( pItemSlot )
pItemSlot->SetLock( ItemPos, FALSE );
}
//player data 檬扁拳
sEXCHANGECONTAINER ExchangeContainer; //檬扁拳窃
if( m_ExchangeData[0].pPlayer )
m_ExchangeData[0].pPlayer->SetExchangeContainer( &ExchangeContainer );
if( m_ExchangeData[1].pPlayer )
m_ExchangeData[1].pPlayer->SetExchangeContainer( &ExchangeContainer );
//
}
void CExchangeRoom::Lock( int nIndex, BOOL bLock )
{
if( bLock )
m_ExchangeData[nIndex].bLock = TRUE;
else
{
m_ExchangeData[0].bLock = FALSE;
m_ExchangeData[1].bLock = FALSE;
m_ExchangeData[0].bExchange = FALSE;
m_ExchangeData[1].bExchange = FALSE;
}
}
BOOL CExchangeRoom::IsAllLock()
{
if( m_ExchangeData[0].bLock && m_ExchangeData[1].bLock )
return TRUE;
return FALSE;
}
void CExchangeRoom::SetExchange( int nIndex )
{
m_ExchangeData[nIndex].bExchange = TRUE;
}
BOOL CExchangeRoom::IsAllExchange()
{
if( m_ExchangeData[0].bExchange && m_ExchangeData[1].bExchange )
return TRUE;
return FALSE;
}
BOOL CExchangeRoom::AddItem( int nPlayerIndex, ITEMBASE* pItemInfo )
{
if( IsLocked( nPlayerIndex ) ) return FALSE;
if( m_ExchangeData[nPlayerIndex].nAddItemNum >= MAX_EXCHANGEITEM )
return FALSE;
if( pItemInfo->QuickPosition != 0 ) return FALSE;
//辑滚俊档 酒捞袍 LOCK
CInventorySlot* pItemSlot = (CInventorySlot*)m_ExchangeData[nPlayerIndex].pPlayer->GetSlot( eItemTable_Inventory );
if( pItemSlot )
{
if( GetItemKind( pItemInfo->wIconIdx ) == eYOUNGYAK_ITEM )
{
if( pItemSlot->CheckQPosForItemIdx( pItemInfo->wIconIdx ) == FALSE )
return FALSE;
}
else
{
if( pItemSlot->GetItemInfoAbs( pItemInfo->Position )->QuickPosition != 0 )
return FALSE;
}
if( pItemSlot->IsLock( pItemInfo->Position ) ) return FALSE;
pItemSlot->SetLock( pItemInfo->Position, TRUE );
}
//
m_ExchangeData[nPlayerIndex].ItemInfo[m_ExchangeData[nPlayerIndex].nAddItemNum] = *pItemInfo;
++m_ExchangeData[nPlayerIndex].nAddItemNum;
return TRUE;
}
BOOL CExchangeRoom::DelItem( int nPlayerIndex, POSTYPE pos )
{
ASSERT( pos >=0 && pos < m_ExchangeData[nPlayerIndex].nAddItemNum );
if( IsLocked( nPlayerIndex ) ) return FALSE;
if( m_ExchangeData[nPlayerIndex].nAddItemNum <= 0 )
return FALSE;
//辑滚俊档 酒捞袍 UNLOCK
POSTYPE ItemAbsPos = m_ExchangeData[nPlayerIndex].ItemInfo[pos].Position;
CItemSlot* pItemSlot = m_ExchangeData[nPlayerIndex].pPlayer->GetSlot( ItemAbsPos );
if( pItemSlot )
pItemSlot->SetLock( ItemAbsPos, FALSE );
//
--m_ExchangeData[nPlayerIndex].nAddItemNum;
for( int i = pos ; i < m_ExchangeData[nPlayerIndex].nAddItemNum ; ++i )
{
m_ExchangeData[nPlayerIndex].ItemInfo[i] = m_ExchangeData[nPlayerIndex].ItemInfo[i+1];
}
return TRUE;
}
DWORD CExchangeRoom::InputMoney( int nPlayerIndex, DWORD dwMoney )
{
if( dwMoney > m_ExchangeData[nPlayerIndex].pPlayer->GetMoney() )
dwMoney = m_ExchangeData[nPlayerIndex].pPlayer->GetMoney();
m_ExchangeData[nPlayerIndex].dwMoney = dwMoney;
return dwMoney;
}
int CExchangeRoom::DoExchange()
{
CInventorySlot* pInventory[2];
pInventory[0] = (CInventorySlot*)m_ExchangeData[0].pPlayer->GetSlot( eItemTable_Inventory );
pInventory[1] = (CInventorySlot*)m_ExchangeData[1].pPlayer->GetSlot( eItemTable_Inventory );
if( pInventory[0] == NULL || pInventory[1] == NULL )
return eEE_ERROR;
//后磊府眉农 //瘤况龙 磊府档 绊妨茄促?(ok)
WORD EmptySellPos[2][MAX_EXCHANGEITEM];
WORD sOut;
if( m_ExchangeData[1].nAddItemNum > m_ExchangeData[0].nAddItemNum )
{
sOut = pInventory[0]->GetEmptyCell( EmptySellPos[0], m_ExchangeData[1].nAddItemNum - m_ExchangeData[0].nAddItemNum );
if( sOut != m_ExchangeData[1].nAddItemNum - m_ExchangeData[0].nAddItemNum )
return eEE_NOTENOUGHSPACE;
}
if( m_ExchangeData[0].nAddItemNum > m_ExchangeData[1].nAddItemNum )
{
sOut = pInventory[1]->GetEmptyCell( EmptySellPos[1], m_ExchangeData[0].nAddItemNum - m_ExchangeData[1].nAddItemNum );
if( sOut != m_ExchangeData[0].nAddItemNum - m_ExchangeData[1].nAddItemNum )
return eEE_NOTENOUGHSPACE;
}
//捣眉农
if( m_ExchangeData[0].dwMoney > m_ExchangeData[0].pPlayer->GetMoney() )
return eEE_NOTENOUGHMONEY;
if( m_ExchangeData[1].dwMoney > m_ExchangeData[1].pPlayer->GetMoney() )
return eEE_NOTENOUGHMONEY;
if( m_ExchangeData[1].dwMoney + m_ExchangeData[0].pPlayer->GetMoney() > MAX_INVENTORY_MONEY )
return eEE_MAXMONEY;
if( m_ExchangeData[0].dwMoney + m_ExchangeData[1].pPlayer->GetMoney() > MAX_INVENTORY_MONEY )
return eEE_MAXMONEY;
///////////////////////////////////////////////
//酒捞袍 八荤 内靛 持磊.. 力磊府俊 促 甸绢乐唱? 抛胶飘 鞘夸.
int i, j;
for( j = 0 ; j < 2 ; ++ j )
{
for( i = 0 ; i < m_ExchangeData[j].nAddItemNum ; ++i )
{
const ITEMBASE* pItemBase = pInventory[j]->GetItemInfoAbs( m_ExchangeData[j].ItemInfo[i].Position );
if( pItemBase->dwDBIdx != m_ExchangeData[j].ItemInfo[i].dwDBIdx ||
pItemBase->wIconIdx != m_ExchangeData[j].ItemInfo[i].wIconIdx ||
pItemBase->Durability != m_ExchangeData[j].ItemInfo[i].Durability ||
pItemBase->Position != m_ExchangeData[j].ItemInfo[i].Position )
return eEE_ERROR; //角力 牢亥配府客 背券芒狼 沥焊啊 促福促.
if( ITEMMGR->IsDupItem(pItemBase->wIconIdx) )
if( pItemBase->Durability > 5/*MAX_DURABILITY*/ )
return eEE_ERROR;
}
}
//夯惑怕肺 汗备啊 啊瓷茄啊?
/////////////
//EXCHANGE!!!
for( j = 0 ; j < 2 ; ++ j )
{
for( i = 0 ; i < m_ExchangeData[j].nAddItemNum ; ++i )
{
ITEMBASE ItemBase;
pInventory[j]->DeleteItemAbs( NULL, m_ExchangeData[j].ItemInfo[i].Position, &ItemBase, SS_LOCKOMIT ); //吝夸! 眉农.
//昏力 皋技瘤.. //葛酒辑 茄波锅俊 力芭窍磊.
MSG_EXCHANGE_REMOVEITEM RemoveMsg;
RemoveMsg.Category = MP_EXCHANGE;
RemoveMsg.Protocol = MP_EXCHANGE_REMOVE;
RemoveMsg.wAbsPosition = m_ExchangeData[j].ItemInfo[i].Position;
m_ExchangeData[j].pPlayer->SendMsg( &RemoveMsg, sizeof( RemoveMsg ) );
}
}
/*
sOut = pInventory[0]->GetEmptyCell( EmptySellPos[0], m_ExchangeData[1].nAddItemNum );
if( sOut != m_ExchangeData[1].nAddItemNum )
return FALSE;
sOut = pInventory[1]->GetEmptyCell( EmptySellPos[1], m_ExchangeData[0].nAddItemNum );
if( sOut != m_ExchangeData[0].nAddItemNum )
return FALSE;
*/
for( j = 0 ; j < 2 ; ++ j )
{
for( i = 0 ; i < m_ExchangeData[j].nAddItemNum ; ++i )
{
POSTYPE EmptyPos;
if( pInventory[!j]->GetEmptyCell( &EmptyPos ) == 0 ) //后傍埃 绝阑锭 俊矾眉农窍扁
{
ASSERT(0);
continue;
}
ItemUpdateToDB( m_ExchangeData[!j].pPlayer->GetID(), m_ExchangeData[j].ItemInfo[i].dwDBIdx,
m_ExchangeData[j].ItemInfo[i].wIconIdx, m_ExchangeData[j].ItemInfo[i].Durability,
EmptyPos, 0 );
m_ExchangeData[j].ItemInfo[i].Position = EmptyPos;
//itemoption
if( ITEMMGR->IsOptionItem( m_ExchangeData[j].ItemInfo[i].wIconIdx, m_ExchangeData[j].ItemInfo[i].Durability) )
{
m_ExchangeData[!j].pPlayer->AddItemOption(
m_ExchangeData[j].pPlayer->GetItemOption( m_ExchangeData[j].ItemInfo[i].Durability ) );
m_ExchangeData[j].pPlayer->RemoveItemOption( m_ExchangeData[j].ItemInfo[i].Durability );
// ItemOptionUpdateToDB( m_ExchangeData[j].ItemInfo[i].Durability, m_ExchangeData[!j].pPlayer->GetID() );
}
/////
int rt = pInventory[!j]->InsertItemAbs( NULL, EmptyPos, &m_ExchangeData[j].ItemInfo[i], SS_LOCKOMIT ); //Itembase俊辑 position父 官诧促.
ASSERT( rt == EI_TRUE );
//眠啊 皋技瘤... //葛酒辑 茄锅俊 焊郴绰 吧肺 背眉窍磊. confirm
MSG_ITEM InsertMsg;
InsertMsg.Category = MP_EXCHANGE;
InsertMsg.Protocol = MP_EXCHANGE_INSERT;
InsertMsg.ItemInfo = m_ExchangeData[j].ItemInfo[i];
m_ExchangeData[!j].pPlayer->SendMsg( &InsertMsg, sizeof( MSG_ITEM ) );
LogItemMoney(m_ExchangeData[j].pPlayer->GetID(), m_ExchangeData[j].pPlayer->GetObjectName(),
m_ExchangeData[1-j].pPlayer->GetID(), m_ExchangeData[1-j].pPlayer->GetObjectName(),
eLog_Exchange, m_ExchangeData[j].pPlayer->GetMoney(), m_ExchangeData[1-j].pPlayer->GetMoney(),
0, m_ExchangeData[j].ItemInfo[i].wIconIdx, m_ExchangeData[j].ItemInfo[i].dwDBIdx, m_ExchangeData[j].ItemInfo[i].Position, 0, m_ExchangeData[j].ItemInfo[i].Durability,
m_ExchangeData[j].pPlayer->GetPlayerExpPoint());
}
}
DWORD dwMoney = 0;
MSG_DWORD MoneyMsg;
MoneyMsg.Category = MP_EXCHANGE;
MoneyMsg.Protocol = MP_EXCHANGE_SETMONEY;
int FromNum =0;
for( j = 0 ; j < 2 ; ++j )
{
if( m_ExchangeData[j].dwMoney > m_ExchangeData[!j].dwMoney ) //郴啊 扒捣捞 歹 腹促.
{
dwMoney = m_ExchangeData[j].dwMoney - m_ExchangeData[!j].dwMoney;
m_ExchangeData[j].pPlayer->SetMoney( dwMoney, MONEY_SUBTRACTION, 0, eItemTable_Inventory, eMoneyLog_LoseExchange, m_ExchangeData[1-j].pPlayer->GetID() );
FromNum = j;
}
else if( m_ExchangeData[j].dwMoney < m_ExchangeData[!j].dwMoney )
{
dwMoney = m_ExchangeData[!j].dwMoney - m_ExchangeData[j].dwMoney;
m_ExchangeData[j].pPlayer->SetMoney( dwMoney, MONEY_ADDITION, 0, eItemTable_Inventory, eMoneyLog_GetExchange, m_ExchangeData[1-j].pPlayer->GetID() );
}
else
{
continue;
}
// MoneyMsg.dwData = m_ExchangeData[j].pPlayer->GetMoney();
// m_ExchangeData[j].pPlayer->SendMsg( &MoneyMsg, sizeof( MoneyMsg ) );
}
LogItemMoney(m_ExchangeData[FromNum].pPlayer->GetID(), m_ExchangeData[FromNum].pPlayer->GetObjectName(),
m_ExchangeData[!FromNum].pPlayer->GetID(), m_ExchangeData[!FromNum].pPlayer->GetObjectName(),
eLog_Exchange, m_ExchangeData[FromNum].pPlayer->GetMoney(), m_ExchangeData[!FromNum].pPlayer->GetMoney(),
dwMoney, 0, 0, 0, 0, 0,
m_ExchangeData[FromNum].pPlayer->GetPlayerExpPoint());
return eEE_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -