mirror of
https://github.com/openmoh/openmohaa.git
synced 2025-04-29 06:07:57 +03:00
838 lines
32 KiB
C
838 lines
32 KiB
C
/*
|
|
===========================================================================
|
|
Copyright (C) 1999-2005 Id Software, Inc.
|
|
Copyright (C) 2024 the OpenMoHAA team
|
|
|
|
This file is part of Quake III Arena source code.
|
|
|
|
Quake III Arena source code is free software; you can redistribute it
|
|
and/or modify it under the terms of the GNU General Public License as
|
|
published by the Free Software Foundation; either version 2 of the License,
|
|
or (at your option) any later version.
|
|
|
|
Quake III Arena source code is distributed in the hope that it will be
|
|
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with Quake III Arena source code; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
===========================================================================
|
|
*/
|
|
//
|
|
// bg_public.h -- definitions shared by both the server game and client game modules
|
|
|
|
// because games can change separately from the main system version, we need a
|
|
// second version that must match between game and cgame
|
|
|
|
#pragma once
|
|
|
|
#define GAME_VERSION "mohaa-base-1"
|
|
|
|
static const int MINS_X = -15;
|
|
static const int MINS_Y = -15;
|
|
static const int MINS_Z = 0; // IneQuation: bounding box and viewheights to match MoHAA
|
|
static const int MAXS_X = 15;
|
|
static const int MAXS_Y = 15;
|
|
static const int MAXS_Z = 94;
|
|
static const int DEAD_MINS_Z = 32;
|
|
static const int CROUCH_MAXS_Z = 49;
|
|
|
|
static const unsigned int DEFAULT_VIEWHEIGHT = 82;
|
|
static const unsigned int CROUCH_RUN_VIEWHEIGHT = 64;
|
|
static const unsigned int JUMP_START_VIEWHEIGHT = 52;
|
|
static const unsigned int CROUCH_VIEWHEIGHT = 48;
|
|
static const unsigned int PRONE_VIEWHEIGHT = 16;
|
|
static const unsigned int DEAD_VIEWHEIGHT = 8;
|
|
|
|
//
|
|
// config strings are a general means of communicating variable length strings
|
|
// from the server to all connected clients.
|
|
//
|
|
|
|
// CS_SERVERINFO and CS_SYSTEMINFO are defined in q_shared.h
|
|
|
|
#define CS_MESSAGE 2 // from the map worldspawn's message field
|
|
#define CS_SAVENAME 3 // current save
|
|
#define CS_MOTD 4 // g_motd string for server message of the day
|
|
#define CS_WARMUP 5 // server time when the match will be restarted
|
|
|
|
// 2 values were removed in team tactics
|
|
#define CS_MUSIC 6 // MUSIC_NewSoundtrack(cs)
|
|
#define CS_FOGINFO 7 // cg.farplane_cull cg.farplane_distance cg.farplane_color[3]
|
|
#define CS_SKYINFO 8 // cg.sky_alpha cg.sky_portal
|
|
|
|
#define CS_GAME_VERSION 9
|
|
#define CS_LEVEL_START_TIME 10 // so the timer only shows the current level cgs.levelStartTime
|
|
|
|
#define CS_CURRENT_OBJECTIVE 11
|
|
|
|
#define CS_RAIN_DENSITY 12 // cg.rain
|
|
#define CS_RAIN_SPEED 13
|
|
#define CS_RAIN_SPEEDVARY 14
|
|
#define CS_RAIN_SLANT 15
|
|
#define CS_RAIN_LENGTH 16
|
|
#define CS_RAIN_MINDIST 17
|
|
#define CS_RAIN_WIDTH 18
|
|
#define CS_RAIN_SHADER 19
|
|
#define CS_RAIN_NUMSHADERS 20
|
|
|
|
//
|
|
// Team tactics
|
|
//
|
|
#define CS_VOTE_TIME 21
|
|
#define CS_VOTE_STRING 22
|
|
#define CS_VOTE_YES 23
|
|
#define CS_VOTE_NO 24
|
|
#define CS_VOTE_UNDECIDED 25
|
|
//
|
|
|
|
#define CS_MATCHEND 26 // cgs.matchEndTime
|
|
|
|
#define CS_MODELS 32
|
|
#define CS_OBJECTIVES (CS_MODELS + MAX_MODELS) // 1056
|
|
#define CS_SOUNDS (CS_OBJECTIVES + MAX_OBJECTIVES) // 1076
|
|
|
|
#define CS_IMAGES (CS_SOUNDS + MAX_SOUNDS) // 1588
|
|
#define MAX_IMAGES 64
|
|
|
|
#define CS_LIGHTSTYLES (CS_IMAGES + MAX_IMAGES) //1652
|
|
#define CS_PLAYERS (CS_LIGHTSTYLES + MAX_LIGHTSTYLES) // 1684
|
|
|
|
#define CS_WEAPONS (CS_PLAYERS + MAX_CLIENTS) // su44 was here
|
|
#define CS_TEAMS 1892
|
|
#define CS_GENERAL_STRINGS 1893
|
|
#define CS_SPECTATORS 1894
|
|
#define CS_ALLIES 1895
|
|
#define CS_AXIS 1896
|
|
#define CS_SOUNDTRACK 1881
|
|
|
|
#define CS_TEAMINFO 1
|
|
|
|
#define CS_MAX (CS_PARTICLES + MAX_LOCATIONS)
|
|
#if (CS_MAX) > MAX_CONFIGSTRINGS
|
|
# error overflow: (CS_MAX) > MAX_CONFIGSTRINGS
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
typedef enum {
|
|
GT_SINGLE_PLAYER, // single player
|
|
GT_FFA, // free for all
|
|
GT_TEAM, // team deathmatch
|
|
GT_TEAM_ROUNDS,
|
|
GT_OBJECTIVE,
|
|
// Team Assault game mode
|
|
GT_TOW,
|
|
// Team Tactics game mode
|
|
GT_LIBERATION,
|
|
GT_MAX_GAME_TYPE
|
|
} gametype_t;
|
|
|
|
//
|
|
// scale to use when evaluating entityState_t::constantLight scale
|
|
//
|
|
static const float CONSTANTLIGHT_RADIUS_SCALE = 8;
|
|
|
|
typedef enum {
|
|
GENDER_MALE,
|
|
GENDER_FEMALE,
|
|
GENDER_NEUTER
|
|
} gender_t;
|
|
|
|
enum vmAnim_e {
|
|
VM_ANIM_DISABLED,
|
|
VM_ANIM_IDLE,
|
|
VM_ANIM_CHARGE,
|
|
VM_ANIM_FIRE,
|
|
VM_ANIM_FIRE_SECONDARY,
|
|
VM_ANIM_RECHAMBER,
|
|
VM_ANIM_RELOAD,
|
|
VM_ANIM_RELOAD_SINGLE,
|
|
VM_ANIM_RELOAD_END,
|
|
VM_ANIM_PULLOUT,
|
|
VM_ANIM_PUTAWAY,
|
|
VM_ANIM_LADDERSTEP,
|
|
VM_ANIM_IDLE_0,
|
|
VM_ANIM_IDLE_1,
|
|
VM_ANIM_IDLE_2,
|
|
};
|
|
|
|
// su44: playerState_t::activeItems[8] slots
|
|
// they are sent as 16 bits
|
|
// TODO: find out rest of them
|
|
enum itemtype_e {
|
|
ITEM_AMMO,
|
|
ITEM_WEAPON
|
|
};
|
|
|
|
/*
|
|
===================================================================================
|
|
|
|
PMOVE MODULE
|
|
|
|
The pmove code takes a player_state_t and a usercmd_t and generates a new player_state_t
|
|
and some other output data. Used for local prediction on the client game and true
|
|
movement on the server game.
|
|
===================================================================================
|
|
*/
|
|
|
|
static const unsigned int MAX_CLIP_PLANES = 5;
|
|
static const float MIN_WALK_NORMAL = 0.7f; // can't walk on very steep slopes
|
|
|
|
static const float STEPSIZE = 18;
|
|
|
|
static const float OVERCLIP = 1.001f;
|
|
|
|
// su44: our pmtype_t enum must be the same
|
|
// as in MoHAA, because playerState_t::pm_type
|
|
// is send over the net and used by cgame
|
|
// for movement prediction
|
|
typedef enum {
|
|
PM_NORMAL, // can accelerate and turn
|
|
PM_CLIMBWALL, // su44: I think it's used for ladders
|
|
PM_NOCLIP, // noclip movement
|
|
PM_DEAD, // no acceleration or turning, but free falling
|
|
} pmtype_t;
|
|
|
|
typedef enum {
|
|
EV_NONE,
|
|
|
|
EV_FALL_SHORT,
|
|
EV_FALL_MEDIUM,
|
|
EV_FALL_FAR,
|
|
EV_FALL_FATAL,
|
|
EV_TERMINAL_VELOCITY,
|
|
|
|
EV_WATER_TOUCH, // foot touches
|
|
EV_WATER_LEAVE, // foot leaves
|
|
EV_WATER_UNDER, // head touches
|
|
EV_WATER_CLEAR, // head leaves
|
|
|
|
EV_LAST_PREDICTED // just a marker point
|
|
|
|
// events generated by non-players or never predicted
|
|
} entity_event_t;
|
|
|
|
#if 0
|
|
// pmove->pm_flags
|
|
# define PMF_DUCKED (1 << 0)
|
|
# define PMF_JUMP_HELD (1 << 1)
|
|
# define PMF_BACKWARDS_JUMP 0 //(1<<3) // go into backwards land
|
|
# define PMF_BACKWARDS_RUN 0 //(1<<4) // coast down to backwards run
|
|
# define PMF_TIME_LAND (1 << 5) // pm_time is time before rejump
|
|
# define PMF_TIME_KNOCKBACK (1 << 6) // pm_time is an air-accelerate only time
|
|
# define PMF_TIME_WATERJUMP (1 << 8) // pm_time is waterjump
|
|
# define PMF_USE_ITEM_HELD (1 << 10)
|
|
# define PMF_GRAPPLE_PULL (1 << 11) // pull towards grapple location
|
|
# define PMF_FOLLOW (1 << 12) // spectate following another player
|
|
# define PMF_SCOREBOARD (1 << 13) // spectate as a scoreboard
|
|
# define PMF_INVULEXPAND (1 << 14) // invulnerability sphere set to full size
|
|
# define PMF_FROZEN (1 << 15)
|
|
# define PMF_NO_MOVE (1 << 16)
|
|
# define PMF_NO_PREDICTION (1 << 17)
|
|
# define PMF_NO_GRAVITY (1 << 18)
|
|
# define PMF_LEVELEXIT (1 << 20) // use camera view instead of ps view
|
|
#endif
|
|
|
|
// moh pm_flags
|
|
#define PMF_DUCKED (1 << 0)
|
|
#define PMF_VIEW_PRONE (1 << 1)
|
|
#define PMF_DAMAGE_ANGLES (1 << 1) // in protocol >= 15
|
|
//
|
|
// 2 Flags removed in team tactics
|
|
//
|
|
#define PMF_SPECTATING (1 << 2)
|
|
#define PMF_RESPAWNED (1 << 3)
|
|
#define PMF_NO_PREDICTION (1 << 4)
|
|
#define PMF_FROZEN (1 << 5)
|
|
#define PMF_INTERMISSION (1 << 6)
|
|
#define PMF_SPECTATE_FOLLOW (1 << 7)
|
|
#define PMF_CAMERA_VIEW (1 << 7) // use camera view instead of ps view
|
|
#define PMF_NO_MOVE (1 << 8)
|
|
#define PMF_VIEW_DUCK_RUN (1 << 9)
|
|
#define PMF_VIEW_JUMP_START (1 << 10)
|
|
#define PMF_LEVELEXIT (1 << 11)
|
|
#define PMF_NO_GRAVITY (1 << 12)
|
|
#define PMF_NO_HUD (1 << 13)
|
|
#define PMF_TURRET (1 << 14)
|
|
#define PMF_NO_LEAN (1 << 15)
|
|
|
|
// moveposflags
|
|
enum moveposflags_e {
|
|
MPF_POSITION_STANDING = (1 << 0),
|
|
MPF_POSITION_CROUCHING = (1 << 1),
|
|
MPF_POSITION_PRONE = (1 << 2),
|
|
MPF_POSITION_OFFGROUND = (1 << 3),
|
|
MPF_MOVEMENT_WALKING = (1 << 4),
|
|
MPF_MOVEMENT_RUNNING = (1 << 5),
|
|
MPF_MOVEMENT_FALLING = (1 << 6),
|
|
};
|
|
|
|
#define MAXTOUCH 32
|
|
|
|
enum moveresult_e {
|
|
MOVERESULT_NONE, // nothing blocking
|
|
MOVERESULT_TURNED, // move blocked, but player turned to avoid it
|
|
MOVERESULT_BLOCKED, // move blocked by slope or wall
|
|
MOVERESULT_HITWALL // player ran into wall
|
|
};
|
|
|
|
typedef struct {
|
|
// state (in / out)
|
|
playerState_t *ps;
|
|
|
|
// command (in)
|
|
usercmd_t cmd;
|
|
int tracemask; // collide against these types of surfaces
|
|
int debugLevel; // if set, diagnostic output will be printed
|
|
qboolean noFootsteps; // if the game is setup for no footsteps by the server
|
|
qboolean alwaysAllowLean;
|
|
|
|
int framecount;
|
|
|
|
// results (out)
|
|
int numtouch;
|
|
int touchents[MAXTOUCH];
|
|
|
|
int moveresult; // indicates whether 2the player's movement was blocked and how
|
|
qboolean stepped;
|
|
|
|
int pmoveEvent; // events predicted on client side
|
|
vec3_t mins, maxs; // bounding box size
|
|
|
|
int watertype;
|
|
int waterlevel;
|
|
|
|
float xyspeed;
|
|
|
|
// for fixed msec Pmove
|
|
int pmove_fixed;
|
|
int pmove_msec;
|
|
|
|
// callbacks to test the world
|
|
// these will be different functions during game and cgame
|
|
void (*trace)(
|
|
trace_t *results,
|
|
const vec3_t start,
|
|
const vec3_t mins,
|
|
const vec3_t maxs,
|
|
const vec3_t end,
|
|
int passEntityNum,
|
|
int contentMask,
|
|
int capsule,
|
|
qboolean traceDeep
|
|
);
|
|
int (*pointcontents)(const vec3_t point, int passEntityNum);
|
|
|
|
//
|
|
// Openmohaa addition
|
|
//
|
|
int protocol;
|
|
float leanSpeed;
|
|
float leanRecoverSpeed;
|
|
float leanAdd;
|
|
float leanMax;
|
|
} pmove_t;
|
|
|
|
// if a full pmove isn't done on the client, you can just update the angles
|
|
void PM_GetMove(float *pfForward, float *pfRight);
|
|
void PM_UpdateViewAngles(playerState_t *ps, const usercmd_t *cmd);
|
|
void Pmove_GroundTrace(pmove_t *pmove);
|
|
void Pmove(pmove_t *pmove);
|
|
void
|
|
PmoveAdjustAngleSettings(vec_t *vViewAngles, vec_t *vAngles, playerState_t *pPlayerState, entityState_t *pEntState);
|
|
void PmoveAdjustAngleSettings_Client(
|
|
vec_t *vViewAngles, vec_t *vAngles, playerState_t *pPlayerState, entityState_t *pEntState
|
|
);
|
|
|
|
//===================================================================================
|
|
|
|
static const unsigned int MAX_LETTERBOX_SIZE = 0x7fff;
|
|
|
|
enum weaponclass_e {
|
|
WEAPON_CLASS_PISTOL = (1 << 0),
|
|
WEAPON_CLASS_RIFLE = (1 << 1),
|
|
WEAPON_CLASS_SMG = (1 << 2),
|
|
WEAPON_CLASS_MG = (1 << 3),
|
|
WEAPON_CLASS_GRENADE = (1 << 4),
|
|
WEAPON_CLASS_HEAVY = (1 << 5),
|
|
WEAPON_CLASS_CANNON = (1 << 6),
|
|
WEAPON_CLASS_ITEM = (1 << 7),
|
|
WEAPON_CLASS_ITEM1 = (1 << 8),
|
|
WEAPON_CLASS_ITEM2 = (1 << 9),
|
|
WEAPON_CLASS_ITEM3 = (1 << 10),
|
|
WEAPON_CLASS_ITEM4 = (1 << 11),
|
|
WEAPON_CLASS_ANY_ITEM =
|
|
(WEAPON_CLASS_ITEM | WEAPON_CLASS_ITEM1 | WEAPON_CLASS_ITEM2 | WEAPON_CLASS_ITEM3 | WEAPON_CLASS_ITEM4),
|
|
WEAPON_CLASS_ITEM_SLOT_BITS =
|
|
(WEAPON_CLASS_ITEM1 | WEAPON_CLASS_ITEM2 | WEAPON_CLASS_ITEM3 | WEAPON_CLASS_ITEM4),
|
|
WEAPON_CLASS_PRIMARY = (!(WEAPON_CLASS_PISTOL | WEAPON_CLASS_GRENADE)),
|
|
WEAPON_CLASS_SECONDARY = (WEAPON_CLASS_PISTOL | WEAPON_CLASS_GRENADE),
|
|
WEAPON_CLASS_THROWABLE = (WEAPON_CLASS_GRENADE | WEAPON_CLASS_ITEM),
|
|
WEAPON_CLASS_MISC =
|
|
(WEAPON_CLASS_CANNON | WEAPON_CLASS_ITEM | WEAPON_CLASS_ITEM1 | WEAPON_CLASS_ITEM2 | WEAPON_CLASS_ITEM3
|
|
| WEAPON_CLASS_ITEM4),
|
|
WEAPON_CLASS_ITEMINDEX = (WEAPON_CLASS_ITEM1 | WEAPON_CLASS_ITEM2 | WEAPON_CLASS_ITEM3 | WEAPON_CLASS_ITEM4)
|
|
};
|
|
|
|
// player_state->persistant[] indexes
|
|
// these fields are the only part of player_state that isn't
|
|
// cleared on respawn
|
|
// NOTE: may not have more than 16
|
|
typedef enum {
|
|
PERS_SCORE, // !!! MUST NOT CHANGE, SERVER AND GAME BOTH REFERENCE !!!
|
|
PERS_TEAM // player team
|
|
} persEnum_t;
|
|
|
|
// entityState_t->eFlags
|
|
// su44: eFlags used in MoHAA
|
|
#define EF_EVERYFRAME 0x00000008
|
|
#define EF_CLIMBWALL 0x00000010
|
|
#define EF_UNARMED 0x00000020 // su44: this player has his weapon holstered
|
|
#define EF_LINKANGLES 0x00000040
|
|
#define EF_ALLIES 0x00000080 // su44: this player is in allies team
|
|
#define EF_AXIS 0x00000100 // su44: this player is in axis team
|
|
#define EF_ANY_TEAM (EF_ALLIES | EF_AXIS)
|
|
#define EF_DEAD 0x00000200 // don't draw a foe marker over players with EF_DEAD
|
|
#define EF_NO_LERP 0x00001000 // don't lerp animations
|
|
|
|
//
|
|
// Team assault flags
|
|
//
|
|
#define EF_PLAYER_IN_MENU 0x00000400 // Player is in menu
|
|
#define EF_PLAYER_TALKING 0x00000800 // Player is talking
|
|
#define EF_PLAYER_ARTILLERY 0x00002000 // Player is using an artillery
|
|
|
|
// su44: q3 remnants
|
|
#define EF_TICKING 0x00000002 // used to make players play the prox mine ticking sound
|
|
#define EF_TELEPORT_BIT 0x00000004 // toggled every time the origin abruptly changes
|
|
#define EF_AWARD_EXCELLENT 0x00000008 // draw an excellent sprite
|
|
#define EF_PLAYER_EVENT 0x00000010
|
|
#define EF_BOUNCE 0x00000010 // for missiles
|
|
#define EF_AWARD_GAUNTLET 0x00000040 // draw a gauntlet sprite
|
|
#define EF_MOVER_STOP 0x00000400 // will push otherwise
|
|
#define EF_AWARD_CAP 0x00000800 // draw the capture sprite
|
|
#define EF_TALK 0x00001000 // draw a talk balloon
|
|
#define EF_CONNECTION 0x00002000 // draw a connection trouble sprite
|
|
#define EF_VOTED 0x00004000 // already cast a vote
|
|
#define EF_AWARD_IMPRESSIVE 0x00008000 // draw an impressive sprite
|
|
#define EF_AWARD_DEFEND 0x00010000 // draw a defend sprite
|
|
#define EF_AWARD_ASSIST 0x00020000 // draw a assist sprite
|
|
#define EF_AWARD_DENIED 0x00040000 // denied
|
|
#define EF_TEAMVOTED 0x00080000 // already cast a team vote
|
|
#define EF_ANTISBJUICE 0x00200000 // anti sucknblow juice
|
|
#define EF_DONT_PROCESS_COMMANDS 0x00400000 // don't process client commands for this entity
|
|
|
|
//===================================================================================
|
|
|
|
//
|
|
// Tag specific flags
|
|
//
|
|
#define TAG_NUMBITS 10 // number of bits required to send over network
|
|
#define TAG_MASK ((1 << 10) - 1)
|
|
|
|
//
|
|
// Camera Flags
|
|
//
|
|
#define CF_CAMERA_ANGLES_ABSOLUTE (1 << 0)
|
|
#define CF_CAMERA_ANGLES_IGNORE_PITCH (1 << 1)
|
|
#define CF_CAMERA_ANGLES_IGNORE_YAW (1 << 2)
|
|
#define CF_CAMERA_ANGLES_ALLOWOFFSET (1 << 3)
|
|
#define CF_CAMERA_ANGLES_TURRETMODE (1 << 4)
|
|
#define CF_CAMERA_CUT_BIT (1 << 7) // this bit gets toggled everytime we do a hard camera cut
|
|
|
|
// means of death
|
|
// su44: changed to MoHAA's
|
|
typedef enum {
|
|
MOD_NONE,
|
|
MOD_SUICIDE,
|
|
MOD_CRUSH,
|
|
MOD_CRUSH_EVERY_FRAME,
|
|
MOD_TELEFRAG,
|
|
MOD_LAVA,
|
|
MOD_SLIME,
|
|
MOD_FALLING,
|
|
MOD_LAST_SELF_INFLICTED,
|
|
MOD_EXPLOSION,
|
|
MOD_EXPLODEWALL,
|
|
MOD_ELECTRIC,
|
|
MOD_ELECTRICWATER,
|
|
MOD_THROWNOBJECT,
|
|
MOD_GRENADE,
|
|
MOD_BEAM,
|
|
MOD_ROCKET,
|
|
MOD_IMPACT,
|
|
MOD_BULLET,
|
|
MOD_FAST_BULLET,
|
|
MOD_VEHICLE,
|
|
MOD_FIRE,
|
|
MOD_FLASHBANG,
|
|
MOD_ON_FIRE,
|
|
MOD_GIB,
|
|
MOD_IMPALE,
|
|
MOD_BASH,
|
|
MOD_SHOTGUN,
|
|
//
|
|
// Team assault
|
|
//
|
|
MOD_AAGUN,
|
|
//
|
|
// Team tactics
|
|
//
|
|
MOD_LANDMINE,
|
|
MOD_TOTAL_NUMBER,
|
|
|
|
} meansOfDeath_t;
|
|
|
|
//
|
|
// entityState_t->eType
|
|
//
|
|
typedef enum {
|
|
ET_MODELANIM_SKEL,
|
|
ET_MODELANIM,
|
|
ET_VEHICLE,
|
|
ET_PLAYER,
|
|
ET_ITEM,
|
|
ET_GENERAL,
|
|
ET_MISSILE,
|
|
ET_MOVER,
|
|
ET_BEAM,
|
|
ET_MULTIBEAM,
|
|
ET_PORTAL,
|
|
ET_EVENT_ONLY,
|
|
ET_RAIN,
|
|
ET_LEAF,
|
|
ET_SPEAKER,
|
|
ET_PUSH_TRIGGER,
|
|
ET_TELEPORT_TRIGGER,
|
|
ET_DECAL,
|
|
ET_EMITTER,
|
|
ET_ROPE,
|
|
ET_EVENTS,
|
|
ET_EXEC_COMMANDS
|
|
} entityType_t;
|
|
|
|
// player_state->stats[] indexes
|
|
// NOTE: may not have more than 32
|
|
typedef enum {
|
|
STAT_HEALTH,
|
|
STAT_MAXHEALTH,
|
|
STAT_WEAPONS,
|
|
STAT_EQUIPPED_WEAPON,
|
|
STAT_AMMO,
|
|
STAT_MAXAMMO,
|
|
STAT_CLIPAMMO,
|
|
STAT_MAXCLIPAMMO,
|
|
STAT_INZOOM,
|
|
STAT_CROSSHAIR,
|
|
STAT_LAST_PAIN,
|
|
STAT_NEXTHEALTH, // was unused until 2.0
|
|
STAT_BOSSHEALTH,
|
|
STAT_CINEMATIC,
|
|
STAT_ADDFADE,
|
|
STAT_LETTERBOX,
|
|
STAT_COMPASSNORTH,
|
|
STAT_OBJECTIVELEFT,
|
|
STAT_OBJECTIVERIGHT,
|
|
STAT_OBJECTIVECENTER,
|
|
STAT_TEAM,
|
|
STAT_KILLS,
|
|
STAT_DEATHS,
|
|
STAT_VEHICLE_HEALTH, // was unused until 2.0
|
|
STAT_VEHICLE_MAX_HEALTH, // was unused until 2.0
|
|
STAT_HIGHEST_SCORE,
|
|
STAT_ATTACKERCLIENT,
|
|
STAT_INFOCLIENT,
|
|
STAT_INFOCLIENT_HEALTH,
|
|
STAT_DAMAGEDIR,
|
|
STAT_SECONDARY_AMMO, // added in 2.0
|
|
STAT_LAST_STAT
|
|
} playerstat_t;
|
|
|
|
extern const char *means_of_death_strings[];
|
|
|
|
typedef enum {
|
|
TEAM_NONE,
|
|
TEAM_SPECTATOR,
|
|
TEAM_FREEFORALL,
|
|
TEAM_ALLIES,
|
|
TEAM_AXIS,
|
|
TEAM_MAX
|
|
} teamtype_t;
|
|
|
|
typedef enum {
|
|
SWT_NORMAL,
|
|
SWT_FUSE,
|
|
SWT_FUSE_WET
|
|
} stopWatchType_t;
|
|
|
|
//---------------------------------------------------------
|
|
|
|
// g_dmflags->integer flags
|
|
#define DF_NO_HEALTH (1 << 0)
|
|
#define DF_NO_POWERUPS (1 << 1)
|
|
#define DF_WEAPONS_STAY (1 << 2)
|
|
#define DF_NO_FALLING (1 << 3)
|
|
#define DF_INSTANT_ITEMS (1 << 4)
|
|
#define DF_SAME_LEVEL (1 << 5)
|
|
#define DF_SKINTEAMS (1 << 6)
|
|
#define DF_MODELTEAMS (1 << 7)
|
|
#define DF_FRIENDLY_FIRE (1 << 8)
|
|
#define DF_SPAWN_FARTHEST (1 << 9)
|
|
#define DF_FORCE_RESPAWN (1 << 10)
|
|
#define DF_NO_ARMOR (1 << 11)
|
|
#define DF_FAST_WEAPONS (1 << 12)
|
|
#define DF_NOEXIT (1 << 13)
|
|
#define DF_INFINITE_AMMO (1 << 14)
|
|
#define DF_FIXED_FOV (1 << 15)
|
|
#define DF_NO_DROP_WEAPONS (1 << 16)
|
|
#define DF_NO_FOOTSTEPS (1 << 17)
|
|
#define DF_ALLOW_LEAN_MOVEMENT (1 << 18)
|
|
#define DF_OLD_SNIPER (1 << 19)
|
|
#define DF_DISALLOW_KAR98_MORTAR (1 << 20)
|
|
|
|
#define DF_WEAPON_LANDMINE_ALWAYS (1 << 21)
|
|
#define DF_WEAPON_NO_RIFLE (1 << 22)
|
|
#define DF_WEAPON_NO_SNIPER (1 << 23)
|
|
#define DF_WEAPON_NO_SMG (1 << 24)
|
|
#define DF_WEAPON_NO_MG (1 << 25)
|
|
#define DF_WEAPON_NO_ROCKET (1 << 26)
|
|
#define DF_WEAPON_NO_SHOTGUN (1 << 27)
|
|
#define DF_WEAPON_NO_LANDMINE (1 << 28)
|
|
|
|
#define DM_FLAG(flag) (g_gametype->integer != GT_SINGLE_PLAYER && ((int)dmflags->integer & (flag)))
|
|
|
|
//
|
|
// Content masks
|
|
//
|
|
|
|
#define MASK_ALL (-1)
|
|
#define MASK_SOLID \
|
|
(CONTENTS_SOLID | CONTENTS_BODY | CONTENTS_UNKNOWN2 | CONTENTS_NOBOTCLIP | CONTENTS_BBOX | CONTENTS_FENCE)
|
|
#define MASK_SAFESOLID (CONTENTS_BODY | CONTENTS_UNKNOWN2 | CONTENTS_NOBOTCLIP | CONTENTS_BBOX)
|
|
#define MASK_USABLE (CONTENTS_SOLID | CONTENTS_BBOX | CONTENTS_NOBOTCLIP | CONTENTS_UNKNOWN2 | CONTENTS_BODY)
|
|
#define MASK_PLAYERSOLID \
|
|
(CONTENTS_TRIGGER | CONTENTS_BODY | CONTENTS_PLAYERCLIP | CONTENTS_FENCE | CONTENTS_UNKNOWN2 | CONTENTS_NOBOTCLIP \
|
|
| CONTENTS_BBOX | CONTENTS_SOLID)
|
|
#define MASK_GUNTARGET \
|
|
(CONTENTS_SOLID | CONTENTS_LADDER | CONTENTS_LAVA | CONTENTS_SLIME | CONTENTS_CLAYPIDGEON | CONTENTS_BBOX \
|
|
| CONTENTS_NOBOTCLIP | CONTENTS_UNKNOWN2 | CONTENTS_UNKNOWN3 | CONTENTS_FENCE | CONTENTS_BODY | CONTENTS_CORPSE \
|
|
| CONTENTS_TRIGGER)
|
|
#define MASK_FOOTSHADOW (CONTENTS_FENCE | CONTENTS_SLIME | CONTENTS_LAVA | CONTENTS_SOLID)
|
|
#define MASK_PLAYERSTART (CONTENTS_SOLID | CONTENTS_BBOX | CONTENTS_NOBOTCLIP | CONTENTS_UNKNOWN2 | CONTENTS_BODY)
|
|
#define MASK_VIEWSOLID (CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_FENCE | CONTENTS_TRIGGER)
|
|
#define MASK_DEADSOLID (CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_CORPSE | CONTENTS_NOTTEAM2 | CONTENTS_FENCE)
|
|
#define MASK_MONSTERSOLID \
|
|
(CONTENTS_SOLID | CONTENTS_MONSTERCLIP | CONTENTS_BODY | CONTENTS_TRIGGER | CONTENTS_UNKNOWN2 | CONTENTS_BBOX)
|
|
#define MASK_WATER (CONTENTS_WATER | CONTENTS_LAVA | CONTENTS_SLIME)
|
|
#define MASK_OPAQUE (CONTENTS_SOLID | CONTENTS_SLIME | CONTENTS_LAVA)
|
|
#define MASK_SHOT \
|
|
(CONTENTS_SOLID | CONTENTS_BBOX | CONTENTS_NOBOTCLIP | CONTENTS_UNKNOWN2 | CONTENTS_FENCE | CONTENTS_WEAPONCLIP \
|
|
| CONTENTS_BODY | CONTENTS_TRIGGER)
|
|
#define MASK_SHOT_TRIG \
|
|
(CONTENTS_SOLID | CONTENTS_CLAYPIDGEON | CONTENTS_WATER | CONTENTS_BBOX | CONTENTS_NOBOTCLIP | CONTENTS_UNKNOWN2 \
|
|
| CONTENTS_FENCE | CONTENTS_WEAPONCLIP | CONTENTS_BODY | CONTENTS_TRIGGER)
|
|
#define MASK_SHOT_FLUID \
|
|
(CONTENTS_SOLID | CONTENTS_WATER | CONTENTS_BBOX | CONTENTS_NOBOTCLIP | CONTENTS_UNKNOWN2 | CONTENTS_FENCE \
|
|
| CONTENTS_WEAPONCLIP | CONTENTS_SHOOTONLY | CONTENTS_BODY | CONTENTS_TRIGGER)
|
|
#define MASK_PROJECTILE \
|
|
(CONTENTS_SOLID | CONTENTS_BODY | CONTENTS_TRIGGER | CONTENTS_FENCE | CONTENTS_WEAPONCLIP | CONTENTS_UNKNOWN2 \
|
|
| CONTENTS_NOBOTCLIP | CONTENTS_BBOX)
|
|
#define MASK_MELEE \
|
|
(CONTENTS_SOLID | CONTENTS_BODY | CONTENTS_TRIGGER | CONTENTS_WEAPONCLIP | CONTENTS_FENCE | CONTENTS_UNKNOWN2 \
|
|
| CONTENTS_NOBOTCLIP | CONTENTS_BBOX | CONTENTS_NOTTEAM1)
|
|
#define MASK_PATHSOLID \
|
|
(CONTENTS_SOLID | CONTENTS_TRIGGER | CONTENTS_BODY | CONTENTS_FENCE | CONTENTS_UNKNOWN2 | CONTENTS_BBOX \
|
|
| CONTENTS_MONSTERCLIP)
|
|
#define MASK_LOOK (CONTENTS_SOLID | CONTENTS_LAVA | CONTENTS_SLIME | CONTENTS_FENCE)
|
|
#define MASK_CAMERASOLID (CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_BODY | MASK_WATER)
|
|
#define MASK_BEAM (CONTENTS_SOLID | CONTENTS_TRIGGER | CONTENTS_PLAYERCLIP | CONTENTS_BODY | CONTENTS_FENCE)
|
|
#define MASK_LADDER \
|
|
(CONTENTS_SOLID | CONTENTS_LADDER | CONTENTS_TRIGGER | CONTENTS_PLAYERCLIP | CONTENTS_BODY | CONTENTS_FENCE)
|
|
#define MASK_AUTOCALCLIFE (CONTENTS_SOLID | CONTENTS_TRIGGER | CONTENTS_FENCE)
|
|
#define MASK_EXPLOSION (CONTENTS_SOLID | CONTENTS_TRIGGER | CONTENTS_WEAPONCLIP)
|
|
#define MASK_SOUND (CONTENTS_SOLID | CONTENTS_TRANSLUCENT)
|
|
#define MASK_VEHICLE \
|
|
(CONTENTS_SOLID | CONTENTS_BBOX | CONTENTS_NOBOTCLIP | CONTENTS_UNKNOWN2 | CONTENTS_FENCE | CONTENTS_VEHICLECLIP \
|
|
| CONTENTS_BODY | CONTENTS_TRIGGER)
|
|
#define MASK_VEHICLE_TIRES (CONTENTS_SOLID | CONTENTS_BBOX | CONTENTS_FENCE | CONTENTS_VEHICLECLIP | CONTENTS_TRIGGER)
|
|
#define MASK_CLICK \
|
|
(CONTENTS_VEHICLECLIP | CONTENTS_WEAPONCLIP | CONTENTS_MONSTERCLIP | CONTENTS_PLAYERCLIP | CONTENTS_SOLID)
|
|
#define MASK_CANSEE \
|
|
(CONTENTS_SOLID | CONTENTS_LAVA | CONTENTS_SLIME | CONTENTS_BBOX | CONTENTS_NOBOTCLIP | CONTENTS_UNKNOWN2 \
|
|
| CONTENTS_FENCE | CONTENTS_WEAPONCLIP | CONTENTS_BODY)
|
|
#define MASK_CANSEE_NOENTS (CONTENTS_SOLID | CONTENTS_LAVA | CONTENTS_SLIME | CONTENTS_FENCE | CONTENTS_WEAPONCLIP)
|
|
#define MASK_USE \
|
|
(CONTENTS_SOLID | CONTENTS_BBOX | CONTENTS_NOBOTCLIP | CONTENTS_UNKNOWN2 | CONTENTS_FENCE | CONTENTS_WEAPONCLIP \
|
|
| CONTENTS_BODY | CONTENTS_TRIGGER)
|
|
#define MASK_CLICKITEM (MASK_SOLID | CONTENTS_UNKNOWN3)
|
|
#define MASK_ITEM (CONTENTS_SOLID | CONTENTS_TRIGGER | CONTENTS_PLAYERCLIP | CONTENTS_FENCE)
|
|
#define MASK_TRANSITION \
|
|
(CONTENTS_SOLID | CONTENTS_LAVA | CONTENTS_SLIME | CONTENTS_FENCE | CONTENTS_WEAPONCLIP | CONTENTS_UNKNOWN2 \
|
|
| CONTENTS_BBOX)
|
|
#define MASK_TARGETPATH \
|
|
(CONTENTS_SOLID | CONTENTS_TRIGGER | CONTENTS_MONSTERCLIP | CONTENTS_FENCE | CONTENTS_UNKNOWN2 | CONTENTS_BBOX)
|
|
#define MASK_ACTORPATH (CONTENTS_SOLID | CONTENTS_FENCE | CONTENTS_MONSTERCLIP | CONTENTS_TRIGGER)
|
|
#define MASK_GRENADEPATH \
|
|
(CONTENTS_SOLID | CONTENTS_BBOX | CONTENTS_NOBOTCLIP | CONTENTS_UNKNOWN2 | CONTENTS_FENCE | CONTENTS_WEAPONCLIP \
|
|
| CONTENTS_BODY | CONTENTS_TRIGGER)
|
|
#define MASK_LINE (CONTENTS_SOLID | CONTENTS_BODY | CONTENTS_UNKNOWN2 | CONTENTS_NOBOTCLIP | CONTENTS_BBOX)
|
|
#define MASK_VEHICLETURRET \
|
|
(CONTENTS_SOLID | CONTENTS_TRIGGER | CONTENTS_FENCE | CONTENTS_VEHICLECLIP | CONTENTS_MONSTERCLIP \
|
|
| CONTENTS_PLAYERCLIP)
|
|
#define MASK_VOLUMETRIC_SMOKE \
|
|
(CONTENTS_TRANSLUCENT | CONTENTS_CORPSE | CONTENTS_BODY | CONTENTS_UNKNOWN2 | CONTENTS_NOBOTCLIP | CONTENTS_BBOX \
|
|
| CONTENTS_WATER)
|
|
#define MASK_SMOKE_SPRITE (CONTENTS_SOLID | CONTENTS_TRIGGER | CONTENTS_FENCE)
|
|
#define MASK_LANDMINE \
|
|
(CONTENTS_SOLID | CONTENTS_BBOX | CONTENTS_NOBOTCLIP | CONTENTS_UNKNOWN2 | CONTENTS_FENCE | CONTENTS_PLAYERCLIP \
|
|
| CONTENTS_WEAPONCLIP | CONTENTS_BODY | CONTENTS_DETAIL | CONTENTS_STRUCTURAL | CONTENTS_TRIGGER)
|
|
#define MASK_LANDMINE_PLACE \
|
|
(CONTENTS_SOLID | CONTENTS_FENCE | CONTENTS_PLAYERCLIP | CONTENTS_DETAIL | CONTENTS_STRUCTURAL | CONTENTS_TRIGGER)
|
|
#define MASK_BATTLELANGUAGE \
|
|
(CONTENTS_SOLID | CONTENTS_BBOX | CONTENTS_NOBOTCLIP | CONTENTS_UNKNOWN2 | CONTENTS_PLAYERCLIP \
|
|
| CONTENTS_WEAPONCLIP | CONTENTS_BODY | CONTENTS_TRIGGER)
|
|
#define MASK_SCRIPT_SLAVE \
|
|
(CONTENTS_LADDER | CONTENTS_CLAYPIDGEON | CONTENTS_BBOX | CONTENTS_NOBOTCLIP | CONTENTS_UNKNOWN2 \
|
|
| CONTENTS_UNKNOWN3 | CONTENTS_BODY | CONTENTS_CORPSE)
|
|
#define MASK_CARRYABLETURRET \
|
|
(CONTENTS_SOLID | CONTENTS_BBOX | CONTENTS_NOBOTCLIP | CONTENTS_UNKNOWN2 | CONTENTS_FENCE | CONTENTS_BODY)
|
|
#define MASK_AITURRET \
|
|
(CONTENTS_SOLID | CONTENTS_LAVA | CONTENTS_SLIME | CONTENTS_BBOX | CONTENTS_NOBOTCLIP | CONTENTS_UNKNOWN2 \
|
|
| CONTENTS_FENCE | CONTENTS_WEAPONCLIP | CONTENTS_BODY)
|
|
#define MASK_TRANSPARENT (CONTENTS_SOLID | CONTENTS_LAVA | CONTENTS_SLIME | CONTENTS_BBOX | CONTENTS_FENCE)
|
|
#define MASK_MOVEVEHICLE \
|
|
(CONTENTS_LADDER | CONTENTS_CLAYPIDGEON | CONTENTS_BBOX | CONTENTS_NOBOTCLIP | CONTENTS_UNKNOWN3 | CONTENTS_BODY \
|
|
| CONTENTS_CORPSE)
|
|
#define MASK_MOVEINFO (CONTENTS_SOLID | CONTENTS_FENCE)
|
|
#define MASK_AI_CANSEE \
|
|
(CONTENTS_SOLID | CONTENTS_LAVA | CONTENTS_SLIME | CONTENTS_BBOX | CONTENTS_UNKNOWN2 | CONTENTS_FENCE \
|
|
| CONTENTS_WEAPONCLIP)
|
|
#define MASK_CORNER_NODE \
|
|
(CONTENTS_SOLID | CONTENTS_LAVA | CONTENTS_SLIME | CONTENTS_UNKNOWN2 | CONTENTS_WEAPONCLIP | CONTENTS_BODY)
|
|
#define MASK_IGNORE_ENTS \
|
|
(CONTENTS_CORPSE | CONTENTS_BODY | CONTENTS_UNKNOWN3 | CONTENTS_UNKNOWN2 | CONTENTS_NOBOTCLIP | CONTENTS_BBOX \
|
|
| CONTENTS_CLAYPIDGEON | CONTENTS_LADDER)
|
|
|
|
//
|
|
// Marks
|
|
//
|
|
#define MASK_MARK (CONTENTS_TRIGGER | CONTENTS_SOLID)
|
|
#define MASK_TREADMARK \
|
|
(CONTENTS_TRIGGER | CONTENTS_BODY | CONTENTS_PLAYERCLIP | CONTENTS_FENCE | CONTENTS_UNKNOWN2 | CONTENTS_NOBOTCLIP \
|
|
| CONTENTS_BBOX | CONTENTS_SOLID)
|
|
|
|
void BG_EvaluateTrajectoryDelta(const trajectory_t *tr, int atTime, vec3_t result);
|
|
|
|
void BG_PlayerStateToEntityState(playerState_t *ps, entityState_t *s, qboolean snap);
|
|
void BG_PlayerStateToEntityStateExtraPolate(playerState_t *ps, entityState_t *s, int time, qboolean snap);
|
|
|
|
enum cg_message_ver_15_e {
|
|
CGM_NONE,
|
|
CGM_BULLET_1,
|
|
CGM_BULLET_2,
|
|
CGM_BULLET_3,
|
|
CGM_BULLET_4,
|
|
CGM_BULLET_5,
|
|
CGM_BULLET_6,
|
|
CGM_BULLET_7,
|
|
CGM_BULLET_8,
|
|
CGM_BULLET_9,
|
|
CGM_BULLET_10,
|
|
CGM_BULLET_11,
|
|
CGM_MELEE_IMPACT,
|
|
CGM_EXPLOSION_EFFECT_1,
|
|
CGM_EXPLOSION_EFFECT_2,
|
|
CGM_EXPLOSION_EFFECT_3,
|
|
CGM_EXPLOSION_EFFECT_4,
|
|
CGM_PADDING_1,
|
|
CGM_MAKE_EFFECT_1,
|
|
CGM_MAKE_EFFECT_2,
|
|
CGM_MAKE_EFFECT_3,
|
|
CGM_MAKE_EFFECT_4,
|
|
CGM_MAKE_EFFECT_5,
|
|
CGM_MAKE_EFFECT_6,
|
|
CGM_MAKE_EFFECT_7,
|
|
CGM_MAKE_EFFECT_8,
|
|
CGM_MAKE_CRATE_DEBRIS,
|
|
CGM_MAKE_WINDOW_DEBRIS,
|
|
CGM_BULLET_NO_BARREL_1,
|
|
CGM_BULLET_NO_BARREL_2,
|
|
CGM_HUDDRAW_SHADER,
|
|
CGM_HUDDRAW_ALIGN,
|
|
CGM_HUDDRAW_RECT,
|
|
CGM_HUDDRAW_VIRTUALSIZE,
|
|
CGM_HUDDRAW_COLOR,
|
|
CGM_HUDDRAW_ALPHA,
|
|
CGM_HUDDRAW_STRING,
|
|
CGM_HUDDRAW_FONT,
|
|
CGM_NOTIFY_KILL,
|
|
CGM_NOTIFY_HIT,
|
|
CGM_VOICE_CHAT,
|
|
CGM_FENCEPOST,
|
|
};
|
|
|
|
enum cg_message_ver_6_e {
|
|
CGM6_NONE,
|
|
CGM6_BULLET_1,
|
|
CGM6_BULLET_2,
|
|
CGM6_BULLET_3,
|
|
CGM6_BULLET_4,
|
|
CGM6_BULLET_5,
|
|
CGM6_BULLET_6,
|
|
CGM6_BULLET_7,
|
|
CGM6_BULLET_8,
|
|
CGM6_BULLET_9,
|
|
CGM6_BULLET_10,
|
|
CGM6_MELEE_IMPACT,
|
|
CGM6_EXPLOSION_EFFECT_1,
|
|
CGM6_EXPLOSION_EFFECT_2,
|
|
CGM6_PADDING_1,
|
|
CGM6_MAKE_EFFECT_1,
|
|
CGM6_MAKE_EFFECT_2,
|
|
CGM6_MAKE_EFFECT_3,
|
|
CGM6_MAKE_EFFECT_4,
|
|
CGM6_MAKE_EFFECT_5,
|
|
CGM6_MAKE_EFFECT_6,
|
|
CGM6_MAKE_EFFECT_7,
|
|
CGM6_MAKE_EFFECT_8,
|
|
CGM6_MAKE_CRATE_DEBRIS,
|
|
CGM6_MAKE_WINDOW_DEBRIS,
|
|
CGM6_BULLET_NO_BARREL_1,
|
|
CGM6_BULLET_NO_BARREL_2,
|
|
CGM6_HUDDRAW_SHADER,
|
|
CGM6_HUDDRAW_ALIGN,
|
|
CGM6_HUDDRAW_RECT,
|
|
CGM6_HUDDRAW_VIRTUALSIZE,
|
|
CGM6_HUDDRAW_COLOR,
|
|
CGM6_HUDDRAW_ALPHA,
|
|
CGM6_HUDDRAW_STRING,
|
|
CGM6_HUDDRAW_FONT,
|
|
CGM6_NOTIFY_KILL,
|
|
CGM6_NOTIFY_HIT,
|
|
CGM6_VOICE_CHAT,
|
|
};
|
|
|
|
int BG_MapCGMToProtocol(int protocol, int messageNumber);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
typedef enum {
|
|
OBJ_FLAG_NONE,
|
|
OBJ_FLAG_HIDDEN = 1,
|
|
OBJ_FLAG_CURRENT = 2,
|
|
OBJ_FLAG_COMPLETED = 4
|
|
} objective_flags_t;
|
|
|
|
typedef enum {
|
|
OBJ_STATUS_NONE = 0,
|
|
OBJ_STATUS_HIDDEN,
|
|
OBJ_STATUS_CURRENT,
|
|
OBJ_STATUS_COMPLETED
|
|
} objective_status_t;
|