mirror of
https://github.com/ReactionQuake3/reaction.git
synced 2024-11-10 15:21:44 +00:00
Elder:
Updates for 0-05-xx + stuff to be released in 0-05-01 Client portion has adjusted HUD, small fixes here and there
This commit is contained in:
parent
231ffd675d
commit
0d3a1a7009
8 changed files with 439 additions and 110 deletions
|
@ -33,6 +33,7 @@ Elder: reset local zoom, then proceed with server action
|
||||||
*/
|
*/
|
||||||
static void CG_DropWeapon_f (void) {
|
static void CG_DropWeapon_f (void) {
|
||||||
if ( !cg.snap ) {
|
if ( !cg.snap ) {
|
||||||
|
//CG_Printf("No snapshot: normally exiting\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,6 +47,10 @@ static void CG_DropWeapon_f (void) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Elder: don't allow weapon dropping when in the middle of bursts
|
||||||
|
if (cg.snap->ps.stats[STAT_BURST] > 0)
|
||||||
|
return;
|
||||||
|
|
||||||
CG_RQ3_Zoom1x();
|
CG_RQ3_Zoom1x();
|
||||||
trap_SendClientCommand("dropweapon");
|
trap_SendClientCommand("dropweapon");
|
||||||
}
|
}
|
||||||
|
@ -61,6 +66,7 @@ the client command to reduce bandwidth use slightly
|
||||||
*/
|
*/
|
||||||
static void CG_Bandage_f (void) {
|
static void CG_Bandage_f (void) {
|
||||||
if ( !cg.snap ) {
|
if ( !cg.snap ) {
|
||||||
|
//CG_Printf("No snapshot: normally exiting\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -80,7 +86,6 @@ static void CG_Bandage_f (void) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//if (cg.snap->ps.stats[STAT_BANDAGE]) {
|
|
||||||
if ( (cg.snap->ps.stats[STAT_RQ3] & RQ3_BANDAGE_WORK) == RQ3_BANDAGE_WORK) {
|
if ( (cg.snap->ps.stats[STAT_RQ3] & RQ3_BANDAGE_WORK) == RQ3_BANDAGE_WORK) {
|
||||||
CG_Printf("You are already bandaging!\n");
|
CG_Printf("You are already bandaging!\n");
|
||||||
//cg.zoomed = 0;
|
//cg.zoomed = 0;
|
||||||
|
@ -88,6 +93,10 @@ static void CG_Bandage_f (void) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Elder: don't allow bandaging when in the middle of bursts
|
||||||
|
if (cg.snap->ps.stats[STAT_BURST] > 0)
|
||||||
|
return;
|
||||||
|
|
||||||
//Elder: added to prevent bandaging while reloading or firing
|
//Elder: added to prevent bandaging while reloading or firing
|
||||||
//Moved below "already-bandaging" case and removed message
|
//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) {
|
||||||
|
@ -109,6 +118,7 @@ Elder: reset reload depressed flag
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
static void CG_ReloadReset_f (void) {
|
static void CG_ReloadReset_f (void) {
|
||||||
|
//CG_Printf("Releasing Reload\n");
|
||||||
cg.rq3_reloadDown = qfalse;
|
cg.rq3_reloadDown = qfalse;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -118,6 +128,7 @@ static void CG_ReloadReset_f (void) {
|
||||||
CG_Reload_f
|
CG_Reload_f
|
||||||
|
|
||||||
Elder: reset local zoom, then proceed with server action
|
Elder: reset local zoom, then proceed with server action
|
||||||
|
Note: most of this doesn't work if it's a +button style
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
static void CG_Reload_f (void) {
|
static void CG_Reload_f (void) {
|
||||||
|
@ -125,6 +136,7 @@ static void CG_Reload_f (void) {
|
||||||
cent = &cg_entities[cg.snap->ps.clientNum];
|
cent = &cg_entities[cg.snap->ps.clientNum];
|
||||||
|
|
||||||
if ( !cg.snap ) {
|
if ( !cg.snap ) {
|
||||||
|
//CG_Printf("No snapshot: normally exiting\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -138,18 +150,23 @@ static void CG_Reload_f (void) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cg.rq3_reloadDown)
|
//Elder: don't allow reloading when in the middle of bursts
|
||||||
|
if (cg.snap->ps.stats[STAT_BURST] > 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
cg.rq3_reloadDown = qtrue;
|
if (cg.rq3_reloadDown == qtrue)
|
||||||
|
{
|
||||||
//Elder: prevent "reloading" when dead hehe
|
//CG_Printf("Reload down... exiting\n");
|
||||||
if ( cg.snap->ps.stats[STAT_HEALTH] < 0 ) {
|
|
||||||
CG_Printf("Nothing to reload - you are dead.\n");
|
|
||||||
return;
|
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
|
//Elder: don't allow reloading until the weapon is free
|
||||||
//Don't cut-off here because we want to check for fast-reloads
|
//Don't cut-off here because we want to check for fast-reloads
|
||||||
|
@ -174,6 +191,7 @@ static void CG_Reload_f (void) {
|
||||||
if (cg.snap->ps.weapon == WP_SSG3000 && cg.zoomFirstReturn == -1)
|
if (cg.snap->ps.weapon == WP_SSG3000 && cg.zoomFirstReturn == -1)
|
||||||
cg.zoomFirstReturn = 0;
|
cg.zoomFirstReturn = 0;
|
||||||
|
|
||||||
|
//CG_Printf("Sending reload command to server\n");
|
||||||
trap_SendClientCommand("reload");
|
trap_SendClientCommand("reload");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -214,6 +232,18 @@ static void CG_Viewpos_f (void) {
|
||||||
(int)cg.refdefViewAngles[YAW]);
|
(int)cg.refdefViewAngles[YAW]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============
|
||||||
|
CG_PlayerOrigin_f
|
||||||
|
|
||||||
|
Debugging command to print player's origin
|
||||||
|
=============
|
||||||
|
*/
|
||||||
|
static void CG_PlayerOrigin_f (void) {
|
||||||
|
CG_Printf("(%i %i %i)\n", (int)cg.snap->ps.origin[0],
|
||||||
|
(int)cg.snap->ps.origin[1], (int)cg.snap->ps.origin[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void CG_ScoresDown_f( void ) {
|
static void CG_ScoresDown_f( void ) {
|
||||||
|
|
||||||
|
@ -555,6 +585,64 @@ static void CG_StartOrbit_f( void ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
==================
|
||||||
|
CG_Say_f
|
||||||
|
|
||||||
|
Elder: Pre-validate say command to avoid text flooding
|
||||||
|
==================
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void CG_Say_f ( void ) {
|
||||||
|
|
||||||
|
if (cg.time - cg.sayTime > 2000)
|
||||||
|
cg.sayCount = 0;
|
||||||
|
|
||||||
|
if (cg.sayCount == 0)
|
||||||
|
cg.sayTime = cg.time;
|
||||||
|
|
||||||
|
cg.sayCount++;
|
||||||
|
|
||||||
|
CG_Printf("sayCount: %i sayTime: %i\n", cg.sayCount, cg.sayTime);
|
||||||
|
|
||||||
|
if (cg.sayCount > 4 && cg.time - cg.sayTime < 2000)
|
||||||
|
{
|
||||||
|
CG_Printf("Cannot send messages.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
trap_SendClientCommand("say");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
==================
|
||||||
|
CG_SayTeam_f
|
||||||
|
|
||||||
|
Elder: Pre-validate say_team command to avoid text flooding
|
||||||
|
==================
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void CG_SayTeam_f ( void ) {
|
||||||
|
|
||||||
|
if (cg.time - cg.sayTime > 2000)
|
||||||
|
cg.sayCount = 0;
|
||||||
|
|
||||||
|
if (cg.sayCount == 0)
|
||||||
|
cg.sayTime = cg.time;
|
||||||
|
|
||||||
|
cg.sayCount++;
|
||||||
|
|
||||||
|
CG_Printf("sayCount: %i sayTime: %i\n", cg.sayCount, cg.sayTime);
|
||||||
|
|
||||||
|
if (cg.sayCount > 4 && cg.time - cg.sayTime < 2000)
|
||||||
|
{
|
||||||
|
CG_Printf("Cannot send messages.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
trap_SendClientCommand("say_team");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -570,6 +658,7 @@ static consoleCommand_t commands[] = {
|
||||||
{ "nextskin", CG_TestModelNextSkin_f },
|
{ "nextskin", CG_TestModelNextSkin_f },
|
||||||
{ "prevskin", CG_TestModelPrevSkin_f },
|
{ "prevskin", CG_TestModelPrevSkin_f },
|
||||||
{ "viewpos", CG_Viewpos_f },
|
{ "viewpos", CG_Viewpos_f },
|
||||||
|
{ "playerorigin", CG_PlayerOrigin_f },
|
||||||
{ "+scores", CG_ScoresDown_f },
|
{ "+scores", CG_ScoresDown_f },
|
||||||
{ "-scores", CG_ScoresUp_f },
|
{ "-scores", CG_ScoresUp_f },
|
||||||
/* { "+zoom", CG_ZoomDown_f }, // hawkins not needed in Reaction
|
/* { "+zoom", CG_ZoomDown_f }, // hawkins not needed in Reaction
|
||||||
|
@ -584,6 +673,11 @@ static consoleCommand_t commands[] = {
|
||||||
{ "+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
|
{ "-reload", CG_ReloadReset_f}, // Elder: added to stop auto-throttle
|
||||||
{ "specialweapon", CG_SpecialWeapon_f }, // Elder: select special weapon
|
{ "specialweapon", CG_SpecialWeapon_f }, // Elder: select special weapon
|
||||||
|
//Elder: added for manual sv_floodProtect check
|
||||||
|
{ "messagemode", CG_Say_f },
|
||||||
|
{ "messagemode2", CG_SayTeam_f },
|
||||||
|
{ "say", CG_Say_f },
|
||||||
|
{ "say_team", CG_SayTeam_f },
|
||||||
{ "tell_target", CG_TellTarget_f },
|
{ "tell_target", CG_TellTarget_f },
|
||||||
{ "tell_attacker", CG_TellAttacker_f },
|
{ "tell_attacker", CG_TellAttacker_f },
|
||||||
{ "vtell_target", CG_VoiceTellTarget_f },
|
{ "vtell_target", CG_VoiceTellTarget_f },
|
||||||
|
@ -699,4 +793,7 @@ void CG_InitConsoleCommands( void ) {
|
||||||
//Elder: try this
|
//Elder: try this
|
||||||
trap_AddCommand ("weapon");
|
trap_AddCommand ("weapon");
|
||||||
trap_AddCommand ("specialweapon");
|
trap_AddCommand ("specialweapon");
|
||||||
|
trap_AddCommand ("messagemode");
|
||||||
|
trap_AddCommand ("messagemode2");
|
||||||
|
trap_AddCommand ("playerorigin");
|
||||||
}
|
}
|
||||||
|
|
|
@ -501,7 +501,7 @@ static void CG_DrawStatusBar( void ) {
|
||||||
int style;
|
int style;
|
||||||
centity_t *cent;
|
centity_t *cent;
|
||||||
playerState_t *ps;
|
playerState_t *ps;
|
||||||
int value, value2;
|
int value;//, value2;
|
||||||
vec4_t hcolor;
|
vec4_t hcolor;
|
||||||
vec3_t angles;
|
vec3_t angles;
|
||||||
vec3_t origin;
|
vec3_t origin;
|
||||||
|
@ -510,6 +510,7 @@ static void CG_DrawStatusBar( void ) {
|
||||||
//#ifdef MISSIONPACK
|
//#ifdef MISSIONPACK
|
||||||
// qhandle_t handle;
|
// qhandle_t handle;
|
||||||
//#endif
|
//#endif
|
||||||
|
int i;
|
||||||
|
|
||||||
static float colors [4][4] = {
|
static float colors [4][4] = {
|
||||||
{ 0.0f, 1.0f, 0.0f, 1.0f } , //full green
|
{ 0.0f, 1.0f, 0.0f, 1.0f } , //full green
|
||||||
|
@ -543,7 +544,7 @@ static void CG_DrawStatusBar( void ) {
|
||||||
hcolor[2] = 0;
|
hcolor[2] = 0;
|
||||||
hcolor[3] = (value <= 25) * (0.01 * value + 0.75) + (value > 25) * 1;
|
hcolor[3] = (value <= 25) * (0.01 * value + 0.75) + (value > 25) * 1;
|
||||||
|
|
||||||
/* Elder: Old clamp routine for reference
|
/* Elder: Old clamp routine for reference -- more efficient since less stack usage?
|
||||||
for (i = 0; i < 4; i++) {
|
for (i = 0; i < 4; i++) {
|
||||||
if (hcolor[i] > 1.0) {
|
if (hcolor[i] > 1.0) {
|
||||||
CG_Printf ("Over one on %i\n",i);
|
CG_Printf ("Over one on %i\n",i);
|
||||||
|
@ -555,23 +556,72 @@ static void CG_DrawStatusBar( void ) {
|
||||||
}
|
}
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
CG_DrawPic(8, 440, 32, 32, hicon);
|
CG_DrawPic(8, 440, SMICON_SIZE, SMICON_SIZE, hicon);
|
||||||
UI_DrawProportionalString(44, 444, va("%d", value), style, hcolor);
|
UI_DrawProportionalString(44, 444, va("%d", value), style, hcolor);
|
||||||
|
|
||||||
|
|
||||||
//Elder: Draw weapon ammo and clips
|
//Elder: Draw weapon ammo and clips
|
||||||
style = UI_LEFT|UI_DROPSHADOW;
|
style = UI_LEFT|UI_DROPSHADOW;
|
||||||
icon = cg_weapons[ cg.predictedPlayerState.weapon ].ammoIcon;
|
|
||||||
if (icon)
|
|
||||||
CG_DrawPic(152, 440, 32, 32, icon);
|
|
||||||
|
|
||||||
if ( cent->currentState.weapon ) {
|
icon = cg_weapons[ cg.predictedPlayerState.weapon ].weaponIcon;
|
||||||
|
if (icon)
|
||||||
|
CG_DrawPic(152, 440, SMICON_SIZE, SMICON_SIZE, icon);
|
||||||
|
|
||||||
|
icon = cg_weapons[ cg.predictedPlayerState.weapon ].ammoIcon;
|
||||||
|
//Don't draw ammo icon if holding grenade or knife
|
||||||
|
if (icon &&
|
||||||
|
cg.predictedPlayerState.weapon != WP_KNIFE &&
|
||||||
|
cg.predictedPlayerState.weapon != WP_GRENADE)
|
||||||
|
CG_DrawPic(252, 440, SMICON_SIZE, SMICON_SIZE, icon);
|
||||||
|
|
||||||
|
if ( cent->currentState.weapon )
|
||||||
|
{
|
||||||
value = ps->ammo[cent->currentState.weapon];
|
value = ps->ammo[cent->currentState.weapon];
|
||||||
value2 = ps->stats[STAT_CLIPS];
|
|
||||||
if ( value > -1 ) {
|
if ( value > -1 )
|
||||||
UI_DrawProportionalString(188, 444, va("%d / %d", value, value2), style, colors[0]);
|
UI_DrawProportionalString(188, 444, va("%d", value), style, colors[0]);
|
||||||
|
|
||||||
|
//UI_DrawProportionalString(188, 444, "/"), style, colors[0]);
|
||||||
|
|
||||||
|
value = ps->stats[STAT_CLIPS];
|
||||||
|
if ( value > -1 &&
|
||||||
|
cg.predictedPlayerState.weapon != WP_KNIFE &&
|
||||||
|
cg.predictedPlayerState.weapon != WP_GRENADE)
|
||||||
|
UI_DrawProportionalString(288, 444, va("%d", value), style, colors[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Elder: draw grenades, if any, on the side
|
||||||
|
if (cg.snap->ps.ammo[ WP_GRENADE ] > 0)
|
||||||
|
{
|
||||||
|
icon = cg_weapons[ WP_GRENADE ].weaponIcon;
|
||||||
|
if (icon)
|
||||||
|
CG_DrawPic(640-SMICON_SIZE, 360, SMICON_SIZE, SMICON_SIZE, icon);
|
||||||
|
UI_DrawProportionalString(580, 364, va("%d", cg.snap->ps.ammo[WP_GRENADE]), style, colors[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Elder: draw special weapons, if any, on the side
|
||||||
|
if (cg.snap->ps.stats[STAT_UNIQUEWEAPONS])
|
||||||
|
{
|
||||||
|
for (i = 1; i < MAX_WEAPONS; i++)
|
||||||
|
{
|
||||||
|
if (i == WP_KNIFE ||
|
||||||
|
i == WP_PISTOL ||
|
||||||
|
i == WP_GRENADE ||
|
||||||
|
i == WP_AKIMBO)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if ( (1 << i) == ((1 << i) & cg.snap->ps.stats[STAT_WEAPONS]))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i < MAX_WEAPONS)
|
||||||
|
{
|
||||||
|
icon = cg_weapons[i].weaponIcon;
|
||||||
|
if (icon)
|
||||||
|
CG_DrawPic(640-SMICON_SIZE, 400, SMICON_SIZE, SMICON_SIZE, icon);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Elder: old stuff
|
/* Elder: old stuff
|
||||||
|
@ -1392,7 +1442,8 @@ CG_DrawLowerRight
|
||||||
static void CG_DrawLowerRight( void ) {
|
static void CG_DrawLowerRight( void ) {
|
||||||
float y;
|
float y;
|
||||||
|
|
||||||
y = 480 - ICON_SIZE;
|
//y = 480 - ICON_SIZE;
|
||||||
|
y = 320 + SMICON_SIZE;
|
||||||
|
|
||||||
if ( cgs.gametype >= GT_TEAM && cg_drawTeamOverlay.integer == 2 ) {
|
if ( cgs.gametype >= GT_TEAM && cg_drawTeamOverlay.integer == 2 ) {
|
||||||
y = CG_DrawTeamOverlay( y, qtrue, qfalse );
|
y = CG_DrawTeamOverlay( y, qtrue, qfalse );
|
||||||
|
@ -1544,7 +1595,8 @@ static void CG_DrawHoldableItem( void ) {
|
||||||
value = cg.snap->ps.stats[STAT_HOLDABLE_ITEM];
|
value = cg.snap->ps.stats[STAT_HOLDABLE_ITEM];
|
||||||
if ( value ) {
|
if ( value ) {
|
||||||
CG_RegisterItemVisuals( value );
|
CG_RegisterItemVisuals( value );
|
||||||
CG_DrawPic( 640-ICON_SIZE, (SCREEN_HEIGHT-ICON_SIZE)/2, ICON_SIZE, ICON_SIZE, cg_items[ value ].icon );
|
//CG_DrawPic( 640-ICON_SIZE, (SCREEN_HEIGHT-ICON_SIZE)/2, ICON_SIZE, ICON_SIZE, cg_items[ value ].icon );
|
||||||
|
CG_DrawPic( 640-SMICON_SIZE, 440, SMICON_SIZE, SMICON_SIZE, cg_items[ value ].icon );
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -693,16 +693,15 @@ void CG_BigExplode( vec3_t playerOrigin ) {
|
||||||
CG_LaunchExplode( origin, velocity, cgs.media.smoke2 );
|
CG_LaunchExplode( origin, velocity, cgs.media.smoke2 );
|
||||||
}
|
}
|
||||||
|
|
||||||
#define GLASS_VELOCITY 175
|
#define GLASS_VELOCITY 175
|
||||||
#define GLASS_JUMP 125
|
#define GLASS_JUMP 125
|
||||||
|
/*
|
||||||
/*
|
==================
|
||||||
==================
|
CG_LaunchGlass
|
||||||
CG_LaunchGlass
|
==================
|
||||||
==================
|
*/
|
||||||
*/
|
void CG_LaunchGlass( vec3_t origin, vec3_t velocity, vec3_t rotation,
|
||||||
//Elder: might want to rotate the model randomly or do it in break glass
|
float bounce, qhandle_t hModel ) {
|
||||||
void CG_LaunchGlass( vec3_t origin, vec3_t velocity, vec3_t rotation, qhandle_t hModel ) {
|
|
||||||
localEntity_t *le;
|
localEntity_t *le;
|
||||||
refEntity_t *re;
|
refEntity_t *re;
|
||||||
|
|
||||||
|
@ -711,8 +710,7 @@ void CG_BigExplode( vec3_t playerOrigin ) {
|
||||||
|
|
||||||
le->leType = LE_FRAGMENT;
|
le->leType = LE_FRAGMENT;
|
||||||
le->startTime = cg.time;
|
le->startTime = cg.time;
|
||||||
le->endTime = le->startTime + (random() * 3000)+ cg_RQ3_glasstime.integer;// + 30000;
|
le->endTime = le->startTime + (random() * 3000)+ cg_RQ3_glasstime.integer; // + 30000;
|
||||||
|
|
||||||
|
|
||||||
VectorCopy( origin, re->origin );
|
VectorCopy( origin, re->origin );
|
||||||
AxisCopy( axisDefault, re->axis );
|
AxisCopy( axisDefault, re->axis );
|
||||||
|
@ -730,101 +728,147 @@ void CG_BigExplode( vec3_t playerOrigin ) {
|
||||||
VectorCopy( rotation, le->angles.trDelta );
|
VectorCopy( rotation, le->angles.trDelta );
|
||||||
le->angles.trTime = cg.time;
|
le->angles.trTime = cg.time;
|
||||||
|
|
||||||
le->bounceFactor = 0.3f;
|
le->bounceFactor = bounce;
|
||||||
|
|
||||||
le->leFlags = LEF_TUMBLE;
|
le->leFlags = LEF_TUMBLE;
|
||||||
le->leBounceSoundType = LEBS_BRASS;
|
le->leBounceSoundType = LEBS_BRASS;
|
||||||
le->leMarkType = LEMT_NONE;
|
le->leMarkType = LEMT_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
===================
|
===================
|
||||||
CG_BreakGlass
|
CG_BreakGlass
|
||||||
|
|
||||||
Generated a bunch of glass shards launching out from the glass location
|
Generated a bunch of glass shards launching out from the glass location
|
||||||
===================
|
Elder: don't be mislead by the name - this breaks more than glass
|
||||||
*/
|
===================
|
||||||
|
*/
|
||||||
|
|
||||||
void CG_BreakGlass( vec3_t playerOrigin, int glassParm ) {
|
void CG_BreakGlass( vec3_t playerOrigin, int glassParm, int type ) {
|
||||||
vec3_t origin, velocity, rotation;
|
vec3_t origin, velocity, rotation;
|
||||||
int value;
|
int value;
|
||||||
int count = 40; // How many shards to generate
|
int count;
|
||||||
int states[] = {1,2,3}; // The array of possible numbers
|
int states[] = {1,2,3}; // Select model variations
|
||||||
// Get the size of the array
|
// Get the size of the array
|
||||||
int numstates = sizeof(states)/sizeof(states[0]);
|
int numstates = sizeof(states)/sizeof(states[0]);
|
||||||
// Elder: The handles to our debris models
|
// Elder: debris model handles
|
||||||
qhandle_t debris1, debris2, debris3;
|
qhandle_t debris1;
|
||||||
|
qhandle_t debris2;
|
||||||
|
qhandle_t debris3;
|
||||||
|
int bounceFactor;
|
||||||
|
int newParm;
|
||||||
|
|
||||||
//Elder: check bit amount
|
if ( (glassParm & RQ3_DEBRIS_MEDIUM) == RQ3_DEBRIS_MEDIUM &&
|
||||||
if ( (glassParm & RQ3_DEBRIS_SMALL) == RQ3_DEBRIS_SMALL) {
|
(glassParm & RQ3_DEBRIS_HIGH) == RQ3_DEBRIS_HIGH)
|
||||||
count = 8 + rand() % 5;
|
{
|
||||||
}
|
//Tons
|
||||||
//else if ( (glassParm & RQ3_DEBRIS_MEDIUM) == RQ3_DEBRIS_MEDIUM) {
|
|
||||||
else if ( (glassParm & RQ3_DEBRIS_LARGE) == RQ3_DEBRIS_LARGE) {
|
|
||||||
count = 40 + rand() % 15;
|
|
||||||
}
|
|
||||||
else if ( (glassParm & RQ3_DEBRIS_TONS) == RQ3_DEBRIS_TONS) {
|
|
||||||
count = 65 + rand() % 25;
|
count = 65 + rand() % 25;
|
||||||
}
|
}
|
||||||
else {
|
else if ( (glassParm & RQ3_DEBRIS_HIGH) == RQ3_DEBRIS_HIGH)
|
||||||
//medium is default
|
{
|
||||||
count = 22 + rand() % 7;
|
//Large
|
||||||
|
count = 40 + rand() % 15;
|
||||||
|
}
|
||||||
|
else if ( (glassParm & RQ3_DEBRIS_MEDIUM) == RQ3_DEBRIS_MEDIUM)
|
||||||
|
{
|
||||||
|
//Medium
|
||||||
|
count = 22 + rand() % 7;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//Small
|
||||||
|
count = 8 + rand() % 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
CG_Printf("glassParm: %d\n", glassParm);
|
/*
|
||||||
|
===============================
|
||||||
|
TODO: Utilize variation bits!
|
||||||
|
==============================
|
||||||
|
*/
|
||||||
|
|
||||||
|
//Strip off amount info and revert eParm back to server-side size
|
||||||
|
newParm = glassParm & 15;
|
||||||
|
glassParm &= ~newParm;
|
||||||
|
glassParm = glassParm << (type * 4);
|
||||||
|
|
||||||
|
CG_Printf("glassParm: %i\n", glassParm);
|
||||||
|
|
||||||
//Elder: check debris type and assign debris models
|
//Elder: check debris type and assign debris models
|
||||||
//Using bit-op check b/c I will be stuffing the amount in there too
|
if ( (glassParm & RQ3_DEBRIS_WOOD) == RQ3_DEBRIS_WOOD)
|
||||||
if ( (glassParm & RQ3_DEBRIS_WOOD) == RQ3_DEBRIS_WOOD) {
|
{
|
||||||
CG_Printf("Launching wood\n");
|
CG_Printf("Launching wood\n");
|
||||||
debris1 = cgs.media.wood01;
|
debris1 = cgs.media.wood01;
|
||||||
debris2 = cgs.media.wood02;
|
debris2 = cgs.media.wood02;
|
||||||
debris3 = cgs.media.wood03;
|
debris3 = cgs.media.wood03;
|
||||||
|
bounceFactor = 0.8f;
|
||||||
}
|
}
|
||||||
else if ( (glassParm & RQ3_DEBRIS_METAL) == RQ3_DEBRIS_METAL) {
|
else if ( (glassParm & RQ3_DEBRIS_METAL) == RQ3_DEBRIS_METAL)
|
||||||
|
{
|
||||||
CG_Printf("Launching metal\n");
|
CG_Printf("Launching metal\n");
|
||||||
debris1 = cgs.media.metal01;
|
debris1 = cgs.media.metal01;
|
||||||
debris2 = cgs.media.metal02;
|
debris2 = cgs.media.metal02;
|
||||||
debris3 = cgs.media.metal03;
|
debris3 = cgs.media.metal03;
|
||||||
|
bounceFactor = 0.7f;
|
||||||
}
|
}
|
||||||
else if ( (glassParm & RQ3_DEBRIS_CERAMIC) == RQ3_DEBRIS_CERAMIC) {
|
else if ( (glassParm & RQ3_DEBRIS_CERAMIC) == RQ3_DEBRIS_CERAMIC)
|
||||||
|
{
|
||||||
CG_Printf("Launching ceramic\n");
|
CG_Printf("Launching ceramic\n");
|
||||||
debris1 = cgs.media.ceramic01;
|
debris1 = cgs.media.ceramic01;
|
||||||
debris2 = cgs.media.ceramic02;
|
debris2 = cgs.media.ceramic02;
|
||||||
debris3 = cgs.media.ceramic03;
|
debris3 = cgs.media.ceramic03;
|
||||||
|
bounceFactor = 0.7f;
|
||||||
}
|
}
|
||||||
else if ( (glassParm & RQ3_DEBRIS_PAPER) == RQ3_DEBRIS_PAPER) {
|
else if ( (glassParm & RQ3_DEBRIS_PAPER) == RQ3_DEBRIS_PAPER)
|
||||||
|
{
|
||||||
CG_Printf("Launching paper\n");
|
CG_Printf("Launching paper\n");
|
||||||
debris1 = cgs.media.paper01;
|
debris1 = cgs.media.paper01;
|
||||||
debris2 = cgs.media.paper02;
|
debris2 = cgs.media.paper02;
|
||||||
debris3 = cgs.media.paper03;
|
debris3 = cgs.media.paper03;
|
||||||
|
bounceFactor = 0.2f;
|
||||||
}
|
}
|
||||||
else if ( (glassParm & RQ3_DEBRIS_BRICK) == RQ3_DEBRIS_BRICK) {
|
else if ( (glassParm & RQ3_DEBRIS_BRICK) == RQ3_DEBRIS_BRICK)
|
||||||
|
{
|
||||||
CG_Printf("Launching brick\n");
|
CG_Printf("Launching brick\n");
|
||||||
debris1 = cgs.media.brick01;
|
debris1 = cgs.media.brick01;
|
||||||
debris2 = cgs.media.brick02;
|
debris2 = cgs.media.brick02;
|
||||||
debris3 = cgs.media.brick03;
|
debris3 = cgs.media.brick03;
|
||||||
|
bounceFactor = 0.4f;
|
||||||
}
|
}
|
||||||
else if ( (glassParm & RQ3_DEBRIS_CONCRETE) == RQ3_DEBRIS_CONCRETE) {
|
else if ( (glassParm & RQ3_DEBRIS_CONCRETE) == RQ3_DEBRIS_CONCRETE)
|
||||||
|
{
|
||||||
CG_Printf("Launching concrete\n");
|
CG_Printf("Launching concrete\n");
|
||||||
debris1 = cgs.media.concrete01;
|
debris1 = cgs.media.concrete01;
|
||||||
debris2 = cgs.media.concrete02;
|
debris2 = cgs.media.concrete02;
|
||||||
debris3 = cgs.media.concrete03;
|
debris3 = cgs.media.concrete03;
|
||||||
|
bounceFactor = 0.5f;
|
||||||
}
|
}
|
||||||
else {
|
/*
|
||||||
|
else if ( (glassParm & RQ3_DEBRIS_POPCAN) == RQ3_DEBRIS_POPCAN)
|
||||||
|
{
|
||||||
|
CG_Printf("Launching pop cans\n");
|
||||||
|
debris1 = cgs.media.popcan01;
|
||||||
|
debris2 = cgs.media.popcan02;
|
||||||
|
debris3 = cgs.media.popcan03;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
else
|
||||||
|
{
|
||||||
//glass is default
|
//glass is default
|
||||||
CG_Printf("Launching glass\n");
|
CG_Printf("Launching glass\n");
|
||||||
debris1 = cgs.media.glass01;
|
debris1 = cgs.media.glass01;
|
||||||
debris2 = cgs.media.glass02;
|
debris2 = cgs.media.glass02;
|
||||||
debris3 = cgs.media.glass03;
|
debris3 = cgs.media.glass03;
|
||||||
|
bounceFactor = 0.7f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//launch loop
|
||||||
while ( count-- ) {
|
while ( count-- ) {
|
||||||
// Generate the random number every count so every shard is a
|
// Generate the random number every count so every shard is a
|
||||||
// of the three. If this is placed above it only gets a random
|
// of the three. If this is placed above it only gets a random
|
||||||
// number every time a piece of glass is broken.
|
// number every time a piece of glass is broken.
|
||||||
value = states[rand()%numstates];
|
value = states[rand()%numstates];
|
||||||
VectorCopy( playerOrigin, origin );
|
|
||||||
|
VectorCopy( playerOrigin, origin );
|
||||||
velocity[0] = crandom() * GLASS_VELOCITY;
|
velocity[0] = crandom() * GLASS_VELOCITY;
|
||||||
velocity[1] = crandom() * GLASS_VELOCITY;
|
velocity[1] = crandom() * GLASS_VELOCITY;
|
||||||
velocity[2] = GLASS_JUMP + crandom() * GLASS_VELOCITY;
|
velocity[2] = GLASS_JUMP + crandom() * GLASS_VELOCITY;
|
||||||
|
@ -832,16 +876,17 @@ void CG_BreakGlass( vec3_t playerOrigin, int glassParm ) {
|
||||||
rotation[0] = crandom() * GLASS_VELOCITY;
|
rotation[0] = crandom() * GLASS_VELOCITY;
|
||||||
rotation[1] = crandom() * GLASS_VELOCITY;
|
rotation[1] = crandom() * GLASS_VELOCITY;
|
||||||
rotation[2] = crandom() * GLASS_VELOCITY;
|
rotation[2] = crandom() * GLASS_VELOCITY;
|
||||||
switch (value) {
|
|
||||||
|
switch (value)
|
||||||
|
{
|
||||||
case 1:
|
case 1:
|
||||||
// If our random number was 1, generate the 1st shard piece
|
CG_LaunchGlass( origin, velocity, rotation, bounceFactor, debris1 );
|
||||||
CG_LaunchGlass( origin, velocity, rotation, debris1 );
|
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
CG_LaunchGlass( origin, velocity, rotation, debris2 );
|
CG_LaunchGlass( origin, velocity, rotation, bounceFactor, debris2 );
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
CG_LaunchGlass( origin, velocity, rotation, debris3 );
|
CG_LaunchGlass( origin, velocity, rotation, bounceFactor, debris3 );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2120,14 +2120,24 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) {
|
||||||
}
|
}
|
||||||
CG_GibPlayer( cent->lerpOrigin );
|
CG_GibPlayer( cent->lerpOrigin );
|
||||||
break;
|
break;
|
||||||
case EV_BREAK_GLASS:
|
case EV_BREAK_GLASS1:
|
||||||
DEBUGNAME("EV_BREAK_GLASS");
|
DEBUGNAME("EV_BREAK_GLASS1");
|
||||||
// Change cgs.media.gibSound to whatever sound you want it to use
|
// Change cgs.media.gibSound to whatever sound you want it to use
|
||||||
// I think the gib sound sounds pretty good
|
// I think the gib sound sounds pretty good
|
||||||
//Elder: gonna move this into the function
|
//Elder: gonna move this into the function
|
||||||
trap_S_StartSound( NULL, es->number, CHAN_BODY, cgs.media.glassSound );
|
trap_S_StartSound( NULL, es->number, CHAN_BODY, cgs.media.glassSound );
|
||||||
//Elder: modified
|
//Elder: modified
|
||||||
CG_BreakGlass( cent->lerpOrigin, es->eventParm );
|
CG_BreakGlass( cent->lerpOrigin, es->eventParm, 0 );
|
||||||
|
break;
|
||||||
|
case EV_BREAK_GLASS2:
|
||||||
|
DEBUGNAME("EV_BREAK_GLASS2");
|
||||||
|
trap_S_StartSound( NULL, es->number, CHAN_BODY, cgs.media.glassSound );
|
||||||
|
CG_BreakGlass( cent->lerpOrigin, es->eventParm, 1 );
|
||||||
|
break;
|
||||||
|
case EV_BREAK_GLASS3:
|
||||||
|
DEBUGNAME("EV_BREAK_GLASS3");
|
||||||
|
trap_S_StartSound( NULL, es->number, CHAN_BODY, cgs.media.glassSound );
|
||||||
|
CG_BreakGlass( cent->lerpOrigin, es->eventParm, 2 );
|
||||||
break;
|
break;
|
||||||
case EV_STOPLOOPINGSOUND:
|
case EV_STOPLOOPINGSOUND:
|
||||||
DEBUGNAME("EV_STOPLOOPINGSOUND");
|
DEBUGNAME("EV_STOPLOOPINGSOUND");
|
||||||
|
|
|
@ -47,6 +47,8 @@
|
||||||
#define STAT_MINUS 10 // num frame for '-' stats digit
|
#define STAT_MINUS 10 // num frame for '-' stats digit
|
||||||
|
|
||||||
#define ICON_SIZE 48
|
#define ICON_SIZE 48
|
||||||
|
//Elder: small icon size added
|
||||||
|
#define SMICON_SIZE 32
|
||||||
#define CHAR_WIDTH 32
|
#define CHAR_WIDTH 32
|
||||||
#define CHAR_HEIGHT 48
|
#define CHAR_HEIGHT 48
|
||||||
#define TEXT_ICON_SPACE 4
|
#define TEXT_ICON_SPACE 4
|
||||||
|
@ -629,6 +631,11 @@ typedef struct {
|
||||||
char testModelName[MAX_QPATH];
|
char testModelName[MAX_QPATH];
|
||||||
qboolean testGun;
|
qboolean testGun;
|
||||||
|
|
||||||
|
// Elder: for message flooding protection
|
||||||
|
int sayTime;
|
||||||
|
int sayCount;
|
||||||
|
|
||||||
|
|
||||||
} cg_t;
|
} cg_t;
|
||||||
|
|
||||||
|
|
||||||
|
@ -1194,6 +1201,8 @@ extern vmCvar_t cg_RQ3_ssgColorR;
|
||||||
extern vmCvar_t cg_RQ3_ssgColorG;
|
extern vmCvar_t cg_RQ3_ssgColorG;
|
||||||
extern vmCvar_t cg_RQ3_ssgColorB;
|
extern vmCvar_t cg_RQ3_ssgColorB;
|
||||||
extern vmCvar_t cg_RQ3_ssgColorA;
|
extern vmCvar_t cg_RQ3_ssgColorA;
|
||||||
|
//Elder: smoke puffs, sparks, etc.
|
||||||
|
extern vmCvar_t cg_RQ3_impactEffects;
|
||||||
|
|
||||||
extern vmCvar_t cg_drawFriend;
|
extern vmCvar_t cg_drawFriend;
|
||||||
extern vmCvar_t cg_teamChatsOnly;
|
extern vmCvar_t cg_teamChatsOnly;
|
||||||
|
@ -1463,7 +1472,8 @@ void CG_ScorePlum( int client, vec3_t org, int score );
|
||||||
|
|
||||||
void CG_GibPlayer( vec3_t playerOrigin );
|
void CG_GibPlayer( vec3_t playerOrigin );
|
||||||
void CG_BigExplode( vec3_t playerOrigin );
|
void CG_BigExplode( vec3_t playerOrigin );
|
||||||
void CG_BreakGlass( vec3_t playerOrigin, int glassParm );// Blaze: Breakable glass Elder: modified
|
// Blaze: Breakable glass Elder: modified
|
||||||
|
void CG_BreakGlass( vec3_t playerOrigin, int glassParm, int type );
|
||||||
void CG_Bleed( vec3_t origin, int entityNum );
|
void CG_Bleed( vec3_t origin, int entityNum );
|
||||||
|
|
||||||
localEntity_t *CG_MakeExplosion( vec3_t origin, vec3_t dir,
|
localEntity_t *CG_MakeExplosion( vec3_t origin, vec3_t dir,
|
||||||
|
|
|
@ -151,6 +151,8 @@ vmCvar_t cg_RQ3_ssgColorR;
|
||||||
vmCvar_t cg_RQ3_ssgColorG;
|
vmCvar_t cg_RQ3_ssgColorG;
|
||||||
vmCvar_t cg_RQ3_ssgColorB;
|
vmCvar_t cg_RQ3_ssgColorB;
|
||||||
vmCvar_t cg_RQ3_ssgColorA;
|
vmCvar_t cg_RQ3_ssgColorA;
|
||||||
|
//Elder: smoke puffs, sparks, etc.
|
||||||
|
vmCvar_t cg_RQ3_impactEffects;
|
||||||
vmCvar_t cg_drawFriend;
|
vmCvar_t cg_drawFriend;
|
||||||
vmCvar_t cg_teamChatsOnly;
|
vmCvar_t cg_teamChatsOnly;
|
||||||
vmCvar_t cg_noVoiceChats;
|
vmCvar_t cg_noVoiceChats;
|
||||||
|
@ -310,7 +312,8 @@ cvarTable_t cvarTable[] = {
|
||||||
{ &cg_RQ3_ssgColorR, "cg_RQ3_ssgColorR", "0.0", CVAR_ARCHIVE },
|
{ &cg_RQ3_ssgColorR, "cg_RQ3_ssgColorR", "0.0", CVAR_ARCHIVE },
|
||||||
{ &cg_RQ3_ssgColorG, "cg_RQ3_ssgColorG", "1.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_ssgColorB, "cg_RQ3_ssgColorB", "0.0", CVAR_ARCHIVE },
|
||||||
{ &cg_RQ3_ssgColorA, "cg_RQ3_ssgColorA", "0.75", CVAR_ARCHIVE }
|
{ &cg_RQ3_ssgColorA, "cg_RQ3_ssgColorA", "0.75", CVAR_ARCHIVE },
|
||||||
|
{ &cg_RQ3_impactEffects, "cg_RQ3_impactEffects", "1", CVAR_ARCHIVE }
|
||||||
// { &cg_pmove_fixed, "cg_pmove_fixed", "0", CVAR_USERINFO | CVAR_ARCHIVE }
|
// { &cg_pmove_fixed, "cg_pmove_fixed", "0", CVAR_USERINFO | CVAR_ARCHIVE }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -963,6 +966,7 @@ static void CG_RegisterGraphics( void ) {
|
||||||
cgs.media.glass03 = trap_R_RegisterModel( "models/breakables/glass03.md3" );
|
cgs.media.glass03 = trap_R_RegisterModel( "models/breakables/glass03.md3" );
|
||||||
|
|
||||||
//Elder: additional debris
|
//Elder: additional debris
|
||||||
|
//Todo: load only if in the level
|
||||||
cgs.media.wood01 = trap_R_RegisterModel( "models/breakables/wood01.md3" );
|
cgs.media.wood01 = trap_R_RegisterModel( "models/breakables/wood01.md3" );
|
||||||
cgs.media.wood02 = trap_R_RegisterModel( "models/breakables/wood02.md3" );
|
cgs.media.wood02 = trap_R_RegisterModel( "models/breakables/wood02.md3" );
|
||||||
cgs.media.wood03 = trap_R_RegisterModel( "models/breakables/wood03.md3" );
|
cgs.media.wood03 = trap_R_RegisterModel( "models/breakables/wood03.md3" );
|
||||||
|
|
|
@ -561,6 +561,29 @@ void CG_PredictPlayerState( void ) {
|
||||||
cg_pmove.cmd.serverTime = ((cg_pmove.cmd.serverTime + pmove_msec.integer-1) / pmove_msec.integer) * pmove_msec.integer;
|
cg_pmove.cmd.serverTime = ((cg_pmove.cmd.serverTime + pmove_msec.integer-1) / pmove_msec.integer) * pmove_msec.integer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Elder: predict bursting here
|
||||||
|
/*
|
||||||
|
if ( (cg.snap->ps.weapon == WP_M4 &&
|
||||||
|
(cg.snap->ps.persistant[PERS_WEAPONMODES] & RQ3_M4MODE) == RQ3_M4MODE) ||
|
||||||
|
(cg.snap->ps.weapon == WP_MP5 &&
|
||||||
|
(cg.snap->ps.persistant[PERS_WEAPONMODES] & RQ3_MP5MODE) == RQ3_MP5MODE))
|
||||||
|
{
|
||||||
|
if (cg_pmove.cmd.buttons & BUTTON_ATTACK)// && client->ps.stats[STAT_BURST] > 0)
|
||||||
|
{
|
||||||
|
if ( cg.snap->ps.stats[STAT_BURST] >= 0 && cg.snap->ps.stats[STAT_BURST] < 3)
|
||||||
|
cg_pmove.cmd.buttons |= BUTTON_ATTACK;
|
||||||
|
else
|
||||||
|
cg_pmove.cmd.buttons &= ~BUTTON_ATTACK;
|
||||||
|
}
|
||||||
|
else if (cg.snap->ps.stats[STAT_BURST] > 2)
|
||||||
|
{
|
||||||
|
cg.snap->ps.stats[STAT_BURST] = 0;
|
||||||
|
cg.snap->ps.weaponTime += 500;
|
||||||
|
}
|
||||||
|
else if (cg.snap->ps.stats[STAT_BURST] > 0)
|
||||||
|
cg_pmove.cmd.buttons |= BUTTON_ATTACK;
|
||||||
|
}*/
|
||||||
|
|
||||||
Pmove (&cg_pmove);
|
Pmove (&cg_pmove);
|
||||||
|
|
||||||
moved = qtrue;
|
moved = qtrue;
|
||||||
|
|
|
@ -471,6 +471,7 @@ void CG_RegisterWeapon( int weaponNum ) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !item->classname ) {
|
if ( !item->classname ) {
|
||||||
CG_Error( "Couldn't find weapon %i", weaponNum );
|
CG_Error( "Couldn't find weapon %i", weaponNum );
|
||||||
}
|
}
|
||||||
|
@ -492,9 +493,21 @@ void CG_RegisterWeapon( int weaponNum ) {
|
||||||
if ( ammo->giType == IT_AMMO && ammo->giTag == weaponNum ) {
|
if ( ammo->giType == IT_AMMO && ammo->giTag == weaponNum ) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
//Elder: hack for handcannon to use M3 ammo icon
|
||||||
|
else if (weaponNum == WP_HANDCANNON && ammo->giType == IT_AMMO && ammo->giTag == WP_M3)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
//Elder: hack for akimbos to use MK23 ammo icon
|
||||||
|
else if (weaponNum == WP_AKIMBO && ammo->giType == IT_AMMO && ammo->giTag == WP_PISTOL)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if ( ammo->classname && ammo->world_model[0] ) {
|
if ( ammo->classname && ammo->world_model[0] ) {
|
||||||
weaponInfo->ammoModel = trap_R_RegisterModel( ammo->world_model[0] );
|
weaponInfo->ammoModel = trap_R_RegisterModel( ammo->world_model[0] );
|
||||||
|
//Elder: added
|
||||||
|
weaponInfo->ammoIcon = trap_R_RegisterShader( ammo->icon );
|
||||||
}
|
}
|
||||||
|
|
||||||
strcpy( path, item->world_model[0] );
|
strcpy( path, item->world_model[0] );
|
||||||
|
@ -1236,20 +1249,6 @@ void CG_AddPlayerWeapon( refEntity_t *parent, playerState_t *ps, centity_t *cent
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//Elder: added to supress burst mode flashes + sounds when 'predicting'
|
|
||||||
// M4
|
|
||||||
if ( ps->weapon == WP_M4 && ps->stats[STAT_BURST] > 2 ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// MP5
|
|
||||||
if ( ps->weapon == WP_MP5 && ps->stats[STAT_BURST] > 2 ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// MK23
|
|
||||||
if ( ps->weapon == WP_PISTOL && ps->stats[STAT_BURST] > 0 ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Elder: re-added to fix loss of muzzle flashes!
|
//Elder: re-added to fix loss of muzzle flashes!
|
||||||
// impulse flash
|
// impulse flash
|
||||||
if ( cg.time - cent->muzzleFlashTime > MUZZLE_FLASH_TIME && !cent->pe.railgunFlash ) {
|
if ( cg.time - cent->muzzleFlashTime > MUZZLE_FLASH_TIME && !cent->pe.railgunFlash ) {
|
||||||
|
@ -1608,6 +1607,10 @@ void CG_NextWeapon_f( void ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Elder: don't allow weapon switching when in the middle of bursts
|
||||||
|
if (cg.snap->ps.stats[STAT_BURST] > 0)
|
||||||
|
return;
|
||||||
|
|
||||||
//Elder: in the middle of firing, reloading or weapon-switching
|
//Elder: in the middle of firing, reloading or weapon-switching
|
||||||
//cg.snap->ps.weaponstate == WEAPON_RELOADING when it's in
|
//cg.snap->ps.weaponstate == WEAPON_RELOADING when it's in
|
||||||
if (cg.snap->ps.weaponstate == WEAPON_DROPPING && cg.snap->ps.weaponTime > 0) {
|
if (cg.snap->ps.weaponstate == WEAPON_DROPPING && cg.snap->ps.weaponTime > 0) {
|
||||||
|
@ -1640,6 +1643,7 @@ void CG_NextWeapon_f( void ) {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
CG_RQ3_Zoom1x();
|
CG_RQ3_Zoom1x();
|
||||||
|
trap_SendClientCommand("unzoom");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1670,6 +1674,10 @@ void CG_PrevWeapon_f( void ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Elder: don't allow weapon switching when in the middle of bursts
|
||||||
|
if (cg.snap->ps.stats[STAT_BURST] > 0)
|
||||||
|
return;
|
||||||
|
|
||||||
//Elder: in the middle of firing, reloading or weapon-switching
|
//Elder: in the middle of firing, reloading or weapon-switching
|
||||||
//cg.snap->ps.weaponstate == WEAPON_RELOADING when it's in
|
//cg.snap->ps.weaponstate == WEAPON_RELOADING when it's in
|
||||||
if (cg.snap->ps.weaponstate == WEAPON_DROPPING && cg.snap->ps.weaponTime > 0) {
|
if (cg.snap->ps.weaponstate == WEAPON_DROPPING && cg.snap->ps.weaponTime > 0) {
|
||||||
|
@ -1701,6 +1709,7 @@ void CG_PrevWeapon_f( void ) {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
CG_RQ3_Zoom1x();
|
CG_RQ3_Zoom1x();
|
||||||
|
trap_SendClientCommand("unzoom");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1717,8 +1726,10 @@ void CG_SpecialWeapon_f( void ) {
|
||||||
int original;
|
int original;
|
||||||
|
|
||||||
if ( !cg.snap ) {
|
if ( !cg.snap ) {
|
||||||
|
//CG_Printf("No snapshot: normally exiting\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( cg.snap->ps.pm_flags & PMF_FOLLOW ) {
|
if ( cg.snap->ps.pm_flags & PMF_FOLLOW ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1734,6 +1745,10 @@ void CG_SpecialWeapon_f( void ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Elder: don't allow weapon switching when in the middle of bursts
|
||||||
|
if (cg.snap->ps.stats[STAT_BURST] > 0)
|
||||||
|
return;
|
||||||
|
|
||||||
//Elder: in the middle of firing, reloading or weapon-switching
|
//Elder: in the middle of firing, reloading or weapon-switching
|
||||||
//cg.snap->ps.weaponstate == WEAPON_RELOADING when it's in
|
//cg.snap->ps.weaponstate == WEAPON_RELOADING when it's in
|
||||||
if (cg.snap->ps.weaponstate == WEAPON_DROPPING && cg.snap->ps.weaponTime > 0) {
|
if (cg.snap->ps.weaponstate == WEAPON_DROPPING && cg.snap->ps.weaponTime > 0) {
|
||||||
|
@ -1767,6 +1782,7 @@ void CG_SpecialWeapon_f( void ) {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
CG_RQ3_Zoom1x();
|
CG_RQ3_Zoom1x();
|
||||||
|
trap_SendClientCommand("unzoom");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1790,7 +1806,6 @@ void CG_RQ3_SyncZoom ( void ) {
|
||||||
//CG_Printf("Zoomed out\n");
|
//CG_Printf("Zoomed out\n");
|
||||||
cg.zoomLevel = 0;
|
cg.zoomLevel = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Elder: save zoom level and do any other necessary housekeeping
|
//Elder: save zoom level and do any other necessary housekeeping
|
||||||
|
@ -1877,7 +1892,7 @@ void CG_RQ3_Zoom1x () {
|
||||||
cg.zoomLevel = 0;
|
cg.zoomLevel = 0;
|
||||||
cg.zoomTime = cg.time;
|
cg.zoomTime = cg.time;
|
||||||
}
|
}
|
||||||
trap_SendClientCommand("unzoom");
|
//trap_SendClientCommand("unzoom");
|
||||||
}
|
}
|
||||||
|
|
||||||
int CG_RQ3_GetGrenadeMode()
|
int CG_RQ3_GetGrenadeMode()
|
||||||
|
@ -1924,6 +1939,7 @@ void CG_Weapon_f( void ) {
|
||||||
int num;
|
int num;
|
||||||
|
|
||||||
if ( !cg.snap ) {
|
if ( !cg.snap ) {
|
||||||
|
//CG_Printf("No snapshot: normally exiting\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1938,6 +1954,10 @@ void CG_Weapon_f( void ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Elder: don't allow weapon switching when in the middle of bursts
|
||||||
|
if (cg.snap->ps.stats[STAT_BURST] > 0)
|
||||||
|
return;
|
||||||
|
|
||||||
//Elder: in the middle of firing, reloading or weapon-switching
|
//Elder: in the middle of firing, reloading or weapon-switching
|
||||||
if (cg.snap->ps.weaponTime > 0) {
|
if (cg.snap->ps.weaponTime > 0) {
|
||||||
return;
|
return;
|
||||||
|
@ -1966,6 +1986,8 @@ void CG_Weapon_f( void ) {
|
||||||
//do weapon select sound
|
//do weapon select sound
|
||||||
}
|
}
|
||||||
trap_SendClientCommand("weapon");
|
trap_SendClientCommand("weapon");
|
||||||
|
//Elder: added to get out of function at this point
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
num = atoi( CG_Argv( 1 ) );
|
num = atoi( CG_Argv( 1 ) );
|
||||||
|
@ -1992,6 +2014,7 @@ void CG_Weapon_f( void ) {
|
||||||
//cg.zoomLevel = 0;
|
//cg.zoomLevel = 0;
|
||||||
|
|
||||||
CG_RQ3_Zoom1x();
|
CG_RQ3_Zoom1x();
|
||||||
|
trap_SendClientCommand("unzoom");
|
||||||
cg.weaponSelect = num;
|
cg.weaponSelect = num;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2065,6 +2088,27 @@ void CG_FireWeapon( centity_t *cent ) {
|
||||||
|
|
||||||
weap = &cg_weapons[ ent->weapon ];
|
weap = &cg_weapons[ ent->weapon ];
|
||||||
|
|
||||||
|
//Elder: added to supress burst mode flashes + sounds when 'predicting'
|
||||||
|
// M4
|
||||||
|
if ( cg.snap->ps.weapon == WP_M4 &&
|
||||||
|
(cg.snap->ps.persistant[PERS_WEAPONMODES] & RQ3_M4MODE) == RQ3_M4MODE &&
|
||||||
|
cg.snap->ps.stats[STAT_BURST] > 2 )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// MP5
|
||||||
|
if ( cg.snap->ps.weapon == WP_MP5 &&
|
||||||
|
(cg.snap->ps.persistant[PERS_WEAPONMODES] & RQ3_MP5MODE) == RQ3_MP5MODE &&
|
||||||
|
cg.snap->ps.stats[STAT_BURST] > 2 ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// MK23
|
||||||
|
if ( cg.snap->ps.weapon == WP_PISTOL &&
|
||||||
|
(cg.snap->ps.persistant[PERS_WEAPONMODES] & RQ3_MK23MODE) == RQ3_MK23MODE &&
|
||||||
|
cg.snap->ps.stats[STAT_BURST] > 0 ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// mark the entity as muzzle flashing, so when it is added it will
|
// mark the entity as muzzle flashing, so when it is added it will
|
||||||
// append the flash to the weapon model
|
// append the flash to the weapon model
|
||||||
cent->muzzleFlashTime = cg.time;
|
cent->muzzleFlashTime = cg.time;
|
||||||
|
@ -2126,6 +2170,14 @@ void CG_MissileHitWall( int weapon, int clientNum, vec3_t origin, vec3_t dir, im
|
||||||
qboolean isSprite;
|
qboolean isSprite;
|
||||||
int duration;
|
int duration;
|
||||||
|
|
||||||
|
//Elder: for impact smoke marks
|
||||||
|
localEntity_t *smokePuff;
|
||||||
|
vec3_t puffOrigin;
|
||||||
|
vec3_t puffOffset;
|
||||||
|
vec3_t puffDir;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
|
||||||
mark = 0;
|
mark = 0;
|
||||||
radius = 32;
|
radius = 32;
|
||||||
sfx = 0;
|
sfx = 0;
|
||||||
|
@ -2353,8 +2405,8 @@ void CG_MissileHitWall( int weapon, int clientNum, vec3_t origin, vec3_t dir, im
|
||||||
shader = cgs.media.grenadeExplosionShader;
|
shader = cgs.media.grenadeExplosionShader;
|
||||||
sfx = cgs.media.sfx_rockexp;
|
sfx = cgs.media.sfx_rockexp;
|
||||||
mark = cgs.media.burnMarkShader;
|
mark = cgs.media.burnMarkShader;
|
||||||
radius = 64;
|
radius = 96; //64
|
||||||
light = 300;
|
light = 450; //300
|
||||||
isSprite = qtrue;
|
isSprite = qtrue;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -2380,7 +2432,9 @@ void CG_MissileHitWall( int weapon, int clientNum, vec3_t origin, vec3_t dir, im
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( sfx ) {
|
//Elder: 75% of the time render a bullet ricochet sound
|
||||||
|
i = (int)(random() * 35) % 4;
|
||||||
|
if ( sfx && i < 3) {
|
||||||
trap_S_StartSound( origin, ENTITYNUM_WORLD, CHAN_AUTO, sfx );
|
trap_S_StartSound( origin, ENTITYNUM_WORLD, CHAN_AUTO, sfx );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2416,6 +2470,35 @@ void CG_MissileHitWall( int weapon, int clientNum, vec3_t origin, vec3_t dir, im
|
||||||
//} else {
|
//} else {
|
||||||
CG_ImpactMark( mark, origin, dir, random()*360, 1,1,1,1, alphaFade, radius, qfalse );
|
CG_ImpactMark( mark, origin, dir, random()*360, 1,1,1,1, alphaFade, radius, qfalse );
|
||||||
//}
|
//}
|
||||||
|
|
||||||
|
|
||||||
|
//Elder: 75% of the time render a smoke puff
|
||||||
|
i = (int)(random() * 100) % 4;
|
||||||
|
if (cg_RQ3_impactEffects.integer && i < 3)
|
||||||
|
{
|
||||||
|
switch ( weapon ) {
|
||||||
|
case WP_MP5:
|
||||||
|
case WP_M4:
|
||||||
|
case WP_PISTOL:
|
||||||
|
puffDir[0] = 0;
|
||||||
|
puffDir[1] = 0;
|
||||||
|
puffDir[2] = 16;
|
||||||
|
|
||||||
|
VectorCopy(dir, puffOffset);
|
||||||
|
VectorNormalize(puffOffset);
|
||||||
|
VectorNegate(puffOffset, puffOffset);
|
||||||
|
VectorScale(puffOffset, 13, puffOffset);
|
||||||
|
VectorSubtract(origin, puffOffset, puffOrigin);
|
||||||
|
smokePuff = CG_SmokePuff( puffOrigin, puffDir,
|
||||||
|
(int)(random() * 100) % 4 + 13,
|
||||||
|
1, 1, 1, 0.25f,
|
||||||
|
650,
|
||||||
|
cg.time, 0,
|
||||||
|
LEF_PUFF_DONT_SCALE,
|
||||||
|
cgs.media.smokePuffShader );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -2529,10 +2612,11 @@ static void CG_ShotgunPellet( vec3_t start, vec3_t end, int skipNum, int shellWe
|
||||||
CG_ShotgunPattern
|
CG_ShotgunPattern
|
||||||
|
|
||||||
Perform the same traces the server did to locate the
|
Perform the same traces the server did to locate the
|
||||||
hit splashes (FIXME: ranom seed isn't synce anymore)
|
hit splashes (FIXME: random seed isn't synce anymore)
|
||||||
|
Elder: hopefully fixed the seed problem
|
||||||
================
|
================
|
||||||
*/
|
*/
|
||||||
static void CG_ShotgunPattern( vec3_t origin, vec3_t origin2, int otherEntNum, int shotType ) {
|
static void CG_ShotgunPattern( vec3_t origin, vec3_t origin2, int otherEntNum, int shotType, int seed ) {
|
||||||
int i;
|
int i;
|
||||||
float r, u;
|
float r, u;
|
||||||
vec3_t end;
|
vec3_t end;
|
||||||
|
@ -2565,8 +2649,10 @@ static void CG_ShotgunPattern( vec3_t origin, vec3_t origin2, int otherEntNum, i
|
||||||
for ( i = 0 ; i < count ; i++ ) {
|
for ( i = 0 ; i < count ; i++ ) {
|
||||||
if (shotType == WP_M3)
|
if (shotType == WP_M3)
|
||||||
{
|
{
|
||||||
r = crandom() * DEFAULT_M3_HSPREAD * 16;
|
r = Q_crandom(&seed) * DEFAULT_M3_HSPREAD * 16;
|
||||||
u = crandom() * DEFAULT_M3_VSPREAD * 16;
|
u = Q_crandom(&seed) * DEFAULT_M3_VSPREAD * 16;
|
||||||
|
//r = crandom() * DEFAULT_M3_HSPREAD * 16;
|
||||||
|
//u = crandom() * DEFAULT_M3_VSPREAD * 16;
|
||||||
//r = crandom() * DEFAULT_SHOTGUN_SPREAD * 16;
|
//r = crandom() * DEFAULT_SHOTGUN_SPREAD * 16;
|
||||||
//u = crandom() * DEFAULT_SHOTGUN_SPREAD * 16;
|
//u = crandom() * DEFAULT_SHOTGUN_SPREAD * 16;
|
||||||
}
|
}
|
||||||
|
@ -2574,11 +2660,12 @@ static void CG_ShotgunPattern( vec3_t origin, vec3_t origin2, int otherEntNum, i
|
||||||
{
|
{
|
||||||
//Elder: fill in shotType
|
//Elder: fill in shotType
|
||||||
shotType = WP_HANDCANNON;
|
shotType = WP_HANDCANNON;
|
||||||
r = crandom() * DEFAULT_SHOTGUN_HSPREAD * 16 * 4;
|
r = Q_crandom(&seed) * DEFAULT_SHOTGUN_HSPREAD * 16 * 4;
|
||||||
u = crandom() * DEFAULT_SHOTGUN_VSPREAD * 16 * hc_multipler;
|
u = Q_crandom(&seed) * DEFAULT_SHOTGUN_VSPREAD * 16 * hc_multipler;
|
||||||
// r = crandom() * DEFAULT_HANDCANNON_SPREAD * 16 * 4;
|
// r = crandom() * DEFAULT_HANDCANNON_SPREAD * 16 * 4;
|
||||||
// u = crandom() * DEFAULT_HANDCANNON_SPREAD * 16 * 4;
|
// u = crandom() * DEFAULT_HANDCANNON_SPREAD * 16 * 4;
|
||||||
} VectorMA( origin, 8192 * 16, forward, end);
|
}
|
||||||
|
VectorMA( origin, 8192 * 16, forward, end);
|
||||||
VectorMA (end, r, right, end);
|
VectorMA (end, r, right, end);
|
||||||
VectorMA (end, u, up, end);
|
VectorMA (end, u, up, end);
|
||||||
|
|
||||||
|
@ -2612,13 +2699,14 @@ void CG_ShotgunFire( entityState_t *es, qboolean ism3) {
|
||||||
//Elder: note param changes
|
//Elder: note param changes
|
||||||
if (ism3)
|
if (ism3)
|
||||||
{
|
{
|
||||||
CG_ShotgunPattern( es->pos.trBase, es->origin2, es->otherEntityNum, WP_M3);
|
CG_ShotgunPattern( es->pos.trBase, es->origin2, es->otherEntityNum, WP_M3, es->eventParm);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CG_ShotgunPattern( es->pos.trBase, es->origin2, es->otherEntityNum, WP_HANDCANNON);
|
CG_ShotgunPattern( es->pos.trBase, es->origin2, es->otherEntityNum, WP_HANDCANNON, es->eventParm);
|
||||||
es->origin2[1] += 5;
|
es->angles2[1] += 20;
|
||||||
CG_ShotgunPattern( es->pos.trBase, es->origin2, es->otherEntityNum, -1 );
|
//es->origin2[1] += 5;
|
||||||
|
CG_ShotgunPattern( es->pos.trBase, es->origin2, es->otherEntityNum, -1, es->eventParm);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue