⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 listener.cpp

📁 this keik game source
💻 CPP
📖 第 1 页 / 共 3 页
字号:
   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 + -