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

📄 npcscriptmanager.cpp

📁 墨香最新私服
💻 CPP
字号:
#include "stdafx.h"
#include "NpcScriptManager.h"
#include "cPage.h"
#include "cDialogueList.h"
#include "cHyperTextList.h"
#include "GameIn.h"
#include "Npc.h"
#include "ObjectManager.h"
#include "PyogukDialog.h"
#include "MugongSuryunDialog.h"
#include "ChatManager.h"
#include "WindowIDEnum.h"

#include "NpcScriptDialog.h"
#include "InventoryExDialog.h"
#include "MPRegistDialog.h"
#include "GuildLevelUpDialog.h"
#include "GuildMarkDialog.h"
#include "GuildWarehouseDialog.h"
#include "objectstatemanager.h"
#include "WantedManager.h"
#include "GuildManager.h"
#include "BailDialog.h"
#include "WantedDialog.h"
#include "./Interface/cWindowManager.h"
#include "cMsgBox.h"
#include "AbilityManager.h"
GLOBALTON(cNpcScriptManager)
cNpcScriptManager::cNpcScriptManager()
{
	m_nRegistNpcCount = 0;
	m_pDialogue = NULL;
	m_pHyperText = NULL;

	m_pCurSelectedNpc = NULL;
}

cNpcScriptManager::~cNpcScriptManager()
{
	DeleteAllScriptInfo();
	SAFE_DELETE( m_pDialogue );
	SAFE_DELETE( m_pHyperText );
}

void cNpcScriptManager::Init()
{
	LoadNpcScriptInfo();

	m_pDialogue = new cDialogueList;
#ifdef _FILE_BIN_
	m_pDialogue->LoadDialogueListFile(NPC_DIALOGUE_PATH, "rb");
#else
	m_pDialogue->LoadDialogueListFile(NPC_DIALOGUE_PATH);
#endif

	m_pHyperText = new cHyperTextList;
#ifdef _FILE_BIN_
	m_pHyperText->LoadHyperTextFormFile(NPC_HYPERTEXT_PATH, "rb");
#else
	m_pHyperText->LoadHyperTextFormFile(NPC_HYPERTEXT_PATH);
#endif
}


void cNpcScriptManager::AddNpcScriptInfo(DWORD dwNpcId, cPage* pPage)
{
	m_NpcScriptList[dwNpcId].AddTail(pPage);
}

void cNpcScriptManager::DeleteAllScriptInfo()
{
	for(int i=0;i<MAX_NPC_COUNT;++i)
	{
		PTRLISTSEARCHSTART(m_NpcScriptList[i],cPage*,pPage)
			delete pPage;
		PTRLISTSEARCHEND
			
		m_NpcScriptList[i].RemoveAll();
	}
}

cPage* cNpcScriptManager::GetMainPage( DWORD dwNpcId )
{
	if( m_NpcScriptList[dwNpcId].IsEmpty() ) return NULL;

	return (cPage*)m_NpcScriptList[dwNpcId].GetHead();
}

cPage* cNpcScriptManager::GetPage( DWORD dwNpcId, DWORD dwPageId )
{
	PTRLISTSEARCHSTART(m_NpcScriptList[dwNpcId],cPage*,pPage)
		if( pPage->GetPageId() == dwPageId )
			return pPage;
	PTRLISTSEARCHEND
			
	return NULL;
}


void cNpcScriptManager::LoadNpcScriptInfo()
{
	CMHFile fp;
#ifdef _FILE_BIN_
	if(!fp.Init(NPC_SCRIPT_PATH, "rb"))
		return;
#else
	if(!fp.Init(NPC_SCRIPT_PATH, "rt"))
		return;
#endif	

	char buff[256]={0,};

	while(1)
	{
		fp.GetString(buff);
		if( fp.IsEOF() )
			break;
		if(buff[0] == '@')
		{
			fp.GetLineX(buff, 256);
			continue;
		}

		CMD_ST(buff)
		CMD_CS("$NPC")
			if((fp.GetString())[0] == '{')
			{
				LoadPageInfo(NULL, &fp);
				++m_nRegistNpcCount;
			}
			else
				__asm int 3;
		CMD_EN
	}
}

