Sync with VM 0-04-00 release
Fixes a ton of stuff, adds some new goodies
CGame Component
This commit is contained in:
Victor Chow 2001-07-16 01:41:36 +00:00
parent 732f73a910
commit 231ffd675d
11 changed files with 547 additions and 228 deletions

View file

@ -46,8 +46,7 @@ static void CG_DropWeapon_f (void) {
return;
}
//cg.zoomed = 0;
//cg.zoomLevel = 0;
CG_RQ3_Zoom1x();
trap_SendClientCommand("dropweapon");
}
@ -91,18 +90,29 @@ static void CG_Bandage_f (void) {
//Elder: added to prevent bandaging while reloading or firing
//Moved below "already-bandaging" case and removed message
if ( cg.snap->ps.weaponTime > 0 || cg.snap->ps.weaponstate == WEAPON_COCKED) {
//if ( cg.snap->ps.weaponTime > 0 || cg.snap->ps.weaponstate == WEAPON_COCKED) {
//CG_Printf("You are too busy with your weapon!\n");
return;
}
//else if ( (cg.snap->ps.stats[STAT_RQ3] & RQ3_BANDAGE_NEED) == RQ3_BANDAGE_NEED) {
//cg.zoomed = 0;
//cg.zoomLevel = 0;
//return;
//}
if ( (cg.snap->ps.stats[STAT_RQ3] & RQ3_BANDAGE_NEED) == RQ3_BANDAGE_NEED) {
CG_RQ3_Zoom1x();
}
trap_SendClientCommand("bandage");
}
/*
=================
CG_ReloadReset_f
Elder: reset reload depressed flag
=================
*/
static void CG_ReloadReset_f (void) {
cg.rq3_reloadDown = qfalse;
}
/*
=================
CG_Reload_f
@ -117,7 +127,7 @@ static void CG_Reload_f (void) {
if ( !cg.snap ) {
return;
}
// if we are going into the intermission, don't do anything
if ( cg.intermissionStarted ) {
return;
@ -128,12 +138,19 @@ static void CG_Reload_f (void) {
return;
}
if (cg.rq3_reloadDown)
return;
cg.rq3_reloadDown = qtrue;
//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: don't allow reloading until the weapon is free
//Don't cut-off here because we want to check for fast-reloads
//if (cg.snap->ps.weaponTime > 0)
@ -152,6 +169,11 @@ static void CG_Reload_f (void) {
//cg.zoomed = 0;
//cg.zoomLevel = 0;
}
//Elder: reset "no ammo" switch in view
if (cg.snap->ps.weapon == WP_SSG3000 && cg.zoomFirstReturn == -1)
cg.zoomFirstReturn = 0;
trap_SendClientCommand("reload");
}
@ -559,7 +581,8 @@ static consoleCommand_t commands[] = {
{ "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
{ "+reload", CG_Reload_f }, // Elder: added to reset zoom then goto server
{ "-reload", CG_ReloadReset_f}, // Elder: added to stop auto-throttle
{ "specialweapon", CG_SpecialWeapon_f }, // Elder: select special weapon
{ "tell_target", CG_TellTarget_f },
{ "tell_attacker", CG_TellAttacker_f },

View file

@ -1983,8 +1983,8 @@ static void CG_DrawCrosshair(void) {
qhandle_t hShader;
float f;
float x, y;
int ca;
char *ssg_crosshair;
int ca, i;
vec4_t crosshairColor;
if ( !cg_drawCrosshair.integer ) {
return;
@ -2021,32 +2021,51 @@ 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.snap->ps.stats[STAT_RQ3] & RQ3_ZOOM_LOW) == RQ3_ZOOM_LOW ||
(cg.snap->ps.stats[STAT_RQ3] & RQ3_ZOOM_MED) == RQ3_ZOOM_MED ) ) {
if ( cg.snap->ps.weapon == WP_SSG3000 &&
(cg.zoomFirstReturn == -1 || cg.snap->ps.weaponTime < ZOOM_TIME) &&
( (cg.zoomLevel & RQ3_ZOOM_LOW) == RQ3_ZOOM_LOW ||
(cg.zoomLevel & RQ3_ZOOM_MED) == RQ3_ZOOM_MED ) ) {
int zoomMag;
x = SCREEN_WIDTH / 2;
y = SCREEN_HEIGHT / 2;
//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 ) {
if ( (cg.zoomLevel & RQ3_ZOOM_LOW) == RQ3_ZOOM_LOW &&
(cg.zoomLevel & RQ3_ZOOM_MED) == RQ3_ZOOM_MED ) {
zoomMag = 2;
}
else if ( (cg.snap->ps.stats[STAT_RQ3] & RQ3_ZOOM_LOW) == RQ3_ZOOM_LOW) {
else if ( (cg.zoomLevel & RQ3_ZOOM_LOW) == RQ3_ZOOM_LOW) {
zoomMag = 0;
}
else if ( (cg.snap->ps.stats[STAT_RQ3] & RQ3_ZOOM_MED) == RQ3_ZOOM_MED) {
else if ( (cg.zoomLevel & 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);
CG_Error("CG_DrawCrosshair: received no zoom value\n");
}
//Elder: Setup crosshair colours
crosshairColor[0] = cg_RQ3_ssgColorR.value;
crosshairColor[1] = cg_RQ3_ssgColorG.value;
crosshairColor[2] = cg_RQ3_ssgColorB.value;
crosshairColor[3] = cg_RQ3_ssgColorA.value;
//Clamp
for (i = 0; i < 4; i++)
{
if (crosshairColor[i] > 1.0)
crosshairColor[i] = 1.0;
else if (crosshairColor[i] < 0)
crosshairColor[i] = 0;
}
trap_R_SetColor(crosshairColor);
//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[zoomMag]);
trap_R_SetColor(NULL);
return;
}
else {
@ -2706,7 +2725,7 @@ static void CG_DrawDamageBlend()
vec4_t damageColor;
//Leave if no true damage, disabled, or ragepro
if ( !cg.rq3_trueDamage || !rxn_painblend.integer ||
if ( !cg.rq3_trueDamage || !cg_RQ3_painblend.integer ||
cgs.glconfig.hardwareType == GLHW_RAGEPRO)
{
return;

View file

@ -711,7 +711,7 @@ void CG_BigExplode( vec3_t playerOrigin ) {
le->leType = LE_FRAGMENT;
le->startTime = cg.time;
le->endTime = le->startTime + (random() * 3000)+ rxn_glasstime.integer;// + 30000;
le->endTime = le->startTime + (random() * 3000)+ cg_RQ3_glasstime.integer;// + 30000;
VectorCopy( origin, re->origin );

View file

@ -97,45 +97,45 @@ static void CG_Obituary( entityState_t *ent ) {
message2 = "";
// check for single client messages
gender = ci->gender;
switch( mod ) {
case MOD_SUICIDE:
message = "suicides";
break;
case MOD_FALLING:
//message = "'s thoughts weren't happy enough";
//Elder: changed
if ( gender == GENDER_FEMALE )
message = "plummets to her death";
else if ( gender == GENDER_NEUTER )
message = "plummets to its death";
else
message = "plummets to his death";
break;
case MOD_CRUSH:
message = "was flattened";
break;
case MOD_WATER:
message = "sank like a rock";
break;
case MOD_SLIME:
message = "melted";
break;
case MOD_LAVA:
message = "does a back flip into the lava";
break;
case MOD_TARGET_LASER:
message = "saw the light";
break;
case MOD_TRIGGER_HURT:
message = "was in the wrong place";
break;
case MOD_BLEEDING:
message = "bleeds to death";
break;
default:
message = NULL;
break;
case MOD_SUICIDE:
message = "suicides";
break;
case MOD_FALLING:
//message = "'s thoughts weren't happy enough";
//Elder: changed
if ( gender == GENDER_FEMALE )
message = "plummets to her death";
else if ( gender == GENDER_NEUTER )
message = "plummets to its death";
else
message = "plummets to his death";
break;
case MOD_CRUSH:
message = "was flattened";
break;
case MOD_WATER:
message = "sank like a rock";
break;
case MOD_SLIME:
message = "melted";
break;
case MOD_LAVA:
message = "does a back flip into the lava";
break;
case MOD_TARGET_LASER:
message = "saw the light";
break;
case MOD_TRIGGER_HURT:
message = "was in the wrong place";
break;
case MOD_BLEEDING:
message = "bleeds to death";
break;
default:
message = NULL;
break;
}
if (attacker == target) {
@ -1639,8 +1639,17 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) {
//
case EV_NOAMMO:
DEBUGNAME("EV_NOAMMO");
//Elder: uncommented
trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.noAmmoSound );
//Elder: Only play on non-grenade/knife
//Todo: use "out of ammo sound" for specific gun?
switch ( cg.snap->ps.weapon )
{
case WP_GRENADE:
case WP_KNIFE:
break;
default:
trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.noAmmoSound );
break;
}
if ( es->number == cg.snap->ps.clientNum ) {
CG_OutOfAmmoChange();
}
@ -1650,7 +1659,7 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) {
//Elder: TODO: change to appropriate weapon "in" sound
trap_S_StartSound (NULL, es->number, CHAN_AUTO, cgs.media.selectSound );
//Elder: removed
//CG_rxn_zoom(0);
//CG_RQ3_Zoom(0);
break;
case EV_FIRE_WEAPON:
DEBUGNAME("EV_FIRE_WEAPON");

View file

@ -125,7 +125,6 @@ void CG_DrawInformation( void ) {
const char *s;
const char *info;
const char *sysInfo;
char sTemp[1024];
int x = 8;
int y;
int value;

View file

@ -77,6 +77,7 @@
//Elder: Some ssg stuff
#define ZOOM_LEVELS 3
#define ZOOM_PREPTIME 10 //milliseconds
typedef enum {
FOOTSTEP_NORMAL,
@ -507,8 +508,10 @@ typedef struct {
// zoom key
qboolean zoomed; // Hawkins: not just zoomed... but
// int zoomLevel; // Zoom LEVEL!
qboolean zoomed; // Determines first-person weapon drawing
int zoomLevel; // Zoom LEVEL! -- uses zoom bits like STAT_RQ3
int lastZoomLevel; // Save last zoom state
int zoomFirstReturn; // Elder: switch for zooming in/out between shots
int zoomTime;
float zoomSensitivity;
@ -588,15 +591,15 @@ typedef struct {
int weaponSelectTime;
int weaponAnimation;
int weaponAnimationTime;
// blend blobs
float damageTime;
float damageX, damageY, damageValue;
//Elder: added for alpha pain blend
int rq3_trueDamage; //Q3 doesn't hold the actual damage amount in cg.damageValue
//float rq3_lastPainAlpha;
float rq3_blendTime; //How long we take to fade out
qboolean rq3_reloadDown; //Flag to check if reload is pressed
// status bar head
float headYaw;
@ -1177,13 +1180,21 @@ extern vmCvar_t cg_blood;
extern vmCvar_t cg_predictItems;
extern vmCvar_t cg_deferPlayers;
//Blaze: Reaction weapon positions
extern vmCvar_t rxn_drawWeapon;
extern vmCvar_t cg_RQ3_drawWeapon;
//Blaze: how long the glass stays around for
extern vmCvar_t rxn_glasstime;
extern vmCvar_t cg_RQ3_glasstime;
//Elder: muzzle flash toggle
extern vmCvar_t rxn_flash;
//Elder: turn on or off alpha blending
extern vmCvar_t rxn_painblend;
extern vmCvar_t cg_RQ3_flash;
//Elder: toggle alpha blending
extern vmCvar_t cg_RQ3_painblend;
//Elder: toggle client-side zoom assist
extern vmCvar_t cg_RQ3_ssgZoomAssist;
//Elder: crosshair colours!
extern vmCvar_t cg_RQ3_ssgColorR;
extern vmCvar_t cg_RQ3_ssgColorG;
extern vmCvar_t cg_RQ3_ssgColorB;
extern vmCvar_t cg_RQ3_ssgColorA;
extern vmCvar_t cg_drawFriend;
extern vmCvar_t cg_teamChatsOnly;
extern vmCvar_t cg_noVoiceChats;
@ -1383,6 +1394,13 @@ void CG_Weapon_f( void );
void CG_PrevWeapon_f( void );
void CG_SpecialWeapon_f ( void );
void CG_RQ3_SyncZoom ( void );
void CG_RQ3_SaveZoomLevel();
void CG_RQ3_Zoom( void ); //Elder: just threw it in
void CG_RQ3_Zoom1x();
int CG_RQ3_GetGrenadeMode();
void CG_RQ3_GrenadeMode();
void CG_RegisterWeapon( int weaponNum );
void CG_RegisterItemVisuals( int itemNum );
@ -1397,7 +1415,6 @@ void CG_GrappleTrail( centity_t *ent, const weaponInfo_t *wi );
void CG_AddViewWeapon (playerState_t *ps);
void CG_AddPlayerWeapon( refEntity_t *parent, playerState_t *ps, centity_t *cent, int team );
void CG_DrawWeaponSelect( void );
void CG_RXN_Zoom( void ); //Elder: just threw it in
void CG_OutOfAmmoChange( void ); // should this be in pmove?

View file

@ -138,12 +138,19 @@ vmCvar_t cg_deferPlayers;
vmCvar_t cg_drawTeamOverlay;
vmCvar_t cg_teamOverlayUserinfo;
//Blaze: reaction weapon positioning
vmCvar_t rxn_drawWeapon;
vmCvar_t rxn_glasstime;
vmCvar_t cg_RQ3_drawWeapon;
vmCvar_t cg_RQ3_glasstime;
//Elder: muzzle flash toggle
vmCvar_t rxn_flash;
//Elder: turn on or off alpha blending
vmCvar_t rxn_painblend;
vmCvar_t cg_RQ3_flash;
//Elder: toggle alpha blending
vmCvar_t cg_RQ3_painblend;
//Elder: toggle client-side zoom assist
vmCvar_t cg_RQ3_ssgZoomAssist;
//Elder: crosshair colours!
vmCvar_t cg_RQ3_ssgColorR;
vmCvar_t cg_RQ3_ssgColorG;
vmCvar_t cg_RQ3_ssgColorB;
vmCvar_t cg_RQ3_ssgColorA;
vmCvar_t cg_drawFriend;
vmCvar_t cg_teamChatsOnly;
vmCvar_t cg_noVoiceChats;
@ -294,12 +301,16 @@ cvarTable_t cvarTable[] = {
{ &cg_smallFont, "ui_smallFont", "0.25", CVAR_ARCHIVE},
{ &cg_bigFont, "ui_bigFont", "0.4", CVAR_ARCHIVE},
//Blaze: Reaction hand type command
{ &rxn_drawWeapon, "rxn_drawWeapon", "2", CVAR_ARCHIVE },
{ &rxn_glasstime, "rxn_glasstime", "0", CVAR_ARCHIVE },
{ &cg_RQ3_drawWeapon, "cg_RQ3_drawWeapon", "2", CVAR_ARCHIVE },
{ &cg_RQ3_glasstime, "cg_RQ3_glasstime", "0", CVAR_ARCHIVE },
//Elder: added
{ &rxn_flash, "rxn_flash", "1", CVAR_ARCHIVE },
{ &rxn_painblend, "rxn_painblend", "1", CVAR_ARCHIVE }
{ &cg_RQ3_flash, "cg_RQ3_flash", "1", CVAR_ARCHIVE },
{ &cg_RQ3_painblend, "cg_RQ3_painblend", "1", CVAR_ARCHIVE },
{ &cg_RQ3_ssgZoomAssist, "cg_RQ3_ssgZoomAssist", "1", CVAR_ARCHIVE },
{ &cg_RQ3_ssgColorR, "cg_RQ3_ssgColorR", "0.0", CVAR_ARCHIVE },
{ &cg_RQ3_ssgColorG, "cg_RQ3_ssgColorG", "1.0", CVAR_ARCHIVE },
{ &cg_RQ3_ssgColorB, "cg_RQ3_ssgColorB", "0.0", CVAR_ARCHIVE },
{ &cg_RQ3_ssgColorA, "cg_RQ3_ssgColorA", "0.75", CVAR_ARCHIVE }
// { &cg_pmove_fixed, "cg_pmove_fixed", "0", CVAR_USERINFO | CVAR_ARCHIVE }
};

View file

@ -12,22 +12,24 @@
CG_CheckAmmo
If the ammo has gone low enough to generate the warning, play a sound
Elder: changed the purpose of the function
It now generates a warning ONLY if the *current* weapon is low on/out of ammo
==============
*/
void CG_CheckAmmo( void ) {
int i;
//int i;
int total;
int previous;
int weapons;
//int weapons;
// see about how many seconds of ammo we have remaining
weapons = cg.snap->ps.stats[ STAT_WEAPONS ];
//weapons = cg.snap->ps.stats[ STAT_WEAPONS ];
total = 0;
//Blaze: ammo check
for ( i = WP_KNIFE ; i < WP_NUM_WEAPONS ; i++ ) {
if ( ! ( weapons & ( 1 << i ) ) ) {
continue;
}
//for ( i = WP_KNIFE ; i < WP_NUM_WEAPONS ; i++ ) {
//if ( ! ( weapons & ( 1 << i ) ) ) {
//continue;
//}
//Blaze: Dont need this
/*
switch ( i ) {
@ -45,26 +47,72 @@ void CG_CheckAmmo( void ) {
break;
}
*/
total += cg.snap->ps.ammo[i] * 2000;//Blaze: Make this big so you dont his the amo check off the bat
//Elder: how it should be handled - but we're not using it
//for this purpose
/*
switch (i) {
case WP_PISTOL:
total += cg.snap->ps.ammo[i] * RQ3_PISTOL_DELAY;
break;
case WP_M3:
total += cg.snap->ps.ammo[i] * RQ3_M3_DELAY;
break;
case WP_M4:
total += cg.snap->ps.ammo[i] * RQ3_M4_DELAY;
break;
case WP_MP5:
total += cg.snap->ps.ammo[i] * RQ3_MP5_DELAY;
break;
case WP_M3:
total += cg.snap->ps.ammo[i] * RQ3_M3_DELAY;
break;
case WP_SSG3000:
total += cg.snap->ps.ammo[i] * RQ3_SSG3000_DELAY;
break;
case WP_GRENADE:
total += cg.snap->ps.ammo[i] * RQ3_GRENADE_DELAY;
break;
case WP_KNIFE:
total += cg.snap->ps.ammo[i] * RQ3_KNIFE_DELAY;
break;
default:
total += cg.snap->ps.ammo[i] * 2000;
break;
}
*/
//total += cg.snap->ps.ammo[i] * 2000;//Blaze: Make this big so you dont his the amo check off the bat
/*
if ( total >= 5000 ) {
cg.lowAmmoWarning = 0;
return;
}
}*/
total = cg.snap->ps.ammo[cg.snap->ps.weapon];
if (total > 0)
{
cg.lowAmmoWarning = 0;
if (cg.snap->ps.weapon == WP_SSG3000 && cg.zoomFirstReturn == -1)
cg.zoomFirstReturn = 0;
return;
}
previous = cg.lowAmmoWarning;
if ( total == 0 ) {
cg.lowAmmoWarning = 2;
} else {
}
//else {
//Elder: only allow completely empty ammo warning sounds
//cg.lowAmmoWarning = 1;
}
//}
// play a sound on transitions
if ( cg.lowAmmoWarning != previous ) {
trap_S_StartLocalSound( cgs.media.noAmmoSound, CHAN_LOCAL_SOUND );
}
//if ( cg.lowAmmoWarning != previous ) {
//trap_S_StartLocalSound( cgs.media.noAmmoSound, CHAN_LOCAL_SOUND );
//}
}
/*
@ -194,8 +242,7 @@ void CG_Respawn( void ) {
cg.weaponSelect = cg.snap->ps.weapon;
//Elder: added to reset zoom stuff LOCALLY
//cg.zoomed = qfalse;
//cg.zoomLevel = 0;
CG_RQ3_Zoom1x();
}
extern char *eventnames[];
@ -522,5 +569,24 @@ void CG_TransitionPlayerState( playerState_t *ps, playerState_t *ops ) {
cg.duckChange = ps->viewheight - ops->viewheight;
cg.duckTime = cg.time;
}
//Elder: grenade message
if (ps->weapon == WP_GRENADE &&
ps->weaponstate == WEAPON_COCKED && ops->weaponstate != WEAPON_COCKED)
{
switch(CG_RQ3_GetGrenadeMode())
{
case RQ3_GRENSHORT|RQ3_GRENMED:
CG_Printf("Pin pulled. Ready to make a long range throw.\n");
break;
case RQ3_GRENMED:
CG_Printf("Pin pulled. Ready to make a medium range throw.\n");
break;
case RQ3_GRENSHORT:
CG_Printf("Pin pulled. Ready to make a short range throw.\n");
break;
}
}
}

View file

@ -1051,14 +1051,12 @@ static void CG_ServerCommand( void ) {
case WP_PISTOL:
case WP_KNIFE:
case WP_AKIMBO:
case WP_GRENADE:
break;
//case WP_GRENADE:
default:
cg.weaponSelectTime = cg.time;
cg.weaponSelect = WP_PISTOL;
//cg.zoomed = qfalse;
//cg.zoomLevel = 0;
//trap_SendClientCommand("unzoom");
CG_RQ3_Zoom1x();
break;
}
}

View file

@ -442,6 +442,48 @@ void CG_ZoomUp_f( void ) {
}
*/
/*
====================
CG_RQ3_GetFov
Returns a FOV based on the current zoom state
====================
*/
static int CG_RQ3_GetFov()
{
if ( (cg.zoomLevel & RQ3_ZOOM_LOW) == RQ3_ZOOM_LOW &&
(cg.zoomLevel & RQ3_ZOOM_MED) == RQ3_ZOOM_MED )
return 10;
else if ( (cg.zoomLevel & RQ3_ZOOM_MED) == RQ3_ZOOM_MED)
return 20;
else if ( (cg.zoomLevel & RQ3_ZOOM_LOW) == RQ3_ZOOM_LOW)
return 45;
return 90;
}
/*
====================
CG_RQ3_GetFov
Returns a FOV based on the last zoom state
====================
*/
static int CG_RQ3_GetLastFov()
{
if ( (cg.lastZoomLevel & RQ3_ZOOM_LOW) == RQ3_ZOOM_LOW &&
(cg.lastZoomLevel & RQ3_ZOOM_MED) == RQ3_ZOOM_MED )
return 10;
else if ( (cg.lastZoomLevel & RQ3_ZOOM_MED) == RQ3_ZOOM_MED)
return 20;
else if ( (cg.lastZoomLevel & RQ3_ZOOM_LOW) == RQ3_ZOOM_LOW)
return 45;
return 90;
}
/*
====================
CG_CalcFov
@ -457,16 +499,15 @@ static int CG_CalcFov( void ) {
float phase;
float v;
int contents;
float fov_x, fov_y;
float zoomFov;
float fov_x, fov_y; //Current zoom
float zoomFov; //Desired zoom
float f;
int inwater;
/* if ( cg.predictedPlayerState.pm_type == PM_INTERMISSION ) {
// if in intermission, use a fixed value */
// Hawkins always use FOV 90.
fov_x = 90;
if ( cg.predictedPlayerState.pm_type == PM_INTERMISSION ) {
fov_x = 90;
}
// if in intermission, use a fixed value
/*
} else {
@ -486,78 +527,136 @@ static int CG_CalcFov( void ) {
// account for zooms
// zoomFov = cg_zoomFov.value;
*/
// Hawkins Reaction zooming.
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;
break;
case 2:
fov_x = 45;
zoomFov=20;
break;
case 3:
fov_x = 20;
zoomFov=10;
break;
case 0:
default:
zoomFov=90;
cg.zoomed=qfalse;
break;
}*/
if (cg_RQ3_ssgZoomAssist.integer == 0)
CG_RQ3_SyncZoom();
//SSG3000 zoom handling
if ( cg.snap->ps.weapon == WP_SSG3000)
{
//switching zoom
if (cg.zoomLevel != cg.lastZoomLevel)
{
fov_x = CG_RQ3_GetLastFov();
//Get desired zoom FOV based on current FOV
if (cg.zoomLevel == 0)
{
zoomFov = 90;
cg.zoomed = qfalse;
}
else
{
switch ((int)fov_x)
{
case 20:
zoomFov = 10;
cg.zoomed = qtrue;
break;
case 45:
zoomFov = 20;
cg.zoomed = qtrue;
break;
case 90:
zoomFov = 45;
cg.zoomed = qtrue;
break;
case 10:
default:
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 ) {
f = ( cg.time - cg.zoomTime ) / (float)ZOOM_TIME;
if ( f > 1.0 ) {
if ( f > 1.0 )
{
//finished zoom switch
cg.lastZoomLevel = cg.zoomLevel;
fov_x = zoomFov;
} else {
}
else
fov_x = fov_x + f * ( zoomFov - fov_x );
}
//Idle state or out of ammo
else if (cg.snap->ps.weaponTime == 0)
{
fov_x = CG_RQ3_GetFov();
if (fov_x == 90)
cg.zoomed = qfalse;
else
cg.zoomed = qtrue;
//if (cg.snap->ps.ammo[WP_SSG3000] == 0)
//cg.zoomFirstReturn = -1;
//else
if (cg.lowAmmoWarning)
cg.zoomFirstReturn = -1;
else
cg.zoomFirstReturn = 0;
}
//Zoom back in after a reload or fire or weapon switch
else if (cg.snap->ps.weaponTime < ZOOM_TIME)
{
if (cg.zoomFirstReturn == 1)
{
cg.zoomTime = cg.time;
cg.zoomFirstReturn = 0;
}
} else {
fov_x = 90;
zoomFov = CG_RQ3_GetFov();
if (zoomFov == 90)
cg.zoomed = qfalse;
else
cg.zoomed = qtrue;
f = ( cg.time - cg.zoomTime ) / (float)ZOOM_TIME;
if ( f > 1.0 ) {
fov_x = fov_x;
} else {
fov_x = zoomFov + f * ( fov_x - zoomFov );
if ( f > 1.0 || cg.zoomFirstReturn == -1)
fov_x = zoomFov;
else
fov_x = fov_x + f * ( zoomFov - fov_x );
//fov_x = zoomFov + f * ( fov_x - zoomFov );
}
//first time after a shot or reload - zoom out
else
{
if (cg.zoomFirstReturn == 0)
{
cg.zoomTime = cg.time;
cg.zoomFirstReturn = 1;
}
fov_x = CG_RQ3_GetFov();
if (cg.zoomFirstReturn == -1)
zoomFov = fov_x;
else
zoomFov = 90;
//if (zoomFov == 90)
//cg.zoomed = qfalse;
//else
//cg.zoomed = qtrue;
f = ( cg.time - cg.zoomTime ) / (float)ZOOM_TIME;
if ( f > 1.0 )
{
fov_x = zoomFov;
if (fov_x == 90)
cg.zoomed = qfalse;
else
cg.zoomed = qtrue;
}
else
fov_x = fov_x + f * ( zoomFov - fov_x );
}
}
else {
//Elder: safety check
//cg.zoomLevel = 0;
//Using anything but the SSG3000
else
{
//Always at 90 degrees
fov_x = 90;
cg.zoomed = qfalse;
}

View file

@ -1287,8 +1287,8 @@ void CG_AddPlayerWeapon( refEntity_t *parent, playerState_t *ps, centity_t *cent
//Blaze: No flash
//Elder: Yes flash - try this
//Elder: add conditional here so the dlight is still drawn when rxn_flash is 0
if ( rxn_flash.integer ) {
//Elder: add conditional here so the dlight is still drawn when cg_RQ3_flash is 0
if ( cg_RQ3_flash.integer ) {
if (ps) {
//Elder: draw flash based on first-person view
CG_PositionRotatedEntityOnTag( &flash, &gun, weapon->firstModel, "tag_flash");
@ -1420,9 +1420,9 @@ void CG_AddViewWeapon( playerState_t *ps ) {
rxn_gunx += 10;
}
if ((rxn_drawWeapon.integer > 1 ) && (rxn_drawWeapon.integer < 4 ))
if ((cg_RQ3_drawWeapon.integer > 1 ) && (cg_RQ3_drawWeapon.integer < 4 ))
{
rxn_guny = cg_gun_y.value + 4*(rxn_drawWeapon.integer-1);
rxn_guny = cg_gun_y.value + 4*(cg_RQ3_drawWeapon.integer-1);
}
//Blaze end:
@ -1639,7 +1639,7 @@ void CG_NextWeapon_f( void ) {
cg.weaponSelect = original;
}
else {
trap_SendClientCommand("unzoom");
CG_RQ3_Zoom1x();
}
}
@ -1700,7 +1700,7 @@ void CG_PrevWeapon_f( void ) {
cg.weaponSelect = original;
}
else {
trap_SendClientCommand("unzoom");
CG_RQ3_Zoom1x();
}
}
@ -1766,22 +1766,92 @@ void CG_SpecialWeapon_f( void ) {
cg.weaponSelect = original;
}
else {
trap_SendClientCommand("unzoom");
CG_RQ3_Zoom1x();
}
}
//Elder: for returning to the zoom state in ps stats
void CG_RQ3_QuickZoom ( void ) {
//cg.zoomLevel = lastzoom;
void CG_RQ3_SyncZoom ( void ) {
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");
cg.zoomLevel = RQ3_ZOOM_LOW|RQ3_ZOOM_MED;
}
else if ( (cg.snap->ps.stats[STAT_RQ3] & RQ3_ZOOM_LOW) == RQ3_ZOOM_LOW) {
//CG_Printf("Zoomed to 2x\n");
cg.zoomLevel = RQ3_ZOOM_LOW;
}
else if ( (cg.snap->ps.stats[STAT_RQ3] & RQ3_ZOOM_MED) == RQ3_ZOOM_MED) {
//CG_Printf("Zoomed to 4x\n");
cg.zoomLevel = RQ3_ZOOM_MED;
}
else {
//CG_Printf("Zoomed out\n");
cg.zoomLevel = 0;
}
}
// 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: save zoom level and do any other necessary housekeeping
void CG_RQ3_SaveZoomLevel() {
cg.lastZoomLevel = cg.zoomLevel;
}
/*
void CG_RQ3_SyncZoom2 ( void ) {
int statZoom;
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 ) {
statZoom = RQ3_ZOOM_LOW|RQ3_ZOOM_MED;
}
else if ( (cg.snap->ps.stats[STAT_RQ3] & RQ3_ZOOM_LOW) == RQ3_ZOOM_LOW) {
statZoom = RQ3_ZOOM_LOW;
}
else if ( (cg.snap->ps.stats[STAT_RQ3] & RQ3_ZOOM_MED) == RQ3_ZOOM_MED) {
statZoom = RQ3_ZOOM_MED;
}
else {
statZoom = 0;
}
if (statZoom != cg.zoomLevel)
cg.zoomLevel = statZoom;
}*/
//Elder: This should identical to the portion inside
//the weapon function in g_cmds.c
void CG_RQ3_Zoom( void ) {
//Elder: reworked SSG zoom
if (cg.snap->ps.weapon == WP_SSG3000)
{
CG_RQ3_SaveZoomLevel();
if ( (cg.zoomLevel & RQ3_ZOOM_LOW) == RQ3_ZOOM_LOW &&
(cg.zoomLevel & RQ3_ZOOM_MED) == RQ3_ZOOM_MED ) {
//Elder: zoom 1x
cg.zoomLevel &= ~RQ3_ZOOM_LOW;
cg.zoomLevel &= ~RQ3_ZOOM_MED;
}
else if ( (cg.zoomLevel & RQ3_ZOOM_MED) == RQ3_ZOOM_MED) {
//Elder: zoom 6x
cg.zoomLevel |= RQ3_ZOOM_LOW;
}
else if ( (cg.zoomLevel & RQ3_ZOOM_LOW) == RQ3_ZOOM_LOW) {
//Elder: zoom 4x
cg.zoomLevel |= RQ3_ZOOM_MED;
cg.zoomLevel &= ~RQ3_ZOOM_LOW;
}
else {
//Elder: zoom 2x
cg.zoomLevel |= RQ3_ZOOM_LOW;
}
cg.zoomTime = cg.time;
}
/*
if(cg.snap->ps.weapon==WP_SSG3000) {
cg.zoomLevel++;
@ -1797,48 +1867,50 @@ 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;
cg.zoomed=qfalse;
// trap_Cvar_Set("cg_drawGun","1");
CG_Printf("Zoomed to 1x\n");
} else {
// trap_Cvar_Set("cg_drawGun","0");
cg.zoomed = qtrue;
cg.zoomTime = cg.time;
CG_Printf("Zoomed to %dx\n",2*n);
}
}
*/
// trap_SendClientCommand ("weapon");
//Elder: reset locally and send server message
void CG_RQ3_Zoom1x () {
if (cg_RQ3_ssgZoomAssist.integer)
{
cg.lastZoomLevel = cg.zoomLevel;
cg.zoomLevel = 0;
cg.zoomTime = cg.time;
}
trap_SendClientCommand("unzoom");
}
int CG_RQ3_GetGrenadeMode()
{
int grenMode = 0;
if ( (cg.snap->ps.persistant[PERS_WEAPONMODES] & RQ3_GRENSHORT) == RQ3_GRENSHORT)
grenMode |= RQ3_GRENSHORT;
if ( (cg.snap->ps.persistant[PERS_WEAPONMODES] & RQ3_GRENMED) == RQ3_GRENMED)
grenMode |= RQ3_GRENMED;
return grenMode;
}
//Elder: unused function
/*
void rxn_zoom1x(void) {
cg.zoomLevel=0;
cg.zoomed=qfalse;
cg.zoomTime = cg.time;
//Print grenade mode message
void CG_RQ3_GrenadeMode()
{
//Print a message for the next mode in line
if ( (cg.snap->ps.persistant[PERS_WEAPONMODES] & RQ3_GRENSHORT) == RQ3_GRENSHORT &&
(cg.snap->ps.persistant[PERS_WEAPONMODES] & RQ3_GRENMED) == RQ3_GRENMED ) {
CG_Printf("Prepared to make a short range throw\n");
//cg.grenadeMode = RQ3_GRENSHORT|RQ3_GRENMED;
}
else if ( (cg.snap->ps.persistant[PERS_WEAPONMODES] & RQ3_GRENSHORT) == RQ3_GRENSHORT) {
CG_Printf("Prepared to make a medium range throw\n");
//cg.grenadeMode = RQ3_GRENSHORT;
}
else if ( (cg.snap->ps.persistant[PERS_WEAPONMODES] & RQ3_GRENMED) == RQ3_GRENMED) {
CG_Printf("Prepared to make a long range throw\n");
//cg.grenadeMode = RQ3_GRENMED;
}
}
*/
/*
===============
@ -1882,9 +1954,15 @@ void CG_Weapon_f( void ) {
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();
if (cg_RQ3_ssgZoomAssist.integer)
CG_RQ3_Zoom();
}
else {
else if (cg.snap->ps.weapon == WP_GRENADE)
{
CG_RQ3_GrenadeMode();
}
else
{
//do weapon select sound
}
trap_SendClientCommand("weapon");
@ -1913,7 +1991,7 @@ void CG_Weapon_f( void ) {
//cg.zoomed = qfalse;
//cg.zoomLevel = 0;
trap_SendClientCommand("unzoom");
CG_RQ3_Zoom1x();
cg.weaponSelect = num;
}