From c5e2d51fd797d9ad328c83328421d471c405f7df Mon Sep 17 00:00:00 2001 From: Jaime Moreira Date: Wed, 28 Jun 2023 15:28:40 -0400 Subject: [PATCH] Cheat cvar "g_swap_speed" implemented Allows to skip frames of "putting down weapon" and "raising weapon" animations, speeding them up. --- doc/040_cvarlist.md | 7 ++++ src/client/cl_main.c | 1 + src/game/g_main.c | 1 + src/game/header/local.h | 1 + src/game/player/weapon.c | 70 ++++++++++++++++++++++-------------- src/game/savegame/savegame.c | 1 + 6 files changed, 55 insertions(+), 26 deletions(-) diff --git a/doc/040_cvarlist.md b/doc/040_cvarlist.md index 34b0c2f2..5261d0ae 100644 --- a/doc/040_cvarlist.md +++ b/doc/040_cvarlist.md @@ -222,6 +222,13 @@ Set `0` by default. single player, the same way as in multiplayer. This cvar only works if the game.dll implements this behaviour. +* **g_swap_speed**: Sets the speed of the "changing weapon" animation. + Default is `1`. If set to `2`, it will be double the speed, `3` is + the triple... up until the max of `8`, since there are at least 4 + frames of animation that will be played compulsorily, on every weapon. + Cheat-protected, has to be a positive integer. As with the last one, + will only work if the game.dll implements this behaviour. + * **g_disruptor (Ground Zero only)**: This boolean cvar controls the availability of the Disruptor weapon to players. The Disruptor is a weapon that was cut from Ground Zero during development but all diff --git a/src/client/cl_main.c b/src/client/cl_main.c index c7839147..99d8126b 100644 --- a/src/client/cl_main.c +++ b/src/client/cl_main.c @@ -686,6 +686,7 @@ cheatvar_t cheatvars[] = { {"cl_kickangles", "1"}, {"g_footsteps", "1"}, {"g_machinegun_norecoil", "0"}, + {"g_swap_speed", "1"}, {NULL, NULL} }; diff --git a/src/game/g_main.c b/src/game/g_main.c index b4fd82d3..17ad438e 100644 --- a/src/game/g_main.c +++ b/src/game/g_main.c @@ -88,6 +88,7 @@ cvar_t *gib_on; cvar_t *aimfix; cvar_t *g_machinegun_norecoil; +cvar_t *g_swap_speed; void G_RunFrame(void); diff --git a/src/game/header/local.h b/src/game/header/local.h index adb53bfb..d52ddc6a 100644 --- a/src/game/header/local.h +++ b/src/game/header/local.h @@ -551,6 +551,7 @@ extern cvar_t *sv_maplist; extern cvar_t *aimfix; extern cvar_t *g_machinegun_norecoil; +extern cvar_t *g_swap_speed; #define world (&g_edicts[0]) diff --git a/src/game/player/weapon.c b/src/game/player/weapon.c index 5db8d92d..3875fa7b 100644 --- a/src/game/player/weapon.c +++ b/src/game/player/weapon.c @@ -570,6 +570,31 @@ Drop_Weapon(edict_t *ent, gitem_t *item) ent->client->pers.inventory[index]--; } +/* + * Client (player) animation for changing weapon + */ +static void +Change_Weap_Animation(edict_t *ent) +{ + if (!ent) + { + return; + } + + ent->client->anim_priority = ANIM_REVERSE; + + if (ent->client->ps.pmove.pm_flags & PMF_DUCKED) + { + ent->s.frame = FRAME_crpain4 + 1; + ent->client->anim_end = FRAME_crpain1; + } + else + { + ent->s.frame = FRAME_pain304 + 1; + ent->client->anim_end = FRAME_pain301; + } +} + /* * A generic function to handle * the basics of weapon thinking @@ -580,6 +605,7 @@ Weapon_Generic(edict_t *ent, int FRAME_ACTIVATE_LAST, int FRAME_FIRE_LAST, int *fire_frames, void (*fire)(edict_t *ent)) { int n; + const unsigned short int change_speed = (g_swap_speed->value > 0)?(unsigned short int)g_swap_speed->value:1; if (!ent || !fire_frames || !fire) { @@ -598,23 +624,22 @@ Weapon_Generic(edict_t *ent, int FRAME_ACTIVATE_LAST, int FRAME_FIRE_LAST, ChangeWeapon(ent); return; } - else if ((FRAME_DEACTIVATE_LAST - ent->client->ps.gunframe) == 4) + else if ( (FRAME_DEACTIVATE_LAST - FRAME_DEACTIVATE_FIRST) >= (4 * change_speed) ) { - ent->client->anim_priority = ANIM_REVERSE; - - if (ent->client->ps.pmove.pm_flags & PMF_DUCKED) + unsigned short int remainder = FRAME_DEACTIVATE_LAST - ent->client->ps.gunframe; + // "if (remainder == 4)" at change_speed == 1 + if ( ( remainder <= (4 * change_speed) ) + && ( remainder > (3 * change_speed) ) ) { - ent->s.frame = FRAME_crpain4 + 1; - ent->client->anim_end = FRAME_crpain1; - } - else - { - ent->s.frame = FRAME_pain304 + 1; - ent->client->anim_end = FRAME_pain301; + Change_Weap_Animation(ent); } } - ent->client->ps.gunframe++; + ent->client->ps.gunframe += change_speed; + if (ent->client->ps.gunframe > FRAME_DEACTIVATE_LAST) + { + ent->client->ps.gunframe = FRAME_DEACTIVATE_LAST; + } return; } @@ -627,7 +652,11 @@ Weapon_Generic(edict_t *ent, int FRAME_ACTIVATE_LAST, int FRAME_FIRE_LAST, return; } - ent->client->ps.gunframe++; + ent->client->ps.gunframe += change_speed; + if (ent->client->ps.gunframe > FRAME_ACTIVATE_LAST) + { + ent->client->ps.gunframe = FRAME_ACTIVATE_LAST; + } return; } @@ -636,20 +665,9 @@ Weapon_Generic(edict_t *ent, int FRAME_ACTIVATE_LAST, int FRAME_FIRE_LAST, ent->client->weaponstate = WEAPON_DROPPING; ent->client->ps.gunframe = FRAME_DEACTIVATE_FIRST; - if ((FRAME_DEACTIVATE_LAST - FRAME_DEACTIVATE_FIRST) < 4) + if ( (FRAME_DEACTIVATE_LAST - FRAME_DEACTIVATE_FIRST) < (4 * change_speed) ) { - ent->client->anim_priority = ANIM_REVERSE; - - if (ent->client->ps.pmove.pm_flags & PMF_DUCKED) - { - ent->s.frame = FRAME_crpain4 + 1; - ent->client->anim_end = FRAME_crpain1; - } - else - { - ent->s.frame = FRAME_pain304 + 1; - ent->client->anim_end = FRAME_pain301; - } + Change_Weap_Animation(ent); } return; diff --git a/src/game/savegame/savegame.c b/src/game/savegame/savegame.c index 0fa059f7..0f929fff 100644 --- a/src/game/savegame/savegame.c +++ b/src/game/savegame/savegame.c @@ -246,6 +246,7 @@ InitGame(void) /* others */ aimfix = gi.cvar("aimfix", "0", CVAR_ARCHIVE); g_machinegun_norecoil = gi.cvar("g_machinegun_norecoil", "0", CVAR_ARCHIVE); + g_swap_speed = gi.cvar("g_swap_speed", "1", 0); /* items */ InitItems();