mirror of
https://github.com/ReactionQuake3/reaction.git
synced 2024-11-11 15:52:30 +00:00
Cleaned up cmd_reload while hunting for the m3 reload bug
This commit is contained in:
parent
fab880a84e
commit
9cf60e4a0b
1 changed files with 64 additions and 162 deletions
|
@ -5,6 +5,9 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
//
|
||||
// $Log$
|
||||
// Revision 1.94 2002/04/14 12:55:03 jbravo
|
||||
// Cleaned up cmd_reload while hunting for the m3 reload bug
|
||||
//
|
||||
// Revision 1.93 2002/04/13 15:37:53 jbravo
|
||||
// limchasecam has been redone with new spec system
|
||||
//
|
||||
|
@ -2082,65 +2085,45 @@ void Cmd_Bandage (gentity_t *ent)
|
|||
*/
|
||||
void Cmd_Reload( gentity_t *ent )
|
||||
{
|
||||
int weapon;
|
||||
int ammotoadd;
|
||||
int delay = 0;
|
||||
int weapon, ammotoadd, delay = 0;
|
||||
|
||||
if (ent->client->ps.pm_type == PM_SPECTATOR)
|
||||
return;
|
||||
|
||||
//G_Printf("(%i) Cmd_Reload: Attempting reload\n", ent->s.clientNum);
|
||||
|
||||
//Elder: added for redundant check but shouldn't need to come here - handled in cgame
|
||||
// if ( (ent->client->ps.stats[STAT_RQ3] & RQ3_BANDAGE_WORK) == RQ3_BANDAGE_WORK) {
|
||||
if(ent->client->ps.weaponstate == WEAPON_BANDAGING) {
|
||||
ent->client->fastReloads = 0;
|
||||
ent->client->reloadAttempts = 0;
|
||||
trap_SendServerCommand( ent-g_entities, va("print \"You are too busy bandaging...\n\""));
|
||||
trap_SendServerCommand(ent-g_entities, va("print \"You are too busy bandaging...\n\""));
|
||||
return;
|
||||
}
|
||||
|
||||
//Prevent reloading while bursting
|
||||
if ( ent->client->ps.stats[STAT_BURST] > 0)
|
||||
if (ent->client->ps.stats[STAT_BURST] > 0)
|
||||
return;
|
||||
|
||||
weapon = ent->client->ps.weapon;
|
||||
//Elder: changed to new function
|
||||
ammotoadd = ClipAmountForReload(weapon);
|
||||
//Elder: changed to new function
|
||||
ammotoadd = ClipAmountForReload(weapon);
|
||||
|
||||
/*if (ent->client->ps.ammo[weapon] >= ClipAmountForWeapon(weapon))
|
||||
{ trap_SendServerCommand( ent-g_entities, va("print \"No need to reload.\n\""));
|
||||
return;
|
||||
}*/
|
||||
|
||||
//Elder: serious debug code
|
||||
/*
|
||||
G_Printf("STAT: %d, KNIFE: %d, MK23: %d, M4: %d, SSG: %d, MP5: %d, M3: %d, HC: %d, AKIMBO: %d, GREN: %d\n",
|
||||
ent->client->ps.stats[STAT_WEAPONS], WP_KNIFE, WP_PISTOL, WP_M4, WP_SSG3000,
|
||||
WP_MP5, WP_M3, WP_HANDCANNON, WP_AKIMBO, WP_GRENADE);
|
||||
*/
|
||||
|
||||
switch(weapon) {
|
||||
switch (weapon) {
|
||||
case WP_KNIFE:
|
||||
trap_SendServerCommand( ent-g_entities, va("print \"No need to reload.\n\""));
|
||||
trap_SendServerCommand(ent-g_entities, va("print \"No need to reload.\n\""));
|
||||
return;
|
||||
break;
|
||||
case WP_PISTOL:
|
||||
if (ent->client->ps.ammo[weapon] >= RQ3_PISTOL_AMMO)
|
||||
{
|
||||
trap_SendServerCommand( ent-g_entities, va("print \"No need to reload.\n\""));
|
||||
if (ent->client->ps.ammo[weapon] >= RQ3_PISTOL_AMMO) {
|
||||
trap_SendServerCommand(ent-g_entities, va("print \"No need to reload.\n\""));
|
||||
return;
|
||||
}
|
||||
delay = RQ3_PISTOL_RELOAD_DELAY;
|
||||
break;
|
||||
//Elder: was missing?
|
||||
case WP_M4:
|
||||
if (ent->client->ps.ammo[weapon] >= RQ3_M4_AMMO)
|
||||
{
|
||||
trap_SendServerCommand( ent-g_entities, va("print \"No need to reload.\n\""));
|
||||
if (ent->client->ps.ammo[weapon] >= RQ3_M4_AMMO) {
|
||||
trap_SendServerCommand(ent-g_entities, va("print \"No need to reload.\n\""));
|
||||
return;
|
||||
}
|
||||
|
||||
delay = RQ3_M4_RELOAD_DELAY;
|
||||
break;
|
||||
case WP_M3:
|
||||
|
@ -2150,79 +2133,49 @@ void Cmd_Reload( gentity_t *ent )
|
|||
if (level.time - ent->client->lastReloadTime > RQ3_M3_RELOAD_DELAY)
|
||||
ent->client->fastReloads = 0;
|
||||
|
||||
if (ent->client->ps.ammo[weapon] >= RQ3_M3_AMMO)
|
||||
{
|
||||
if (ent->client->ps.ammo[weapon] >= RQ3_M3_AMMO) {
|
||||
//reset fast reloads and attempts
|
||||
ent->client->fastReloads = 0;
|
||||
ent->client->reloadAttempts = 0;
|
||||
trap_SendServerCommand( ent-g_entities, va("print \"No need to reload.\n\""));
|
||||
trap_SendServerCommand(ent-g_entities, va("print \"No need to reload.\n\""));
|
||||
return;
|
||||
}
|
||||
|
||||
//Check if it's already reloading
|
||||
//ent->client->ps.weaponstate == WEAPON_RELOADING
|
||||
if (ent->client->ps.weaponstate == WEAPON_RELOADING && ent->client->numClips[WP_M3] > 0)
|
||||
{
|
||||
/*
|
||||
G_Printf("Time index: %d, FastReload- VirginStart: %d, WindowStart: %d, WindowEnd: %d\n",
|
||||
level.time - ent->client->lastReloadTime,
|
||||
RQ3_M3_ALLOW_FAST_RELOAD_DELAY,
|
||||
RQ3_M3_FAST_RELOAD_DELAY,
|
||||
RQ3_M3_RELOAD_DELAY);
|
||||
*/
|
||||
if (ent->client->ps.weaponstate == WEAPON_RELOADING && ent->client->numClips[WP_M3] > 0) {
|
||||
//Have we fast reloaded before?
|
||||
if (ent->client->fastReloads)
|
||||
{
|
||||
if (level.time - ent->client->lastReloadTime < RQ3_M3_FAST_RELOAD_DELAY)
|
||||
{
|
||||
if (ent->client->fastReloads) {
|
||||
if (level.time - ent->client->lastReloadTime < RQ3_M3_FAST_RELOAD_DELAY) {
|
||||
//not enough time has passed for a fast-reload attempt so ignore it
|
||||
//G_Printf("Too soon: Discarded fast-reload attempt\n");
|
||||
return;
|
||||
}
|
||||
//else if (level.time - ent->client->lastReloadTime >= RQ3_M3_FAST_RELOAD_DELAY &&
|
||||
//level.time - ent->client->lastReloadTime <= RQ3_M3_RELOAD_DELAY)*/
|
||||
else if (level.time - ent->client->lastReloadTime <= RQ3_M3_RELOAD_DELAY)
|
||||
{
|
||||
} else if (level.time - ent->client->lastReloadTime <= RQ3_M3_RELOAD_DELAY) {
|
||||
//Gotcha!
|
||||
ent->client->fastReloads = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
//Missed the window of opportunity! - Reset fastReloads
|
||||
//G_Printf("Missed Window: disabling fast reloads\n");
|
||||
ent->client->fastReloads = 0;
|
||||
}
|
||||
}
|
||||
//Fast-reload virgin
|
||||
else if (//level.time - ent->client->lastReloadTime >= RQ3_M3_ALLOW_FAST_RELOAD_DELAY &&
|
||||
level.time - ent->client->lastReloadTime <= RQ3_M3_RELOAD_DELAY)
|
||||
{
|
||||
else if (level.time - ent->client->lastReloadTime <= RQ3_M3_RELOAD_DELAY) {
|
||||
ent->client->fastReloads = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
//not enough time has passed for a fast-reload attempt so ignore it
|
||||
//G_Printf("Too soon: Discarded fast-reload attempt\n");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//check for fast reloads
|
||||
if (ent->client->fastReloads) {
|
||||
//Fast reload
|
||||
//G_Printf("Using fast reloads\n");
|
||||
//Toggle the first-person reload animation so it will start again
|
||||
ent->client->ps.generic1 = ( ( ent->client->ps.generic1 & ANIM_TOGGLEBIT )
|
||||
^ ANIM_TOGGLEBIT ) | WP_ANIM_RELOAD;
|
||||
ent->client->ps.generic1 = ((ent->client->ps.generic1 & ANIM_TOGGLEBIT)
|
||||
^ ANIM_TOGGLEBIT) | WP_ANIM_RELOAD;
|
||||
delay = RQ3_M3_FAST_RELOAD_DELAY;
|
||||
ent->client->fastReloads = 1;
|
||||
//Elder: reset reload stage so we can hear sound
|
||||
ent->client->reloadStage = -1;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
//Regular reload
|
||||
//G_Printf("Using regular reloads\n");
|
||||
delay = RQ3_M3_RELOAD_DELAY;
|
||||
ent->client->fastReloads = 0;
|
||||
}
|
||||
|
@ -2234,12 +2187,11 @@ void Cmd_Reload( gentity_t *ent )
|
|||
//Finish off if no more reload attempts
|
||||
if (ent->client->reloadAttempts < 1 && ent->client->fastReloads)
|
||||
delay += RQ3_M3_FINISH_RELOAD_DELAY;
|
||||
|
||||
break;
|
||||
case WP_HANDCANNON:
|
||||
delay = RQ3_HANDCANNON_RELOAD_DELAY;
|
||||
if (ent->client->ps.ammo[weapon] >= RQ3_HANDCANNON_AMMO) {
|
||||
trap_SendServerCommand( ent-g_entities, va("print \"No need to reload.\n\""));
|
||||
trap_SendServerCommand(ent-g_entities, va("print \"No need to reload.\n\""));
|
||||
return;
|
||||
}
|
||||
break;
|
||||
|
@ -2250,59 +2202,34 @@ void Cmd_Reload( gentity_t *ent )
|
|||
if (level.time - ent->client->lastReloadTime > RQ3_SSG3000_RELOAD_DELAY)
|
||||
ent->client->fastReloads = 0;
|
||||
|
||||
if (ent->client->ps.ammo[weapon] >= RQ3_SSG3000_AMMO)
|
||||
{
|
||||
if (ent->client->ps.ammo[weapon] >= RQ3_SSG3000_AMMO) {
|
||||
//reset fast reloads and attempts
|
||||
ent->client->fastReloads = 0;
|
||||
ent->client->reloadAttempts = 0;
|
||||
trap_SendServerCommand( ent-g_entities, va("print \"No need to reload.\n\""));
|
||||
trap_SendServerCommand(ent-g_entities, va("print \"No need to reload.\n\""));
|
||||
return;
|
||||
}
|
||||
|
||||
//Check if it's already reloading
|
||||
//ent->client->ps.weaponstate == WEAPON_RELOADING
|
||||
if (ent->client->ps.weaponstate == WEAPON_RELOADING && ent->client->numClips[WP_SSG3000] > 0)
|
||||
{
|
||||
/*
|
||||
G_Printf("Time index: %d, FastReload- VirginStart: %d, WindowStart: %d, WindowEnd: %d\n",
|
||||
level.time - ent->client->lastReloadTime,
|
||||
RQ3_SSG3000_ALLOW_FAST_RELOAD_DELAY,
|
||||
RQ3_SSG3000_FAST_RELOAD_DELAY,
|
||||
RQ3_SSG3000_RELOAD_DELAY);
|
||||
*/
|
||||
if (ent->client->ps.weaponstate == WEAPON_RELOADING && ent->client->numClips[WP_SSG3000] > 0) {
|
||||
//Have we fast reloaded before?
|
||||
if (ent->client->fastReloads)
|
||||
{
|
||||
if (level.time - ent->client->lastReloadTime < RQ3_SSG3000_FAST_RELOAD_DELAY)
|
||||
{
|
||||
if (ent->client->fastReloads) {
|
||||
if (level.time - ent->client->lastReloadTime < RQ3_SSG3000_FAST_RELOAD_DELAY) {
|
||||
//not enough time has passed for a fast-reload attempt so ignore it
|
||||
//G_Printf("Too soon: Discarded fast-reload attempt\n");
|
||||
return;
|
||||
}
|
||||
//else if (level.time - ent->client->lastReloadTime >= RQ3_SSG3000_FAST_RELOAD_DELAY &&
|
||||
//level.time - ent->client->lastReloadTime <= RQ3_SSG3000_RELOAD_DELAY)*/
|
||||
else if (level.time - ent->client->lastReloadTime <= RQ3_SSG3000_RELOAD_DELAY)
|
||||
{
|
||||
} else if (level.time - ent->client->lastReloadTime <= RQ3_SSG3000_RELOAD_DELAY) {
|
||||
//Gotcha!
|
||||
ent->client->fastReloads = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
//Missed the window of opportunity! - Reset fastReloads
|
||||
//G_Printf("Missed Window: disabling fast reloads\n");
|
||||
ent->client->fastReloads = 0;
|
||||
}
|
||||
}
|
||||
//Fast-reload virgin
|
||||
else if (//level.time - ent->client->lastReloadTime >= RQ3_SSG3000_ALLOW_FAST_RELOAD_DELAY &&
|
||||
level.time - ent->client->lastReloadTime <= RQ3_SSG3000_RELOAD_DELAY)
|
||||
{
|
||||
else if (level.time - ent->client->lastReloadTime <= RQ3_SSG3000_RELOAD_DELAY) {
|
||||
ent->client->fastReloads = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
//not enough time has passed for a fast-reload attempt so ignore it
|
||||
//G_Printf("Too soon: Discarded fast-reload attempt\n");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -2310,15 +2237,12 @@ void Cmd_Reload( gentity_t *ent )
|
|||
//check for fast reloads
|
||||
if (ent->client->fastReloads) {
|
||||
//Fast reload
|
||||
//G_Printf("Using fast reloads\n");
|
||||
ent->client->ps.generic1 = ( ( ent->client->ps.generic1 & ANIM_TOGGLEBIT )
|
||||
^ ANIM_TOGGLEBIT ) | WP_ANIM_RELOAD;
|
||||
ent->client->ps.generic1 = ((ent->client->ps.generic1 & ANIM_TOGGLEBIT)
|
||||
^ ANIM_TOGGLEBIT) | WP_ANIM_RELOAD;
|
||||
delay = RQ3_SSG3000_FAST_RELOAD_DELAY;
|
||||
ent->client->fastReloads = 1;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
//Regular reload
|
||||
//G_Printf("Using regular reloads\n");
|
||||
delay = RQ3_SSG3000_RELOAD_DELAY;
|
||||
ent->client->fastReloads = 0;
|
||||
}
|
||||
|
@ -2330,20 +2254,18 @@ void Cmd_Reload( gentity_t *ent )
|
|||
//Finish off if no more reload attempts
|
||||
if (ent->client->reloadAttempts < 1 && ent->client->fastReloads)
|
||||
delay += RQ3_SSG3000_FINISH_RELOAD_DELAY;
|
||||
|
||||
break;
|
||||
case WP_AKIMBO:
|
||||
delay = RQ3_AKIMBO_RELOAD_DELAY;
|
||||
if (ent->client->ps.ammo[weapon] >= RQ3_AKIMBO_AMMO) {
|
||||
trap_SendServerCommand( ent-g_entities, va("print \"No need to reload.\n\""));
|
||||
trap_SendServerCommand(ent-g_entities, va("print \"No need to reload.\n\""));
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case WP_MP5:
|
||||
delay = RQ3_MP5_RELOAD_DELAY;
|
||||
if (ent->client->ps.ammo[weapon] >= RQ3_MP5_AMMO)
|
||||
{
|
||||
trap_SendServerCommand( ent-g_entities, va("print \"No need to reload.\n\""));
|
||||
if (ent->client->ps.ammo[weapon] >= RQ3_MP5_AMMO) {
|
||||
trap_SendServerCommand(ent-g_entities, va("print \"No need to reload.\n\""));
|
||||
return;
|
||||
}
|
||||
break;
|
||||
|
@ -2351,9 +2273,8 @@ void Cmd_Reload( gentity_t *ent )
|
|||
//Elder: shouldn't be here
|
||||
delay = 2500;
|
||||
//Elder: changed function
|
||||
if (ent->client->ps.ammo[weapon] >= ClipAmountForAmmo(weapon))
|
||||
{
|
||||
trap_SendServerCommand( ent-g_entities, va("print \"No need to reload.\n\""));
|
||||
if (ent->client->ps.ammo[weapon] >= ClipAmountForAmmo(weapon)) {
|
||||
trap_SendServerCommand(ent-g_entities, va("print \"No need to reload.\n\""));
|
||||
return;
|
||||
}
|
||||
break;
|
||||
|
@ -2363,73 +2284,54 @@ void Cmd_Reload( gentity_t *ent )
|
|||
if (ent->client->numClips[weapon] == 0) {
|
||||
ent->client->fastReloads = 0;
|
||||
ent->client->reloadAttempts = 0;
|
||||
trap_SendServerCommand( ent-g_entities, va("print \"Out of ammo\n\""));
|
||||
trap_SendServerCommand(ent-g_entities, va("print \"Out of ammo\n\""));
|
||||
return;
|
||||
}
|
||||
else if ( (weapon == WP_HANDCANNON || weapon == WP_AKIMBO) && ent->client->numClips[weapon] < 2 ) {
|
||||
trap_SendServerCommand( ent-g_entities, va("print \"Not enough ammo\n\""));
|
||||
} else if ((weapon == WP_HANDCANNON || weapon == WP_AKIMBO) && ent->client->numClips[weapon] < 2) {
|
||||
trap_SendServerCommand(ent-g_entities, va("print \"Not enough ammo\n\""));
|
||||
return;
|
||||
}
|
||||
// Elder: check if still in recoil
|
||||
else if ( ent->client->ps.weaponTime > 0 && !ent->client->fastReloads )
|
||||
{
|
||||
else if ( ent->client->ps.weaponTime > 0 && !ent->client->fastReloads ) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//Save once only
|
||||
if (RQ3_isZoomed(ent) && weapon == WP_SSG3000)
|
||||
{
|
||||
if (RQ3_isZoomed(ent) && weapon == WP_SSG3000) {
|
||||
RQ3_SaveZoomLevel(ent);
|
||||
}
|
||||
|
||||
ent->client->ps.weaponstate = WEAPON_RELOADING;
|
||||
//Elder: temporary hack to drop weapon if it's not the MK23
|
||||
//if (ent->client->ps.weapon != WP_PISTOL &&
|
||||
//ent->client->ps.weapon != WP_M3)
|
||||
//{
|
||||
ent->client->ps.torsoAnim = ( ( ent->client->ps.torsoAnim & ANIM_TOGGLEBIT )
|
||||
^ ANIM_TOGGLEBIT ) | TORSO_DROP;
|
||||
//}
|
||||
|
||||
// Elder: handled in pmove now
|
||||
// ent->client->ps.weaponTime += delay;
|
||||
|
||||
|
||||
//Elder: at this point there should be sufficient ammo requirements to reload
|
||||
ent->client->ps.weaponstate = WEAPON_RELOADING;
|
||||
ent->client->ps.torsoAnim = ((ent->client->ps.torsoAnim & ANIM_TOGGLEBIT)
|
||||
^ ANIM_TOGGLEBIT) | TORSO_DROP;
|
||||
//Elder: at this point there should be sufficient ammo requirements to reload
|
||||
if (ent->client->numClips[weapon] > 0) {
|
||||
//Elder: more attempts to synchronize the mk23 and akimbos
|
||||
if (weapon == WP_PISTOL && (ent->client->ps.stats[STAT_WEAPONS] & (1 << WP_AKIMBO) ) ) {
|
||||
if (weapon == WP_PISTOL && (ent->client->ps.stats[STAT_WEAPONS] & (1 << WP_AKIMBO))) {
|
||||
ent->client->ps.ammo[WP_AKIMBO] = ent->client->ps.ammo[WP_AKIMBO] - ent->client->ps.ammo[WP_PISTOL] + ammotoadd;
|
||||
if (ent->client->ps.ammo[WP_AKIMBO] > RQ3_AKIMBO_AMMO) {
|
||||
ent->client->ps.ammo[WP_AKIMBO] = RQ3_AKIMBO_AMMO;
|
||||
}
|
||||
}
|
||||
else if (weapon == WP_AKIMBO) {
|
||||
} else if (weapon == WP_AKIMBO) {
|
||||
//Elder: refill the MK23 as well
|
||||
ent->client->ps.ammo[WP_PISTOL] = RQ3_PISTOL_AMMO;
|
||||
}
|
||||
|
||||
// add ammo to weapon
|
||||
ent->client->ps.ammo[weapon] = ammotoadd;
|
||||
ent->client->numClips[weapon]--;
|
||||
ent->client->numClips[weapon]--;
|
||||
|
||||
//Elder: remove an extra "clip" if it's the handcannon or akimbo
|
||||
if (weapon == WP_HANDCANNON || weapon == WP_AKIMBO)
|
||||
ent->client->numClips[weapon]--;
|
||||
//Elder: remove an extra "clip" if it's the handcannon or akimbo
|
||||
if (weapon == WP_HANDCANNON || weapon == WP_AKIMBO)
|
||||
ent->client->numClips[weapon]--;
|
||||
|
||||
//Elder: sync hc and m3 ammo + mk23 and akimbo ammo - a switch might look nicer
|
||||
if (weapon == WP_M3) {
|
||||
//Elder: sync hc and m3 ammo + mk23 and akimbo ammo - a switch might look nicer
|
||||
if (weapon == WP_M3) {
|
||||
ent->client->numClips[WP_HANDCANNON] = ent->client->numClips[WP_M3];
|
||||
}
|
||||
else if (weapon == WP_HANDCANNON) {
|
||||
} else if (weapon == WP_HANDCANNON) {
|
||||
ent->client->numClips[WP_M3] = ent->client->numClips[WP_HANDCANNON];
|
||||
}
|
||||
else if(weapon == WP_PISTOL) {
|
||||
} else if(weapon == WP_PISTOL) {
|
||||
ent->client->numClips[WP_AKIMBO] = ent->client->numClips[WP_PISTOL];
|
||||
}
|
||||
else if (weapon == WP_AKIMBO) {
|
||||
} else if (weapon == WP_AKIMBO) {
|
||||
ent->client->numClips[WP_PISTOL] = ent->client->numClips[WP_AKIMBO];
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue