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

📄 auction.cpp

📁 魔域源代码需要的可以学习一下真么这么麻烦啊
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -