From b1e6677fc0aa29408f4f9b8d65ee329a3cdae723 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 15 Oct 2022 14:53:53 +0100 Subject: [PATCH] Hints to force direction also rotated saber back so the glitch is not so visible Added controls for force direction hint and Speed FOV adjust to the menu --- .../Android/jni/OpenJK/code/cgame/cg_local.h | 3 + .../jni/OpenJK/codeJK2/cgame/cg_local.h | 4 + .../jni/OpenJK/codeJK2/cgame/cg_main.cpp | 5 + .../jni/OpenJK/codeJK2/cgame/cg_players.cpp | 2 +- .../jni/OpenJK/codeJK2/cgame/cg_view.cpp | 16 +++- .../jni/OpenJK/codeJK2/cgame/cg_weapons.cpp | 1 - .../jni/OpenJK/codeJK2/game/wp_saber.cpp | 88 +++++++++++++----- assets/z_vr_assets.pk3 | Bin 1057834 -> 1058120 bytes z_vr_assets/ui/controls.menu | 70 +++++++++++++- z_vr_assets/ui/ingamecontrols.menu | 68 ++++++++++++++ 10 files changed, 228 insertions(+), 29 deletions(-) diff --git a/Projects/Android/jni/OpenJK/code/cgame/cg_local.h b/Projects/Android/jni/OpenJK/code/cgame/cg_local.h index 4327cf4..ee3ded9 100644 --- a/Projects/Android/jni/OpenJK/code/cgame/cg_local.h +++ b/Projects/Android/jni/OpenJK/code/cgame/cg_local.h @@ -647,6 +647,9 @@ extern vmCvar_t fx_debug; extern vmCvar_t cg_missionInfoFlashTime; extern vmCvar_t cg_hudFiles; +extern vmCvar_t cg_showForcePowerDirection; +extern vmCvar_t cg_forceSpeedFOVAdjust; + extern vmCvar_t cg_turnAnims; extern vmCvar_t cg_motionBoneComp; extern vmCvar_t cg_reliableAnimSounds; diff --git a/Projects/Android/jni/OpenJK/codeJK2/cgame/cg_local.h b/Projects/Android/jni/OpenJK/codeJK2/cgame/cg_local.h index 7f17df5..4a04df3 100644 --- a/Projects/Android/jni/OpenJK/codeJK2/cgame/cg_local.h +++ b/Projects/Android/jni/OpenJK/codeJK2/cgame/cg_local.h @@ -635,6 +635,10 @@ extern vmCvar_t cg_missionInfoCentered; extern vmCvar_t cg_missionInfoFlashTime; extern vmCvar_t cg_hudFiles; +extern vmCvar_t cg_showForcePowerDirection; +extern vmCvar_t cg_forceSpeedFOVAdjust; + + /* Ghoul2 Insert Start */ diff --git a/Projects/Android/jni/OpenJK/codeJK2/cgame/cg_main.cpp b/Projects/Android/jni/OpenJK/codeJK2/cgame/cg_main.cpp index 74f3b10..5efe8af 100644 --- a/Projects/Android/jni/OpenJK/codeJK2/cgame/cg_main.cpp +++ b/Projects/Android/jni/OpenJK/codeJK2/cgame/cg_main.cpp @@ -321,6 +321,9 @@ vmCvar_t cg_missionInfoCentered; vmCvar_t cg_missionInfoFlashTime; vmCvar_t cg_hudFiles; +vmCvar_t cg_showForcePowerDirection; +vmCvar_t cg_forceSpeedFOVAdjust; + vmCvar_t vr_weapon_adjustment_1; vmCvar_t vr_weapon_adjustment_2; vmCvar_t vr_weapon_adjustment_3; @@ -454,6 +457,8 @@ static cvarTable_t cvarTable[] = { { &cg_missionInfoCentered, "cg_missionInfoCentered", "1", CVAR_ARCHIVE }, { &cg_missionInfoFlashTime, "cg_missionInfoFlashTime", "10000", 0 }, { &cg_hudFiles, "cg_hudFiles", "ui/jk2hud.txt", CVAR_ARCHIVE}, + { &cg_showForcePowerDirection, "cg_showForcePowerDirection", "1", CVAR_ARCHIVE}, + { &cg_forceSpeedFOVAdjust, "cg_forceSpeedFOVAdjust", "1", CVAR_ARCHIVE}, //Default Weapon adjustments - these WILL be overridden // scale,right,up,forward,pitch,yaw,roll diff --git a/Projects/Android/jni/OpenJK/codeJK2/cgame/cg_players.cpp b/Projects/Android/jni/OpenJK/codeJK2/cgame/cg_players.cpp index 257f0c5..f9b0850 100644 --- a/Projects/Android/jni/OpenJK/codeJK2/cgame/cg_players.cpp +++ b/Projects/Android/jni/OpenJK/codeJK2/cgame/cg_players.cpp @@ -3450,7 +3450,7 @@ void CG_AddRefEntityWithPowerups( refEntity_t *ent, int powerups, centity_t *cen hiltEnt.hModel = cgi_R_RegisterModel( "models/weapons2/saber/saber_w.md3" ); vec3_t angles; BG_CalculateVRSaberPosition(hiltEnt.origin, hiltEnt.angles); - hiltEnt.angles[ROLL] += 180; + //hiltEnt.angles[ROLL] += 180; VectorCopy(hiltEnt.origin, hiltEnt.oldorigin); vec3_t axis[3]; AnglesToAxis(hiltEnt.angles, axis); diff --git a/Projects/Android/jni/OpenJK/codeJK2/cgame/cg_view.cpp b/Projects/Android/jni/OpenJK/codeJK2/cgame/cg_view.cpp index dbd1be1..ee58fff 100644 --- a/Projects/Android/jni/OpenJK/codeJK2/cgame/cg_view.cpp +++ b/Projects/Android/jni/OpenJK/codeJK2/cgame/cg_view.cpp @@ -1312,23 +1312,29 @@ qboolean CG_CalcFOVFromX( float fov_x ) float CG_ForceSpeedFOV( float infov ) { + if (!cg_forceSpeedFOVAdjust.integer) + { + return infov; + } + gentity_t *player = &g_entities[0]; float fov; float timeLeft = player->client->ps.forcePowerDuration[FP_SPEED] - cg.time; float length = FORCE_SPEED_DURATION*forceSpeedValue[player->client->ps.forcePowerLevel[FP_SPEED]]; float amt = forceSpeedFOVMod[player->client->ps.forcePowerLevel[FP_SPEED]]; - if ( timeLeft < 500 ) + if ( timeLeft < 400 ) {//start going back - fov = infov + (timeLeft)/500*amt; + fov = infov + sinf(DEG2RAD((timeLeft/400)*180))*amt; } - else if ( length - timeLeft < 1000 ) + else if ( length - timeLeft < 600 ) {//start zooming in - fov = infov + (length - timeLeft)/1000*amt; + fov = infov + sinf(DEG2RAD(((length - timeLeft)/600)*180))*amt; } else {//stay at this FOV - fov = infov+amt; + fov = infov;//+amt; } + return fov; } /* diff --git a/Projects/Android/jni/OpenJK/codeJK2/cgame/cg_weapons.cpp b/Projects/Android/jni/OpenJK/codeJK2/cgame/cg_weapons.cpp index e920217..c2f6516 100644 --- a/Projects/Android/jni/OpenJK/codeJK2/cgame/cg_weapons.cpp +++ b/Projects/Android/jni/OpenJK/codeJK2/cgame/cg_weapons.cpp @@ -2667,7 +2667,6 @@ void CG_ItemSelectorSelect_f( void ) if (cg.itemSelectorSelection == -1) { - cg.itemSelectorType = 0; return; } diff --git a/Projects/Android/jni/OpenJK/codeJK2/game/wp_saber.cpp b/Projects/Android/jni/OpenJK/codeJK2/game/wp_saber.cpp index dd44cd8..5f7eff2 100644 --- a/Projects/Android/jni/OpenJK/codeJK2/game/wp_saber.cpp +++ b/Projects/Android/jni/OpenJK/codeJK2/game/wp_saber.cpp @@ -29,6 +29,7 @@ along with this program; if not, see . #include "g_functions.h" #include "wp_saber.h" #include "../../code/qcommon/tri_coll_test.h" +#include "../cgame/FxScheduler.h" #define MAX_SABER_VICTIMS 16 static int victimEntityNum[MAX_SABER_VICTIMS]; @@ -5724,15 +5725,30 @@ void ForceThrow( gentity_t *self, qboolean pull ) G_Sound( self, soundIndex ); + vec3_t origin, angles; if (self->client->ps.clientNum == 0) { - vec3_t origin, angles; BG_CalculateVROffHandPosition(origin, fwdangles); + + if (cg_showForcePowerDirection.integer) + { + vec3_t color = { 0, 255, 0 }; + AngleVectors( fwdangles, forward, right, NULL ); + VectorMA( origin, radius, forward, end ); + FX_AddLine( origin, end, 0.1f, 1.0f, 0.0f, + 1.0f, 0.0f, 0.0f, + color, color, 0.0f, + 500, cgi_R_RegisterShader( "gfx/misc/nav_line" ), + FX_SIZE_LINEAR | FX_ALPHA_LINEAR ); + + } } else { VectorCopy( self->client->ps.viewangles, fwdangles ); + VectorCopy( self->client->renderInfo.eyePoint, origin ); } + //fwdangles[1] = self->client->ps.viewangles[1]; AngleVectors( fwdangles, forward, right, NULL ); VectorCopy( self->currentOrigin, center ); @@ -5756,8 +5772,8 @@ void ForceThrow( gentity_t *self, qboolean pull ) if ( cone >= 1.0f ) {//must be pointing right at them - VectorMA( self->client->renderInfo.eyePoint, radius, forward, end ); - gi.trace( &tr, self->client->renderInfo.eyePoint, vec3_origin, vec3_origin, end, self->s.number, MASK_OPAQUE|CONTENTS_SOLID|CONTENTS_BODY|CONTENTS_ITEM|CONTENTS_CORPSE, G2_NOCOLLIDE, 0 );//was MASK_SHOT, changed to match crosshair trace + VectorMA( origin, radius, forward, end ); + gi.trace( &tr, origin, vec3_origin, vec3_origin, end, self->s.number, MASK_OPAQUE|CONTENTS_SOLID|CONTENTS_BODY|CONTENTS_ITEM|CONTENTS_CORPSE, G2_NOCOLLIDE, 0 );//was MASK_SHOT, changed to match crosshair trace /* //FIXME: can't just return, need to be able to push missiles if ( tr.entityNum >= ENTITYNUM_WORLD ) @@ -5892,8 +5908,8 @@ void ForceThrow( gentity_t *self, qboolean pull ) } else {//do a forwardEnt trace - VectorMA( self->client->renderInfo.eyePoint, radius, forward, end ); - gi.trace( &tr, self->client->renderInfo.eyePoint, vec3_origin, vec3_origin, end, self->s.number, MASK_OPAQUE|CONTENTS_SOLID|CONTENTS_BODY|CONTENTS_ITEM|CONTENTS_CORPSE, G2_NOCOLLIDE, 0 );//was MASK_SHOT, changed to match crosshair trace + VectorMA( origin, radius, forward, end ); + gi.trace( &tr, origin, vec3_origin, vec3_origin, end, self->s.number, MASK_OPAQUE|CONTENTS_SOLID|CONTENTS_BODY|CONTENTS_ITEM|CONTENTS_CORPSE, G2_NOCOLLIDE, 0 );//was MASK_SHOT, changed to match crosshair trace if ( tr.entityNum != ent->s.number ) {//last chance continue; @@ -5982,7 +5998,7 @@ void ForceThrow( gentity_t *self, qboolean pull ) } //in PVS? - if ( !ent->bmodel && !gi.inPVS( ent_org, self->client->renderInfo.eyePoint ) ) + if ( !ent->bmodel && !gi.inPVS( ent_org, origin ) ) {//must be in PVS continue; } @@ -5990,7 +6006,7 @@ void ForceThrow( gentity_t *self, qboolean pull ) if ( ent != forwardEnt ) {//don't need to trace against forwardEnt again //really should have a clear LOS to this thing... - gi.trace( &tr, self->client->renderInfo.eyePoint, vec3_origin, vec3_origin, ent_org, self->s.number, MASK_OPAQUE|CONTENTS_SOLID, G2_NOCOLLIDE, 0 );//was MASK_SHOT, but changed to match above trace and crosshair trace + gi.trace( &tr, origin, vec3_origin, vec3_origin, ent_org, self->s.number, MASK_OPAQUE|CONTENTS_SOLID, G2_NOCOLLIDE, 0 );//was MASK_SHOT, but changed to match above trace and crosshair trace if ( tr.fraction < 1.0f && tr.entityNum != ent->s.number ) {//must have clear LOS continue; @@ -6263,8 +6279,8 @@ void ForceThrow( gentity_t *self, qboolean pull ) AngleVectors(self->client->ps.viewangles, forward, right, NULL); } VectorNormalize( forward ); - VectorMA( self->client->renderInfo.eyePoint, radius, forward, end ); - gi.trace( &tr, self->client->renderInfo.eyePoint, vec3_origin, vec3_origin, end, self->s.number, MASK_SHOT, G2_NOCOLLIDE, 0 ); + VectorMA( origin, radius, forward, end ); + gi.trace( &tr, origin, vec3_origin, vec3_origin, end, self->s.number, MASK_SHOT, G2_NOCOLLIDE, 0 ); if ( tr.entityNum != push_list[x]->s.number || tr.fraction == 1.0 || tr.allsolid || tr.startsolid ) {//must be pointing right at it continue; @@ -6272,22 +6288,22 @@ void ForceThrow( gentity_t *self, qboolean pull ) if ( pull ) { - VectorSubtract( self->client->renderInfo.eyePoint, tr.endpos, pushDir ); + VectorSubtract( origin, tr.endpos, pushDir ); } else { - VectorSubtract( tr.endpos, self->client->renderInfo.eyePoint, pushDir ); + VectorSubtract( tr.endpos, origin, pushDir ); } /* VectorSubtract( push_list[x]->absmax, push_list[x]->absmin, size ); VectorMA( push_list[x]->absmin, 0.5, size, center ); if ( pull ) { - VectorSubtract( self->client->renderInfo.eyePoint, center, pushDir ); + VectorSubtract( origin, center, pushDir ); } else { - VectorSubtract( center, self->client->renderInfo.eyePoint, pushDir ); + VectorSubtract( center, origin, pushDir ); } */ damage -= VectorNormalize( pushDir ); @@ -6316,8 +6332,8 @@ void ForceThrow( gentity_t *self, qboolean pull ) AngleVectors( self->client->ps.viewangles, forward, NULL, NULL ); VectorNormalize( forward ); - VectorMA( self->client->renderInfo.eyePoint, radius, forward, end ); - gi.trace( &tr, self->client->renderInfo.eyePoint, vec3_origin, vec3_origin, end, self->s.number, MASK_SHOT, G2_NOCOLLIDE, 0 ); + VectorMA( origin, radius, forward, end ); + gi.trace( &tr, origin, vec3_origin, vec3_origin, end, self->s.number, MASK_SHOT, G2_NOCOLLIDE, 0 ); if ( tr.entityNum != push_list[x]->s.number || tr.fraction == 1.0 || tr.allsolid || tr.startsolid ) {//must be pointing right at it continue; @@ -6345,7 +6361,7 @@ void ForceThrow( gentity_t *self, qboolean pull ) VectorCopy( push_list[x]->pos2, pos2 ); } - if ( Distance( pos1, self->client->renderInfo.eyePoint ) < Distance( pos2, self->client->renderInfo.eyePoint ) ) + if ( Distance( pos1, origin ) < Distance( pos2, origin ) ) {//pos1 is closer if ( push_list[x]->moverState == MOVER_POS1 ) {//at the closest pos @@ -6764,17 +6780,31 @@ void ForceTelepathy( gentity_t *self ) { BG_CalculateVROffHandPosition(origin, angles); AngleVectors(angles, forward, NULL, NULL); + + if (cg_showForcePowerDirection.integer) + { + vec3_t color = { 0, 255, 0 }; + AngleVectors( angles, forward, NULL, NULL ); + VectorMA( origin, 512, forward, end ); + FX_AddLine( origin, end, 0.1f, 1.0f, 0.0f, + 1.0f, 0.0f, 0.0f, + color, color, 0.0f, + 500, cgi_R_RegisterShader( "gfx/misc/nav_line" ), + FX_SIZE_LINEAR | FX_ALPHA_LINEAR ); + + } } else { AngleVectors(self->client->ps.viewangles, forward, NULL, NULL); VectorCopy(self->client->ps.viewangles, angles); + VectorCopy(self->client->renderInfo.eyePoint, origin); } VectorNormalize( forward ); - VectorMA( self->client->renderInfo.eyePoint, 2048, forward, end ); + VectorMA( origin, 2048, forward, end ); //Cause a distraction if enemy is not fighting - gi.trace( &tr, self->client->renderInfo.eyePoint, vec3_origin, vec3_origin, end, self->s.number, MASK_OPAQUE|CONTENTS_BODY, G2_NOCOLLIDE, 0 ); + gi.trace( &tr, origin, vec3_origin, vec3_origin, end, self->s.number, MASK_OPAQUE|CONTENTS_BODY, G2_NOCOLLIDE, 0 ); if ( tr.entityNum == ENTITYNUM_NONE || tr.fraction == 1.0 || tr.allsolid || tr.startsolid ) { return; @@ -6987,20 +7017,36 @@ void ForceGrip( gentity_t *self ) { BG_CalculateVROffHandPosition(origin, angles); AngleVectors(angles, forward, NULL, NULL); + + if (cg_showForcePowerDirection.integer) + { + vec3_t origin, angles; + vec3_t color = { 0, 255, 0 }; + AngleVectors( angles, forward, NULL, NULL ); + VectorMA( origin, FORCE_GRIP_DIST, forward, end ); + FX_AddLine( origin, end, 0.1f, 1.0f, 0.0f, + 1.0f, 0.0f, 0.0f, + color, color, 0.0f, + 500, cgi_R_RegisterShader( "gfx/misc/nav_line" ), + FX_SIZE_LINEAR | FX_ALPHA_LINEAR ); + + } } else { AngleVectors(self->client->ps.viewangles, forward, NULL, NULL); VectorCopy(self->client->ps.viewangles, angles); + VectorCopy(self->client->renderInfo.eyePoint, origin); } + VectorNormalize( forward ); VectorMA( self->client->renderInfo.handLPoint, FORCE_GRIP_DIST, forward, end ); - if ( self->enemy && (self->s.number || InFront( self->enemy->currentOrigin, self->client->renderInfo.eyePoint, angles, 0.2f ) ) ) + if ( self->enemy && (self->s.number || InFront( self->enemy->currentOrigin, origin, angles, 0.2f ) ) ) {//NPCs can always lift enemy since we assume they're looking at them, players need to be facing the enemy - if ( gi.inPVS( self->enemy->currentOrigin, self->client->renderInfo.eyePoint ) ) + if ( gi.inPVS( self->enemy->currentOrigin, origin ) ) {//must be in PVS - gi.trace( &tr, self->client->renderInfo.eyePoint, vec3_origin, vec3_origin, self->enemy->currentOrigin, self->s.number, MASK_SHOT, G2_NOCOLLIDE, 0 ); + gi.trace( &tr, origin, vec3_origin, vec3_origin, self->enemy->currentOrigin, self->s.number, MASK_SHOT, G2_NOCOLLIDE, 0 ); if ( tr.fraction == 1.0f || tr.entityNum == self->enemy->s.number ) {//must have clear LOS traceEnt = self->enemy; diff --git a/assets/z_vr_assets.pk3 b/assets/z_vr_assets.pk3 index e438abb65fb34550b7c7c5d7021b897dbbba53e9..984caf414fb300d99dcc7449962789f9b15c3a53 100644 GIT binary patch delta 8017 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 diff --git a/z_vr_assets/ui/controls.menu b/z_vr_assets/ui/controls.menu index 7939af5..bfc162b 100644 --- a/z_vr_assets/ui/controls.menu +++ b/z_vr_assets/ui/controls.menu @@ -974,7 +974,7 @@ group weaponcontrols type ITEM_TYPE_YESNO text "Virtual Gun Stock:" - cvar "vr_virtual_stock" + cvar "vr_virtual_stock" rect 305 231 300 20 textalign ITEM_ALIGN_RIGHT textalignx 151 @@ -1002,6 +1002,74 @@ } + itemDef + { + name none + group weaponcontrols + type ITEM_TYPE_YESNO + text "Show Force Power Direction:" + cvar "cg_showForcePowerDirection" + rect 305 251 300 20 + textalign ITEM_ALIGN_RIGHT + textalignx 151 + textaligny -2 + font 2 + textscale 0.8 + forecolor 1 1 1 1 + visible 0 + // appearance_slot 2 + descText "Hint as to which direction a force power was fired." + action + { + play sound/interface/button1 + } + + mouseenter + { + show highlight4 + } + + mouseexit + { + hide highlight4 + } + + } + + itemDef + { + name none + group weaponcontrols + type ITEM_TYPE_YESNO + text "Show Force Speed FOV Change:" + cvar "cg_forceSpeedFOVAdjust" + rect 305 271 300 20 + textalign ITEM_ALIGN_RIGHT + textalignx 151 + textaligny -2 + font 2 + textscale 0.8 + forecolor 1 1 1 1 + visible 0 + // appearance_slot 2 + descText "Whether the FOV will be adjusted briefly when engaging Force Speed." + action + { + play sound/interface/button1 + } + + mouseenter + { + show highlight4 + } + + mouseexit + { + hide highlight4 + } + + } + //---------------------------------------------------------------------------------------------- diff --git a/z_vr_assets/ui/ingamecontrols.menu b/z_vr_assets/ui/ingamecontrols.menu index 1917ebb..e5e2fb5 100644 --- a/z_vr_assets/ui/ingamecontrols.menu +++ b/z_vr_assets/ui/ingamecontrols.menu @@ -1012,6 +1012,74 @@ } + itemDef + { + name none + group weaponcontrols + type ITEM_TYPE_YESNO + text "Show Force Power Direction:" + cvar "cg_showForcePowerDirection" + rect 305 251 300 20 + textalign ITEM_ALIGN_RIGHT + textalignx 151 + textaligny -2 + font 2 + textscale 0.8 + forecolor 1 1 1 1 + visible 0 + // appearance_slot 2 + descText "Hint as to which direction a force power was fired." + action + { + play sound/interface/button1 + } + + mouseenter + { + show highlight4 + } + + mouseexit + { + hide highlight4 + } + + } + + itemDef + { + name none + group weaponcontrols + type ITEM_TYPE_YESNO + text "Show Force Speed FOV Change:" + cvar "cg_forceSpeedFOVAdjust" + rect 305 271 300 20 + textalign ITEM_ALIGN_RIGHT + textalignx 151 + textaligny -2 + font 2 + textscale 0.8 + forecolor 1 1 1 1 + visible 0 + // appearance_slot 2 + descText "Whether the FOV will be adjusted briefly when engaging Force Speed." + action + { + play sound/interface/button1 + } + + mouseenter + { + show highlight4 + } + + mouseexit + { + hide highlight4 + } + + } + //----------------------------------------------------------------------------------------------