From 9afcd3110a8b74f800d2e3910443d2f37377e9e9 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 12 Jul 2020 00:08:29 +0100 Subject: [PATCH] Throwable Grenades etc --- Projects/Android/AndroidManifest.xml | 4 +- Projects/Android/jni/RTCWVR/VrClientInfo.h | 5 ++ Projects/Android/jni/RTCWVR/VrInputDefault.c | 10 +++ .../Android/jni/rtcw/src/cgame/cg_public.h | 4 +- .../Android/jni/rtcw/src/cgame/cg_syscalls.c | 4 + .../Android/jni/rtcw/src/cgame/cg_weapons.c | 11 +++ .../Android/jni/rtcw/src/client/cl_cgame.c | 5 ++ Projects/Android/jni/rtcw/src/game/g_active.c | 7 ++ .../Android/jni/rtcw/src/game/g_missile.c | 2 +- Projects/Android/jni/rtcw/src/game/g_weapon.c | 87 ++++++++++++++++++- assets/weapons.cfg | 5 +- 11 files changed, 137 insertions(+), 7 deletions(-) diff --git a/Projects/Android/AndroidManifest.xml b/Projects/Android/AndroidManifest.xml index fb6c5f2..ff0f5ee 100644 --- a/Projects/Android/AndroidManifest.xml +++ b/Projects/Android/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="8" + android:versionName="0.8.0" android:installLocation="auto" > diff --git a/Projects/Android/jni/RTCWVR/VrClientInfo.h b/Projects/Android/jni/RTCWVR/VrClientInfo.h index 5f2f144..c474d78 100644 --- a/Projects/Android/jni/RTCWVR/VrClientInfo.h +++ b/Projects/Android/jni/RTCWVR/VrClientInfo.h @@ -1,6 +1,8 @@ #if !defined(vr_client_info_h) #define vr_client_info_h +#define NUM_WEAPON_SAMPLES 72 + typedef struct { float fov; qboolean weapon_stabilised; @@ -20,6 +22,9 @@ typedef struct { vec3_t weaponangles_delta; vec3_t weaponoffset; + float weaponoffset_timestamp; + 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 diff --git a/Projects/Android/jni/RTCWVR/VrInputDefault.c b/Projects/Android/jni/RTCWVR/VrInputDefault.c index 468d424..b2102a4 100644 --- a/Projects/Android/jni/RTCWVR/VrInputDefault.c +++ b/Projects/Android/jni/RTCWVR/VrInputDefault.c @@ -147,10 +147,20 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew, //dominant hand stuff first { + //Record recent weapon position for trajectory based stuff + for (int i = (NUM_WEAPON_SAMPLES-1); i != 0; --i) + { + VectorCopy(vr.weaponoffset_history[i-1], vr.weaponoffset_history[i]); + vr.weaponoffset_history_timestamp[i] = vr.weaponoffset_history_timestamp[i-1]; + } + VectorCopy(vr.weaponoffset, vr.weaponoffset_history[0]); + vr.weaponoffset_history_timestamp[0] = vr.weaponoffset_timestamp; + ///Weapon location relative to view vr.weaponoffset[0] = pDominantTracking->HeadPose.Pose.Position.x - vr.hmdposition[0]; vr.weaponoffset[1] = pDominantTracking->HeadPose.Pose.Position.y - vr.hmdposition[1]; vr.weaponoffset[2] = pDominantTracking->HeadPose.Pose.Position.z - vr.hmdposition[2]; + vr.weaponoffset_timestamp = Sys_Milliseconds( ); if (vr.weapon_stabilised) { diff --git a/Projects/Android/jni/rtcw/src/cgame/cg_public.h b/Projects/Android/jni/rtcw/src/cgame/cg_public.h index b253bd7..dad4521 100644 --- a/Projects/Android/jni/rtcw/src/cgame/cg_public.h +++ b/Projects/Android/jni/rtcw/src/cgame/cg_public.h @@ -216,7 +216,9 @@ typedef enum { CG_INGAME_CLOSEPOPUP, // NERVE - SMF CG_LIMBOCHAT, // NERVE - SMF - CG_GETMODELINFO + CG_GETMODELINFO, + + CG_HAPTIC } cgameImport_t; diff --git a/Projects/Android/jni/rtcw/src/cgame/cg_syscalls.c b/Projects/Android/jni/rtcw/src/cgame/cg_syscalls.c index 1ab6ebe..a7f49f0 100644 --- a/Projects/Android/jni/rtcw/src/cgame/cg_syscalls.c +++ b/Projects/Android/jni/rtcw/src/cgame/cg_syscalls.c @@ -544,3 +544,7 @@ void trap_UI_ClosePopup( const char *arg0 ) { qboolean trap_GetModelInfo( int clientNum, char *modelName, animModelInfo_t **modelInfo ) { return syscall( CG_GETMODELINFO, clientNum, modelName, modelInfo ); } + +qboolean trap_Vibrate( float duration, int channel, float intensity ) { + return syscall( CG_HAPTIC, PASSFLOAT(duration), channel, PASSFLOAT(intensity) ); +} diff --git a/Projects/Android/jni/rtcw/src/cgame/cg_weapons.c b/Projects/Android/jni/rtcw/src/cgame/cg_weapons.c index f20755e..4518426 100644 --- a/Projects/Android/jni/rtcw/src/cgame/cg_weapons.c +++ b/Projects/Android/jni/rtcw/src/cgame/cg_weapons.c @@ -1969,6 +1969,12 @@ static void CG_FlamethrowerFlame( centity_t *cent, vec3_t origin ) { CG_CalculateVRWeaponPosition(origin, angles); CG_FireFlameChunks(cent, origin, angles, 1.0, qtrue, 1); + + trap_Vibrate(-1, cgVR->right_handed ? 1 : 0, 0.6); + if (cgVR->weapon_stabilised) + { + trap_Vibrate(-1, cgVR->right_handed ? 0 : 1, 0.5); + } } return; @@ -2511,6 +2517,11 @@ void CG_PlayerTeslaCoilFire( centity_t *cent, vec3_t flashorigin ) { trap_R_AddLightToScene( tr.endpos, 256 + 600 * tr.fraction, 0.2, 0.6, 1, 0 ); } + trap_Vibrate(-1, cgVR->right_handed ? 1 : 0, 0.8); + if (cgVR->weapon_stabilised) + { + trap_Vibrate(-1, cgVR->right_handed ? 0 : 1, 0.8); + } // shake the camera a bit CG_StartShakeCamera( 0.05, 200, cent->lerpOrigin, 100 ); diff --git a/Projects/Android/jni/rtcw/src/client/cl_cgame.c b/Projects/Android/jni/rtcw/src/client/cl_cgame.c index 7b5081d..4d25e7e 100644 --- a/Projects/Android/jni/rtcw/src/client/cl_cgame.c +++ b/Projects/Android/jni/rtcw/src/client/cl_cgame.c @@ -44,6 +44,7 @@ extern qboolean getCameraInfo( int camNum, int time, vec3_t *origin, vec3_t *ang // RF, this is only used when running a local server extern void SV_SendMoveSpeedsToGame( int entnum, char *text ); extern qboolean SV_GetModelInfo( int clientNum, char *modelName, animModelInfo_t **modelInfo ); +void RTCWVR_Vibrate(float duration, int channel, float intensity ); /* @@ -853,6 +854,10 @@ int CL_CgameSystemCalls( int *args ) { case CG_GETMODELINFO: return SV_GetModelInfo( args[1], VMA( 2 ), VMA( 3 ) ); + case CG_HAPTIC: + RTCWVR_Vibrate( VMF(1), args[2], VMF( 3 ) ); + return 0; + default: Com_Error( ERR_DROP, "Bad cgame system trap: %i", args[0] ); } diff --git a/Projects/Android/jni/rtcw/src/game/g_active.c b/Projects/Android/jni/rtcw/src/game/g_active.c index b0f36cf..9554171 100644 --- a/Projects/Android/jni/rtcw/src/game/g_active.c +++ b/Projects/Android/jni/rtcw/src/game/g_active.c @@ -30,10 +30,13 @@ If you have questions concerning this license or the applicable additional terms #include "g_local.h" #include "ai_cast_fight.h" // need these for avoidance +#include "../../../RTCWVR/VrClientInfo.h" extern void G_CheckForCursorHints( gentity_t *ent ); +extern vr_client_info_t* gVR; + /* =============== @@ -91,6 +94,10 @@ void P_DamageFeedback( gentity_t *player ) { client->ps.damageCount = count; + trap_Vibrate(300, 1, (count / 255.0) + 0.5f); + trap_Vibrate(300, 0, (count / 255.0) + 0.5f); + + // // clear totals // diff --git a/Projects/Android/jni/rtcw/src/game/g_missile.c b/Projects/Android/jni/rtcw/src/game/g_missile.c index ac31df8..f4cb463 100644 --- a/Projects/Android/jni/rtcw/src/game/g_missile.c +++ b/Projects/Android/jni/rtcw/src/game/g_missile.c @@ -1051,7 +1051,7 @@ gentity_t *fire_grenade( gentity_t *self, vec3_t start, vec3_t dir, int grenadeW bolt->clipmask = MASK_MISSILESHOT; bolt->s.pos.trType = TR_GRAVITY; - bolt->s.pos.trTime = level.time - MISSILE_PRESTEP_TIME; // move a bit on the very first frame + bolt->s.pos.trTime = level.time;// - MISSILE_PRESTEP_TIME; // move a bit on the very first frame VectorCopy( start, bolt->s.pos.trBase ); VectorCopy( dir, bolt->s.pos.trDelta ); SnapVector( bolt->s.pos.trDelta ); // save net bandwidth diff --git a/Projects/Android/jni/rtcw/src/game/g_weapon.c b/Projects/Android/jni/rtcw/src/game/g_weapon.c index 40ef4f2..334cc0c 100644 --- a/Projects/Android/jni/rtcw/src/game/g_weapon.c +++ b/Projects/Android/jni/rtcw/src/game/g_weapon.c @@ -112,7 +112,7 @@ void Weapon_Knife( gentity_t *ent ) { if (gVR != NULL) { VectorCopy(gVR->weaponangles_unadjusted, angles); angles[YAW] = ent->client->ps.viewangles[YAW] + - (gVR->weaponangles[YAW] - gVR->hmdorientation[YAW]); + (gVR->weaponangles_unadjusted[YAW] - gVR->hmdorientation[YAW]); } AngleVectors( angles, forward, right, up ); @@ -1212,6 +1212,84 @@ gentity_t *weapon_crowbar_throw( gentity_t *ent ) { return m; } +#define OLDEST_READING 24 +#define NEWEST_READING 20 + +gentity_t *weapon_grenadelauncher_fire_vr( gentity_t *ent, int grenType ) { + gentity_t *m, *te; // JPW NERVE + float power = 1; + vec3_t tosspos; + vec3_t trajectory; + + if (gVR != NULL) { + + + //Caclulate speed between two controller position readings + float distance = VectorDistance(gVR->weaponoffset_history[NEWEST_READING], gVR->weaponoffset_history[OLDEST_READING]); + float t = gVR->weaponoffset_history_timestamp[NEWEST_READING] - gVR->weaponoffset_history_timestamp[OLDEST_READING]; + float worldscale = trap_Cvar_VariableIntegerValue("cg_worldScale"); + float velocity = distance / (t/(float)1000.0); + + //Calculate trajectory + VectorSubtract(gVR->weaponoffset_history[NEWEST_READING], gVR->weaponoffset_history[OLDEST_READING], trajectory); + VectorNormalize( trajectory ); + convertFromVR(worldscale, ent, trajectory, NULL, trajectory); + VectorScale(trajectory, velocity, trajectory); + } + + // pineapples are not thrown as far as mashers + if ( grenType == WP_GRENADE_LAUNCHER ) + { + power = 6; + } else if ( grenType == WP_GRENADE_PINEAPPLE ) + { + power = 4; + } + else { // WP_DYNAMITE + power = 3; + } + + //And then throw.. + VectorScale( trajectory, power, trajectory ); + VectorCopy( muzzleEffect, tosspos ); + m = fire_grenade( ent, tosspos, trajectory, grenType ); + + + //m->damage *= s_quadFactor; + m->damage = 0; // Ridah, grenade's don't explode on contact + m->splashDamage *= s_quadFactor; + + if ( ent->aiCharacter == AICHAR_VENOM ) { // poison gas grenade + m->think = G_ExplodeMissilePoisonGas; + m->s.density = 1; + } + +// JPW NERVE + if ( grenType == WP_GRENADE_SMOKE ) { + if ( ent->client->sess.sessionTeam == TEAM_RED ) { // store team so we can generate red or blue smoke + m->s.otherEntityNum2 = 1; + } else { + m->s.otherEntityNum2 = 0; + } + m->nextthink = level.time + 4000; + m->think = weapon_callAirStrike; + + te = G_TempEntity( m->s.pos.trBase, EV_GLOBAL_SOUND ); + te->s.eventParm = G_SoundIndex( "sound/scenaric/forest/me109_flight.wav" ); +// te->r.svFlags |= SVF_BROADCAST | SVF_USE_CURRENT_ORIGIN; + } +// jpw + + //----(SA) adjust for movement of character. TODO: Probably comment in later, but only for forward/back not strafing +// VectorAdd( m->s.pos.trDelta, ent->client->ps.velocity, m->s.pos.trDelta ); // "real" physics + + // let the AI know which grenade it has fired + ent->grenadeFired = m->s.number; + + // Ridah, return the grenade so we can do some prediction before deciding if we really want to throw it or not + return m; +} + gentity_t *weapon_grenadelauncher_fire( gentity_t *ent, int grenType ) { gentity_t *m, *te; // JPW NERVE float upangle = 0; // start with level throwing and adjust based on angle @@ -1981,7 +2059,12 @@ void FireWeapon( gentity_t *ent ) { if ( ent->s.weapon == WP_DYNAMITE ) { ent->client->ps.classWeaponTime = level.time; // JPW NERVE } - weapon_grenadelauncher_fire( ent, ent->s.weapon ); + if (ent->aiCharacter) { + weapon_grenadelauncher_fire(ent, ent->s.weapon); + } + else { + weapon_grenadelauncher_fire_vr(ent, ent->s.weapon); + } break; case WP_FLAMETHROWER: // RF, this is done client-side only now diff --git a/assets/weapons.cfg b/assets/weapons.cfg index 334b22a..d38a4ed 100644 --- a/assets/weapons.cfg +++ b/assets/weapons.cfg @@ -42,7 +42,7 @@ seta vr_weapon_adjustment_1 "0.5,-8.0,8.0,-15.0" seta vr_weapon_adjustment_2 "0.5,-10,17.0,-20.1" // MP40 -seta vr_weapon_adjustment_3 "0.6,-9.8,10.0,-14.1" +seta vr_weapon_adjustment_3 "0.6,-9.8,9.5,-14.1" // Grenade Launcher seta vr_weapon_adjustment_6 "0.55,-10,18.0,-24.0" @@ -68,3 +68,6 @@ seta vr_weapon_adjustment_10 "0.72,-9.8,11.3,-12.1" // Garand (snooper scope sniper rifle) seta vr_weapon_adjustment_13 "0.59,-9.8,10.0,-12.0" +// Dynamite +seta vr_weapon_adjustment_22 "0.55,-10,18.0,-24.0" +