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

📄 mercenarytaskdata.cpp

📁 网络游戏魔域的服务端与客户端完整源代码 包括详细的说明文档与开发日志
💻 CPP
字号:
// MercenaryTaskData.cpp: implementation of the CMercenaryTaskData class.
//
//////////////////////////////////////////////////////////////////////

#include "MercenaryTaskData.h"
#include "MapGroup.h"


char	szMercenaryTaskTable[]	= _TBL_MERCENARYTASK;

MYHEAP_IMPLEMENTATION(CMercenaryTaskData, s_heap)
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMercenaryTaskData::CMercenaryTaskData()
	: m_pData(NULL), m_pResultItem(NULL)
{

}

CMercenaryTaskData::~CMercenaryTaskData()
{
	SAFE_RELEASE (m_pData);
	if (m_pResultItem)
		m_pResultItem->ReleaseByOwner();
	ITEM_SET::iterator it=m_setPrizeItem.begin();
	for (; it!=m_setPrizeItem.end(); it++)
	{
		CItem* pItem = *it;
		if (pItem)
			pItem->ReleaseByOwner();
	}
}

//////////////////////////////////////////////////////////////////////
bool CMercenaryTaskData::Create(OBJID idTask, IDatabase* pDb)
{
	CHECKF (idTask != ID_NONE);
	CHECKF (!m_pData);
	CHECKF (pDb);

	// load task data
	m_pData	= CGameMTaskData::CreateNew();
	IF_NOT (m_pData)
		return false;
	IF_NOT (m_pData->Create(idTask, pDb))
		return false;

	// load prize items
	return LoadItems(pDb);
}

//////////////////////////////////////////////////////////////////////
bool CMercenaryTaskData::Create(IRecordset* pRes, IDatabase* pDb)
{
	CHECKF (!m_pData);
	CHECKF (pRes);

	// load task data
	m_pData	= CGameMTaskData::CreateNew();
	IF_NOT (m_pData)
		return false;
	IF_NOT (m_pData->Create(pRes))
		return false;

	return LoadItems(pDb);
}

//////////////////////////////////////////////////////////////////////
bool CMercenaryTaskData::CreateRecord(const ST_MTASK_DATA* pInfo, IDatabase* pDb)
{
	CHECKF (!m_pData);
	CHECKF (pInfo);
	CHECKF (pDb);

	m_pData = CGameMTaskData::CreateNew();
	IF_NOT (m_pData)
		return false;

	IF_NOT (m_pData->Create(pDb, ID_NONE))		// create default
		return false;

	// fill data
	m_pData->SetInt(MTASKDATA_TYPE, pInfo->ucType);
	m_pData->SetInt(MTASKDATA_USER_ID, pInfo->idUser);
	m_pData->SetStr(MTASKDATA_USER_NAME, pInfo->szUserName, _MAX_NAMESIZE);
	m_pData->SetStr(MTASKDATA_TITLE, pInfo->szTitle, 32);
	m_pData->SetStr(MTASKDATA_DETAIL, pInfo->szDetail, 128);
	m_pData->SetStr(MTASKDATA_TARGET_NAME, pInfo->szTargetName, _MAX_NAMESIZE);
	m_pData->SetInt(MTASKDATA_DURA, pInfo->dwDura);
	m_pData->SetInt(MTASKDATA_ADDITION, pInfo->ucAddition);
	m_pData->SetInt(MTASKDATA_DEGREE, pInfo->ucDegree);
	m_pData->SetInt(MTASKDATA_PRIZE_MONEY, pInfo->dwPrizeMoney);
	for (int i=0; i<_MAX_PRIZE; i++)
		m_pData->SetInt((MTASKDATA)(MTASKDATA_PRIZE_ITEMID0+i), pInfo->idPrizeItems[i]);
	m_pData->SetInt(MTASKDATA_RANK_REQ, pInfo->ucRankReq);
	m_pData->SetInt(MTASKDATA_ACCEPT_USERID, pInfo->idAcceptUser);
	m_pData->SetInt(MTASKDATA_ACCEPT_TIME, 0);
	m_pData->SetInt(MTASKDATA_RESULT_ITEMID, pInfo->idResultItem);
	m_pData->SetInt(MTASKDATA_STATE, MTASKSTATE_NONE);

	// load items
	if (!LoadItems(pDb))
		return false;
	
	if (ID_NONE == m_pData->InsertRecord())	// insert record
		return false;

	
	
	return true;
}

