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

📄 mercenarytask.cpp

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

#include "MercenaryTask.h"
#include "I_Role.h"
#include "MapGroup.h"
#include "User.h"
#include "AllMsg.h"

const int	CHECK_TASK_INTERVAL		= 5*60;			// 每5分钟检查一次任务
const int	TASK_TIMEOUT_SECS		= 3*24*60*60;	// 任务超时时间(单位:秒),3天

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

CMercenaryTask::CMercenaryTask()
	: m_tCheckInterval(CHECK_TASK_INTERVAL)
{

}

CMercenaryTask::~CMercenaryTask()
{
	TASKDATA_SET::iterator it=m_setData.begin();
	for (; it!=m_setData.end(); it++)
	{
		CMercenaryTaskData* pData = *it;
		SAFE_RELEASE (pData);
	}
}

//////////////////////////////////////////////////////////////////////
bool CMercenaryTask::Create(PROCESS_ID idProcess)
{
	m_idProcess	= idProcess;

	SQLBUF	szSQL;
	sprintf(szSQL, "SELECT * FROM %s", _TBL_MERCENARYTASK);
	IRecordset* pRes = Database()->CreateNewRecordset(szSQL);
	if (pRes)
	{
		for (int i=0; i<pRes->RecordCount(); i++)
		{
			CMercenaryTaskData* pData = CMercenaryTaskData::CreateNew();
			if (pData && pData->Create(pRes, Database()))
			{
				m_setData.push_back(pData);
			}
			else
			{
				SAFE_RELEASE (pData);
				SAFE_RELEASE (pRes);
				return false;
			}

			pRes->MoveNext();
		}
		SAFE_RELEASE (pRes);
	}

	return true;
}

//////////////////////////////////////////////////////////////////////
bool CMercenaryTask::CreateNewTask(const ST_MTASK_DATA* pInfo)
{
	CMercenaryTaskData* pData = CMercenaryTaskData::CreateNew();
	if (pData)
	{
		if (pData->CreateRecord(pInfo, Database()))
		{
			m_setData.push_back(pData);
			return true;
		}
		SAFE_RELEASE (pData);
	}
	return false;
}

//////////////////////////////////////////////////////////////////////
bool CMercenaryTask::DeleteTask(OBJID idTask)
{
	TASKDATA_SET::iterator it=m_setData.begin();
	for (; it!=m_setData.end(); it++)
	{
		CMercenaryTaskData* pData = *it;
		if (pData && pData->GetID() == idTask)
		{
			if (!pData->DeleteRecord())
				return false;
			m_setData.erase(it);
			SAFE_RELEASE (pData);
			return true;
		}
	}
	return false;	
}

//////////////////////////////////////////////////////////////////////
CMercenaryTaskData*	CMercenaryTask::QueryTaskDataByIndex(int nIdx)
{
	if (nIdx >= m_setData.size())
		return NULL;
	return m_setData[nIdx];
}

//////////////////////////////////////////////////////////////////////
CMercenaryTaskData*	CMercenaryTask::QueryTaskDataByID(OBJID idTask)
{
	TASKDATA_SET::iterator it=m_setData.begin();
	for (; it!=m_setData.end(); it++)
	{
		CMercenaryTaskData* pData = *it;
		if (pData && pData->GetID() == idTask)
			return pData;
	}
	return NULL;
}

//////////////////////////////////////////////////////////////////////
CMercenaryTaskData*	CMercenaryTask::QueryTaskDataByOwner(OBJID idUser)
{
	TASKDATA_SET::iterator it=m_setData.begin();
	for (; it!=m_setData.end(); it++)
	{
		CMercenaryTaskData* pData = *it;
		if (pData && pData->GetInt(MTASKDATA_USER_ID) == idUser)
			return pData;
	}
	return NULL;
}

//////////////////////////////////////////////////////////////////////
CMercenaryTaskData*	CMercenaryTask::QueryTaskDataAccepted(OBJID idAccepter)
{
	TASKDATA_SET::iterator it=m_setData.begin();
	for (; it!=m_setData.end(); it++)
	{
		CMercenaryTaskData* pData = *it;
		if (pData && pData->GetInt(MTASKDATA_STATE) == MTASKSTATE_ACCEPTED 
			&& pData->GetInt(MTASKDATA_ACCEPT_USERID) == idAccepter)
			return pData;
	}
	return NULL;
}

