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

📄 questmanager.cpp

📁 墨香最新私服
💻 CPP
字号:
// QuestManager.cpp: implementation of the CQuestManager class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "QuestManager.h"

#include "MHFile.h"
#include "UserTable.h"
#include "..\[CC]Quest\QuestScriptLoader.h"
#include "..\[CC]Quest\QuestString.h"
#include "..\[CC]Quest\QuestInfo.h"
#include "QuestGroup.h"
#include "QuestUpdater.h"
#include "Player.h"
#include "Quest.h"
#include "MapDBMsgParser.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
GLOBALTON(CQuestManager);

CQuestManager::CQuestManager()
{
	m_QuestInfoTable.Initialize(MAX_QUEST);
	memset( m_QuestEvent, 0, sizeof(MQUESTEVENT)*MAX_QUESTEVENT_MGR );
	m_dwQuestEventCount = 0;

	m_QuestUpdater = new CQuestUpdater;
}

CQuestManager::~CQuestManager()
{
	Release();
}

void CQuestManager::Release()
{
	CQuestInfo* pQuestInfo = NULL;
	m_QuestInfoTable.SetPositionHead();
	while( pQuestInfo = m_QuestInfoTable.GetData() )
	{
		delete pQuestInfo;
	}
	m_QuestInfoTable.RemoveAll();

	if( m_QuestUpdater )
	{
		delete m_QuestUpdater;
		m_QuestUpdater =NULL;
	}
}

BOOL CQuestManager::LoadQuestScript()
{
	CMHFile file;
#ifdef _FILE_BIN_
	if( !file.Init( "./Quest/QuestScript.bin", "rb") )
		return FALSE;
#else
	if( !file.Init( "./Quest/QuestScript.txt", "rt") )
		return FALSE;
#endif

	char Token[256];
	DWORD dwQuestNum = 0;
	while( !file.IsEOF() )
	{
		file.GetString( Token );
		if( strcmp(Token,"$QUEST") == 0 )
		{
			dwQuestNum = file.GetDword();			
			m_QuestInfoTable.Add( CQuestScriptLoader::LoadQuestInfo( &file, dwQuestNum ), dwQuestNum );
		}
	}	
	return TRUE;
}

void CQuestManager::CreateQuestForPlayer( PLAYERTYPE* pPlayer )
{
	CQuestGroup* pQuestGroup = pPlayer->GetQuestGroup();
	if( pQuestGroup )
	{
		CQuestInfo* pQuestInfo = NULL;
		m_QuestInfoTable.SetPositionHead();
		for( DWORD i = 0; i < m_QuestInfoTable.GetDataNum(); ++i )
		{
			pQuestInfo = m_QuestInfoTable.GetData();
			if( pQuestInfo )
				pQuestGroup->CreateQuest( pQuestInfo->GetQuestIdx(), pQuestInfo );
		}
	}
}

void CQuestManager::SetMainQuestData(PLAYERTYPE* pPlayer, DWORD dwQuestIdx, DWORD dwSubQuestFlag, DWORD dwData, DWORD dwTime )
{
	CQuestGroup* pQuestGroup = pPlayer->GetQuestGroup();
	if(pQuestGroup)
		pQuestGroup->SetMainQuestData( dwQuestIdx, dwSubQuestFlag, dwData, dwTime );
}

void CQuestManager::SetSubQuestData( PLAYERTYPE* pPlayer, DWORD dwQuestIdx, DWORD dwSubQuestIdx, DWORD dwData, DWORD dwTime )
{
	CQuestGroup* pQuestGroup = pPlayer->GetQuestGroup();
	if(pQuestGroup)
		pQuestGroup->SetSubQuestData( dwQuestIdx, dwSubQuestIdx, dwData, dwTime );
}

void CQuestManager::SetQuestItem( PLAYERTYPE* pPlayer, DWORD dwQuestIdx, DWORD dwItemIdx, int nItemNum )
{
	// 老窜 item肮荐啊 0焊促 累栏搁...
	if( nItemNum < 0 )
		return;
	CQuestGroup* pQuestGroup = pPlayer->GetQuestGroup();
	if(pQuestGroup)
		pQuestGroup->SetQuestItem( dwQuestIdx, dwItemIdx, nItemNum );
}

void CQuestManager::DeleteQuest( PLAYERTYPE* pPlayer, DWORD dwQuestIdx )
{
	CQuestGroup* pQuestGroup = pPlayer->GetQuestGroup();
	if( !pQuestGroup )	return;

	pQuestGroup->DeleteQuest( dwQuestIdx );
	m_QuestUpdater->DeleteQuest( pPlayer, pQuestGroup->GetQuest(dwQuestIdx) );

	SEND_QUEST_IDX msg;
	msg.Category = MP_QUEST;
	msg.Protocol = MP_QUEST_DELETE_ACK;
	msg.dwObjectID = pPlayer->GetID();
	msg.MainQuestIdx = dwQuestIdx;
	
	pPlayer->SendMsg(&msg, sizeof(msg));
}

