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

📄 questmanager.cpp

📁 墨香最新私服
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		if( pQuest->IsNpcRelationQuest( dwNpcIdx ) )
			return TRUE;
	}
	return FALSE;
}

DWORD CQuestManager::GetNpcScriptPage( DWORD dwNpcIdx )
{
	DWORD dwPage = 0;
	CQuest* pQuest = NULL;
	m_QuestTable.SetPositionHead();
	while( pQuest = m_QuestTable.GetData() )
	{
		dwPage = pQuest->GetNpcScriptPage( dwNpcIdx );
		if( dwPage )
			return dwPage;
	}
	return 0;
}

void CQuestManager::SendNpcTalkEvent( DWORD dwNpcIdx, DWORD dwNpcScriptIdx )
{
	SEND_QUEST_IDX Msg;
	Msg.Category = MP_QUEST;
	Msg.Protocol = MP_QUESTEVENT_NPCTALK;
	Msg.dwObjectID = HERO->GetID();
	Msg.MainQuestIdx = dwNpcIdx;
	Msg.SubQuestIdx = dwNpcScriptIdx;
	NETWORK->Send( &Msg, sizeof(Msg) );
}

void CQuestManager::SetNpcData( CNpc* pNpc )
{
	if( m_dwMaxNpc > 31 )
		return;
	m_pNpcArray[m_dwMaxNpc] = pNpc;
	++m_dwMaxNpc;
}

void CQuestManager::ProcessNpcMark()
{
	if( HERO == NULL )	return;

	for( DWORD i = 0; i < m_dwMaxNpc; ++i )
		m_pNpcArray[i]->RemoveAllObjectEffect();

	DWORD dwNpcIdx = 0;
	DWORD dwNpcMarkType = 0;
	CQuest* pQuest = NULL;
	CObject* pObject = NULL;

	m_QuestTable.SetPositionHead();
	while( pQuest = m_QuestTable.GetData() )
	{
		for( DWORD i = 0; i < m_dwMaxNpc; ++i )
		{
			if( dwNpcMarkType = pQuest->GetNpcMarkType( m_pNpcArray[i]->GetNpcUniqueIdx() ) )
			{
				if( dwNpcMarkType == 1 )		// !
				{
					pObject = OBJECTMGR->GetObject( m_pNpcArray[i]->GetID() );
					if( pObject )
					{
						if( pObject->IsNpcMark( NPCMARK_1_ID ) )
						{
//							m_pNpcArray[i]->RemoveObjectEffect( NPCMARK_1_ID );
						}
						else if( pObject->IsNpcMark( NPCMARK_2_ID ) )
						{
							m_pNpcArray[i]->RemoveObjectEffect( NPCMARK_2_ID );

							OBJECTEFFECTDESC desc(FindEffectNum("eff_NpcMark1.beff"));
							pObject->AddObjectEffect( NPCMARK_1_ID, &desc, 1 );
						}
						else
						{
							OBJECTEFFECTDESC desc(FindEffectNum("eff_NpcMark1.beff"));
							pObject->AddObjectEffect( NPCMARK_1_ID, &desc, 1 );
						}
					}
				}
				else if( dwNpcMarkType == 2 )	// ?
				{
					pObject = OBJECTMGR->GetObject( m_pNpcArray[i]->GetID() );
					if( pObject )
					{
						if( pObject->IsNpcMark( NPCMARK_1_ID ) )
						{
//							m_pNpcArray[i]->RemoveObjectEffect( NPCMARK_1_ID );
						}
						else if( pObject->IsNpcMark( NPCMARK_2_ID ) )
						{
						}
						else
						{
							OBJECTEFFECTDESC desc(FindEffectNum("eff_NpcMark2.beff"));
							pObject->AddObjectEffect( NPCMARK_2_ID, &desc, 1 );
						}
					}
				}
			}
		}
	}
}

