📄 listener.cpp
字号:
name = commandList->ObjectAt( eventnum )->c_str();
data = NULL;
info.inuse = 0;
info.source = EV_FROM_CODE;
info.linenumber = 0;
threadnum = -1;
// If flags have changed, let the user know. It's probably a development bug.
int &flagobj = flagList->ObjectAt( eventnum );
// check for default flags
if ( flags == -1 )
{
flags = flagobj;
}
assert( flags == flagobj );
if ( flags != flagobj )
{
// Flags not equal. Use combined value.
flagobj |= flags;
}
info.flags = flagobj;
}
EXPORT_FROM_DLL Event::~Event()
{
if ( data )
{
delete data;
data = NULL;
}
}
EXPORT_FROM_DLL void Event::SetThread
(
ScriptThread *thread
)
{
if ( thread )
{
threadnum = thread->ThreadNum();
}
else
{
threadnum = -1;
}
}
EXPORT_FROM_DLL ScriptThread *Event::GetThread
(
void
)
{
if ( threadnum != -1 )
{
return Director.GetThread( threadnum );
}
return NULL;
}
EXPORT_FROM_DLL void Event::Error
(
const char *fmt,
...
)
{
va_list argptr;
char text[ 1024 ];
ScriptThread *thread;
const char *filename;
va_start( argptr, fmt );
vsprintf( text, fmt, argptr );
va_end( argptr );
switch( GetSource() )
{
default :
case EV_FROM_CODE :
gi.dprintf( "Game: '%s' : %s\n", getName().c_str(), text );
break;
case EV_FROM_SCRIPT :
thread = GetThread();
filename = "Dead script";
if ( thread )
{
filename = thread->Filename();
}
gi.dprintf( "%s(%d): '%s' :\n%s\n", filename, info.linenumber, getName().c_str(), text );
break;
case EV_FROM_CONSOLE :
gi.cprintf( GetConsoleEdict(), PRINT_HIGH, "Console: '%s' : %s\n", getName().c_str(), text );
break;
}
}
EXPORT_FROM_DLL void Event::AddEntity
(
Entity *ent
)
{
char text[ 128 ];
assert( ent );
if ( !ent )
{
sprintf( text, "*0" );
}
else
{
sprintf( text, "*%d", ent->entnum );
}
AddString( text );
}
EXPORT_FROM_DLL qboolean Event::IsVectorAt
(
int pos
)
{
const char *text;
ScriptVariable *var;
if ( !data || ( pos < 1 ) || ( data->NumObjects() < pos ) )
{
Error( "Index %d out of range.", pos );
return false;
}
text = data->ObjectAt( pos ).c_str();
assert( text );
var = Director.GetExistingVariable( text );
if ( var )
{
text = var->stringValue();
}
if ( text[ 0 ] == '(' )
{
// probably a vector, so say that it is
return true;
}
// not a vector
return false;
}
EXPORT_FROM_DLL qboolean Event::IsEntityAt
(
int pos
)
{
const char *name;
int t;
ScriptVariable *var;
if ( !data || ( pos < 1 ) || ( data->NumObjects() < pos ) )
{
Error( "Index %d out of range.", pos );
return false;
}
name = data->ObjectAt( pos ).c_str();
assert( name );
var = Director.GetExistingVariable( name );
if ( var )
{
name = var->stringValue();
}
if ( name[ 0 ] == '$' )
{
t = G_FindTarget( 0, &name[ 1 ] );
if ( !t )
{
Error( "Entity with targetname of '%s' not found", &name[ 1 ] );
return false;
}
}
else
{
if ( name[ 0 ] != '*' )
{
Error( "Expecting a '*'-prefixed entity number but found '%s'.", name );
return false;
}
if ( !IsNumeric( &name[ 1 ] ) )
{
Error( "Expecting a numeric value but found '%s'.", &name[ 1 ] );
return false;
}
else
{
t = atoi( &name[ 1 ] );
}
}
if ( ( t < 0 ) || ( t > game.maxentities ) )
{
Error( "%d out of valid range for entity.", t );
return false;
}
// only return true if the entity exists
return ( G_GetEntity( t ) != NULL );
}
EXPORT_FROM_DLL qboolean Event::IsNumericAt
(
int pos
)
{
const char *text;
ScriptVariable *var;
if ( !data || ( pos < 1 ) || ( data->NumObjects() < pos ) )
{
Error( "Index %d out of range.", pos );
return false;
}
text = data->ObjectAt( pos ).c_str();
assert( text );
var = Director.GetExistingVariable( text );
if ( var )
{
text = var->stringValue();
}
return IsNumeric( text );
}
EXPORT_FROM_DLL const char *Event::GetString
(
int pos
)
{
const char *text;
ScriptVariable *var;
if ( !data || ( pos < 1 ) || ( data->NumObjects() < pos ) )
{
Error( "Index %d out of range.", pos );
return "";
}
text = data->ObjectAt( pos ).c_str();
assert( text );
var = Director.GetExistingVariable( text );
if ( var )
{
return var->stringValue();
}
return text;
}
EXPORT_FROM_DLL int Event::GetInteger
(
int pos
)
{
const char *text;
ScriptVariable *var;
if ( !data || ( pos < 1 ) || ( data->NumObjects() < pos ) )
{
Error( "Index %d out of range.", pos );
return 0;
}
text = data->ObjectAt( pos ).c_str();
assert( text );
var = Director.GetExistingVariable( text );
if ( var )
{
if ( !IsNumeric( var->stringValue() ) )
{
Error( "Variable %s contains non-numeric value '%s'", text, var->stringValue() );
}
return var->intValue();
}
if ( !IsNumeric( text ) )
{
Error( "Expecting a numeric value but found '%s'.", text );
return 0;
}
return atoi( text );
}
EXPORT_FROM_DLL double Event::GetDouble
(
int pos
)
{
const char *text;
ScriptVariable *var;
if ( !data || ( pos < 1 ) || ( data->NumObjects() < pos ) )
{
Error( "Index %d out of range.", pos );
return 0;
}
text = data->ObjectAt( pos ).c_str();
assert( text );
var = Director.GetExistingVariable( text );
if ( var )
{
if ( !IsNumeric( var->stringValue() ) )
{
Error( "Variable %s contains non-numeric value '%s'", text, var->stringValue() );
}
return ( double )var->floatValue();
}
if ( !IsNumeric( text ) )
{
Error( "Expecting a numeric value but found '%s'.", text );
return 0;
}
return ( double )atof( text );
}
EXPORT_FROM_DLL float Event::GetFloat
(
int pos
)
{
const char *text;
ScriptVariable *var;
if ( !data || ( pos < 1 ) || ( data->NumObjects() < pos ) )
{
Error( "Index %d out of range.", pos );
return 0;
}
text = data->ObjectAt( pos ).c_str();
assert( text );
var = Director.GetExistingVariable( text );
if ( var )
{
if ( !IsNumeric( var->stringValue() ) )
{
Error( "Variable %s contains non-numeric value '%s'", text, var->stringValue() );
}
return var->floatValue();
}
if ( !IsNumeric( text ) )
{
Error( "Expecting a numeric value but found '%s'.", text );
return 0;
}
return atof( text );
}
EXPORT_FROM_DLL Vector Event::GetVector
(
int pos
)
{
const char *text;
ScriptVariable *var;
if ( !data || ( pos < 1 ) || ( data->NumObjects() < pos ) )
{
Error( "Index %d out of range.", pos );
return vec_zero;
}
text = data->ObjectAt( pos ).c_str();
assert( text );
var = Director.GetExistingVariable( text );
if ( var )
{
text = var->stringValue();
}
// Check if this is a ()-based vector
// we accept both, but using parenthesis we can determine if it is a vector or not
if ( text[ 0 ] == '(' )
{
return Vector( &text[ 1 ] );
}
// give an error, but try converting it anyways
if ( developer->value > 1 )
{
Error( "Vector '%s' does not include '(' ')'.", text );
}
return Vector( text );
}
EXPORT_FROM_DLL Entity *Event::GetEntity
(
int pos
)
{
const char *name;
int t;
ScriptVariable *var;
if ( !data || ( pos < 1 ) || ( data->NumObjects() < pos ) )
{
Error( "Index %d out of range.", pos );
return NULL;
}
name = data->ObjectAt( pos ).c_str();
assert( name );
var = Director.GetExistingVariable( name );
if ( var )
{
name = var->stringValue();
}
if ( name[ 0 ] == '$' )
{
t = G_FindTarget( 0, &name[ 1 ] );
if ( !t )
{
Error( "Entity with targetname of '%s' not found", &name[ 1 ] );
return NULL;
}
}
else
{
if ( name[ 0 ] != '*' )
{
Error( "Expecting a '*'-prefixed entity number but found '%s'.", name );
return NULL;
}
if ( !IsNumeric( &name[ 1 ] ) )
{
Error( "Expecting a numeric value but found '%s'.", &name[ 1 ] );
return NULL;
}
else
{
t = atoi( &name[ 1 ] );
}
}
if ( ( t < 0 ) || ( t > game.maxentities ) )
{
Error( "%d out of valid range for entity.", t );
return NULL;
}
return G_GetEntity( t );
}
EXPORT_FROM_DLL ScriptVariable *Event::GetVariable
(
int pos
)
{
if ( !data || ( pos < 1 ) || ( data->NumObjects() < pos ) )
{
Error( "Index %d out of range.", pos );
return NULL;
}
return Director.GetVariable( data->ObjectAt( pos ).c_str() );
}
EXPORT_FROM_DLL void Event::Archive
(
Archiver &arc
)
{
str name;
int num;
int i;
name = getName();
arc.WriteString( name );
arc.WriteRaw( &info, sizeof( info ) );
arc.WriteInteger( threadnum );
if ( !data )
{
arc.WriteInteger( 0 );
}
else
{
num = data->NumObjects();
arc.WriteInteger( num );
for( i = 1; i <= num; i++ )
{
arc.WriteString( data->ObjectAt( i ) );
}
}
}
EXPORT_FROM_DLL void Event::Unarchive
(
Archiver &arc
)
{
Event ev;
str name;
int i;
int num;
if ( data )
{
delete data;
data = NULL;
}
arc.ReadString( &name );
*this = Event( name );
arc.ReadRaw( &info, sizeof( info ) );
arc.ReadInteger( &threadnum );
arc.ReadInteger( &num );
if ( num )
{
data = new Container<str>;
data->Resize( num );
for( i = 1; i <= num; i++ )
{
arc.ReadString( &name );
data->AddObject( name );
}
}
}
CLASS_DECLARATION( Class, Listener, NULL );
ResponseDef Listener::Responses[] =
{
{ &EV_Remove, ( Response )Listener::Remove },
{ &EV_ScriptRemove, ( Response )Listener::ScriptRemove },
{ NULL, NULL }
};
EXPORT_FROM_DLL void Listener::Remove
(
Event *e
)
{
delete this;
}
EXPORT_FROM_DLL void Listener::ScriptRemove
(
Event *e
)
{
// Forces the remove to be done at a safe time
PostEvent( EV_Remove, 0 );
}
#if 0
EXPORT_FROM_DLL void Listener::FloatVar
(
Event &e,
float *var,
float defaultvalue
)
{
}
EXPORT_FROM_DLL void Listener::IntVar
(
Event &e,
int *var,
float defaultvalue
)
{
}
EXPORT_FROM_DLL void Listener::StringVar
(
Event &e,
str *var,
const char *defaultvalue
)
{
}
EXPORT_FROM_DLL void Listener::StringVar
(
Event &e,
char **var,
const char *defaultvalue
)
{
}
EXPORT_FROM_DLL void Listener::VectorVar
(
Event &e,
Vector *var,
Vector defaultvalue
)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -