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

📄 npctask.cpp

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

#include <windows.h>
#include "define.h"
#include "NpcTask.h"
#include "MapGroup.h"


MYHEAP_IMPLEMENTATION(CNpcTask,s_heap)
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CNpcTask::CNpcTask()
{
	m_setTask	= NULL;
}

//////////////////////////////////////////////////////////////////////
CNpcTask::~CNpcTask()
{
	if(m_setTask)
		m_setTask->Release();
}

//////////////////////////////////////////////////////////////////////
bool CNpcTask::Create(PROCESS_ID idProcess, CNpc* pOwner, INpcData* pData)
{
	m_idProcess	= idProcess;
	m_pOwner	= pOwner;

	m_setTask	= CTaskSet::CreateNew(false);
	CHECKF(m_setTask);

	for(int i = 0; i < _MAX_NPCTASK; i++)
	{
		OBJID idTask = pData->GetInt((NPCDATA)(NPCDATA_TASK0 + i));
		if(idTask != ID_NONE)
		{
			CTaskData* pTask = TaskSet()->GetObj(idTask);
			if(!pTask)
			{
				LOGWARNING("Can't find task[%u] of npc[%d].", idTask, m_pOwner->GetRecordID());
				continue;
			}
			if(m_setTask->GetObj(idTask))
			{
				LOGWARNING("Duplicate task[%u] of npc[%d].", idTask, m_pOwner->GetRecordID());
				continue;
			}
			m_setTask->AddObj(pTask);
		}
		else
			break;
	}
	return true;
}

//////////////////////////////////////////////////////////////////////
bool CNpcTask::ActivateTask(CUser* pUser)
{
	CHECKF(pUser);

	// 冲掉旧任务
	pUser->ClearTaskID();
	pUser->SetTaskNpcID(m_pOwner->GetID());

	for (int i=0; i<m_setTask->GetAmount(); i++)
	{
		CTaskData* pTask	= m_setTask->GetObjByIndex(i);
		if (pTask)
		{
			if (pUser->TestTask(pTask))
			{
				GameAction()->ProcessAction(pTask->GetInt(TASKDATA_IDNEXT), pUser, m_pOwner->QueryRole());
				return true;
			}
		}
	}

	return false;
}

//////////////////////////////////////////////////////////////////////
void CNpcTask::OnTimer(DWORD tCurr)
{
	if((m_pOwner->GetSort()&NPCSORT_EVENT) != 0)
	{
		if(m_bActiveTime)
		{
			if(!::IsActiveTime(tCurr, (m_pOwner->GetData(TIMERNPC_TIME)/1000) * 1000))
				m_bActiveTime	= false;
		}
		else
		{
			if(::IsActiveTime(tCurr, (m_pOwner->GetData(TIMERNPC_TIME)/1000) * 1000))
			{
				m_bActiveTime	= true;

				// active
				clock_t	tStart = clock();
				GameAction()->ProcessAction(m_pOwner->GetInt(NPCDATA_LINKID), NULL, m_pOwner->QueryRole());		//? NPC是延时删除的,不需要是最后代码。
				if(clock() - tStart > 1000)
					ASSERT(!"任务NPC定时任务超时!");
			}
		}
	}
}

⌨️ 快捷键说明

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