📄 auction.cpp
字号:
LOGERROR("AUCTION QUERY ITEM ERROR");
return;
}
QueryPackage()->AuctionGoodsBackOff(m_Current.idPlayer,m_Current.idItem,true);
CUser* pUser = UserManager()->GetUser(m_Current.idPlayer);
//如果玩家在线,同时更新玩家的拍买仓库
if(pUser && pItem)
{
pUser->SendSysMsg(STR_AUCTION_BID_FAIL);
pUser->AuctionGoodsBackOff(pItem,ITEMPOSITION_AUCTION_STORAGE);
}
}
}
DEBUG_CATCH("auction_bated Error!")
DEBUG_TRY
m_pAuctionInfo->DeleteRecord(m_pProprietor->id,Database());
DEBUG_CATCH("m_pAuctionInfo->UpdateRecord ERROR!")
// 重新初始化
m_nCountUp = 0;
SAFE_DELETE(m_pProprietor);
m_nState = auction_none;
break;
default:
LOGERROR("CAuction::OnTimer() 内部异常");
}
DEBUG_CATCH("CAuction::OnTimer(DWORD nCurr) ERROR");
}
void CAuction::BroadcastListMsg(CNetMsg* pMsg, CUser* pExcludeUser) //广播消息
{
UserManager()->BroadcastMapGroupMsg(pMsg,pExcludeUser);
}
/*----------------------------------------
*bool CAuction::CheckAuctionState(int nType)
*查看当前拍卖的状态
*nType:0.表示查看系统拍卖物品,1.表示查看玩家物品
*如果还在进行,则返回TRUE
*----------------------------------------*/
bool CAuction::CheckAuctionState(int nType)
{
switch(nType)
{
case SYSTEM_ITEM:
if(m_nSysState == auction_bating||m_nSysState == auction_none)
return true;
if(m_nSysState == auction_bated)
m_nSysState = auction_none;
/* if(m_tDay)//如果已经进行过系统拍卖,则进行系统拍卖结束广播
{
const UCHAR SYS_AUCTION_END = 0;
m_nCue = SYS_AUCTION_END;
}*/
return false;
break;
case PLAYER_ITEM:
{
const UCHAR SYS_AUCTION_READY = 3;
m_nCue = SYS_AUCTION_READY;
if(!m_isSysBid&&(m_nState == auction_bating||m_nState == auction_bated))
return true;
return false;
}
break;
default:
LOGERROR("CheckAuctionState(int nType) Enable Type");
return false;
break;
}
}
/*LW----------------------------------------------------------------------
*bool CAuction::SysAuctionStart()
*返回true表示成功,false表示失败或没有系统拍买物品
*----------------------------------------------------------------------*/
bool CAuction::SysAuctionStart(char* szInfo)
{
DEBUG_TRY
//因为有可能服务器重启时,还有系统物品没有拍卖完,所以先检查
const UCHAR SYS_AUCTION_END = 0;
if(m_pProprietor&&m_pProprietor->iState == SYSTEM_ITEM)
{
m_nCue = SYS_AUCTION_END;
m_nSysState = auction_bating;
LOGWARNING(STR_AUCTION_SYS_JOIN_MORETIMES);
return false;
}
//------->每天只能进行一次系统拍买
time_t ltime;
time( <ime );
struct tm *pTime;
pTime = localtime( <ime );
int nDayTemp = (pTime->tm_year+1900)*10000+(pTime->tm_mon+1)*100+pTime->tm_mday;
if(nDayTemp == m_tDay)
{
LOGWARNING("系统当天已经进行过系统拍卖,要再进行系统拍卖,请重起服务器");
return false;
}
//<-------------------------------
//加入系统拍买物品
strcpy(m_szInfo,szInfo);
if(m_pAuctionInfo->m_SetSysAuction.size())
m_pAuctionInfo->m_SetSysAuction.clear();
const int MAX_DATE_TYPE = 5;
m_SystemItem->Create(Database(),m_idAuction,AUCTION_SYSTEM_MAX,MAX_DATE_TYPE);
int nAmount = m_SystemItem->GetAmount();
if(!nAmount)
{
LOGWARNING("没有任何系统物品可以拍卖,请检查数据是否正确");
}
for(int i=0;i<nAmount&&i<AUCTION_SYSTEM_MAX;i++)
{
CGameAuctionSystemData* pData = m_SystemItem->GetItemDataByIndex(i);
CHECKF(pData);
IF_OK(m_pAuctionInfo->CreateRecord(m_idAuction,"SYSTEM",pData->GetID(),pData->GetInt(AUCTION_SYSTEMITEM_VALUE),SYSTEM_ITEM,Database()))
{
m_pAuctionInfo->m_SetSysAuction.push(m_pAuctionInfo->m_pInfo);
}
}
m_tDay = nDayTemp;
m_nCue = SYS_AUCTION_END;
m_nSysState = auction_bating;
LOGWARNING("系统拍卖开始成功");
return true;
DEBUG_CATCH(STR_AUCTION_BID_ERROR)
return false;
}
//玩家叫价
bool CAuction::ShoutPrice(OBJID idItem,OBJID idUser, int nMoney)
{
try{
CUser* pUser = UserManager()->GetUser(idUser);
ASSERT(pUser);
if(m_pProprietor->dwValue >= nMoney)
{
pUser->SendSysMsg(STR_AUCTION_SHOUTPRICE_LOW);
return false;
}
if(m_pProprietor->idItem != idItem)
{
pUser->SendSysMsg(STR_AUCTION_BIDED);
return false;
}
if(m_Current.idPlayer==idUser)
{
pUser->SendSysMsg(STR_SHOUT_PRICE_SELF_ERR);
return false;
}
//退还上一个玩家的佣金。。
if(m_pProprietor->dwValue > m_Current.dwValue)
{
CUser* pLastUser = UserManager()->GetUser(m_pProprietor->idPlayer);
if(pLastUser)
pLastUser->GainMoney(m_pProprietor->dwValue,true);
else//如果找不到玩家,则钱放放仓库。。
{
m_pPackage->CAuctionChip(m_pProprietor->idPlayer,m_pProprietor->dwValue,GameDataDefault()->GetGameItemData(),Database());
}
}
m_pProprietor->dwValue = nMoney;
strcpy(m_pProprietor->szPlayer,pUser->GetName());
m_pProprietor->idPlayer = idUser;
//收取玩家的出价钱数
pUser->SpendMoney(nMoney,true);
m_tHammer = clock() + AUCTION_INTERVAL*CLOCKS_PER_SEC;
m_nCountUp = 0;
if(!m_isSysBid)
{
CItemPtr pItem = QueryPackage()->GetItemByID(idItem);
CHECKF(pItem);
pUser->SendSysMsg(STR_SHOUT,nMoney,pItem->GetStr(ITEMDATA_NAME));
}
else
{
CGameAuctionSystemData* pData = m_SystemItem->GetItemDataByID(m_Current.idItem);
CHECKF(pData);
CItemTypeData* pItemInfo = NULL;
pItemInfo = ItemType()->QueryItemType(pData->GetInt(AUCTION_SYSTEMITEM_TYPE));
CHECKF(pItemInfo);
pUser->SendSysMsg(STR_SHOUT,nMoney,pItemInfo->GetStr(ITEMTYPEDATA_NAME));
}
return true;
}
catch (...) {
LOGERROR("CAuction::ShoutPrice");
return false;
}
}
bool CAuction::SendAuctionItemInfo(OBJID idUser,OBJID idItem)
{
DEBUG_TRY
CUserPtr pUser = UserManager()->GetUser(idUser);
CMsgItemInfo msg;
CHECKF(pUser);
if(m_isSysBid)
{
CGameAuctionSystemData* pData = m_SystemItem->GetItemDataByID(m_Current.idItem);
CHECKF(pData);
if(msg.Create(pData,ITEMINFO_AUCTION))
pUser->SendMsg(&msg);
}
else
{
CItemPtr pItem = QueryPackage()->GetItemByID(idItem);
if(pItem && msg.Create(pItem,ITEMINFO_AUCTION))
pUser->SendMsg(&msg);
else
pUser->SendSysMsg(STR_AUCTION_NOT_ITEM);
}
DEBUG_CATCH("CAuction SendAuctionItemInfo Error!");
return false;
}
const int MIN_VALUE = 100;
bool CAuction::JoinAuction(/*CUser* pUser*/OBJID idUser, OBJID idItem, DWORD dwValue,IDatabase* pDb)
{
CUser* pUser = UserManager()->GetUser(idUser);
ASSERT(pUser);
if(dwValue < MIN_VALUE)
{
pUser->SendSysMsg(STR_AUCTION_MIN_VALUE,MIN_VALUE);
return false;
}
CItem* pItem = pUser->GetItem(idItem);
if (!pItem)
return false;
if(pItem->GetInt(ITEMDATA_MONOPOLY))
{
pUser->SendSysMsg(STR_SPECIAL_GOODS_JOIN_ERR);//"特殊物品不能拍买"
return false;
}
// 如果放入拍卖的物品是已经出征的幻兽,则立即召回
if (pItem->IsEudemon())
{
pUser->CallBackEudemon(pItem->GetID());
pUser->DetachEudemon(pItem);
}
/* if(m_isSysBid)
{
pUser->SendSysMsg(STR_AUCTION_SYS_BID);
return false;
}*/
if(m_pAuctionInfo->m_SetAuctionQueue.size() >= AUCTION_PACKAGE_MAX)
{
pUser->SendSysMsg(STR_AUCTION_BID_PACKAGE_FULL);
return false;
}
if(pUser->GetMoney() < dwValue*AUCTION_REVENUE/100)
{
pUser->SendSysMsg(STR_AUCTION_LESS_MONEY);
return false;
}
if(m_pAuctionInfo->CreateRecord(m_idAuction,pUser->GetName(),idItem,dwValue,PLAYER_ITEM,pDb))
{
m_pAuctionInfo->m_SetAuctionQueue.push(m_pAuctionInfo->m_pInfo);
pUser->SendSysMsg(STR_AUCTION_JOIN_SUCCESS,m_pAuctionInfo->m_SetAuctionQueue.size());
}
else
{
pUser->SendSysMsg(STR_AUCTION_JOIN_ERROR);
return false;
}
DEBUG_TRY
pUser->SpendMoney(DWORD(dwValue*3/100), SYNCHRO_TRUE);
CItem* pTemp = pUser->PopItem(idItem, SYNCHRO_TRUE, UPDATE_FALSE);
CHECKF(pTemp);
QueryPackage()->CheckIn(pUser,pTemp,true);
DEBUG_CATCH("CAuction::JoinAuction ERROR!")
return true;
}
void CAuction::BroadcastSysMsg(LPCTSTR szMsg, CUser* pSendSelf)
{
CMsgTalk msg;
if(msg.Create(SYSTEM_NAME, ALLUSERS_NAME, szMsg, NULL, 0xff0000, _TXTATR_SYSTEM))
UserManager()->BroadcastMapGroupMsg(&msg, pSendSelf);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -