mirror of
https://github.com/ReactionQuake3/reaction.git
synced 2025-03-26 20:31:01 +00:00
Elder:
Reworking the sniper zoom and bandage required extensive client changes to fit the new model.
This commit is contained in:
parent
b3b1fe4098
commit
3fe61cd477
8 changed files with 174 additions and 39 deletions
|
@ -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
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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[];
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue