📄 questmanager.cpp
字号:
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 + -