📄 auction.cpp
字号:
// Auction.cpp: implementation of the CAuction class.
// 拍买系统 -LW- 2004-11-26
//////////////////////////////////////////////////////////////////////
#include "Auction.h"
#include "MapGroup.h"
#include "MsgAuction.h"
#include "UserManager.h"
#include "MsgItemInfo.h"
#include "MsgTalk.h"
//#include <stdio.h>
MYHEAP_IMPLEMENTATION(CAuction, s_heap)
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CAuction::CAuction(PROCESS_ID idProcess)
{
m_nCountUp = 0 ;
m_pProprietor = NULL;
m_nState = auction_none;
m_nSysState = auction_none;
m_idProcess = idProcess;
m_isSysBid = false;
strcpy(m_szInfo ,"NULL");
m_nCue = 0;
m_tDay = 0;
}
CAuction::~CAuction()
{
DEBUG_TRY
if(m_pAuctionInfo)
SAFE_DELETE(m_pAuctionInfo);
if(m_SystemItem)
SAFE_DELETE(m_SystemItem);
if(m_pPackage)
m_pPackage->Release();
DEBUG_CATCH("CAuction::~CAuction() ERROR");
}
bool CAuction::Create(PROCESS_ID idProcess, OBJID idNpc)
{
ASSERT(idNpc > 0);
m_idProcess = idProcess;
m_idAuction = idNpc;
DEBUG_TRY
m_pAuctionInfo = new CAuctionStorage;
CHECKF(m_pAuctionInfo);
m_SystemItem = CAuctionSystemItemData::CreateNew();
CHECKF(m_SystemItem);
m_pPackage = CPackage::CreateNew();
CHECKF(m_pPackage);
m_pAuctionInfo->Create(idNpc,PLAYER_ITEM,Database());
m_pPackage->Create(ITEMPOSITION_AUCTION_STORAGE,idNpc,0,Database());
DEBUG_CATCH("CAuctionStorage Create Error!")
return true;
}
void CAuction::OnTimer(DWORD nCurr)
{
DEBUG_TRY
if(!m_tClock.ToNextTime(1))
return ;
CMsgAuction nMsg;
switch(m_nState)
{
case auction_none://开始新的拍买准备
{
if(m_nCue)//如果正进行系统拍卖前的提示,则返回
return;
ASSERT(m_pAuctionInfo);
if(!m_pAuctionInfo->m_SetAuctionQueue.size() && !m_pAuctionInfo->m_SetSysAuction.size())
return;
if(m_pAuctionInfo->m_SetSysAuction.size())
{
if(!m_isSysBid)
m_isSysBid = true;
m_pProprietor = m_pAuctionInfo->m_SetSysAuction.pop();
if(strcmp(m_szInfo,"NULL"))
{
BroadcastSysMsg(m_szInfo);
strcpy(m_szInfo,"NULL");
}
}
else
{
if(m_isSysBid)
m_isSysBid = false;
m_pProprietor = m_pAuctionInfo->m_SetAuctionQueue.pop();
}
if(m_pProprietor == NULL)
return ;
CItemPtr pItem = NULL;
if(!m_isSysBid)
{
pItem = QueryPackage()->GetItemByID(m_pProprietor->idItem);
if(!pItem)
{
m_pAuctionInfo->DeleteRecord(m_pProprietor->id,Database());
return;
}
m_pProprietor->idPlayer = pItem->GetInt(ITEMDATA_PLAYERID);
}
m_Current.idAuction = m_pProprietor->idAuction;
strcpy(m_Current.szPlayer,m_pProprietor->szPlayer);
m_Current.idItem = m_pProprietor->idItem;
m_Current.idPlayer = m_pProprietor->idPlayer;
m_Current.dwValue = m_pProprietor->dwValue ;
if(nMsg.Create(m_pProprietor->szPlayer,m_pProprietor->idItem,m_pProprietor->dwValue,AUCTION_NEW))
{
this->BroadcastListMsg(&nMsg,NULL);
SQLBUF szMsg;
if(!m_isSysBid)
sprintf(szMsg,STR_AUCTION_NEW,m_Current.szPlayer,pItem->GetStr(ITEMDATA_NAME),m_Current.dwValue);
else
{
CGameAuctionSystemData* pData = m_SystemItem->GetItemDataByID(m_Current.idItem);
CHECK(pData);
CItemTypeData* pItemInfo = NULL;
pItemInfo = ItemType()->QueryItemType(pData->GetInt(AUCTION_SYSTEMITEM_TYPE));
CHECK(pItemInfo);
sprintf(szMsg,STR_AUCTION_NEW,m_Current.szPlayer,pItemInfo->GetStr(ITEMTYPEDATA_NAME),m_Current.dwValue);
}
this->BroadcastSysMsg(szMsg,NULL);
}
m_nState = auction_bating;
m_tHammer = clock() + AUCTION_INTERVAL*CLOCKS_PER_SEC;
m_tBroadcast = clock() + AUCTION_BROADCAST_BID*CLOCKS_PER_SEC;
}
break;
case auction_bating:
{
if(m_tBroadcast < clock())
{
if(nMsg.Create(m_pProprietor->szPlayer,m_pProprietor->idItem,m_pProprietor->dwValue,AUCTION_HINT_USER))
this->BroadcastListMsg(&nMsg,NULL);
m_tBroadcast = clock() + AUCTION_BROADCAST_BID*CLOCKS_PER_SEC;
/*
SQLBUF szMsg;
sprintf(szMsg,"当前出价为:%d,出价人:%s",m_pProprietor->dwValue,m_pProprietor->szPlayer);
UserManager()->BroadcastMsg(szMsg);
*/
}
if(m_tHammer < clock())
{
m_nCountUp++;
// ProcessRun(m_nCountUp);//提示
if(m_nCountUp <= AUCTION_DEGREE_MAX)
{
char szName[16];
if(!m_isSysBid)
{
CItemPtr pItem = QueryPackage()->GetItemByID(m_Current.idItem);
CHECK(pItem);
strcpy(szName,pItem->GetStr(ITEMDATA_NAME));
}
else
{
CGameAuctionSystemData* pData = m_SystemItem->GetItemDataByID(m_Current.idItem);
CHECK(pData);
CItemTypeData* pItemInfo = NULL;
pItemInfo = ItemType()->QueryItemType(pData->GetInt(AUCTION_SYSTEMITEM_TYPE));
CHECK(pItemInfo);
strcpy(szName,pItemInfo->GetStr(ITEMTYPEDATA_NAME));
}
SQLBUF szMsg;
sprintf(szMsg,STR_AUCTION_BID,szName,m_pProprietor->szPlayer,m_pProprietor->dwValue,m_nCountUp);
this->BroadcastSysMsg(szMsg);
if(m_nCountUp == AUCTION_DEGREE_MAX)
m_nState = auction_bated;
}
m_tHammer = clock() + AUCTION_INTERVAL*CLOCKS_PER_SEC;
}
}
break;
case auction_bated:
//广播拍买的结果,(某人以某价格拍到某物品)
if(m_isSysBid&&!m_pAuctionInfo->m_SetSysAuction.size())
m_nSysState = auction_bated;
if(nMsg.Create(0,0,AUCTION_HAMMER))
this->BroadcastListMsg(&nMsg,NULL);
if(!m_pProprietor)
{
LOGERROR("m_pProprietor NULL");
return ;
}
//----------------------------------------------------------------------
DEBUG_TRY
if(m_pProprietor->iState == SYSTEM_ITEM)//系统物品
{
CGameAuctionSystemData* pData = m_SystemItem->GetItemDataByID(m_pProprietor->idItem);
CHECK(pData);
if(m_pProprietor->dwValue != m_Current.dwValue)//拍买成功
{
CItemPtr pItem = NULL;
pItem = CItem::CreateNew();
pItem->Create(GameDataDefault()->GetGameItemData(), pData->GetInt(AUCTION_SYSTEMITEM_TYPE),
m_pProprietor->idPlayer, ITEMPOSITION_AUCTION_STORAGE);
CHECK(pItem);
pItem->SetInt(ITEMDATA_OWNERID, m_pProprietor->idPlayer, UPDATE_FALSE);
pItem->SetInt(ITEMDATA_PLAYERID, m_pProprietor->idPlayer, UPDATE_FALSE);
pItem->SetInt(ITEMDATA_POSITION, ITEMPOSITION_AUCTION_STORAGE, UPDATE_FALSE);
pItem->SetInt(ITEMDATA_AMOUNT,pData->GetInt(AUCTION_SYSTEMITEM_AMOUNT), UPDATE_FALSE);
pItem->SetInt(ITEMDATA_AMOUNTLIMIT,pData->GetInt(AUCTION_SYSTEMITEM_AMOUNTLIMIT), UPDATE_FALSE);
pItem->SetInt(ITEMDATA_IDENT,pData->GetInt(AUCTION_SYSTEMITEM_IDENT), UPDATE_FALSE);
pItem->SetInt(ITEMDATA_GEM1,pData->GetInt(AUCTION_SYSTEMITEM_GEM1), UPDATE_FALSE);
pItem->SetInt(ITEMDATA_GEM2,pData->GetInt(AUCTION_SYSTEMITEM_GEM2), UPDATE_FALSE);
pItem->SetInt(ITEMDATA_MAGIC1,pData->GetInt(AUCTION_SYSTEMITEM_MAGIC1), UPDATE_FALSE);
pItem->SetInt(ITEMDATA_MAGIC2,pData->GetInt(AUCTION_SYSTEMITEM_MAGIC2), UPDATE_FALSE);
pItem->SetInt(ITEMDATA_MAGIC3, pData->GetInt(AUCTION_SYSTEMITEM_MAGIC3), UPDATE_FALSE);
pItem->SetInt(ITEMDATA_DATA, pData->GetInt(AUCTION_SYSTEMITEM_DATA), UPDATE_FALSE);
pItem->SetInt(ITEMDATA_WARGHOSTEXP,pData->GetInt(AUCTION_SYSTEMITEM_WARGHOSTEXP), UPDATE_FALSE);
pItem->SetInt(ITEMDATA_GEMTYPE,pData->GetInt(AUCTION_SYSTEMITEM_GEMTYPE), UPDATE_FALSE);
pItem->SetInt(ITEMDATA_AVAILABLETIME,pData->GetInt(AUCTION_SYSTEMITEM_AVAILABLETIME), UPDATE_TRUE);
CUser* pUser = UserManager()->GetUser(m_pProprietor->idPlayer);
//如果玩家在线,同时更新玩家的拍买仓库
IF_OK(pUser)
{
pUser->AuctionGoodsBackOff(pItem,ITEMPOSITION_AUCTION_STORAGE);
}
SQLBUF szMsg;
char nGoods[32];
strcpy(nGoods,pItem->GetStr(ITEMDATA_NAME));
sprintf(szMsg,STR_AUCTION_HAMMER,m_pProprietor->szPlayer,m_pProprietor->dwValue,nGoods);
this->BroadcastSysMsg(szMsg);
}
else//失败
{
/* CGameAuctionSystemData* pData = m_SystemItem->GetItemDataByID(m_pProprietor->idItem);
if(pData)
m_SystemItem->DeleteRecord(m_pProprietor->idItem);
*/ }
}
else//玩家物品
{
if(m_pProprietor->dwValue != m_Current.dwValue)//拍买成功
{
CItemPtr pItem = QueryPackage()->GetItemByID(m_pProprietor->idItem);
if(!pItem)
{
LOGERROR("AUCTION QUERY ITEM ERROR");
return;
}
SQLBUF szMsg;
char nGoods[32];
strcpy(nGoods,pItem->GetStr(ITEMDATA_NAME));
sprintf(szMsg,STR_AUCTION_HAMMER,m_pProprietor->szPlayer,m_pProprietor->dwValue,nGoods);
this->BroadcastSysMsg(szMsg);
//存入物品。。
QueryPackage()->AuctionGoodsBackOff(m_pProprietor->idPlayer,m_pProprietor->idItem,true);
CUser* pProprietor = UserManager()->GetUser(m_pProprietor->idPlayer);
if(pProprietor && pItem)
pProprietor->AuctionGoodsBackOff(pItem,ITEMPOSITION_AUCTION_STORAGE);
//存钱
DWORD dMoney = (m_pProprietor->dwValue*(100-AUCTION_REVENUE)+ m_Current.dwValue*AUCTION_REVENUE)/100;
ASSERT(dMoney > 0);
CUser* pCurUser = UserManager()->GetUser(m_Current.idPlayer);
if(pCurUser)
{
pCurUser->GainMoney(dMoney, SYNCHRO_TRUE);
SQLBUF nMsg;
sprintf(nMsg,STR_AUCTION_BID_SUCCESS,dMoney);
pCurUser->SendSysMsg(nMsg);
}
else
{
m_pPackage->CAuctionChip(m_Current.idPlayer,dMoney,GameDataDefault()->GetGameItemData(),Database());
}
}
else//失败
{
CItemPtr pItem = QueryPackage()->GetItemByID(m_pProprietor->idItem);
if(!pItem)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -