Fixed DropStrider input on dropship

This commit is contained in:
Bronzehawk75 2024-02-09 21:27:46 -05:00
parent 8f7b70768e
commit 5365ad8bb9
2 changed files with 210 additions and 5 deletions

View File

@ -134,6 +134,11 @@ enum LandingState_t
LANDING_HOVER_DESCEND, LANDING_HOVER_DESCEND,
LANDING_HOVER_TOUCHDOWN, LANDING_HOVER_TOUCHDOWN,
LANDING_END_HOVER, LANDING_END_HOVER,
#ifdef MAPBASE
// Strider dropoff
LANDING_STRIDER,
#endif
}; };
@ -353,6 +358,12 @@ private:
string_t m_sRollermineTemplate; string_t m_sRollermineTemplate;
string_t m_sRollermineTemplateData; string_t m_sRollermineTemplateData;
#ifdef MAPBASE
// Template for strider carried by this dropship
string_t m_sStriderTemplate;
string_t m_sStriderTemplateData;
#endif
// Cached attachment points // Cached attachment points
int m_iMuzzleAttachment; int m_iMuzzleAttachment;
int m_iMachineGunBaseAttachment; int m_iMachineGunBaseAttachment;
@ -827,6 +838,11 @@ BEGIN_DATADESC( CNPC_CombineDropship )
DEFINE_KEYFIELD( m_sRollermineTemplate, FIELD_STRING, "RollermineTemplate" ), DEFINE_KEYFIELD( m_sRollermineTemplate, FIELD_STRING, "RollermineTemplate" ),
DEFINE_FIELD( m_sRollermineTemplateData, FIELD_STRING ), DEFINE_FIELD( m_sRollermineTemplateData, FIELD_STRING ),
#ifdef MAPBASE
DEFINE_KEYFIELD(m_sStriderTemplate, FIELD_STRING, "StriderTemplate"),
DEFINE_FIELD(m_sStriderTemplateData, FIELD_STRING),
#endif
DEFINE_ARRAY( m_sNPCTemplateData, FIELD_STRING, DROPSHIP_MAX_SOLDIERS ), DEFINE_ARRAY( m_sNPCTemplateData, FIELD_STRING, DROPSHIP_MAX_SOLDIERS ),
DEFINE_KEYFIELD( m_sNPCTemplate[0], FIELD_STRING, "NPCTemplate" ), DEFINE_KEYFIELD( m_sNPCTemplate[0], FIELD_STRING, "NPCTemplate" ),
DEFINE_KEYFIELD( m_sNPCTemplate[1], FIELD_STRING, "NPCTemplate2" ), DEFINE_KEYFIELD( m_sNPCTemplate[1], FIELD_STRING, "NPCTemplate2" ),
@ -962,12 +978,49 @@ void CNPC_CombineDropship::Spawn( void )
break; break;
case CRATE_STRIDER: case CRATE_STRIDER:
#ifdef MAPBASE
if ( m_sStriderTemplate != NULL_STRING )
{
m_sStriderTemplateData = Templates_FindByTargetName( STRING( m_sStriderTemplate ) );
CAI_BaseNPC* pent = NULL;
CBaseEntity* pEntity = NULL;
MapEntity_ParseEntity( pEntity, STRING( m_sStriderTemplateData ), NULL);
if ( pEntity != NULL )
{
pent = ( CAI_BaseNPC* )pEntity;
}
m_OnSpawnNPC.Set( pEntity, pEntity, this );
pent->RemoveSpawnFlags( SF_NPC_TEMPLATE );
pent->SetOwnerEntity( this );
m_hContainer = pent;
m_hContainer->SetAbsOrigin( GetAbsOrigin() - Vector(0, 0, 100) );
m_hContainer->SetAbsAngles( GetAbsAngles() );
m_hContainer->SetParent( this, 0 );
m_hContainer->SetOwnerEntity( this );
DispatchSpawn(pent);
}
else
{
m_hContainer = ( CBaseAnimating* )CreateEntityByName("npc_strider"); m_hContainer = ( CBaseAnimating* )CreateEntityByName("npc_strider");
m_hContainer->SetAbsOrigin( GetAbsOrigin() - Vector(0, 0, 100) ); m_hContainer->SetAbsOrigin( GetAbsOrigin() - Vector(0, 0, 100) );
m_hContainer->SetAbsAngles( GetAbsAngles() ); m_hContainer->SetAbsAngles( GetAbsAngles() );
m_hContainer->SetParent( this, 0 ); m_hContainer->SetParent( this, 0 );
m_hContainer->SetOwnerEntity( this ); m_hContainer->SetOwnerEntity( this );
m_hContainer->Spawn(); m_hContainer->Spawn();
}
#else
m_hContainer = (CBaseAnimating*)CreateEntityByName( "npc_strider" );
m_hContainer->SetAbsOrigin( GetAbsOrigin() - Vector( 0, 0 , 100 ) );
m_hContainer->SetAbsAngles( GetAbsAngles() );
m_hContainer->SetParent(this, 0);
m_hContainer->SetOwnerEntity(this);
m_hContainer->Spawn();
#endif
m_hContainer->SetAbsOrigin( GetAbsOrigin() - Vector( 0, 0 , 100 ) ); m_hContainer->SetAbsOrigin( GetAbsOrigin() - Vector( 0, 0 , 100 ) );
#ifdef MAPBASE #ifdef MAPBASE
m_OnSpawnNPC.Set( m_hContainer, m_hContainer, this ); m_OnSpawnNPC.Set( m_hContainer, m_hContainer, this );
@ -1201,6 +1254,16 @@ void CNPC_CombineDropship::Precache( void )
void CNPC_CombineDropship::Flight( void ) void CNPC_CombineDropship::Flight( void )
{ {
// Only run the flight model in some flight states // Only run the flight model in some flight states
#ifdef MAPBASE
bool bRunFlight = ( GetLandingState() == LANDING_NO ||
GetLandingState() == LANDING_LEVEL_OUT ||
GetLandingState() == LANDING_LIFTOFF ||
GetLandingState() == LANDING_SWOOPING ||
GetLandingState() == LANDING_DESCEND ||
GetLandingState() == LANDING_HOVER_LEVEL_OUT ||
GetLandingState() == LANDING_HOVER_DESCEND ||
GetLandingState() == LANDING_STRIDER );
#else
bool bRunFlight = (GetLandingState() == LANDING_NO || bool bRunFlight = (GetLandingState() == LANDING_NO ||
GetLandingState() == LANDING_LEVEL_OUT || GetLandingState() == LANDING_LEVEL_OUT ||
GetLandingState() == LANDING_LIFTOFF || GetLandingState() == LANDING_LIFTOFF ||
@ -1208,6 +1271,7 @@ void CNPC_CombineDropship::Flight( void )
GetLandingState() == LANDING_DESCEND || GetLandingState() == LANDING_DESCEND ||
GetLandingState() == LANDING_HOVER_LEVEL_OUT || GetLandingState() == LANDING_HOVER_LEVEL_OUT ||
GetLandingState() == LANDING_HOVER_DESCEND ); GetLandingState() == LANDING_HOVER_DESCEND );
#endif
Vector forward, right, up; Vector forward, right, up;
GetVectors( &forward, &right, &up ); GetVectors( &forward, &right, &up );
@ -1429,8 +1493,14 @@ void CNPC_CombineDropship::Flight( void )
} }
// If we're landing, deliberately tuck in the back end // If we're landing, deliberately tuck in the back end
#ifdef MAPBASE
if ( GetLandingState() == LANDING_DESCEND || GetLandingState() == LANDING_TOUCHDOWN ||
GetLandingState() == LANDING_UNLOADING || GetLandingState() == LANDING_UNLOADED ||
GetLandingState() == LANDING_STRIDER || IsHovering() )
#else
if ( GetLandingState() == LANDING_DESCEND || GetLandingState() == LANDING_TOUCHDOWN || if ( GetLandingState() == LANDING_DESCEND || GetLandingState() == LANDING_TOUCHDOWN ||
GetLandingState() == LANDING_UNLOADING || GetLandingState() == LANDING_UNLOADED || IsHovering() ) GetLandingState() == LANDING_UNLOADING || GetLandingState() == LANDING_UNLOADED || IsHovering() )
#endif
{ {
finspeed = -60; finspeed = -60;
} }
@ -1779,6 +1849,9 @@ void CNPC_CombineDropship::InputDropStrider( inputdata_t &inputdata )
return; return;
} }
#ifdef MAPBASE
LandCommon();
#else
QAngle angles = GetAbsAngles(); QAngle angles = GetAbsAngles();
angles.x = 0.0; angles.x = 0.0;
@ -1790,6 +1863,7 @@ void CNPC_CombineDropship::InputDropStrider( inputdata_t &inputdata )
m_hContainer->SetAbsVelocity( vec3_origin ); m_hContainer->SetAbsVelocity( vec3_origin );
m_hContainer = NULL; m_hContainer = NULL;
#endif
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -2016,7 +2090,11 @@ void CNPC_CombineDropship::SetLandingState( LandingState_t landingState )
if ( m_pDescendingWarningSound ) if ( m_pDescendingWarningSound )
{ {
CSoundEnvelopeController &controller = CSoundEnvelopeController::GetController(); CSoundEnvelopeController &controller = CSoundEnvelopeController::GetController();
#ifdef MAPBASE
if ( ( landingState == LANDING_DESCEND ) || ( landingState == LANDING_TOUCHDOWN ) || ( landingState == LANDING_UNLOADING ) || ( landingState == LANDING_UNLOADED ) || ( landingState == LANDING_HOVER_DESCEND ) || ( landingState == LANDING_STRIDER ) )
#else
if ( ( landingState == LANDING_DESCEND ) || ( landingState == LANDING_TOUCHDOWN ) || ( landingState == LANDING_UNLOADING ) || ( landingState == LANDING_UNLOADED ) || ( landingState == LANDING_HOVER_DESCEND ) ) if ( ( landingState == LANDING_DESCEND ) || ( landingState == LANDING_TOUCHDOWN ) || ( landingState == LANDING_UNLOADING ) || ( landingState == LANDING_UNLOADED ) || ( landingState == LANDING_HOVER_DESCEND ) )
#endif
{ {
controller.SoundChangeVolume( m_pDescendingWarningSound, m_bSuppressSound ? 0.0f : 1.0f, 0.3f ); controller.SoundChangeVolume( m_pDescendingWarningSound, m_bSuppressSound ? 0.0f : 1.0f, 0.3f );
} }
@ -2112,8 +2190,15 @@ void CNPC_CombineDropship::PrescheduleThink( void )
if ( flDistance < 70 && flSpeed < 100 ) if ( flDistance < 70 && flSpeed < 100 )
{ {
m_flLandingSpeed = flSpeed; m_flLandingSpeed = flSpeed;
#ifdef MAPBASE
if ( m_iCrateType == CRATE_STRIDER )
{
SetLandingState( LANDING_STRIDER );
}
else if( IsHovering() )
#else
if ( IsHovering() ) if ( IsHovering() )
#endif
{ {
SetLandingState( LANDING_HOVER_DESCEND ); SetLandingState( LANDING_HOVER_DESCEND );
} }
@ -2315,6 +2400,98 @@ void CNPC_CombineDropship::PrescheduleThink( void )
} }
break; break;
#ifdef MAPBASE
case LANDING_STRIDER:
{
if (!m_hContainer)
{
// Strider died, get out of here
SetLandingState(LANDING_LIFTOFF);
return;
}
// Orient myself to the desired direction
bool bStillOrienting = false;
Vector targetDir;
if (m_hLandTarget)
{
// We've got a land target, so match it's orientation
AngleVectors(m_hLandTarget->GetAbsAngles(), &targetDir);
}
else
{
// No land target.
targetDir = GetDesiredPosition() - GetAbsOrigin();
}
// Don't unload until we're facing the way the dropoff point specifies
float flTargetYaw = UTIL_VecToYaw(targetDir);
float flDeltaYaw = UTIL_AngleDiff(flTargetYaw, GetAbsAngles().y);
if (fabs(flDeltaYaw) > 5)
{
bStillOrienting = true;
}
// Ensure we land on the drop point. Stop dropping if we're still turning.
Vector vecToTarget = (GetDesiredPosition() - GetAbsOrigin());
float flDistance = vecToTarget.Length();
float flRampedSpeed = m_flLandingSpeed * (flDistance / 70);
Vector vecVelocity = (flRampedSpeed / flDistance) * vecToTarget;
#define STRIDER_LANDING_HEIGHT 540.0f
float flFactor = MIN(1.0, MAX(0.1f, (flAltitude - STRIDER_LANDING_HEIGHT) / flAltitude));
float flDescendVelocity = MIN(-75, MAX_LAND_VEL * flFactor);
vecVelocity.z = flDescendVelocity;
SetAbsVelocity(vecVelocity);
if (flAltitude < 600)
{
QAngle angles = GetLocalAngles();
// Level out quickly.
angles.x = UTIL_Approach(0.0, angles.x, 0.2);
angles.z = UTIL_Approach(0.0, angles.z, 0.2);
SetLocalAngles(angles);
}
else
{
// randomly move as if buffeted by ground effects
// gently flatten ship from starting pitch/yaw
m_existPitch = UTIL_Approach(0.0, m_existPitch, 1);
m_existRoll = UTIL_Approach(0.0, m_existRoll, 1);
QAngle angles = GetLocalAngles();
angles.x = m_existPitch + (sin(gpGlobals->curtime * 3.5f) * DROPSHIP_MAX_LAND_TILT);
angles.z = m_existRoll + (sin(gpGlobals->curtime * 3.75f) * DROPSHIP_MAX_LAND_TILT);
SetLocalAngles(angles);
}
DoRotorWash();
if (!bStillOrienting && flAltitude < STRIDER_LANDING_HEIGHT)
{
QAngle angles = GetAbsAngles();
m_hContainer->SetParent(NULL, 0);
m_hContainer->SetOwnerEntity(NULL);
m_hContainer->SetAbsAngles(angles);
m_hContainer->SetAbsVelocity(vec3_origin);
m_hContainer = NULL;
m_flTimeTakeOff = gpGlobals->curtime + 5.0f;
SetLandingState(LANDING_UNLOADING);
return;
}
}
break;
#endif
case LANDING_UNLOADING: case LANDING_UNLOADING:
{ {
// If we've got no specified takeoff time, we're still waiting for troops to exit. Idle. // If we've got no specified takeoff time, we're still waiting for troops to exit. Idle.
@ -2817,7 +2994,11 @@ void CNPC_CombineDropship::UpdatePickupNavigation( void )
void CNPC_CombineDropship::UpdateLandTargetNavigation( void ) void CNPC_CombineDropship::UpdateLandTargetNavigation( void )
{ {
Vector vecPickup = m_hLandTarget->WorldSpaceCenter(); Vector vecPickup = m_hLandTarget->WorldSpaceCenter();
#ifdef MAPBASE
vecPickup.z += ( m_iCrateType == CRATE_STRIDER ) ? 732 : 256;
#else
vecPickup.z += 256; vecPickup.z += 256;
#endif
SetDesiredPosition( vecPickup ); SetDesiredPosition( vecPickup );
//NDebugOverlay::Cross3D( GetDesiredPosition(), -Vector(32,32,32), Vector(32,32,32), 0, 255, 255, true, 0.1f ); //NDebugOverlay::Cross3D( GetDesiredPosition(), -Vector(32,32,32), Vector(32,32,32), 0, 255, 255, true, 0.1f );
@ -2850,7 +3031,11 @@ void CNPC_CombineDropship::Hunt( void )
// Face our desired position. // Face our desired position.
m_vecDesiredFaceDir = desiredDir; m_vecDesiredFaceDir = desiredDir;
if ( GetLandingState() == LANDING_DESCEND || GetLandingState() == LANDING_LEVEL_OUT || IsHovering() ) if ( GetLandingState() == LANDING_DESCEND || GetLandingState() == LANDING_LEVEL_OUT ||
# ifdef MAPBASE
GetLandingState() == LANDING_STRIDER ||
# endif
IsHovering() )
{ {
if ( m_hLandTarget ) if ( m_hLandTarget )
{ {

View File

@ -1327,6 +1327,15 @@ void CNPC_Strider::BuildScheduleTestBits()
//--------------------------------------------------------- //---------------------------------------------------------
int CNPC_Strider::SelectSchedule() int CNPC_Strider::SelectSchedule()
{ {
#ifdef MAPBASE
if( GetMoveType() == MOVETYPE_NONE )
{
// Dropship just released me.
AddFlag(FL_FLY);
SetMoveType( MOVETYPE_STEP );
return SCHED_STRIDER_FALL_TO_GROUND;
}
#endif
/* /*
if( GetMoveType() != MOVETYPE_FLY ) if( GetMoveType() != MOVETYPE_FLY )
{ {
@ -5818,6 +5827,17 @@ AI_BEGIN_CUSTOM_NPC( npc_strider, CNPC_Strider )
" COND_STRIDER_SHOULD_STAND" " COND_STRIDER_SHOULD_STAND"
) )
#ifdef MAPBASE
DEFINE_SCHEDULE
(
SCHED_STRIDER_FALL_TO_GROUND,
" Tasks "
" TASK_PLAY_SEQUENCE ACTIVITY:ACT_STRIDER_DEPLOY"
""
" Interrupts "
)
#else
DEFINE_SCHEDULE DEFINE_SCHEDULE
( (
SCHED_STRIDER_FALL_TO_GROUND, SCHED_STRIDER_FALL_TO_GROUND,
@ -5827,7 +5847,7 @@ AI_BEGIN_CUSTOM_NPC( npc_strider, CNPC_Strider )
"" ""
" Interrupts " " Interrupts "
) )
#endif
AI_END_CUSTOM_NPC() AI_END_CUSTOM_NPC()