247 lines
8.0 KiB
C++
247 lines
8.0 KiB
C++
// Copyright (C) 2007 Id Software, Inc.
|
|
//
|
|
|
|
#ifndef __GAME_PROJECTILE_H__
|
|
#define __GAME_PROJECTILE_H__
|
|
|
|
#include "physics/Physics_RigidBody.h"
|
|
#include "physics/Physics_SimpleRigidBody.h"
|
|
#include "physics/Physics_Parabola.h"
|
|
#include "Entity.h"
|
|
#include "proficiency/ProficiencyManager.h"
|
|
#include "effects/WaterEffects.h"
|
|
|
|
/*
|
|
===============================================================================
|
|
|
|
idProjectile
|
|
|
|
===============================================================================
|
|
*/
|
|
|
|
extern const idEventDef EV_DelayedLaunch;
|
|
|
|
class sdProjectileNetworkData : public sdEntityStateNetworkData {
|
|
public:
|
|
sdProjectileNetworkData( void ) : physicsData( NULL ) { ; }
|
|
virtual ~sdProjectileNetworkData( void );
|
|
|
|
virtual void MakeDefault( void );
|
|
|
|
virtual void Write( idFile* file ) const;
|
|
virtual void Read( idFile* file );
|
|
|
|
sdEntityStateNetworkData* physicsData;
|
|
sdScriptObjectNetworkData scriptData;
|
|
};
|
|
|
|
class sdProjectileBroadcastData : public sdEntityStateNetworkData {
|
|
public:
|
|
sdProjectileBroadcastData( void ) : physicsData( NULL ), team( NULL ) { ; }
|
|
virtual ~sdProjectileBroadcastData( void );
|
|
|
|
virtual void MakeDefault( void );
|
|
|
|
virtual void Write( idFile* file ) const;
|
|
virtual void Read( idFile* file );
|
|
|
|
sdEntityStateNetworkData* physicsData;
|
|
sdScriptObjectNetworkData scriptData;
|
|
|
|
sdTeamInfo* team;
|
|
int ownerId;
|
|
int enemyId;
|
|
int launchTime;
|
|
float launchSpeed;
|
|
idList< int > owners;
|
|
bool hidden;
|
|
sdBindNetworkData bindData;
|
|
};
|
|
|
|
class idProjectile : public idEntity {
|
|
public :
|
|
CLASS_PROTOTYPE( idProjectile );
|
|
|
|
idProjectile( void );
|
|
virtual ~idProjectile( void );
|
|
|
|
void Spawn( void );
|
|
|
|
virtual void Create( idEntity *owner, const idVec3 &start, const idVec3 &dir );
|
|
virtual void Launch( const idVec3 &start, const idVec3 &dir, const idVec3 &pushVelocity, const float timeSinceFire = 0.0f, const float launchPower = 1.0f, const float dmgPower = 1.0f );
|
|
|
|
virtual void InitPhysics( void );
|
|
virtual void InitLaunchPhysics( float launchPower, const idVec3& origin, const idMat3& axes, const idVec3& pushVelocity );
|
|
void LaunchDelayed( int delay, idEntity* owner, const idVec3& org, const idVec3& dir, const idVec3& push );
|
|
|
|
idEntity * GetOwner( void ) const;
|
|
virtual bool IsOwner( idEntity* other ) const;
|
|
|
|
virtual void Think( void );
|
|
virtual void PostThink( void );
|
|
virtual idLinkList<idEntity>* GetPostThinkNode( void );
|
|
|
|
virtual void Killed( idEntity *inflictor, idEntity *attacker, int damage, const idVec3 &dir, int location, const sdDeclDamage* damageDecl );
|
|
virtual bool Collide( const trace_t &collision, const idVec3 &velocity, int bodyId );
|
|
|
|
void Thrust( void );
|
|
void UpdateTargeting( void );
|
|
|
|
void UpdateVisibility( void );
|
|
|
|
virtual bool DoRadiusPush( void ) const { return false; }
|
|
|
|
virtual bool CanCollide( const idEntity* other, int traceId ) const;
|
|
|
|
virtual void SetEnemy( idEntity* _enemy );
|
|
virtual void SetTarget( const idVec3& target ) { }
|
|
|
|
bool SetState( const sdProgram::sdFunction* newState );
|
|
void UpdateScript( void );
|
|
|
|
virtual void SetHealth( int count ) { health = count; }
|
|
virtual void SetMaxHealth( int count ) { maxHealth = count; }
|
|
virtual int GetHealth( void ) const { return health; }
|
|
virtual int GetMaxHealth( void ) const { return maxHealth; }
|
|
|
|
virtual void SetGameTeam( sdTeamInfo* _team ) { team = _team; }
|
|
virtual sdTeamInfo* GetGameTeam( void ) const { return team; }
|
|
|
|
virtual bool ShouldConstructScriptObjectAtSpawn( void ) const { return false; }
|
|
|
|
virtual void ApplyNetworkState( networkStateMode_t mode, const sdEntityStateNetworkData& newState );
|
|
virtual void ReadNetworkState( networkStateMode_t mode, const sdEntityStateNetworkData& baseState, sdEntityStateNetworkData& newState, const idBitMsg& msg ) const;
|
|
virtual void WriteNetworkState( networkStateMode_t mode, const sdEntityStateNetworkData& baseState, sdEntityStateNetworkData& newState, idBitMsg& msg ) const;
|
|
virtual bool CheckNetworkStateChanges( networkStateMode_t mode, const sdEntityStateNetworkData& baseState ) const;
|
|
virtual sdEntityStateNetworkData* CreateNetworkStructure( networkStateMode_t mode ) const;
|
|
|
|
virtual void UpdateModelTransform( void );
|
|
|
|
void AddOwner( idEntity* ent ) { assert( ent ); owners.AddUnique( ent ); }
|
|
|
|
void Event_Hide( void );
|
|
void Event_Show( void );
|
|
void Event_Freeze( bool frozen );
|
|
|
|
void SetThrust( bool value );
|
|
void SetLaunchTime( int time );
|
|
|
|
virtual void OnTouch( idEntity *other, const trace_t& trace );
|
|
|
|
protected:
|
|
idEntityPtr< idEntity > owner;
|
|
idList< idEntityPtr< idEntity > > owners;
|
|
idEntityPtr< idEntity > enemy;
|
|
|
|
typedef struct projectileFlags_s {
|
|
bool scriptHide : 1;
|
|
bool frozen : 1;
|
|
bool allowOwnerCollisions : 1;
|
|
bool hasThrust : 1;
|
|
bool thustOn : 1;
|
|
bool faceVelocity : 1;
|
|
bool faceVelocitySet : 1;
|
|
} projectileFlags_t;
|
|
|
|
projectileFlags_t projectileFlags;
|
|
|
|
float damagePower;
|
|
|
|
int launchTime;
|
|
int thrustStartTime;
|
|
int targetForgetTime;
|
|
float launchSpeed;
|
|
|
|
float thrustPower;
|
|
|
|
int health;
|
|
int maxHealth;
|
|
|
|
idMat3 visualAxes;
|
|
|
|
sdTeamInfo* team;
|
|
|
|
// state variables
|
|
sdProgramThread* baseScriptThread;
|
|
const sdProgram::sdFunction* scriptState;
|
|
const sdProgram::sdFunction* scriptIdealState;
|
|
|
|
const sdProgram::sdFunction* targetingFunction;
|
|
|
|
const sdProgram::sdFunction* onPostThink;
|
|
idLinkList< idEntity > postThinkEntNode;
|
|
|
|
protected:
|
|
|
|
void Event_SetState( const char* stateName );
|
|
void Event_Fizzle( void );
|
|
void Event_DelayedLaunch( idEntity* owner, const idVec3 &org, idVec3 const &dir, idVec3 const &push );
|
|
void Event_GetDamagePower( void );
|
|
void Event_GetOwner( void );
|
|
void Event_SetOwner( idEntity* _owner );
|
|
void Event_GetLaunchTime( void );
|
|
void Event_Launch( const idVec3& velocity );
|
|
void Event_AddOwner( idEntity* other );
|
|
void Event_SetEnemy( idEntity* other );
|
|
void Event_IsOwner( idEntity* other );
|
|
void Event_GetEnemy( void );
|
|
};
|
|
|
|
/*
|
|
===============================================================================
|
|
|
|
idProjectile_RigidBody
|
|
|
|
===============================================================================
|
|
*/
|
|
|
|
class idProjectile_RigidBody : public idProjectile {
|
|
public :
|
|
CLASS_PROTOTYPE( idProjectile_RigidBody );
|
|
|
|
idProjectile_RigidBody( void );
|
|
virtual ~idProjectile_RigidBody( void );
|
|
|
|
virtual void Spawn( void );
|
|
virtual void InitPhysics( void );
|
|
virtual void InitLaunchPhysics( float launchPower, const idVec3& origin, const idMat3& axes, const idVec3& pushVelocity );
|
|
|
|
virtual bool StartSynced( void ) const { return true; }
|
|
|
|
virtual void CheckWater( const idVec3& waterBodyOrg, const idMat3& waterBodyAxis, idCollisionModel* waterBodyModel );
|
|
|
|
protected:
|
|
sdPhysics_SimpleRigidBody physicsObj;
|
|
sdWaterEffects *waterEffects;
|
|
};
|
|
|
|
/*
|
|
===============================================================================
|
|
|
|
sdProjectile_Parabolic
|
|
|
|
===============================================================================
|
|
*/
|
|
|
|
class sdProjectile_Parabolic : public idProjectile {
|
|
public :
|
|
CLASS_PROTOTYPE( sdProjectile_Parabolic );
|
|
|
|
sdProjectile_Parabolic( void );
|
|
virtual ~sdProjectile_Parabolic( void );
|
|
|
|
virtual void Spawn( void );
|
|
virtual void InitPhysics( void );
|
|
virtual void InitLaunchPhysics( float launchPower, const idVec3& origin, const idMat3& axes, const idVec3& pushVelocity );
|
|
|
|
virtual bool StartSynced( void ) const { return true; }
|
|
|
|
virtual void CheckWater( const idVec3& waterBodyOrg, const idMat3& waterBodyAxis, idCollisionModel* waterBodyModel );
|
|
|
|
protected:
|
|
sdPhysics_Parabola physicsObj;
|
|
sdWaterEffects *waterEffects;
|
|
};
|
|
|
|
#endif /* !__GAME_PROJECTILE_H__ */
|