Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
377 lines
10 KiB
C++
377 lines
10 KiB
C++
// PageHouseContainer.cpp : implementation file
|
||
//
|
||
|
||
#include "stdafx.h"
|
||
#include "WorldCreator.h"
|
||
#include "PageHouseContainer.h"
|
||
#include "DlgEditName.h"
|
||
#include "MainFrm.h"
|
||
#include "WorldCreatorView.h"
|
||
#include "HeightFieldScene.h"
|
||
|
||
#ifdef _DEBUG
|
||
#define new DEBUG_NEW
|
||
#undef THIS_FILE
|
||
static char THIS_FILE[] = __FILE__;
|
||
#endif
|
||
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
// CPageHouseContainer property page
|
||
|
||
IMPLEMENT_DYNCREATE(CPageHouseContainer, CPropertyPage)
|
||
|
||
CPageHouseContainer::CPageHouseContainer() : CPropertyPage(CPageHouseContainer::IDD)
|
||
{
|
||
//{{AFX_DATA_INIT(CPageHouseContainer)
|
||
m_bAddHouse = FALSE;
|
||
//}}AFX_DATA_INIT
|
||
}
|
||
|
||
CPageHouseContainer::~CPageHouseContainer()
|
||
{
|
||
for(int i=0;i<m_HouseTreeNode.num;i++)
|
||
{
|
||
delete m_HouseTreeNode[i];
|
||
}
|
||
|
||
}
|
||
|
||
void CPageHouseContainer::DoDataExchange(CDataExchange* pDX)
|
||
{
|
||
CPropertyPage::DoDataExchange(pDX);
|
||
//{{AFX_DATA_MAP(CPageHouseContainer)
|
||
DDX_Control(pDX, IDC_TREE_HOUSEOBJECT, m_HouseObjectTree);
|
||
DDX_Check(pDX, IDC_CHECKADD, m_bAddHouse);
|
||
//}}AFX_DATA_MAP
|
||
}
|
||
|
||
|
||
BEGIN_MESSAGE_MAP(CPageHouseContainer, CPropertyPage)
|
||
//{{AFX_MSG_MAP(CPageHouseContainer)
|
||
ON_NOTIFY(NM_RCLICK, IDC_TREE_HOUSEOBJECT, OnRclickTreeHouseobject)
|
||
ON_COMMAND(MENU_HOUSE_RENAME, OnHouseRename)
|
||
ON_COMMAND(MENU_HOUSE_LOAD, OnHouseLoad)
|
||
ON_COMMAND(MENU_HOUSE_ADDCATE, OnHouseAddcate)
|
||
ON_NOTIFY(TVN_BEGINDRAG, IDC_TREE_HOUSEOBJECT, OnBegindragTreeHouseobject)
|
||
ON_COMMAND(MENU_HOUSEDELETE, OnHousedelete)
|
||
ON_NOTIFY(NM_CLICK, IDC_TREE_HOUSEOBJECT, OnClickTreeHouseobject)
|
||
ON_BN_CLICKED(IDC_CHECKADD, OnCheckadd)
|
||
ON_NOTIFY(TVN_SELCHANGED, IDC_TREE_HOUSEOBJECT, OnSelchangedTreeHouseobject)
|
||
//}}AFX_MSG_MAP
|
||
END_MESSAGE_MAP()
|
||
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
// CPageHouseContainer message handlers
|
||
|
||
void CPageHouseContainer::OnRclickTreeHouseobject(NMHDR* pNMHDR, LRESULT* pResult)
|
||
{
|
||
// TODO: Add your control notification handler code here
|
||
CPoint point;
|
||
GetCursorPos(&point);
|
||
HTREEITEM treeitem=m_HouseObjectTree.GetSelectedItem();
|
||
if(treeitem==NULL)
|
||
return;
|
||
CMenu menu;
|
||
menu.LoadMenu(IDR_MENU_HOUSEOBJECT);
|
||
menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);
|
||
*pResult = 0;
|
||
}
|
||
|
||
void CPageHouseContainer::OnHouseRename()
|
||
{
|
||
HTREEITEM SelectedItem=m_HouseObjectTree.GetSelectedItem();
|
||
CString SelectName=m_HouseObjectTree.GetItemText(SelectedItem);
|
||
|
||
CDlgEditName dlgEditName;
|
||
dlgEditName.m_EditName=SelectName;
|
||
dlgEditName.DoModal();
|
||
if(dlgEditName.m_EditName=="")
|
||
return;
|
||
if(isAlreadyExist(dlgEditName.m_EditName))
|
||
return;
|
||
for(int i=0;i<m_HouseTreeNode.num;i++)
|
||
{
|
||
if(m_HouseTreeNode[i]->m_strHouseName==SelectName)
|
||
{
|
||
m_HouseTreeNode[i]->m_strHouseName=dlgEditName.m_EditName;
|
||
}
|
||
if(m_HouseTreeNode[i]->m_strParentHouseName==SelectName)
|
||
{
|
||
m_HouseTreeNode[i]->m_strParentHouseName=dlgEditName.m_EditName;
|
||
}
|
||
}
|
||
UpdateHouseTree();
|
||
}
|
||
|
||
BOOL CPageHouseContainer::OnInitDialog()
|
||
{
|
||
CPropertyPage::OnInitDialog();
|
||
HouseTreeNode *RootNode=new HouseTreeNode;
|
||
RootNode->m_strHouseName="<EFBFBD>ǹ<EFBFBD>";
|
||
m_HouseTreeNode.Add(RootNode);
|
||
UpdateHouseTree();
|
||
// TODO: Add extra initialization here
|
||
return TRUE; // return TRUE unless you set the focus to a control
|
||
// EXCEPTION: OCX Property Pages should return FALSE
|
||
}
|
||
|
||
void CPageHouseContainer::OnHouseLoad()
|
||
{
|
||
// TODO: Add your command handler code here
|
||
CDlgHouseLoad dlgHouseLoad;
|
||
if(dlgHouseLoad.DoModal()!=IDOK)
|
||
return;
|
||
if(dlgHouseLoad.m_strOutname=="" && dlgHouseLoad.m_strBSPName=="")
|
||
return;
|
||
HouseTreeNode *Node=new HouseTreeNode;
|
||
Node->m_strOutName=dlgHouseLoad.m_strOutname;
|
||
Node->m_strMedName=dlgHouseLoad.m_strMedname;
|
||
Node->m_strInName=dlgHouseLoad.m_strInname;
|
||
Node->m_strBspName=dlgHouseLoad.m_strBSPName;
|
||
if(dlgHouseLoad.m_HouseName=="")
|
||
{
|
||
Node->m_strHouseName=dlgHouseLoad.m_strOutname;
|
||
if(dlgHouseLoad.m_strOutname=="")
|
||
{
|
||
Node->m_strHouseName=dlgHouseLoad.m_strBSPName;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
Node->m_strHouseName=dlgHouseLoad.m_HouseName;
|
||
}
|
||
if(isAlreadyExist(Node->m_strHouseName))
|
||
return;
|
||
HTREEITEM SelectedItem=m_HouseObjectTree.GetSelectedItem();
|
||
CString ParentName=m_HouseObjectTree.GetItemText(SelectedItem);
|
||
|
||
Node->m_strParentHouseName=ParentName;
|
||
m_HouseTreeNode.Add(Node);
|
||
UpdateHouseTree();
|
||
}
|
||
|
||
void CPageHouseContainer::OnHouseAddcate()
|
||
{
|
||
// TODO: Add your command handler code here
|
||
HTREEITEM SelectedItem=m_HouseObjectTree.GetSelectedItem();
|
||
CString ParentName=m_HouseObjectTree.GetItemText(SelectedItem);
|
||
HouseTreeNode *SubCate=new HouseTreeNode;
|
||
CDlgEditName dlgEditName;
|
||
dlgEditName.DoModal();
|
||
if(dlgEditName.m_EditName=="")
|
||
return;
|
||
if(isAlreadyExist(dlgEditName.m_EditName))
|
||
return;
|
||
m_AgoExpand=dlgEditName.m_EditName;
|
||
SubCate->m_strHouseName=dlgEditName.m_EditName;
|
||
SubCate->m_strParentHouseName=ParentName;
|
||
m_HouseTreeNode.Add(SubCate);
|
||
UpdateHouseTree();
|
||
}
|
||
|
||
void CPageHouseContainer::UpdateHouseTree()
|
||
{
|
||
m_HouseObjectTree.DeleteAllItems();
|
||
RecurAddTreeItem(NULL,"");
|
||
}
|
||
|
||
void CPageHouseContainer::RecurAddTreeItem(HTREEITEM TreeItem, CString strTreeName)
|
||
{
|
||
HTREEITEM ParentItem;
|
||
int cTreeItem;
|
||
for(cTreeItem=0;cTreeItem<m_HouseTreeNode.num;cTreeItem++)
|
||
{
|
||
if(m_HouseTreeNode[cTreeItem]->m_strParentHouseName==strTreeName)
|
||
{
|
||
if(TreeItem==NULL)
|
||
{
|
||
ParentItem=m_HouseObjectTree.InsertItem(m_HouseTreeNode[cTreeItem]->m_strHouseName);
|
||
RecurAddTreeItem(ParentItem,m_HouseTreeNode[cTreeItem]->m_strHouseName);
|
||
}
|
||
else
|
||
{
|
||
ParentItem=m_HouseObjectTree.InsertItem(m_HouseTreeNode[cTreeItem]->m_strHouseName,TreeItem);
|
||
RecurAddTreeItem(ParentItem,m_HouseTreeNode[cTreeItem]->m_strHouseName);
|
||
}
|
||
if(m_AgoExpand==m_HouseTreeNode[cTreeItem]->m_strHouseName)
|
||
{
|
||
m_HouseObjectTree.Expand(ParentItem,TVE_EXPAND);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
BOOL CPageHouseContainer::isAlreadyExist(CString strHouseName)
|
||
{
|
||
for(int i=0;i<m_HouseTreeNode.num;i++)
|
||
{
|
||
if(m_HouseTreeNode[i]->m_strHouseName==strHouseName)
|
||
return TRUE;
|
||
}
|
||
return FALSE;
|
||
}
|
||
|
||
void CPageHouseContainer::OnBegindragTreeHouseobject(NMHDR* pNMHDR, LRESULT* pResult)
|
||
{
|
||
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
|
||
// TODO: Add your control notification handler code here
|
||
|
||
CMainFrame *mf=(CMainFrame*)AfxGetApp()->m_pMainWnd;
|
||
CWorldCreatorView *av=(CWorldCreatorView *)mf->GetActiveView();
|
||
SelectHouseObject();
|
||
av->ChangeMouseInterface(1);
|
||
CSceneManager::m_PickHouseScene=NULL;
|
||
*pResult = 0;
|
||
}
|
||
|
||
void CPageHouseContainer::OnHousedelete()
|
||
{
|
||
// TODO: Add your command handler code here
|
||
HTREEITEM SelectedItem=m_HouseObjectTree.GetSelectedItem();
|
||
CString DelName=m_HouseObjectTree.GetItemText(SelectedItem);
|
||
|
||
for(int i=0;i<m_HouseTreeNode.num;i++)
|
||
{
|
||
if(m_HouseTreeNode[i]->m_strHouseName==DelName)
|
||
m_HouseTreeNode.DelIndex(i);
|
||
}
|
||
RecurDelTreeItem(DelName);
|
||
UpdateHouseTree();
|
||
}
|
||
|
||
void CPageHouseContainer::RecurDelTreeItem(CString strDelNode)
|
||
{
|
||
for(int i=0;i<m_HouseTreeNode.num;i++)
|
||
{
|
||
if(m_HouseTreeNode[i]->m_strParentHouseName==strDelNode)
|
||
{
|
||
RecurDelTreeItem(m_HouseTreeNode[i]->m_strHouseName);
|
||
m_HouseTreeNode.DelIndex(i);
|
||
}
|
||
}
|
||
}
|
||
|
||
void CPageHouseContainer::SelectHouseObject()
|
||
{
|
||
HTREEITEM SelectedItem=m_HouseObjectTree.GetSelectedItem();
|
||
|
||
m_strHouseName=m_HouseObjectTree.GetItemText(SelectedItem);
|
||
for(int i=0;i<m_HouseTreeNode.num;i++)
|
||
{
|
||
if(m_HouseTreeNode[i]->m_strHouseName==m_strHouseName)
|
||
{
|
||
m_strInName=m_HouseTreeNode[i]->m_strInName;
|
||
m_strMedName=m_HouseTreeNode[i]->m_strMedName;
|
||
m_strOutName=m_HouseTreeNode[i]->m_strOutName;
|
||
m_strBspName=m_HouseTreeNode[i]->m_strBspName;
|
||
}
|
||
}
|
||
}
|
||
|
||
void CPageHouseContainer::AddHouse(float fXp, float fYp, float fZp)
|
||
{
|
||
CMainFrame *mf=(CMainFrame*)AfxGetApp()->m_pMainWnd;
|
||
CWorldCreatorView *av=(CWorldCreatorView *)mf->GetActiveView();
|
||
av->m_SceneManager->m_MapStorage.AddHouseMap(fXp,fYp,fZp,m_strOutName.LockBuffer(),m_strMedName.LockBuffer(),m_strInName.LockBuffer(),m_strBspName.LockBuffer());
|
||
//CMapStorage::AddHouseMap(fXp,fYp,fZp,m_strOutName.LockBuffer(),m_strMedName.LockBuffer(),m_strInName.LockBuffer());
|
||
}
|
||
|
||
void CPageHouseContainer::OnClickTreeHouseobject(NMHDR* pNMHDR, LRESULT* pResult)
|
||
{
|
||
// TODO: Add your control notification handler code here
|
||
SelectHouseObject();
|
||
*pResult = 0;
|
||
}
|
||
|
||
void CPageHouseContainer::Save(FILE *fp)
|
||
{
|
||
char SaveName[MAX_NAMEBUFFER];
|
||
fwrite(&m_HouseTreeNode.num,sizeof(int),1,fp);
|
||
for(int cHouse=0;cHouse<m_HouseTreeNode.num;cHouse++)
|
||
{
|
||
strcpy(SaveName,m_HouseTreeNode[cHouse]->m_strHouseName.LockBuffer());
|
||
fwrite(SaveName,sizeof(char)*MAX_NAMEBUFFER,1,fp);
|
||
strcpy(SaveName,m_HouseTreeNode[cHouse]->m_strOutName.LockBuffer());
|
||
fwrite(SaveName,sizeof(char)*MAX_NAMEBUFFER,1,fp);
|
||
strcpy(SaveName,m_HouseTreeNode[cHouse]->m_strMedName.LockBuffer());
|
||
fwrite(SaveName,sizeof(char)*MAX_NAMEBUFFER,1,fp);
|
||
strcpy(SaveName,m_HouseTreeNode[cHouse]->m_strInName.LockBuffer());
|
||
fwrite(SaveName,sizeof(char)*MAX_NAMEBUFFER,1,fp);
|
||
strcpy(SaveName,m_HouseTreeNode[cHouse]->m_strParentHouseName.LockBuffer());
|
||
fwrite(SaveName,sizeof(char)*MAX_NAMEBUFFER,1,fp);
|
||
}
|
||
}
|
||
|
||
void CPageHouseContainer::Load(FILE *fp,int iType)
|
||
{
|
||
|
||
if(!iType)
|
||
DeleteTreeData();
|
||
char ReadName[MAX_NAMEBUFFER];
|
||
int cHouseTree;
|
||
fread(&cHouseTree,sizeof(int),1,fp);
|
||
for(int cHouse=0;cHouse<cHouseTree;cHouse++)
|
||
{
|
||
HouseTreeNode *AddNode=new HouseTreeNode;
|
||
fread(ReadName,sizeof(char)*MAX_NAMEBUFFER,1,fp);
|
||
AddNode->m_strHouseName=ReadName;
|
||
fread(ReadName,sizeof(char)*MAX_NAMEBUFFER,1,fp);
|
||
AddNode->m_strOutName=ReadName;
|
||
fread(ReadName,sizeof(char)*MAX_NAMEBUFFER,1,fp);
|
||
AddNode->m_strMedName=ReadName;
|
||
fread(ReadName,sizeof(char)*MAX_NAMEBUFFER,1,fp);
|
||
AddNode->m_strInName=ReadName;
|
||
fread(ReadName,sizeof(char)*MAX_NAMEBUFFER,1,fp);
|
||
AddNode->m_strParentHouseName=ReadName;
|
||
if(cHouse == 0 && iType != 0) // <20>ǹ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ŵ
|
||
{
|
||
delete AddNode;
|
||
continue;
|
||
}
|
||
else
|
||
{
|
||
m_HouseTreeNode.Add(AddNode);
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
void CPageHouseContainer::DeleteTreeData()
|
||
{
|
||
m_HouseObjectTree.DeleteAllItems();
|
||
for(int i=0;i<m_HouseTreeNode.num;i++)
|
||
{
|
||
delete m_HouseTreeNode[i];
|
||
}
|
||
m_HouseTreeNode.num=0;
|
||
}
|
||
|
||
void CPageHouseContainer::OnCheckadd()
|
||
{
|
||
// TODO: Add your control notification handler code here
|
||
m_bAddHouse = (m_bAddHouse == TRUE) ? FALSE : TRUE;
|
||
UpdateData(FALSE);
|
||
CMainFrame *mf=(CMainFrame*)AfxGetApp()->m_pMainWnd;
|
||
CWorldCreatorView *av=(CWorldCreatorView *)mf->GetActiveView();
|
||
|
||
if((m_bAddHouse == TRUE)) // RBSP <20>߰<EFBFBD>
|
||
{
|
||
|
||
SelectHouseObject();
|
||
av->ChangeMouseInterface(1);
|
||
|
||
}
|
||
else {
|
||
av->ChangeMouseInterface(-1);
|
||
|
||
}
|
||
}
|
||
|
||
void CPageHouseContainer::OnSelchangedTreeHouseobject(NMHDR* pNMHDR, LRESULT* pResult)
|
||
{
|
||
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
|
||
// TODO: Add your control notification handler code here
|
||
SelectHouseObject();
|
||
*pResult = 0;
|
||
}
|