diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 9ee4aa02f6..505a6a5b57 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -4954,6 +4954,7 @@ public class Blocks{ reload = 100f; recoil = 2f; range = 300; + trackingRange = range * 1.4f; shootCone = 30f; scaledHealth = 350; rotateSpeed = 1.5f; @@ -5290,6 +5291,7 @@ public class Blocks{ envEnabled |= Env.space; reload = 9f; range = 370; + trackingRange = range * 1.4f; shootCone = 100f; scaledHealth = 370; rotateSpeed = 2f; diff --git a/core/src/mindustry/world/blocks/defense/turrets/Turret.java b/core/src/mindustry/world/blocks/defense/turrets/Turret.java index e9f5331bbe..0679c6cdf2 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/Turret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/Turret.java @@ -60,6 +60,8 @@ public class Turret extends ReloadTurret{ public float shootX = 0f, shootY = Float.NEGATIVE_INFINITY; /** Random spread on the X axis. */ public float xRand = 0f; + /** Range at which it finds and locks on to the taget, but does not shoot. */ + public float trackingRange = 0f; /** Minimum bullet range. Used for artillery only. */ public float minRange = 0f; /** Minimum warmup needed to fire. */ @@ -182,6 +184,7 @@ public class Turret extends ReloadTurret{ if(newTargetInterval <= 0f) newTargetInterval = targetInterval; super.init(); + trackingRange = Math.max(range, trackingRange); } @Override @@ -248,6 +251,10 @@ public class Turret extends ReloadTurret{ return range; } + public float trackingRange(){ + return range() + trackingRange - range; + } + @Override public float warmup(){ return shootWarmup; @@ -425,6 +432,7 @@ public class Turret extends ReloadTurret{ targetPosition(target); if(Float.isNaN(rotation)) rotation = 0; + canShoot = within(target, range() + (target instanceof Sized hb ? hb.hitSize()/1.9f : 0f)); } if(!isControlled()){ @@ -475,7 +483,7 @@ public class Turret extends ReloadTurret{ } protected void findTarget(){ - float range = range(); + float range = trackingRange(); if(targetAir && !targetGround){ target = Units.bestEnemy(team, x, y, range, e -> !e.dead() && !e.isGrounded() && unitFilter.get(e), unitSort);