void CQuestManager::StartQuest( PLAYERTYPE* pPlayer, DWORD dwQuestIdx, DWORD dwSubQuestIdx )
{
	CQuest* pQuest = pPlayer->GetQuestGroup()->GetQuest( dwQuestIdx );
	if( !pQuest )	return;

	// DB 
	m_QuestUpdater->StartQuest( pPlayer, pQuest );
	JouranlInsertQuest(pPlayer->GetID(), eJournal_Quest, dwQuestIdx, dwSubQuestIdx, 0);

	// Network Send
	SEND_QUEST_IDX Msg;
	Msg.Category = MP_QUEST;
	Msg.Protocol = MP_QUEST_START_ACK;
	Msg.dwObjectID = pPlayer->GetID();
	Msg.MainQuestIdx = pQuest->GetQuestIdx();
	Msg.SubQuestIdx = 0;
	Msg.dwFlag = pQuest->GetSubQuestFlag();
	Msg.dwData = pQuest->IsQuestComplete();
	Msg.dwTime = pQuest->GetQuestTime();
	pPlayer->SendMsg(&Msg, sizeof(Msg));
}

void CQuestManager::EndQuest( PLAYERTYPE* pPlayer, DWORD dwQuestIdx, DWORD dwSubQuestIdx )
{
	CQuest* pQuest = pPlayer->GetQuestGroup()->GetQuest( dwQuestIdx );
	if( !pQuest )	return;

	// DB
	if( dwSubQuestIdx )	// 馆汗
		m_QuestUpdater->DeleteQuest( pPlayer, pQuest );
	else				// 1锅
		m_QuestUpdater->EndQuest( pPlayer, pQuest );
	JouranlInsertQuest(pPlayer->GetID(), eJournal_Quest, pQuest->GetQuestIdx(), dwSubQuestIdx, 1);
	
	// network send
	SEND_QUEST_IDX Msg;
	Msg.Category = MP_QUEST;
	Msg.Protocol = MP_QUEST_END_ACK;
	Msg.dwObjectID = pPlayer->GetID();
	Msg.MainQuestIdx = pQuest->GetQuestIdx();
	Msg.SubQuestIdx = dwSubQuestIdx;
	Msg.dwFlag = pQuest->GetSubQuestFlag();
	Msg.dwData = 1;
	Msg.dwTime = pQuest->GetQuestTime();
	pPlayer->SendMsg(&Msg, sizeof(Msg));
}

void CQuestManager::StartSubQuest( PLAYERTYPE* pPlayer, DWORD dwQuestIdx, DWORD dwSubQuestIdx )
{
	CQuest* pQuest = pPlayer->GetQuestGroup()->GetQuest( dwQuestIdx );
	if( !pQuest )	return;

	// DB
	m_QuestUpdater->StartSubQuest( pPlayer, pQuest, dwSubQuestIdx );
//	JouranlInsertQuest(pPlayer->GetID(), eJournal_Quest, dwQuestIdx, dwSubQuestIdx, FALSE);

	// network send
	SEND_QUEST_IDX Msg;
	Msg.Category = MP_QUEST;
	Msg.Protocol = MP_SUBQUEST_START_ACK;
	Msg.dwObjectID = pPlayer->GetID();
	Msg.MainQuestIdx = pQuest->GetQuestIdx();
	Msg.SubQuestIdx = dwSubQuestIdx;
	Msg.dwFlag = pQuest->GetSubQuestFlag();
	Msg.dwData = pQuest->GetSubQuestData( dwSubQuestIdx );
	Msg.dwTime = pQuest->GetSubQuestTime( dwSubQuestIdx );
	pPlayer->SendMsg(&Msg, sizeof(Msg));
}

