2024-12-21 10:04:04 +08:00
# include "StdAfx.h"
# include "EtTriggerElement.h"
# include "EtTriggerObject.h"
# include "EtTrigger.h"
# include "StringUtil.h"
# ifdef _DEBUG
# define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
# endif
char * CEtTriggerElement : : s_szFuncString [ TriggerElementTypeEnum_Amount ] = {
" Condition " ,
" Action " ,
" " ,
} ;
CEtTriggerElement : : CEtTriggerElement ( CEtTriggerObject * pObject , lua_State * pState )
{
m_Type = ( TriggerElementTypeEnum ) - 1 ;
m_ScriptType = ScriptFile ;
m_pTriggerObj = pObject ;
m_pLuaState = pState ;
m_bSelfOpenLua = ( pState ) ? false : true ;
m_bEnable = true ;
m_LastExecuteTime = - 1 ;
m_OperatorType = And ;
m_nOperatorIndex = 0 ;
memset ( m_nOperatorValue , 0 , sizeof ( m_nOperatorValue ) ) ;
}
CEtTriggerElement : : ~ CEtTriggerElement ( )
{
ReleaseParamList ( ) ;
if ( m_pLuaState ) {
if ( m_bSelfOpenLua ) lua_close ( m_pLuaState ) ;
m_pLuaState = NULL ;
}
m_szScriptName . clear ( ) ;
m_szCustomScript . clear ( ) ;
}
void CEtTriggerElement : : ReleaseParamList ( )
{
for ( DWORD i = 0 ; i < m_VecParamList . size ( ) ; i + + ) {
switch ( m_VecParamList [ i ] . Type ) {
case CEtTrigger : : String :
SAFE_DELETEA ( m_VecParamList [ i ] . szValue ) ;
break ;
case CEtTrigger : : Position :
SAFE_DELETE ( m_VecParamList [ i ] . vValue ) ;
break ;
}
}
SAFE_DELETE_VEC ( m_VecParamList ) ;
}
bool CEtTriggerElement : : Load ( CStream * pStream )
{
pStream - > Read ( & m_Type , sizeof ( int ) ) ;
pStream - > Read ( & m_ScriptType , sizeof ( int ) ) ;
pStream - > Read ( & m_OperatorType , sizeof ( int ) ) ;
pStream - > Read ( & m_nOperatorIndex , sizeof ( int ) ) ;
pStream - > Read ( m_nOperatorValue , sizeof ( m_nOperatorValue ) ) ;
switch ( m_ScriptType ) {
case ScriptFile :
{
ReadStdString ( m_szScriptName , pStream ) ;
int nCount ;
pStream - > Read ( & nCount , sizeof ( int ) ) ;
int nSize ;
char szBuffer [ 256 ] = { 0 , } ;
for ( int i = 0 ; i < nCount ; i + + ) {
ParamStruct Struct ;
memset ( szBuffer , 0 , sizeof ( szBuffer ) ) ;
pStream - > Read ( & Struct . Type , sizeof ( int ) ) ;
pStream - > Read ( & nSize , sizeof ( int ) ) ;
pStream - > Read ( szBuffer , nSize ) ;
switch ( Struct . Type ) {
case CEtTrigger : : Integer :
case CEtTrigger : : Prop :
case CEtTrigger : : Operator :
case CEtTrigger : : EventArea :
case CEtTrigger : : Value :
Struct . nValue = * ( int * ) szBuffer ;
break ;
case CEtTrigger : : Float :
Struct . fValue = * ( float * ) szBuffer ;
break ;
case CEtTrigger : : String :
Struct . szValue = new char [ nSize ] ;
strcpy_s ( Struct . szValue , nSize , szBuffer ) ;
break ;
case CEtTrigger : : Position :
Struct . vValue = new EtVector3 ;
memcpy ( Struct . vValue , szBuffer , nSize ) ;
_ASSERT ( nSize = = sizeof ( EtVector3 ) ) ;
break ;
}
m_VecParamList . push_back ( Struct ) ;
}
}
break ;
case CustomScript :
ReadStdString ( m_szCustomScript , pStream ) ;
break ;
}
# ifdef PRE_FIX_62845
return Initialize ( ) ;
# else
Initialize ( ) ;
return true ;
# endif
}
void CEtTriggerElement : : RegisterLuaApi ( )
{
lua_tinker : : class_add < EtVector3 > ( m_pLuaState , " EtVector3 " ) ;
lua_tinker : : class_mem < EtVector3 > ( m_pLuaState , " x " , & EtVector3 : : x ) ;
lua_tinker : : class_mem < EtVector3 > ( m_pLuaState , " y " , & EtVector3 : : y ) ;
lua_tinker : : class_mem < EtVector3 > ( m_pLuaState , " z " , & EtVector3 : : z ) ;
m_pTriggerObj - > GetTrigger ( ) - > RegisterDefineValue ( m_pLuaState ) ;
}
bool CEtTriggerElement : : Initialize ( )
{
char * pLuaBuffer = NULL ;
int nSize = 0 ;
m_szFuncName = s_szFuncString [ m_Type ] ;
switch ( m_ScriptType ) {
case ScriptFile :
{
CResMngStream Stream ( m_szScriptName . c_str ( ) ) ;
if ( Stream . IsValid ( ) = = false ) return false ;
nSize = Stream . Size ( ) ;
pLuaBuffer = new char [ nSize + 1 ] ;
Stream . Read ( pLuaBuffer , nSize ) ;
pLuaBuffer [ nSize ] = 0 ;
if ( ! m_bSelfOpenLua ) {
char szExt [ 32 ] = { 0 , } ;
char szFileName [ 128 ] = { 0 , } ;
_GetExt ( szExt , _countof ( szExt ) , m_szScriptName . c_str ( ) ) ;
if ( _stricmp ( szExt , " lua " ) = = NULL ) {
_GetFileName ( szFileName , _countof ( szFileName ) , m_szScriptName . c_str ( ) ) ;
szFileName [ strlen ( szFileName ) ] = ' _ ' ;
std : : string szTemp = pLuaBuffer ;
char szFuncName [ 2 ] [ 64 ] = { 0 , } ;
sprintf_s ( szFuncName [ 0 ] , " function %s " , s_szFuncString [ m_Type ] ) ;
sprintf_s ( szFuncName [ 1 ] , " function %s%s " , szFileName , s_szFuncString [ m_Type ] ) ;
int nValue = 0 ;
while ( 1 ) {
std : : string : : size_type nOffset = szTemp . find ( szFuncName [ 0 ] , nValue ) ;
if ( nOffset < szTemp . size ( ) ) {
szTemp . replace ( nOffset , strlen ( szFuncName [ 0 ] ) , szFuncName [ 1 ] ) ;
nValue = ( int ) nOffset + ( int ) strlen ( szFuncName [ 1 ] ) ;
}
else break ;
}
SAFE_DELETEA ( pLuaBuffer ) ;
pLuaBuffer = new char [ szTemp . size ( ) + 1 ] ;
memcpy ( pLuaBuffer , szTemp . c_str ( ) , szTemp . size ( ) ) ;
pLuaBuffer [ szTemp . size ( ) ] = 0 ;
nSize = ( int ) szTemp . size ( ) ;
m_szFuncName = szFileName ;
m_szFuncName + = s_szFuncString [ m_Type ] ;
}
}
}
break ;
case CustomScript :
{
nSize = ( int ) m_szCustomScript . size ( ) * sizeof ( TCHAR ) ;
pLuaBuffer = ( char * ) m_szCustomScript . c_str ( ) ;
}
break ;
}
if ( m_bSelfOpenLua ) {
m_pLuaState = lua_open ( ) ;
luaL_openlibs ( m_pLuaState ) ;
}
int nResult = lua_tinker : : dobuffer ( m_pLuaState , pLuaBuffer , nSize ) ;
if ( m_ScriptType = = ScriptFile ) {
SAFE_DELETEA ( pLuaBuffer ) ;
}
if ( nResult ! = 0 ) {
if ( m_bSelfOpenLua ) lua_close ( m_pLuaState ) ;
m_pLuaState = NULL ;
return false ;
}
if ( m_pLuaState ) RegisterLuaApi ( ) ;
return true ;
}
bool CEtTriggerElement : : CallLuaFunction ( )
{
if ( m_pLuaState = = NULL ) return false ;
lua_pushcclosure ( m_pLuaState , lua_tinker : : on_error , 0 ) ;
int errfunc = lua_gettop ( m_pLuaState ) ;
lua_pushstring ( m_pLuaState , m_szFuncName . c_str ( ) ) ;
lua_gettable ( m_pLuaState , LUA_GLOBALSINDEX ) ;
if ( lua_isfunction ( m_pLuaState , - 1 ) )
{
for ( DWORD i = 0 ; i < m_VecParamList . size ( ) ; i + + ) {
switch ( m_VecParamList [ i ] . Type ) {
case CEtTrigger : : Integer :
case CEtTrigger : : Operator :
case CEtTrigger : : Prop :
case CEtTrigger : : EventArea :
case CEtTrigger : : Value :
lua_tinker : : push ( m_pLuaState , m_VecParamList [ i ] . nValue ) ;
break ;
case CEtTrigger : : Float :
lua_tinker : : push ( m_pLuaState , m_VecParamList [ i ] . fValue ) ;
break ;
case CEtTrigger : : String :
lua_tinker : : push ( m_pLuaState , m_VecParamList [ i ] . szValue ) ;
break ;
case CEtTrigger : : Position :
lua_tinker : : push ( m_pLuaState , * m_VecParamList [ i ] . vValue ) ;
break ;
}
}
int nRet = lua_pcall ( m_pLuaState , ( int ) m_VecParamList . size ( ) , 1 , errfunc ) ;
if ( nRet ! = 0 ) {
if ( nRet = = LUA_ERRRUN ) {
OutputDebug ( " <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> ߸<EFBFBD> <DFB8> ȵ<EFBFBD> <C8B5> ؿ<EFBFBD> !! - %s %s\n " , m_szScriptName . c_str ( ) , m_szFuncName . c_str ( ) ) ;
return true ;
}
}
}
else
{
lua_tinker : : print_error ( m_pLuaState , " lua_tinker::call() attempt to call global `%s' `%s' (not a function) " , m_szFuncName . c_str ( ) , s_szFuncString [ m_Type ] ) ;
}
// lua_remove(m_pLuaState, -1);
lua_remove ( m_pLuaState , - 2 ) ;
return lua_tinker : : pop < bool > ( m_pLuaState ) ;
}
CEtTriggerElement : : ParamStruct * CEtTriggerElement : : GetParameterStruct ( DWORD dwIndex )
{
if ( dwIndex > = m_VecParamList . size ( ) ) return NULL ;
return & m_VecParamList [ dwIndex ] ;
}