void CQuestManager::NetworkMsgParse( BYTE Protocol, void* pMsg )
{
	switch(Protocol)
	{
	case MP_QUEST_MAINDATA_LOAD:
		{
			SEND_MAINQUEST_DATA* pmsg = (SEND_MAINQUEST_DATA*)pMsg;
			if(pmsg->wCount==0)		break;
			
			for(int i=0; i<pmsg->wCount; i++)
			{
				SetMainQuestData( pmsg->QuestList[i].QuestIdx, pmsg->QuestList[i].state.value,
								  pmsg->QuestList[i].EndParam, pmsg->QuestList[i].Time );
			}
			
			ProcessNpcMark();
		}
		break;
	case MP_QUEST_SUBDATA_LOAD:
		{
			SEND_SUBQUEST_DATA* pmsg = (SEND_SUBQUEST_DATA*)pMsg;
			if(pmsg->wCount==0)		break;
			
			for(int i=0; i<pmsg->wCount; i++)
			{
				SetSubQuestData( pmsg->QuestList[i].QuestIdx, pmsg->QuestList[i].SubQuestIdx,
								 pmsg->QuestList[i].state, pmsg->QuestList[i].time );
			}

			ProcessNpcMark();
		}
		break;	
	case MP_QUEST_ITEM_LOAD:
		{
			SEND_QUESTITEM* pmsg = (SEND_QUESTITEM*)pMsg;
			if(pmsg->wCount==0)		break;

			for(int i=0; i<pmsg->wCount; i++)
			{			
				m_QuestUpdater->QuestItemAdd(m_QuestItemMGR.GetQuestItem(pmsg->ItemList[i].ItemIdx),
					pmsg->ItemList[i].Count);			
			}
		}
		break;
	case MP_QUEST_START_ACK:
		{
			SEND_QUEST_IDX* pmsg = (SEND_QUEST_IDX*)pMsg;
			StartQuest( pmsg->MainQuestIdx, pmsg->dwFlag, pmsg->dwData, pmsg->dwTime );
		}		
		break;
	case MP_SUBQUEST_START_ACK:
		{
			SEND_QUEST_IDX* pmsg = (SEND_QUEST_IDX*)pMsg;		
			StartSubQuest( pmsg->MainQuestIdx, pmsg->SubQuestIdx, pmsg->dwFlag, pmsg->dwData, pmsg->dwTime );

			ProcessNpcMark();
		}
		break;
	case MP_QUEST_END_ACK:
		{
			SEND_QUEST_IDX* msg = (SEND_QUEST_IDX*)pMsg;
			EndQuest( msg->MainQuestIdx, msg->dwFlag, msg->dwData, msg->dwTime );	
			
			ProcessNpcMark();
		}
		break;
	case MP_SUBQUEST_END_ACK:
		{
			SEND_QUEST_IDX* msg = (SEND_QUEST_IDX*)pMsg;
			EndSubQuest( msg->MainQuestIdx, msg->SubQuestIdx, msg->dwFlag, msg->dwData, msg->dwTime );			

			ProcessNpcMark();
		}
		break;
	case MP_SUBQUEST_UPDATE:
		{
			SEND_SUBQUEST_UPDATE* msg = (SEND_SUBQUEST_UPDATE*)pMsg;
			UpdateSubQuestData( msg->wQuestIdx, msg->wSubQuestIdx, msg->dwMaxCount, msg->dwData, msg->dwTime );
		}
		break;	
	case MP_QUESTITEM_GIVE:
		{
			SEND_QUESTITEM_IDX* pmsg = (SEND_QUESTITEM_IDX*)pMsg;
			QuestItemDelete( pmsg->dwItemIdx );
		}
		break;
	case MP_QUESTITEM_TAKE:
		{
			SEND_QUESTITEM_IDX* pmsg = (SEND_QUESTITEM_IDX*)pMsg;
			QuestItemAdd( pmsg->dwItemIdx, pmsg->dwItemNum );

			EFFECTMGR->StartHeroEffectProcess(eEffect_GetItem_Quest);
//			ITEMMGR->ItemDropEffect( pmsg->dwItemIdx );
		}
		break;
	case MP_QUESTITEM_UPDATE:
		{
			SEND_QUESTITEM_IDX* pmsg = (SEND_QUESTITEM_IDX*)pMsg;
			QuestItemUpdate( eQItem_SetCount, pmsg->dwItemIdx, pmsg->dwItemNum );

			EFFECTMGR->StartHeroEffectProcess(eEffect_GetItem_Quest);
//			ITEMMGR->ItemDropEffect( pmsg->dwItemIdx );
		}
		break;
	case MP_QUEST_DELETE_ACK:
		{
			SEND_QUEST_IDX* pmsg = (SEND_QUEST_IDX*)pMsg;			
			DeleteQuest( pmsg->MainQuestIdx );			

			ProcessNpcMark();
		}
		break;
	case MP_QUEST_DELETE_CONFIRM_ACK:
		{
			SEND_QUEST_IDX_SIMPLE* pmsg = (SEND_QUEST_IDX_SIMPLE*)pMsg;
			
			m_QuestUpdater->DeleteQuest(pmsg->MainQuestIdx);
		}
		break;
	case MP_QUEST_TAKEITEM_ACK:	// 
		{
			ITEMOBTAINARRAY * pmsg = (ITEMOBTAINARRAY *)pMsg;		
			CItem* pItem = NULL;
			for( int i = 0; i < pmsg->ItemNum; ++i )
			{
				if( pItem = GAMEIN->GetInventoryDialog()->GetItemForIdx( pmsg->GetItem(i)->Position ) )
				{
					pItem->SetItemBaseInfo(pmsg->GetItem(i));
				}
				else
				{
					pItem = ITEMMGR->MakeNewItem(pmsg->GetItem(i),"MP_QUEST_TAKEITEM_ACK");
					BOOL rt = GAMEIN->GetInventoryDialog()->AddItem(pItem);
					if(!rt)
					{
						ASSERT(0);
					}
				}
			}
			// 
			cDialog* pDlg = WINDOWMGR->GetWindowForID( DBOX_DIVIDE_INV );
			if( pDlg )
			{
				((cDivideBox*)pDlg)->ExcuteDBFunc( 0 );	
			}

			QUICKMGR->RefreshQickItem();

			if( !pItem ) return;
			if( pItem->GetItemKind() == eQUEST_ITEM_EQUIP )
				CHATMGR->AddMsg( CTC_QUEST, CHATMGR->GetChatMsg(656), pItem->GetItemInfo()->ItemName );
			else
				CHATMGR->AddMsg( CTC_QUEST, CHATMGR->GetChatMsg(607), pItem->GetItemInfo()->ItemName );

			EFFECTMGR->StartHeroEffectProcess(eEffect_GetItem_Quest);
//			ITEMMGR->ItemDropEffect( pItem->GetItemIdx() );
		}
		break;
	case MP_QUEST_TAKEMONEY_ACK:
		{
			MSG_DWORD* pmsg = (MSG_DWORD*)pMsg;

			CHATMGR->AddMsg( CTC_QUEST, CHATMGR->GetChatMsg(608), AddComma(pmsg->dwData) );
			EFFECTMGR->StartHeroEffectProcess(eEffect_GetMoney);
		}
		break;
	case MP_QUEST_TAKEEXP_ACK:
		{
			MSG_DWORD* pmsg = (MSG_DWORD*)pMsg;

			CHATMGR->AddMsg( CTC_QUEST, CHATMGR->GetChatMsg(609), pmsg->dwData );
		}
		break;
	case MP_QUEST_TAKESEXP_ACK:
		{
			MSG_DWORD* pmsg = (MSG_DWORD*)pMsg;

			CHATMGR->AddMsg( CTC_QUEST, CHATMGR->GetChatMsg(610), pmsg->dwData );
		}
		break;
	case MP_QUEST_GIVEITEM_ACK:
		{
			MSG_EXCHANGE_REMOVEITEM* pmsg = (MSG_EXCHANGE_REMOVEITEM*)pMsg;
			CItem* pItem = GAMEIN->GetInventoryDialog()->GetItemForIdx( pmsg->wAbsPosition ); 
			WORD wTableIdx = ITEMMGR->GetTableIdxForAbsPos( pmsg->wAbsPosition );
			const ITEMBASE* pItemInfo = ITEMMGR->GetItemInfoAbsIn( HERO, pmsg->wAbsPosition );
			ITEMMGR->DeleteItemofTable( wTableIdx, pmsg->wAbsPosition );
			QUICKMGR->RefreshQickItem();

			if( !pItem ) return;
			CHATMGR->AddMsg( CTC_QUEST, CHATMGR->GetChatMsg(657), pItem->GetItemInfo()->ItemName );
		}
		break;
	case MP_QUEST_GIVEMONEY_ACK:
		{
			MSG_DWORD* pmsg = (MSG_DWORD*)pMsg;
			CHATMGR->AddMsg( CTC_QUEST, CHATMGR->GetChatMsg(608), AddComma(pmsg->dwData) );			
		}
		break;
	default:
		break;
	}
}