//////////////////////////////////////////////////////////////////////
bool CMercenaryTaskData::DeleteRecord()
{
	return m_pData->DeleteRecord();
}

//////////////////////////////////////////////////////////////////////
bool CMercenaryTaskData::LoadItems(IDatabase* pDb)
{
	CHECKF (m_pData);
	CHECKF (pDb);

	OBJID idItem = m_pData->GetInt(MTASKDATA_RESULT_ITEMID);
	if (idItem != ID_NONE)
	{
		m_pResultItem = CItem::CreateNew();
		if (!m_pResultItem || !m_pResultItem->Create(idItem, pDb))
		{
			::LogSave("Mercenary task data load item failed! [idItem=%u]", idItem);
			return false;
		}
	}

	m_setPrizeItem.resize(_MAX_PRIZE);
	for (int i=0; i<_MAX_PRIZE; i++)
	{
		OBJID idItem = m_pData->GetInt((MTASKDATA)(MTASKDATA_PRIZE_ITEMID0 + i));
		if (idItem != ID_NONE)
		{
			CItem* pItem = CItem::CreateNew();
			if (pItem && pItem->Create(idItem, pDb))
				m_setPrizeItem[i] = pItem;
			else
			{
				::LogSave("Mercenary task data load item failed! [idItem=%u]", idItem);
				return false;
			}
		}
		else
			m_setPrizeItem[i] = NULL;
	}
	return true;
}

CItem* CMercenaryTaskData::GetItem(OBJID idItem)
{
	if (idItem == ID_NONE)
		return NULL;
	ITEM_SET::iterator it=m_setPrizeItem.begin();
	for (; it!=m_setPrizeItem.end(); it++)
	{
		CItem* pItem = *it;
		if (pItem && pItem->GetID() == idItem)
			return pItem;
	}
	return NULL;
}

CItem* CMercenaryTaskData::PopItem(OBJID idItem)
{
	if (idItem == ID_NONE)
		return NULL;
	ITEM_SET::iterator it=m_setPrizeItem.begin();
	for (; it!=m_setPrizeItem.end(); it++)
	{
		CItem* pItem = *it;
		if (pItem && pItem->GetID() == idItem)
		{
			*it = NULL;
			return pItem;
		}
	}
	return NULL;
}


CItem* CMercenaryTaskData::GetItemByIndex(int nIndex)
{
	CHECKF (nIndex>=0 && nIndex<_MAX_PRIZE);
	return m_setPrizeItem[nIndex];
}

bool CMercenaryTaskData::AddResultItem(CItem* pItem, bool bUpdate)
{
	CHECKF (pItem);
	CHECKF (!m_pResultItem);

	// 任务物品有效性检查
	if (strcmp(GetStr(MTASKDATA_TARGET_NAME), pItem->GetStr(ITEMDATA_NAME)) != 0)
	{
		// 物品不满足条件
		return false;
	}
	if (this->GetInt(MTASKDATA_TYPE) == _WANT_EUDEMON)
	{
		if (pItem->GetEudemonLevel() < GetInt(MTASKDATA_DEGREE)
			|| pItem->GetInt(ITEMDATA_GROWTH) < GetInt(MTASKDATA_ADDITION))
			return false;
	}
	else if (this->GetInt(MTASKDATA_TYPE) == _WANT_ITEM)
	{
		if (pItem->GetInt(ITEMDATA_LEVEL) < GetInt(MTASKDATA_DEGREE)
			|| pItem->GetInt(ITEMDATA_ADDITION) < GetInt(MTASKDATA_ADDITION)
			|| pItem->GetInt(ITEMDATA_AMOUNT) < GetInt(MTASKDATA_DURA))
			return false;
	}
	else
		return false;

	m_pResultItem	= pItem;
	pItem->SetInt(ITEMDATA_POSITION, ITEMPOSITION_PLAYERTASK, true);
	this->SetInt(MTASKDATA_RESULT_ITEMID, pItem->GetID(), bUpdate);
	return true;
}

⌨️ 快捷键说明

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