diff --git a/reaction/cgame/cg_consolecmds.c b/reaction/cgame/cg_consolecmds.c index 1646cfa9..7ede7ce4 100644 --- a/reaction/cgame/cg_consolecmds.c +++ b/reaction/cgame/cg_consolecmds.c @@ -41,8 +41,8 @@ static void CG_DropWeapon_f (void) { return; } - cg.zoomed = 0; - cg.zoomLevel = 0; + //cg.zoomed = 0; + //cg.zoomLevel = 0; trap_SendClientCommand("dropweapon"); } @@ -58,15 +58,34 @@ static void CG_Bandage_f (void) { return; } - ///Elder: spectator? + //Elder: spectator? if ( cg.snap->ps.pm_flags & PMF_FOLLOW ) { return; } - - if (cg.snap->ps.stats[STAT_BANDAGE]) { - cg.zoomed = 0; - cg.zoomLevel = 0; + + //Elder: prevent "bandaging" when dead hehe + if ( cg.snap->ps.stats[STAT_HEALTH] < 0 ) { + CG_Printf("It's a bit too late to bandage yourself...\n"); + return; } + + //Elder: added to prevent bandaging while reloading or firing + if ( cg.snap->ps.weaponTime > 0 ) { + CG_Printf("You are too busy with your weapon!\n"); + return; + } + + //if (cg.snap->ps.stats[STAT_BANDAGE]) { + if ( (cg.snap->ps.stats[STAT_RQ3] & RQ3_BANDAGE_WORK) == RQ3_BANDAGE_WORK) { + CG_Printf("You are already bandaging!\n"); + //cg.zoomed = 0; + //cg.zoomLevel = 0; + return; + } + //else if ( (cg.snap->ps.stats[STAT_RQ3] & RQ3_BANDAGE_NEED) == RQ3_BANDAGE_NEED) { + //cg.zoomed = 0; + //cg.zoomLevel = 0; + //} trap_SendClientCommand("bandage"); } @@ -89,13 +108,25 @@ static void CG_Reload_f (void) { if ( cg.snap->ps.pm_flags & PMF_FOLLOW ) { return; } - + + //Elder: prevent "reloading" when dead hehe + if ( cg.snap->ps.stats[STAT_HEALTH] < 0 ) { + CG_Printf("Nothing to reload - you are dead.\n"); + return; + } + + //Elder: added to prevent bandaging while reloading + if ( (cg.snap->ps.stats[STAT_RQ3] & RQ3_BANDAGE_WORK) == RQ3_BANDAGE_WORK) { + CG_Printf("You'll get to your weapon when you are finished bandaging!\n"); + return; + } + //Elder: no clips, or full chamber means no reload //CG_Printf("currentState.weapon: %d, clipamount: %d\n", cent->currentState.weapon, ClipAmountForAmmo(cent->currentState.weapon)); if (cg.snap->ps.stats[STAT_CLIPS] && cg.snap->ps.ammo[cent->currentState.weapon] < ClipAmountForAmmo(cent->currentState.weapon) ) { - cg.zoomed = 0; - cg.zoomLevel = 0; + //cg.zoomed = 0; + //cg.zoomLevel = 0; } trap_SendClientCommand("reload"); } @@ -501,7 +532,7 @@ static consoleCommand_t commands[] = { { "sizedown", CG_SizeDown_f }, { "weapnext", CG_NextWeapon_f }, { "weapprev", CG_PrevWeapon_f }, - { "weapon", CG_Weapon_f }, // Elder: it's for AQ2 and Q3!? + { "weapon", CG_Weapon_f }, // Elder: it's for RQ3 and Q3A { "dropweapon", CG_DropWeapon_f }, // Elder: added to reset zoom then goto server { "bandage", CG_Bandage_f }, // Elder: added to reset zoom then goto server { "reload", CG_Reload_f }, // Elder: added to reset zoom then goto server @@ -614,7 +645,7 @@ void CG_InitConsoleCommands( void ) { trap_AddCommand ("reload"); trap_AddCommand ("opendoor"); trap_AddCommand ("bandage"); - trap_AddCommand ("drop"); // XRAY FMJ weap drop cmd + //trap_AddCommand ("drop"); // XRAY FMJ weap drop cmd - Elder: not used //Elder: added to give drop weapon auto-complete trap_AddCommand ("dropweapon"); //Elder: try this diff --git a/reaction/cgame/cg_draw.c b/reaction/cgame/cg_draw.c index 671d263d..e4056582 100644 --- a/reaction/cgame/cg_draw.c +++ b/reaction/cgame/cg_draw.c @@ -529,7 +529,7 @@ static void CG_DrawStatusBar( void ) { style |= UI_PULSE; //Elder: Need bandaging? - if (ps->stats[STAT_BANDAGE]) + if ( (ps->stats[STAT_RQ3] & RQ3_BANDAGE_NEED) == RQ3_BANDAGE_NEED) hicon = cgs.media.rq3_healthicon2; else hicon = cgs.media.rq3_healthicon; @@ -2020,12 +2020,33 @@ static void CG_DrawCrosshair(void) { //Elder: Sniper crosshairs - lots of hardcoded values :/ - if ( cg.snap->ps.weapon==WP_SSG3000 && cg.zoomLevel > 0 && cg.zoomLevel < 4) { + //if ( cg.snap->ps.weapon==WP_SSG3000 && cg.zoomLevel > 0 && cg.zoomLevel < 4) { + if ( cg.snap->ps.weapon==WP_SSG3000 && + ( (cg.snap->ps.stats[STAT_RQ3] & RQ3_ZOOM_LOW) == RQ3_ZOOM_LOW || + (cg.snap->ps.stats[STAT_RQ3] & RQ3_ZOOM_MED) == RQ3_ZOOM_MED ) ) { + int zoomMag; x = 640 / 2; y = 480 / 2; - //I can probably scale the zoom with the screen width -/+ keys + + //derive zoom level - seems complicated but they're only bit comparisions + if ( (cg.snap->ps.stats[STAT_RQ3] & RQ3_ZOOM_LOW) == RQ3_ZOOM_LOW && + (cg.snap->ps.stats[STAT_RQ3] & RQ3_ZOOM_MED) == RQ3_ZOOM_MED ) { + zoomMag = 2; + } + else if ( (cg.snap->ps.stats[STAT_RQ3] & RQ3_ZOOM_LOW) == RQ3_ZOOM_LOW) { + zoomMag = 0; + } + else if ( (cg.snap->ps.stats[STAT_RQ3] & RQ3_ZOOM_MED) == RQ3_ZOOM_MED) { + zoomMag = 1; + } + else { + //Shouldn't need to be here + CG_Error("CG_DrawCrosshair: received bad zoom value %d\n", zoomMag); + } + + //I can probably scale the zoom with the screen width -/+ keys //But I'll do it later. - CG_DrawPic( x - 128, y - 128, 256, 256, cgs.media.ssgCrosshair[cg.zoomLevel - 1]); + CG_DrawPic( x - 128, y - 128, 256, 256, cgs.media.ssgCrosshair[zoomMag]); return; } else { diff --git a/reaction/cgame/cg_ents.c b/reaction/cgame/cg_ents.c index cf4ce98c..acd079f6 100644 --- a/reaction/cgame/cg_ents.c +++ b/reaction/cgame/cg_ents.c @@ -275,6 +275,7 @@ static void CG_Item( centity_t *cent ) { //Elder: added knife conditional if ( item->giType == IT_WEAPON && !(item->giTag == WP_KNIFE && ( (es->eFlags & FL_THROWN_KNIFE) == FL_THROWN_KNIFE) ) ) { + vec3_t myvec; //CG_Printf("Should not be in here if it's a thrown knife\n"); @@ -293,7 +294,11 @@ static void CG_Item( centity_t *cent ) { wi->weaponMidpoint[2] * ent.axis[2][2]; //Blaze: Dont raise the weapon, but lower it //Elder: increased value - cent->lerpOrigin[2] -= 14; + //Elder: don't lower knives by much - this is bad hardcode but oh well + if ( item->giTag == WP_KNIFE) + cent->lerpOrigin[2] -= 10; + else + cent->lerpOrigin[2] -= 14; // cent->lerpOrigin[2] += 8; // an extra height boost // Blaze: rotate the gun by 90 degrees to place it on the ground VectorCopy(ent.axis[1], myvec); diff --git a/reaction/cgame/cg_local.h b/reaction/cgame/cg_local.h index 8d2c3300..bfdff756 100644 --- a/reaction/cgame/cg_local.h +++ b/reaction/cgame/cg_local.h @@ -507,7 +507,7 @@ typedef struct { // zoom key qboolean zoomed; // Hawkins: not just zoomed... but - int zoomLevel; // Zoom LEVEL! +// int zoomLevel; // Zoom LEVEL! int zoomTime; float zoomSensitivity; diff --git a/reaction/cgame/cg_playerstate.c b/reaction/cgame/cg_playerstate.c index 3d414337..f8d271eb 100644 --- a/reaction/cgame/cg_playerstate.c +++ b/reaction/cgame/cg_playerstate.c @@ -184,8 +184,8 @@ void CG_Respawn( void ) { cg.weaponSelect = cg.snap->ps.weapon; //Elder: added to reset zoom stuff LOCALLY - cg.zoomed = qfalse; - cg.zoomLevel = 0; + //cg.zoomed = qfalse; + //cg.zoomLevel = 0; } extern char *eventnames[]; diff --git a/reaction/cgame/cg_servercmds.c b/reaction/cgame/cg_servercmds.c index f1846c56..3d6a8ab3 100644 --- a/reaction/cgame/cg_servercmds.c +++ b/reaction/cgame/cg_servercmds.c @@ -1054,9 +1054,9 @@ static void CG_ServerCommand( void ) { default: cg.weaponSelectTime = cg.time; cg.weaponSelect = WP_PISTOL; - cg.zoomed = qfalse; - cg.zoomLevel = 0; - trap_SendClientCommand("unzoom"); + //cg.zoomed = qfalse; + //cg.zoomLevel = 0; + //trap_SendClientCommand("unzoom"); break; } } diff --git a/reaction/cgame/cg_view.c b/reaction/cgame/cg_view.c index e9389439..2fefabaa 100644 --- a/reaction/cgame/cg_view.c +++ b/reaction/cgame/cg_view.c @@ -487,7 +487,10 @@ static int CG_CalcFov( void ) { // zoomFov = cg_zoomFov.value; */ // Hawkins Reaction zooming. - if(cg.zoomed){ + if ( cg.snap->ps.weapon==WP_SSG3000 && + ( (cg.snap->ps.stats[STAT_RQ3] & RQ3_ZOOM_LOW) == RQ3_ZOOM_LOW || + (cg.snap->ps.stats[STAT_RQ3] & RQ3_ZOOM_MED) == RQ3_ZOOM_MED ) ) { + /* switch(cg.zoomLevel){ case 1: zoomFov=45; @@ -505,13 +508,38 @@ static int CG_CalcFov( void ) { zoomFov=90; cg.zoomed=qfalse; break; + }*/ + + if ( (cg.snap->ps.stats[STAT_RQ3] & RQ3_ZOOM_LOW) == RQ3_ZOOM_LOW && + (cg.snap->ps.stats[STAT_RQ3] & RQ3_ZOOM_MED) == RQ3_ZOOM_MED ) { + //6x + fov_x = 20; + zoomFov = 10; + cg.zoomed = qtrue; } + else if ( (cg.snap->ps.stats[STAT_RQ3] & RQ3_ZOOM_LOW) == RQ3_ZOOM_LOW) { + //2x + zoomFov = 45; + cg.zoomed = qtrue; + } + else if ( (cg.snap->ps.stats[STAT_RQ3] & RQ3_ZOOM_MED) == RQ3_ZOOM_MED) { + //4x + fov_x = 45; + zoomFov = 20; + cg.zoomed = qtrue; + } + else { + //1x + zoomFov = 90; + cg.zoomed = qfalse; + } + if ( zoomFov < 1 ) { zoomFov = 1; } else if ( zoomFov > 160 ) { zoomFov = 160; } - if ( cg.zoomed ) { + if ( cg.zoomed ) { f = ( cg.time - cg.zoomTime ) / (float)ZOOM_TIME; if ( f > 1.0 ) { fov_x = zoomFov; @@ -529,7 +557,8 @@ static int CG_CalcFov( void ) { } else { //Elder: safety check - cg.zoomLevel = 0; + //cg.zoomLevel = 0; + cg.zoomed = qfalse; } x = cg.refdef.width / tan( fov_x / 360 * M_PI ); diff --git a/reaction/cgame/cg_weapons.c b/reaction/cgame/cg_weapons.c index 7ede64f5..e20dcc4e 100644 --- a/reaction/cgame/cg_weapons.c +++ b/reaction/cgame/cg_weapons.c @@ -728,8 +728,10 @@ void CG_RegisterWeapon( int weaponNum ) { case WP_AKIMBO: //Elder: added MAKERGB( weaponInfo->flashDlightColor, 1, 1, 0.5f ); - weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/mk23/mk23fire.wav", qfalse ); - weaponInfo->flashSound[1] = trap_S_RegisterSound( "sound/weapons/mk23/mk23fire.wav", qfalse ); + //Elder: changed to use pseudo-dual sound + weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/akimbo/akimbofire.wav", qfalse ); + weaponInfo->flashSound[1] = trap_S_RegisterSound( "sound/weapons/akimbo/akimbofire.wav", qfalse ); + //weaponInfo->flashSound[1] = trap_S_RegisterSound( "sound/weapons/mk23/mk23fire.wav", qfalse ); weaponInfo->ejectBrassFunc = CG_MachineGunEjectBrass; cgs.media.bulletExplosionShader = trap_R_RegisterShader( "bulletExplosion" ); break; @@ -1589,8 +1591,14 @@ void CG_NextWeapon_f( void ) { } //Elder: added - cg.zoomed = qfalse; - cg.zoomLevel = 0; + if ( (cg.snap->ps.stats[STAT_RQ3] & RQ3_BANDAGE_WORK) == RQ3_BANDAGE_WORK) { + CG_Printf("You are too busy bandaging...\n"); + return; + } + + //Elder: added + //cg.zoomed = qfalse; + //cg.zoomLevel = 0; cg.weaponSelectTime = cg.time; original = cg.weaponSelect; @@ -1630,8 +1638,14 @@ void CG_PrevWeapon_f( void ) { } //Elder: added - cg.zoomed = qfalse; - cg.zoomLevel = 0; + if ( (cg.snap->ps.stats[STAT_RQ3] & RQ3_BANDAGE_WORK) == RQ3_BANDAGE_WORK) { + CG_Printf("You are too busy bandaging...\n"); + return; + } + + //Elder: added + //cg.zoomed = qfalse; + //cg.zoomLevel = 0; cg.weaponSelectTime = cg.time; original = cg.weaponSelect; @@ -1654,11 +1668,18 @@ void CG_PrevWeapon_f( void ) { } } +//Elder: for returning to the zoom state in ps stats +void CG_RQ3_QuickZoom ( void ) { + //cg.zoomLevel = lastzoom; +} + // Hawkins (weapon command) // Elder: Don't call it the weapon command heh :) //void CG_RXN_Zoom(int n){ +//Elder: not used again - AQ2 doesn't tell the player about the zoom level void CG_RXN_Zoom( void ) { //Elder: reworked SSG zoom + /* if(cg.snap->ps.weapon==WP_SSG3000) { cg.zoomLevel++; if (cg.zoomLevel == 4) { @@ -1672,6 +1693,21 @@ void CG_RXN_Zoom( void ) { } cg.zoomTime = cg.time; } + */ + if ( (cg.snap->ps.stats[STAT_RQ3] & RQ3_ZOOM_LOW) == RQ3_ZOOM_LOW && + (cg.snap->ps.stats[STAT_RQ3] & RQ3_ZOOM_MED) == RQ3_ZOOM_MED ) { + CG_Printf("Zoomed to 6x\n"); + } + else if ( (cg.snap->ps.stats[STAT_RQ3] & RQ3_ZOOM_LOW) == RQ3_ZOOM_LOW) { + CG_Printf("Zoomed to 2x\n"); + } + else if ( (cg.snap->ps.stats[STAT_RQ3] & RQ3_ZOOM_MED) == RQ3_ZOOM_MED) { + CG_Printf("Zoomed to 4x\n"); + } + else { + CG_Printf("Zoomed out\n"); + } + /* if ( n == 0 ) { cg.zoomLevel=0; @@ -1716,6 +1752,18 @@ void CG_Weapon_f( void ) { return; } + //Elder: added to prevent weapon switching while bandaging + if ( (cg.snap->ps.stats[STAT_RQ3] & RQ3_BANDAGE_WORK) == RQ3_BANDAGE_WORK) { + CG_Printf("You are too busy bandaging...\n"); + return; + } + + //Elder: in the middle of firing, reloading or weapon-switching + if (cg.snap->ps.weaponTime > 0) { + return; + } + + ///Elder: spectator? if ( cg.snap->ps.pm_flags & PMF_FOLLOW ) { return; @@ -1723,14 +1771,15 @@ void CG_Weapon_f( void ) { // Hawkins (give 'weapon' dual meaning) if ( trap_Argc() == 1 ) { - //Elder: if SSG, use local zooming THEN forward to server for stats if (cg.snap->ps.weapon == WP_SSG3000) { //trap_S_StartSound( NULL, cg.snap->ps.clientNum, CHAN_ITEM, cgs.media.lensSound); trap_S_StartLocalSound( cgs.media.lensSound, CHAN_ITEM); - CG_RXN_Zoom(); - } - - trap_SendClientCommand("weapon"); + //CG_RXN_Zoom(); + } + else { + //do weapon select sound + } + trap_SendClientCommand("weapon"); } num = atoi( CG_Argv( 1 ) ); @@ -1753,8 +1802,8 @@ void CG_Weapon_f( void ) { return; } - cg.zoomed = qfalse; - cg.zoomLevel = 0; + //cg.zoomed = qfalse; + //cg.zoomLevel = 0; trap_SendClientCommand("unzoom"); cg.weaponSelect = num;