Throwable thermal grenades

Also fixed issue where triggering saber throw too quickly on change would screw things up
This commit is contained in:
Simon 2022-10-25 21:59:33 +01:00
parent 3bef513990
commit eb341b78cd
3 changed files with 36 additions and 11 deletions

View file

@ -4866,6 +4866,11 @@ void CG_Player(centity_t *cent ) {
vr->weaponid = WP_NONE;
}
if (cent->gent->client->ps.clientNum == 0) {
vr->velocitytriggered = (!cg.renderingThirdPerson &&
(cg.snap->ps.weapon == WP_SABER || cg.snap->ps.weapon == WP_MELEE));
}
//Get the player's light level for stealth calculations
CG_GetPlayerLightLevel( cent );
@ -4886,9 +4891,6 @@ void CG_Player(centity_t *cent ) {
return;
}
//Before we go any further, default this to false, it can be updated later
vr->velocitytriggered = false;
if ( cent->currentState.vehicleModel != 0 )
{//Using an alternate (md3 for now) model
refEntity_t ent;
@ -5218,7 +5220,6 @@ extern vmCvar_t cg_thirdPersonAlpha;
vec3_t angles;
BG_CalculateVRSaberPosition(cent->gent->client->renderInfo.muzzlePoint, angles);
AngleVectors( angles, cent->gent->client->renderInfo.muzzleDir, NULL, NULL );
vr->velocitytriggered = true;
}
}
}

View file

@ -2838,8 +2838,8 @@ void CG_DrawItemSelector( void )
case 2: //fighting style
count = 3;
beam.shaderRGBA[0] = 0xff;
beam.shaderRGBA[1] = 0x00;
beam.shaderRGBA[2] = 0x00;
beam.shaderRGBA[1] = 0xff;
beam.shaderRGBA[2] = 0xff;
break;
case 3: // force powers
count = MAX_SHOWPOWERS;

View file

@ -28,6 +28,8 @@ along with this program; if not, see <http://www.gnu.org/licenses/>.
#include "w_local.h"
#include "g_functions.h"
#include "bg_local.h"
#include <JKVR/VrClientInfo.h>
#include <JKVR/mathlib.h>
//---------------------
// Thermal Detonator
@ -266,6 +268,10 @@ void WP_ThermalThink( gentity_t *ent )
}
}
#define OLDEST_READING 5
#define NEWEST_READING 2
#define TD_REAL_THROW_VEL_MULT 4.4f
//---------------------------------------------------------
gentity_t *WP_FireThermalDetonator( gentity_t *ent, qboolean alt_fire )
//---------------------------------------------------------
@ -274,11 +280,25 @@ gentity_t *WP_FireThermalDetonator( gentity_t *ent, qboolean alt_fire )
vec3_t dir, start;
float damageScale = 1.0f;
if ( ent->client && !ent->NPC)
bolt = G_Spawn();
bool realThrow = false;
if ( ent->client && !ent->NPC && ent->client->ps.clientNum == 0)
{
vec3_t angs;
BG_CalculateVRWeaponPosition(start, angs);
AngleVectors(angs, dir, NULL, NULL);
//Caclulate speed between two controller position readings
float distance = VectorDistance(vr->weaponoffset_history[NEWEST_READING], vr->weaponoffset_history[OLDEST_READING]);
float t = vr->weaponoffset_history_timestamp[NEWEST_READING] - vr->weaponoffset_history_timestamp[OLDEST_READING];
float velocity = distance / (t/(float)1000.0);
//Calculate trajectory
VectorSubtract(vr->weaponoffset_history[NEWEST_READING], vr->weaponoffset_history[OLDEST_READING], dir);
VectorNormalize( dir );
BG_ConvertFromVR(dir, NULL, dir);
VectorScale( dir, velocity * TD_REAL_THROW_VEL_MULT, bolt->s.pos.trDelta );
realThrow = true;
}
else {
VectorCopy( wpFwd, dir );
@ -286,7 +306,6 @@ gentity_t *WP_FireThermalDetonator( gentity_t *ent, qboolean alt_fire )
}
bolt = G_Spawn();
bolt->classname = "thermal_detonator";
@ -345,11 +364,16 @@ gentity_t *WP_FireThermalDetonator( gentity_t *ent, qboolean alt_fire )
// normal ones bounce, alt ones explode on impact
bolt->s.pos.trType = TR_GRAVITY;
bolt->owner = ent;
VectorScale( dir, TD_VELOCITY * chargeAmount, bolt->s.pos.trDelta );
if (!realThrow) {
VectorScale(dir, TD_VELOCITY * chargeAmount, bolt->s.pos.trDelta);
}
if ( ent->health > 0 )
{
bolt->s.pos.trDelta[2] += 120;
if (!realThrow) {
bolt->s.pos.trDelta[2] += 120;
}
if ( ent->NPC && ent->enemy )
{//FIXME: we're assuming he's actually facing this direction...