1 /*
2 ===========================================================================
3 Copyright (C) 2000 - 2013, Raven Software, Inc.
4 Copyright (C) 2001 - 2013, Activision, Inc.
5 Copyright (C) 2013 - 2015, OpenJK contributors
6 
7 This file is part of the OpenJK source code.
8 
9 OpenJK is free software; you can redistribute it and/or modify it
10 under the terms of the GNU General Public License version 2 as
11 published by the Free Software Foundation.
12 
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 GNU General Public License for more details.
17 
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, see <http://www.gnu.org/licenses/>.
20 ===========================================================================
21 */
22 
23 #ifndef __G_SHARED_H__
24 #define __G_SHARED_H__
25 
26 #include "bg_public.h"
27 #include "g_public.h"
28 #include "b_public.h"
29 #include "../icarus/StdAfx.h"	//need stl
30 #include "../rd-common/tr_types.h"
31 #include "../cgame/cg_public.h"
32 #include "g_vehicles.h"
33 #include "hitlocs.h"
34 #include "bset.h"
35 
36 #define	FOFS(x) offsetof(gentity_t, x)
37 
38 typedef enum //# taskID_e
39 {
40 	TID_CHAN_VOICE = 0,	// Waiting for a voice sound to complete
41 	TID_ANIM_UPPER,		// Waiting to finish a lower anim holdtime
42 	TID_ANIM_LOWER,		// Waiting to finish a lower anim holdtime
43 	TID_ANIM_BOTH,		// Waiting to finish lower and upper anim holdtimes or normal md3 animating
44 	TID_MOVE_NAV,		// Trying to get to a navgoal or For ET_MOVERS
45 	TID_ANGLE_FACE,		// Turning to an angle or facing
46 	TID_BSTATE,			// Waiting for a certain bState to finish
47 	TID_LOCATION,		// Waiting for ent to enter a specific trigger_location
48 //	TID_MISSIONSTATUS,	// Waiting for player to finish reading MISSION STATUS SCREEN
49 	TID_RESIZE,			// Waiting for clear bbox to inflate size
50 	TID_SHOOT,			// Waiting for fire event
51 	NUM_TIDS,			// for def of taskID array
52 } taskID_t;
53 
54 
55 typedef enum //# material_e
56 {
57 	MAT_METAL = 0,	// scorched blue-grey metal
58 	MAT_GLASS,		// not a real chunk type, just plays an effect with glass sprites
59 	MAT_ELECTRICAL,	// sparks only
60 	MAT_ELEC_METAL,	// sparks/electrical type metal
61 	MAT_DRK_STONE,	// brown
62 	MAT_LT_STONE,	// tan
63 	MAT_GLASS_METAL,// glass sprites and METAl chunk
64 	MAT_METAL2,		// electrical metal type
65 	MAT_NONE,		// no chunks
66 	MAT_GREY_STONE,	// grey
67 	MAT_METAL3,		// METAL and METAL2 chunks
68 	MAT_CRATE1,		// yellow multi-colored crate chunks
69 	MAT_GRATE1,		// grate chunks
70 	MAT_ROPE,		// for yavin trial...no chunks, just wispy bits
71 	MAT_CRATE2,		// read multi-colored crate chunks
72 	MAT_WHITE_METAL,// white angular chunks
73 
74 	NUM_MATERIALS
75 
76 } material_t;
77 
78 //===From cg_local.h================================================
79 #define	DEFAULT_HEADMODEL	""
80 #define	DEFAULT_TORSOMODEL	""
81 #define	DEFAULT_LEGSMODEL	"mouse"
82 
83 // each client has an associated clientInfo_t
84 // that contains media references necessary to present the
85 // client model and other color coded effects
86 // this is regenerated each time a userinfo configstring changes
87 
88 #define	MAX_CUSTOM_BASIC_SOUNDS	14
89 #define	MAX_CUSTOM_COMBAT_SOUNDS	17
90 #define	MAX_CUSTOM_EXTRA_SOUNDS	36
91 #define	MAX_CUSTOM_JEDI_SOUNDS	22
92 #define	MAX_CUSTOM_SOUNDS	(MAX_CUSTOM_JEDI_SOUNDS + MAX_CUSTOM_EXTRA_SOUNDS + MAX_CUSTOM_COMBAT_SOUNDS + MAX_CUSTOM_BASIC_SOUNDS)
93 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!!
94 class clientInfo_t
95 {
96 public:
97 	qboolean		infoValid;
98 
99 	char			name[MAX_QPATH];
100 	team_t			team;
101 
102 	int				score;			// updated by score servercmds
103 
104 	int				handicap;
105 
106 	qhandle_t		legsModel;
107 	qhandle_t		legsSkin;
108 
109 	qhandle_t		torsoModel;
110 	qhandle_t		torsoSkin;
111 
112 	qhandle_t		headModel;
113 	qhandle_t		headSkin;
114 
115 	int				animFileIndex;
116 
117 	sfxHandle_t		sounds[MAX_CUSTOM_SOUNDS];
118 
119 	char			*customBasicSoundDir;
120 	char			*customCombatSoundDir;
121 	char			*customExtraSoundDir;
122 	char			*customJediSoundDir;
123 
124 
sg_export(ojk::SavedGameHelper & saved_game)125 	void sg_export(
126 		ojk::SavedGameHelper& saved_game) const
127 	{
128 		saved_game.write<int32_t>(infoValid);
129 		saved_game.write<int8_t>(name);
130 		saved_game.write<int32_t>(team);
131 		saved_game.write<int32_t>(score);
132 		saved_game.write<int32_t>(handicap);
133 		saved_game.write<int32_t>(legsModel);
134 		saved_game.write<int32_t>(legsSkin);
135 		saved_game.write<int32_t>(torsoModel);
136 		saved_game.write<int32_t>(torsoSkin);
137 		saved_game.write<int32_t>(headModel);
138 		saved_game.write<int32_t>(headSkin);
139 		saved_game.write<int32_t>(animFileIndex);
140 		saved_game.write<int32_t>(sounds);
141 		saved_game.write<int32_t>(customBasicSoundDir);
142 		saved_game.write<int32_t>(customCombatSoundDir);
143 		saved_game.write<int32_t>(customExtraSoundDir);
144 		saved_game.write<int32_t>(customJediSoundDir);
145 	}
146 
sg_import(ojk::SavedGameHelper & saved_game)147 	void sg_import(
148 		ojk::SavedGameHelper& saved_game)
149 	{
150 		saved_game.read<int32_t>(infoValid);
151 		saved_game.read<int8_t>(name);
152 		saved_game.read<int32_t>(team);
153 		saved_game.read<int32_t>(score);
154 		saved_game.read<int32_t>(handicap);
155 		saved_game.read<int32_t>(legsModel);
156 		saved_game.read<int32_t>(legsSkin);
157 		saved_game.read<int32_t>(torsoModel);
158 		saved_game.read<int32_t>(torsoSkin);
159 		saved_game.read<int32_t>(headModel);
160 		saved_game.read<int32_t>(headSkin);
161 		saved_game.read<int32_t>(animFileIndex);
162 		saved_game.read<int32_t>(sounds);
163 		saved_game.read<int32_t>(customBasicSoundDir);
164 		saved_game.read<int32_t>(customCombatSoundDir);
165 		saved_game.read<int32_t>(customExtraSoundDir);
166 		saved_game.read<int32_t>(customJediSoundDir);
167 	}
168 }; // clientInfo_t
169 
170 
171 //==================================================================
172 typedef enum
173 {
174 	MOVER_POS1,
175 	MOVER_POS2,
176 	MOVER_1TO2,
177 	MOVER_2TO1
178 } moverState_t;
179 
180 // Rendering information structure
181 
182 
183 typedef enum
184 {
185 	MODEL_LEGS = 0,
186 	MODEL_TORSO,
187 	MODEL_HEAD,
188 	MODEL_WEAPON1,
189 	MODEL_WEAPON2,
190 	MODEL_WEAPON3,
191 	MODEL_EXTRA1,
192 	MODEL_EXTRA2,
193 	NUM_TARGET_MODELS
194 } targetModel_t;
195 
196 //renderFlags
197 #define	RF_LOCKEDANGLE	1
198 
199 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!!
200 class renderInfo_t
201 {
202 public:
203 	// Legs model, or full model on one piece entities
204 
205 	union
206 	{
207 		char	legsModelName[32];		// -slc[]
208 		char	modelName[32];			// -slc[]
209 	};
210 
211 	char	torsoModelName[32];			// -slc[]
212 	char	headModelName[32];			// -slc[]
213 
214 	//In whole degrees, How far to let the different model parts yaw and pitch
215 	int		headYawRangeLeft;
216 	int		headYawRangeRight;
217 	int		headPitchRangeUp;
218 	int		headPitchRangeDown;
219 
220 	int		torsoYawRangeLeft;
221 	int		torsoYawRangeRight;
222 	int		torsoPitchRangeUp;
223 	int		torsoPitchRangeDown;
224 
225 	int		legsFrame;
226 	int		torsoFrame;
227 
228 	float	legsFpsMod;
229 	float	torsoFpsMod;
230 
231 	//Fields to apply to entire model set, individual model's equivalents will modify this value
232 	byte	customRGBA[4];//Red Green Blue, 0 = don't apply
233 
234 	//Allow up to 4 PCJ lookup values to be stored here.
235 	//The resolve to configstrings which contain the name of the
236 	//desired bone.
237 	int		boneIndex1;
238 	int		boneIndex2;
239 	int		boneIndex3;
240 	int		boneIndex4;
241 
242 	//packed with x, y, z orientations for bone angles
243 	int		boneOrient;
244 
245 	//I.. feel bad for doing this, but NPCs really just need to
246 	//be able to control this sort of thing from the server sometimes.
247 	//At least it's at the end so this stuff is never going to get sent
248 	//over for anything that isn't an NPC.
249 	vec3_t	boneAngles1; //angles of boneIndex1
250 	vec3_t	boneAngles2; //angles of boneIndex2
251 	vec3_t	boneAngles3; //angles of boneIndex3
252 	vec3_t	boneAngles4; //angles of boneIndex4
253 
254 	//RF?
255 	int			renderFlags;
256 
257 	//
258 	vec3_t		muzzlePoint;
259 	vec3_t		muzzleDir;
260 	vec3_t		muzzlePointOld;
261 	vec3_t		muzzleDirOld;
262 	//vec3_t		muzzlePointNext;	// Muzzle point one server frame in the future!
263 	//vec3_t		muzzleDirNext;
264 	int			mPCalcTime;//Last time muzzle point was calced
265 
266 	//
267 	float		lockYaw;//
268 
269 	//
270 	vec3_t		headPoint;//Where your tag_head is
271 	vec3_t		headAngles;//where the tag_head in the torso is pointing
272 	vec3_t		handRPoint;//where your right hand is
273 	vec3_t		handLPoint;//where your left hand is
274 	vec3_t		crotchPoint;//Where your crotch is
275 	vec3_t		footRPoint;//where your right hand is
276 	vec3_t		footLPoint;//where your left hand is
277 	vec3_t		torsoPoint;//Where your chest is
278 	vec3_t		torsoAngles;//Where the chest is pointing
279 	vec3_t		eyePoint;//Where your eyes are
280 	vec3_t		eyeAngles;//Where your eyes face
281 	int			lookTarget;//Which ent to look at with lookAngles
282 	lookMode_t	lookMode;
283 	int			lookTargetClearTime;//Time to clear the lookTarget
284 	int			lastVoiceVolume;//Last frame's voice volume
285 	vec3_t		lastHeadAngles;//Last headAngles, NOT actual facing of head model
286 	vec3_t		headBobAngles;//headAngle offsets
287 	vec3_t		targetHeadBobAngles;//head bob angles will try to get to targetHeadBobAngles
288 	int			lookingDebounceTime;//When we can stop using head looking angle behavior
289 	float		legsYaw;//yaw angle your legs are actually rendering at
290 
291 
sg_export(ojk::SavedGameHelper & saved_game)292 	void sg_export(
293 		ojk::SavedGameHelper& saved_game) const
294 	{
295 		saved_game.write<int8_t>(legsModelName);
296 		saved_game.write<int8_t>(torsoModelName);
297 		saved_game.write<int8_t>(headModelName);
298 		saved_game.write<int32_t>(headYawRangeLeft);
299 		saved_game.write<int32_t>(headYawRangeRight);
300 		saved_game.write<int32_t>(headPitchRangeUp);
301 		saved_game.write<int32_t>(headPitchRangeDown);
302 		saved_game.write<int32_t>(torsoYawRangeLeft);
303 		saved_game.write<int32_t>(torsoYawRangeRight);
304 		saved_game.write<int32_t>(torsoPitchRangeUp);
305 		saved_game.write<int32_t>(torsoPitchRangeDown);
306 		saved_game.write<int32_t>(legsFrame);
307 		saved_game.write<int32_t>(torsoFrame);
308 		saved_game.write<float>(legsFpsMod);
309 		saved_game.write<float>(torsoFpsMod);
310 		saved_game.write<uint8_t>(customRGBA);
311 		saved_game.write<int32_t>(boneIndex1);
312 		saved_game.write<int32_t>(boneIndex2);
313 		saved_game.write<int32_t>(boneIndex3);
314 		saved_game.write<int32_t>(boneIndex4);
315 		saved_game.write<int32_t>(boneOrient);
316 		saved_game.write<float>(boneAngles1);
317 		saved_game.write<float>(boneAngles2);
318 		saved_game.write<float>(boneAngles3);
319 		saved_game.write<float>(boneAngles4);
320 		saved_game.write<int32_t>(renderFlags);
321 		saved_game.write<float>(muzzlePoint);
322 		saved_game.write<float>(muzzleDir);
323 		saved_game.write<float>(muzzlePointOld);
324 		saved_game.write<float>(muzzleDirOld);
325 		saved_game.write<int32_t>(mPCalcTime);
326 		saved_game.write<float>(lockYaw);
327 		saved_game.write<float>(headPoint);
328 		saved_game.write<float>(headAngles);
329 		saved_game.write<float>(handRPoint);
330 		saved_game.write<float>(handLPoint);
331 		saved_game.write<float>(crotchPoint);
332 		saved_game.write<float>(footRPoint);
333 		saved_game.write<float>(footLPoint);
334 		saved_game.write<float>(torsoPoint);
335 		saved_game.write<float>(torsoAngles);
336 		saved_game.write<float>(eyePoint);
337 		saved_game.write<float>(eyeAngles);
338 		saved_game.write<int32_t>(lookTarget);
339 		saved_game.write<int32_t>(lookMode);
340 		saved_game.write<int32_t>(lookTargetClearTime);
341 		saved_game.write<int32_t>(lastVoiceVolume);
342 		saved_game.write<float>(lastHeadAngles);
343 		saved_game.write<float>(headBobAngles);
344 		saved_game.write<float>(targetHeadBobAngles);
345 		saved_game.write<int32_t>(lookingDebounceTime);
346 		saved_game.write<float>(legsYaw);
347 	}
348 
sg_import(ojk::SavedGameHelper & saved_game)349 	void sg_import(
350 		ojk::SavedGameHelper& saved_game)
351 	{
352 		saved_game.read<int8_t>(legsModelName);
353 		saved_game.read<int8_t>(torsoModelName);
354 		saved_game.read<int8_t>(headModelName);
355 		saved_game.read<int32_t>(headYawRangeLeft);
356 		saved_game.read<int32_t>(headYawRangeRight);
357 		saved_game.read<int32_t>(headPitchRangeUp);
358 		saved_game.read<int32_t>(headPitchRangeDown);
359 		saved_game.read<int32_t>(torsoYawRangeLeft);
360 		saved_game.read<int32_t>(torsoYawRangeRight);
361 		saved_game.read<int32_t>(torsoPitchRangeUp);
362 		saved_game.read<int32_t>(torsoPitchRangeDown);
363 		saved_game.read<int32_t>(legsFrame);
364 		saved_game.read<int32_t>(torsoFrame);
365 		saved_game.read<float>(legsFpsMod);
366 		saved_game.read<float>(torsoFpsMod);
367 		saved_game.read<uint8_t>(customRGBA);
368 		saved_game.read<int32_t>(boneIndex1);
369 		saved_game.read<int32_t>(boneIndex2);
370 		saved_game.read<int32_t>(boneIndex3);
371 		saved_game.read<int32_t>(boneIndex4);
372 		saved_game.read<int32_t>(boneOrient);
373 		saved_game.read<float>(boneAngles1);
374 		saved_game.read<float>(boneAngles2);
375 		saved_game.read<float>(boneAngles3);
376 		saved_game.read<float>(boneAngles4);
377 		saved_game.read<int32_t>(renderFlags);
378 		saved_game.read<float>(muzzlePoint);
379 		saved_game.read<float>(muzzleDir);
380 		saved_game.read<float>(muzzlePointOld);
381 		saved_game.read<float>(muzzleDirOld);
382 		saved_game.read<int32_t>(mPCalcTime);
383 		saved_game.read<float>(lockYaw);
384 		saved_game.read<float>(headPoint);
385 		saved_game.read<float>(headAngles);
386 		saved_game.read<float>(handRPoint);
387 		saved_game.read<float>(handLPoint);
388 		saved_game.read<float>(crotchPoint);
389 		saved_game.read<float>(footRPoint);
390 		saved_game.read<float>(footLPoint);
391 		saved_game.read<float>(torsoPoint);
392 		saved_game.read<float>(torsoAngles);
393 		saved_game.read<float>(eyePoint);
394 		saved_game.read<float>(eyeAngles);
395 		saved_game.read<int32_t>(lookTarget);
396 		saved_game.read<int32_t>(lookMode);
397 		saved_game.read<int32_t>(lookTargetClearTime);
398 		saved_game.read<int32_t>(lastVoiceVolume);
399 		saved_game.read<float>(lastHeadAngles);
400 		saved_game.read<float>(headBobAngles);
401 		saved_game.read<float>(targetHeadBobAngles);
402 		saved_game.read<int32_t>(lookingDebounceTime);
403 		saved_game.read<float>(legsYaw);
404 	}
405 }; // renderInfo_t
406 
407 // Movement information structure
408 
409 /*
410 typedef struct moveInfo_s	// !!!!!!!!!! LOADSAVE-affecting struct !!!!!!!!
411 {
412 	vec3_t	desiredAngles;	// Desired facing angles
413 	float	speed;	// Speed of movement
414 	float	aspeed;	// Speed of angular movement
415 	vec3_t	moveDir;	// Direction of movement
416 	vec3_t	velocity;	// movement velocity
417 	int		flags;			// Special state flags
418 } moveInfo_t;
419 */
420 
421 typedef enum {
422 	CON_DISCONNECTED,
423 	CON_CONNECTING,
424 	CON_CONNECTED
425 } clientConnected_t;
426 
427 typedef enum {
428 	TEAM_BEGIN,		// Beginning a team game, spawn at base
429 	TEAM_ACTIVE		// Now actively playing
430 } playerTeamStateState_t;
431 
432 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!!
433 class playerTeamState_t
434 {
435 public:
436 	playerTeamStateState_t	state;
437 
438 	int			captures;
439 	int			basedefense;
440 	int			carrierdefense;
441 	int			flagrecovery;
442 	int			fragcarrier;
443 	int			assists;
444 
445 	float		lasthurtcarrier;
446 	float		lastreturnedflag;
447 	float		flagsince;
448 	float		lastfraggedcarrier;
449 
450 
sg_export(ojk::SavedGameHelper & saved_game)451 	void sg_export(
452 		ojk::SavedGameHelper& saved_game) const
453 	{
454 		saved_game.write<int32_t>(state);
455 		saved_game.write<int32_t>(captures);
456 		saved_game.write<int32_t>(basedefense);
457 		saved_game.write<int32_t>(carrierdefense);
458 		saved_game.write<int32_t>(flagrecovery);
459 		saved_game.write<int32_t>(fragcarrier);
460 		saved_game.write<int32_t>(assists);
461 		saved_game.write<float>(lasthurtcarrier);
462 		saved_game.write<float>(lastreturnedflag);
463 		saved_game.write<float>(flagsince);
464 		saved_game.write<float>(lastfraggedcarrier);
465 	}
466 
sg_import(ojk::SavedGameHelper & saved_game)467 	void sg_import(
468 		ojk::SavedGameHelper& saved_game)
469 	{
470 		saved_game.read<int32_t>(state);
471 		saved_game.read<int32_t>(captures);
472 		saved_game.read<int32_t>(basedefense);
473 		saved_game.read<int32_t>(carrierdefense);
474 		saved_game.read<int32_t>(flagrecovery);
475 		saved_game.read<int32_t>(fragcarrier);
476 		saved_game.read<int32_t>(assists);
477 		saved_game.read<float>(lasthurtcarrier);
478 		saved_game.read<float>(lastreturnedflag);
479 		saved_game.read<float>(flagsince);
480 		saved_game.read<float>(lastfraggedcarrier);
481 	}
482 }; // playerTeamState_t
483 
484 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!!
485 class objectives_t
486 {
487 public:
488 	qboolean	display;	// A displayable objective?
489 	int			status;	// Succeed or fail or pending
490 
491 
sg_export(ojk::SavedGameHelper & saved_game)492 	void sg_export(
493 		ojk::SavedGameHelper& saved_game) const
494 	{
495 		saved_game.write<int32_t>(display);
496 		saved_game.write<int32_t>(status);
497 	}
498 
sg_import(ojk::SavedGameHelper & saved_game)499 	void sg_import(
500 		ojk::SavedGameHelper& saved_game)
501 	{
502 		saved_game.read<int32_t>(display);
503 		saved_game.read<int32_t>(status);
504 	}
505 }; // objectives_t
506 // NOTE: This is an arbitrary number greater than our current number of objectives with
507 // some fluff just in case we add more in the future.
508 #define MAX_MISSION_OBJ 100
509 
510 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!!
511 class missionStats_t
512 {
513 public:
514 	int				secretsFound;					// # of secret areas found
515 	int				totalSecrets;					// # of secret areas that could have been found
516 	int				shotsFired;						// total number of shots fired
517 	int				hits;							// Shots that did damage
518 	int				enemiesSpawned;					// # of enemies spawned
519 	int				enemiesKilled;					// # of enemies killed
520 	int				saberThrownCnt;					// # of times saber was thrown
521 	int				saberBlocksCnt;					// # of times saber was used to block
522 	int				legAttacksCnt;					// # of times legs were hit with saber
523 	int				armAttacksCnt;					// # of times arm were hit with saber
524 	int				torsoAttacksCnt;				// # of times torso was hit with saber
525 	int				otherAttacksCnt;				// # of times anything else on a monster was hit with saber
526 	int				forceUsed[NUM_FORCE_POWERS];	// # of times each force power was used
527 	int				weaponUsed[WP_NUM_WEAPONS];		// # of times each weapon was used
528 
529 
sg_export(ojk::SavedGameHelper & saved_game)530 	void sg_export(
531 		ojk::SavedGameHelper& saved_game) const
532 	{
533 		saved_game.write<int32_t>(secretsFound);
534 		saved_game.write<int32_t>(totalSecrets);
535 		saved_game.write<int32_t>(shotsFired);
536 		saved_game.write<int32_t>(hits);
537 		saved_game.write<int32_t>(enemiesSpawned);
538 		saved_game.write<int32_t>(enemiesKilled);
539 		saved_game.write<int32_t>(saberThrownCnt);
540 		saved_game.write<int32_t>(saberBlocksCnt);
541 		saved_game.write<int32_t>(legAttacksCnt);
542 		saved_game.write<int32_t>(armAttacksCnt);
543 		saved_game.write<int32_t>(torsoAttacksCnt);
544 		saved_game.write<int32_t>(otherAttacksCnt);
545 		saved_game.write<int32_t>(forceUsed);
546 		saved_game.write<int32_t>(weaponUsed);
547 	}
548 
sg_import(ojk::SavedGameHelper & saved_game)549 	void sg_import(
550 		ojk::SavedGameHelper& saved_game)
551 	{
552 		saved_game.read<int32_t>(secretsFound);
553 		saved_game.read<int32_t>(totalSecrets);
554 		saved_game.read<int32_t>(shotsFired);
555 		saved_game.read<int32_t>(hits);
556 		saved_game.read<int32_t>(enemiesSpawned);
557 		saved_game.read<int32_t>(enemiesKilled);
558 		saved_game.read<int32_t>(saberThrownCnt);
559 		saved_game.read<int32_t>(saberBlocksCnt);
560 		saved_game.read<int32_t>(legAttacksCnt);
561 		saved_game.read<int32_t>(armAttacksCnt);
562 		saved_game.read<int32_t>(torsoAttacksCnt);
563 		saved_game.read<int32_t>(otherAttacksCnt);
564 		saved_game.read<int32_t>(forceUsed);
565 		saved_game.read<int32_t>(weaponUsed);
566 	}
567 }; // missionStats_t
568 
569 // the auto following clients don't follow a specific client
570 // number, but instead follow the first two active players
571 #define	FOLLOW_ACTIVE1	-1
572 #define	FOLLOW_ACTIVE2	-2
573 
574 // client data that stays across multiple levels or tournament restarts
575 // this is achieved by writing all the data to cvar strings at game shutdown
576 // time and reading them back at connection time.  Anything added here
577 // MUST be dealt with in G_InitSessionData() / G_ReadSessionData() / G_WriteSessionData()
578 //
579 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!!
580 class clientSession_t
581 {
582 public:
583 	int				missionObjectivesShown;	// Number of times mission objectives have been updated
584 	team_t			sessionTeam;
585 	objectives_t	mission_objectives[MAX_MISSION_OBJ];
586 	missionStats_t	missionStats;			// Various totals while on a mission
587 
588 
sg_export(ojk::SavedGameHelper & saved_game)589 	void sg_export(
590 		ojk::SavedGameHelper& saved_game) const
591 	{
592 		saved_game.write<int32_t>(missionObjectivesShown);
593 		saved_game.write<int32_t>(sessionTeam);
594 		saved_game.write<>(mission_objectives);
595 		saved_game.write<>(missionStats);
596 	}
597 
sg_import(ojk::SavedGameHelper & saved_game)598 	void sg_import(
599 		ojk::SavedGameHelper& saved_game)
600 	{
601 		saved_game.read<int32_t>(missionObjectivesShown);
602 		saved_game.read<int32_t>(sessionTeam);
603 		saved_game.read<>(mission_objectives);
604 		saved_game.read<>(missionStats);
605 	}
606 }; // clientSession_t
607 
608 // client data that stays across multiple respawns, but is cleared
609 // on each level change or team change at ClientBegin()
610 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!!
611 class clientPersistant_t
612 {
613 public:
614 	clientConnected_t	connected;
615 	usercmd_t	lastCommand;
616 	char		netname[34];
617 	int			maxHealth;			// for handicapping
618 	int			enterTime;			// level.time the client entered the game
619 	short		cmd_angles[3];		// angles sent over in the last command
620 
621 	playerTeamState_t teamState;	// status in teamplay games
622 
623 
sg_export(ojk::SavedGameHelper & saved_game)624 	void sg_export(
625 		ojk::SavedGameHelper& saved_game) const
626 	{
627 		saved_game.write<int32_t>(connected);
628 		saved_game.write<>(lastCommand);
629 		saved_game.write<int8_t>(netname);
630 		saved_game.skip(2);
631 		saved_game.write<int32_t>(maxHealth);
632 		saved_game.write<int32_t>(enterTime);
633 		saved_game.write<int16_t>(cmd_angles);
634 		saved_game.skip(2);
635 		saved_game.write<>(teamState);
636 	}
637 
sg_import(ojk::SavedGameHelper & saved_game)638 	void sg_import(
639 		ojk::SavedGameHelper& saved_game)
640 	{
641 		saved_game.read<int32_t>(connected);
642 		saved_game.read<>(lastCommand);
643 		saved_game.read<int8_t>(netname);
644 		saved_game.skip(2);
645 		saved_game.read<int32_t>(maxHealth);
646 		saved_game.read<int32_t>(enterTime);
647 		saved_game.read<int16_t>(cmd_angles);
648 		saved_game.skip(2);
649 		saved_game.read<>(teamState);
650 	}
651 }; // clientPersistant_t
652 
653 typedef enum {
654 	BLK_NO,
655 	BLK_TIGHT,		// Block only attacks and shots around the saber itself, a bbox of around 12x12x12
656 	BLK_WIDE		// Block all attacks in an area around the player in a rough arc of 180 degrees
657 } saberBlockType_t;
658 
659 typedef enum {
660 	BLOCKED_NONE,
661 	BLOCKED_PARRY_BROKEN,
662 	BLOCKED_ATK_BOUNCE,
663 	BLOCKED_UPPER_RIGHT,
664 	BLOCKED_UPPER_LEFT,
665 	BLOCKED_LOWER_RIGHT,
666 	BLOCKED_LOWER_LEFT,
667 	BLOCKED_TOP,
668 	BLOCKED_UPPER_RIGHT_PROJ,
669 	BLOCKED_UPPER_LEFT_PROJ,
670 	BLOCKED_LOWER_RIGHT_PROJ,
671 	BLOCKED_LOWER_LEFT_PROJ,
672 	BLOCKED_TOP_PROJ
673 } saberBlockedType_t;
674 
675 typedef enum //# movetype_e
676 {
677 	MT_STATIC = 0,
678 	MT_WALK,
679 	MT_RUNJUMP,
680 	MT_FLYSWIM,
681 	NUM_MOVETYPES
682 } movetype_t;
683 
684 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!!
685 
686 // this structure is cleared on each ClientSpawn(),
687 // except for 'client->pers' and 'client->sess'
688 template<typename TSaberInfo>
689 class GClientBase
690 {
691 public:
692 	// ps MUST be the first element, because the server expects it
693 	PlayerStateBase<TSaberInfo>	ps;				// communicated by server to clients
694 
695 	// private to game
696 	clientPersistant_t	pers;
697 	clientSession_t		sess;
698 
699 	int			lastCmdTime;		// level.time of last usercmd_t, for EF_CONNECTION
700 
701 	usercmd_t	usercmd;			// most recent usercmd
702 
703 	int			buttons;
704 	int			oldbuttons;
705 	int			latched_buttons;
706 
707 	// sum up damage over an entire frame, so
708 	// shotgun blasts give a single big kick
709 	int			damage_armor;		// damage absorbed by armor
710 	int			damage_blood;		// damage taken out of health
711 	vec3_t		damage_from;		// origin for vector calculation
712 	bool		damage_fromWorld;	// if true, don't use the damage_from vector
713 	bool		noclip;
714 //icarus forced moving.  is this still used?
715 	signed char		forced_forwardmove;
716 	signed char		forced_rightmove;
717 
718 	// timers
719 	int			respawnTime;		// can respawn when time > this, force after g_forcerespwan
720 	int			idleTime;			// for playing idleAnims
721 
722 	int			airOutTime;
723 
724 	// timeResidual is used to handle events that happen every second
725 	// like health / armor countdowns and regeneration
726 	int			timeResidual;
727 
728 	// Facial Expression Timers
729 
730 	float		facial_blink;		// time before next blink. If a minus value, we are in blink mode
731 	float		facial_timer;		// time before next alert, frown or smile. If a minus value, we are in anim mode
732 	int			facial_anim;		// anim to show in anim mode
733 
734 	//Client info - updated when ClientInfoChanged is called, instead of using configstrings
735 	clientInfo_t	clientInfo;
736 	movetype_t		moveType;
737 	int				jetPackTime;
738 	int				fireDelay;		//msec to delay calling G_FireWeapon after EV_FIREWEAPON event is called
739 
740 	// The time at which a breath should be triggered. -Aurelio
741 	int				breathPuffTime;
742 
743 	//Used to be in gentity_t, now here.. mostly formation stuff
744 	team_t		playerTeam;
745 	team_t		enemyTeam;
746 	gentity_t	*leader;
747 	class_t		NPC_class;
748 
749 	//FIXME: could combine these
750 	float		hiddenDist;//How close ents have to be to pick you up as an enemy
751 	vec3_t		hiddenDir;//Normalized direction in which NPCs can't see you (you are hidden)
752 
753 	renderInfo_t	renderInfo;
754 
755 	//dismember tracker
756 	bool		dismembered;
757 	char		dismemberProbLegs;	// probability of the legs being dismembered (located in NPC.cfg, 0 = never, 100 = always)
758 	char		dismemberProbHead;  // probability of the head being dismembered (located in NPC.cfg, 0 = never, 100 = always)
759 	char		dismemberProbArms;  // probability of the arms being dismembered (located in NPC.cfg, 0 = never, 100 = always)
760 	char		dismemberProbHands; // probability of the hands being dismembered (located in NPC.cfg, 0 = never, 100 = always)
761 	char		dismemberProbWaist; // probability of the waist being dismembered (located in NPC.cfg, 0 = never, 100 = always)
762 
763 	int			standheight;
764 	int			crouchheight;
765 	int			poisonDamage;				// Amount of poison damage to be given
766 	int			poisonTime;					// When to apply poison damage
767 	int			slopeRecalcTime;			// debouncer for slope-foot-height-diff calcing
768 
769 	vec3_t		pushVec;
770 	int			pushVecTime;
771 
772 	int			noRagTime; //don't do ragdoll stuff if > level.time
773 	qboolean	isRagging;
774 	int			overridingBones; //dragging body or doing something else to override one or more ragdoll effector's/pcj's
775 
776 	vec3_t		ragLastOrigin; //keeping track of positions between rags while dragging corpses
777 	int			ragLastOriginTime;
778 
779 	//push refraction effect vars
780 	int			pushEffectFadeTime;
781 	vec3_t		pushEffectOrigin;
782 
783 	//Rocket locking vars for non-player clients (only Vehicles use these right now...)
784 	int			rocketLockIndex;
785 	float		rocketLastValidTime;
786 	float		rocketLockTime;
787 	float		rocketTargetTime;
788 
789 	//for trigger_space brushes
790 	int			inSpaceSuffocation;
791 	int			inSpaceIndex;
792 
793 
sg_export(ojk::SavedGameHelper & saved_game)794 	void sg_export(
795 		ojk::SavedGameHelper& saved_game) const
796 	{
797 		saved_game.write<>(ps);
798 		saved_game.write<>(pers);
799 		saved_game.write<>(sess);
800 		saved_game.write<int32_t>(lastCmdTime);
801 		saved_game.write<>(usercmd);
802 		saved_game.write<int32_t>(buttons);
803 		saved_game.write<int32_t>(oldbuttons);
804 		saved_game.write<int32_t>(latched_buttons);
805 		saved_game.write<int32_t>(damage_armor);
806 		saved_game.write<int32_t>(damage_blood);
807 		saved_game.write<float>(damage_from);
808 		saved_game.write<int8_t>(damage_fromWorld);
809 		saved_game.write<int8_t>(noclip);
810 		saved_game.write<int8_t>(forced_forwardmove);
811 		saved_game.write<int8_t>(forced_rightmove);
812 		saved_game.write<int32_t>(respawnTime);
813 		saved_game.write<int32_t>(idleTime);
814 		saved_game.write<int32_t>(airOutTime);
815 		saved_game.write<int32_t>(timeResidual);
816 		saved_game.write<float>(facial_blink);
817 		saved_game.write<float>(facial_timer);
818 		saved_game.write<int32_t>(facial_anim);
819 		saved_game.write<>(clientInfo);
820 		saved_game.write<int32_t>(moveType);
821 		saved_game.write<int32_t>(jetPackTime);
822 		saved_game.write<int32_t>(fireDelay);
823 		saved_game.write<int32_t>(breathPuffTime);
824 		saved_game.write<int32_t>(playerTeam);
825 		saved_game.write<int32_t>(enemyTeam);
826 		saved_game.write<int32_t>(leader);
827 		saved_game.write<int32_t>(NPC_class);
828 		saved_game.write<float>(hiddenDist);
829 		saved_game.write<float>(hiddenDir);
830 		saved_game.write<>(renderInfo);
831 		saved_game.write<int8_t>(dismembered);
832 		saved_game.write<int8_t>(dismemberProbLegs);
833 		saved_game.write<int8_t>(dismemberProbHead);
834 		saved_game.write<int8_t>(dismemberProbArms);
835 		saved_game.write<int8_t>(dismemberProbHands);
836 		saved_game.write<int8_t>(dismemberProbWaist);
837 		saved_game.skip(2);
838 		saved_game.write<int32_t>(standheight);
839 		saved_game.write<int32_t>(crouchheight);
840 		saved_game.write<int32_t>(poisonDamage);
841 		saved_game.write<int32_t>(poisonTime);
842 		saved_game.write<int32_t>(slopeRecalcTime);
843 		saved_game.write<float>(pushVec);
844 		saved_game.write<int32_t>(pushVecTime);
845 		saved_game.write<int32_t>(noRagTime);
846 		saved_game.write<int32_t>(isRagging);
847 		saved_game.write<int32_t>(overridingBones);
848 		saved_game.write<float>(ragLastOrigin);
849 		saved_game.write<int32_t>(ragLastOriginTime);
850 		saved_game.write<int32_t>(pushEffectFadeTime);
851 		saved_game.write<float>(pushEffectOrigin);
852 		saved_game.write<int32_t>(rocketLockIndex);
853 		saved_game.write<float>(rocketLastValidTime);
854 		saved_game.write<float>(rocketLockTime);
855 		saved_game.write<float>(rocketTargetTime);
856 		saved_game.write<int32_t>(inSpaceSuffocation);
857 		saved_game.write<int32_t>(inSpaceIndex);
858 	}
859 
sg_import(ojk::SavedGameHelper & saved_game)860 	void sg_import(
861 		ojk::SavedGameHelper& saved_game)
862 	{
863 		saved_game.read<>(ps);
864 		saved_game.read<>(pers);
865 		saved_game.read<>(sess);
866 		saved_game.read<int32_t>(lastCmdTime);
867 		saved_game.read<>(usercmd);
868 		saved_game.read<int32_t>(buttons);
869 		saved_game.read<int32_t>(oldbuttons);
870 		saved_game.read<int32_t>(latched_buttons);
871 		saved_game.read<int32_t>(damage_armor);
872 		saved_game.read<int32_t>(damage_blood);
873 		saved_game.read<float>(damage_from);
874 		saved_game.read<int8_t>(damage_fromWorld);
875 		saved_game.read<int8_t>(noclip);
876 		saved_game.read<int8_t>(forced_forwardmove);
877 		saved_game.read<int8_t>(forced_rightmove);
878 		saved_game.read<int32_t>(respawnTime);
879 		saved_game.read<int32_t>(idleTime);
880 		saved_game.read<int32_t>(airOutTime);
881 		saved_game.read<int32_t>(timeResidual);
882 		saved_game.read<float>(facial_blink);
883 		saved_game.read<float>(facial_timer);
884 		saved_game.read<int32_t>(facial_anim);
885 		saved_game.read<>(clientInfo);
886 		saved_game.read<int32_t>(moveType);
887 		saved_game.read<int32_t>(jetPackTime);
888 		saved_game.read<int32_t>(fireDelay);
889 		saved_game.read<int32_t>(breathPuffTime);
890 		saved_game.read<int32_t>(playerTeam);
891 		saved_game.read<int32_t>(enemyTeam);
892 		saved_game.read<int32_t>(leader);
893 		saved_game.read<int32_t>(NPC_class);
894 		saved_game.read<float>(hiddenDist);
895 		saved_game.read<float>(hiddenDir);
896 		saved_game.read<>(renderInfo);
897 		saved_game.read<int8_t>(dismembered);
898 		saved_game.read<int8_t>(dismemberProbLegs);
899 		saved_game.read<int8_t>(dismemberProbHead);
900 		saved_game.read<int8_t>(dismemberProbArms);
901 		saved_game.read<int8_t>(dismemberProbHands);
902 		saved_game.read<int8_t>(dismemberProbWaist);
903 		saved_game.skip(2);
904 		saved_game.read<int32_t>(standheight);
905 		saved_game.read<int32_t>(crouchheight);
906 		saved_game.read<int32_t>(poisonDamage);
907 		saved_game.read<int32_t>(poisonTime);
908 		saved_game.read<int32_t>(slopeRecalcTime);
909 		saved_game.read<float>(pushVec);
910 		saved_game.read<int32_t>(pushVecTime);
911 		saved_game.read<int32_t>(noRagTime);
912 		saved_game.read<int32_t>(isRagging);
913 		saved_game.read<int32_t>(overridingBones);
914 		saved_game.read<float>(ragLastOrigin);
915 		saved_game.read<int32_t>(ragLastOriginTime);
916 		saved_game.read<int32_t>(pushEffectFadeTime);
917 		saved_game.read<float>(pushEffectOrigin);
918 		saved_game.read<int32_t>(rocketLockIndex);
919 		saved_game.read<float>(rocketLastValidTime);
920 		saved_game.read<float>(rocketLockTime);
921 		saved_game.read<float>(rocketTargetTime);
922 		saved_game.read<int32_t>(inSpaceSuffocation);
923 		saved_game.read<int32_t>(inSpaceIndex);
924 	}
925 }; // GClientBase
926 
927 
928 using gclient_t = GClientBase<saberInfo_t>;
929 using RetailGClient = GClientBase<saberInfoRetail_t>;
930 
931 
932 #define	MAX_PARMS	16
933 #define	MAX_PARM_STRING_LENGTH	MAX_QPATH//was 16, had to lengthen it so they could take a valid file path
934 
935 class parms_t
936 {
937 public:
938 	char	parm[MAX_PARMS][MAX_PARM_STRING_LENGTH];
939 
940 
sg_export(ojk::SavedGameHelper & saved_game)941 	void sg_export(
942 		ojk::SavedGameHelper& saved_game) const
943 	{
944 		saved_game.write<int8_t>(parm);
945 	}
946 
sg_import(ojk::SavedGameHelper & saved_game)947 	void sg_import(
948 		ojk::SavedGameHelper& saved_game)
949 	{
950 		saved_game.read<int8_t>(parm);
951 	}
952 }; // parms_t
953 
954 #ifdef GAME_INCLUDE
955 //these hold the place for the enums in functions.h so i don't have to recompile everytime it changes
956 #define thinkFunc_t int
957 #define clThinkFunc_t int
958 #define reachedFunc_t int
959 #define blockedFunc_t int
960 #define touchFunc_t int
961 #define useFunc_t int
962 #define painFunc_t int
963 #define dieFunc_t int
964 
965 #define MAX_FAILED_NODES 8
966 #define MAX_INHAND_WEAPONS	2
967 
968 
969 typedef struct centity_s centity_t;
970 // !!!!!!!!!!! LOADSAVE-affecting struct !!!!!!!!!!!!!
971 struct gentity_s {
972 	entityState_t	s;				// communicated by server to clients
973 	gclient_t	*client;	// NULL if not a player (unless it's NPC ( if (this->NPC != NULL)  )  <sigh>... -slc)
974 	qboolean	inuse;
975 	qboolean	linked;				// qfalse if not in any good cluster
976 
977 	int			svFlags;			// SVF_NOCLIENT, SVF_BROADCAST, etc
978 
979 	qboolean	bmodel;				// if false, assume an explicit mins / maxs bounding box
980 									// only set by gi.SetBrushModel
981 	vec3_t		mins, maxs;
982 	int			contents;			// CONTENTS_TRIGGER, CONTENTS_SOLID, CONTENTS_BODY, etc
983 									// a non-solid entity should set to 0
984 
985 	vec3_t		absmin, absmax;		// derived from mins/maxs and origin + rotation
986 
987 	// currentOrigin will be used for all collision detection and world linking.
988 	// it will not necessarily be the same as the trajectory evaluation for the current
989 	// time, because each entity must be moved one at a time after time is advanced
990 	// to avoid simultanious collision issues
991 	vec3_t		currentOrigin;
992 	vec3_t		currentAngles;
993 
994 	gentity_t	*owner;				// objects never interact with their owners, to
995 									// prevent player missiles from immediately
996 									// colliding with their owner
997 /*
998 Ghoul2 Insert Start
999 */
1000 	// this marker thing of Jake's is used for memcpy() length calcs, so don't put any ordinary fields (like above)
1001 	//	below this point or they won't work, and will mess up all sorts of stuff.
1002 	//
1003 	CGhoul2Info_v	ghoul2;
1004 
1005 	vec3_t			modelScale; //needed for g2 collision
1006 /*
1007 Ghoul2 Insert End
1008 */
1009 
1010 	// DO NOT MODIFY ANYTHING ABOVE THIS, THE SERVER
1011 	// EXPECTS THE FIELDS IN THAT ORDER!
1012 
1013 //==========================================================================================
1014 
1015 //Essential entity fields
1016 	// note: all the char* fields from here on should be left as ptrs, not declared, because of the way that ent-parsing
1017 	//	works by forcing field offset ptrs as char* and using G_NewString()!! (see G_ParseField() in gmae/g_spawn.cpp -slc
1018 	//
1019 	char		*classname;			// set in QuakeEd
1020 	int			spawnflags;			// set in QuakeEd
1021 
1022 	int			flags;				// FL_* variables
1023 
1024 	char		*model;				// Normal model, or legs model on tri-models
1025 	char		*model2;			// Torso model
1026 
1027 	int			freetime;			// sv.time when the object was freed
1028 
1029 	int			eventTime;			// events will be cleared EVENT_VALID_MSEC after set
1030 	qboolean	freeAfterEvent;
1031 //	qboolean	unlinkAfterEvent;
1032 
1033 //Physics and movement fields
1034 	float		physicsBounce;		// 1.0 = continuous bounce, 0.0 = no bounce
1035 	int			clipmask;			// brushes with this content value will be collided against
1036 									// when moving.  items and corpses do not collide against
1037 									// players, for instance
1038 //	moveInfo_t	moveInfo;		//FIXME: use this more?
1039 	float		speed;
1040 	float		resultspeed;
1041 	int			lastMoveTime;
1042 	vec3_t		movedir;
1043 	vec3_t		lastOrigin;			//Where you were last frame
1044 	vec3_t		lastAngles;			//Where you were looking last frame
1045 	float		mass;				//How heavy you are
1046 	int			lastImpact;			//Last time you impacted something
1047 
1048 //Variables reflecting environment
1049 	int			watertype;
1050 	int			waterlevel;
1051 	short		wupdate;
1052 	short		prev_waterlevel;
1053 
1054 //Targeting/linking fields
1055 	float		angle;			// set in editor, -1 = up, -2 = down
1056 	char		*target;
1057 	char		*target2;		//For multiple targets, not used for firing/triggering/using, though, only for path branches
1058 	char		*target3;		//For multiple targets, not used for firing/triggering/using, though, only for path branches
1059 	char		*target4;		//For multiple targets, not used for firing/triggering/using, though, only for path branches
1060 	char		*targetJump;
1061 	char		*targetname;
1062 	char		*team;
1063 
1064 	union
1065 	{
1066 		char      *roff;                  // the roff file to use, if there is one
1067 		char	*fxFile;		// name of the external effect file
1068 	};
1069 
1070 	int		roff_ctr;		// current roff frame we are playing
1071 
1072 	int			next_roff_time;
1073 	int			fx_time;		// timer for beam in/out effects.
1074 
1075 //Think Functions
1076 	int			nextthink;//Used to determine if it's time to call e_ThinkFunc again
1077 	thinkFunc_t		e_ThinkFunc;//Called once every game frame for every ent
1078 	clThinkFunc_t	e_clThinkFunc;//Think func for equivalent centity
1079 	reachedFunc_t	e_ReachedFunc;// movers call this when hitting endpoint
1080 	blockedFunc_t	e_BlockedFunc;
1081 	touchFunc_t		e_TouchFunc;
1082 	useFunc_t		e_UseFunc;	//Called by G_UseTargets
1083 	painFunc_t		e_PainFunc;	//Called by G_Damage when damage is taken
1084 	dieFunc_t		e_DieFunc;	//Called by G_Damage when health reaches <= 0
1085 
1086 //Health and damage fields
1087 	int			health;
1088 	int			max_health;
1089 	qboolean	takedamage;
1090 	material_t	material;
1091 	int			damage;
1092 	int			dflags;
1093 	//explosives, breakable brushes
1094 	int			splashDamage;	// quad will increase this without increasing radius
1095 	int			splashRadius;
1096 	int			methodOfDeath;
1097 	int			splashMethodOfDeath;
1098 	//int			hitLoc;//where you were last hit
1099 	int			locationDamage[HL_MAX];		// Damage accumulated on different body locations
1100 
1101 //Entity pointers
1102 	gentity_t	*chain;
1103 	gentity_t	*enemy;
1104 	gentity_t	*activator;
1105 	gentity_t	*teamchain;		// next entity in team
1106 	gentity_t	*teammaster;	// master of the team
1107 	gentity_t	*lastEnemy;
1108 
1109 //Timing variables, counters and debounce times
1110 	float		wait;
1111 	float		random;
1112 	int			delay;
1113 	qboolean	alt_fire;
1114 	int			count;
1115 	int			bounceCount;
1116 	int			fly_sound_debounce_time;	// wind tunnel
1117 	int			painDebounceTime;
1118 	int			disconnectDebounceTime;
1119 	int			attackDebounceTime;
1120 	int			pushDebounceTime;
1121 	int			aimDebounceTime;
1122 	int			useDebounceTime;
1123 
1124 //Unions for miscellaneous fields used under very specific circumstances
1125 	union
1126 	{
1127 		qboolean	trigger_formation;
1128 		qboolean	misc_dlight_active;
1129 		qboolean	has_bounced;	// for thermal Det.  we force at least one bounce to happen before it can do proximity checks
1130 	};
1131 
1132 //Navigation
1133 	int			spawnContents;		// store contents of ents on spawn so nav system can restore them
1134 	int			waypoint;			//Set once per frame, if you've moved, and if someone asks
1135 	int			wayedge;			//Used by doors and breakable things to know what edge goes through them
1136 	int			lastWaypoint;		//To make sure you don't double-back
1137 	int			lastInAirTime;
1138 	int			noWaypointTime;		//Debouncer - so don't keep checking every waypoint in existance every frame that you can't find one
1139 	int			combatPoint;
1140 	vec3_t		followPos;
1141 	int			followPosRecalcTime;
1142 	int			followPosWaypoint;
1143 
1144 //Animation
1145 	qboolean	loopAnim;
1146 	int		startFrame;
1147 	int		endFrame;
1148 
1149 //Script/ICARUS-related fields
1150 	int				m_iIcarusID;
1151 	int				taskID[NUM_TIDS];
1152 	parms_t			*parms;
1153 	char		*behaviorSet[NUM_BSETS];
1154 	char		*script_targetname;
1155 	int			delayScriptTime;
1156 
1157 // Ambient sound info
1158 	char			*soundSet;	//Only used for local sets
1159 	int				setTime;
1160 
1161 //Used by cameras to locate subjects
1162 	char			*cameraGroup;
1163 
1164 //For damage
1165 	team_t		noDamageTeam;
1166 
1167 // Ghoul2 Animation info
1168 	short			playerModel;
1169 	short			weaponModel[MAX_INHAND_WEAPONS];
1170 	short			handRBolt;
1171 	short			handLBolt;
1172 	short			headBolt;
1173 	short			cervicalBolt;
1174 	short			chestBolt;
1175 	short			gutBolt;
1176 	short			torsoBolt;
1177 	short			crotchBolt;
1178 	short			motionBolt;
1179 	short			kneeLBolt;
1180 	short			kneeRBolt;
1181 	short			elbowLBolt;
1182 	short			elbowRBolt;
1183 	short			footLBolt;
1184 	short			footRBolt;
1185 	short			faceBone;
1186 	short			craniumBone;
1187 	short			cervicalBone;
1188 	short			thoracicBone;
1189 	short			upperLumbarBone;
1190 	short			lowerLumbarBone;
1191 	short			hipsBone;
1192 	short			motionBone;
1193 	short			rootBone;
1194 	short			footLBone;
1195 	short			footRBone;
1196 	short			humerusRBone;
1197 
1198 	short			genericBone1;		// For bones special to an entity
1199 	short			genericBone2;
1200 	short			genericBone3;
1201 
1202 	short			genericBolt1;		// For bolts special to an entity
1203 	short			genericBolt2;
1204 	short			genericBolt3;
1205 	short			genericBolt4;
1206 	short			genericBolt5;
1207 
1208 	qhandle_t		cinematicModel;
1209 
1210 //==========================================================================================
1211 
1212 //FIELDS USED EXCLUSIVELY BY SPECIFIC CLASSES OF ENTITIES
1213 	// Vehicle information.
1214 	// The vehicle object.
1215 	Vehicle_t *m_pVehicle;
1216 
1217 	//NPC/Player entity fields
1218 	//FIXME: Make these client only?
1219 	gNPC_t		*NPC;//Only allocated if the entity becomes an NPC
1220 
1221 	//Other NPC/Player-related entity fields
1222 	char		*ownername;//Used by squadpaths to locate owning NPC
1223 
1224 //FIXME: Only used by NPCs, move it to gNPC_t
1225 	int			cantHitEnemyCounter;//HACK - Makes them look for another enemy on the same team if the one they're after can't be hit
1226 
1227 //Only used by NPC_spawners
1228 	char		*NPC_type;
1229 	char		*NPC_targetname;
1230 	char		*NPC_target;
1231 
1232 //Variables used by movers (most likely exclusively by them)
1233 	moverState_t moverState;
1234 	int			soundPos1;
1235 	int			sound1to2;
1236 	int			sound2to1;
1237 	int			soundPos2;
1238 	int			soundLoop;
1239 	gentity_t	*nextTrain;
1240 	gentity_t	*prevTrain;
1241 	vec3_t		pos1, pos2;
1242 	vec3_t		pos3;
1243 	int			sounds;
1244 	char		*closetarget;
1245 	char		*opentarget;
1246 	char		*paintarget;
1247 	int			lockCount;	//for maglocks- actually get put on the trigger for the door
1248 
1249 //Variables used only by waypoints (for the most part)
1250 	float		radius;
1251 
1252 	union
1253 	{
1254 		int		wpIndex;
1255 		int		fxID;			// id of the external effect file
1256 	};
1257 
1258 	int			noise_index;
1259 
1260 	vec4_t		startRGBA;
1261 
1262 	union
1263 	{
1264 		vec4_t		finalRGBA;
1265 		vec3_t		pos4;
1266 		vec3_t		modelAngles;	//for brush entities with an attached md3 model, as an offset to the brush's angles
1267 	};
1268 
1269 //FIXME: Are these being used anymore?
1270 	gitem_t		*item;			// for bonus items -
1271 	char		*message;		//Used by triggers to print a message when activated
1272 
1273 	float		lightLevel;
1274 
1275 	//FIXME: can these be removed/condensed/absorbed?
1276 	//Rendering info
1277 	//int			color;
1278 
1279 	//Force effects
1280 	int			forcePushTime;
1281 	int			forcePuller;	//who force-pulled me (so we don't damage them if we hit them)
1282 
1283 
sg_exportgentity_s1284 	void sg_export(
1285 		ojk::SavedGameHelper& saved_game) const
1286 	{
1287 		saved_game.write<>(s);
1288 		saved_game.write<int32_t>(client);
1289 		saved_game.write<int32_t>(inuse);
1290 		saved_game.write<int32_t>(linked);
1291 		saved_game.write<int32_t>(svFlags);
1292 		saved_game.write<int32_t>(bmodel);
1293 		saved_game.write<float>(mins);
1294 		saved_game.write<float>(maxs);
1295 		saved_game.write<int32_t>(contents);
1296 		saved_game.write<float>(absmin);
1297 		saved_game.write<float>(absmax);
1298 		saved_game.write<float>(currentOrigin);
1299 		saved_game.write<float>(currentAngles);
1300 		saved_game.write<int32_t>(owner);
1301 		saved_game.write<>(ghoul2);
1302 		saved_game.write<float>(modelScale);
1303 		saved_game.write<int32_t>(classname);
1304 		saved_game.write<int32_t>(spawnflags);
1305 		saved_game.write<int32_t>(flags);
1306 		saved_game.write<int32_t>(model);
1307 		saved_game.write<int32_t>(model2);
1308 		saved_game.write<int32_t>(freetime);
1309 		saved_game.write<int32_t>(eventTime);
1310 		saved_game.write<int32_t>(freeAfterEvent);
1311 		saved_game.write<float>(physicsBounce);
1312 		saved_game.write<int32_t>(clipmask);
1313 		saved_game.write<float>(speed);
1314 		saved_game.write<float>(resultspeed);
1315 		saved_game.write<int32_t>(lastMoveTime);
1316 		saved_game.write<float>(movedir);
1317 		saved_game.write<float>(lastOrigin);
1318 		saved_game.write<float>(lastAngles);
1319 		saved_game.write<float>(mass);
1320 		saved_game.write<int32_t>(lastImpact);
1321 		saved_game.write<int32_t>(watertype);
1322 		saved_game.write<int32_t>(waterlevel);
1323 		saved_game.write<int16_t>(wupdate);
1324 		saved_game.write<int16_t>(prev_waterlevel);
1325 		saved_game.write<float>(angle);
1326 		saved_game.write<int32_t>(target);
1327 		saved_game.write<int32_t>(target2);
1328 		saved_game.write<int32_t>(target3);
1329 		saved_game.write<int32_t>(target4);
1330 		saved_game.write<int32_t>(targetJump);
1331 		saved_game.write<int32_t>(targetname);
1332 		saved_game.write<int32_t>(team);
1333 		saved_game.write<int32_t>(roff);
1334 		saved_game.write<int32_t>(roff_ctr);
1335 		saved_game.write<int32_t>(next_roff_time);
1336 		saved_game.write<int32_t>(fx_time);
1337 		saved_game.write<int32_t>(nextthink);
1338 		saved_game.write<int32_t>(e_ThinkFunc);
1339 		saved_game.write<int32_t>(e_clThinkFunc);
1340 		saved_game.write<int32_t>(e_ReachedFunc);
1341 		saved_game.write<int32_t>(e_BlockedFunc);
1342 		saved_game.write<int32_t>(e_TouchFunc);
1343 		saved_game.write<int32_t>(e_UseFunc);
1344 		saved_game.write<int32_t>(e_PainFunc);
1345 		saved_game.write<int32_t>(e_DieFunc);
1346 		saved_game.write<int32_t>(health);
1347 		saved_game.write<int32_t>(max_health);
1348 		saved_game.write<int32_t>(takedamage);
1349 		saved_game.write<int32_t>(material);
1350 		saved_game.write<int32_t>(damage);
1351 		saved_game.write<int32_t>(dflags);
1352 		saved_game.write<int32_t>(splashDamage);
1353 		saved_game.write<int32_t>(splashRadius);
1354 		saved_game.write<int32_t>(methodOfDeath);
1355 		saved_game.write<int32_t>(splashMethodOfDeath);
1356 		saved_game.write<int32_t>(locationDamage);
1357 		saved_game.write<int32_t>(chain);
1358 		saved_game.write<int32_t>(enemy);
1359 		saved_game.write<int32_t>(activator);
1360 		saved_game.write<int32_t>(teamchain);
1361 		saved_game.write<int32_t>(teammaster);
1362 		saved_game.write<int32_t>(lastEnemy);
1363 		saved_game.write<float>(wait);
1364 		saved_game.write<float>(random);
1365 		saved_game.write<int32_t>(delay);
1366 		saved_game.write<int32_t>(alt_fire);
1367 		saved_game.write<int32_t>(count);
1368 		saved_game.write<int32_t>(bounceCount);
1369 		saved_game.write<int32_t>(fly_sound_debounce_time);
1370 		saved_game.write<int32_t>(painDebounceTime);
1371 		saved_game.write<int32_t>(disconnectDebounceTime);
1372 		saved_game.write<int32_t>(attackDebounceTime);
1373 		saved_game.write<int32_t>(pushDebounceTime);
1374 		saved_game.write<int32_t>(aimDebounceTime);
1375 		saved_game.write<int32_t>(useDebounceTime);
1376 		saved_game.write<int32_t>(trigger_formation);
1377 		saved_game.write<int32_t>(spawnContents);
1378 		saved_game.write<int32_t>(waypoint);
1379 		saved_game.write<int32_t>(wayedge);
1380 		saved_game.write<int32_t>(lastWaypoint);
1381 		saved_game.write<int32_t>(lastInAirTime);
1382 		saved_game.write<int32_t>(noWaypointTime);
1383 		saved_game.write<int32_t>(combatPoint);
1384 		saved_game.write<float>(followPos);
1385 		saved_game.write<int32_t>(followPosRecalcTime);
1386 		saved_game.write<int32_t>(followPosWaypoint);
1387 		saved_game.write<int32_t>(loopAnim);
1388 		saved_game.write<int32_t>(startFrame);
1389 		saved_game.write<int32_t>(endFrame);
1390 		saved_game.write<int32_t>(m_iIcarusID);
1391 		saved_game.write<int32_t>(taskID);
1392 		saved_game.write<int32_t>(parms);
1393 		saved_game.write<int32_t>(behaviorSet);
1394 		saved_game.write<int32_t>(script_targetname);
1395 		saved_game.write<int32_t>(delayScriptTime);
1396 		saved_game.write<int32_t>(soundSet);
1397 		saved_game.write<int32_t>(setTime);
1398 		saved_game.write<int32_t>(cameraGroup);
1399 		saved_game.write<int32_t>(noDamageTeam);
1400 		saved_game.write<int16_t>(playerModel);
1401 		saved_game.write<int16_t>(weaponModel);
1402 		saved_game.write<int16_t>(handRBolt);
1403 		saved_game.write<int16_t>(handLBolt);
1404 		saved_game.write<int16_t>(headBolt);
1405 		saved_game.write<int16_t>(cervicalBolt);
1406 		saved_game.write<int16_t>(chestBolt);
1407 		saved_game.write<int16_t>(gutBolt);
1408 		saved_game.write<int16_t>(torsoBolt);
1409 		saved_game.write<int16_t>(crotchBolt);
1410 		saved_game.write<int16_t>(motionBolt);
1411 		saved_game.write<int16_t>(kneeLBolt);
1412 		saved_game.write<int16_t>(kneeRBolt);
1413 		saved_game.write<int16_t>(elbowLBolt);
1414 		saved_game.write<int16_t>(elbowRBolt);
1415 		saved_game.write<int16_t>(footLBolt);
1416 		saved_game.write<int16_t>(footRBolt);
1417 		saved_game.write<int16_t>(faceBone);
1418 		saved_game.write<int16_t>(craniumBone);
1419 		saved_game.write<int16_t>(cervicalBone);
1420 		saved_game.write<int16_t>(thoracicBone);
1421 		saved_game.write<int16_t>(upperLumbarBone);
1422 		saved_game.write<int16_t>(lowerLumbarBone);
1423 		saved_game.write<int16_t>(hipsBone);
1424 		saved_game.write<int16_t>(motionBone);
1425 		saved_game.write<int16_t>(rootBone);
1426 		saved_game.write<int16_t>(footLBone);
1427 		saved_game.write<int16_t>(footRBone);
1428 		saved_game.write<int16_t>(humerusRBone);
1429 		saved_game.write<int16_t>(genericBone1);
1430 		saved_game.write<int16_t>(genericBone2);
1431 		saved_game.write<int16_t>(genericBone3);
1432 		saved_game.write<int16_t>(genericBolt1);
1433 		saved_game.write<int16_t>(genericBolt2);
1434 		saved_game.write<int16_t>(genericBolt3);
1435 		saved_game.write<int16_t>(genericBolt4);
1436 		saved_game.write<int16_t>(genericBolt5);
1437 		saved_game.write<int32_t>(cinematicModel);
1438 		saved_game.write<int32_t>(m_pVehicle);
1439 		saved_game.write<int32_t>(NPC);
1440 		saved_game.write<int32_t>(ownername);
1441 		saved_game.write<int32_t>(cantHitEnemyCounter);
1442 		saved_game.write<int32_t>(NPC_type);
1443 		saved_game.write<int32_t>(NPC_targetname);
1444 		saved_game.write<int32_t>(NPC_target);
1445 		saved_game.write<int32_t>(moverState);
1446 		saved_game.write<int32_t>(soundPos1);
1447 		saved_game.write<int32_t>(sound1to2);
1448 		saved_game.write<int32_t>(sound2to1);
1449 		saved_game.write<int32_t>(soundPos2);
1450 		saved_game.write<int32_t>(soundLoop);
1451 		saved_game.write<int32_t>(nextTrain);
1452 		saved_game.write<int32_t>(prevTrain);
1453 		saved_game.write<float>(pos1);
1454 		saved_game.write<float>(pos2);
1455 		saved_game.write<float>(pos3);
1456 		saved_game.write<int32_t>(sounds);
1457 		saved_game.write<int32_t>(closetarget);
1458 		saved_game.write<int32_t>(opentarget);
1459 		saved_game.write<int32_t>(paintarget);
1460 		saved_game.write<int32_t>(lockCount);
1461 		saved_game.write<float>(radius);
1462 		saved_game.write<int32_t>(wpIndex);
1463 		saved_game.write<int32_t>(noise_index);
1464 		saved_game.write<float>(startRGBA);
1465 		saved_game.write<float>(finalRGBA);
1466 		saved_game.write<int32_t>(item);
1467 		saved_game.write<int32_t>(message);
1468 		saved_game.write<float>(lightLevel);
1469 		saved_game.write<int32_t>(forcePushTime);
1470 		saved_game.write<int32_t>(forcePuller);
1471 	}
1472 
sg_importgentity_s1473 	void sg_import(
1474 		ojk::SavedGameHelper& saved_game)
1475 	{
1476 		saved_game.read<>(s);
1477 		saved_game.read<int32_t>(client);
1478 		saved_game.read<int32_t>(inuse);
1479 		saved_game.read<int32_t>(linked);
1480 		saved_game.read<int32_t>(svFlags);
1481 		saved_game.read<int32_t>(bmodel);
1482 		saved_game.read<float>(mins);
1483 		saved_game.read<float>(maxs);
1484 		saved_game.read<int32_t>(contents);
1485 		saved_game.read<float>(absmin);
1486 		saved_game.read<float>(absmax);
1487 		saved_game.read<float>(currentOrigin);
1488 		saved_game.read<float>(currentAngles);
1489 		saved_game.read<int32_t>(owner);
1490 		saved_game.read<>(ghoul2);
1491 		saved_game.read<float>(modelScale);
1492 		saved_game.read<int32_t>(classname);
1493 		saved_game.read<int32_t>(spawnflags);
1494 		saved_game.read<int32_t>(flags);
1495 		saved_game.read<int32_t>(model);
1496 		saved_game.read<int32_t>(model2);
1497 		saved_game.read<int32_t>(freetime);
1498 		saved_game.read<int32_t>(eventTime);
1499 		saved_game.read<int32_t>(freeAfterEvent);
1500 		saved_game.read<float>(physicsBounce);
1501 		saved_game.read<int32_t>(clipmask);
1502 		saved_game.read<float>(speed);
1503 		saved_game.read<float>(resultspeed);
1504 		saved_game.read<int32_t>(lastMoveTime);
1505 		saved_game.read<float>(movedir);
1506 		saved_game.read<float>(lastOrigin);
1507 		saved_game.read<float>(lastAngles);
1508 		saved_game.read<float>(mass);
1509 		saved_game.read<int32_t>(lastImpact);
1510 		saved_game.read<int32_t>(watertype);
1511 		saved_game.read<int32_t>(waterlevel);
1512 		saved_game.read<int16_t>(wupdate);
1513 		saved_game.read<int16_t>(prev_waterlevel);
1514 		saved_game.read<float>(angle);
1515 		saved_game.read<int32_t>(target);
1516 		saved_game.read<int32_t>(target2);
1517 		saved_game.read<int32_t>(target3);
1518 		saved_game.read<int32_t>(target4);
1519 		saved_game.read<int32_t>(targetJump);
1520 		saved_game.read<int32_t>(targetname);
1521 		saved_game.read<int32_t>(team);
1522 		saved_game.read<int32_t>(roff);
1523 		saved_game.read<int32_t>(roff_ctr);
1524 		saved_game.read<int32_t>(next_roff_time);
1525 		saved_game.read<int32_t>(fx_time);
1526 		saved_game.read<int32_t>(nextthink);
1527 		saved_game.read<int32_t>(e_ThinkFunc);
1528 		saved_game.read<int32_t>(e_clThinkFunc);
1529 		saved_game.read<int32_t>(e_ReachedFunc);
1530 		saved_game.read<int32_t>(e_BlockedFunc);
1531 		saved_game.read<int32_t>(e_TouchFunc);
1532 		saved_game.read<int32_t>(e_UseFunc);
1533 		saved_game.read<int32_t>(e_PainFunc);
1534 		saved_game.read<int32_t>(e_DieFunc);
1535 		saved_game.read<int32_t>(health);
1536 		saved_game.read<int32_t>(max_health);
1537 		saved_game.read<int32_t>(takedamage);
1538 		saved_game.read<int32_t>(material);
1539 		saved_game.read<int32_t>(damage);
1540 		saved_game.read<int32_t>(dflags);
1541 		saved_game.read<int32_t>(splashDamage);
1542 		saved_game.read<int32_t>(splashRadius);
1543 		saved_game.read<int32_t>(methodOfDeath);
1544 		saved_game.read<int32_t>(splashMethodOfDeath);
1545 		saved_game.read<int32_t>(locationDamage);
1546 		saved_game.read<int32_t>(chain);
1547 		saved_game.read<int32_t>(enemy);
1548 		saved_game.read<int32_t>(activator);
1549 		saved_game.read<int32_t>(teamchain);
1550 		saved_game.read<int32_t>(teammaster);
1551 		saved_game.read<int32_t>(lastEnemy);
1552 		saved_game.read<float>(wait);
1553 		saved_game.read<float>(random);
1554 		saved_game.read<int32_t>(delay);
1555 		saved_game.read<int32_t>(alt_fire);
1556 		saved_game.read<int32_t>(count);
1557 		saved_game.read<int32_t>(bounceCount);
1558 		saved_game.read<int32_t>(fly_sound_debounce_time);
1559 		saved_game.read<int32_t>(painDebounceTime);
1560 		saved_game.read<int32_t>(disconnectDebounceTime);
1561 		saved_game.read<int32_t>(attackDebounceTime);
1562 		saved_game.read<int32_t>(pushDebounceTime);
1563 		saved_game.read<int32_t>(aimDebounceTime);
1564 		saved_game.read<int32_t>(useDebounceTime);
1565 		saved_game.read<int32_t>(trigger_formation);
1566 		saved_game.read<int32_t>(spawnContents);
1567 		saved_game.read<int32_t>(waypoint);
1568 		saved_game.read<int32_t>(wayedge);
1569 		saved_game.read<int32_t>(lastWaypoint);
1570 		saved_game.read<int32_t>(lastInAirTime);
1571 		saved_game.read<int32_t>(noWaypointTime);
1572 		saved_game.read<int32_t>(combatPoint);
1573 		saved_game.read<float>(followPos);
1574 		saved_game.read<int32_t>(followPosRecalcTime);
1575 		saved_game.read<int32_t>(followPosWaypoint);
1576 		saved_game.read<int32_t>(loopAnim);
1577 		saved_game.read<int32_t>(startFrame);
1578 		saved_game.read<int32_t>(endFrame);
1579 		saved_game.read<int32_t>(m_iIcarusID);
1580 		saved_game.read<int32_t>(taskID);
1581 		saved_game.read<int32_t>(parms);
1582 		saved_game.read<int32_t>(behaviorSet);
1583 		saved_game.read<int32_t>(script_targetname);
1584 		saved_game.read<int32_t>(delayScriptTime);
1585 		saved_game.read<int32_t>(soundSet);
1586 		saved_game.read<int32_t>(setTime);
1587 		saved_game.read<int32_t>(cameraGroup);
1588 		saved_game.read<int32_t>(noDamageTeam);
1589 		saved_game.read<int16_t>(playerModel);
1590 		saved_game.read<int16_t>(weaponModel);
1591 		saved_game.read<int16_t>(handRBolt);
1592 		saved_game.read<int16_t>(handLBolt);
1593 		saved_game.read<int16_t>(headBolt);
1594 		saved_game.read<int16_t>(cervicalBolt);
1595 		saved_game.read<int16_t>(chestBolt);
1596 		saved_game.read<int16_t>(gutBolt);
1597 		saved_game.read<int16_t>(torsoBolt);
1598 		saved_game.read<int16_t>(crotchBolt);
1599 		saved_game.read<int16_t>(motionBolt);
1600 		saved_game.read<int16_t>(kneeLBolt);
1601 		saved_game.read<int16_t>(kneeRBolt);
1602 		saved_game.read<int16_t>(elbowLBolt);
1603 		saved_game.read<int16_t>(elbowRBolt);
1604 		saved_game.read<int16_t>(footLBolt);
1605 		saved_game.read<int16_t>(footRBolt);
1606 		saved_game.read<int16_t>(faceBone);
1607 		saved_game.read<int16_t>(craniumBone);
1608 		saved_game.read<int16_t>(cervicalBone);
1609 		saved_game.read<int16_t>(thoracicBone);
1610 		saved_game.read<int16_t>(upperLumbarBone);
1611 		saved_game.read<int16_t>(lowerLumbarBone);
1612 		saved_game.read<int16_t>(hipsBone);
1613 		saved_game.read<int16_t>(motionBone);
1614 		saved_game.read<int16_t>(rootBone);
1615 		saved_game.read<int16_t>(footLBone);
1616 		saved_game.read<int16_t>(footRBone);
1617 		saved_game.read<int16_t>(humerusRBone);
1618 		saved_game.read<int16_t>(genericBone1);
1619 		saved_game.read<int16_t>(genericBone2);
1620 		saved_game.read<int16_t>(genericBone3);
1621 		saved_game.read<int16_t>(genericBolt1);
1622 		saved_game.read<int16_t>(genericBolt2);
1623 		saved_game.read<int16_t>(genericBolt3);
1624 		saved_game.read<int16_t>(genericBolt4);
1625 		saved_game.read<int16_t>(genericBolt5);
1626 		saved_game.read<int32_t>(cinematicModel);
1627 		saved_game.read<int32_t>(m_pVehicle);
1628 		saved_game.read<int32_t>(NPC);
1629 		saved_game.read<int32_t>(ownername);
1630 		saved_game.read<int32_t>(cantHitEnemyCounter);
1631 		saved_game.read<int32_t>(NPC_type);
1632 		saved_game.read<int32_t>(NPC_targetname);
1633 		saved_game.read<int32_t>(NPC_target);
1634 		saved_game.read<int32_t>(moverState);
1635 		saved_game.read<int32_t>(soundPos1);
1636 		saved_game.read<int32_t>(sound1to2);
1637 		saved_game.read<int32_t>(sound2to1);
1638 		saved_game.read<int32_t>(soundPos2);
1639 		saved_game.read<int32_t>(soundLoop);
1640 		saved_game.read<int32_t>(nextTrain);
1641 		saved_game.read<int32_t>(prevTrain);
1642 		saved_game.read<float>(pos1);
1643 		saved_game.read<float>(pos2);
1644 		saved_game.read<float>(pos3);
1645 		saved_game.read<int32_t>(sounds);
1646 		saved_game.read<int32_t>(closetarget);
1647 		saved_game.read<int32_t>(opentarget);
1648 		saved_game.read<int32_t>(paintarget);
1649 		saved_game.read<int32_t>(lockCount);
1650 		saved_game.read<float>(radius);
1651 		saved_game.read<int32_t>(wpIndex);
1652 		saved_game.read<int32_t>(noise_index);
1653 		saved_game.read<float>(startRGBA);
1654 		saved_game.read<float>(finalRGBA);
1655 		saved_game.read<int32_t>(item);
1656 		saved_game.read<int32_t>(message);
1657 		saved_game.read<float>(lightLevel);
1658 		saved_game.read<int32_t>(forcePushTime);
1659 		saved_game.read<int32_t>(forcePuller);
1660 	}
1661 };
1662 #endif //#ifdef GAME_INCLUDE
1663 
1664 extern	gentity_t		g_entities[MAX_GENTITIES];
1665 extern	game_import_t	gi;
1666 
1667 // each WP_* weapon enum has an associated weaponInfo_t
1668 // that contains media references necessary to present the
1669 // weapon and its effects
1670 typedef struct weaponInfo_s {
1671 	qboolean		registered;
1672 	gitem_t			*item;
1673 
1674 	qhandle_t		handsModel;			// the hands don't actually draw, they just position the weapon
1675 	qhandle_t		weaponModel;		//for in view
1676 	qhandle_t		weaponWorldModel;	//for in their hands
1677 	qhandle_t		barrelModel[4];
1678 
1679 	vec3_t			weaponMidpoint;		// so it will rotate centered instead of by tag
1680 
1681 	qhandle_t		weaponIcon;			// The version of the icon with a glowy background
1682 	qhandle_t		weaponIconNoAmmo;	// The version of the icon with no ammo warning
1683 	qhandle_t		ammoIcon;
1684 
1685 	qhandle_t		ammoModel;
1686 
1687 	qhandle_t		missileModel;
1688 	sfxHandle_t		missileSound;
1689 	void			(*missileTrailFunc)( centity_t *, const struct weaponInfo_s *wi );
1690 
1691 	qhandle_t		alt_missileModel;
1692 	sfxHandle_t		alt_missileSound;
1693 	void			(*alt_missileTrailFunc)( centity_t *, const struct weaponInfo_s *wi );
1694 
1695 //	sfxHandle_t		flashSound;
1696 //	sfxHandle_t		altFlashSound;
1697 
1698 	sfxHandle_t		firingSound;
1699 	sfxHandle_t		altFiringSound;
1700 
1701 	sfxHandle_t		stopSound;
1702 
1703 	sfxHandle_t		missileHitSound;
1704 	sfxHandle_t		altmissileHitSound;
1705 
1706 	sfxHandle_t		chargeSound;
1707 	sfxHandle_t		altChargeSound;
1708 
1709 	sfxHandle_t		selectSound;	// sound played when weapon is selected
1710 } weaponInfo_t;
1711 
1712 extern sfxHandle_t CAS_GetBModelSound( const char *name, int stage );
1713 
1714 enum
1715 {
1716 	EDGE_NORMAL,
1717 	EDGE_PATH,
1718 	EDGE_BLOCKED,
1719 	EDGE_FAILED,
1720 	EDGE_FLY,
1721 	EDGE_JUMP,
1722 	EDGE_LARGE,
1723 	EDGE_PATHBLOCKED,
1724 	EDGE_NEARESTVALID,
1725 	EDGE_NEARESTINVALID,
1726 
1727 	EDGE_NODE_FLOATING,
1728 	EDGE_NODE_NORMAL,
1729 	EDGE_NODE_GOAL,
1730 	EDGE_NODE_COMBAT,
1731 
1732 	EDGE_CELL,
1733 	EDGE_CELL_EMPTY,
1734 	EDGE_IMPACT_SAFE,
1735 	EDGE_IMPACT_POSSIBLE,
1736 	EDGE_THRUST,
1737 	EDGE_VELOCITY,
1738 
1739 	EDGE_FOLLOWPOS,
1740 
1741 	EDGE_WHITE_ONESECOND,
1742 	EDGE_WHITE_TWOSECOND,
1743 	EDGE_RED_ONESECOND,
1744 	EDGE_RED_TWOSECOND,
1745 };
1746 
1747 enum
1748 {
1749 	NODE_NORMAL,
1750 	NODE_FLOATING,
1751 	NODE_GOAL,
1752 	NODE_NAVGOAL,
1753 };
1754 
1755 #endif // #ifndef __G_SHARED_H__
1756