//////////////////////////////////////////////////////////////////////
bool CMercenaryTask::SendTaskList(IRole* pRole, UCHAR usType, OBJID idLast)
{
	CHECKF (pRole);

	CMsgTaskList	msg;
	if (!msg.Create(usType))
		return false;

	TASKDATA_SET::iterator it=m_setData.begin();
	if (idLast != ID_NONE)
	{
		for (; it!=m_setData.end(); it++)
		{
			CMercenaryTaskData* pData = *it;
			if (pData && pData->GetID() == idLast)
				break;
		}
	}

	int nAmount = 0;
	for (; it!=m_setData.end(); it++)
	{
		CMercenaryTaskData* pData = *it;
		if (pData)
		{
			switch(usType)
			{
			case TASKLIST_ACCEPTED:		// 已接任务 (MTASKSTATE_FINISHED表示已完成但未领奖的,也属于已接任务)
				if (pData->GetInt(MTASKDATA_STATE) != MTASKSTATE_ACCEPTED 
					&& pData->GetInt(MTASKDATA_STATE) != MTASKSTATE_FINISHED)
					continue;
				break;
			case TASKLIST_UNACCEPTED:	// 未接任务
				if (pData->GetInt(MTASKDATA_STATE) != MTASKSTATE_NONE)
					continue;
				break;
//			case TASKLIST_COMPLETED:	// 已完成任务
//				if (pData->GetInt(MTASKDATA_STATE) != MTASKSTATE_COMPLETED)
//					continue;
//				break;
			case TASKLIST_MYTASK:		// 我的任务
				if (pData->GetInt(MTASKDATA_USER_ID) != pRole->GetID())
					continue;
				break;
			default:
				::LogSave("UnKnown type in CMercenaryTask::SendTaskList [usType=%u]", usType);
				continue;
				break;
			}
			if (!msg.Append(pData->GetID(), pData->GetInt(MTASKDATA_RANK_REQ), pData->GetStr(MTASKDATA_TITLE)))
				return false;
			++nAmount;
			if (nAmount >= _MAX_TASK_PER_PAGE)
				break;
		}
	}

	return pRole->SendMsg(&msg);
}

//////////////////////////////////////////////////////////////////////
bool CMercenaryTask::SendTaskInfo(IRole* pRole, OBJID idTask)
{
	CHECKF (pRole);

	CMercenaryTaskData* pData = this->QueryTaskDataByID(idTask);
	if (!pData)
		return false;

	CMsgPlayerTask	msg;
	if (!msg.Create(pData))
		return false;

	return pRole->SendMsg(&msg);
}

//////////////////////////////////////////////////////////////////////
void CMercenaryTask::OnTimer(time_t tCurr)
{
	if (!m_tCheckInterval.ToNextTime())		// 每5分钟检查一次
		return;

	DWORD	dwCurTime	= ::TimeGet(TIME_SECOND);
	TASKDATA_SET::iterator it=m_setData.begin();
	for (; it!=m_setData.end(); it++)
	{
		CMercenaryTaskData* pTaskData = *it;
		if (pTaskData && pTaskData->GetInt(MTASKDATA_STATE) == MTASKSTATE_ACCEPTED)	// 只检查已被接但还没完成的的任务
		{
			DWORD dwTimeAccept = pTaskData->GetInt(MTASKDATA_ACCEPT_TIME);	// 接任务时的时间
			// 检查是否已经超过规定时间
			if (dwCurTime - dwTimeAccept < TASK_TIMEOUT_SECS)
				continue;

			// 任务自动取消
			OBJID idUser = pTaskData->GetInt(MTASKDATA_ACCEPT_USERID);
			pTaskData->SetInt(MTASKDATA_STATE, MTASKSTATE_NONE);
			pTaskData->SetInt(MTASKDATA_ACCEPT_TIME, 0);
			pTaskData->SetInt(MTASKDATA_ACCEPT_USERID, ID_NONE, true);
			if (idUser != ID_NONE)
			{
				CUser* pUser = UserManager()->GetUser(idUser);
				if (pUser)
				{
					pUser->SendSysMsg(STR_TASK_TIMEOUT);
				}
//				else
//				{
//					// 如果需要留言,则cq_mercenary_task表还需要记录接任务玩家的名字
//					//LeaveWord()->InsertWords(SYSTEM_NAME, );
//				}
			}
		} // end of if
	}
}

⌨️ 快捷键说明

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