Scope work...

- Ability to detach the scope from the Mauser and use iron sights (use alt-fire)
- Player moves at 1/3 normal  speed when scope is active
- Backpack will now provide grenades if player has them
This commit is contained in:
Simon 2020-07-14 18:56:03 +01:00
parent f019166c08
commit fc3a941f1f
12 changed files with 121 additions and 74 deletions

View file

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.drbeef.rtcwquest"
android:versionCode="10"
android:versionName="0.10.0" android:installLocation="auto" >
android:versionCode="11"
android:versionName="0.11.0" android:installLocation="auto" >
<!-- Tell the system this app requires OpenGL ES 3.1. -->
<uses-feature android:glEsVersion="0x00030001" android:required="true"/>

View file

@ -630,7 +630,7 @@ void ovrFramebuffer_ClearEdgeTexels( ovrFramebuffer * frameBuffer )
//Glide comfort mask in and out
static float currentVLevel = 0.0f;
if (player_moving)
if (vr.player_moving)
{
if (currentVLevel < vr_comfort_mask->value)
currentVLevel += vr_comfort_mask->value * 0.05;
@ -890,7 +890,8 @@ void RTCWVR_Vibrate( float duration, int channel, float intensity )
vibration_channel_intensity[channel] = intensity;
}
void VR_GetMove( float *forward, float *side, float *pos_forward, float *pos_side, float *up, float *yaw, float *pitch, float *roll )
void RTCWVR_GetMove(float *forward, float *side, float *pos_forward, float *pos_side, float *up,
float *yaw, float *pitch, float *roll)
{
*forward = remote_movementForward;
*pos_forward = positional_movementForward;

View file

@ -7,6 +7,7 @@ typedef struct {
float fov;
qboolean weapon_stabilised;
qboolean right_handed;
qboolean player_moving;
vec3_t hmdposition;
vec3_t hmdposition_last; // Don't use this, it is just for calculating delta!
@ -26,9 +27,11 @@ typedef struct {
vec3_t weaponoffset_history[NUM_WEAPON_SAMPLES];
float weaponoffset_history_timestamp[NUM_WEAPON_SAMPLES];
qboolean scopeengaged; // Scope has been engaged on a scoped weapon
qboolean scopeready; // Scope can be engaged
qboolean scopedweapon; // Weapon supports scope
//Lots of scope weapon stuff
qboolean scopeengaged; // Scope has been engaged on a scoped weapon
qboolean scopedweapon; // Weapon scope is available
qboolean scopedetached; // Scope has been detached from weapon
qboolean detachablescope; // Scope can be detached from weapon
qboolean velocitytriggered; // Weapon attack triggered by velocity (knife)

View file

@ -38,7 +38,6 @@ ovrTracking2 tracking;
#define DUCK_CROUCHED 2
int ducked;
qboolean player_moving;
int resyncClientYawWithGameYaw;
vr_client_info_t vr;

View file

@ -7,7 +7,7 @@
//New control scheme definitions to be defined L1VR_SurfaceView.c enumeration
enum control_scheme;
#define SCOPE_ENGAGE_DISTANCE 0.3
#define SCOPE_ENGAGE_DISTANCE 0.22
#define VELOCITY_TRIGGER 1.8
ovrInputStateTrackedRemote leftTrackedRemoteState_old;

View file

@ -36,7 +36,7 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
static qboolean dominantGripPushed = false;
static float dominantGripPushTime = 0.0f;
static int grabMeleeWeapon = 0;
static int grabBackpackWeapon = 0;
static bool canUseBackpack = false;
@ -132,18 +132,17 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
}
}
//Engage scope if conditions are right
vr.scopeready = vr.weapon_stabilised && (distanceToHMD < SCOPE_ENGAGE_DISTANCE) && vr.scopedweapon;
if (!vr.scopeengaged && vr.scopeready)
{
sendButtonActionSimple("weapalt");
}
else if (vr.scopeengaged && !vr.scopeready)
{
//Set this here so we don't retrigger scope by accident too soon
vr.scopeengaged = qfalse;
sendButtonActionSimple("weapalt");
RTCWVR_ResyncClientYawWithGameYaw();
if (vr.scopedweapon && !vr.scopedetached) {
//Engage scope if conditions are right
qboolean scopeready = vr.weapon_stabilised && (distanceToHMD < SCOPE_ENGAGE_DISTANCE);
if (!vr.scopeengaged && scopeready) {
sendButtonActionSimple("weapalt");
} else if (vr.scopeengaged && !scopeready) {
//Set this here so we don't retrigger scope by accident too soon
vr.scopeengaged = qfalse;
sendButtonActionSimple("weapalt");
RTCWVR_ResyncClientYawWithGameYaw();
}
}
//dominant hand stuff first
@ -201,7 +200,7 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
if (pDominantTracking->Status & (VRAPI_TRACKING_STATUS_POSITION_TRACKED | VRAPI_TRACKING_STATUS_POSITION_VALID)) {
canUseBackpack = false;
}
else if (!canUseBackpack && grabMeleeWeapon == 0) {
else if (!canUseBackpack && grabBackpackWeapon == 0) {
int channel = (vr_control_scheme->integer >= 10) ? 0 : 1;
RTCWVR_Vibrate(40, channel, 0.5); // vibrate to let user know they can switch
@ -214,7 +213,7 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
dominantGripPushed = (pDominantTrackedRemoteNew->Buttons &
ovrButton_GripTrigger) != 0;
if (grabMeleeWeapon == 0)
if (grabBackpackWeapon == 0)
{
if (pDominantTracking->Status & (VRAPI_TRACKING_STATUS_POSITION_TRACKED | VRAPI_TRACKING_STATUS_POSITION_VALID)) {
@ -229,17 +228,17 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
}
} else{
if (dominantGripPushed) {
//Initiate knife from backpack mode
sendButtonActionSimple("weapon 1");
//Initiate grenade from backpack mode
sendButtonActionSimple("weaponbank 6");
int channel = (vr_control_scheme->integer >= 10) ? 0 : 1;
RTCWVR_Vibrate(80, channel, 0.8); // vibrate to let user know they switched
grabMeleeWeapon = 1;
grabBackpackWeapon = 1;
}
}
} else if (grabMeleeWeapon == 1 && !dominantGripPushed) {
} else if (grabBackpackWeapon == 1 && !dominantGripPushed) {
//Restores last used weapon if possible
sendButtonActionSimple("weaplastused");
grabMeleeWeapon = 0;
grabBackpackWeapon = 0;
}
}
}
@ -290,15 +289,29 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
//We need to record if we have started firing primary so that releasing trigger will stop firing, if user has pushed grip
//in meantime, then it wouldn't stop the gun firing and it would get stuck
static bool firingPrimary = false;
if (!firingPrimary && dominantGripPushed && (GetTimeInMilliSeconds() - dominantGripPushTime) > vr_reloadtimeoutms->integer && !vr.scopedweapon && !grabMeleeWeapon)
if (!firingPrimary && dominantGripPushed && (GetTimeInMilliSeconds() - dominantGripPushTime) > vr_reloadtimeoutms->integer && !grabBackpackWeapon)
{
//Fire Secondary
if (((pDominantTrackedRemoteNew->Buttons & ovrButton_Trigger) !=
if ((pDominantTrackedRemoteNew->Buttons & ovrButton_Trigger) !=
(pDominantTrackedRemoteOld->Buttons & ovrButton_Trigger))
&& (pDominantTrackedRemoteNew->Buttons & ovrButton_Trigger))
{
sendButtonActionSimple("weapalt");
if (!vr.scopedweapon) {
if (pDominantTrackedRemoteNew->Buttons & ovrButton_Trigger) {
sendButtonActionSimple("weapalt");
}
}
else if (vr.detachablescope)
{
if (pDominantTrackedRemoteNew->Buttons & ovrButton_Trigger) {
//See if we are able to detach the scope
sendButtonActionSimple("weapdetachscope");
}
}
else
{
//Just ignore grip and fire
firingPrimary = (pDominantTrackedRemoteNew->Buttons & ovrButton_Trigger);
sendButtonAction("+attack", firingPrimary);
}
}
}
else
@ -379,14 +392,15 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
float x = nlf * pOffTrackedRemoteNew->Joystick.x;
float y = nlf * pOffTrackedRemoteNew->Joystick.y;
player_moving = (fabs(x) + fabs(y)) > 0.05f;
vr.player_moving = (fabs(x) + fabs(y)) > 0.05f;
//Adjust to be off-hand controller oriented
vec2_t v;
rotateAboutOrigin(x, y, controllerYawHeading, v);
remote_movementSideways = v[0];
remote_movementForward = v[1];
//Move a lot slower if scope is engaged
remote_movementSideways = v[0] * (vr.scopeengaged ? 0.3f : 1.0f);
remote_movementForward = v[1] * (vr.scopeengaged ? 0.3f : 1.0f);
ALOGV(" remote_movementSideways: %f, remote_movementForward: %f",
remote_movementSideways,
remote_movementForward);

View file

@ -164,7 +164,9 @@ void HandleInput_WeaponAlign( ovrInputStateTrackedRemote *pDominantTrackedRemote
if (!itemSwitched) {
if (between(0.8f, pDominantTrackedRemoteNew->Joystick.x, 1.0f))
{
item_index = (item_index+1)%7;
item_index++;
if (item_index == 7)
item_index = 0;
}
else
{
@ -196,15 +198,16 @@ void HandleInput_WeaponAlign( ovrInputStateTrackedRemote *pDominantTrackedRemote
}
if (pDominantTrackedRemoteNew->Joystick.y > 0.5f)
{
*(items[item_index]) += item_inc[item_index];
}
if (between(-0.2f, pDominantTrackedRemoteNew->Joystick.x, 0.2f))
{
if (pDominantTrackedRemoteNew->Joystick.y > 0.6f) {
*(items[item_index]) += item_inc[item_index];
}
if (pDominantTrackedRemoteNew->Joystick.y < -0.5f)
{
*(items[item_index]) -= item_inc[item_index];
}
if (pDominantTrackedRemoteNew->Joystick.y < -0.6f) {
*(items[item_index]) -= item_inc[item_index];
}
}
}
sprintf(vr.test_name, "%s: %.2f", item_names[item_index], *(items[item_index]));

View file

@ -440,6 +440,7 @@ static consoleCommand_t commands[] = {
{ "weapnext", CG_NextWeapon_f },
{ "weapprev", CG_PrevWeapon_f },
{ "weapalt", CG_AltWeapon_f },
{ "weapdetachscope", CG_WeaponDetachScope_f },
{ "weapon", CG_Weapon_f },
{ "weaponbank", CG_WeaponBank_f },
{ "itemnext", CG_NextItem_f },

View file

@ -2051,7 +2051,7 @@ static void CG_DrawWeapReticle( void ) {
//vec4_t snoopercolor = {0.7, .8, 0.7, 0}; // greenish
vec4_t snoopercolor = {0.7, .8, 0.7, 1}; // greenish
float indent = 0.265;
float indent = 0.26;
float X_WIDTH=640;
float Y_HEIGHT=480;

View file

@ -59,7 +59,7 @@ If you have questions concerning this license or the applicable additional terms
#define WEAPON_SELECT_TIME 1400
#define HOLDABLE_SELECT_TIME 1400 //----(SA) for drawing holdable icons
#define ITEM_SCALEUP_TIME 1000
#define ZOOM_TIME 150
#define ZOOM_TIME 100 // Speed the zoom up for VR
#define ITEM_BLOB_TIME 200
#define MUZZLE_FLASH_TIME 30 //----(SA)
#define SINK_TIME 1000 // time for fragments to sink into ground before going away
@ -2012,6 +2012,7 @@ void CG_LastWeaponUsed_f( void ); //----(SA) added
void CG_NextWeaponInBank_f( void ); //----(SA) added
void CG_PrevWeaponInBank_f( void ); //----(SA) added
void CG_AltWeapon_f( void );
void CG_WeaponDetachScope_f( void );
void CG_NextWeapon_f( void );
void CG_PrevWeapon_f( void );
void CG_Weapon_f( void );

View file

@ -3083,7 +3083,7 @@ void CG_AddPlayerWeapon( refEntity_t *parent, playerState_t *ps, centity_t *cent
// add the scope model to the rifle if you've got it
if ( isPlayer && !cg.renderingThirdPerson ) { // (SA) for now just do it on the first person weapons
if ( weaponNum == WP_MAUSER ) {
if ( COM_BitCheck( cg.predictedPlayerState.weapons, WP_SNIPERRIFLE ) ) {
if ( COM_BitCheck( cg.predictedPlayerState.weapons, WP_SNIPERRIFLE ) && !cgVR->scopedetached) {
barrel.hModel = weapon->modModel[0];
if ( barrel.hModel ) {
CG_PositionEntityOnTag( &barrel, &gun, "tag_scope", 0, NULL );
@ -3444,6 +3444,35 @@ void CG_AddViewWeapon( playerState_t *ps ) {
VectorScale( hand.axis[i], scale, hand.axis[i] );
}
//Set some important flags based on the current weapon
switch ( ps->weapon ) {
case WP_KNIFE:
cgVR->velocitytriggered = qtrue;
cgVR->scopedweapon = qfalse;
break;
case WP_MAUSER:
cgVR->velocitytriggered = qfalse;
cgVR->scopedweapon = qtrue;
cgVR->detachablescope = qtrue;
break;
case WP_SNIPERRIFLE:
case WP_GARAND:
case WP_SNOOPERSCOPE:
case WP_FG42:
case WP_FG42SCOPE:
cgVR->velocitytriggered = qfalse;
cgVR->scopedweapon = qtrue;
cgVR->scopedetached = qfalse;
cgVR->detachablescope = qfalse;
break;
default:
cgVR->velocitytriggered = qfalse;
cgVR->scopedweapon = qfalse;
break;
}
// add everything onto the hand
CG_AddPlayerWeapon( &hand, ps, &cg.predictedPlayerEntity );
// Ridah
@ -3454,28 +3483,6 @@ void CG_AddViewWeapon( playerState_t *ps ) {
// add the foot
CG_AddPlayerFoot( &hand, ps, &cg.predictedPlayerEntity );
//Set some important flags based on the current weapon
switch ( ps->weapon ) {
case WP_KNIFE:
cgVR->velocitytriggered = qtrue;
cgVR->scopedweapon = qfalse;
break;
case WP_GARAND:
case WP_SNIPERRIFLE:
case WP_MAUSER:
case WP_SNOOPERSCOPE:
case WP_FG42:
case WP_FG42SCOPE:
cgVR->velocitytriggered = qfalse;
cgVR->scopedweapon = qtrue;
break;
default:
cgVR->velocitytriggered = qfalse;
cgVR->scopedweapon = qfalse;
break;
}
//Add beam
static centity_t beam_entity;
VectorCopy(hand.origin, beam_entity.currentState.pos.trBase); //beam origin
@ -4291,6 +4298,22 @@ void CG_FinishWeaponChange( int lastweap, int newweap ) {
cg.weaponSelect = newweap;
}
void CG_WeaponDetachScope_f( void ) {
int original;
original = cg.weaponSelect;
//Can only detach the scope from the mauser
if (original != WP_MAUSER)
{
return;
}
CG_PlaySwitchSound( WP_MAUSER, WP_MAUSER );
cgVR->scopedetached = !cgVR->scopedetached;
}
/*
==============
CG_AltfireWeapon_f

View file

@ -386,7 +386,8 @@ cvar_t *cl_recoilPitch;
#ifdef __ANDROID__
void VR_GetMove( float *forward, float *side, float *pos_forward, float *pos_side, float *up, float *yaw, float *pitch, float *roll );
void RTCWVR_GetMove(float *forward, float *side, float *pos_forward, float *pos_side, float *up,
float *yaw, float *pitch, float *roll);
typedef struct {
float forward;
@ -815,7 +816,8 @@ usercmd_t CL_CreateCmd( void ) {
#ifdef __ANDROID__
VR_GetMove(&new_move.forward, &new_move.side, &new_move.pos_forward, &new_move.pos_side, &new_move.up, &new_move.yaw, &new_move.pitch, &new_move.roll);
RTCWVR_GetMove(&new_move.forward, &new_move.side, &new_move.pos_forward, &new_move.pos_side,
&new_move.up, &new_move.yaw, &new_move.pitch, &new_move.roll);
#endif