//
#include "GameIn.h"
#include "QuestTotalDialog.h"

void CQuestManager::AddStringTest()
{
	CQuestString* pQuestString = NULL;
}

void CQuestManager::ViewToggle()
{
	GAMEIN->GetQuestTotalDialog()->QuestListView();
}

void CQuestManager::AddJournalTest()
{
	CQuestString* pQuestString = NULL;
	char buf[16] = { 0, };
	sprintf(buf, "2004.08.06");	
	
	JOURNALINFO item;
	item.Kind = eJournal_Quest;
	item.bSaved = FALSE;
	item.Param = 1;
	strcpy(item.RegDate, buf);
		m_QuestUpdater->JournalItemAdd(&item);
	item.Param = 2;
	item.Param_2 = 0;
	m_QuestUpdater->JournalItemAdd(&item);
	item.Param = 3;
	m_QuestUpdater->JournalItemAdd(&item);

}

void CQuestManager::QuestAbandon()
{
	DWORD QuestIdx = m_QuestUpdater->GetSelectedQuestID();
	m_QuestUpdater->CloseMsgBox();	

	SEND_QUEST_IDX msg;

	msg.Category = MP_QUEST;
	msg.Protocol = MP_QUEST_DELETE_SYN;
	msg.dwObjectID = HERO->GetID();
	msg.MainQuestIdx = QuestIdx;

	NETWORK->Send(&msg, sizeof(msg));

	//test
	m_QuestUpdater->DeleteQuest(QuestIdx);
}

