From c24d952d345f0ada248154568e3cb9360547d1ea Mon Sep 17 00:00:00 2001 From: Victor Chow Date: Sun, 11 Nov 2001 07:24:27 +0000 Subject: [PATCH] Elder: VM 0-17-00 Server-side --- reaction/game/bg_pmove.c | 33 ++++++++++----- reaction/game/bg_public.h | 1 + reaction/game/g_active.c | 84 +++++++-------------------------------- reaction/game/g_cmds.c | 17 ++------ reaction/game/g_main.c | 5 ++- reaction/game/g_weapon.c | 12 +++++- 6 files changed, 56 insertions(+), 96 deletions(-) diff --git a/reaction/game/bg_pmove.c b/reaction/game/bg_pmove.c index 5509130a..18ad1874 100644 --- a/reaction/game/bg_pmove.c +++ b/reaction/game/bg_pmove.c @@ -1915,6 +1915,9 @@ static void PM_BeginWeaponChange( int weapon ) { pm->ps->stats[STAT_RQ3] &= ~RQ3_LOCKRELOADS; pm->ps->stats[STAT_RQ3] &= ~RQ3_QUEUERELOAD; + // Elder: cancel burst shots + pm->ps->stats[STAT_BURST] = 0; + pm->ps->weaponstate = WEAPON_DROPPING; //Elder: temp hack @@ -2284,6 +2287,15 @@ static void PM_Reload( void ) } // insert stage 1 sound events here; check against the reload time + + // Special handcannon shell ejection hack + if ( pm->ps->weapon == WP_HANDCANNON && + !(pm->ps->stats[STAT_RQ3] & RQ3_RELOADWEAPON1) && + pm->ps->stats[STAT_RELOADTIME] < 1400 ) + { + pm->ps->stats[STAT_RQ3] |= RQ3_RELOADWEAPON1; + PM_AddEvent(EV_RELOAD_WEAPON1); + } // finished reload if (pm->ps->stats[STAT_RELOADTIME] <= 0) @@ -2343,12 +2355,12 @@ static void PM_Reload( void ) PM_StartWeaponAnim(WP_ANIM_EXTRA1); //PM_StartWeaponAnim(WP_ANIM_RELOAD); } - - + if (pm->ps->stats[STAT_CLIPS] > 0) { //Com_Printf("Sending event from continuous fast-reloads\n"); - PM_AddEvent(EV_RELOAD_WEAPON2); + PM_AddEvent(EV_RELOAD_WEAPON1); + //PM_AddEvent(EV_RELOAD_WEAPON0); } else { @@ -2400,6 +2412,7 @@ static void PM_Reload( void ) //Com_Printf("Finished reload\n"); pm->ps->stats[STAT_RELOADTIME] = 0; pm->ps->stats[STAT_RELOADATTEMPTS] = 0; + pm->ps->stats[STAT_RQ3] &= ~RQ3_RELOADWEAPON1; pm->ps->weaponstate = WEAPON_READY; //} @@ -2481,7 +2494,7 @@ static void PM_Weapon( void ) { { pm->ps->stats[STAT_BURST] = 0; } - else if ((pm->cmd.buttons & BUTTON_ATTACK) && pm->ps->stats[STAT_BURST]) + else if ( (pm->cmd.buttons & BUTTON_ATTACK) && pm->ps->stats[STAT_BURST] ) { pm->cmd.buttons &= ~BUTTON_ATTACK; } @@ -2543,11 +2556,13 @@ static void PM_Weapon( void ) { // can't change if weapon is firing, but can change // again if lowering or raising + // Elder: modified so that a dropweapon command is high precedence + //if ( pm->ps->weaponTime <= 0 || pm->ps->weaponstate != WEAPON_FIRING) { - if ( pm->ps->weaponTime <= 0 && - !(pm->ps->weaponstate == WEAPON_FIRING || pm->ps->weaponstate == WEAPON_STALL)) { + if ( (pm->ps->stats[STAT_RQ3] & RQ3_THROWWEAPON) || (pm->ps->weaponTime <= 0 && + !(pm->ps->weaponstate == WEAPON_FIRING || pm->ps->weaponstate == WEAPON_STALL))) { if ( pm->ps->weapon != pm->cmd.weapon ) { - //Elder TODO: if switching weapons, fire off the grenade "instantly" + //Elder: if switching weapons, fire off the grenade "instantly" if ( pm->ps->weapon == WP_GRENADE && pm->ps->weaponstate == WEAPON_COCKED) { pm->ps->weaponstate = WEAPON_FIRING; pm->cmd.buttons &= ~BUTTON_ATTACK; @@ -2654,9 +2669,9 @@ static void PM_Weapon( void ) { if ( pm->ps->weapon == WP_GRENADE ) { pm->ps->weaponTime = 0; - // put it in the "cocked" position + // put it in the "cocked" position and play the pin-pull animation pm->ps->weaponstate = WEAPON_COCKED; - PM_StartWeaponAnim(WP_ANIM_EXTRA1); + PM_ContinueWeaponAnim(WP_ANIM_EXTRA1); return; } // Elder: stall the thrown knife action diff --git a/reaction/game/bg_public.h b/reaction/game/bg_public.h index 4e3e4199..a03a026c 100644 --- a/reaction/game/bg_public.h +++ b/reaction/game/bg_public.h @@ -498,6 +498,7 @@ typedef enum { #define RQ3_FASTRELOADS 64 // Fast-reloads flag #define RQ3_LOCKRELOADS 128 // Lock-reloads at end of fast-reload cycle #define RQ3_QUEUERELOAD 256 // auto-reload if set +#define RQ3_RELOADWEAPON1 512 // flag off EV_RELOAD_WEAPON1 event so no dupes occur // player_state->persistant[] indexes diff --git a/reaction/game/g_active.c b/reaction/game/g_active.c index c041fb91..62d7073b 100644 --- a/reaction/game/g_active.c +++ b/reaction/game/g_active.c @@ -11,6 +11,7 @@ //Elder: moved kick to g_weapon.c where it belongs + /* =============== G_DamageFeedback @@ -741,10 +742,10 @@ void ClientEvents( gentity_t *ent, int oldEventSequence ) { case EV_RELOAD_WEAPON0: ReloadWeapon ( ent, 0 ); break; + */ case EV_RELOAD_WEAPON1: ReloadWeapon ( ent, 1 ); break; - */ case EV_RELOAD_WEAPON2: ReloadWeapon ( ent, 2 ); break; @@ -754,14 +755,6 @@ void ClientEvents( gentity_t *ent, int oldEventSequence ) { //ent->client->zoomed=0; break; -/* case EV_ZOOM: - if(ent->client->zoomed==3) - ent->client->zoomed=0; - else - ent->client->zoomed++; - G_Printf("zoomlevel = %d\n",ent->client->zoomed); - break; -*/ case EV_USE_ITEM1: // teleporter // drop flags in CTF item = NULL; @@ -921,7 +914,7 @@ int ThrowWeapon( gentity_t *ent, qboolean forceThrow ) //weaponTime > 0 or weaponState == weapon_dropping? Or both? //Still firing if (!forceThrow) - if ( (ucmd->buttons & BUTTON_ATTACK) == BUTTON_ATTACK || client->ps.weaponTime > 0) + if ( (ucmd->buttons & BUTTON_ATTACK) || client->ps.weaponTime > 0) return 0; //Elder: Bandaging case -- handled in cgame @@ -930,7 +923,8 @@ int ThrowWeapon( gentity_t *ent, qboolean forceThrow ) //trap_SendServerCommand( ent-g_entities, va("print \"You are too busy bandaging...\n\"")); //return; //} - + //Elder: remove zoom bits + Cmd_Unzoom(ent); weap = 0; if (client->uniqueWeapons > 0) @@ -1183,69 +1177,19 @@ void ClientThink_real( gentity_t *ent ) { // check for the hit-scan gauntlet, don't let the action // go through as an attack unless it actually hits something -//Blaze: no need for the gauntlet check -// if ( client->ps.weapon == WP_GAUNTLET && !( ucmd->buttons & BUTTON_TALK ) && -// ( ucmd->buttons & BUTTON_ATTACK ) && client->ps.weaponTime <= 0 ) { -// pm.gauntletHit = CheckGauntletAttack( ent ); -// } - + // Blaze: no need for the gauntlet check + /* + if ( client->ps.weapon == WP_GAUNTLET && !( ucmd->buttons & BUTTON_TALK ) && + ( ucmd->buttons & BUTTON_ATTACK ) && client->ps.weaponTime <= 0 ) { + pm.gauntletHit = CheckGauntletAttack( ent ); + } + */ if ( ent->flags & FL_FORCE_GESTURE ) { ent->flags &= ~FL_FORCE_GESTURE; ent->client->pers.cmd.buttons |= BUTTON_GESTURE; } - //**************Elder: moved to bg_pmove.c (PM_Weapon)************// - //Elder: New 3rb Code - //force fire button down if STAT_BURST is < proper amount - //Otherwise release the button - /* - if ( (client->ps.weapon == WP_M4 && - (client->ps.persistant[PERS_WEAPONMODES] & RQ3_M4MODE) == RQ3_M4MODE) || - (client->ps.weapon == WP_MP5 && - (client->ps.persistant[PERS_WEAPONMODES] & RQ3_MP5MODE) == RQ3_MP5MODE)) - { - int weaponNum = client->ps.weapon; - - if (client->ps.ammo[weaponNum] == 0) - { - client->ps.stats[STAT_BURST] = 0; - } - else if (ucmd->buttons & BUTTON_ATTACK)// && client->ps.stats[STAT_BURST] > 0) - { - if ( client->ps.stats[STAT_BURST] >= 0 && client->ps.stats[STAT_BURST] < 3) - ucmd->buttons |= BUTTON_ATTACK; - else - ucmd->buttons &= ~BUTTON_ATTACK; - } - else if (client->ps.stats[STAT_BURST] > 2) - { - client->ps.stats[STAT_BURST] = 0; - client->ps.weaponTime += 300; - } - //Don't need? - else if (client->ps.stats[STAT_BURST] > 0) - ucmd->buttons |= BUTTON_ATTACK; - } - - //Elder: New semi-auto code - if ( client->ps.weapon == WP_PISTOL && - (client->ps.persistant[PERS_WEAPONMODES] & RQ3_MK23MODE) == RQ3_MK23MODE) - { - if (client->ps.ammo[WP_PISTOL] == 0) - { - client->ps.stats[STAT_BURST] = 0; - } - else if ((ucmd->buttons & BUTTON_ATTACK) && client->ps.stats[STAT_BURST]) - { - ucmd->buttons &= ~BUTTON_ATTACK; - } - else if (client->ps.stats[STAT_BURST]) - { - client->ps.weaponTime += 200; - client->ps.stats[STAT_BURST] = 0; - } - } - */ + //Elder: 3rb Code moved to bg_pmove.c (resides in PM_Weapon) #ifdef MISSIONPACK // check for invulnerability expansion before doing the Pmove @@ -1327,7 +1271,7 @@ void ClientThink_real( gentity_t *ent ) { BG_PlayerStateToEntityStateExtraPolate( &ent->client->ps, &ent->s, ent->client->ps.commandTime, qtrue ); } else { - BG_PlayerStateToEntityState( &ent->client->ps, &ent->s, qtrue ); + BG_PlayerStateToEntityState( &ent->client->ps, &ent->s, qtrue ); } SendPendingPredictableEvents( &ent->client->ps ); diff --git a/reaction/game/g_cmds.c b/reaction/game/g_cmds.c index ff7d2c14..1b51ed9e 100644 --- a/reaction/game/g_cmds.c +++ b/reaction/game/g_cmds.c @@ -2355,19 +2355,10 @@ void Cmd_DropWeapon_f( gentity_t *ent ) { if (ent->client->ps.pm_type == PM_SPECTATOR) return; - //Elder: added -- checked in cgame - //if ( (ent->client->ps.stats[STAT_RQ3] & RQ3_BANDAGE_WORK) == RQ3_BANDAGE_WORK) - //{ - //trap_SendServerCommand( ent-g_entities, va("print \"You are too busy bandaging!\n\"")); - //return; - //} - //else - //{ - //Elder: remove zoom bits - Cmd_Unzoom(ent); - //Throwing away return here - ThrowWeapon( ent, qfalse ); - //} + //Elder: remove zoom bits + //Cmd_Unzoom(ent); + //Throwing away return value here; high precedence weapon drop + ThrowWeapon( ent, qtrue ); } /* diff --git a/reaction/game/g_main.c b/reaction/game/g_main.c index 174a10e6..3f9c9983 100644 --- a/reaction/game/g_main.c +++ b/reaction/game/g_main.c @@ -132,6 +132,7 @@ static cvarTable_t gameCvarTable[] = { { &g_dedicated, "dedicated", "0", 0, 0, qfalse }, + // Elder: slow down to 300? { &g_speed, "g_speed", "320", 0, 0, qtrue }, { &g_gravity, "g_gravity", "800", 0, 0, qtrue }, { &g_knockback, "g_knockback", "1000", 0, 0, qtrue }, @@ -490,7 +491,7 @@ void G_InitGame( int levelTime, int randomSeed, int restart ) { // make sure we have flags for CTF, etc if( g_gametype.integer >= GT_TEAM ) { - G_CheckTeamItems(); + G_CheckTeamItems(); } //Elder: spawn unique items. @@ -502,7 +503,7 @@ void G_InitGame( int levelTime, int randomSeed, int restart ) { if ( trap_Cvar_VariableIntegerValue( "sv_floodprotect" ) != 0 ) { trap_Cvar_Set( "sv_floodprotect", "0" ); - G_Printf("sv_floodprotect shut off for RQ3 Beta 1.\n"); + G_Printf("sv_floodprotect shut off for RQ3 Release 1.\n"); } SaveRegisteredItems(); diff --git a/reaction/game/g_weapon.c b/reaction/game/g_weapon.c index a05161ab..7eabc18a 100644 --- a/reaction/game/g_weapon.c +++ b/reaction/game/g_weapon.c @@ -2405,9 +2405,17 @@ Handles server-side management of numclips void ReloadWeapon ( gentity_t *ent, int stage ) { - if (stage == 2) + if (stage == 1 && (ent->client->ps.weapon == WP_SSG3000 || + ent->client->ps.weapon == WP_M3) ) { - G_Printf("Hit server-side reload\n"); + G_Printf("Hit server-side reload stage 1\n"); + if ( ent->client->ps.weapon == WP_M3 ) + ent->client->numClips[WP_HANDCANNON] = ent->client->numClips[WP_M3]; + ent->client->numClips[ent->client->ps.weapon]--; + } + else if (stage == 2) + { + G_Printf("Hit server-side reload stage 2\n"); ent->client->numClips[ent->client->ps.weapon]--; // remove an extra clip if using HC or Akimbos if (ent->client->ps.weapon == WP_HANDCANNON ||