From 3408381bf727032e9753bb83f18ce54f2eb95da4 Mon Sep 17 00:00:00 2001 From: Victor Chow Date: Mon, 13 Aug 2001 17:25:06 +0000 Subject: [PATCH] Elder: Code updates for VM 0-08-00 Client-side --- reaction/cgame/cg_consolecmds.c | 22 ++++++---- reaction/cgame/cg_effects.c | 32 +++++++++++---- reaction/cgame/cg_event.c | 71 +++++++++++++++++++++++++++++++-- reaction/cgame/cg_local.h | 7 +++- reaction/cgame/cg_main.c | 9 ++++- reaction/cgame/cg_players.c | 23 +++++++++-- reaction/cgame/cg_servercmds.c | 7 ---- reaction/cgame/cg_weapons.c | 32 ++++++++++++--- 8 files changed, 168 insertions(+), 35 deletions(-) diff --git a/reaction/cgame/cg_consolecmds.c b/reaction/cgame/cg_consolecmds.c index d5d37e5c..0c031c13 100644 --- a/reaction/cgame/cg_consolecmds.c +++ b/reaction/cgame/cg_consolecmds.c @@ -52,6 +52,12 @@ static void CG_DropWeapon_f (void) { if (cg.snap->ps.stats[STAT_BURST] > 0) return; + if ((cg.snap->ps.stats[STAT_RQ3] & RQ3_BANDAGE_WORK) == RQ3_BANDAGE_WORK) + { + CG_Printf("You are too busy bandaging!\n"); + return; + } + CG_RQ3_Zoom1x(); trap_SendClientCommand("dropweapon"); } @@ -707,12 +713,12 @@ static void CG_IRVision_f ( void ) { { if (cg.rq3_irvision) { - CG_Printf("IR vision enabled.\n"); + CG_Printf("IR vision disabled.\n"); cg.rq3_irvision = qfalse; } else { - CG_Printf("IR vision disabled.\n"); + CG_Printf("IR vision enabled.\n"); cg.rq3_irvision = qtrue; } @@ -756,10 +762,10 @@ static consoleCommand_t commands[] = { { "-reload", CG_ReloadReset_f}, // Elder: added to stop auto-throttle { "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 }, + //{ "messagemode", CG_Say_f }, + //{ "messagemode2", CG_SayTeam_f }, + //{ "say", CG_Say_f }, + //{ "say_team", CG_SayTeam_f }, { "tell_target", CG_TellTarget_f }, { "tell_attacker", CG_TellAttacker_f }, { "vtell_target", CG_VoiceTellTarget_f }, @@ -881,8 +887,8 @@ void CG_InitConsoleCommands( void ) { //Elder: try this trap_AddCommand ("weapon"); trap_AddCommand ("specialweapon"); - trap_AddCommand ("messagemode"); - trap_AddCommand ("messagemode2"); + //trap_AddCommand ("messagemode"); + //trap_AddCommand ("messagemode2"); trap_AddCommand ("playerorigin"); trap_AddCommand ("irvision"); } diff --git a/reaction/cgame/cg_effects.c b/reaction/cgame/cg_effects.c index 31df80d1..0cb36a90 100644 --- a/reaction/cgame/cg_effects.c +++ b/reaction/cgame/cg_effects.c @@ -488,7 +488,8 @@ void CG_BleedSpray ( vec3_t start, vec3_t end, int entityNum, int numBursts ) int i; int spacing = 30; int bloodCount = 0; - + trace_t tr; + if ( !cg_blood.integer ) { return; } @@ -497,23 +498,35 @@ void CG_BleedSpray ( vec3_t start, vec3_t end, int entityNum, int numBursts ) if (numBursts > MAX_SPRAY_BURSTS) numBursts = MAX_SPRAY_BURSTS; + VectorCopy (end, move); VectorSubtract (end, start, vec); //Calculate true length via start/end points VectorCopy (vec, trueEnd); VectorNormalize (trueEnd); - + //VectorScale (trueEnd, 300 + rand() % 100, trueEnd); //VectorAdd (end, trueEnd, trueEnd); VectorMA(end, 300 + rand() % 100, trueEnd, trueEnd); + + // Check end point validity so it doesn't go through walls + // If it does go through wall, take the trace's endpoint + // ****************************** TEST ME!!!!!!! ******************* + CG_Trace(&tr, start, NULL, NULL, trueEnd, entityNum, CONTENTS_SOLID); + if (tr.fraction != 1.0) + VectorCopy(tr.endpos, trueEnd); + VectorSubtract (trueEnd, start, vec); len = VectorNormalize (vec); //Set velocity VectorScale(vec, 10, velocity); - velocity[2] += 30; + if (cg_RQ3_bloodStyle.integer == 1) + velocity[2] += 30; + else + velocity[2] -= 10; // advance a random amount first i = rand() % (int)spacing; @@ -535,10 +548,15 @@ void CG_BleedSpray ( vec3_t start, vec3_t end, int entityNum, int numBursts ) cgs.media.bloodTrailShader); blood->refEntity.rotation = rand() % 360; - blood->leMarkType = LEMT_BLOOD; - blood->leType = LE_FRAGMENT; - blood->pos.trType = TR_GRAVITY; - blood->bounceFactor = 0.4f; + //Check blood style + if (cg_RQ3_bloodStyle.integer == 1) + { + blood->leType = LE_FRAGMENT; + blood->leMarkType = LEMT_BLOOD; + blood->pos.trType = TR_GRAVITY; + blood->bounceFactor = 0.4f; + } + VectorAdd (move, vec, move); } } diff --git a/reaction/cgame/cg_event.c b/reaction/cgame/cg_event.c index 0b77b2d7..b1745e06 100644 --- a/reaction/cgame/cg_event.c +++ b/reaction/cgame/cg_event.c @@ -1348,6 +1348,57 @@ static void CG_DMRewardEvent( entityState_t *ent ) { } +/* +============== +CG_JumpKick + +Added by Elder +Handles messages for client jumpkicks plus sound event +============== +*/ +static void CG_JumpKick ( entityState_t *ent ) +{ + int target; + int attacker; + clientInfo_t *ci; + char sex[4]; // null-terminated so one-bigger than pronoun + + target = ent->otherEntityNum; + attacker = ent->otherEntityNum2; + + if ( target < 0 || target >= MAX_CLIENTS ) { + CG_Error( "CG_JumpKick: target out of range" ); + } + else if ( attacker < 0 || target >= MAX_CLIENTS ) { + CG_Error( "CG_JumpKick: attacker out of range" ); + } + + if (ent->weapon && attacker == cg.clientNum) + { + // this client was the kicker + ci = &cgs.clientinfo[target]; + + // get gender-appropriate pronoun + if (ci->gender == GENDER_FEMALE) + Q_strncpyz(sex, "her", sizeof(sex)); + else if (ci->gender == GENDER_MALE) + Q_strncpyz(sex, "his", sizeof(sex)); + else + Q_strncpyz(sex, "its", sizeof(sex)); + + CG_Printf("You kicked %s's %s from %s hands!\n", + ci->name, cg_weapons[ent->weapon].item->pickup_name, sex); + } + else if (ent->weapon && target == cg.clientNum) + { + // this client was the kicked + ci = &cgs.clientinfo[attacker]; + CG_Printf("%s kicked your weapon from your hands!\n", ci->name); + } + + // everyone hears this + trap_S_StartSound(NULL, ent->number, CHAN_AUTO, cgs.media.kickSound); +} /* ============== @@ -1912,6 +1963,12 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) { CG_Bullet( es->pos.trBase, es->otherEntityNum, dir, qtrue, es->eventParm, qtrue ); break; + case EV_JUMPKICK: + DEBUGNAME("EV_JUMPKICK"); + ByteToDir( es->eventParm, dir ); + CG_MissileHitPlayer( WP_PISTOL, position, dir, es->otherEntityNum ); + CG_JumpKick( es ); + break; case EV_SHOTGUN: DEBUGNAME("EV_SHOTGUN"); @@ -1947,9 +2004,12 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) { case EV_RQ3_SOUND: DEBUGNAME("EV_RQ3_SOUND"); switch (es->eventParm) { + // Elder: handled in EV_JUMPKICK now + // But this is for non-client hits like glass case RQ3_SOUND_KICK: trap_S_StartSound( NULL, es->number, CHAN_AUTO, cgs.media.kickSound); break; + //Elder: handled in EV_HEADSHOT now /* case RQ3_SOUND_HEADSHOT: @@ -1967,9 +2027,14 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) { //TODO: make sparks from hit position trap_S_StartSound( NULL, es->number, CHAN_AUTO, cgs.media.kevlarHitSound); break; - //case RQ3_SOUND_RELOAD_PISTOL: - //trap_S_StartSound( es->pos.trBase, es->number, CHAN_AUTO, cgs.media.reloadmk23Sound); - //break; + case RQ3_SOUND_KNIFEHIT: + //When a player gets slashed + trap_S_StartSound( NULL, es->number, CHAN_AUTO, cgs.media.knifeHitSound); + break; + case RQ3_SOUND_KNIFEDEATH: + trap_S_StartSound( NULL, es->number, CHAN_AUTO, cgs.media.knifeDeathSound); + break; + default: break; } diff --git a/reaction/cgame/cg_local.h b/reaction/cgame/cg_local.h index 2f551cc7..cf7c6574 100644 --- a/reaction/cgame/cg_local.h +++ b/reaction/cgame/cg_local.h @@ -895,6 +895,10 @@ typedef struct { sfxHandle_t silencerSound; sfxHandle_t kevlarHitSound; sfxHandle_t weapToggleSound; + sfxHandle_t knifeClankSound; + sfxHandle_t knifeDeathSound; + sfxHandle_t knifeHitSound; + //sfxHandle_t knifeThrowSound; sfxHandle_t quadSound; sfxHandle_t tracerSound; @@ -1244,7 +1248,8 @@ extern vmCvar_t cg_RQ3_impactEffects; extern vmCvar_t cg_RQ3_laserAssist; //Blaze: anouncer sounds extern vmCvar_t cg_RQ3_anouncer; - +//Elder: different blood types +extern vmCvar_t cg_RQ3_bloodStyle; extern vmCvar_t cg_drawFriend; extern vmCvar_t cg_teamChatsOnly; extern vmCvar_t cg_noVoiceChats; diff --git a/reaction/cgame/cg_main.c b/reaction/cgame/cg_main.c index 6c3f667b..1a0a3b3c 100644 --- a/reaction/cgame/cg_main.c +++ b/reaction/cgame/cg_main.c @@ -157,6 +157,8 @@ vmCvar_t cg_RQ3_impactEffects; vmCvar_t cg_RQ3_laserAssist; //Blaze: anouncer sounds vmCvar_t cg_RQ3_anouncer; +//Elder: different blood types +vmCvar_t cg_RQ3_bloodStyle; vmCvar_t cg_drawFriend; vmCvar_t cg_teamChatsOnly; vmCvar_t cg_noVoiceChats; @@ -327,6 +329,7 @@ static cvarTable_t cvarTable[] = { // bk001129 { &cg_RQ3_impactEffects, "cg_RQ3_impactEffects", "1", CVAR_ARCHIVE }, { &cg_RQ3_laserAssist, "cg_RQ3_laserAssist", "0", CVAR_ARCHIVE }, { &cg_RQ3_anouncer, "cg_RQ3_announcer", "1", CVAR_ARCHIVE }, + { &cg_RQ3_bloodStyle, "cg_RQ3_bloodStyle", "0", CVAR_ARCHIVE }, { &cg_oldRail, "cg_oldRail", "1", CVAR_ARCHIVE}, { &cg_oldRocket, "cg_oldRocket", "1", CVAR_ARCHIVE}, { &cg_oldPlasma, "cg_oldPlasma", "1", CVAR_ARCHIVE}, @@ -654,6 +657,9 @@ static void CG_RegisterSounds( void ) { cgs.media.silencerSound = trap_S_RegisterSound( "sound/misc/silencershot.wav", qfalse); cgs.media.kevlarHitSound = trap_S_RegisterSound( "sound/misc/vest.wav", qfalse); cgs.media.weapToggleSound = trap_S_RegisterSound( "sound/misc/click.wav", qfalse); + cgs.media.knifeClankSound = trap_S_RegisterSound( "sound/misc/knife_clank.wav", qfalse); + cgs.media.knifeDeathSound = trap_S_RegisterSound( "sound/player/gurp2.wav", qfalse); + cgs.media.knifeHitSound = trap_S_RegisterSound( "sound/misc/knife_hit.wav", qfalse); #ifdef MISSIONPACK @@ -1000,7 +1006,8 @@ static void CG_RegisterGraphics( void ) { cgs.media.armorIcon = trap_R_RegisterShaderNoMip( "icons/iconr_yellow" ); cgs.media.machinegunBrassModel = trap_R_RegisterModel( "models/weapons2/shells/m_shell.md3" ); - cgs.media.shotgunBrassModel = trap_R_RegisterModel( "models/weapons2/shells/m_shell.md3" ); + //Elder: changed from m_shel to s_shell + cgs.media.shotgunBrassModel = trap_R_RegisterModel( "models/weapons2/shells/s_shell.md3" ); cgs.media.gibAbdomen = trap_R_RegisterModel( "models/gibs/abdomen.md3" ); cgs.media.gibArm = trap_R_RegisterModel( "models/gibs/arm.md3" ); diff --git a/reaction/cgame/cg_players.c b/reaction/cgame/cg_players.c index 573a9795..20cb41f5 100644 --- a/reaction/cgame/cg_players.c +++ b/reaction/cgame/cg_players.c @@ -1101,6 +1101,8 @@ static void CG_SetWeaponLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int newAni CG_Printf("Anim: %d, Old lf->frame %d, New lf->frame: %d\n", newAnimation, lf->frame, anim->firstFrame); } + + lf->oldFrame = lf->frame; lf->frame = anim->firstFrame; } @@ -1144,6 +1146,7 @@ cg.time should be between oldFrameTime and frameTime after exit static void CG_RunLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int newAnimation, float speedScale, qboolean weaponAnim ) { int f, numFrames; animation_t *anim; + qboolean resetAnim = qfalse; // debugging tool to get no animations if ( cg_animSpeed.integer == 0 ) { @@ -1155,11 +1158,20 @@ static void CG_RunLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int newAnimation if ( newAnimation != lf->animationNumber || !lf->animation ) { if (weaponAnim) { CG_SetWeaponLerpFrame( ci, lf, newAnimation ); + resetAnim = qtrue; } else { CG_SetLerpFrameAnimation( ci, lf, newAnimation ); } } + // Elder's chunk of debug code + if (weaponAnim && cg_debugAnim.integer) + { + CG_Printf("(%d)==================\n", cg.time); + CG_Printf("lf->frame (%d), lf->frameTime (%d),\n", lf->frame, lf->frameTime); + CG_Printf("lf->oldFrame (%d), lf->oldFrameTime (%d),\n", lf->oldFrame, lf->oldFrameTime); + } + // if we have passed the current frame, move it to // oldFrame and calculate a new frame if ( cg.time >= lf->frameTime ) { @@ -1202,7 +1214,11 @@ static void CG_RunLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int newAnimation lf->frame = anim->firstFrame + anim->numFrames - 1 - (f%anim->numFrames); } else { - lf->frame = anim->firstFrame + f; + //Elder's stuff + if (resetAnim) + lf->frame = anim->firstFrame; + else + lf->frame = anim->firstFrame + f; } if ( cg.time > lf->frameTime ) { lf->frameTime = cg.time; @@ -1225,6 +1241,7 @@ static void CG_RunLerpFrame( clientInfo_t *ci, lerpFrame_t *lf, int newAnimation } else { lf->backlerp = 1.0 - (float)( cg.time - lf->oldFrameTime ) / ( lf->frameTime - lf->oldFrameTime ); } + } @@ -1250,7 +1267,7 @@ void CG_WeaponAnimation( centity_t *cent, int *weaponOld, int *weapon, float *we { clientInfo_t *ci; int clientNum; - + clientNum = cent->currentState.clientNum; if ( cg_noPlayerAnims.integer ) { @@ -1259,7 +1276,7 @@ void CG_WeaponAnimation( centity_t *cent, int *weaponOld, int *weapon, float *we } ci = &cgs.clientinfo[ clientNum ]; - + CG_RunLerpFrame( ci, ¢->pe.weapon, cent->currentState.generic1, 1, qtrue ); // QUARANTINE - Debug - Animations diff --git a/reaction/cgame/cg_servercmds.c b/reaction/cgame/cg_servercmds.c index bcea8d54..d475421a 100644 --- a/reaction/cgame/cg_servercmds.c +++ b/reaction/cgame/cg_servercmds.c @@ -1057,13 +1057,6 @@ static void CG_ServerCommand( void ) { return; } -/* // zoom back to 1x for Reaction. hawkins - if ( !strcmp( cmd, "zoom1x") ) { - rxn_zoom1x(); - return; - } -*/ - if ( !strcmp( cmd, "selectpistol") ) { //CG_Printf("Selecting pistol\n"); //trap_SendConsoleCommand(va("cmd weapon %i\n", WP_PISTOL)); diff --git a/reaction/cgame/cg_weapons.c b/reaction/cgame/cg_weapons.c index 4c660191..1a461898 100644 --- a/reaction/cgame/cg_weapons.c +++ b/reaction/cgame/cg_weapons.c @@ -2350,7 +2350,7 @@ void CG_MissileHitWall( int weapon, int clientNum, vec3_t origin, mod = cgs.media.bulletFlashModel; shader = cgs.media.bulletExplosionShader; mark = cgs.media.bulletMarkShader; - sfx = 0; + sfx = cgs.media.knifeClankSound; radius = 4; break; @@ -2358,8 +2358,13 @@ void CG_MissileHitWall( int weapon, int clientNum, vec3_t origin, break; } - //Elder: 75% of the time render a bullet ricochet sound - i = (int)(random() * 35) % 4; + // Knives always play sound + if (weapon == WP_KNIFE) + i = 1; + else + //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 ); } @@ -2790,6 +2795,7 @@ void CG_Bullet( vec3_t end, int sourceEntityNum, vec3_t normal, trace_t trace; int sourceContentType, destContentType; vec3_t start; + centity_t *cent; // if the shooter is currently valid, calc a source point and possibly // do trail effects @@ -2814,8 +2820,24 @@ void CG_Bullet( vec3_t end, int sourceEntityNum, vec3_t normal, } // draw a tracer - if ( random() < cg_tracerChance.value ) { - CG_Tracer( start, end ); + // Elder: only if not using SSG, check if this client is the source + if (sourceEntityNum == cg.snap->ps.clientNum) + { + if (cg.snap->ps.weapon != WP_SSG3000) + { + if ( random() < cg_tracerChance.value ) + CG_Tracer( start, end ); + } + } + else + { + cent = &cg_entities[sourceEntityNum]; + if ( cent->currentValid && cent->currentState.weapon != WP_SSG3000) + { + if ( random() < cg_tracerChance.value ) { + CG_Tracer( start, end ); + } + } } } }