mirror of
https://github.com/DrBeef/JKXR.git
synced 2025-02-22 20:02:20 +00:00
Force powers aimed using controllers
This commit is contained in:
parent
25f46bbf52
commit
2eafff44ee
4 changed files with 193 additions and 73 deletions
|
@ -1,8 +1,8 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="com.drbeef.jkxr"
|
package="com.drbeef.jkxr"
|
||||||
android:versionCode="40"
|
android:versionCode="41"
|
||||||
android:versionName="0.7.0" android:installLocation="auto" >
|
android:versionName="0.7.1" android:installLocation="auto" >
|
||||||
|
|
||||||
<!-- Tell the system this app requires OpenGL ES 3.1. -->
|
<!-- Tell the system this app requires OpenGL ES 3.1. -->
|
||||||
<uses-feature android:glEsVersion="0x00030002" android:required="true"/>
|
<uses-feature android:glEsVersion="0x00030002" android:required="true"/>
|
||||||
|
|
|
@ -4262,7 +4262,7 @@ static void CG_Draw2D( void )
|
||||||
{//force sight is on
|
{//force sight is on
|
||||||
//indicate this with sight cone thingy
|
//indicate this with sight cone thingy
|
||||||
cg.drawingHUD = CG_HUD_NORMAL;
|
cg.drawingHUD = CG_HUD_NORMAL;
|
||||||
CG_DrawPic( 35, 40, 570, 400, cgi_R_RegisterShader( "gfx/2d/jsense" ));
|
CG_DrawPic( 35, 50, 570, 400, cgi_R_RegisterShader( "gfx/2d/jsense" ));
|
||||||
cg.drawingHUD = CG_HUD_SCALED;
|
cg.drawingHUD = CG_HUD_SCALED;
|
||||||
CG_DrawHealthBars();
|
CG_DrawHealthBars();
|
||||||
}
|
}
|
||||||
|
|
|
@ -4768,6 +4768,7 @@ extern void ForceSeeing(gentity_t *ent);
|
||||||
extern void ForceTelepathy(gentity_t *ent);
|
extern void ForceTelepathy(gentity_t *ent);
|
||||||
extern void ForceAbsorb(gentity_t *ent);
|
extern void ForceAbsorb(gentity_t *ent);
|
||||||
extern void ForceHeal(gentity_t *ent);
|
extern void ForceHeal(gentity_t *ent);
|
||||||
|
extern void ForceThrowEx( gentity_t *self, qboolean pull, qboolean fake, qboolean aimByViewAngles );
|
||||||
static void ProcessGenericCmd(gentity_t *ent, byte cmd)
|
static void ProcessGenericCmd(gentity_t *ent, byte cmd)
|
||||||
{
|
{
|
||||||
switch(cmd) {
|
switch(cmd) {
|
||||||
|
@ -4780,10 +4781,10 @@ static void ProcessGenericCmd(gentity_t *ent, byte cmd)
|
||||||
ForceSpeed( ent );
|
ForceSpeed( ent );
|
||||||
break;
|
break;
|
||||||
case GENCMD_FORCE_THROW:
|
case GENCMD_FORCE_THROW:
|
||||||
ForceThrow(ent, qfalse);
|
ForceThrowEx(ent, qfalse, qfalse, qtrue);
|
||||||
break;
|
break;
|
||||||
case GENCMD_FORCE_PULL:
|
case GENCMD_FORCE_PULL:
|
||||||
ForceThrow(ent, qtrue);
|
ForceThrowEx(ent, qtrue, qfalse, qtrue);
|
||||||
break;
|
break;
|
||||||
case GENCMD_FORCE_DISTRACT:
|
case GENCMD_FORCE_DISTRACT:
|
||||||
ForceTelepathy(ent);
|
ForceTelepathy(ent);
|
||||||
|
|
|
@ -6459,7 +6459,17 @@ void WP_RunSaber( gentity_t *self, gentity_t *saber )
|
||||||
//figure out where saber should be
|
//figure out where saber should be
|
||||||
vec3_t forward, saberHome, saberDest, fwdangles = {0};
|
vec3_t forward, saberHome, saberDest, fwdangles = {0};
|
||||||
|
|
||||||
|
if (self->client->ps.clientNum == 0 && !cg.renderingThirdPerson)
|
||||||
|
{
|
||||||
|
BG_CalculateVRWeaponPosition(saberHome, fwdangles);
|
||||||
|
|
||||||
|
//Ignore roll
|
||||||
|
fwdangles[ROLL] = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
VectorCopy(self->client->ps.viewangles, fwdangles);
|
VectorCopy(self->client->ps.viewangles, fwdangles);
|
||||||
|
}
|
||||||
|
|
||||||
if ( self->s.number )
|
if ( self->s.number )
|
||||||
{
|
{
|
||||||
fwdangles[0] -= 8;
|
fwdangles[0] -= 8;
|
||||||
|
@ -8942,7 +8952,14 @@ static qboolean ShouldPlayerResistForceThrow( gentity_t *player, gentity_t *atta
|
||||||
return qfalse;
|
return qfalse;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ForceThrowEx( gentity_t *self, qboolean pull, qboolean fake, qboolean aimByViewAngles );
|
||||||
void ForceThrow( gentity_t *self, qboolean pull, qboolean fake )
|
void ForceThrow( gentity_t *self, qboolean pull, qboolean fake )
|
||||||
|
{
|
||||||
|
ForceThrowEx(self, pull, fake, qfalse);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ForceThrowEx( gentity_t *self, qboolean pull, qboolean fake, qboolean aimByViewAngles )
|
||||||
{//FIXME: pass in a target ent so we (an NPC) can push/pull just one targeted ent.
|
{//FIXME: pass in a target ent so we (an NPC) can push/pull just one targeted ent.
|
||||||
//shove things in front of you away
|
//shove things in front of you away
|
||||||
float dist;
|
float dist;
|
||||||
|
@ -9082,6 +9099,21 @@ void ForceThrow( gentity_t *self, qboolean pull, qboolean fake )
|
||||||
|
|
||||||
G_Sound( self, soundIndex );
|
G_Sound( self, soundIndex );
|
||||||
|
|
||||||
|
vec3_t origin, angles;
|
||||||
|
if (self->client->ps.clientNum == 0 && !cg.renderingThirdPerson && !aimByViewAngles)
|
||||||
|
{
|
||||||
|
BG_CalculateVROffHandPosition(origin, fwdangles);
|
||||||
|
AngleVectors( fwdangles, forward, right, NULL );
|
||||||
|
VectorCopy( origin, center );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
VectorCopy( self->client->ps.viewangles, fwdangles );
|
||||||
|
VectorCopy( self->client->renderInfo.eyePoint, origin );
|
||||||
|
AngleVectors( fwdangles, forward, right, NULL );
|
||||||
|
VectorCopy( self->currentOrigin, center );
|
||||||
|
}
|
||||||
|
|
||||||
if ( (!pull && self->client->ps.forcePowersForced&(1<<FP_PUSH))
|
if ( (!pull && self->client->ps.forcePowersForced&(1<<FP_PUSH))
|
||||||
|| (pull && self->client->ps.forcePowersForced&(1<<FP_PULL))
|
|| (pull && self->client->ps.forcePowersForced&(1<<FP_PULL))
|
||||||
|| (pull&&self->client->NPC_class==CLASS_KYLE&&(self->spawnflags&1)&&TIMER_Done( self, "kyleTakesSaber" )) )
|
|| (pull&&self->client->NPC_class==CLASS_KYLE&&(self->spawnflags&1)&&TIMER_Done( self, "kyleTakesSaber" )) )
|
||||||
|
@ -9089,11 +9121,6 @@ void ForceThrow( gentity_t *self, qboolean pull, qboolean fake )
|
||||||
noResist = qtrue;
|
noResist = qtrue;
|
||||||
}
|
}
|
||||||
|
|
||||||
VectorCopy( self->client->ps.viewangles, fwdangles );
|
|
||||||
//fwdangles[1] = self->client->ps.viewangles[1];
|
|
||||||
AngleVectors( fwdangles, forward, right, NULL );
|
|
||||||
VectorCopy( self->currentOrigin, center );
|
|
||||||
|
|
||||||
if ( pull )
|
if ( pull )
|
||||||
{
|
{
|
||||||
cone = forcePullCone[self->client->ps.forcePowerLevel[FP_PULL]];
|
cone = forcePullCone[self->client->ps.forcePowerLevel[FP_PULL]];
|
||||||
|
@ -9105,8 +9132,8 @@ void ForceThrow( gentity_t *self, qboolean pull, qboolean fake )
|
||||||
|
|
||||||
// if ( cone >= 1.0f )
|
// if ( cone >= 1.0f )
|
||||||
{//must be pointing right at them
|
{//must be pointing right at them
|
||||||
VectorMA( self->client->renderInfo.eyePoint, radius, forward, end );
|
VectorMA( origin, 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, (EG2_Collision)0, 0 );//was MASK_SHOT, changed to match crosshair trace
|
gi.trace( &tr, origin, vec3_origin, vec3_origin, end, self->s.number, MASK_OPAQUE|CONTENTS_SOLID|CONTENTS_BODY|CONTENTS_ITEM|CONTENTS_CORPSE, (EG2_Collision)0, 0 );//was MASK_SHOT, changed to match crosshair trace
|
||||||
if ( tr.entityNum < ENTITYNUM_WORLD )
|
if ( tr.entityNum < ENTITYNUM_WORLD )
|
||||||
{//found something right in front of self,
|
{//found something right in front of self,
|
||||||
forwardEnt = &g_entities[tr.entityNum];
|
forwardEnt = &g_entities[tr.entityNum];
|
||||||
|
@ -9235,7 +9262,7 @@ void ForceThrow( gentity_t *self, qboolean pull, qboolean fake )
|
||||||
}
|
}
|
||||||
|
|
||||||
//in PVS?
|
//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
|
{//must be in PVS
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -9243,7 +9270,7 @@ void ForceThrow( gentity_t *self, qboolean pull, qboolean fake )
|
||||||
if ( ent != forwardEnt )
|
if ( ent != forwardEnt )
|
||||||
{//don't need to trace against forwardEnt again
|
{//don't need to trace against forwardEnt again
|
||||||
//really should have a clear LOS to this thing...
|
//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_FORCE_PUSH, (EG2_Collision)0, 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_FORCE_PUSH, (EG2_Collision)0, 0 );//was MASK_SHOT, but changed to match above trace and crosshair trace
|
||||||
if ( tr.fraction < 1.0f && tr.entityNum != ent->s.number )
|
if ( tr.fraction < 1.0f && tr.entityNum != ent->s.number )
|
||||||
{//must have clear LOS
|
{//must have clear LOS
|
||||||
continue;
|
continue;
|
||||||
|
@ -9320,7 +9347,7 @@ void ForceThrow( gentity_t *self, qboolean pull, qboolean fake )
|
||||||
//First, if this is the player we're push/pulling, see if he can counter it
|
//First, if this is the player we're push/pulling, see if he can counter it
|
||||||
if ( modPowerLevel != -1
|
if ( modPowerLevel != -1
|
||||||
&& !noResist
|
&& !noResist
|
||||||
&& InFront( self->currentOrigin, push_list[x]->client->renderInfo.eyePoint, push_list[x]->client->ps.viewangles, 0.3f ) )
|
&& InFront( center, push_list[x]->client->renderInfo.eyePoint, push_list[x]->client->ps.viewangles, 0.3f ) )
|
||||||
{//absorbed and I'm in front of them
|
{//absorbed and I'm in front of them
|
||||||
//counter it
|
//counter it
|
||||||
if ( push_list[x]->client->ps.forcePowerLevel[FP_ABSORB] > FORCE_LEVEL_2 )
|
if ( push_list[x]->client->ps.forcePowerLevel[FP_ABSORB] > FORCE_LEVEL_2 )
|
||||||
|
@ -9366,7 +9393,7 @@ void ForceThrow( gentity_t *self, qboolean pull, qboolean fake )
|
||||||
&& push_list[x]->client->ps.forceRageRecoveryTime < level.time //not recobering from rage
|
&& push_list[x]->client->ps.forceRageRecoveryTime < level.time //not recobering from rage
|
||||||
&& ((self->client->NPC_class != CLASS_DESANN&&Q_stricmp("Yoda",self->NPC_type)) || !Q_irand( 0, 2 ) )//only 30% chance of resisting a Desann push
|
&& ((self->client->NPC_class != CLASS_DESANN&&Q_stricmp("Yoda",self->NPC_type)) || !Q_irand( 0, 2 ) )//only 30% chance of resisting a Desann push
|
||||||
&& push_list[x]->client->ps.groundEntityNum != ENTITYNUM_NONE //on the ground
|
&& push_list[x]->client->ps.groundEntityNum != ENTITYNUM_NONE //on the ground
|
||||||
&& InFront( self->currentOrigin, push_list[x]->currentOrigin, push_list[x]->client->ps.viewangles, 0.3f ) //I'm in front of him
|
&& InFront( center, push_list[x]->currentOrigin, push_list[x]->client->ps.viewangles, 0.3f ) //I'm in front of him
|
||||||
&& ( push_list[x]->client->ps.powerups[PW_FORCE_PUSH] > level.time ||//he's pushing too
|
&& ( push_list[x]->client->ps.powerups[PW_FORCE_PUSH] > level.time ||//he's pushing too
|
||||||
(push_list[x]->s.number != 0 && push_list[x]->client->ps.weaponTime < level.time)//not the player and not attacking (NPC jedi auto-defend against pushes)
|
(push_list[x]->s.number != 0 && push_list[x]->client->ps.weaponTime < level.time)//not the player and not attacking (NPC jedi auto-defend against pushes)
|
||||||
)
|
)
|
||||||
|
@ -9441,7 +9468,7 @@ void ForceThrow( gentity_t *self, qboolean pull, qboolean fake )
|
||||||
}
|
}
|
||||||
if ( pull )
|
if ( pull )
|
||||||
{
|
{
|
||||||
VectorSubtract( self->currentOrigin, push_list[x]->currentOrigin, pushDir );
|
VectorSubtract( center, push_list[x]->currentOrigin, pushDir );
|
||||||
if ( self->client->ps.forcePowerLevel[FP_PULL] >= FORCE_LEVEL_3
|
if ( self->client->ps.forcePowerLevel[FP_PULL] >= FORCE_LEVEL_3
|
||||||
&& self->client->NPC_class == CLASS_KYLE
|
&& self->client->NPC_class == CLASS_KYLE
|
||||||
&& (self->spawnflags&1)
|
&& (self->spawnflags&1)
|
||||||
|
@ -9491,7 +9518,7 @@ void ForceThrow( gentity_t *self, qboolean pull, qboolean fake )
|
||||||
)
|
)
|
||||||
{//yank the weapon - NOTE: level 1 just knocks them down, not take weapon
|
{//yank the weapon - NOTE: level 1 just knocks them down, not take weapon
|
||||||
//FIXME: weapon yank anim if not a knockdown?
|
//FIXME: weapon yank anim if not a knockdown?
|
||||||
if ( InFront( self->currentOrigin, push_list[x]->currentOrigin, push_list[x]->client->ps.viewangles, 0.0f ) )
|
if ( InFront( center, push_list[x]->currentOrigin, push_list[x]->client->ps.viewangles, 0.0f ) )
|
||||||
{//enemy has to be facing me, too...
|
{//enemy has to be facing me, too...
|
||||||
WP_DropWeapon( push_list[x], pushDir );
|
WP_DropWeapon( push_list[x], pushDir );
|
||||||
}
|
}
|
||||||
|
@ -9508,7 +9535,7 @@ void ForceThrow( gentity_t *self, qboolean pull, qboolean fake )
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
VectorSubtract( push_list[x]->currentOrigin, self->currentOrigin, pushDir );
|
VectorSubtract( push_list[x]->currentOrigin, center, pushDir );
|
||||||
knockback -= VectorNormalize( pushDir );
|
knockback -= VectorNormalize( pushDir );
|
||||||
if ( knockback < 100 )
|
if ( knockback < 100 )
|
||||||
{
|
{
|
||||||
|
@ -9609,7 +9636,7 @@ void ForceThrow( gentity_t *self, qboolean pull, qboolean fake )
|
||||||
&& (push_list[x]->s.pos.trType != TR_INTERPOLATE||push_list[x]->s.weapon != WP_THERMAL) )//rolling and stationary thermal detonators are dealt with below
|
&& (push_list[x]->s.pos.trType != TR_INTERPOLATE||push_list[x]->s.weapon != WP_THERMAL) )//rolling and stationary thermal detonators are dealt with below
|
||||||
{
|
{
|
||||||
vec3_t dir2Me;
|
vec3_t dir2Me;
|
||||||
VectorSubtract( self->currentOrigin, push_list[x]->currentOrigin, dir2Me );
|
VectorSubtract( center, push_list[x]->currentOrigin, dir2Me );
|
||||||
float dot = DotProduct( push_list[x]->s.pos.trDelta, dir2Me );
|
float dot = DotProduct( push_list[x]->s.pos.trDelta, dir2Me );
|
||||||
if ( pull )
|
if ( pull )
|
||||||
{//deflect rather than reflect?
|
{//deflect rather than reflect?
|
||||||
|
@ -9651,10 +9678,10 @@ void ForceThrow( gentity_t *self, qboolean pull, qboolean fake )
|
||||||
vec3_t pushDir;
|
vec3_t pushDir;
|
||||||
float damage = 800;
|
float damage = 800;
|
||||||
|
|
||||||
AngleVectors( self->client->ps.viewangles, forward, NULL, NULL );
|
AngleVectors( fwdangles, forward, NULL, NULL );
|
||||||
VectorNormalize( forward );
|
VectorNormalize( forward );
|
||||||
VectorMA( self->client->renderInfo.eyePoint, radius, forward, end );
|
VectorMA( origin, radius, forward, end );
|
||||||
gi.trace( &tr, self->client->renderInfo.eyePoint, vec3_origin, vec3_origin, end, self->s.number, MASK_SHOT, (EG2_Collision)0, 0 );
|
gi.trace( &tr, origin, vec3_origin, vec3_origin, end, self->s.number, MASK_SHOT, (EG2_Collision)0, 0 );
|
||||||
if ( tr.entityNum != push_list[x]->s.number || tr.fraction == 1.0 || tr.allsolid || tr.startsolid )
|
if ( tr.entityNum != push_list[x]->s.number || tr.fraction == 1.0 || tr.allsolid || tr.startsolid )
|
||||||
{//must be pointing right at it
|
{//must be pointing right at it
|
||||||
continue;
|
continue;
|
||||||
|
@ -9662,22 +9689,22 @@ void ForceThrow( gentity_t *self, qboolean pull, qboolean fake )
|
||||||
|
|
||||||
if ( pull )
|
if ( pull )
|
||||||
{
|
{
|
||||||
VectorSubtract( self->client->renderInfo.eyePoint, tr.endpos, pushDir );
|
VectorSubtract( origin, tr.endpos, pushDir );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
VectorSubtract( tr.endpos, self->client->renderInfo.eyePoint, pushDir );
|
VectorSubtract( tr.endpos, origin, pushDir );
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
VectorSubtract( push_list[x]->absmax, push_list[x]->absmin, size );
|
VectorSubtract( push_list[x]->absmax, push_list[x]->absmin, size );
|
||||||
VectorMA( push_list[x]->absmin, 0.5, size, center );
|
VectorMA( push_list[x]->absmin, 0.5, size, center );
|
||||||
if ( pull )
|
if ( pull )
|
||||||
{
|
{
|
||||||
VectorSubtract( self->client->renderInfo.eyePoint, center, pushDir );
|
VectorSubtract( origin, center, pushDir );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
VectorSubtract( center, self->client->renderInfo.eyePoint, pushDir );
|
VectorSubtract( center, origin, pushDir );
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
damage -= VectorNormalize( pushDir );
|
damage -= VectorNormalize( pushDir );
|
||||||
|
@ -9712,10 +9739,10 @@ void ForceThrow( gentity_t *self, qboolean pull, qboolean fake )
|
||||||
{//push/pull the door
|
{//push/pull the door
|
||||||
vec3_t pos1, pos2;
|
vec3_t pos1, pos2;
|
||||||
|
|
||||||
AngleVectors( self->client->ps.viewangles, forward, NULL, NULL );
|
AngleVectors( fwdangles, forward, NULL, NULL );
|
||||||
VectorNormalize( forward );
|
VectorNormalize( forward );
|
||||||
VectorMA( self->client->renderInfo.eyePoint, radius, forward, end );
|
VectorMA( origin, radius, forward, end );
|
||||||
gi.trace( &tr, self->client->renderInfo.eyePoint, vec3_origin, vec3_origin, end, self->s.number, MASK_SHOT, (EG2_Collision)0, 0 );
|
gi.trace( &tr, origin, vec3_origin, vec3_origin, end, self->s.number, MASK_SHOT, (EG2_Collision)0, 0 );
|
||||||
if ( tr.entityNum != push_list[x]->s.number || tr.fraction == 1.0 || tr.allsolid || tr.startsolid )
|
if ( tr.entityNum != push_list[x]->s.number || tr.fraction == 1.0 || tr.allsolid || tr.startsolid )
|
||||||
{//must be pointing right at it
|
{//must be pointing right at it
|
||||||
continue;
|
continue;
|
||||||
|
@ -9743,7 +9770,7 @@ void ForceThrow( gentity_t *self, qboolean pull, qboolean fake )
|
||||||
VectorCopy( push_list[x]->pos2, pos2 );
|
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
|
{//pos1 is closer
|
||||||
if ( push_list[x]->moverState == MOVER_POS1 )
|
if ( push_list[x]->moverState == MOVER_POS1 )
|
||||||
{//at the closest pos
|
{//at the closest pos
|
||||||
|
@ -9792,15 +9819,15 @@ void ForceThrow( gentity_t *self, qboolean pull, qboolean fake )
|
||||||
if ( push_list[x]->s.eType == ET_ITEM )
|
if ( push_list[x]->s.eType == ET_ITEM )
|
||||||
{//pull it to a little higher point
|
{//pull it to a little higher point
|
||||||
vec3_t adjustedOrg;
|
vec3_t adjustedOrg;
|
||||||
VectorCopy( self->currentOrigin, adjustedOrg );
|
VectorCopy( center, adjustedOrg );
|
||||||
adjustedOrg[2] += self->maxs[2]/3;
|
adjustedOrg[2] += self->maxs[2]/3;
|
||||||
VectorSubtract( adjustedOrg, push_list[x]->currentOrigin, pushDir );
|
VectorSubtract( adjustedOrg, push_list[x]->currentOrigin, pushDir );
|
||||||
}
|
}
|
||||||
else if ( self->enemy //I have an enemy
|
else if ( self->enemy //I have an enemy
|
||||||
//&& push_list[x]->s.eType != ET_ITEM //not an item
|
//&& push_list[x]->s.eType != ET_ITEM //not an item
|
||||||
&& self->client->ps.forcePowerLevel[FP_PUSH] > FORCE_LEVEL_2 //have push 3 or greater
|
&& self->client->ps.forcePowerLevel[FP_PUSH] > FORCE_LEVEL_2 //have push 3 or greater
|
||||||
&& InFront(push_list[x]->currentOrigin, self->currentOrigin, self->currentAngles, 0.25f)//object is generally in front of me
|
&& InFront(push_list[x]->currentOrigin, center, self->currentAngles, 0.25f)//object is generally in front of me
|
||||||
&& InFront(self->enemy->currentOrigin, self->currentOrigin, self->currentAngles, 0.75f)//enemy is pretty much right in front of me
|
&& InFront(self->enemy->currentOrigin, center, self->currentAngles, 0.75f)//enemy is pretty much right in front of me
|
||||||
&& !InFront(push_list[x]->currentOrigin, self->enemy->currentOrigin, self->enemy->currentAngles, -0.25f)//object is generally behind enemy
|
&& !InFront(push_list[x]->currentOrigin, self->enemy->currentOrigin, self->enemy->currentAngles, -0.25f)//object is generally behind enemy
|
||||||
//FIXME: check dist to enemy and clear LOS to enemy and clear Path between object and enemy?
|
//FIXME: check dist to enemy and clear LOS to enemy and clear Path between object and enemy?
|
||||||
&& ( (self->NPC&&(noResist||Q_irand(0,RANK_CAPTAIN)<self->NPC->rank) )//NPC with enough skill
|
&& ( (self->NPC&&(noResist||Q_irand(0,RANK_CAPTAIN)<self->NPC->rank) )//NPC with enough skill
|
||||||
|
@ -9819,7 +9846,7 @@ void ForceThrow( gentity_t *self, qboolean pull, qboolean fake )
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
VectorSubtract( self->currentOrigin, push_list[x]->currentOrigin, pushDir );
|
VectorSubtract( center, push_list[x]->currentOrigin, pushDir );
|
||||||
}
|
}
|
||||||
knockback += VectorNormalize( pushDir );
|
knockback += VectorNormalize( pushDir );
|
||||||
if ( knockback > 200 )
|
if ( knockback > 200 )
|
||||||
|
@ -9846,8 +9873,8 @@ void ForceThrow( gentity_t *self, qboolean pull, qboolean fake )
|
||||||
if ( self->enemy //I have an enemy
|
if ( self->enemy //I have an enemy
|
||||||
&& push_list[x]->s.eType != ET_ITEM //not an item
|
&& push_list[x]->s.eType != ET_ITEM //not an item
|
||||||
&& self->client->ps.forcePowerLevel[FP_PUSH] > FORCE_LEVEL_2 //have push 3 or greater
|
&& self->client->ps.forcePowerLevel[FP_PUSH] > FORCE_LEVEL_2 //have push 3 or greater
|
||||||
&& InFront(push_list[x]->currentOrigin, self->currentOrigin, self->currentAngles, 0.25f)//object is generally in front of me
|
&& InFront(push_list[x]->currentOrigin, center, self->currentAngles, 0.25f)//object is generally in front of me
|
||||||
&& InFront(self->enemy->currentOrigin, self->currentOrigin, self->currentAngles, 0.75f)//enemy is pretty much right in front of me
|
&& InFront(self->enemy->currentOrigin, center, self->currentAngles, 0.75f)//enemy is pretty much right in front of me
|
||||||
&& InFront(push_list[x]->currentOrigin, self->enemy->currentOrigin, self->enemy->currentAngles, 0.25f)//object is generally in front of enemy
|
&& InFront(push_list[x]->currentOrigin, self->enemy->currentOrigin, self->enemy->currentAngles, 0.25f)//object is generally in front of enemy
|
||||||
//FIXME: check dist to enemy and clear LOS to enemy and clear Path between object and enemy?
|
//FIXME: check dist to enemy and clear LOS to enemy and clear Path between object and enemy?
|
||||||
&& ( (self->NPC&&(noResist||Q_irand(0,RANK_CAPTAIN)<self->NPC->rank) )//NPC with enough skill
|
&& ( (self->NPC&&(noResist||Q_irand(0,RANK_CAPTAIN)<self->NPC->rank) )//NPC with enough skill
|
||||||
|
@ -9866,7 +9893,7 @@ void ForceThrow( gentity_t *self, qboolean pull, qboolean fake )
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
VectorSubtract( push_list[x]->currentOrigin, self->currentOrigin, pushDir );
|
VectorSubtract( push_list[x]->currentOrigin, center, pushDir );
|
||||||
}
|
}
|
||||||
knockback -= VectorNormalize( pushDir );
|
knockback -= VectorNormalize( pushDir );
|
||||||
if ( knockback < 100 )
|
if ( knockback < 100 )
|
||||||
|
@ -10344,9 +10371,20 @@ void ForceTelepathy( gentity_t *self )
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vec3_t origin, angles;
|
||||||
|
if (self->client->ps.clientNum == 0 && !cg.renderingThirdPerson)
|
||||||
|
{
|
||||||
|
BG_CalculateVROffHandPosition(origin, angles);
|
||||||
|
AngleVectors(angles, forward, NULL, NULL);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
AngleVectors(self->client->ps.viewangles, forward, NULL, NULL);
|
AngleVectors(self->client->ps.viewangles, forward, NULL, NULL);
|
||||||
|
VectorCopy(self->client->ps.viewangles, angles);
|
||||||
|
VectorCopy(self->client->renderInfo.eyePoint, origin);
|
||||||
|
}
|
||||||
VectorNormalize( forward );
|
VectorNormalize( forward );
|
||||||
VectorMA( self->client->renderInfo.eyePoint, 2048, forward, end );
|
VectorMA( origin, 2048, forward, end );
|
||||||
|
|
||||||
//Cause a distraction if enemy is not fighting
|
//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, (EG2_Collision)0, 0 );
|
gi.trace( &tr, self->client->renderInfo.eyePoint, vec3_origin, vec3_origin, end, self->s.number, MASK_OPAQUE|CONTENTS_BODY, (EG2_Collision)0, 0 );
|
||||||
|
@ -10592,7 +10630,19 @@ void ForceGrip( gentity_t *self )
|
||||||
self->client->ps.weaponTime = floor( self->client->ps.weaponTime * g_timescale->value );
|
self->client->ps.weaponTime = floor( self->client->ps.weaponTime * g_timescale->value );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vec3_t origin, angles;
|
||||||
|
if (self->client->ps.clientNum == 0 && !cg.renderingThirdPerson)
|
||||||
|
{
|
||||||
|
BG_CalculateVROffHandPosition(origin, angles);
|
||||||
|
AngleVectors(angles, forward, NULL, NULL);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
AngleVectors(self->client->ps.viewangles, forward, NULL, NULL);
|
AngleVectors(self->client->ps.viewangles, forward, NULL, NULL);
|
||||||
|
VectorCopy(self->client->ps.viewangles, angles);
|
||||||
|
VectorCopy(self->client->renderInfo.eyePoint, origin);
|
||||||
|
}
|
||||||
|
|
||||||
VectorNormalize( forward );
|
VectorNormalize( forward );
|
||||||
VectorMA( self->client->renderInfo.handLPoint, FORCE_GRIP_DIST, forward, end );
|
VectorMA( self->client->renderInfo.handLPoint, FORCE_GRIP_DIST, forward, end );
|
||||||
|
|
||||||
|
@ -10608,11 +10658,11 @@ void ForceGrip( gentity_t *self )
|
||||||
{//player needs to be facing more directly
|
{//player needs to be facing more directly
|
||||||
minDot = 0.2f;
|
minDot = 0.2f;
|
||||||
}
|
}
|
||||||
if ( InFront( self->enemy->currentOrigin, self->client->renderInfo.eyePoint, self->client->ps.viewangles, minDot ) ) //self->s.number || //NPCs can always lift enemy since we assume they're looking at them...?
|
if ( InFront( self->enemy->currentOrigin, origin, angles, minDot ) ) //self->s.number || //NPCs can always lift enemy since we assume they're looking at them...?
|
||||||
{//need to be facing the enemy
|
{//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
|
{//must be in PVS
|
||||||
gi.trace( &tr, self->client->renderInfo.eyePoint, vec3_origin, vec3_origin, self->enemy->currentOrigin, self->s.number, MASK_SHOT, (EG2_Collision)0, 0 );
|
gi.trace( &tr, origin, vec3_origin, vec3_origin, self->enemy->currentOrigin, self->s.number, MASK_SHOT, (EG2_Collision)0, 0 );
|
||||||
if ( tr.fraction == 1.0f || tr.entityNum == self->enemy->s.number )
|
if ( tr.fraction == 1.0f || tr.entityNum == self->enemy->s.number )
|
||||||
{//must have clear LOS
|
{//must have clear LOS
|
||||||
traceEnt = self->enemy;
|
traceEnt = self->enemy;
|
||||||
|
@ -10674,7 +10724,7 @@ void ForceGrip( gentity_t *self )
|
||||||
if ( !Q_stricmp("Yoda",traceEnt->NPC_type) )
|
if ( !Q_stricmp("Yoda",traceEnt->NPC_type) )
|
||||||
{
|
{
|
||||||
Jedi_PlayDeflectSound( traceEnt );
|
Jedi_PlayDeflectSound( traceEnt );
|
||||||
ForceThrow( traceEnt, qfalse );
|
ForceThrowEx( traceEnt, qfalse, qfalse, qtrue );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10729,7 +10779,7 @@ void ForceGrip( gentity_t *self )
|
||||||
case CLASS_TAVION:
|
case CLASS_TAVION:
|
||||||
case CLASS_LUKE:
|
case CLASS_LUKE:
|
||||||
Jedi_PlayDeflectSound( traceEnt );
|
Jedi_PlayDeflectSound( traceEnt );
|
||||||
ForceThrow( traceEnt, qfalse );
|
ForceThrowEx( traceEnt, qfalse, qfalse, qtrue );
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
case CLASS_REBORN:
|
case CLASS_REBORN:
|
||||||
|
@ -10739,7 +10789,7 @@ void ForceGrip( gentity_t *self )
|
||||||
if ( traceEnt->NPC && traceEnt->NPC->rank > RANK_CIVILIAN && self->client->ps.forcePowerLevel[FP_GRIP] < FORCE_LEVEL_2 )
|
if ( traceEnt->NPC && traceEnt->NPC->rank > RANK_CIVILIAN && self->client->ps.forcePowerLevel[FP_GRIP] < FORCE_LEVEL_2 )
|
||||||
{
|
{
|
||||||
Jedi_PlayDeflectSound( traceEnt );
|
Jedi_PlayDeflectSound( traceEnt );
|
||||||
ForceThrow( traceEnt, qfalse );
|
ForceThrowEx( traceEnt, qfalse, qfalse, qtrue );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -11445,12 +11495,23 @@ qboolean ForceDrain2( gentity_t *self )
|
||||||
}
|
}
|
||||||
|
|
||||||
//Cause choking anim + health drain in ent in front of me
|
//Cause choking anim + health drain in ent in front of me
|
||||||
|
vec3_t origin, angles;
|
||||||
|
if (self->client->ps.clientNum == 0 && !cg.renderingThirdPerson)
|
||||||
|
{
|
||||||
|
BG_CalculateVROffHandPosition(origin, angles);
|
||||||
|
AngleVectors(angles, forward, NULL, NULL);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
AngleVectors(self->client->ps.viewangles, forward, NULL, NULL);
|
AngleVectors(self->client->ps.viewangles, forward, NULL, NULL);
|
||||||
|
VectorCopy(self->client->ps.viewangles, angles);
|
||||||
|
VectorCopy(self->client->renderInfo.eyePoint, origin);
|
||||||
|
}
|
||||||
VectorNormalize( forward );
|
VectorNormalize( forward );
|
||||||
VectorMA( self->client->renderInfo.eyePoint, FORCE_DRAIN_DIST, forward, end );
|
VectorMA( origin, FORCE_DRAIN_DIST, forward, end );
|
||||||
|
|
||||||
//okay, trace straight ahead and see what's there
|
//okay, trace straight ahead and see what's there
|
||||||
gi.trace( &tr, self->client->renderInfo.eyePoint, vec3_origin, vec3_origin, end, self->s.number, MASK_SHOT, (EG2_Collision)0, 0 );
|
gi.trace( &tr, origin, vec3_origin, vec3_origin, end, self->s.number, MASK_SHOT, (EG2_Collision)0, 0 );
|
||||||
if ( tr.entityNum >= ENTITYNUM_WORLD || tr.fraction == 1.0 || tr.allsolid || tr.startsolid )
|
if ( tr.entityNum >= ENTITYNUM_WORLD || tr.fraction == 1.0 || tr.allsolid || tr.startsolid )
|
||||||
{
|
{
|
||||||
return qfalse;
|
return qfalse;
|
||||||
|
@ -11474,7 +11535,7 @@ qboolean ForceDrain2( gentity_t *self )
|
||||||
if ( !Q_stricmp("Yoda",traceEnt->NPC_type) )
|
if ( !Q_stricmp("Yoda",traceEnt->NPC_type) )
|
||||||
{
|
{
|
||||||
Jedi_PlayDeflectSound( traceEnt );
|
Jedi_PlayDeflectSound( traceEnt );
|
||||||
ForceThrow( traceEnt, qfalse );
|
ForceThrowEx( traceEnt, qfalse, qfalse, qtrue );
|
||||||
return qtrue;
|
return qtrue;
|
||||||
}
|
}
|
||||||
switch ( traceEnt->client->NPC_class )
|
switch ( traceEnt->client->NPC_class )
|
||||||
|
@ -11514,7 +11575,7 @@ qboolean ForceDrain2( gentity_t *self )
|
||||||
case CLASS_TAVION:
|
case CLASS_TAVION:
|
||||||
case CLASS_LUKE:
|
case CLASS_LUKE:
|
||||||
Jedi_PlayDeflectSound( traceEnt );
|
Jedi_PlayDeflectSound( traceEnt );
|
||||||
ForceThrow( traceEnt, qfalse );
|
ForceThrowEx( traceEnt, qfalse, qfalse, qtrue );
|
||||||
return qtrue;
|
return qtrue;
|
||||||
break;
|
break;
|
||||||
case CLASS_REBORN:
|
case CLASS_REBORN:
|
||||||
|
@ -11528,7 +11589,7 @@ qboolean ForceDrain2( gentity_t *self )
|
||||||
{
|
{
|
||||||
ForceDrainGrabStart( self );
|
ForceDrainGrabStart( self );
|
||||||
Jedi_PlayDeflectSound( traceEnt );
|
Jedi_PlayDeflectSound( traceEnt );
|
||||||
ForceThrow( traceEnt, qfalse );
|
ForceThrowEx( traceEnt, qfalse, qfalse, qtrue );
|
||||||
return qtrue;
|
return qtrue;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -11837,7 +11898,7 @@ qboolean WP_CheckForceDraineeStopMe( gentity_t *self, gentity_t *drainee )
|
||||||
&& level.time-(self->client->ps.forcePowerDebounce[FP_DRAIN]>self->client->ps.forcePowerLevel[FP_DRAIN]*500)//at level 1, I always get at least 500ms of drain, at level 3 I get 1500ms
|
&& level.time-(self->client->ps.forcePowerDebounce[FP_DRAIN]>self->client->ps.forcePowerLevel[FP_DRAIN]*500)//at level 1, I always get at least 500ms of drain, at level 3 I get 1500ms
|
||||||
&& !Q_irand( 0, 100-(drainee->NPC->stats.evasion*10)-(g_spskill->integer*12) ) )
|
&& !Q_irand( 0, 100-(drainee->NPC->stats.evasion*10)-(g_spskill->integer*12) ) )
|
||||||
{//a jedi who broke free
|
{//a jedi who broke free
|
||||||
ForceThrow( drainee, qfalse );
|
ForceThrowEx( drainee, qfalse, qfalse, qtrue );
|
||||||
//FIXME: I need to go into some pushed back anim...
|
//FIXME: I need to go into some pushed back anim...
|
||||||
WP_ForcePowerStop( self, FP_DRAIN );
|
WP_ForcePowerStop( self, FP_DRAIN );
|
||||||
//can't drain again for 2 seconds
|
//can't drain again for 2 seconds
|
||||||
|
@ -11859,11 +11920,21 @@ void ForceShootDrain( gentity_t *self )
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( self->client->ps.forcePowerDebounce[FP_DRAIN] <= level.time )
|
vec3_t origin, angles;
|
||||||
|
if (self->client->ps.clientNum == 0 && !cg.renderingThirdPerson)
|
||||||
|
{
|
||||||
|
BG_CalculateVROffHandPosition(origin, angles);
|
||||||
|
AngleVectors(angles, forward, NULL, NULL);
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
AngleVectors( self->client->ps.viewangles, forward, NULL, NULL);
|
AngleVectors( self->client->ps.viewangles, forward, NULL, NULL);
|
||||||
|
VectorCopy( self->client->ps.origin, origin );
|
||||||
|
}
|
||||||
VectorNormalize( forward );
|
VectorNormalize( forward );
|
||||||
|
|
||||||
|
if ( self->client->ps.forcePowerDebounce[FP_DRAIN] <= level.time )
|
||||||
|
{
|
||||||
if ( self->client->ps.forcePowerLevel[FP_DRAIN] > FORCE_LEVEL_2 )
|
if ( self->client->ps.forcePowerLevel[FP_DRAIN] > FORCE_LEVEL_2 )
|
||||||
{//arc
|
{//arc
|
||||||
vec3_t center, mins, maxs, dir, ent_org, size, v;
|
vec3_t center, mins, maxs, dir, ent_org, size, v;
|
||||||
|
@ -11871,7 +11942,7 @@ void ForceShootDrain( gentity_t *self )
|
||||||
gentity_t *entityList[MAX_GENTITIES];
|
gentity_t *entityList[MAX_GENTITIES];
|
||||||
int e, numListedEntities, i;
|
int e, numListedEntities, i;
|
||||||
|
|
||||||
VectorCopy( self->client->ps.origin, center );
|
VectorCopy( origin, center );
|
||||||
for ( i = 0 ; i < 3 ; i++ )
|
for ( i = 0 ; i < 3 ; i++ )
|
||||||
{
|
{
|
||||||
mins[i] = center[i] - radius;
|
mins[i] = center[i] - radius;
|
||||||
|
@ -11944,7 +12015,7 @@ void ForceShootDrain( gentity_t *self )
|
||||||
}
|
}
|
||||||
|
|
||||||
//Now check and see if we can actually hit it
|
//Now check and see if we can actually hit it
|
||||||
gi.trace( &tr, self->client->ps.origin, vec3_origin, vec3_origin, ent_org, self->s.number, MASK_SHOT, G2_RETURNONHIT, 10 );
|
gi.trace( &tr, origin, vec3_origin, vec3_origin, ent_org, self->s.number, MASK_SHOT, G2_RETURNONHIT, 10 );
|
||||||
if ( tr.fraction < 1.0f && tr.entityNum != traceEnt->s.number )
|
if ( tr.fraction < 1.0f && tr.entityNum != traceEnt->s.number )
|
||||||
{//must have clear LOS
|
{//must have clear LOS
|
||||||
continue;
|
continue;
|
||||||
|
@ -12039,6 +12110,19 @@ void ForceDrainEnt( gentity_t *self, gentity_t *drainEnt )
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vec3_t origin, angles, fwd;
|
||||||
|
if (self->client->ps.clientNum == 0 && !cg.renderingThirdPerson)
|
||||||
|
{
|
||||||
|
BG_CalculateVROffHandPosition(origin, angles);
|
||||||
|
AngleVectors(angles, fwd, NULL, NULL);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
AngleVectors( self->client->ps.viewangles, fwd, NULL, NULL);
|
||||||
|
VectorCopy( self->client->ps.origin, origin );
|
||||||
|
}
|
||||||
|
VectorNormalize( fwd );
|
||||||
|
|
||||||
if ( self->client->ps.forcePowerDebounce[FP_DRAIN] <= level.time )
|
if ( self->client->ps.forcePowerDebounce[FP_DRAIN] <= level.time )
|
||||||
{
|
{
|
||||||
if ( !drainEnt )
|
if ( !drainEnt )
|
||||||
|
@ -12056,9 +12140,6 @@ void ForceDrainEnt( gentity_t *self, gentity_t *drainEnt )
|
||||||
if (OnSameTeam(self, drainEnt))
|
if (OnSameTeam(self, drainEnt))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
vec3_t fwd;
|
|
||||||
AngleVectors( self->client->ps.viewangles, fwd, NULL, NULL );
|
|
||||||
|
|
||||||
drainEnt->painDebounceTime = 0;
|
drainEnt->painDebounceTime = 0;
|
||||||
ForceDrainDamage( self, drainEnt, fwd, drainEnt->currentOrigin );
|
ForceDrainDamage( self, drainEnt, fwd, drainEnt->currentOrigin );
|
||||||
drainEnt->painDebounceTime = level.time + 2000;
|
drainEnt->painDebounceTime = level.time + 2000;
|
||||||
|
@ -13375,7 +13456,7 @@ void WP_ForceForceThrow( gentity_t *thrower )
|
||||||
relock = qtrue;
|
relock = qtrue;
|
||||||
}
|
}
|
||||||
|
|
||||||
ForceThrow( thrower, qfalse );
|
ForceThrowEx( thrower, qfalse, qfalse, qtrue );
|
||||||
|
|
||||||
if ( relock )
|
if ( relock )
|
||||||
{
|
{
|
||||||
|
@ -13634,8 +13715,19 @@ static void WP_ForcePowerRun( gentity_t *self, forcePowers_t forcePower, usercmd
|
||||||
self->client->ps.torsoAnimTimer = 100;
|
self->client->ps.torsoAnimTimer = 100;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool isFirstPersonPlayer = (self->client->ps.clientNum == 0 && !cg.renderingThirdPerson);
|
||||||
//get their org
|
//get their org
|
||||||
|
if (isFirstPersonPlayer)
|
||||||
|
{
|
||||||
|
vec3_t origin;
|
||||||
|
BG_CalculateVROffHandPosition(origin, angles);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
VectorCopy( self->client->ps.viewangles, angles );
|
VectorCopy( self->client->ps.viewangles, angles );
|
||||||
|
}
|
||||||
|
|
||||||
angles[0] -= 10;
|
angles[0] -= 10;
|
||||||
AngleVectors( angles, dir, NULL, NULL );
|
AngleVectors( angles, dir, NULL, NULL );
|
||||||
if ( gripEnt->client )
|
if ( gripEnt->client )
|
||||||
|
@ -13647,6 +13739,15 @@ static void WP_ForcePowerRun( gentity_t *self, forcePowers_t forcePower, usercmd
|
||||||
VectorCopy( gripEnt->currentOrigin, gripEntOrg );
|
VectorCopy( gripEnt->currentOrigin, gripEntOrg );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isFirstPersonPlayer &&
|
||||||
|
self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_2 &&
|
||||||
|
self->client->ps.forceGripEntityInitialDist == ENTITYNUM_NONE)
|
||||||
|
{
|
||||||
|
vec3_t diff;
|
||||||
|
VectorSubtract(vr->offhandposition[0], vr->hmdposition, diff);
|
||||||
|
self->client->ps.forceGripEntityInitialDist = VectorLength(diff);
|
||||||
|
}
|
||||||
|
|
||||||
//how far are they
|
//how far are they
|
||||||
dist = Distance( self->client->renderInfo.handLPoint, gripEntOrg );
|
dist = Distance( self->client->renderInfo.handLPoint, gripEntOrg );
|
||||||
if ( self->client->ps.forcePowerLevel[FP_GRIP] == FORCE_LEVEL_2 &&
|
if ( self->client->ps.forcePowerLevel[FP_GRIP] == FORCE_LEVEL_2 &&
|
||||||
|
@ -13661,6 +13762,22 @@ static void WP_ForcePowerRun( gentity_t *self, forcePowers_t forcePower, usercmd
|
||||||
if ( self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_2
|
if ( self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_2
|
||||||
&& (!gripEnt->client || (!gripEnt->message&&!(gripEnt->flags&FL_NO_KNOCKBACK))) )
|
&& (!gripEnt->client || (!gripEnt->message&&!(gripEnt->flags&FL_NO_KNOCKBACK))) )
|
||||||
{//carry
|
{//carry
|
||||||
|
if (isFirstPersonPlayer) {
|
||||||
|
vec3_t diff;
|
||||||
|
VectorSubtract(vr->offhandposition[0], vr->hmdposition, diff);
|
||||||
|
float length = VectorLength(diff);
|
||||||
|
float movedLength = (length - self->client->ps.forceGripEntityInitialDist) * cg_worldScale.value;
|
||||||
|
if (fabs(movedLength) > 1.0f) {
|
||||||
|
dist += movedLength * 5.0f;
|
||||||
|
}
|
||||||
|
if (dist > 384) {
|
||||||
|
dist = 384;
|
||||||
|
} else if (dist < 32) {
|
||||||
|
dist = 32;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
//cap dist
|
//cap dist
|
||||||
if (dist > FORCE_GRIP_3_MAX_DIST)
|
if (dist > FORCE_GRIP_3_MAX_DIST)
|
||||||
{
|
{
|
||||||
|
@ -13670,6 +13787,8 @@ static void WP_ForcePowerRun( gentity_t *self, forcePowers_t forcePower, usercmd
|
||||||
{
|
{
|
||||||
dist = FORCE_GRIP_3_MIN_DIST;
|
dist = FORCE_GRIP_3_MIN_DIST;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
VectorMA( self->client->renderInfo.handLPoint, dist, dir, gripOrg );
|
VectorMA( self->client->renderInfo.handLPoint, dist, dir, gripOrg );
|
||||||
}
|
}
|
||||||
else if ( self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1 )
|
else if ( self->client->ps.forcePowerLevel[FP_GRIP] > FORCE_LEVEL_1 )
|
||||||
|
@ -14229,12 +14348,12 @@ void WP_CheckForcedPowers( gentity_t *self, usercmd_t *ucmd )
|
||||||
self->client->ps.forcePowersForced &= ~(1<<forcePower);
|
self->client->ps.forcePowersForced &= ~(1<<forcePower);
|
||||||
break;
|
break;
|
||||||
case FP_PUSH:
|
case FP_PUSH:
|
||||||
ForceThrow( self, qfalse );
|
ForceThrowEx( self, qfalse, qfalse, qtrue );
|
||||||
//do only once
|
//do only once
|
||||||
self->client->ps.forcePowersForced &= ~(1<<forcePower);
|
self->client->ps.forcePowersForced &= ~(1<<forcePower);
|
||||||
break;
|
break;
|
||||||
case FP_PULL:
|
case FP_PULL:
|
||||||
ForceThrow( self, qtrue );
|
ForceThrowEx( self, qtrue, qfalse, qtrue );
|
||||||
//do only once
|
//do only once
|
||||||
self->client->ps.forcePowersForced &= ~(1<<forcePower);
|
self->client->ps.forcePowersForced &= ~(1<<forcePower);
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in a new issue