//----------------------------------------------------------------------------- // // $Logfile:: /Quake 2 Engine/Sin/code/game/entity.h $ // $Revision:: 157 $ // $Author:: Markd $ // $Date:: 11/15/98 11:33p $ // // Copyright (C) 1997 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. // // $Log:: /Quake 2 Engine/Sin/code/game/entity.h $ // // 157 11/15/98 11:33p Markd // added fat projectile flag // // 156 11/13/98 2:35a Aldie // Added mutant drain MOD // // 155 11/08/98 10:50p Jimdose // changed how archive wrote groundentity entity number // // 154 10/27/98 3:51a Jimdose // added FL_NOION // // 153 10/26/98 4:30p Aldie // Added Ghost command // // 152 10/25/98 11:53p Jimdose // added EXPORT_TEMPLATE // // 151 10/25/98 4:37a Aldie // Moved link() // // 150 10/25/98 12:01a Markd // put in censored support // // 149 10/24/98 7:15p Jimdose // archive wasn't saving orientation // // 148 10/23/98 5:39a Jimdose // Added SetMassEvent // // 147 10/22/98 1:40a Markd // Added stealth mode // // 146 10/20/98 11:30p Markd // Increased ranges on BroadcastSounds // // 145 10/20/98 3:30a Jimdose // Added isBoundTo // // 144 10/20/98 12:44a Markd // Made setSize virtual // // 143 10/18/98 8:44p Jimdose // Added GetEntName // // 142 10/17/98 11:02p Markd // Added ifskill // // 141 10/17/98 8:11p Jimdose // Changed Damage to DamgeEvent // // 140 10/16/98 1:42a Jimdose // Added FL_DONTSAVE // // 139 10/15/98 3:39p Markd // Added FL_FORCEFIELD // // 138 10/13/98 11:14p Markd // Added hurt and mutate events // // 137 10/13/98 5:25p Markd // Added UseBoundingBoxEvent // // 136 10/11/98 8:50p Jimdose // Added RandomGlobalEntitySound and RandomGlobalEntitySoundEvent // // 135 10/11/98 7:41p Aldie // Mutate and restore commands for Richard // // 134 10/11/98 5:34p Aldie // Added MOD_MUTANTHANDS // // 133 10/10/98 9:13p Markd // Took out SetAliasPrefix // // 132 10/10/98 9:13p Aldie // Added SPIDERSPLASH // // 131 10/10/98 3:35a Jimdose // changed team to moveteam // // 130 10/10/98 1:32a Jimdose // moved edict archiving out of entity archive functions // no longer call SetOrigin during unarchiving since it needs parent and // bindmaster pointers. Instead, edicts are now fully unarchived. // // 129 10/09/98 8:59p Aldie // Moved air_finished to player // // 128 10/09/98 4:33p Aldie // Add MOD_FRIENDLY_FIRE // // 127 10/08/98 7:39p Aldie // Added lightoffset // // 126 10/08/98 7:25p Aldie // minlight, gravity, lightoffset // // 125 10/07/98 11:45p Jimdose // Added DistanceTo and WithinDistance for vectors // Added SetDeltaAngles // // 124 10/06/98 10:50p Aldie // Created an oxygenator // // 123 10/06/98 9:39p Markd // removed last_origin // // 122 10/05/98 11:23p Markd // Moved all SOUND_RADIUSES to header // // 121 10/05/98 10:37p Aldie // Added FL_SILENCER // // 120 10/04/98 10:28p Aldie // Added multiple weapon changes. Damage, flashes, quantum stuff // // 119 10/03/98 1:12p Aldie // Added new pulse effects // // 118 10/02/98 11:27p Jimdose // Added SetEntNum // // 117 9/28/98 9:12p Markd // Put in archive and unarchive functions // // 116 9/28/98 4:07p Aldie // Added oxygen powerup // // 115 9/26/98 4:46p Aldie // Added mutant mode // // 114 9/23/98 10:07p Aldie // Added ION_DESTRUCT to MOD // // 113 9/22/98 2:59p Aldie // Added effects command // // 112 9/15/98 6:37p Markd // Added RotatedBounds flag support // // 111 9/13/98 4:35p Aldie // Changed MOD_LASERBEAM to MOD_LASER // // 110 9/12/98 11:11p Aldie // Added some more MOD // // 109 9/11/98 4:24p Aldie // Added a couple more means of death // // 108 9/09/98 6:45p Markd // put in world weapon model animations // // 107 9/08/98 11:30p Jimdose // Added AnimEvent // // 106 9/02/98 11:08a Markd // Put in setModel into Sentient so that weapon could be properly detached and // re-attached again. // // 105 8/31/98 7:45p Aldie // Updated surface data structure and removed surfinfo field // // 104 8/31/98 5:45p Aldie // Added FL_CLOAK // // 103 8/29/98 9:49p Jimdose // moved #defines and enum defines from g_local.h // // 102 8/28/98 3:46p Markd // Added centroid to edict_s // // 101 8/27/98 9:04p Jimdose // Moved a lot of small functions to the header as inline // Made Centroid a variable // // 100 8/24/98 6:50p Jimdose // Added SetGravityAxis // // 99 8/22/98 8:55p Jimdose // Added support for alternate gravity axis // // 98 8/18/98 11:08p Markd // Added new Alias System // // 97 8/18/98 11:12a Markd // Added "skin" event // // 96 8/08/98 8:18p Markd // Made max_health a float // // 95 8/08/98 7:51p Jimdose // Made definition of world into include of worldspawn.h // // 94 7/31/98 8:10p Jimdose // Script commands now include flags to indicate cheats and console commands // // 93 7/29/98 2:32p Aldie // Changed health to a float // // 92 7/25/98 3:58p Markd // Added EV_GotKill // // 91 7/23/98 6:17p Aldie // Updated damage system and fixed some damage related bugs. Also put tracers // back to the way they were, and added gib event to funcscriptmodels // // 90 7/21/98 9:34p Jimdose // Added AliasExists and PrefixAliasExists // // 89 7/21/98 1:10p Aldie // Added meansofdeath to obituaries // // 88 7/20/98 5:08p Aldie // Added explicit processinitcommands // // 87 7/18/98 11:15p Markd // Added takedamage and nodamage // // 86 7/18/98 4:02p Markd // Added attach, detach, attachmodel events // // 85 7/17/98 4:04p Markd // Added HasAnim to entity.cpp // // 84 7/15/98 11:23p Markd // Added processinitcommands stuff // // 83 7/14/98 11:35p Markd // Added PHSSound and RandomPHSSound // // 82 7/14/98 3:54p Markd // Added last_animation_time // // 81 7/13/98 5:01p Aldie // Added dead player bodies with gibbing // // 80 7/11/98 2:49p Markd // Added dialog event // // 79 7/11/98 2:25p Markd // removed dialog event // // 78 7/10/98 11:11p Markd // Added dialog event // // 77 7/09/98 9:35p Jimdose // Added getParentVector // // 76 7/08/98 12:58p Jimdose // Added classname event // // 75 6/24/98 12:23p Markd // Added shatter_percentage // // 74 6/19/98 4:45p Jimdose // Added Centroid, DistanceTo, and WithinDistance // // 73 6/19/98 10:56a Markd // re-ordered tesselation event // // 72 6/18/98 2:00p Markd // rewrote tesselation code // // 71 6/10/98 5:10p Markd // Added ExpandAlias // // 70 6/10/98 2:10p Aldie // Updated damage function. // // 69 6/08/98 4:58p Markd // Added GroupModelEvent // // 68 6/05/98 6:27p Aldie // Added location to Damage function. // // 67 5/26/98 10:53p Markd // made sounds be SOUND_SYNCH by default // // 66 5/26/98 9:39p Markd // removed damage regions // // 65 5/26/98 9:25p Aldie // Added kill event // // 64 5/26/98 8:44p Markd // Added damage_regions and DamageSkin Method // // 63 5/25/98 12:22p Aldie // Inited waterlevel and water type // // 62 5/25/98 7:58p Markd // Added RandomPositionedSound // // 61 5/25/98 6:47p Jimdose // Made animateframe, prethink and posthink into functions built into the base // entity class // // 60 5/25/98 4:43p Markd // Added SpawnParticles // // 59 5/24/98 9:01p Jimdose // Changed classname to a const char * // // 58 5/24/98 8:46p Jimdose // Made a lot of functions more str-friendly. // Got rid of a lot of char * based strings // Cleaned up get spawn arg functions and sound functions // sound functions now use consistant syntax // // 57 5/24/98 1:05a Jimdose // Added sound events for ai // // 56 5/20/98 11:12a Markd // removed char * dependency // // 55 5/14/98 10:20p Jimdose // world is now an EntityPtr // // 54 5/13/98 4:54p Jimdose // now uses SafePtrs // // 53 5/11/98 8:07p Jimdose // Added EntityPtr // // 52 5/11/98 5:53p Markd // Added aliascache command // // 51 5/11/98 2:19p Markd // Fixed randomsound stuff // // 50 5/08/98 2:57p Markd // Added another RandomSound method // // 49 5/07/98 11:32p Markd // Removed footstep command and event // // 48 5/04/98 8:32p Markd // Removed cachemodel and cachesound // // 47 5/03/98 4:37p Jimdose // removed oldorigin // // 46 5/02/98 8:45p Markd // Added CacheModel, CacheSound and entityflags events // // 45 5/02/98 12:49a Jimdose // added scale event // // 44 5/01/98 7:32p Jimdose // Added groundplane, groundsurface, groundcontents // // 43 4/29/98 10:46p Markd // added positioned_sound and random_sound // // 42 4/16/98 1:56p Jimdose // Added EndAnimEvent and PrevAnimEvent // // 41 4/10/98 12:34a Jimdose // got rid of damage_inflictor // // 40 4/09/98 3:30p Jimdose // sound and stopsound are now virtual // // 39 4/07/98 8:00p Markd // // 38 4/05/98 10:43p Markd // Added Tesselate // // 37 4/05/98 10:17p Jimdose // added lastorigin // // 36 4/05/98 7:20p Aldie // Added dyamic lights // // 35 4/05/98 1:59a Jimdose // Added setmodelevent // // 34 4/04/98 7:28p Jimdose // added HitSky for generic trace // // 33 4/04/98 6:14p Jimdose // Added HitSky and RandomSound // // 32 4/02/98 4:52p Jimdose // Added parameter to droptofloor // Added animation control events // // 31 3/31/98 5:40p Markd // Added StartAnimatingEvent // // 30 3/30/98 11:39p Markd // Added modelIndex function // // 29 3/30/98 11:21p Markd // Added setScale // // 28 3/30/98 11:16p Markd // Added sound and random sound support // // 27 3/30/98 7:29p Markd // Added Footstep method // // 26 3/29/98 9:38p Jimdose // Changed Killed and Pain to events // Added damage event // // 25 3/27/98 7:01p Markd // Added vieworigin and viewangles // // 24 3/26/98 8:10p Jimdose // Changed groundentity to an edict_t * // Added GetBone // // 23 3/25/98 3:24p Markd // Added model binding variables // // 22 3/23/98 1:33p Jimdose // Revamped event and command system // // 21 3/18/98 7:19p Jimdose // Added RandomAnimate // Added animDoneEvent // // 20 3/11/98 11:30a Markd // Added movement variable totaldelta // // 19 3/07/98 2:05p Markd // Added stuff for Animation system // // 18 3/02/98 8:49p Jimdose // Changed CLASS_PROTOTYPE to only take the classname // // 17 2/17/98 6:59p Jimdose // no longer pass script into interpretCommand // // 16 2/16/98 2:05p Jimdose // Added hierarchial object binding. // Added joinTeam and quitTeam for object teams // Added getLocalVector to aid in translating into the object's local // coordinate system. // Added orientation rotation matrix that is calculated each time setAngles is // called, allowing us to get rid of a lot of calls to AngleVectors. // // 15 2/06/98 5:47p Jimdose // Added link and unlink // Removed touch and think functions // Removed Spawn (all spawning done in constructor) // Added client pointer // No longer initialize mins and maxs to '0 0 0' since it screws up bmodels. // // 14 2/03/98 10:57a Jimdose // Updated to work with Quake 2 engine // Moved initialization to constructor and removed Init function // // 12 12/12/97 4:27p Markd // Added "soundprefix" // // 11 11/24/97 6:54p Markd // Added Register Sound and Random Sound // // 10 11/15/97 6:53p Markd // added ProcessNoteCommands, added RandomAnimate, added animloop_count and // animloop_anim variables for animation loop tracking // // 9 11/15/97 2:48p Jimdose // Added ProcessEvent member function // // 8 11/14/97 4:44p Jimdose // Added PostEvent // // 7 11/12/97 5:13p Jimdose // Created event definitions // // 6 10/29/97 4:18p Jimdose // Added FadeOut. // // 5 10/28/97 4:13p Jimdose // Added interpretCommand to make Entity be controllable by scripts via // ScriptMaster. // // 4 9/29/97 6:18p Markd // working on animate // // 3 9/26/97 6:14p Jimdose // Added standard Ritual headers // // DESCRIPTION: // Base class for all enities that are controlled by Sin. If you have any // object that should be called on a periodic basis and it is not an entity, // then you have to have an dummy entity that calls it. // // An entity in Sin is any object that is not part of the world. Any non-world // object that is visible in Sin is an entity, although it is not required that // all entities be visible to the player. Some objects are basically just virtual // constructs that act as an instigator of certain actions, for example, some // triggers are invisible and cannot be touched, but when activated by other // objects can cause things to happen. // // All entities are capable of receiving messages from Sin or from other entities. // Messages received by an entity may be ignored, passed on to their superclass, // or acted upon by the entity itself. The programmer must decide on the proper // action for the entity to take to any message. There will be many messages // that are completely irrelevant to an entity and should be ignored. Some messages // may require certain states to exist and if they are received by an entity when // it these states don't exist may indicate a logic error on the part of the // programmer or map designer and should be reported as warnings (if the problem is // not severe enough for the game to be halted) or as errors (if the problem should // not be ignored at any cost). // #ifndef __ENTITY_H__ #define __ENTITY_H__ #include "g_local.h" #include "class.h" #include "vector.h" #include "script.h" #include "listener.h" typedef enum { DAMAGE_NO, DAMAGE_YES, // will take damage if hit DAMAGE_AIM // auto targeting recognizes this } damage_t; //deadflag #define DEAD_NO 0 #define DEAD_DYING 1 #define DEAD_DEAD 2 #define DEAD_RESPAWNABLE 3 // flags #define FL_FLY 0x00000001 #define FL_SWIM 0x00000002 // implied immunity to drowining #define FL_INWATER 0x00000004 #define FL_GODMODE 0x00000008 #define FL_NOTARGET 0x00000010 #define FL_PARTIALGROUND 0x00000020 // not all corners are valid #define FL_FATPROJECTILE 0x00000040 // projectile should use fat trace #define FL_TEAMSLAVE 0x00000080 // not the first on the team #define FL_NO_KNOCKBACK 0x00000100 #define FL_PRETHINK 0x00000200 #define FL_POSTTHINK 0x00000400 #define FL_BLOOD 0x00000800 #define FL_SPARKS 0x00001000 #define FL_TESSELATE 0x00002000 #define FL_BLASTMARK 0x00004000 #define FL_DIE_TESSELATE 0x00008000 #define FL_DARKEN 0x00010000 #define FL_DIE_GIBS 0x00020000 #define FL_SHIELDS 0x00040000 // sentient has reactive shields #define FL_DIE_EXPLODE 0x00080000 // when it dies, it will explode #define FL_ADRENALINE 0x00100000 // sentient is under adrenaline effects #define FL_CLOAK 0x00200000 // sentient is cloaked #define FL_ROTATEDBOUNDS 0x00400000 // model uses rotated mins and maxs #define FL_MUTANT 0x00800000 // sentient is in mutant mode #define FL_OXYGEN 0x01000000 // sentient has oxygen powerup #define FL_SILENCER 0x02000000 // sentient has silencer #define FL_SP_MUTANT 0x04000000 // mutant mode single player #define FL_MUTATED 0x08000000 // keep track of mutation #define FL_FORCEFIELD 0x10000000 // sentient has force field ( invulnerable ) #define FL_DONTSAVE 0x20000000 // don't add to the savegame #define FL_STEALTH 0x40000000 // character is in "stealth" mode #define FL_NOION 0x80000000 // don't allow Ion tesselation // damage flags #define DAMAGE_RADIUS 0x00000001 // damage was indirect #define DAMAGE_NO_ARMOR 0x00000002 // armour does not protect from this damage #define DAMAGE_ENERGY 0x00000004 // damage is from an energy based weapon #define DAMAGE_NO_KNOCKBACK 0x00000008 // do not affect velocity, just view angles #define DAMAGE_BULLET 0x00000010 // damage is from a bullet (used for ricochets) #define DAMAGE_NO_PROTECTION 0x00000020 // armor, shields, invulnerability, and godmode have no effect #define DAMAGE_NO_SKILL 0x00000040 // damage is not affected by skill level // means of death flags typedef enum { MOD_FISTS, MOD_MAGNUM, MOD_SHOTGUN, MOD_ASSRIFLE, MOD_CHAINGUN, MOD_GRENADE, MOD_ROCKET, MOD_ROCKETSPLASH, MOD_PULSE, MOD_PULSELASER, MOD_SPEARGUN, MOD_SNIPER, MOD_VEHICLE, MOD_CRUSH, MOD_SHOTROCKET, MOD_FALLING, MOD_DROWN, MOD_SUICIDE, MOD_EXPLODEWALL, MOD_ELECTRIC, MOD_TELEFRAG, MOD_GENBULLET, MOD_LASER, MOD_BETTYSPIKE, MOD_HELIGUN, MOD_DEBRIS, MOD_THROWNOBJECT, MOD_LAVA, MOD_SLIME, MOD_ADRENALINE, MOD_ION, MOD_ION_DESTRUCT, MOD_QUANTUM, MOD_BEAM, MOD_IMPACT, MOD_FRIENDLY_FIRE, MOD_SPIDERSPLASH, MOD_MUTANTHANDS, MOD_MUTANT_DRAIN } mod_type_t; // // Sound travel distances // #define SOUND_BREAKING_RADIUS 500 #define SOUND_WEAPON_RADIUS 800 #define SOUND_MOVEMENT_RADIUS 256 #define SOUND_PAIN_RADIUS 320 #define SOUND_DEATH_RADIUS 800 #define SOUND_DOOR_RADIUS 240 #define SOUND_MUTANT_RADIUS 256 #define SOUND_VOICE_RADIUS 800 #define SOUND_MACHINE_RADIUS 512 #define SOUND_RADIO_RADIUS 8192 extern Event EV_ClientConnect; extern Event EV_ClientDisconnect; extern Event EV_ClientKill; extern Event EV_ClientMove; extern Event EV_ClientEndFrame; // Generic entity events extern Event EV_Classname; extern Event EV_Activate; extern Event EV_Use; //extern Event EV_Footstep; extern Event EV_FadeOut; extern Event EV_Fade; extern Event EV_Killed; extern Event EV_GotKill; extern Event EV_Pain; extern Event EV_Damage; extern Event EV_Gib; extern Event EV_Mutate; // Physics events extern Event EV_MoveDone; extern Event EV_Touch; extern Event EV_Blocked; extern Event EV_Attach; extern Event EV_AttachModel; extern Event EV_Detach; extern Event EV_UseBoundingBox; // Animation events extern Event EV_NewAnim; extern Event EV_LastFrame; extern Event EV_TakeDamage; extern Event EV_NoDamage; extern Event EV_SetSkin; // script stuff extern Event EV_Hide; extern Event EV_Show; extern Event EV_BecomeSolid; extern Event EV_BecomeNonSolid; extern Event EV_PlaySound; extern Event EV_StopSound; extern Event EV_GravityAxis; extern Event EV_Bind; extern Event EV_Unbind; extern Event EV_JoinTeam; extern Event EV_QuitTeam; extern Event EV_SetHealth; extern Event EV_SetSize; extern Event EV_SetAlpha; extern Event EV_SetOrigin; extern Event EV_SetTargetName; extern Event EV_SetTarget; extern Event EV_SetKillTarget; extern Event EV_SetAngles; extern Event EV_RegisterAlias; extern Event EV_RandomSound; extern Event EV_EntitySound; extern Event EV_RandomEntitySound; extern Event EV_RandomGlobalEntitySound; extern Event EV_StopEntitySound; extern Event EV_Anim; extern Event EV_StartAnimating; extern Event EV_GroupModelEvent; extern Event EV_DialogEvent; extern Event EV_RandomPHSSound; extern Event EV_PHSSound; extern Event EV_ProcessInitCommands; // dir is 1 // power is 2 // minsize is 3 // maxsize is 4 // percentage is 5 // thickness 6 // entity is 7 // origin 8 extern Event EV_Tesselate; extern Event EV_Shatter_MinSize; extern Event EV_Shatter_MaxSize; extern Event EV_Shatter_Thickness; extern Event EV_Shatter_Percentage; // AI sound events extern Event EV_WeaponSound; extern Event EV_MovementSound; extern Event EV_PainSound; extern Event EV_DeathSound; extern Event EV_BreakingSound; extern Event EV_DoorSound; extern Event EV_MutantSound; extern Event EV_VoiceSound; extern Event EV_MachineSound; extern Event EV_RadioSound; extern Event EV_HeardWeapon; extern Event EV_HeardMovement; extern Event EV_HeardPain; extern Event EV_HeardDeath; extern Event EV_HeardBreaking; extern Event EV_HeardDoor; extern Event EV_HeardMutant; extern Event EV_HeardVoice; extern Event EV_HeardMachine; extern Event EV_HeardRadio; extern Event EV_Hurt; extern Event EV_IfSkill; // Define ScriptMaster class ScriptMaster; // // Spawn args // // "spawnflags" // "alpha" default 1.0 // "model" // "origin" // "targetname" // "target" // #define MAX_MODEL_CHILDREN 8 class Entity; #ifdef EXPORT_TEMPLATE template class EXPORT_FROM_DLL SafePtr; #endif typedef SafePtr EntityPtr; class EXPORT_FROM_DLL Entity : public Listener { public: CLASS_PROTOTYPE( Entity ); // spawning variables int entnum; edict_t *edict; gclient_t *client; const char *classname; int spawnflags; // rendering variables float translucence; int viewheight; // height above origin where eyesight is determined int light_level; // keeps track of light level at origin // Animation variables str model; int next_anim; // index of next_anim, if an anim change is pending, // this value is non-negative int next_frame; // index of next_frame, if a frame change is pending, // this value is non-negative int last_frame_in_anim;// last frame in the current animation Vector frame_delta; // current movement from this frame Vector total_delta; // total unprocessed movement Vector next_anim_delta; // total delta of next animation float next_anim_time; // total time of next animation qboolean animating; // whether the model is currently animating Event *animDoneEvent; float last_animation_time; // the last server frame this model was animated int num_frames_in_gun_anim; // num frames in the gun animation, if there is one // physics variables Vector mins; Vector maxs; Vector absmin; Vector absmax; Vector size; Vector centroid; Vector origin; Vector velocity; Vector avelocity; Vector angles; Vector worldorigin; Vector worldangles; Vector vieworigin; Vector viewangles; int contents; int movetype; int mass; float gravity; // per entity gravity multiplier (1.0 is normal) int gravaxis; // per entity gravity axis edict_t *groundentity; csurface_t *groundsurface; cplane_t groundplane; int groundcontents; int groundentity_linkcount; // Binding variables Entity *bindmaster; str moveteam; Entity *teamchain; Entity *teammaster; float orientation[3][3]; // Model Binding variables int numchildren; int children[MAX_MODEL_CHILDREN]; // targeting variables str target; str targetname; str killtarget; // Character state float health; float max_health; int deadflag; int flags; // underwater variables int watertype; int waterlevel; // Pain and damage variables damage_t takedamage; EntityPtr enemy; float pain_finished; float damage_debounce_time; // tesselation variables int tess_min_size; int tess_max_size; int tess_thickness; float tess_percentage; Entity::Entity(); virtual Entity::~Entity(); void SetEntNum( int num ); void GetEntName( Event *ev ); qboolean DistanceTo( Vector pos ); qboolean DistanceTo( Entity *ent ); qboolean WithinDistance( Vector pos, float dist ); qboolean WithinDistance( Entity *ent, float dist ); const char *Target( void ); void SetTarget( const char *target ); qboolean Targeted( void ); const char *TargetName( void ); void SetTargetName( const char *target ); void SetKillTarget( const char *killtarget ); const char *KillTarget( void ); int modelIndex( const char * mdl ); virtual void setModel( const char *model ); virtual void setModel( str &mdl ); void SetModelEvent( Event *ev ); void hideModel( void ); void EventHideModel( Event *ev ); void showModel( void ); void EventShowModel( Event *ev ); qboolean hidden( void ); void ProcessInitCommandsEvent( Event *ev ); void ProcessInitCommands( int index ); void setAlpha( float alpha ); float alpha( void ); void setMoveType( int type ); int getMoveType( void ); void setSolidType( solid_t type ); int getSolidType( void ); Vector getParentVector( Vector vec ); Vector getLocalVector( Vector vec ); virtual void setSize( Vector min, Vector max ); void setOrigin( Vector org ); qboolean GetBone( const char *name, Vector *pos, Vector *forward, Vector *right, Vector *up ); void setAngles( Vector ang ); void link( void ); void unlink( void ); void setContents( int type ); int getContents( void ); void setScale( float scale ); qboolean droptofloor( float maxfall ); qboolean isClient( void ); virtual void SetDeltaAngles( void ); virtual void DamageEvent( Event *event ); virtual void Damage( Entity *inflictor, Entity *attacker, int damage, Vector position, Vector direction, Vector normal, int knockback, int flags, int meansofdeath, int groupnum, int trinum, float damage_multiplier ); virtual qboolean CanDamage( Entity *target ); qboolean IsTouching( Entity *e1 ); void NextAnim( int animnum ); void NextFrame( int framenum ); void AnimateFrame( void ); void StopAnimating( void ); void StartAnimating( void ); void RandomAnimate( const char *animname, Event *endevent ); void RandomAnimate( const char *animname, Event &endevent ); qboolean HasAnim( const char *animname ); void joinTeam( Entity *teammember ); void quitTeam( void ); void EventQuitTeam( Event *ev ); qboolean isBoundTo( Entity *master ); void bind( Entity *master ); void unbind( void ); void EventUnbind( Event *ev ); void FadeOut( Event *ev ); void Fade( Event *ev ); virtual void CheckGround( void ); virtual qboolean HitSky( trace_t *trace ); virtual qboolean HitSky( void ); void BecomeSolid( Event *ev ); void BecomeNonSolid( Event *ev ); void PlaySound( Event *ev ); void StopSound( Event *ev ); void SetGravityAxis( int axis ); void GravityAxisEvent( Event *ev ); void BindEvent( Event *ev ); void JoinTeam( Event *ev ); void SetHealth( Event *ev ); void SetSize( Event *ev ); void SetScale( Event *ev ); void SetAlpha( Event *ev ); void SetOrigin( Event *ev ); void SetTargetName( Event *ev ); void SetTarget( Event *ev ); void SetKillTarget( Event *ev ); void SetAngles( Event *ev ); void CourseAnglesEvent( Event *ev ); void SmoothAnglesEvent( Event *ev ); str GetRandomAlias( str name ); void SetWaterType( void ); // model binding functions qboolean attach( int parent_entity_num, int group_num, int tri_num, Vector orient ); void detach( void ); void RegisterAlias( Event *ev ); void RegisterAliasAndCache( Event *ev ); qboolean GlobalAliasExists( const char *name ); qboolean AliasExists( const char *name ); virtual void positioned_sound( Vector origin, str soundname, float volume = 1.0f, int channel = CHAN_BODY, int attenuation = ATTN_NORM, float pitch = 1.0f, float timeofs = 0, float fadetime = 0, int flags = SOUND_SYNCH ); virtual void sound( str soundname, float volume = 1.0f, int channel = CHAN_BODY, int attenuation = ATTN_NORM, float pitch = 1.0f, float timeofs = 0, float fadetime = 0, int flags = SOUND_SYNCH ); virtual void stopsound( int channel ); virtual void RandomPositionedSound( Vector origin, str soundname, float volume = 1.0f, int channel = CHAN_BODY, int attenuation = ATTN_NORM, float pitch = 1.0f, float timeofs = 0, float fadetime = 0, int flags = SOUND_SYNCH ); void RandomSound( str soundname, float volume = 1.0f, int channel = CHAN_BODY, int attenuation = ATTN_NORM, float pitch = 1.0f, float timeofs = 0, float fadetime = 0, int flags = SOUND_SYNCH ); void RandomGlobalSound( str soundname, float volume = 1.0f, int channel = CHAN_BODY, int attenuation = ATTN_NORM, float pitch = 1.0f, float timeofs = 0, float fadetime = 0, int flags = SOUND_SYNCH ); void RandomGlobalEntitySound( str soundname, int attenuation = ATTN_IDLE ); void RandomGlobalEntitySoundEvent( Event *ev ); void RandomSound( Event *ev ); void EntitySound( Event *ev ); void StopEntitySound( Event *ev ); void RandomEntitySound( Event *ev ); void AnimEvent( Event *ev ); void StartAnimatingEvent( Event *ev ); void StopAnimatingEvent( Event *ev ); void EndAnimEvent( Event *ev ); void NextAnimEvent( Event *ev ); void NextFrameEvent( Event *ev ); void PrevFrameEvent( Event *ev ); void SetFrameEvent( Event *ev ); void SetLight(Event *ev); void LightOn(Event *ev); void LightOff(Event *ev); void LightRed(Event *ev); void LightGreen(Event *ev); void LightBlue(Event *ev); void LightRadius(Event *ev); void Tesselate(Event *ev); void SetShatterMinSize(Event *ev); void SetShatterMaxSize(Event *ev); void SetShatterThickness(Event *ev); void SetShatterPercentage(Event *ev); void Flags( Event *ev ); void Effects( Event *ev ); void RenderEffects( Event *ev ); void BroadcastSound( Event *soundevent, int channel, Event &event, float radius ); void WeaponSound( Event *ev ); void MovementSound( Event *ev ); void PainSound( Event *ev ); void DeathSound( Event *ev ); void BreakingSound( Event *ev ); void DoorSound( Event *ev ); void MutantSound( Event *ev ); void VoiceSound( Event *ev ); void MachineSound( Event *ev ); void RadioSound( Event *ev ); void SpawnParticles( Event *ev ); void Kill( Event *ev ); void GroupModelEvent( Event *ev ); virtual void Prethink( void ); virtual void Postthink( void ); void DamageSkin( trace_t * trace, float damage ); virtual void DialogEvent( Event *ev ); void PHSSound( Event *ev ); void RandomPHSSound( Event *ev ); void AttachEvent( Event *ev ); void AttachModelEvent( Event *ev ); void DetachEvent( Event *ev ); void TakeDamageEvent( Event *ev ); void NoDamageEvent( Event *ev ); void SetSkinEvent( Event *ev ); void Lightoffset( Event *ev ); void Gravity( Event *ev ); void Minlight( Event *ev ); void GiveOxygen( float time ); void UseBoundingBoxEvent( Event *ev ); void HurtEvent( Event *ev ); void IfSkillEvent( Event *ev ); void SetMassEvent( Event *ev ); void Censor( Event *ev ); void Ghost( Event *ev ); virtual void Archive( Archiver &arc ); virtual void Unarchive( Archiver &arc ); }; inline EXPORT_FROM_DLL qboolean Entity::DistanceTo ( Vector pos ) { Vector delta; delta = worldorigin - pos; return delta.length(); } inline EXPORT_FROM_DLL qboolean Entity::DistanceTo ( Entity *ent ) { Vector delta; assert( ent ); if ( !ent ) { // "Infinite" distance return 999999; } delta = worldorigin - ent->worldorigin; return delta.length(); } inline EXPORT_FROM_DLL qboolean Entity::WithinDistance ( Vector pos, float dist ) { Vector delta; delta = worldorigin - pos; // check squared distance return ( ( delta * delta ) < ( dist * dist ) ); } inline EXPORT_FROM_DLL qboolean Entity::WithinDistance ( Entity *ent, float dist ) { Vector delta; assert( ent ); if ( !ent ) { return false; } delta = worldorigin - ent->worldorigin; // check squared distance return ( ( delta * delta ) < ( dist * dist ) ); } inline EXPORT_FROM_DLL const char *Entity::Target ( void ) { return target.c_str(); } inline EXPORT_FROM_DLL qboolean Entity::Targeted ( void ) { if ( !targetname.length() ) { return false; } return true; } inline EXPORT_FROM_DLL const char *Entity::TargetName ( void ) { return targetname.c_str(); } inline EXPORT_FROM_DLL const char * Entity::KillTarget ( void ) { return killtarget.c_str(); } inline EXPORT_FROM_DLL qboolean Entity::hidden ( void ) { if ( edict->s.renderfx & RF_DONTDRAW ) { return true; } return false; } inline EXPORT_FROM_DLL void Entity::setModel ( str &mdl ) { setModel( mdl.c_str() ); } inline EXPORT_FROM_DLL void Entity::SetModelEvent ( Event *ev ) { setModel( ev->GetString( 1 ) ); } inline EXPORT_FROM_DLL void Entity::hideModel ( void ) { edict->s.renderfx |= RF_DONTDRAW; if ( getSolidType() <= SOLID_TRIGGER ) { edict->svflags |= SVF_NOCLIENT; } } inline EXPORT_FROM_DLL void Entity::showModel ( void ) { edict->s.renderfx &= ~RF_DONTDRAW; edict->svflags &= ~SVF_NOCLIENT; } inline EXPORT_FROM_DLL float Entity::alpha ( void ) { return 1.0f - translucence; } inline EXPORT_FROM_DLL void Entity::setMoveType ( int type ) { movetype = type; } inline EXPORT_FROM_DLL int Entity::getMoveType ( void ) { return movetype; } inline EXPORT_FROM_DLL int Entity::getSolidType ( void ) { return edict->solid; } inline EXPORT_FROM_DLL void Entity::unlink ( void ) { gi.unlinkentity( edict ); } inline EXPORT_FROM_DLL void Entity::setContents ( int type ) { contents = type; } inline EXPORT_FROM_DLL int Entity::getContents ( void ) { return contents; } inline EXPORT_FROM_DLL qboolean Entity::isClient ( void ) { if ( client ) { return true; } return false; } inline EXPORT_FROM_DLL void Entity::SetDeltaAngles ( void ) { int i; if ( client ) { for( i = 0; i < 3; i++ ) { client->ps.pmove.delta_angles[ i ] = ANGLE2SHORT( client->ps.viewangles[ i ] ); } } } inline EXPORT_FROM_DLL void Entity::RandomAnimate ( const char *animname, Event &endevent ) { Event *ev; ev = new Event( endevent ); RandomAnimate( animname, ev ); } inline EXPORT_FROM_DLL qboolean Entity::HasAnim ( const char *animname ) { int num; num = gi.Anim_Random( edict->s.modelindex, animname ); return ( num >= 0 ); } inline EXPORT_FROM_DLL qboolean Entity::GlobalAliasExists ( const char *name ) { assert( name ); return ( gi.GlobalAlias_FindRandom( name ) != NULL ); } inline EXPORT_FROM_DLL qboolean Entity::AliasExists ( const char *name ) { assert( name ); return ( gi.Alias_FindRandom( edict->s.modelindex, name ) != NULL ); } inline EXPORT_FROM_DLL void Entity::stopsound ( int channel ) { RandomGlobalSound( "null_sound", 0.1, channel, 0 ); } inline EXPORT_FROM_DLL str Entity::GetRandomAlias ( str name ) { str realname; const char *s; s = gi.Alias_FindRandom( edict->s.modelindex, name.c_str() ); if ( s ) { realname = s; } return realname; } inline EXPORT_FROM_DLL qboolean Entity::HitSky ( trace_t *trace ) { assert( trace ); if ( trace->surface && ( trace->surface->flags & SURF_SKY ) ) { return true; } return false; } inline EXPORT_FROM_DLL qboolean Entity::HitSky ( void ) { return HitSky( &level.impact_trace ); } inline EXPORT_FROM_DLL void Entity::Archive ( Archiver &arc ) { Listener::Archive( arc ); G_ArchiveEdict( arc, edict ); arc.WriteInteger( spawnflags ); arc.WriteFloat( translucence ); arc.WriteInteger( viewheight ); arc.WriteInteger( light_level ); arc.WriteString( model ); arc.WriteInteger( next_anim ); arc.WriteInteger( next_frame ); arc.WriteInteger( last_frame_in_anim ); arc.WriteVector( frame_delta ); arc.WriteVector( total_delta ); arc.WriteVector( next_anim_delta ); arc.WriteFloat( next_anim_time ); arc.WriteBoolean( animating ); arc.WriteEvent( *animDoneEvent ); arc.WriteFloat( last_animation_time ); arc.WriteInteger( num_frames_in_gun_anim ); arc.WriteVector( mins ); arc.WriteVector( maxs ); arc.WriteVector( absmin ); arc.WriteVector( absmax ); arc.WriteVector( size ); arc.WriteVector( centroid ); arc.WriteVector( origin ); arc.WriteVector( velocity ); arc.WriteVector( avelocity ); arc.WriteVector( angles ); arc.WriteVector( worldorigin ); arc.WriteVector( worldangles ); arc.WriteRaw( orientation, sizeof( orientation ) ); arc.WriteVector( vieworigin ); arc.WriteVector( viewangles ); arc.WriteInteger( contents ); arc.WriteInteger( movetype ); arc.WriteInteger( mass ); arc.WriteFloat( gravity ); arc.WriteInteger( gravaxis ); if ( groundentity ) { arc.WriteInteger( groundentity - g_edicts ); } else { arc.WriteInteger( -1 ); } arc.WriteRaw( &groundplane, sizeof( groundplane ) ); arc.WriteInteger( groundcontents ); arc.WriteInteger( groundentity_linkcount ); arc.WriteObjectPointer( bindmaster ); arc.WriteString( moveteam ); arc.WriteObjectPointer( teamchain ); arc.WriteObjectPointer( teammaster ); arc.WriteInteger( numchildren ); arc.WriteRaw( children, sizeof( children ) ); arc.WriteString( target ); arc.WriteString( targetname ); // add to target list to rebuild targetlists arc.WriteString( killtarget ); arc.WriteFloat( health ); arc.WriteFloat( max_health ); arc.WriteInteger( deadflag ); arc.WriteInteger( flags ); arc.WriteInteger( watertype ); arc.WriteInteger( waterlevel ); arc.WriteInteger( ( int )takedamage ); arc.WriteSafePointer( enemy ); arc.WriteFloat( pain_finished ); arc.WriteFloat( damage_debounce_time ); arc.WriteInteger( tess_min_size ); arc.WriteInteger( tess_max_size ); arc.WriteInteger( tess_thickness ); arc.WriteFloat( tess_percentage ); } inline EXPORT_FROM_DLL void Entity::Unarchive ( Archiver &arc ) { int temp; Listener::Unarchive( arc ); G_UnarchiveEdict( arc, edict ); arc.ReadInteger( &spawnflags ); arc.ReadFloat( &translucence ); arc.ReadInteger( &viewheight ); arc.ReadInteger( &light_level ); arc.ReadString( &model ); setModel( model ); arc.ReadInteger( &next_anim ); arc.ReadInteger( &next_frame ); arc.ReadInteger( &last_frame_in_anim ); arc.ReadVector( &frame_delta ); arc.ReadVector( &total_delta ); arc.ReadVector( &next_anim_delta ); arc.ReadFloat( &next_anim_time ); arc.ReadBoolean( &animating ); animDoneEvent = new Event( arc.ReadEvent() ); arc.ReadFloat( &last_animation_time ); arc.ReadInteger( &num_frames_in_gun_anim ); arc.ReadVector( &mins ); arc.ReadVector( &maxs ); arc.ReadVector( &absmin ); arc.ReadVector( &absmax ); arc.ReadVector( &size ); arc.ReadVector( ¢roid ); arc.ReadVector( &origin ); arc.ReadVector( &velocity ); arc.ReadVector( &avelocity ); arc.ReadVector( &angles ); arc.ReadVector( &worldorigin ); arc.ReadVector( &worldangles ); arc.ReadRaw( orientation, sizeof( orientation ) ); arc.ReadVector( &vieworigin ); arc.ReadVector( &viewangles ); arc.ReadInteger( &contents ); arc.ReadInteger( &movetype ); arc.ReadInteger( &mass ); arc.ReadFloat( &gravity ); arc.ReadInteger( &gravaxis ); temp = arc.ReadInteger(); if ( temp == -1 ) groundentity = NULL; else groundentity = &g_edicts[ temp ]; groundsurface = NULL; arc.ReadRaw( &groundplane, sizeof( groundplane ) ); arc.ReadInteger( &groundcontents ); arc.ReadInteger( &groundentity_linkcount ); arc.ReadObjectPointer( ( Class ** )&bindmaster ); arc.ReadString( &moveteam ); arc.ReadObjectPointer( ( Class ** )&teamchain ); arc.ReadObjectPointer( ( Class ** )&teammaster ); arc.ReadInteger( &numchildren ); arc.ReadRaw( children, sizeof( children ) ); arc.ReadString( &target ); arc.ReadString( &targetname ); arc.ReadString( &killtarget ); // reset target stuff SetTargetName( targetname.c_str() ); SetTarget( target.c_str() ); arc.ReadFloat( &health ); arc.ReadFloat( &max_health ); arc.ReadInteger( &deadflag ); arc.ReadInteger( &flags ); arc.ReadInteger( &watertype ); arc.ReadInteger( &waterlevel ); temp = arc.ReadInteger(); takedamage = ( damage_t )temp; arc.ReadSafePointer( &enemy ); arc.ReadFloat( &pain_finished ); arc.ReadFloat( &damage_debounce_time ); arc.ReadInteger( &tess_min_size ); arc.ReadInteger( &tess_max_size ); arc.ReadInteger( &tess_thickness ); arc.ReadFloat( &tess_percentage ); } #include "worldspawn.h" #endif