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

📄 gtask.cc

📁 五行MMORPG引擎系统V1.0
💻 CC
字号:
//GTask.cc
/*/////////////////////////////////////////////////////////////////

   李亦
	liease@163.com 4040719
	2006-8-12
/*/////////////////////////////////////////////////////////////////

#include "rpg/gobjects/GTask.h"
#include "rpg/gobjects/GPlayer.h"
#include "rpg/gobjects/GNpc.h"
#include "rpg/RPGChat.h"


namespace RPG
{
GTask*	g_pGTask	= NULL;

IMPLEMENT_CONOBJECT(GTask);


GTaskBase::GTaskBase()
{
	m_dwTaskType	= GTB_NONE;
	m_pGoal		= NULL;
	m_pRequire	= NULL;
	m_pPremium	= NULL;
	m_pFromNpc	= NULL;
	m_pToNpc		= NULL;
	m_pFromNpc	= NULL;
	//m_pOwnerNpc = NULL;
	m_pGoalObject	= NULL;
	//m_pGoalResult = NULL;
	dMemset(&m_data0,0,sizeof(m_data0));
}



BOOL GTaskBase::ExecuteGoalNpc(GNpc* pToNpc,GPlayer* pPlayer,EGTaskStates nState)
{
	//GoalNpc有以下处理
	//	1.Npc为空,则不作处理
	//	2.GoalObject为NULL,则作Npc访问处理
	//	3.Goal为NULL,奖励在此Npc处理(不检测Goal了)
	//	4.否则 失去GoalObject,生成Goal,玩家再找源Npc即可
	if(!pToNpc || !pPlayer)
		return FALSE;

	GGOODSREF ref(pPlayer,pToNpc,this);

	if(nState == GTS_RUNNING2)
	{
		if(HasGoalObject())
		{
			ref.bCreateGoods = FALSE;
			if(!CheckOutGoalObject(ref))
				return FALSE;
			TakeOutGoalObject(ref);
		}

		//生成目标结果
		if(HasGoal())
		{
			CreateGoal(ref);
		}
	}//if

	else if(nState == GTS_PREMIUM)
	{
		//在ExecuteTask 中执行了
		//if(HasPremium())
		//{
		//	//if(!CheckPremium(ref))
		//	//	return FALSE;
		//	ExecutePremium(ref);
		//}
	}

	return TRUE;
}

//BOOL GTaskBase::ExecuteTask(GNpc* pNpc,GPlayer* pPlayer,EGTaskStates nState)
//{
//	//如果存在 GoalResult的话,先检测GoalResult且执行
//	/// 1.
//	if(!pNpc || !pPlayer)
//		return FALSE;
//
//#ifdef TGE_RPGCLIENT
//		EGameTipTexts nTip = TIP_NULL;
//		if(nState == GTS_FREE2)
//			nTip = TIP_TASK_ACCEPT;
//		else if(nState == GTS_RUNNING2)
//			nTip = TIP_TASK_FINISHED;
//		else if(nState == GTS_OUTDATE)
//			nTip = TIP_TASK_OUTDATE;
//
//		if(nTip != TIP_NULL)
//			RPGChat::OutputTipF(nTip, GetTaskName());
//#endif
//	return TRUE;
//}


EGTaskStates GTaskBase::UpdateTaskState(GPlayer* pChar,GNpc* pNpc,EGTaskStates nState)
{
	//已完成状态
	if(nState >= GTS_FINISHED)
		return nState;

	if(nState == GTS_PREMIUM)
	{
		if(IsToNpcRunning2() )
		{
			if(!IsToNpc(pNpc) )/*IsOwnerNpc(pNpc)*/
				nState = GTS_IDLE;
		}
		return nState;
	}


	//已接受,但未完成状态
	else if(nState >= GTS_RUNNING)
	{
		if(pChar->IsTaskFinished(this))
			return GTS_FINISHED;
		
		if(IsToNpcRunning2())
		{
			if(IsToNpc(pNpc))
				nState =  GTS_RUNNING2;
			else//if(IsOwnerNpc(pNpc))
				nState =  GTS_RUNNING;
		}
		else
		{
			if(IsTask())
			{
				if(pChar->IsAllPieceFinished((GTask*)this ) && CheckGoal(pChar))
					nState =  GTS_RUNNING2;
				else
					nState =  GTS_RUNNING;
			}
			else
			{
				if(CheckGoal(pChar))
					nState =  GTS_RUNNING2;
				else
					nState =  GTS_RUNNING;
			}//else
		}
		return nState;
	}

	//未接受状态
	else if(IsFitRequire(pChar))
		return GTS_FREE2;


	return GTS_FREE;

	////已完成状态
	//if(nState >= GTS_FINISHED)
	//{	
	//	return nState;
	//}

	////已接受,但未完成状态
	//else if(nState > GTS_FREE2)
	//{
	//	if(CheckGoal(pChar))
	//		return GTS_RUNNING2;
	//	return GTS_RUNNING;
	//}

	////未接受状态
	//if(IsFitRequire(pChar))
	//	return GTS_FREE2;
	//return GTS_FREE;
}

//EGTaskStates GTaskBase::GetTaskState(GPlayer* pChar,EGTaskStates nState)
//{
//	//已完成状态
//	if(nState >= GTS_FINISHED)
//	{	
//		return nState;
//	}
//
//	//已接受,但未完成状态
//	else if(nState > GTS_FREE2)
//	{
//		if(CheckGoal(pChar))
//			return GTS_RUNNING2;
//		return GTS_RUNNING;
//	}
//
//	//未接受状态
//	if(IsFitRequire(pChar))
//		return GTS_FREE2;
//	return GTS_FREE;
//}


GDialog* GTaskBase::GetStateDialog(EGTaskStates nState)
{
	if(nState >= GTS_AMOUNT || nState < GTS_IDLE)
		return NULL;
	if(m_arStateDialogs[nState] == NULL)
		nState = GTS_IDLE;

	return m_arStateDialogs[nState];
}




#ifdef TGE_RPGCLIENT
void GTaskBase::UpdateToNpcState(EGTaskStates nState)
{
	if(!m_pToNpc)
		return;


	if(/*nState <= GTS_FREE2 ||*/ nState >= GTS_FINISHED)
	{	
		m_pToNpc->SetTaskLock(FALSE);
		//m_pToNpc->UpdateAllTaskNpc(pPlayer);
	}
	else if(nState > GTS_RUNNING)
	{
		m_pToNpc->SetTaskLock(TRUE);
	}
}
#endif





GTaskPiece::GTaskPiece()
{
	m_dwTaskType	= GTB_PIECE;
	//m_nOrder = -1;
	dMemset(m_arStateDialogs,0,sizeof(m_arStateDialogs));
	m_pOwnerTask = NULL;
	m_nIndex = -1;
}



BOOL GTaskPiece::ExecuteTask(GNpc* pNpc,GPlayer* pPlayer,EGTaskStates nState)
{
	//如果存在 GoalResult的话,先检测GoalResult且执行
	/// 1.在完成任务片段时,执行后面尽可能的任务片段 

	BOOL bRet = FALSE;
	if(!m_pOwnerTask && !pNpc || !pPlayer)
		return FALSE;

	GGOODSREF ref(pPlayer,pNpc,this);

	switch(nState)
	{
		//未接受任务,且满足条件
	case GTS_FREE:
		if(IsFitRequire(pPlayer))
		{	
			bRet = pPlayer->ReadyAcceptTask(m_pOwnerTask, pNpc, m_nIndex);
			if(bRet && m_pToNpc)
				m_pToNpc->SetTaskLock(TRUE);
		}
		break;

	case GTS_FREE2:
		bRet = pPlayer->AcceptTask(m_pOwnerTask, pNpc, m_nIndex);
		if(bRet)
		{
#ifdef TGE_RPGCLIENT
			RPGChat::OutputTipF(TIP_TPIECE_ACCEPT, GetTaskName());
#endif
			//生成GoalObject
			if(HasGoalObject())
				CreateGoalObject(ref);
			if(m_pToNpc)
				m_pToNpc->SetTaskLock(TRUE);
		}//if
			//if(bRet && m_pToNpc)
			//	m_pToNpc->SetTaskLock(TRUE);
		break;


	case GTS_RUNNING:
		if(CheckGoal(pPlayer))
			bRet = pPlayer->ReadyGoalTask(m_pOwnerTask, pNpc, m_nIndex);
		break;

		//任务已接受,满足目标要求,
	case GTS_RUNNING2:
		if(ExecuteGoal(pPlayer))
		{
			bRet = pPlayer->GoalTask(m_pOwnerTask, pNpc, m_nIndex);
			if(bRet)
			{	
				if(!HasPremium())
					bRet = pPlayer->PremiumTask(m_pOwnerTask, pNpc, m_nIndex);
				//执行下1尽可能多的任务片段
				//ExecuteAllPiecePossible(pNpc,pPlayer,m_nIndex+1);
				if(m_pToNpc)
				{
					m_pToNpc->SetTaskLock(FALSE);
					m_pToNpc->UpdateAllTaskNpc(pPlayer);
				}
			}
		}
		break;


	case GTS_PREMIUM:
		if(HasPremium())
		{
			bRet = ExecutePremium(pPlayer);
			if(bRet)
			{
#ifdef TGE_RPGCLIENT
				RPGChat::OutputTipF(TIP_TPIECE_FINISHED, GetTaskName());
#endif
				pPlayer->PremiumTask(m_pOwnerTask, pNpc, m_nIndex);
				if(m_pToNpc)
				{
					m_pToNpc->SetTaskLock(FALSE);
					m_pToNpc->UpdateAllTaskNpc(pPlayer);
				}
			}//if
		}//if
		break;
	}

//#ifdef TGE_RPGCLIENT
//			RPGChat::OutputTipF(TIP_TPIECE_OUTDATE, GetTaskName());
//#endif


	return bRet;
}


/////////////////////////////////////////////////////////////////
// class GTask 构造函数 /析构函数
GTask::GTask()
{
	m_dwTaskType	= GTB_TASK;
}
GTask::~GTask()
{
}



//EGTaskStates GTask::UpdateTaskState(GPlayer* pChar,GNpc* pNpc,EGTaskStates nState)
//{
//	//已完成状态
//	if(nState >= GTS_FINISHED)
//		return nState;
//
//	if(nState == GTS_PREMIUM)
//	{
//		if(IsOwnerNpc(pNpc) && IsToNpcRunning2())
//		{
//			state = GTS_IDLE;
//		}
//		return nState;
//	}
//
//
//	//已接受,但未完成状态
//	else if(nState >= GTS_RUNNING)
//	{
//		if(pChar->IsTaskFinished(this))
//			return GTS_FINISHED;
//		
//		if(IsToNpc(pNpc))
//		{
//			nState =  GTS_RUNNING2;
//		}
//		else
//		{
//			if(CheckGoal(pChar))
//				nState =  GTS_RUNNING2;
//			else
//				nState =  GTS_RUNNING;
//		}
//		return nState;
//	}
//
//	//未接受状态
//	else if(IsFitRequire(pChar))
//		return GTS_FREE2;
//
//
//	return GTS_FREE;
//}


BOOL GTask::IsToNpcOfPiece(GNpc* pNpc)
{
	U32 n;
	GTaskPiece* pPiece;

	for(n=0;n<m_arTaskPieces.size(); n++)
	{
		pPiece = m_arTaskPieces[n];
		if(pPiece==NULL)
			continue;
		if(pPiece->IsToNpc(pNpc))
			return TRUE;
	}//for
	return FALSE;
}


BOOL GTask::ExecuteTask(GNpc* pNpc,GPlayer* pPlayer,EGTaskStates nState)
{
	//如果存在 GoalResult的话,先检测GoalResult且执行
	/// 1.
	BOOL bRet = FALSE;
	if(!pNpc || !pPlayer)
		return FALSE;

	GGOODSREF ref(pPlayer,pNpc,this);


	switch(nState)
	{
		//未接受任务,且满足条件
	case GTS_FREE:
		if(IsFitRequire(pPlayer))
		{	
			bRet = pPlayer->ReadyAcceptTask(this,pNpc);
			if(bRet && m_pToNpc)
				m_pToNpc->SetTaskLock(TRUE);
		}
		break;


	case GTS_FREE2:
		bRet = pPlayer->AcceptTask(this,pNpc);
		if(bRet)
		{
#ifdef TGE_RPGCLIENT
			RPGChat::OutputTipF(TIP_TASK_ACCEPT, GetTaskName());
#endif
			//生成GoalObject
			if(HasGoalObject())
				CreateGoalObject(ref);
			if(m_pToNpc)
				m_pToNpc->SetTaskLock(TRUE);
			if(m_pOwnerNpc)
			{	
				m_pOwnerNpc->SetRunningTask(TRUE);
				m_pOwnerNpc->SetTaskNpc(TRUE);
			}
		}//if
		break;


	case GTS_RUNNING:
		//if(pPlayer->IsAllPieceFinished(this))
		{
			if(CheckGoal(pPlayer))
				bRet = pPlayer->ReadyGoalTask(this,pNpc);
		}//if(pPlayer->IsAllPieceFinished(this))
		break;

		//任务已接受,满足目标要求,
	case GTS_RUNNING2:
		//if(pPlayer->IsAllPieceFinished(this))
		{
			//if(ExecuteGoal(pPlayer))
			if(TakeOutGoal(pPlayer))
			{
				bRet = pPlayer->GoalTask(this,pNpc);
				if(!HasPremium())
				{	
					bRet = pPlayer->PremiumTask(this,pNpc);
					if(m_pOwnerNpc)
					{
						//m_pOwnerNpc->SetTaskNpc(FALSE);
						m_pOwnerNpc->SetRunningTask(FALSE);
						m_pOwnerNpc->UpdateAllTaskNpc(pPlayer);
					}
					if(m_pToNpc)
					{
						m_pToNpc->SetTaskLock(FALSE);
						m_pToNpc->UpdateAllTaskNpc(pPlayer);
					}
				}
			}//if(ExecuteGoal(pPlayer))
		}//if(pPlayer->IsAllPieceFinished(this))
		break;

	case GTS_PREMIUM:
		if(HasPremium())
		{
			bRet = ExecutePremium(pPlayer);
			if(bRet)
			{
#ifdef TGE_RPGCLIENT
				RPGChat::OutputTipF(TIP_TASK_FINISHED, GetTaskName());
#endif
				pPlayer->PremiumTask(this,pNpc);
				if(m_pToNpc)
				{	
					m_pToNpc->SetTaskLock(FALSE);
					m_pToNpc->UpdateAllTaskNpc(pPlayer);
				}
				if(m_pOwnerNpc)
				{	
					//m_pOwnerNpc->SetTaskNpc(FALSE);
					m_pOwnerNpc->SetRunningTask(FALSE);
					m_pOwnerNpc->UpdateAllTaskNpc(pPlayer);
				}
			}//if(ExecutePremium(pPlayer))
		}//if(HasPremium())
		break;
	}

//#ifdef TGE_RPGCLIENT
//		RPGChat::OutputTipF(TIP_TASK_OUTDATE, GetTaskName());
//#endif

	return bRet;
}


void GTask::initPersistFields()
{
	Parent::initPersistFields();
}

//void GTask::consoleInit()
//{
//}


};//namespace RPG

⌨️ 快捷键说明

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