void CQuestManager::EndSubQuest( PLAYERTYPE* pPlayer, DWORD dwQuestIdx, DWORD dwSubQuestIdx )
{
	CQuest* pQuest = pPlayer->GetQuestGroup()->GetQuest( dwQuestIdx );
	if( !pQuest )	return;

	// DB
	m_QuestUpdater->EndSubQuest( pPlayer, pQuest, dwSubQuestIdx );
//	JouranlInsertQuest(pPlayer->GetID(), eJournal_Quest, dwQuestIdx, dwSubQuestIdx, TRUE);

	// network send
	SEND_QUEST_IDX Msg;
	Msg.Category = MP_QUEST;
	Msg.Protocol = MP_SUBQUEST_END_ACK;
	Msg.dwObjectID = pPlayer->GetID();
	Msg.MainQuestIdx = pQuest->GetQuestIdx();
	Msg.SubQuestIdx = dwSubQuestIdx;
	Msg.dwFlag = pQuest->GetSubQuestFlag();
	Msg.dwData = pQuest->GetSubQuestData( dwSubQuestIdx );
	Msg.dwTime = pQuest->GetSubQuestTime( dwSubQuestIdx );
	pPlayer->SendMsg(&Msg, sizeof(Msg));
}

void CQuestManager::UpdateSubQuestData( PLAYERTYPE* pPlayer, DWORD dwQuestIdx, DWORD dwSubQuestIdx, DWORD dwMaxCount )
{
	CQuest* pQuest = pPlayer->GetQuestGroup()->GetQuest( dwQuestIdx );
	if( pQuest == NULL )	return;

	// DB
	m_QuestUpdater->UpdateSubQuest( pPlayer, pQuest, dwSubQuestIdx );

	// network send
	SEND_SUBQUEST_UPDATE Msg;
	Msg.Category = MP_QUEST;
	Msg.Protocol = MP_SUBQUEST_UPDATE;
	Msg.dwObjectID = pPlayer->GetID();
	Msg.wQuestIdx = pQuest->GetQuestIdx();
	Msg.wSubQuestIdx = dwSubQuestIdx;
	Msg.dwMaxCount = dwMaxCount;
	Msg.dwData = pQuest->GetSubQuestData( dwSubQuestIdx );
	Msg.dwTime = pQuest->GetSubQuestTime( dwSubQuestIdx );
	pPlayer->SendMsg(&Msg, sizeof(Msg));
}

void CQuestManager::GiveQuestItem( PLAYERTYPE* pPlayer, DWORD dwItemIdx, DWORD dwItemNum )
{
	// DB
	m_QuestUpdater->GiveQuestItem( pPlayer, dwItemIdx, dwItemNum );

	// network send
	SEND_QUESTITEM_IDX Msg;
	Msg.Category = MP_QUEST;
	Msg.Protocol = MP_QUESTITEM_GIVE;
	Msg.dwObjectID = pPlayer->GetID();
	Msg.dwItemIdx = dwItemIdx;
	Msg.dwItemNum = dwItemNum;
	pPlayer->SendMsg(&Msg, sizeof(Msg));
}

void CQuestManager::TakeQuestItem( PLAYERTYPE* pPlayer, DWORD dwQuestIdx, DWORD dwItemIdx, DWORD dwItemNum )
{
	// DB
	m_QuestUpdater->TakeQuestItem( pPlayer, dwQuestIdx, dwItemIdx, dwItemNum );

	// network send
	SEND_QUESTITEM_IDX Msg;
	Msg.Category = MP_QUEST;
	Msg.Protocol = MP_QUESTITEM_TAKE;
	Msg.dwObjectID = pPlayer->GetID();
	Msg.dwItemIdx = dwItemIdx;
	Msg.dwItemNum = dwItemNum;
	pPlayer->SendMsg(&Msg, sizeof(Msg));
}

void CQuestManager::UpdateQuestItem( PLAYERTYPE* pPlayer, DWORD dwQuestIdx, DWORD dwItemIdx, DWORD dwItemNum )
{
	// DB
	m_QuestUpdater->UpdateQuestItem( pPlayer, dwQuestIdx, dwItemIdx, dwItemNum );

	// network send
	SEND_QUESTITEM_IDX Msg;
	Msg.Category = MP_QUEST;
	Msg.Protocol = MP_QUESTITEM_UPDATE;
	Msg.dwObjectID = pPlayer->GetID();
	Msg.dwItemIdx = dwItemIdx;
	Msg.dwItemNum = dwItemNum;
	pPlayer->SendMsg(&Msg, sizeof(Msg));
}

void CQuestManager::AddQuestEvent( PLAYERTYPE* pPlayer, CQuestEvent* pQuestEvent, DWORD dwQuestIdx )
{
	if( m_dwQuestEventCount < MAX_QUESTEVENT_MGR )
	{
		m_QuestEvent[m_dwQuestEventCount].pPlayer = pPlayer;
		m_QuestEvent[m_dwQuestEventCount].QuestEvent = *pQuestEvent;
		m_QuestEvent[m_dwQuestEventCount].dwQuestIdx = dwQuestIdx;
		++m_dwQuestEventCount;
	}
}