void CQuestManager::QuestAbandon( DWORD dwQuestIdx )
{
	SEND_QUEST_IDX msg;

	msg.Category = MP_QUEST;
	msg.Protocol = MP_QUEST_DELETE_SYN;
	msg.dwObjectID = HERO->GetID();
	msg.MainQuestIdx = dwQuestIdx;

	NETWORK->Send(&msg, sizeof(msg));

	//test
	m_QuestUpdater->DeleteQuest( dwQuestIdx );
}

void CQuestManager::QuestAbandonClose()
{
	m_QuestUpdater->CloseMsgBox();
}

void CQuestManager::AddQuestNpc( CSubQuestInfo* pSubQuestInfo )
{
	if( !pSubQuestInfo ) return;

	cPtrList* pNpcList = pSubQuestInfo->GetQuestNpcList();
	if( !pNpcList ) return;

	PTRLISTPOS npos = pNpcList->GetHeadPosition();
	while( npos )
	{
		CQuestNpc* pNpc = (CQuestNpc*)pNpcList->GetNext( npos );
		if( pNpc )
		{
			cPtrList* pList = pNpc->GetNpcDataList();
			if( pList )
			{
				PTRLISTPOS pos = pList->GetHeadPosition();
				while( pos )
				{
					CQuestNpcData* pData = (CQuestNpcData*)pList->GetNext( pos );
					if( pData )
					{
						QUESTNPCINFO* pInfo = m_QuestNpcTable.GetData( pData->GetNpcIdx() );
						if( pInfo )
							MAP->AddQuestNpc( pInfo );
					}
				}
			}
		}
	}
}

BOOL CQuestManager::IsQuestStarted( DWORD dwQuestIdx )
{
	CQuest* pQuest = m_QuestTable.GetData( dwQuestIdx );
	if( pQuest )
	{
		if( pQuest->IsSubQuestComplete( 0 ) )
			return FALSE;
		else
			return pQuest->CanItemUse( dwQuestIdx );
	}
	return FALSE;
}

⌨️ 快捷键说明

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