void cNpcScriptManager::LoadPageInfo(cPage* pPage, CMHFile* fp)
{
	// 促矫茄锅 犬牢 棺 林籍 贸府夸!!
	char buff[256]={0,};

	static DWORD dwNpcId; // Npc俊措茄 Page沥焊啊 肯丰 瞪锭鳖瘤 蜡瘤 啊瓷秦具 茄促.
	DWORD dwPageId;
	int nDialogueCount = 0;
	int nHyperLinkCount = 0;
	DWORD dwDialogueId;
	HYPERLINK sHyper;

	while(1)
	{
		fp->GetString(buff);
		if(buff[0] == '}'|| fp->IsEOF())
			break;
		if(buff[0] == '@')
		{
			fp->GetLineX(buff, 256);
			continue;
		}
		CMD_ST(buff)
		CMD_CS("$PAGE")
			if((fp->GetString())[0] == '{')
			{
				cPage* pNewPage = new cPage; // 货肺款 其捞瘤狼 殿废
				AddNpcScriptInfo( dwNpcId, pNewPage );
				LoadPageInfo(pNewPage, fp);
			}
		CMD_CS("#NPCID")
			dwNpcId = fp->GetDword();
		CMD_CS("#PAGEINFO")
			dwPageId = fp->GetDword();
			nDialogueCount = fp->GetInt();
			nHyperLinkCount = fp->GetInt();
			pPage->Init( dwPageId );
		CMD_CS("#DIALOGUE")
			for(int i =0; i<nDialogueCount;++i)
			{
				dwDialogueId = fp->GetDword();
				pPage->AddDialogue( dwDialogueId );
			}
		CMD_CS("#HYPERLINK")
			sHyper.wLinkId = fp->GetWord();
			sHyper.wLinkType = fp->GetWord()+1;
//			if( sHyper.wLinkType == emLink_Page || sHyper.wLinkType == emLink_Open 
//				|| sHyper.wLinkType == emLink_Quest )
				sHyper.dwData = fp->GetDword();
			pPage->AddHyperLink( &sHyper );
		CMD_EN
	}
}

void cNpcScriptManager::StartNpcScript( CNpc* pNpc )
{
	// 扁粮俊 粮犁窍搁 扁粮巴阑 昏力窍绊 货肺 楷促.
	if( m_pCurSelectedNpc )
	{
		GAMEIN->GetNpcScriptDialog()->EndDialog();
		m_pCurSelectedNpc = NULL;
	}

	m_pCurSelectedNpc = pNpc;
	GAMEIN->GetNpcScriptDialog()->OpenDialog( pNpc->GetNpcUniqueIdx() );
}

