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

229 lines
No EOL
7.2 KiB
C++

#include "Stdafx.h"
#include "EtActionBase.h"
#include "EtActionCoreMng.h"
#include "EtActionSignal.h"
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
CEtActionBase::CEtActionBase()
{
m_pVecActionElementList = NULL;
m_pMapSearch = NULL;
#ifdef PRE_FIX_CLIENT_MEMOPTIMIZE
m_pCheckInitSignalFunc = CEtActionBase::pCheckInitSignal;
#endif
m_pCheckPreSignalFunc = CEtActionBase::pCheckPreSignal;
m_pCheckPostSignalFunc = CEtActionBase::pCheckPostSignal;
}
CEtActionBase::~CEtActionBase()
{
FreeAction();
}
bool CEtActionBase::LoadAction( const char *szFullPathName )
{
if( m_pVecActionElementList ) return true;
m_pVecActionElementList = CEtActionCoreMng::GetInstance().LoadAction( szFullPathName, this );
if( !m_pVecActionElementList ) return false;
m_szFileName = szFullPathName;
return true;
}
void CEtActionBase::FreeAction()
{
if( m_pVecActionElementList )
CEtActionCoreMng::GetInstance().RemoveAction( m_szFileName.c_str(), this );
m_pVecActionElementList = NULL;
m_pMapSearch = NULL;
}
DWORD CEtActionBase::GetElementCount()
{
if( !m_pVecActionElementList ) return 0;
return (DWORD)m_pVecActionElementList->size();
}
CEtActionBase::ActionElementStruct *CEtActionBase::GetElement( DWORD dwIndex )
{
if( !m_pVecActionElementList ) return NULL;
if( dwIndex < 0 || dwIndex >= m_pVecActionElementList->size() ) return NULL;
return (*m_pVecActionElementList)[dwIndex];
}
CEtActionBase::ActionElementStruct *CEtActionBase::GetElement( const char *szName )
{
if( !m_pVecActionElementList ) return NULL;
std::map<std::string, int>::iterator it = m_pMapSearch->find( szName );
if( it == m_pMapSearch->end() ) return NULL;
return (*m_pVecActionElementList)[it->second];
return NULL;
}
int CEtActionBase::GetElementIndex( const char *szName )
{
if( !m_pVecActionElementList ) return -1;
std::map<std::string, int>::iterator it = m_pMapSearch->find( szName );
if( it == m_pMapSearch->end() ) return -1;
return it->second;
}
bool CEtActionBase::IsExistAction( const char *szAction )
{
if( GetElementIndex( szAction ) == -1 ) return false;
return true;
}
DWORD CEtActionBase::GetSignalCount( DWORD dwElementIndex, int nSignalIndex )
{
if( !m_pVecActionElementList ) return 0;
if( dwElementIndex < 0 || dwElementIndex >= m_pVecActionElementList->size() ) return 0;
std::map<int, std::vector<CEtActionSignal *>>::iterator it = (*m_pVecActionElementList)[dwElementIndex]->MapSearch.find( nSignalIndex );
if( it == (*m_pVecActionElementList)[dwElementIndex]->MapSearch.end() ) return 0;
return (DWORD)it->second.size();
}
CEtActionSignal *CEtActionBase::GetSignal( DWORD dwElementIndex, int nSignalIndex, DWORD dwIndex )
{
if( !m_pVecActionElementList ) return NULL;
if( dwElementIndex < 0 || dwElementIndex >= m_pVecActionElementList->size() ) return NULL;
std::map<int, std::vector<CEtActionSignal *>>::iterator it = (*m_pVecActionElementList)[dwElementIndex]->MapSearch.find( nSignalIndex );
if( it == (*m_pVecActionElementList)[dwElementIndex]->MapSearch.end() ) return NULL;
if( dwIndex < 0 || dwIndex >= it->second.size() ) return NULL;
return it->second[dwIndex];
}
CEtActionSignal *CEtActionBase::GetSignal( DWORD dwElementIndex, int nSignalArrayIndex )
{
if( !m_pVecActionElementList ) return NULL;
if( dwElementIndex < 0 || dwElementIndex >= m_pVecActionElementList->size() ) return NULL;
std::map<int, CEtActionSignal *>::iterator it = (*m_pVecActionElementList)[dwElementIndex]->MapSearchByArrayIndex.find( nSignalArrayIndex );
if( it == (*m_pVecActionElementList)[dwElementIndex]->MapSearchByArrayIndex.end() ) return NULL;
return it->second;
}
#ifdef PRE_FIX_CLIENT_MEMOPTIMIZE
void CEtActionBase::CheckInitSignal( ActionElementStruct *pElement, int nElementIndex, CEtActionSignal *pSignal, int nSignalIndex, CEtActionBase *pActionBase )
{
if( m_pCheckInitSignalFunc ) m_pCheckInitSignalFunc( pElement, nElementIndex, pSignal, nSignalIndex, pActionBase );
}
#endif
void CEtActionBase::CheckPreSignal( ActionElementStruct *pElement, int nElementIndex, CEtActionSignal *pSignal, int nSignalIndex, CEtActionBase *pActionBase )
{
if( m_pCheckPreSignalFunc ) m_pCheckPreSignalFunc( pElement, nElementIndex, pSignal, nSignalIndex, pActionBase );
}
void CEtActionBase::CheckPostSignal( ActionElementStruct *pElement, int nElementIndex, CEtActionSignal *pSignal, int nSignalIndex, CEtActionBase *pActionBase )
{
if( m_pCheckPostSignalFunc ) m_pCheckPostSignalFunc( pElement, nElementIndex, pSignal, nSignalIndex, pActionBase );
}
#ifdef PRE_FIX_CLIENT_MEMOPTIMIZE
void CEtActionBase::SetUsingElement( std::vector<std::string> &szVecList )
{
m_szVecUsingElementList = szVecList;
}
void CEtActionBase::AddUsingElement( const char *szName )
{
if( !m_pVecActionElementList ) {
m_szVecUsingElementList.push_back( szName );
return;
}
CEtActionCoreMng::ActionContainerStruct *pContainer = CEtActionCoreMng::GetInstance().GetContainer( m_szFileName.c_str() );
if( !pContainer ) return;
pContainer->szVecUsingElementList.push_back( szName );
}
void CEtActionBase::ClearUsingElement()
{
if( !m_pVecActionElementList ) {
m_szVecUsingElementList.clear();
return;
}
CEtActionCoreMng::ActionContainerStruct *pContainer = CEtActionCoreMng::GetInstance().GetContainer( m_szFileName.c_str() );
if( !pContainer ) return;
pContainer->szVecUsingElementList.clear();
}
void CEtActionBase::RefreshUsingElement()
{
if( !m_pVecActionElementList ) return;
CEtActionCoreMng::ActionContainerStruct *pContainer = CEtActionCoreMng::GetInstance().GetContainer( m_szFileName.c_str() );
if( !pContainer ) return;
if( !m_szVecUsingElementList.empty() ) {
pContainer->szVecUsingElementList = m_szVecUsingElementList;
m_szVecUsingElementList.clear();
}
if( pContainer->szVecUsingElementList.empty() ) return;
for( DWORD i=0; i<m_pVecActionElementList->size(); i++ ) {
ActionElementStruct *pElement = (*m_pVecActionElementList)[i];
if( std::find( pContainer->szVecUsingElementList.begin(), pContainer->szVecUsingElementList.end(), pElement->szParentFileName ) == pContainer->szVecUsingElementList.end() ) {
if( pElement->bUsing ) {
for( DWORD j=0; j<pElement->pVecSignalList.size(); j++ ) {
CheckPostSignal( pElement, j, pElement->pVecSignalList[j], j, this );
}
pElement->bUsing = false;
}
}
else {
if( !pElement->bUsing ) {
for( DWORD j=0; j<pElement->pVecSignalList.size(); j++ ) {
CheckPreSignal( pElement, j, pElement->pVecSignalList[j], j, this );
}
pElement->bUsing = true;
}
}
}
}
void CEtActionBase::RefreshUsingElement( const char *szElementName, bool bUse )
{
if( !m_pVecActionElementList ) return;
CEtActionCoreMng::ActionContainerStruct *pContainer = CEtActionCoreMng::GetInstance().GetContainer( m_szFileName.c_str() );
if( !pContainer ) return;
if( pContainer->szVecUsingElementList.empty() ) return;
ActionElementStruct *pElement = GetElement( szElementName );
if( !pElement ) return;
if( bUse ) {
if( !pElement->bUsing ) {
for( DWORD j=0; j<pElement->pVecSignalList.size(); j++ ) {
CheckPreSignal( pElement, j, pElement->pVecSignalList[j], j, this );
}
pElement->bUsing = true;
}
}
else {
if( pElement->bUsing ) {
for( DWORD j=0; j<pElement->pVecSignalList.size(); j++ ) {
CheckPostSignal( pElement, j, pElement->pVecSignalList[j], j, this );
}
pElement->bUsing = false;
}
}
}
#endif