217 lines
5.8 KiB
C++
217 lines
5.8 KiB
C++
|
// Copyright (C) 1998 by Ritual Entertainment, Inc.
|
||
|
// All rights reserved.
|
||
|
//
|
||
|
// This source is may not be distributed and/or modified without
|
||
|
// expressly written permission by Ritual Entertainment, Inc.
|
||
|
//
|
||
|
// DESCRIPTION: Generic Projectile Launcher
|
||
|
//
|
||
|
|
||
|
#include "g_local.h"
|
||
|
#include "misc.h"
|
||
|
#include "specialfx.h"
|
||
|
|
||
|
/****************************************************************************
|
||
|
/*SINED func_launcher (0 1 0) ?
|
||
|
Creates an object that launches projectiles.
|
||
|
|
||
|
"projectile" Sets the projectile that you want to launch (Examples: Rocket, Spear, etc...)
|
||
|
"launchsound" Sets the launching sound.
|
||
|
/*****************************************************************************/
|
||
|
|
||
|
class EXPORT_FROM_DLL GenericLauncher : public Entity
|
||
|
{
|
||
|
private:
|
||
|
Vector launchAngle;
|
||
|
float x_var;
|
||
|
float y_var;
|
||
|
float z_var;
|
||
|
str projectile;
|
||
|
str launchsound;
|
||
|
|
||
|
public:
|
||
|
CLASS_PROTOTYPE( GenericLauncher );
|
||
|
GenericLauncher( );
|
||
|
void Launch(Event *ev);
|
||
|
void LaunchProjectile(Event *ev);
|
||
|
void Setdir(Event *ev);
|
||
|
void SetXdir(Event *ev);
|
||
|
void SetYdir(Event *ev);
|
||
|
void SetZdir(Event *ev);
|
||
|
void SetXvar(Event *ev);
|
||
|
void SetYvar(Event *ev);
|
||
|
void SetZvar(Event *ev);
|
||
|
void SetupDir(Event *ev);
|
||
|
virtual void Archive( Archiver &arc );
|
||
|
virtual void Unarchive( Archiver &arc );
|
||
|
};
|
||
|
|
||
|
EXPORT_FROM_DLL void GenericLauncher::Archive
|
||
|
(
|
||
|
Archiver &arc
|
||
|
)
|
||
|
{
|
||
|
Entity::Archive( arc );
|
||
|
|
||
|
arc.WriteVector( launchAngle );
|
||
|
arc.WriteFloat( x_var );
|
||
|
arc.WriteFloat( y_var );
|
||
|
arc.WriteFloat( z_var );
|
||
|
arc.WriteString( projectile );
|
||
|
arc.WriteString( launchsound );
|
||
|
}
|
||
|
|
||
|
EXPORT_FROM_DLL void GenericLauncher::Unarchive
|
||
|
(
|
||
|
Archiver &arc
|
||
|
)
|
||
|
{
|
||
|
Entity::Unarchive( arc );
|
||
|
|
||
|
arc.ReadVector( &launchAngle );
|
||
|
arc.ReadFloat( &x_var );
|
||
|
arc.ReadFloat( &y_var );
|
||
|
arc.ReadFloat( &z_var );
|
||
|
arc.ReadString( &projectile );
|
||
|
arc.ReadString( &launchsound );
|
||
|
}
|
||
|
|
||
|
CLASS_DECLARATION( Entity, GenericLauncher, "func_launcher" );
|
||
|
|
||
|
Event EV_GenericLauncher_Launch( "launch" );
|
||
|
Event EV_GenericLauncher_Setdir( "setdir" );
|
||
|
Event EV_GenericLauncher_SetXdir( "setXdir" );
|
||
|
Event EV_GenericLauncher_SetYdir( "setYdir" );
|
||
|
Event EV_GenericLauncher_SetZdir( "setZdir" );
|
||
|
Event EV_GenericLauncher_SetXvar( "setXvar" );
|
||
|
Event EV_GenericLauncher_SetYvar( "setYvar" );
|
||
|
Event EV_GenericLauncher_SetZvar( "setZvar" );
|
||
|
Event EV_GenericLauncher_SetupDir( "setupdir" );
|
||
|
|
||
|
ResponseDef GenericLauncher::Responses[] =
|
||
|
{
|
||
|
{ &EV_Activate, ( Response )GenericLauncher::LaunchProjectile },
|
||
|
{ &EV_GenericLauncher_Launch, ( Response )GenericLauncher::Launch },
|
||
|
{ &EV_GenericLauncher_SetXdir, ( Response )GenericLauncher::SetXdir },
|
||
|
{ &EV_GenericLauncher_SetYdir, ( Response )GenericLauncher::SetYdir },
|
||
|
{ &EV_GenericLauncher_SetZdir, ( Response )GenericLauncher::SetZdir },
|
||
|
{ &EV_GenericLauncher_SetXvar, ( Response )GenericLauncher::SetXvar },
|
||
|
{ &EV_GenericLauncher_SetYvar, ( Response )GenericLauncher::SetYvar },
|
||
|
{ &EV_GenericLauncher_SetZvar, ( Response )GenericLauncher::SetZvar },
|
||
|
{ &EV_GenericLauncher_SetupDir, ( Response )GenericLauncher::SetupDir },
|
||
|
{ NULL, NULL }
|
||
|
};
|
||
|
|
||
|
GenericLauncher::GenericLauncher( )
|
||
|
{
|
||
|
showModel();
|
||
|
setSolidType( SOLID_BSP );
|
||
|
projectile = G_GetStringArg( "projectile" );
|
||
|
launchsound = G_GetStringArg( "launchsound" );
|
||
|
launchAngle = G_GetMovedir();
|
||
|
|
||
|
x_var = 0;
|
||
|
y_var = 0;
|
||
|
z_var = 0;
|
||
|
|
||
|
PostEvent( EV_GenericLauncher_SetupDir, 0 );
|
||
|
}
|
||
|
|
||
|
void GenericLauncher::SetupDir( Event *ev )
|
||
|
{
|
||
|
int num;
|
||
|
const char *target;
|
||
|
Entity *dest;
|
||
|
|
||
|
target = Target();
|
||
|
if (target)
|
||
|
{
|
||
|
if (num = G_FindTarget(0, target))
|
||
|
{
|
||
|
dest = G_GetEntity( num );
|
||
|
assert( dest );
|
||
|
VectorSubtract(dest->worldorigin, origin, launchAngle);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void GenericLauncher::SetXdir( Event *ev )
|
||
|
{
|
||
|
launchAngle.x = ev->GetFloat( 1 );
|
||
|
}
|
||
|
|
||
|
void GenericLauncher::SetYdir( Event *ev )
|
||
|
{
|
||
|
launchAngle.y = ev->GetFloat(1);
|
||
|
}
|
||
|
|
||
|
void GenericLauncher::SetZdir( Event *ev )
|
||
|
{
|
||
|
launchAngle.z = ev->GetFloat(1);
|
||
|
}
|
||
|
|
||
|
void GenericLauncher::Setdir(Event *ev)
|
||
|
{
|
||
|
launchAngle = ev->GetVector(1);
|
||
|
}
|
||
|
|
||
|
void GenericLauncher::SetXvar( Event *ev )
|
||
|
{
|
||
|
x_var = ev->GetFloat(1);
|
||
|
}
|
||
|
|
||
|
void GenericLauncher::SetYvar( Event *ev )
|
||
|
{
|
||
|
y_var = ev->GetFloat(1);
|
||
|
}
|
||
|
|
||
|
void GenericLauncher::SetZvar( Event *ev )
|
||
|
{
|
||
|
z_var = ev->GetFloat(1);
|
||
|
}
|
||
|
|
||
|
void GenericLauncher::LaunchProjectile(Event *ev)
|
||
|
{
|
||
|
Vector ang;
|
||
|
ClassDef *cls;
|
||
|
Projectile *obj;
|
||
|
|
||
|
ang.x = launchAngle.x + G_CRandom(x_var);
|
||
|
ang.y = launchAngle.y + G_CRandom(y_var);
|
||
|
ang.z = launchAngle.z + G_CRandom(z_var);
|
||
|
|
||
|
cls = getClass( projectile.c_str() );
|
||
|
if (cls)
|
||
|
{
|
||
|
if ( launchsound.length() )
|
||
|
{
|
||
|
this->sound( launchsound, 1, CHAN_WEAPON, ATTN_NORM );
|
||
|
}
|
||
|
obj = (Projectile *)cls->newInstance();
|
||
|
obj->Setup( this, worldorigin, ang.normalize());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void GenericLauncher::Launch(Event *ev)
|
||
|
{
|
||
|
Vector ang;
|
||
|
ClassDef *cls;
|
||
|
Projectile *obj;
|
||
|
|
||
|
ang.x = launchAngle.x + G_CRandom(x_var);
|
||
|
ang.y = launchAngle.y + G_CRandom(y_var);
|
||
|
ang.z = launchAngle.z + G_CRandom(z_var);
|
||
|
|
||
|
cls = getClass( ev->GetString(1));
|
||
|
if (cls)
|
||
|
{
|
||
|
if ( launchsound.length() )
|
||
|
{
|
||
|
this->sound( launchsound, 1, CHAN_WEAPON, ATTN_NORM );
|
||
|
}
|
||
|
obj = (Projectile *)cls->newInstance();
|
||
|
obj->Setup( this, worldorigin, ang.normalize());
|
||
|
}
|
||
|
}
|
||
|
|