void cNpcScriptManager::StartNpcBusiness(DWORD dwData)
{
	if( m_pCurSelectedNpc == NULL ) 
	{
		ASSERT(0);

		if( HERO->GetState() == eObjectState_Deal )
			OBJECTSTATEMGR->EndObjectState(HERO, eObjectState_Deal);
		
		return;
	}

	if(m_pCurSelectedNpc->GetNpcJob() == DEALER_ROLE)
	{
		MSG_WORD msg;
		msg.Category = MP_ITEM;
		msg.Protocol = MP_ITEM_DEALER_SYN;
		msg.dwObjectID = HEROID;
		msg.wData = m_pCurSelectedNpc->GetNpcUniqueIdx();
		NETWORK->Send(&msg, sizeof(msg));
	}
	else if(m_pCurSelectedNpc->GetNpcJob() == MUNPA_ROLE)
	{
		if(dwData == 0)
		{		
			if(HERO->GetGuildIdx())
			{
				CHATMGR->AddMsg(CTC_SYSMSG, CHATMGR->GetChatMsg(28));
				return;
			}
			if(ABILITYMGR->GetAbilityLevel(ABILITYINDEX_LEADERSHIP, HERO->GetAbilityGroup()) < 1)
			{
				CHATMGR->AddMsg(CTC_SYSMSG, CHATMGR->GetChatMsg(41));
				return;
			}
			if(GUILDMGR->CanEntryGuild(HERO->GetGuildEntryDate()) == FALSE)
			{
				CHATMGR->AddMsg(CTC_SYSMSG, CHATMGR->GetChatMsg(59), HERO->GetGuildEntryDate());
				return;
			}
			cDialog* pDlg = (cDialog*)GAMEIN->GetGuildCreateDlg();
			pDlg->SetActive(TRUE);
		}
		else if(dwData == 1)
		{
			if(HERO->GetGuildIdx() && (HERO->GetGuildMemberRank() == GUILD_MASTER))
			{
				WINDOWMGR->MsgBox( MBI_GUILD_BREAKUP, MBT_YESNO, CHATMGR->GetChatMsg( 302 ) );
			}
			else
			{
				CHATMGR->AddMsg(CTC_SYSMSG, CHATMGR->GetChatMsg(35));
				return;
			}
		}
		else if(dwData == 2)
		{
			if(HERO->GetGuildIdx() && (HERO->GetGuildMemberRank() == GUILD_MASTER))
			{
				GAMEIN->GetGuildLevelUpDlg()->SetActive(TRUE);
			}
			else
			{
				CHATMGR->AddMsg(CTC_SYSMSG, CHATMGR->GetChatMsg(35));
				return;
			}			
		}
		else if(dwData == 3)
		{
			if(GUILDMGR->GetGuildLevel() < GUILD_2LEVEL)
			{
				CHATMGR->AddMsg(CTC_SYSMSG, CHATMGR->GetChatMsg(723));
				return;
			}
			if(HERO->GetGuildIdx() && (HERO->GetGuildMemberRank() == GUILD_MASTER))
			{
				GAMEIN->GetGuildMarkDlg()->SetActive(TRUE);
			}
			else
			{
				CHATMGR->AddMsg(CTC_SYSMSG, CHATMGR->GetChatMsg(113));
				return;
			}			
		}
	}
	else if(m_pCurSelectedNpc->GetNpcJob() == CHANGGO_ROLE)
	{
		if(dwData == 0) //芒绊 焊扁
		{	
			if(GAMEIN->GetPyogukDialog()->IsItemInit())
			{
				GAMEIN->GetInventoryDialog()->SetActive(TRUE);
				GAMEIN->GetPyogukDialog()->SetActive(TRUE);
				if(HERO->GetPyogukNum() == 0)
				{
					GAMEIN->GetPyogukDialog()->ShowPyogukMode(ePyogukMode_NoWare);
				}
				else
				{
					GAMEIN->GetPyogukDialog()->ShowPyogukMode(ePyogukMode_PyogukWare1);
					GAMEIN->GetPyogukDialog()->AddPyogukMode(ePyogukMode_PyogukWare1);
				}
			}
			else
			{
				if(HERO->GetPyogukNum() == 0)
				{
					GAMEIN->GetInventoryDialog()->SetActive(TRUE);
					GAMEIN->GetPyogukDialog()->SetActive(TRUE);
					GAMEIN->GetPyogukDialog()->ShowPyogukMode(ePyogukMode_NoWare);
				}
				else
				{
					MSGBASE msg;
					msg.Category = MP_ITEM;
					msg.Protocol = MP_ITEM_PYOGUK_ITEM_INFO_SYN;
					msg.dwObjectID = HEROID;
					
					NETWORK->Send(&msg, sizeof(msg));
				}
			}
			/*
			GAMEIN->GetInventoryDialog()->SetActive(TRUE);
			GAMEIN->GetPyogukDialog()->SetActive(TRUE);
			GAMEIN->GetPyogukDialog()->ShowPyogukMode(ePyogukMode_PyogukWare1);
			GAMEIN->GetPyogukDialog()->AddPyogukMode(ePyogukMode_PyogukWare1);
			*/	
		}	
		else if(dwData == 1) //啊拜钎/备涝
		{
			GAMEIN->GetPyogukDialog()->SetActive(TRUE);
			GAMEIN->GetPyogukDialog()->ShowPyogukMode(ePyogukMode_PyogukListInfo);
			GAMEIN->GetPyogukDialog()->AddPyogukMode(ePyogukMode_PyogukListInfo);
		}
		else if(dwData == 2)
		{
			GAMEIN->GetGuildWarehouseDlg()->SetActive(TRUE);
		}
	}	
	else if(m_pCurSelectedNpc->GetNpcJob() == WANTED_ROLE)
	{
		//傈俊 努腐茄霸 词霸棵 荐档 乐匙
		if(GAMEIN->GetWantedDialog()->IsActive() == TRUE)
			return;
		if(dwData == 0) //芒绊 焊扁
			WANTEDMGR->SortWantedListSyn(1);
		else if(dwData == 1)
			GAMEIN->GetBailDialog()->Open();
		//
	}
	else if(m_pCurSelectedNpc->GetNpcJob() == SURYUN_ROLE)
	{
		GAMEIN->GetMPRegistDialog()->SetActive(TRUE);
		if(GAMEIN->GetMugongSuryunDialog()->IsActive() == FALSE)
			GAMEIN->GetMugongSuryunDialog()->SetActive(TRUE);
	}
	else
	{
		ASSERT(0);
		if( HERO->GetState() == eObjectState_Deal )
			OBJECTSTATEMGR->EndObjectState(HERO, eObjectState_Deal);
		return;
	}

	GAMEIN->GetNpcScriptDialog()->DisActiveEx();
//	GAMEIN->GetNpcScriptDialog()->EndDialog();
}

⌨️ 快捷键说明

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