Faster "weapprev" and "weapnext" behavior

These commands can now "count" how many times they have been called,
similar to how "cycleweap" operates after #865.
This allows for changing to different weapons, instead of just going
"one down" or "one up".
New cvar "g_quick_swap" allows to enable/disable this behavior.
This commit is contained in:
Jaime Moreira 2023-12-07 20:51:49 -03:00
parent 4967b9d0ca
commit 9eca08fd92
5 changed files with 37 additions and 22 deletions

View file

@ -222,6 +222,12 @@ Set `0` by default.
single player, the same way as in multiplayer. single player, the same way as in multiplayer.
This cvar only works if the game.dll implements this behaviour. This cvar only works if the game.dll implements this behaviour.
* **g_quick_weap**: If set to `1`, both *weapprev* and *weapnext*
commands will "count" how many times they have been called, making
possible to skip weapons by quickly tapping one of these keys.
By default this cvar is set to `0`, and will only work if the
game.dll implements this behaviour.
* **g_swap_speed**: Sets the speed of the "changing weapon" animation. * **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 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 2 the triple... up until the max of `8`, since there are at least 2

View file

@ -732,17 +732,25 @@ Cmd_WeapPrev_f(edict_t *ent)
cl = ent->client; cl = ent->client;
if (!cl->pers.weapon) if (g_quick_weap->value && cl->newweapon)
{
it = cl->newweapon;
}
else if (cl->pers.weapon)
{
it = cl->pers.weapon;
}
else
{ {
return; return;
} }
selected_weapon = ITEM_INDEX(cl->pers.weapon); selected_weapon = ITEM_INDEX(it);
/* scan for the next valid one */ /* scan for the next valid one */
for (i = 1; i <= MAX_ITEMS; i++) for (i = 1; i <= MAX_ITEMS; i++)
{ {
index = (selected_weapon + i) % MAX_ITEMS; index = (selected_weapon + MAX_ITEMS - i) % MAX_ITEMS;
if (!cl->pers.inventory[index]) if (!cl->pers.inventory[index])
{ {
@ -751,19 +759,14 @@ Cmd_WeapPrev_f(edict_t *ent)
it = &itemlist[index]; it = &itemlist[index];
if (!it->use) if (!it->use || !(it->flags & IT_WEAPON))
{
continue;
}
if (!(it->flags & IT_WEAPON))
{ {
continue; continue;
} }
it->use(ent, it); it->use(ent, it);
if (cl->pers.weapon == it) if (cl->newweapon == it)
{ {
return; /* successful */ return; /* successful */
} }
@ -785,17 +788,25 @@ Cmd_WeapNext_f(edict_t *ent)
cl = ent->client; cl = ent->client;
if (!cl->pers.weapon) if (g_quick_weap->value && cl->newweapon)
{
it = cl->newweapon;
}
else if (cl->pers.weapon)
{
it = cl->pers.weapon;
}
else
{ {
return; return;
} }
selected_weapon = ITEM_INDEX(cl->pers.weapon); selected_weapon = ITEM_INDEX(it);
/* scan for the next valid one */ /* scan for the next valid one */
for (i = 1; i <= MAX_ITEMS; i++) for (i = 1; i <= MAX_ITEMS; i++)
{ {
index = (selected_weapon + MAX_ITEMS - i) % MAX_ITEMS; index = (selected_weapon + i) % MAX_ITEMS;
if (!cl->pers.inventory[index]) if (!cl->pers.inventory[index])
{ {
@ -804,19 +815,14 @@ Cmd_WeapNext_f(edict_t *ent)
it = &itemlist[index]; it = &itemlist[index];
if (!it->use) if (!it->use || !(it->flags & IT_WEAPON))
{
continue;
}
if (!(it->flags & IT_WEAPON))
{ {
continue; continue;
} }
it->use(ent, it); it->use(ent, it);
if (cl->pers.weapon == it) if (cl->newweapon == it)
{ {
return; /* successful */ return; /* successful */
} }

View file

@ -88,6 +88,7 @@ cvar_t *gib_on;
cvar_t *aimfix; cvar_t *aimfix;
cvar_t *g_machinegun_norecoil; cvar_t *g_machinegun_norecoil;
cvar_t *g_quick_weap;
cvar_t *g_swap_speed; cvar_t *g_swap_speed;
void G_RunFrame(void); void G_RunFrame(void);

View file

@ -551,6 +551,7 @@ extern cvar_t *sv_maplist;
extern cvar_t *aimfix; extern cvar_t *aimfix;
extern cvar_t *g_machinegun_norecoil; extern cvar_t *g_machinegun_norecoil;
extern cvar_t *g_quick_weap;
extern cvar_t *g_swap_speed; extern cvar_t *g_swap_speed;
#define world (&g_edicts[0]) #define world (&g_edicts[0])

View file

@ -246,6 +246,7 @@ InitGame(void)
/* others */ /* others */
aimfix = gi.cvar("aimfix", "0", CVAR_ARCHIVE); aimfix = gi.cvar("aimfix", "0", CVAR_ARCHIVE);
g_machinegun_norecoil = gi.cvar("g_machinegun_norecoil", "0", CVAR_ARCHIVE); g_machinegun_norecoil = gi.cvar("g_machinegun_norecoil", "0", CVAR_ARCHIVE);
g_quick_weap = gi.cvar("g_quick_weap", "0", CVAR_ARCHIVE);
g_swap_speed = gi.cvar("g_swap_speed", "1", 0); g_swap_speed = gi.cvar("g_swap_speed", "1", 0);
/* items */ /* items */