struct edict_s From g_local.h

	typedef	struct	edict_s	edict_t;

struct edict_s
	entity_state_t	s;
	struct gclient_s	*client;	// NULL if not a player
						// the server expects the first part
						// of gclient_s to be a player_state_t
						// but the rest of it is opaque

	qboolean	inuse;
	int		linkcount;

	// FIXME: move these fields to a server private sv_entity_t
	link_t		area;				// linked to a division node or leaf

	int		num_clusters;			// if -1, use headnode instead
	int		clusternums[MAX_ENT_CLUSTERS];
	int		headnode;			// unused if num_clusters != -1
	int		areanum, areanum2;


	int		svflags;
	vec3_t		mins, maxs;
	vec3_t		absmin, absmax, size;
	solid_t		solid;
	int			clipmask;
	edict_t		*owner;


	int		movetype;
	int		flags;

	char		*model;
	float		freetime;		// sv.time when the object was freed
	// only used locally in game, not by server
	char		*message;
	char		*classname;
	int		spawnflags;

	float		timestamp;

	float		angle;			// set in qe3, -1 = up, -2 = down
	char		*target;
	char		*targetname;
	char		*killtarget;
	char		*team;
	char		*pathtarget;
	char		*deathtarget;
	char		*combattarget;
	edict_t		*target_ent;

	float		speed, accel, decel;
	vec3_t		movedir;
	vec3_t		pos1, pos2;

	vec3_t		velocity;
	vec3_t		avelocity;
	int		mass;
	float		air_finished;
	float		gravity;		// per entity gravity multiplier (1.0 is normal)
						// use for lowgrav artifact, flares

	edict_t		*goalentity;
	edict_t		*movetarget;
	float		yaw_speed;
	float		ideal_yaw;

	float		nextthink;
	void		(*prethink) (edict_t *ent);
	void		(*think)(edict_t *self);
	void		(*blocked)(edict_t *self, edict_t *other);	//move to moveinfo?
	void		(*touch)(edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf);
	void		(*use)(edict_t *self, edict_t *other, edict_t *activator);
	void		(*pain)(edict_t *self, edict_t *other, float kick, int damage);
	void		(*die)(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point);

	float		touch_debounce_time;		// are all these legit?  do we need more/less of them?
	float		pain_debounce_time;
	float		damage_debounce_time;
	float		fly_sound_debounce_time;	//move to clientinfo
	float		last_move_time;

	int		health;
	int		max_health;
	int		gib_health;
	int		deadflag;
	qboolean	show_hostile;

	float		powerarmor_time;

	char		*map;			// target_changelevel

	int		viewheight;		// height above origin where eyesight is determined
	int		takedamage;
	int		dmg;
	int		radius_dmg;
	float		dmg_radius;
	int		sounds;			//make this a spawntemp var?
	int		count;

	edict_t		*chain;
	edict_t		*enemy;
	edict_t		*oldenemy;
	edict_t		*activator;
	edict_t		*groundentity;
	int			groundentity_linkcount;
	edict_t		*teamchain;
	edict_t		*teammaster;

	edict_t		*mynoise;		// can go in client only
	edict_t		*mynoise2;

	int		noise_index;
	int		noise_index2;
	float		volume;
	float		attenuation;

	// timing variables
	float		wait;
	float		delay;			// before firing targets
	float		random;

	float		teleport_time;

	int		watertype;
	int		waterlevel;

	vec3_t		move_origin;
	vec3_t		move_angles;

	// move this to clientinfo?
	int		light_level;

	int		style;			// also used as areaportal number

	gitem_t		*item;			// for bonus items

	// common data blocks
	moveinfo_t	moveinfo;
	monsterinfo_t	monsterinfo;