DragonNest/Client/EventAreaInsideNaviChecker/EventAreaInsideNaviCheckerDlg.cpp
Cussrro 47f7895977 Revert "修复编码问题"
This reverts commit 9e69c01767.
2024-12-21 10:04:04 +08:00

471 lines
14 KiB
C++
Raw Permalink Blame History

// EventAreaInsideNaviCheckerDlg.cpp : implementation file
//
#include "stdafx.h"
#include "EventAreaInsideNaviChecker.h"
#include "EventAreaInsideNaviCheckerDlg.h"
#include "EtWorld.h"
#include <process.h>
#include "EtResourceMng.h"
#include "DNTableFile.h"
#include "EtWorldGrid.h"
#include "EtWorldSector.h"
#include "EtWorldEventControl.h"
#include "EtWorldEventArea.h"
//#include "NavMesh.h"
#include "navigationmesh.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
// Implementation
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
// CEventAreaInsideNaviCheckerDlg dialog
CEventAreaInsideNaviCheckerDlg::CEventAreaInsideNaviCheckerDlg(CWnd* pParent /*=NULL*/)
: CDialog(CEventAreaInsideNaviCheckerDlg::IDD, pParent)
, m_szFolder(_T(""))
, m_bCheckEventAreaInsideNavi(FALSE)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_bWorking = false;
}
void CEventAreaInsideNaviCheckerDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT1, m_szFolder);
DDX_Check(pDX, IDC_CHECK1, m_bCheckEventAreaInsideNavi);
DDX_Control(pDX, IDC_TREE1, m_TreeCtrl);
DDX_Check(pDX, IDC_CHECK4, m_bCheckOptionMonster);
DDX_Check(pDX, IDC_CHECK5, m_bCheckOptionMonsterGroup);
DDX_Check(pDX, IDC_CHECK7, m_bCheckOptionNpc);
DDX_Check(pDX, IDC_CHECK8, m_bCheckOptionEtc);
}
BEGIN_MESSAGE_MAP(CEventAreaInsideNaviCheckerDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDCANCEL, &CEventAreaInsideNaviCheckerDlg::OnBnClickedCancel)
ON_BN_CLICKED(IDOK, &CEventAreaInsideNaviCheckerDlg::OnBnClickedOk)
ON_BN_CLICKED(IDC_BUTTON1, &CEventAreaInsideNaviCheckerDlg::OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON2, &CEventAreaInsideNaviCheckerDlg::OnBnClickedButton2)
END_MESSAGE_MAP()
// CEventAreaInsideNaviCheckerDlg message handlers
BOOL CEventAreaInsideNaviCheckerDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
CBitmap bitmap;
bitmap.LoadBitmap( IDB_BITMAP1 );
m_ImageList.Create( 16, 16, ILC_COLOR24|ILC_MASK, 4, 1 );
m_ImageList.Add( &bitmap, RGB(0,255,0) );
m_TreeCtrl.SetImageList( &m_ImageList, TVSIL_NORMAL );
m_bCheckEventAreaInsideNavi = TRUE;
m_bCheckOptionMonster = TRUE;
m_bCheckOptionMonsterGroup = TRUE;
m_bCheckOptionEtc = TRUE;
UpdateData( FALSE );
return TRUE; // return TRUE unless you set the focus to a control
}
void CEventAreaInsideNaviCheckerDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CEventAreaInsideNaviCheckerDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this function to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CEventAreaInsideNaviCheckerDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CEventAreaInsideNaviCheckerDlg::OnBnClickedCancel()
{
/*
// TODO: Add your control notification handler code here
OnCancel();
*/
}
void CEventAreaInsideNaviCheckerDlg::OnBnClickedOk()
{
// TODO: Add your control notification handler code here
OnOK();
}
void CEventAreaInsideNaviCheckerDlg::OnBnClickedButton1()
{
// TODO: Add your control notification handler code here
if( UpdateData(TRUE) )
{
CXTBrowseDialog dlg;
dlg.SetTitle(_T("Select Resource Directory"));
if (!m_szFolder.IsEmpty())
{
TCHAR path[_MAX_PATH];
STRCPY_S(path, _MAX_PATH, m_szFolder);
dlg.SetSelPath(path);
}
if (dlg.DoModal() == IDOK)
{
m_szFolder = dlg.GetSelPath();
UpdateData(FALSE);
}
}
}
void CEventAreaInsideNaviCheckerDlg::EnableControl( bool bEnable )
{
GetDlgItem( IDC_EDIT1 )->EnableWindow( bEnable );
GetDlgItem( IDC_CHECK1 )->EnableWindow( bEnable );
GetDlgItem( IDC_BUTTON2 )->EnableWindow( bEnable );
GetDlgItem( IDC_CHECK4 )->EnableWindow( bEnable );
GetDlgItem( IDC_CHECK5 )->EnableWindow( bEnable );
GetDlgItem( IDC_CHECK7 )->EnableWindow( bEnable );
GetDlgItem( IDC_CHECK8 )->EnableWindow( bEnable );
}
bool g_bAreaNameFilter[4] = { false, };
void CEventAreaInsideNaviCheckerDlg::OnBnClickedButton2()
{
m_TreeCtrl.EnableMultiSelect();
m_TreeCtrl.DeleteAllItems();
m_TreeCtrl.SetImageList( &m_ImageList, TVSIL_NORMAL );
UpdateData( TRUE );
g_bAreaNameFilter[0] = m_bCheckOptionMonster;
g_bAreaNameFilter[1] = m_bCheckOptionMonsterGroup;
g_bAreaNameFilter[2] = m_bCheckOptionNpc;
g_bAreaNameFilter[3] = m_bCheckOptionEtc;
m_hThreadHandle = (HANDLE)_beginthreadex( NULL, 65536, CheckStart, (void*)this, 0, &m_dwThreadID );
}
UINT __stdcall CEventAreaInsideNaviCheckerDlg::CheckStart( void *pParam )
{
CEventAreaInsideNaviCheckerDlg *pDlg = (CEventAreaInsideNaviCheckerDlg *)pParam;
pDlg->m_bWorking = true;
pDlg->EnableControl( false );
// Resource Path
CEtResourceMng::CreateInstance();
CEtResourceMng::GetInstance().Initialize();
CEtResourceMng::GetInstance().AddResourcePath( (const char*)pDlg->m_szFolder.GetBuffer(), true );
// üũ<C3BC><C5A9> Map <20><> MapTable <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
DNTableFileFormat *pMapSox = new DNTableFileFormat( CEtResourceMng::GetInstance().GetFullName( "MapTable.ext" ).c_str() );
int nCount = pMapSox->GetItemCount();
std::vector<std::string> szVecGridList;
char szLabel[32];
for( int i=0; i<nCount; i++ ) {
int nItemID = pMapSox->GetItemID(i);
for( int j=0; j<10; j++ ) {
sprintf_s( szLabel, "_ToolName%d", j + 1 );
std::string szMapName = pMapSox->GetFieldFromLablePtr( nItemID, szLabel )->GetString();
if( !szMapName.empty() ) {
ToLowerA( szMapName );
if( std::find( szVecGridList.begin(), szVecGridList.end(), szMapName ) == szVecGridList.end() ) {
szVecGridList.push_back( szMapName );
}
}
}
}
SAFE_DELETE( pMapSox );
// <20>׺<EFBFBD><D7BA>޽<EFBFBD><DEBD><EFBFBD> <20><>ġ<EFBFBD><C4A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> üũ
DNTableFileFormat *pMonsterSox = new DNTableFileFormat( CEtResourceMng::GetInstance().GetFullName( "MonsterTable.ext" ).c_str() );
DNTableFileFormat *pMonsterCompoundSox = new DNTableFileFormat( CEtResourceMng::GetInstance().GetFullName( "MonsterCompoundTable.ext" ).c_str() );
DNTableFileFormat *pNpcSox = new DNTableFileFormat( CEtResourceMng::GetInstance().GetFullName( "NpcTable.ext" ).c_str() );
CEtWorld *pWorld = new CEtWorld;
char szWorldPath[256];
sprintf_s( szWorldPath, "%s\\MapData", pDlg->m_szFolder.GetBuffer() );
for( DWORD i=0; i<szVecGridList.size(); i++ ) {
HTREEITEM hGrid = pDlg->m_TreeCtrl.InsertItem( szVecGridList[i].c_str(), 2, 3 );
bool bValid = true;
if( pWorld->Initialize( szWorldPath, szVecGridList[i].c_str() ) == false ) {
// <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3> <20><><EFBFBD>ش<EFBFBD>.
pDlg->m_TreeCtrl.InsertItem( "Initialize Failed", 0, 1, hGrid );
bValid = false;
goto _INVALID_CHECK;
}
if( pWorld->ForceInitialize( CEtWorldSector::LSE_Control | CEtWorldSector::LSE_Navigation ) == false ) {
// <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3> <20><><EFBFBD>ش<EFBFBD>.
pDlg->m_TreeCtrl.InsertItem( "ForceInitialize Failed", 0, 1, hGrid );
bValid = false;
goto _INVALID_CHECK;
}
if( pDlg->m_bCheckEventAreaInsideNavi ) {
std::vector<std::string> szVecResult;
if( !pDlg->IsValidEventAreaInsideNaviMesh( pWorld, szVecResult ) ) {
for( DWORD j=0; j<szVecResult.size(); j++ ) {
pDlg->m_TreeCtrl.InsertItem( szVecResult[j].c_str(), 0, 1, hGrid );
}
bValid = false;
}
}
_INVALID_CHECK:
if( bValid ) {
pDlg->m_TreeCtrl.DeleteItem( hGrid );
}
else {
pDlg->m_TreeCtrl.Expand( hGrid, TVE_EXPAND );
}
pWorld->Destroy();
}
// UnitArea <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Monster, SetMonster, MonsterCompound, Npc <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD> üũ
SAFE_DELETE( pWorld );
// Finalize
CEtResourceMng::DestroyInstance();
pDlg->EnableControl( true );
pDlg->m_bWorking = false;
return 0;
}
bool CEventAreaInsideNaviCheckerDlg::IsValidEventAreaInsideNaviMesh( CEtWorld *pWorld, std::vector<std::string> &szVecResult )
{
bool bValid = true;
for( DWORD i=0; i<pWorld->GetGrid()->GetActiveSectorCount(); i++ ) {
CEtWorldSector *pSector = pWorld->GetGrid()->GetActiveSector(i);
if( pSector->GetNavMesh() == NULL ) {
char szStr[256];
sprintf_s( szStr, "Can't Find Navigation Mesh - (%d - %d)", pSector->GetIndex().nX, pSector->GetIndex().nY );
if( std::find( szVecResult.begin(), szVecResult.end(), szStr ) == szVecResult.end() )
szVecResult.push_back( szStr );
bValid = false;
continue;
}
// UnitArea
int nControlID[2] = { 0, 5 };
for( int c=0; c<2; c++ ) {
CEtWorldEventControl *pControl = pSector->GetControlFromUniqueID(nControlID[c]);
if( pControl == NULL ) continue;
for( DWORD j=0; j<pControl->GetAreaCount(); j++ ) {
CEtWorldEventArea *pArea = pControl->GetAreaFromIndex(j);
char szAreaName[256];
sscanf_s( pArea->GetName(), "%s", szAreaName, 256 );
strlwr( szAreaName );
if( ( g_bAreaNameFilter[0] && stricmp( szAreaName, "monster" ) == NULL ) ||
( g_bAreaNameFilter[1] && stricmp( szAreaName, "monstergroup" ) == NULL ) ||
( g_bAreaNameFilter[2] && stricmp( szAreaName, "npc" ) == NULL ) ||
( g_bAreaNameFilter[3] && stricmp( szAreaName, "monster" ) && stricmp( szAreaName, "monstergroup" ) && stricmp( szAreaName, "npc" ) ) )
// if( stricmp( szAreaName, "monster" ) == NULL || stricmp( szAreaName, "monstergroup" ) == NULL )
{
pArea->CalcOBB();
SOBB Obb = *pArea->GetOBB();
EtVector3 vPos[4];
vPos[0] = Obb.Center + ( Obb.Axis[0] * Obb.Extent[0] ) + ( Obb.Axis[2] * Obb.Extent[2] );
vPos[1] = Obb.Center + ( Obb.Axis[0] * Obb.Extent[0] ) - ( Obb.Axis[2] * Obb.Extent[2] );
vPos[2] = Obb.Center - ( Obb.Axis[0] * Obb.Extent[0] ) + ( Obb.Axis[2] * Obb.Extent[2] );
vPos[3] = Obb.Center - ( Obb.Axis[0] * Obb.Extent[0] ) - ( Obb.Axis[2] * Obb.Extent[2] );
bool bInside = true;
for( int k=0; k<4; k++ ) {
// vPos[k].y = pWorld->GetHeight( vPos[k].x, vPos[k].z );
if( pSector->GetNavMesh()->FindCell( vPos[k] ) == NULL ) {
bInside = false;
break;
}
}
if( bInside == false ) {
/*
if( strcmp( pWorld->GetGrid()->GetName(), "3-2a" ) == NULL ) {
int asdf = 0;
pArea->CalcOBB();
SOBB Obb = *pArea->GetOBB();
EtVector3 vPos[4];
vPos[0] = Obb.Center + ( Obb.Axis[0] * Obb.Extent[0] ) + ( Obb.Axis[2] * Obb.Extent[2] );
vPos[1] = Obb.Center + ( Obb.Axis[0] * Obb.Extent[0] ) - ( Obb.Axis[2] * Obb.Extent[2] );
vPos[2] = Obb.Center - ( Obb.Axis[0] * Obb.Extent[0] ) + ( Obb.Axis[2] * Obb.Extent[2] );
vPos[3] = Obb.Center - ( Obb.Axis[0] * Obb.Extent[0] ) - ( Obb.Axis[2] * Obb.Extent[2] );
bool bInside = true;
for( int k=0; k<4; k++ ) {
if( pSector->GetNavMesh()->FindCell( vPos[k] ) == NULL ) {
bInside = false;
break;
}
}
}
*/
char szStr[256];
sprintf_s( szStr, "<EFBFBD>׺<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> - %s", pArea->GetName() );
szVecResult.push_back( szStr );
bValid = false;
}
}
}
}
}
return bValid;
}
bool CEventAreaInsideNaviCheckerDlg::IsValidUnitAreaTableID( CEtWorld *pWorld, std::vector<std::string> &szVecResult )
{
/*
bool bValid = true;
for( DWORD i=0; i<pWorld->GetGrid()->GetActiveSectorCount(); i++ ) {
CEtWorldSector *pSector = pWorld->GetGrid()->GetActiveSector(i);
if( pSector->GetNavMesh() == NULL ) {
char szStr[256];
sprintf_s( szStr, "Can't Find Navigation Mesh - (%d - %d)", pSector->GetIndex().nX, pSector->GetIndex().nY );
if( std::find( szVecResult.begin(), szVecResult.end(), szStr ) == szVecResult.end() )
szVecResult.push_back( szStr );
bValid = false;
continue;
}
// UnitArea
int nControlID[2] = { 0, 5 };
for( int c=0; c<2; c++ ) {
CEtWorldEventControl *pControl = pSector->GetControlFromUniqueID(nControlID[c]);
if( pControl == NULL ) continue;
for( DWORD j=0; j<pControl->GetAreaCount(); j++ ) {
CEtWorldEventArea *pArea = pControl->GetAreaFromIndex(j);
char szAreaName[256];
sscanf_s( pArea->GetName(), "%s", szAreaName, 256 );
strlwr( szAreaName );
if( stricmp( szAreaName, "monster" ) == NULL || stricmp( szAreaName, "monstergroup" ) == NULL ) {
pArea->CalcOBB();
SOBB Obb = *pArea->GetOBB();
EtVector3 vPos[4];
vPos[0] = Obb.Center + ( Obb.Axis[0] * Obb.Extent[0] ) + ( Obb.Axis[2] * Obb.Extent[2] );
vPos[1] = Obb.Center + ( Obb.Axis[0] * Obb.Extent[0] ) - ( Obb.Axis[2] * Obb.Extent[2] );
vPos[2] = Obb.Center - ( Obb.Axis[0] * Obb.Extent[0] ) + ( Obb.Axis[2] * Obb.Extent[2] );
vPos[3] = Obb.Center - ( Obb.Axis[0] * Obb.Extent[0] ) - ( Obb.Axis[2] * Obb.Extent[2] );
bool bInside = true;
for( int k=0; k<4; k++ ) {
if( pSector->GetNavMesh()->FindCell( vPos[k] ) == NULL ) {
bInside = false;
break;
}
}
if( bInside == false ) {
char szStr[256];
sprintf_s( szStr, "<22>׺<EFBFBD><D7BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> - %s", pArea->GetName() );
szVecResult.push_back( szStr );
bValid = false;
}
}
}
}
}
return bValid;
*/
return true;
}