void CQuestManager::Process()
{
	if( m_dwQuestEventCount <= 0 ) return;

	CQuestGroup* pQuestGroup = NULL;
	for( DWORD i = 0; i < m_dwQuestEventCount; ++i )
	{
		pQuestGroup = m_QuestEvent[i].pPlayer->GetQuestGroup();
		pQuestGroup->AddQuestEvent( &m_QuestEvent[i].QuestEvent, m_QuestEvent[i].dwQuestIdx );		
	}

	memset( m_QuestEvent, 0, sizeof(MQUESTEVENT)*MAX_QUESTEVENT_MGR );
	m_dwQuestEventCount = 0;
}

void CQuestManager::NetworkMsgParse( BYTE Protocol, void* pMsg )
{
	switch(Protocol)
	{
	case MP_QUESTEVENT_NPCTALK:
		{			
			SEND_QUEST_IDX* pmsg = (SEND_QUEST_IDX*)pMsg;
			CPlayer* pPlayer = (CPlayer*)g_pUserTable->FindUser(pmsg->dwObjectID);
			if( pPlayer == NULL )	return;

			// quest event
			CQuestEvent qe;
			qe.SetValue( eQuestEvent_NpcTalk, pmsg->MainQuestIdx, pmsg->SubQuestIdx );
			AddQuestEvent( pPlayer, &qe );
		}
		break;
	case MP_QUEST_CHANGESTATE:
		{
			SEND_QUEST_IDX* pmsg = (SEND_QUEST_IDX*)pMsg;
			CPlayer* pPlayer = (CPlayer*)g_pUserTable->FindUser(pmsg->dwObjectID);
			if( pPlayer == NULL )	return;

			m_QuestUpdater->UpdateQuest( pPlayer, pmsg->dwFlag, pmsg->dwData, pmsg->dwTime );
		}
		break;
	case MP_QUEST_DELETE_SYN:
		{
			SEND_QUEST_IDX* pmsg = (SEND_QUEST_IDX*)pMsg;
			CPlayer* pPlayer = (CPlayer*)g_pUserTable->FindUser(pmsg->dwObjectID);
			if( pPlayer == NULL )	return;

			DeleteQuest( pPlayer, pmsg->MainQuestIdx );			
		}
		break;
	case MP_QUEST_DELETE_CONFIRM_SYN:
		{
			// RaMa 04.10.16
			SEND_QUEST_IDX_SIMPLE* pmsg = (SEND_QUEST_IDX_SIMPLE*)pMsg;
			CPlayer* pPlayer = (CPlayer*)g_pUserTable->FindUser(pmsg->dwObjectID);
			if( pPlayer == NULL)	return;

			// Assert
			CQuestGroup* pQuestGroup = pPlayer->GetQuestGroup();
			if( pQuestGroup == NULL )
				return;

			CQuest* pQuest = pQuestGroup->GetQuest( pmsg->MainQuestIdx );
			if( pQuest == NULL )	
				return;			

			// 葛电辑宏涅胶飘啊 场车绰瘤 犬牢. -RaMa 04.10.25
			for(int i=0; i<pQuest->GetSubQuestCount(); i++)
			{
				if( pQuest->IsSubQuestComplete(i) == FALSE)
				{
					char buf[128];
					sprintf(buf, "MP_QUEST_DELETE_CONFIRM_SYN User:%d QuestIdx:%d NotComplete:%d", 
						pPlayer->GetID(), pmsg->MainQuestIdx, i);
					ASSERTMSG(0, buf);

					return;			
				}
			}

			SEND_QUEST_IDX_SIMPLE msg;
			msg.Category = MP_QUEST;
			msg.Protocol = MP_QUEST_DELETE_CONFIRM_ACK;
			msg.dwObjectID = pmsg->dwObjectID;
			msg.MainQuestIdx = pmsg->MainQuestIdx;
			pPlayer->SendMsg(&msg, sizeof(msg));

			char buf[128];
			sprintf(buf, "MP_QUEST_DELETE_CONFIRM_SYN User:%d QuestIdx:%d", 
				pPlayer->GetID(), pmsg->MainQuestIdx);
			ASSERTMSG(0, buf);

			CQuestInfo* pQuestInfo = GetQuestInfo( pmsg->MainQuestIdx );
			if(pQuestInfo)
				EndQuest( pPlayer, pmsg->MainQuestIdx, pQuestInfo->GetEndParam() );
			else
				EndQuest( pPlayer, pmsg->MainQuestIdx, 0 );

			// 辑滚俊 历厘吝牢 涅胶飘档 贸府秦霖促. -RaMa 04.10.28
			pQuest->EndQuest( pmsg->MainQuestIdx, pQuestInfo->GetEndParam() );
		}
	}	
}

⌨️ 快捷键说明

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