From 0318b31ba2079e08553fe69a8df0b333b01358c1 Mon Sep 17 00:00:00 2001 From: beppegoodoldrebel Date: Sun, 13 Jul 2025 23:08:54 +0200 Subject: [PATCH] Dynamic Min-Max Time to Shoot Delay - Delay is now based on target position and pawn rotation. - Separated MP / SP delays ( higher in MP to accomodate ping , lower in SP for more challenging suspects ) - Officers AI dont have delays so they are better responding to threats , resulting in less frustrating SP experience --- .../Classes/Actions/SwatWeaponAction.uc | 38 +++++++++++++++++++ Source/Game/SwatGame/Classes/AI/SwatEnemy.uc | 25 +++++++++--- .../SwatGame/Classes/AI/SwatEnemyConfig.uc | 23 +++++++++++ System/AI.ini | 17 ++++++--- 4 files changed, 93 insertions(+), 10 deletions(-) diff --git a/Source/Game/SwatAICommon/Classes/Actions/SwatWeaponAction.uc b/Source/Game/SwatAICommon/Classes/Actions/SwatWeaponAction.uc index 4f901c1b..0152139d 100644 --- a/Source/Game/SwatAICommon/Classes/Actions/SwatWeaponAction.uc +++ b/Source/Game/SwatAICommon/Classes/Actions/SwatWeaponAction.uc @@ -186,11 +186,49 @@ final latent function LatentAimAtActor(Actor Target, optional float MaxWaitTime) // only aim at if if we can local float CurrentTime; local float StartTime; + local float fdot; + local vector TargetDirection , ViewDirectionNoZ; StartTime = Level.TimeSeconds; if (ISwatAI(m_Pawn).AnimCanAimAtDesiredActor(Target) && HasWeaponEquipped()) { + // added here so server can spread information on suspect intentions before even aiming. + if( m_pawn.isa('SwatEnemy') || m_pawn.isa('SwatOfficer') ) + { + UpdateThreatToTarget(Target); + yield(); + } + + if ( ( target.isa('SwatPawn') || target.isa('SwatPlayer') ) && !m_pawn.GetActiveItem().isa('Pepperspray') ) + { + + //add time to avoid quickscope shooting + TargetDirection = Normal( m_pawn.location - target.location); + ViewDirectionNoZ = vector(m_pawn.Rotation); + fDot = ViewDirectionNoZ Dot TargetDirection; + //log (m_pawn.name $ " attacking " $ target.name $ " fdot is: " $ fdot ); + + if ( m_pawn.isa('SwatEnemy') ) + { + if ( fdot > 0.707 ) + { + //log ( m_pawn.name $ " quick scope added time on target 0.8" ); + MaxWaitTime = MaxWaitTime + 0.8; + } + else if ( fdot > 0.0 && fdot <= 0.707 ) + { + //log ( m_pawn.name $ " quick scope added time on target 0.4" ); + MaxWaitTime = MaxWaitTime + 0.6; + } + else if ( fdot > -0.707 && fdot <= 0.0 ) + { + //log ( m_pawn.name $ " quick scope added time on target 0.2" ); + MaxWaitTime = MaxWaitTime + 0.4; + } + } + } + ISwatAI(m_pawn).AimAtActor(Target); // wait until we aim at what we want to diff --git a/Source/Game/SwatGame/Classes/AI/SwatEnemy.uc b/Source/Game/SwatGame/Classes/AI/SwatEnemy.uc index 43b0e125..16beb024 100644 --- a/Source/Game/SwatGame/Classes/AI/SwatEnemy.uc +++ b/Source/Game/SwatGame/Classes/AI/SwatEnemy.uc @@ -1176,14 +1176,29 @@ native event float GetAdditionalBaseAimError(); // overridden from ISwatAI function float GetTimeToWaitBeforeFiring() { - switch(Skill) + if ( Level.NetMode != NM_Standalone ) + { + switch(Skill) + { + case EnemySkill_High: + return RandRange(class'SwatEnemyConfig'.default.HighSkillMinTimeBeforeShooting, class'SwatEnemyConfig'.default.HighSkillMaxTimeBeforeShooting); + case EnemySkill_Medium: + return RandRange(class'SwatEnemyConfig'.default.MediumSkillMinTimeBeforeShooting, class'SwatEnemyConfig'.default.MediumSkillMaxTimeBeforeShooting); + case EnemySkill_Low: + return RandRange(class'SwatEnemyConfig'.default.LowSkillMinTimeBeforeShooting, class'SwatEnemyConfig'.default.LowSkillMaxTimeBeforeShooting); + } + } + else { - case EnemySkill_High: - return RandRange(class'SwatEnemyConfig'.default.HighSkillMinTimeBeforeShooting, class'SwatEnemyConfig'.default.HighSkillMaxTimeBeforeShooting); + switch(Skill) + { + case EnemySkill_High: + return RandRange(class'SwatEnemyConfig'.default.HighSkillMinTimeBeforeShootingSP, class'SwatEnemyConfig'.default.HighSkillMaxTimeBeforeShootingSP); case EnemySkill_Medium: - return RandRange(class'SwatEnemyConfig'.default.MediumSkillMinTimeBeforeShooting, class'SwatEnemyConfig'.default.MediumSkillMaxTimeBeforeShooting); + return RandRange(class'SwatEnemyConfig'.default.MediumSkillMinTimeBeforeShootingSP, class'SwatEnemyConfig'.default.MediumSkillMaxTimeBeforeShootingSP); case EnemySkill_Low: - return RandRange(class'SwatEnemyConfig'.default.LowSkillMinTimeBeforeShooting, class'SwatEnemyConfig'.default.LowSkillMaxTimeBeforeShooting); + return RandRange(class'SwatEnemyConfig'.default.LowSkillMinTimeBeforeShootingSP, class'SwatEnemyConfig'.default.LowSkillMaxTimeBeforeShootingSP); + } } } diff --git a/Source/Game/SwatGame/Classes/AI/SwatEnemyConfig.uc b/Source/Game/SwatGame/Classes/AI/SwatEnemyConfig.uc index 436f12d8..4d8a914b 100644 --- a/Source/Game/SwatGame/Classes/AI/SwatEnemyConfig.uc +++ b/Source/Game/SwatGame/Classes/AI/SwatEnemyConfig.uc @@ -30,12 +30,35 @@ var config float MediumSkillMaxTimeBeforeShooting; var config float HighSkillMinTimeBeforeShooting; var config float HighSkillMaxTimeBeforeShooting; +//SP only time before shoot +var config float LowSkillMinTimeBeforeShootingSP; +var config float LowSkillMaxTimeBeforeShootingSP; +var config float MediumSkillMinTimeBeforeShootingSP; +var config float MediumSkillMaxTimeBeforeShootingSP; +var config float HighSkillMinTimeBeforeShootingSP; +var config float HighSkillMaxTimeBeforeShootingSP; + defaultproperties { + /* OLD SEF VALUES LowSkillMinTimeBeforeShooting = 1.0 LowSkillMaxTimeBeforeShooting = 1.7 MediumSkillMinTimeBeforeShooting = 0.9 MediumSkillMaxTimeBeforeShooting = 1.3 HighSkillMinTimeBeforeShooting = 0.6 HighSkillMaxTimeBeforeShooting = 1.0 + */ +LowSkillMinTimeBeforeShooting = 0.8 +LowSkillMaxTimeBeforeShooting = 1.0 +MediumSkillMinTimeBeforeShooting = 0.6 +MediumSkillMaxTimeBeforeShooting = 0.8 +HighSkillMinTimeBeforeShooting = 0.4 +HighSkillMaxTimeBeforeShooting = 0.8 + +LowSkillMinTimeBeforeShootingSP = 0.6 +LowSkillMaxTimeBeforeShootingSP = 1.0 +MediumSkillMinTimeBeforeShootingSP = 0.6 +MediumSkillMaxTimeBeforeShootingSP = 0.8 +HighSkillMinTimeBeforeShootingSP = 0.4 +HighSkillMaxTimeBeforeShootingSP = 0.6 } \ No newline at end of file diff --git a/System/AI.ini b/System/AI.ini index b093e24b..ee888c23 100644 --- a/System/AI.ini +++ b/System/AI.ini @@ -899,9 +899,16 @@ MediumSkillFullBodyHitChance=0.7 LowSkillFullBodyHitChance=0.8 ; SEF-introduced delay before firing a weapon -LowSkillMinTimeBeforeShooting = 0.7 -LowSkillMaxTimeBeforeShooting = 1.2 +LowSkillMinTimeBeforeShooting = 0.8 +LowSkillMaxTimeBeforeShooting = 1.0 MediumSkillMinTimeBeforeShooting = 0.6 -MediumSkillMaxTimeBeforeShooting = 1.1 -HighSkillMinTimeBeforeShooting = 0.5 -HighSkillMaxTimeBeforeShooting = 0.8 \ No newline at end of file +MediumSkillMaxTimeBeforeShooting = 0.8 +HighSkillMinTimeBeforeShooting = 0.4 +HighSkillMaxTimeBeforeShooting = 0.8 + +LowSkillMinTimeBeforeShootingSP = 0.6 +LowSkillMaxTimeBeforeShootingSP = 1.0 +MediumSkillMinTimeBeforeShootingSP = 0.6 +MediumSkillMaxTimeBeforeShootingSP = 0.8 +HighSkillMinTimeBeforeShootingSP = 0.4 +HighSkillMaxTimeBeforeShootingSP = 0.6 \ No newline at end of file