From 06af8b2696ba8d56205208faa93d4bcf3b388956 Mon Sep 17 00:00:00 2001 From: Grant Bagwell Date: Tue, 22 Dec 2020 18:47:20 +0100 Subject: [PATCH] Half a fix of Rockets --- .../Android/jni/Doom3Quest/VrInputDefault.c | 11 +- .../neo/game/Player.cpp | 237 +++++++++--------- .../neo/game/Projectile.cpp | 60 ++++- .../neo/game/Projectile.h | 6 + .../neo/game/Weapon.cpp | 2 +- .../neo/game/ai/AI.cpp | 48 ++-- .../neo/idlib/math/Vector.h | 4 + 7 files changed, 228 insertions(+), 140 deletions(-) diff --git a/Projects/Android/jni/Doom3Quest/VrInputDefault.c b/Projects/Android/jni/Doom3Quest/VrInputDefault.c index 4b243c2..ca64054 100644 --- a/Projects/Android/jni/Doom3Quest/VrInputDefault.c +++ b/Projects/Android/jni/Doom3Quest/VrInputDefault.c @@ -131,8 +131,15 @@ void HandleInput_Default( int controlscheme, ovrInputStateTrackedRemote *pDomina const ovrVector3f positionRHand = pWeapon->HeadPose.Pose.Position; const ovrQuatf quatLHand = pOff->HeadPose.Pose.Orientation; const ovrVector3f positionLHand = pOff->HeadPose.Pose.Position; + + VectorSet(pVRClientInfo->rhandposition, positionRHand.x, positionRHand.y, positionRHand.z); + Vector4Set(pVRClientInfo->rhand_orientation_quat, quatRHand.x, quatRHand.y, quatRHand.z, quatRHand.w); + VectorSet(pVRClientInfo->lhandposition, positionLHand.x, positionLHand.y, positionLHand.z); + Vector4Set(pVRClientInfo->lhand_orientation_quat, quatLHand.x, quatLHand.y, quatLHand.z, quatLHand.w); + //Right Hand - if(pVRClientInfo->right_handed) { + //GB - FP Already does this so we end up with backward hands + /*if(pVRClientInfo->right_handed) { VectorSet(pVRClientInfo->rhandposition, positionRHand.x, positionRHand.y, positionRHand.z); Vector4Set(pVRClientInfo->rhand_orientation_quat, quatRHand.x, quatRHand.y, quatRHand.z, quatRHand.w); VectorSet(pVRClientInfo->lhandposition, positionLHand.x, positionLHand.y, positionLHand.z); @@ -142,7 +149,7 @@ void HandleInput_Default( int controlscheme, ovrInputStateTrackedRemote *pDomina Vector4Set(pVRClientInfo->lhand_orientation_quat, quatRHand.x, quatRHand.y, quatRHand.z, quatRHand.w); VectorSet(pVRClientInfo->rhandposition, positionLHand.x, positionLHand.y, positionLHand.z); Vector4Set(pVRClientInfo->rhand_orientation_quat, quatLHand.x, quatLHand.y, quatLHand.z, quatLHand.w); - } + }*/ //Set gun angles - We need to calculate all those we might need (including adjustments) for the client to then take its pick diff --git a/Projects/Android/jni/d3es-multithread-master/neo/game/Player.cpp b/Projects/Android/jni/d3es-multithread-master/neo/game/Player.cpp index d29cf7b..9a46f20 100644 --- a/Projects/Android/jni/d3es-multithread-master/neo/game/Player.cpp +++ b/Projects/Android/jni/d3es-multithread-master/neo/game/Player.cpp @@ -13222,7 +13222,7 @@ void idPlayer::CalculateViewWeaponPosVR( int hand, idVec3 &origin, idMat3 &axis gunOrigin = GetEyePosition(); - if ( game->isVR && commonVr->VR_USE_MOTION_CONTROLS ) gunOrigin += commonVr->leanOffset; + gunOrigin += commonVr->leanOffset; // direction the player body is facing. idMat3 bodyAxis = idAngles( 0.0, viewAngles.yaw, 0.0f ).ToMat3(); @@ -13287,163 +13287,162 @@ void idPlayer::CalculateViewWeaponPosVR( int hand, idVec3 &origin, idMat3 &axis } } - if (commonVr->VR_USE_MOTION_CONTROLS ) - { - // motion control weapon positioning. - //----------------------------------- - idVec3 weapOrigin = vec3_zero; - idMat3 weapAxis = mat3_identity; + // motion control weapon positioning. + //----------------------------------- - // idVec3 fixPosVec = idVec3( -17.0f, 6.0f, 0.0f ); - // idVec3 fixPos = fixPosVec; - // idQuat fixRot = idAngles( 40.0f, -40.0f, 20.0f ).ToQuat(); - idVec3 attacherToDefault = vec3_zero; - // idMat3 rot180 = idAngles( 0.0f, 180.0f, 0.0f ).ToMat3(); + idVec3 weapOrigin = vec3_zero; + idMat3 weapAxis = mat3_identity; - if ( !hands[ hand ].PDAfixed && currentWeaponEnum == WEAPON_PDA ) - { - // do the non-PDA hand first (the hand with the pointy finger) - int fingerHand = 1 - hand; + // idVec3 fixPosVec = idVec3( -17.0f, 6.0f, 0.0f ); + // idVec3 fixPos = fixPosVec; + // idQuat fixRot = idAngles( 40.0f, -40.0f, 20.0f ).ToQuat(); + idVec3 attacherToDefault = vec3_zero; + // idMat3 rot180 = idAngles( 0.0f, 180.0f, 0.0f ).ToMat3(); - attacherToDefault = handWeaponAttacherToDefaultOffset[fingerHand][currentWeaponIndex]; - originOffset = weapon->weaponHandDefaultPos[fingerHand]; - commonVr->MotionControlGetHand( fingerHand, hands[fingerHand].motionPosition, hands[fingerHand].motionRotation ); + if ( !hands[ hand ].PDAfixed && currentWeaponEnum == WEAPON_PDA ) + { + // do the non-PDA hand first (the hand with the pointy finger) + int fingerHand = 1 - hand; - weaponPitch = idAngles( vr_motionWeaponPitchAdj.GetFloat(), 0.f, 0.0f ).ToQuat(); - hands[fingerHand].motionRotation = weaponPitch * hands[fingerHand].motionRotation; + attacherToDefault = handWeaponAttacherToDefaultOffset[fingerHand][currentWeaponIndex]; + originOffset = weapon->weaponHandDefaultPos[fingerHand]; + commonVr->MotionControlGetHand( fingerHand, hands[fingerHand].motionPosition, hands[fingerHand].motionRotation ); - GetViewPos( weapOrigin, weapAxis ); + weaponPitch = idAngles( vr_motionWeaponPitchAdj.GetFloat(), 0.f, 0.0f ).ToQuat(); + hands[fingerHand].motionRotation = weaponPitch * hands[fingerHand].motionRotation; - weapOrigin += commonVr->leanOffset; - //commonVr->HMDGetOrientation( hmdAngles, headPositionDelta, bodyPositionDelta, absolutePosition, false );// gameLocal.inCinematic ); + GetViewPos( weapOrigin, weapAxis ); - hmdAngles = commonVr->poseHmdAngles; - headPositionDelta = commonVr->poseHmdHeadPositionDelta; - bodyPositionDelta = commonVr->poseHmdBodyPositionDelta; - absolutePosition = commonVr->poseHmdAbsolutePosition; + weapOrigin += commonVr->leanOffset; + //commonVr->HMDGetOrientation( hmdAngles, headPositionDelta, bodyPositionDelta, absolutePosition, false );// gameLocal.inCinematic ); + + hmdAngles = commonVr->poseHmdAngles; + headPositionDelta = commonVr->poseHmdHeadPositionDelta; + bodyPositionDelta = commonVr->poseHmdBodyPositionDelta; + absolutePosition = commonVr->poseHmdAbsolutePosition; - weapAxis = idAngles( 0.0, weapAxis.ToAngles().yaw - commonVr->bodyYawOffset, 0.0f ).ToMat3(); + weapAxis = idAngles( 0.0, weapAxis.ToAngles().yaw - commonVr->bodyYawOffset, 0.0f ).ToMat3(); - weapOrigin += weapAxis[0] * headPositionDelta.x + weapAxis[1] * headPositionDelta.y + weapAxis[2] * headPositionDelta.z; + weapOrigin += weapAxis[0] * headPositionDelta.x + weapAxis[1] * headPositionDelta.y + weapAxis[2] * headPositionDelta.z; - weapOrigin += hands[fingerHand].motionPosition * weapAxis; - weapAxis = hands[fingerHand].motionRotation.ToMat3() * weapAxis; + weapOrigin += hands[fingerHand].motionPosition * weapAxis; + weapAxis = hands[fingerHand].motionRotation.ToMat3() * weapAxis; - //weapon->CalculateHideRise( weapOrigin, weapAxis ); + //weapon->CalculateHideRise( weapOrigin, weapAxis ); - idAngles motRot = hands[fingerHand].motionRotation.ToAngles(); - motRot.yaw -= commonVr->bodyYawOffset; - motRot.Normalize180(); - hands[fingerHand].motionRotation = motRot.ToQuat(); + idAngles motRot = hands[fingerHand].motionRotation.ToAngles(); + motRot.yaw -= commonVr->bodyYawOffset; + motRot.Normalize180(); + hands[fingerHand].motionRotation = motRot.ToQuat(); - SetHandIKPos( fingerHand, weapOrigin, weapAxis, hands[fingerHand].motionRotation, false ); + SetHandIKPos( fingerHand, weapOrigin, weapAxis, hands[fingerHand].motionRotation, false ); - // now switch hands and fall through again., - } - // NOT the PDA + // now switch hands and fall through again., + } + // NOT the PDA - attacherToDefault = handWeaponAttacherToDefaultOffset[hand][currentWeaponIndex]; - originOffset = weapon->weaponHandDefaultPos[hand]; + attacherToDefault = handWeaponAttacherToDefaultOffset[hand][currentWeaponIndex]; + originOffset = weapon->weaponHandDefaultPos[hand]; - commonVr->MotionControlGetHand( hand, hands[ hand ].motionPosition, hands[ hand ].motionRotation ); + commonVr->MotionControlGetHand( hand, hands[ hand ].motionPosition, hands[ hand ].motionRotation ); - weaponPitch = idAngles( vr_motionWeaponPitchAdj.GetFloat(), 0.0f, 0.0f ).ToQuat(); - hands[ hand ].motionRotation = weaponPitch * hands[ hand ].motionRotation; + weaponPitch = idAngles( vr_motionWeaponPitchAdj.GetFloat(), 0.0f, 0.0f ).ToQuat(); + hands[ hand ].motionRotation = weaponPitch * hands[ hand ].motionRotation; - GetViewPos( weapOrigin, weapAxis ); + GetViewPos( weapOrigin, weapAxis ); - weapOrigin += commonVr->leanOffset; + weapOrigin += commonVr->leanOffset; - //commonVr->HMDGetOrientation( hmdAngles, headPositionDelta, bodyPositionDelta, absolutePosition, false );// gameLocal.inCinematic ); + //commonVr->HMDGetOrientation( hmdAngles, headPositionDelta, bodyPositionDelta, absolutePosition, false );// gameLocal.inCinematic ); - hmdAngles = commonVr->poseHmdAngles; - headPositionDelta = commonVr->poseHmdHeadPositionDelta; - bodyPositionDelta = commonVr->poseHmdBodyPositionDelta; - absolutePosition = commonVr->poseHmdAbsolutePosition; + hmdAngles = commonVr->poseHmdAngles; + headPositionDelta = commonVr->poseHmdHeadPositionDelta; + bodyPositionDelta = commonVr->poseHmdBodyPositionDelta; + absolutePosition = commonVr->poseHmdAbsolutePosition; - weapAxis = idAngles( 0.0f, weapAxis.ToAngles().yaw - commonVr->bodyYawOffset, 0.0f ).ToMat3(); + weapAxis = idAngles( 0.0f, weapAxis.ToAngles().yaw - commonVr->bodyYawOffset, 0.0f ).ToMat3(); - weapOrigin += weapAxis[0] * headPositionDelta.x + weapAxis[1] * headPositionDelta.y + weapAxis[2] * headPositionDelta.z; + weapOrigin += weapAxis[0] * headPositionDelta.x + weapAxis[1] * headPositionDelta.y + weapAxis[2] * headPositionDelta.z; - weapOrigin += hands[ hand ].motionPosition * weapAxis; + weapOrigin += hands[ hand ].motionPosition * weapAxis; - if ( currentWeaponEnum != WEAPON_ARTIFACT && currentWeaponEnum != WEAPON_SOULCUBE ) - { - weapAxis = hands[ hand ].motionRotation.ToMat3() * weapAxis; - } - else - { - weapAxis = idAngles( 0.0f ,viewAngles.yaw , 0.0f).ToMat3(); - } + if ( currentWeaponEnum != WEAPON_ARTIFACT && currentWeaponEnum != WEAPON_SOULCUBE ) + { + weapAxis = hands[ hand ].motionRotation.ToMat3() * weapAxis; + } + else + { + weapAxis = idAngles( 0.0f ,viewAngles.yaw , 0.0f).ToMat3(); + } - //DebugCross( weapOrigin, weapAxis, colorYellow ); + //DebugCross( weapOrigin, weapAxis, colorYellow ); - if ( currentWeaponEnum != WEAPON_PDA ) - { - hands[hand].TrackWeaponDirection( weapOrigin ); - //GB why do both hands here - //hands[1 - hand].TrackWeaponDirection( weapOrigin ); - weapon->CalculateHideRise( weapOrigin, weapAxis ); - //check for melee hit? - } - else if( !hands[ hand ].PDAfixed ) - { - // Koz FIXME hack hack hack this is getting so ungodly ugly. - // Lovely. I forgot to correct the origin for the PDA model when I switched - // to always showing the body, so now when holding the PDA it doesn't align with your controller. - // will fix the assets later but for now hack this correction in. + if ( currentWeaponEnum != WEAPON_PDA ) + { + hands[hand].TrackWeaponDirection( weapOrigin ); + //GB why do both hands here + //hands[1 - hand].TrackWeaponDirection( weapOrigin ); + weapon->CalculateHideRise( weapOrigin, weapAxis ); + //check for melee hit? + } + else if( !hands[ hand ].PDAfixed ) + { + // Koz FIXME hack hack hack this is getting so ungodly ugly. + // Lovely. I forgot to correct the origin for the PDA model when I switched + // to always showing the body, so now when holding the PDA it doesn't align with your controller. + // will fix the assets later but for now hack this correction in. - /* GB Debugger Change Values - * float _vr_pdaPosX = 0.0; - float _vr_pdaPosY = 0.0; - float _vr_pdaPosZ = 0.0; - if(_vr_pdaPosX != 0.0f && _vr_pdaPosX != vr_pdaPosX.GetFloat()) - cvarSystem->SetCVarFloat("vr_pdaPosX", _vr_pdaPosX); - if(_vr_pdaPosY != 0.0f && _vr_pdaPosY != vr_pdaPosY.GetFloat()) - cvarSystem->SetCVarFloat("vr_pdaPosY", _vr_pdaPosY); - if(_vr_pdaPosZ != 0.0f && _vr_pdaPosZ != vr_pdaPosZ.GetFloat()) - cvarSystem->SetCVarFloat("vr_pdaPosZ", _vr_pdaPosZ); - */ - const idVec3 pdaHackOrigin[2] { idVec3( vr_pdaPosX.GetFloat(), vr_pdaPosY.GetFloat(), vr_pdaPosZ.GetFloat() ), idVec3( vr_pdaPosX.GetFloat(), -vr_pdaPosY.GetFloat(), vr_pdaPosZ.GetFloat() ) }; - weapOrigin += pdaHackOrigin[hand] * weapAxis; - } + /* GB Debugger Change Values + * float _vr_pdaPosX = 0.0; + float _vr_pdaPosY = 0.0; + float _vr_pdaPosZ = 0.0; + if(_vr_pdaPosX != 0.0f && _vr_pdaPosX != vr_pdaPosX.GetFloat()) + cvarSystem->SetCVarFloat("vr_pdaPosX", _vr_pdaPosX); + if(_vr_pdaPosY != 0.0f && _vr_pdaPosY != vr_pdaPosY.GetFloat()) + cvarSystem->SetCVarFloat("vr_pdaPosY", _vr_pdaPosY); + if(_vr_pdaPosZ != 0.0f && _vr_pdaPosZ != vr_pdaPosZ.GetFloat()) + cvarSystem->SetCVarFloat("vr_pdaPosZ", _vr_pdaPosZ); + */ + const idVec3 pdaHackOrigin[2] { idVec3( vr_pdaPosX.GetFloat(), vr_pdaPosY.GetFloat(), vr_pdaPosZ.GetFloat() ), idVec3( vr_pdaPosX.GetFloat(), -vr_pdaPosY.GetFloat(), vr_pdaPosZ.GetFloat() ) }; + weapOrigin += pdaHackOrigin[hand] * weapAxis; + } - idAngles motRot = hands[ hand ].motionRotation.ToAngles(); - motRot.yaw -= commonVr->bodyYawOffset; - motRot.Normalize180(); - hands[ hand ].motionRotation = motRot.ToQuat(); + idAngles motRot = hands[ hand ].motionRotation.ToAngles(); + motRot.yaw -= commonVr->bodyYawOffset; + motRot.Normalize180(); + hands[ hand ].motionRotation = motRot.ToQuat(); - SetHandIKPos( hand, weapOrigin, weapAxis, hands[ hand ].motionRotation, false ); + SetHandIKPos( hand, weapOrigin, weapAxis, hands[ hand ].motionRotation, false ); - if ( hands[ hand ].PDAfixed ) return; + if ( hands[ hand ].PDAfixed ) return; - if ( currentWeaponEnum == WEAPON_PDA ) - { + if ( currentWeaponEnum == WEAPON_PDA ) + { - PDAaxis = weapAxis; - PDAorigin = weapOrigin; - if ( hands[ hand ].wasPDA == false ) - { - SetFlashHandPose(); // Call set flashlight hand pose script function - SetWeaponHandPose(); - hands[ hand ].wasPDA = true; - } - } - else - { - hands[hand].wasPDA = false; - } + PDAaxis = weapAxis; + PDAorigin = weapOrigin; + if ( hands[ hand ].wasPDA == false ) + { + SetFlashHandPose(); // Call set flashlight hand pose script function + SetWeaponHandPose(); + hands[ hand ].wasPDA = true; + } + } + else + { + hands[hand].wasPDA = false; + } - axis = weapAxis; - origin = weapOrigin; + axis = weapAxis; + origin = weapOrigin; + + origin -= originOffset * weapAxis; + origin += attacherToDefault * weapAxis; // handWeaponAttacherToDefaultOffset[hand][currentWeaponIndex] * weapAxis; // add the attacher offsets - origin -= originOffset * weapAxis; - origin += attacherToDefault * weapAxis; // handWeaponAttacherToDefaultOffset[hand][currentWeaponIndex] * weapAxis; // add the attacher offsets - } } bool idPlayer::CanDualWield( int num ) const diff --git a/Projects/Android/jni/d3es-multithread-master/neo/game/Projectile.cpp b/Projects/Android/jni/d3es-multithread-master/neo/game/Projectile.cpp index 2d5d385..34cec82 100644 --- a/Projects/Android/jni/d3es-multithread-master/neo/game/Projectile.cpp +++ b/Projects/Android/jni/d3es-multithread-master/neo/game/Projectile.cpp @@ -56,12 +56,19 @@ const idEventDef EV_Fizzle( "", NULL ); const idEventDef EV_RadiusDamage( "", "e" ); const idEventDef EV_GetProjectileState( "getProjectileState", NULL, 'd' ); +const idEventDef EV_CreateProjectile( "projectileCreateProjectile", "evv" ); +const idEventDef EV_LaunchProjectile( "projectileLaunchProjectile", "vvv" ); +const idEventDef EV_SetGravity( "setGravity", "f" ); + CLASS_DECLARATION( idEntity, idProjectile ) EVENT( EV_Explode, idProjectile::Event_Explode ) EVENT( EV_Fizzle, idProjectile::Event_Fizzle ) EVENT( EV_Touch, idProjectile::Event_Touch ) EVENT( EV_RadiusDamage, idProjectile::Event_RadiusDamage ) EVENT( EV_GetProjectileState, idProjectile::Event_GetProjectileState ) + EVENT( EV_CreateProjectile, idProjectile::Event_CreateProjectile ) + EVENT( EV_LaunchProjectile, idProjectile::Event_LaunchProjectile ) + EVENT( EV_SetGravity, idProjectile::Event_SetGravity ) END_CLASS /* @@ -69,7 +76,10 @@ END_CLASS idProjectile::idProjectile ================ */ -idProjectile::idProjectile( void ) { +idProjectile::idProjectile() : + launchOrigin( 0.0f ), + launchAxis( mat3_identity ) +{ owner = NULL; lightDefHandle = -1; thrust = 0.0f; @@ -282,6 +292,7 @@ idProjectile::Launch */ void idProjectile::Launch( const idVec3& start, const idVec3& dir, const idVec3& pushVelocity, const float timeSinceFire, const float launchPower, const float dmgPower, const float motionThrowSpeed ) { float fuse; + float startthrust; float endthrust; idVec3 velocity; idAngles angular_velocity; @@ -295,6 +306,7 @@ void idProjectile::Launch( const idVec3& start, const idVec3& dir, const idVec3& idVec3 gravVec; idVec3 tmp; idMat3 axis; + int thrust_start; int contents; int clipMask; @@ -306,6 +318,7 @@ void idProjectile::Launch( const idVec3& start, const idVec3& dir, const idVec3& } thrust = spawnArgs.GetFloat( "thrust" ); + startthrust = spawnArgs.GetFloat( "thrust_start" ); endthrust = spawnArgs.GetFloat( "thrust_end" ); spawnArgs.GetVector( "velocity", "0 0 0", velocity ); @@ -338,6 +351,7 @@ void idProjectile::Launch( const idVec3& start, const idVec3& dir, const idVec3& } thrust *= mass; + thrust_start = SEC2MS( startthrust ) + gameLocal.time; thrust_end = SEC2MS( endthrust ) + gameLocal.time; lightStartTime = 0; @@ -368,6 +382,13 @@ void idProjectile::Launch( const idVec3& start, const idVec3& dir, const idVec3& clipMask |= CONTENTS_PROJECTILE; } + if( !idStr::Cmp( this->GetEntityDefName(), "projectile_helltime_killer" ) ) + { + contents = CONTENTS_MOVEABLECLIP; + clipMask = CONTENTS_MOVEABLECLIP; + fuse = 10.0f; + } + // don't do tracers on client, we don't know origin and direction if ( spawnArgs.GetBool( "tracers" ) && gameLocal.random.RandomFloat() > 0.5f ) { SetModel( spawnArgs.GetString( "model_tracer" ) ); @@ -388,6 +409,9 @@ void idProjectile::Launch( const idVec3& start, const idVec3& dir, const idVec3& physicsObj.SetOrigin( start ); physicsObj.SetAxis( axis ); + launchOrigin = start; + launchAxis = axis; + thruster.SetPosition( &physicsObj, 0, idVec3( GetPhysics()->GetBounds()[ 0 ].x, 0, 0 ) ); if ( !gameLocal.isClient ) { @@ -773,6 +797,40 @@ void idProjectile::Event_GetProjectileState( void ) { idThread::ReturnInt( state ); } +/* +================ +idProjectile::Event_CreateProjectile +================ +*/ +void idProjectile::Event_CreateProjectile( idEntity* owner, const idVec3& start, const idVec3& dir ) +{ + Create( owner, start, dir ); +} + +/* +================ +idProjectile::Event_LaunchProjectile +================ +*/ +void idProjectile::Event_LaunchProjectile( const idVec3& start, const idVec3& dir, const idVec3& pushVelocity ) +{ + Launch( start, dir, pushVelocity ); +} + +/* +================ +idProjectile::Event_SetGravity +================ +*/ +void idProjectile::Event_SetGravity( float gravity ) +{ + idVec3 gravVec; + + gravVec = gameLocal.GetGravity(); + gravVec.NormalizeFast(); + physicsObj.SetGravity( gravVec * gravity ); +} + /* ================ idProjectile::Explode diff --git a/Projects/Android/jni/d3es-multithread-master/neo/game/Projectile.h b/Projects/Android/jni/d3es-multithread-master/neo/game/Projectile.h index b41bf33..973cebb 100644 --- a/Projects/Android/jni/d3es-multithread-master/neo/game/Projectile.h +++ b/Projects/Android/jni/d3es-multithread-master/neo/game/Projectile.h @@ -62,6 +62,9 @@ public : idEntity * GetOwner( void ) const; void CatchProjectile( idEntity* o, const char* reflectName ); int GetProjectileState(); + void Event_CreateProjectile( idEntity* owner, const idVec3& start, const idVec3& dir ); + void Event_LaunchProjectile( const idVec3& start, const idVec3& dir, const idVec3& pushVelocity ); + void Event_SetGravity( float gravity ); virtual void Think( void ); virtual void Killed( idEntity *inflictor, idEntity *attacker, int damage, const idVec3 &dir, int location ); @@ -137,6 +140,9 @@ protected: private: bool netSyncPhysics; + idVec3 launchOrigin; + idMat3 launchAxis; + void AddDefaultDamageEffect( const trace_t &collision, const idVec3 &velocity ); void Event_Explode( void ); diff --git a/Projects/Android/jni/d3es-multithread-master/neo/game/Weapon.cpp b/Projects/Android/jni/d3es-multithread-master/neo/game/Weapon.cpp index d247057..ddc7148 100644 --- a/Projects/Android/jni/d3es-multithread-master/neo/game/Weapon.cpp +++ b/Projects/Android/jni/d3es-multithread-master/neo/game/Weapon.cpp @@ -2594,7 +2594,7 @@ void idWeapon::PresentWeapon( bool showViewModel, int hand ) { viewWeaponAxis = playerViewAxis; owner->CalculateViewFlashlightPos( viewWeaponOrigin, viewWeaponAxis, flashlightOffsets[owner->hands[vr_weaponHand.GetInteger()].currentWeapon] ); } - else if ( isPlayerLeftHand ) // Koz left hand + else if ( isPlayerLeftHand || hand != vr_weaponHand.GetInteger()) // Koz left hand { } diff --git a/Projects/Android/jni/d3es-multithread-master/neo/game/ai/AI.cpp b/Projects/Android/jni/d3es-multithread-master/neo/game/ai/AI.cpp index 6d22741..179464b 100644 --- a/Projects/Android/jni/d3es-multithread-master/neo/game/ai/AI.cpp +++ b/Projects/Android/jni/d3es-multithread-master/neo/game/ai/AI.cpp @@ -4117,6 +4117,8 @@ idProjectile *idAI::LaunchProjectile( const char *jointname, idEntity *target, b int num_projectiles; int i; idMat3 axis; + idMat3 proj_axis; + bool forceMuzzle; idVec3 tmp; idProjectile *lastProjectile; @@ -4129,6 +4131,7 @@ idProjectile *idAI::LaunchProjectile( const char *jointname, idEntity *target, b attack_cone = spawnArgs.GetFloat( "attack_cone", "70" ); projectile_spread = spawnArgs.GetFloat( "projectile_spread", "0" ); num_projectiles = spawnArgs.GetInt( "num_projectiles", "1" ); + forceMuzzle = spawnArgs.GetBool( "forceMuzzle", "0" ); GetMuzzle( jointname, muzzle, axis ); @@ -4151,27 +4154,38 @@ idProjectile *idAI::LaunchProjectile( const char *jointname, idEntity *target, b axis[2] = axis[0]; axis[0] = -tmp; - // make sure the projectile starts inside the monster bounding box - const idBounds &ownerBounds = physicsObj.GetAbsBounds(); - projClip = lastProjectile->GetPhysics()->GetClipModel(); - projBounds = projClip->GetBounds().Rotate( axis ); + proj_axis = axis; - // check if the owner bounds is bigger than the projectile bounds - if ( ( ( ownerBounds[1][0] - ownerBounds[0][0] ) > ( projBounds[1][0] - projBounds[0][0] ) ) && - ( ( ownerBounds[1][1] - ownerBounds[0][1] ) > ( projBounds[1][1] - projBounds[0][1] ) ) && - ( ( ownerBounds[1][2] - ownerBounds[0][2] ) > ( projBounds[1][2] - projBounds[0][2] ) ) ) { - if ( (ownerBounds - projBounds).RayIntersection( muzzle, viewAxis[ 0 ], distance ) ) { - start = muzzle + distance * viewAxis[ 0 ]; - } else { + if( !forceMuzzle ) // _D3XP + { + // make sure the projectile starts inside the monster bounding box + const idBounds& ownerBounds = physicsObj.GetAbsBounds(); + projClip = lastProjectile->GetPhysics()->GetClipModel(); + projBounds = projClip->GetBounds().Rotate( axis ); + + // check if the owner bounds is bigger than the projectile bounds + if( ( ( ownerBounds[1][0] - ownerBounds[0][0] ) > ( projBounds[1][0] - projBounds[0][0] ) ) && + ( ( ownerBounds[1][1] - ownerBounds[0][1] ) > ( projBounds[1][1] - projBounds[0][1] ) ) && + ( ( ownerBounds[1][2] - ownerBounds[0][2] ) > ( projBounds[1][2] - projBounds[0][2] ) ) ) + { + if( ( ownerBounds - projBounds ).RayIntersection( muzzle, viewAxis[ 0 ], distance ) ) + { + start = muzzle + distance * viewAxis[ 0 ]; + } + else + { + start = ownerBounds.GetCenter(); + } + } + else + { + // projectile bounds bigger than the owner bounds, so just start it from the center start = ownerBounds.GetCenter(); } - } else { - // projectile bounds bigger than the owner bounds, so just start it from the center - start = ownerBounds.GetCenter(); - } - gameLocal.clip.Translation( tr, start, muzzle, projClip, axis, MASK_SHOT_RENDERMODEL, this ); - muzzle = tr.endpos; + gameLocal.clip.Translation( tr, start, muzzle, projClip, axis, MASK_SHOT_RENDERMODEL, this ); + muzzle = tr.endpos; + } // set aiming direction GetAimDir( muzzle, target, this, dir ); diff --git a/Projects/Android/jni/d3es-multithread-master/neo/idlib/math/Vector.h b/Projects/Android/jni/d3es-multithread-master/neo/idlib/math/Vector.h index d00949f..ea7aaf6 100644 --- a/Projects/Android/jni/d3es-multithread-master/neo/idlib/math/Vector.h +++ b/Projects/Android/jni/d3es-multithread-master/neo/idlib/math/Vector.h @@ -325,6 +325,10 @@ public: float z; idVec3( void ); + explicit idVec3( const float xyz ) + { + Set( xyz, xyz, xyz ); + } explicit idVec3( const float x, const float y, const float z ); void Set( const float x, const float y, const float z );