2011-11-22 21:28:15 +00:00
|
|
|
/*
|
|
|
|
===========================================================================
|
|
|
|
|
|
|
|
Doom 3 GPL Source Code
|
2011-12-06 18:20:15 +00:00
|
|
|
Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company.
|
2011-11-22 21:28:15 +00:00
|
|
|
|
2011-12-06 16:14:59 +00:00
|
|
|
This file is part of the Doom 3 GPL Source Code ("Doom 3 Source Code").
|
2011-11-22 21:28:15 +00:00
|
|
|
|
|
|
|
Doom 3 Source Code is free software: you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
Doom 3 Source Code is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with Doom 3 Source Code. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code. If not, please request a copy in writing from id Software at the address below.
|
|
|
|
|
|
|
|
If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
|
|
|
|
|
|
|
|
===========================================================================
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __GAME_MOVEABLE_H__
|
|
|
|
#define __GAME_MOVEABLE_H__
|
|
|
|
|
2011-12-16 22:28:29 +00:00
|
|
|
#include "physics/Physics_RigidBody.h"
|
|
|
|
#include "script/Script_Thread.h"
|
|
|
|
#include "gamesys/Event.h"
|
|
|
|
#include "Entity.h"
|
|
|
|
#include "Player.h"
|
|
|
|
#include "Projectile.h"
|
|
|
|
|
2011-11-22 21:28:15 +00:00
|
|
|
/*
|
|
|
|
===============================================================================
|
|
|
|
|
|
|
|
Entity using rigid body physics.
|
|
|
|
|
|
|
|
===============================================================================
|
|
|
|
*/
|
|
|
|
|
|
|
|
extern const idEventDef EV_BecomeNonSolid;
|
|
|
|
extern const idEventDef EV_IsAtRest;
|
|
|
|
|
|
|
|
class idMoveable : public idEntity {
|
|
|
|
public:
|
|
|
|
CLASS_PROTOTYPE( idMoveable );
|
|
|
|
|
|
|
|
idMoveable( void );
|
|
|
|
~idMoveable( void );
|
|
|
|
|
|
|
|
void Spawn( void );
|
|
|
|
|
|
|
|
void Save( idSaveGame *savefile ) const;
|
|
|
|
void Restore( idRestoreGame *savefile );
|
|
|
|
|
|
|
|
virtual void Think( void );
|
|
|
|
|
|
|
|
virtual void Hide( void );
|
|
|
|
virtual void Show( void );
|
|
|
|
|
|
|
|
bool AllowStep( void ) const;
|
|
|
|
void EnableDamage( bool enable, float duration );
|
|
|
|
virtual bool Collide( const trace_t &collision, const idVec3 &velocity );
|
|
|
|
virtual void Killed( idEntity *inflictor, idEntity *attacker, int damage, const idVec3 &dir, int location );
|
|
|
|
virtual void WriteToSnapshot( idBitMsgDelta &msg ) const;
|
|
|
|
virtual void ReadFromSnapshot( const idBitMsgDelta &msg );
|
|
|
|
|
|
|
|
#ifdef _D3XP
|
|
|
|
void SetAttacker( idEntity *ent );
|
|
|
|
#endif
|
|
|
|
|
|
|
|
protected:
|
|
|
|
idPhysics_RigidBody physicsObj; // physics object
|
|
|
|
idStr brokenModel; // model set when health drops down to or below zero
|
|
|
|
idStr damage; // if > 0 apply damage to hit entities
|
|
|
|
#ifdef _D3XP
|
|
|
|
idStr monsterDamage;
|
|
|
|
idEntity *attacker;
|
|
|
|
#endif
|
|
|
|
idStr fxCollide; // fx system to start when collides with something
|
|
|
|
int nextCollideFxTime; // next time it is ok to spawn collision fx
|
|
|
|
float minDamageVelocity; // minimum velocity before moveable applies damage
|
|
|
|
float maxDamageVelocity; // velocity at which the maximum damage is applied
|
|
|
|
idCurve_Spline<idVec3> *initialSpline; // initial spline path the moveable follows
|
|
|
|
idVec3 initialSplineDir; // initial relative direction along the spline path
|
|
|
|
bool explode; // entity explodes when health drops down to or below zero
|
|
|
|
bool unbindOnDeath; // unbind from master when health drops down to or below zero
|
|
|
|
bool allowStep; // allow monsters to step on the object
|
|
|
|
bool canDamage; // only apply damage when this is set
|
|
|
|
int nextDamageTime; // next time the movable can hurt the player
|
|
|
|
int nextSoundTime; // next time the moveable can make a sound
|
|
|
|
|
|
|
|
const idMaterial * GetRenderModelMaterial( void ) const;
|
|
|
|
void BecomeNonSolid( void );
|
|
|
|
void InitInitialSpline( int startTime );
|
|
|
|
bool FollowInitialSplinePath( void );
|
|
|
|
|
|
|
|
void Event_Activate( idEntity *activator );
|
|
|
|
void Event_BecomeNonSolid( void );
|
|
|
|
void Event_SetOwnerFromSpawnArgs( void );
|
|
|
|
void Event_IsAtRest( void );
|
|
|
|
void Event_EnableDamage( float enable );
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
===============================================================================
|
|
|
|
|
|
|
|
A barrel using rigid body physics. The barrel has special handling of
|
|
|
|
the view model orientation to make it look like it rolls instead of slides.
|
|
|
|
|
|
|
|
===============================================================================
|
|
|
|
*/
|
|
|
|
|
|
|
|
class idBarrel : public idMoveable {
|
|
|
|
|
|
|
|
public:
|
|
|
|
CLASS_PROTOTYPE( idBarrel );
|
|
|
|
idBarrel();
|
|
|
|
|
|
|
|
void Spawn( void );
|
|
|
|
|
|
|
|
void Save( idSaveGame *savefile ) const;
|
|
|
|
void Restore( idRestoreGame *savefile );
|
|
|
|
|
|
|
|
void BarrelThink( void );
|
|
|
|
virtual void Think( void );
|
|
|
|
virtual bool GetPhysicsToVisualTransform( idVec3 &origin, idMat3 &axis );
|
|
|
|
virtual void ClientPredictionThink( void );
|
|
|
|
|
|
|
|
private:
|
|
|
|
float radius; // radius of barrel
|
|
|
|
int barrelAxis; // one of the coordinate axes the barrel cylinder is parallel to
|
|
|
|
idVec3 lastOrigin; // origin of the barrel the last think frame
|
|
|
|
idMat3 lastAxis; // axis of the barrel the last think frame
|
|
|
|
float additionalRotation; // additional rotation of the barrel about it's axis
|
|
|
|
idMat3 additionalAxis; // additional rotation axis
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
===============================================================================
|
|
|
|
|
|
|
|
A barrel using rigid body physics and special handling of the view model
|
|
|
|
orientation to make it look like it rolls instead of slides. The barrel
|
|
|
|
can burn and explode when damaged.
|
|
|
|
|
|
|
|
===============================================================================
|
|
|
|
*/
|
|
|
|
|
|
|
|
class idExplodingBarrel : public idBarrel {
|
|
|
|
public:
|
|
|
|
CLASS_PROTOTYPE( idExplodingBarrel );
|
|
|
|
|
|
|
|
idExplodingBarrel();
|
|
|
|
~idExplodingBarrel();
|
|
|
|
|
|
|
|
void Spawn( void );
|
|
|
|
|
|
|
|
void Save( idSaveGame *savefile ) const;
|
|
|
|
void Restore( idRestoreGame *savefile );
|
|
|
|
|
|
|
|
#ifdef _D3XP
|
|
|
|
bool IsStable( void );
|
|
|
|
void SetStability( bool stability );
|
|
|
|
void StartBurning( void );
|
|
|
|
void StopBurning( void );
|
|
|
|
#endif
|
|
|
|
|
|
|
|
virtual void Think( void );
|
2011-12-06 18:20:15 +00:00
|
|
|
virtual void Damage( idEntity *inflictor, idEntity *attacker, const idVec3 &dir,
|
2011-11-22 21:28:15 +00:00
|
|
|
const char *damageDefName, const float damageScale, const int location );
|
|
|
|
virtual void Killed( idEntity *inflictor, idEntity *attacker, int damage, const idVec3 &dir, int location );
|
|
|
|
|
|
|
|
virtual void WriteToSnapshot( idBitMsgDelta &msg ) const;
|
|
|
|
virtual void ReadFromSnapshot( const idBitMsgDelta &msg );
|
|
|
|
virtual bool ClientReceiveEvent( int event, int time, const idBitMsg &msg );
|
|
|
|
|
|
|
|
enum {
|
|
|
|
EVENT_EXPLODE = idEntity::EVENT_MAXEVENTS,
|
|
|
|
EVENT_MAXEVENTS
|
|
|
|
};
|
|
|
|
|
|
|
|
private:
|
|
|
|
typedef enum {
|
|
|
|
NORMAL = 0,
|
|
|
|
BURNING,
|
|
|
|
BURNEXPIRED,
|
|
|
|
EXPLODING
|
|
|
|
} explode_state_t;
|
|
|
|
explode_state_t state;
|
|
|
|
|
|
|
|
idVec3 spawnOrigin;
|
|
|
|
idMat3 spawnAxis;
|
|
|
|
qhandle_t particleModelDefHandle;
|
|
|
|
qhandle_t lightDefHandle;
|
|
|
|
renderEntity_t particleRenderEntity;
|
|
|
|
renderLight_t light;
|
|
|
|
int particleTime;
|
|
|
|
int lightTime;
|
|
|
|
float time;
|
|
|
|
#ifdef _D3XP
|
|
|
|
bool isStable;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
void AddParticles( const char *name, bool burn );
|
|
|
|
void AddLight( const char *name , bool burn );
|
|
|
|
void ExplodingEffects( void );
|
|
|
|
|
|
|
|
void Event_Activate( idEntity *activator );
|
|
|
|
void Event_Respawn();
|
|
|
|
void Event_Explode();
|
|
|
|
void Event_TriggerTargets();
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif /* !__GAME_MOVEABLE_H__ */
|