diff --git a/code/cgame/cg_consolecmds.c b/code/cgame/cg_consolecmds.c index 03450e46..9ab3817f 100644 --- a/code/cgame/cg_consolecmds.c +++ b/code/cgame/cg_consolecmds.c @@ -705,5 +705,5 @@ int CG_WeaponCommandButtonBits(void) cg.iWeaponCommand = 0; } - return iShiftedWeaponCommand & WEAPON_COMMAND_MASK; + return iShiftedWeaponCommand & GetWeaponCommandMask(cg_protocol >= PROTOCOL_MOHTA_MIN ? WEAPON_COMMAND_MAX_VER17 : WEAPON_COMMAND_MAX_VER6); } diff --git a/code/fgame/g_utils.cpp b/code/fgame/g_utils.cpp index 45b1b3c6..c7ed568e 100644 --- a/code/fgame/g_utils.cpp +++ b/code/fgame/g_utils.cpp @@ -2452,3 +2452,7 @@ gentity_t *G_GetGEntity(int ent_num) return ent; } + +unsigned int G_GetWeaponCommand(unsigned int buttons) { + return GetWeaponCommand(buttons, g_protocol >= PROTOCOL_MOHTA_MIN ? WEAPON_COMMAND_MAX_VER17 : WEAPON_COMMAND_MAX_VER6); +} diff --git a/code/fgame/g_utils.h b/code/fgame/g_utils.h index 649713a6..7d5fb4be 100644 --- a/code/fgame/g_utils.h +++ b/code/fgame/g_utils.h @@ -327,3 +327,4 @@ const char *WeaponHandNumToName(weaponhand_t hand); weaponhand_t WeaponHandNameToNum(str side); void G_DebugTargets(Entity *e, str from); void G_DebugDamage(float damage, Entity *victim, Entity *attacker, Entity *inflictor); +unsigned int G_GetWeaponCommand(unsigned int buttons); diff --git a/code/fgame/player.cpp b/code/fgame/player.cpp index 355976b4..05b98580 100644 --- a/code/fgame/player.cpp +++ b/code/fgame/player.cpp @@ -4807,7 +4807,7 @@ void Player::Think(void) } if (!IsDead()) { - m_iClientWeaponCommand = (server_new_buttons & WEAPON_COMMAND_MASK) >> 7; + m_iClientWeaponCommand = G_GetWeaponCommand(server_new_buttons); switch (m_iClientWeaponCommand) { case 0: @@ -11713,9 +11713,9 @@ void Player::FireWeapon(int number, firemode_t mode) return; } - if ((last_ucmd.buttons & WEAPON_COMMAND_MASK) >> 7) { + if (G_GetWeaponCommand(last_ucmd.buttons)) { // Added in OPM - // If there is a weapon command (like DROP), then remove don't fire + // If there is a weapon command (like DROP), then just don't fire // this prevent tricky behaviors, like silent firing return; } diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index 2eb7d3f0..15dde8ed 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -1840,30 +1840,35 @@ typedef struct playerState_s { #define BUTTON_ANY (1 << BUTTON_ANY_BITINDEX) // any key whatsoever #define BUTTON_MOUSE (1 << BUTTON_MOUSE_BITINDEX) -#define WEAPON_COMMAND_USE_PISTOL 1 -#define WEAPON_COMMAND_USE_RIFLE 2 -#define WEAPON_COMMAND_USE_SMG 3 -#define WEAPON_COMMAND_USE_MG 4 -#define WEAPON_COMMAND_USE_GRENADE 5 -#define WEAPON_COMMAND_USE_HEAVY 6 -#define WEAPON_COMMAND_USE_ITEM1 7 -#define WEAPON_COMMAND_USE_ITEM2 8 -#define WEAPON_COMMAND_USE_ITEM3 9 -#define WEAPON_COMMAND_USE_ITEM4 10 -#define WEAPON_COMMAND_USE_PREV_WEAPON 11 -#define WEAPON_COMMAND_USE_NEXT_WEAPON 12 -#define WEAPON_COMMAND_USE_LAST_WEAPON 13 -#define WEAPON_COMMAND_HOLSTER 14 -#define WEAPON_COMMAND_DROP 15 +typedef enum { + WEAPON_COMMAND_NONE, + WEAPON_COMMAND_USE_PISTOL, + WEAPON_COMMAND_USE_RIFLE, + WEAPON_COMMAND_USE_SMG, + WEAPON_COMMAND_USE_MG, + WEAPON_COMMAND_USE_GRENADE, + WEAPON_COMMAND_USE_HEAVY, + WEAPON_COMMAND_USE_ITEM1, + WEAPON_COMMAND_USE_ITEM2, + WEAPON_COMMAND_USE_ITEM3, + WEAPON_COMMAND_USE_ITEM4, + WEAPON_COMMAND_USE_PREV_WEAPON, + WEAPON_COMMAND_USE_NEXT_WEAPON, + WEAPON_COMMAND_USE_LAST_WEAPON, + WEAPON_COMMAND_HOLSTER, + WEAPON_COMMAND_DROP, +} weaponcommand_t; -#if TARGET_GAME_PROTOCOL >= 15 -#define WEAPON_COMMAND_MAX 31 -#else -#define WEAPON_COMMAND_MAX 15 -#endif +#define WEAPON_COMMAND_MAX_VER6 15 +#define WEAPON_COMMAND_MAX_VER17 31 -#define WEAPON_COMMAND_MASK (WEAPON_COMMAND_MAX << 7) +static unsigned int GetWeaponCommandMask(unsigned int maxCmds) { + return maxCmds << 7; +} +static unsigned int GetWeaponCommand(unsigned int buttons, unsigned int maxCmds) { + return (buttons & (maxCmds << 7)) >> 7; +} #define MOVE_RUN 120 // if forwardmove or rightmove are >= MOVE_RUN, // then BUTTON_WALKING should be set