diff --git a/core/src/mindustry/core/Renderer.java b/core/src/mindustry/core/Renderer.java index 1966f79cd2..1eb37957f2 100644 --- a/core/src/mindustry/core/Renderer.java +++ b/core/src/mindustry/core/Renderer.java @@ -72,6 +72,8 @@ public class Renderer implements ApplicationListener{ landPTimer, //intensity for screen shake shakeIntensity, + //reduction rate of screen shake + shakeReduction, //current duration of screen shake shakeTime; //for landTime > 0: if true, core is currently *launching*, otherwise landing. @@ -83,14 +85,15 @@ public class Renderer implements ApplicationListener{ Shaders.init(); Events.on(ResetEvent.class, e -> { - shakeTime = shakeIntensity = 0f; + shakeTime = shakeIntensity = shakeReduction = 0f; camShakeOffset.setZero(); }); } public void shake(float intensity, float duration){ - shakeIntensity = Math.max(shakeIntensity, intensity); + shakeIntensity = Math.max(shakeIntensity, Mathf.clamp(intensity, 0, 100)); shakeTime = Math.max(shakeTime, duration); + shakeReduction = shakeIntensity / shakeTime; } public void addEnvRenderer(int mask, Runnable render){ @@ -210,7 +213,7 @@ public class Renderer implements ApplicationListener{ float intensity = shakeIntensity * (settings.getInt("screenshake", 4) / 4f) * 0.75f; camShakeOffset.setToRandomDirection().scl(Mathf.random(intensity)); camera.position.add(camShakeOffset); - shakeIntensity -= 0.25f * Time.delta; + shakeIntensity -= shakeReduction * Time.delta; shakeTime -= Time.delta; shakeIntensity = Mathf.clamp(shakeIntensity, 0f, 100f); }else{ diff --git a/core/src/mindustry/entities/bullet/BulletType.java b/core/src/mindustry/entities/bullet/BulletType.java index 9797160948..5528832126 100644 --- a/core/src/mindustry/entities/bullet/BulletType.java +++ b/core/src/mindustry/entities/bullet/BulletType.java @@ -554,7 +554,7 @@ public class BulletType extends Content implements Cloneable{ public void init(Bullet b){ - if(killShooter && b.owner() instanceof Healthc h){ + if(killShooter && b.owner() instanceof Healthc h && !h.dead()){ h.kill(); } @@ -700,7 +700,6 @@ public class BulletType extends Content implements Cloneable{ return create(owner, team, x, y, angle, -1, velocityScl, lifetimeScl, null); } - public @Nullable Bullet create(Entityc owner, Team team, float x, float y, float angle, float velocityScl, float lifetimeScl, Mover mover){ return create(owner, team, x, y, angle, -1, velocityScl, lifetimeScl, null, mover); } @@ -732,24 +731,27 @@ public class BulletType extends Content implements Cloneable{ Unit spawned = spawnUnit.create(team); spawned.set(x, y); spawned.rotation = angle; + //immediately spawn at top speed, since it was launched if(spawnUnit.missileAccelTime <= 0f){ spawned.vel.trns(angle, spawnUnit.speed); } + //assign unit owner if(spawned.controller() instanceof MissileAI ai){ if(owner instanceof Unit unit){ ai.shooter = unit; } - if(owner instanceof ControlBlock control){ ai.shooter = control.unit(); } - } spawned.add(); } + //Since bullet init is never called, handle killing shooter here + if(killShooter && owner instanceof Healthc h && !h.dead()) h.kill(); + //no bullet returned return null; } diff --git a/core/src/mindustry/type/Weapon.java b/core/src/mindustry/type/Weapon.java index a52b423dba..b195b92e59 100644 --- a/core/src/mindustry/type/Weapon.java +++ b/core/src/mindustry/type/Weapon.java @@ -10,6 +10,7 @@ import arc.math.geom.*; import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; +import mindustry.ai.types.*; import mindustry.annotations.Annotations.*; import mindustry.audio.*; import mindustry.content.*; @@ -456,7 +457,8 @@ public class Weapon implements Cloneable{ lifeScl = bullet.scaleLife ? Mathf.clamp(Mathf.dst(bulletX, bulletY, mount.aimX, mount.aimY) / bullet.range) : 1f, angle = angleOffset + shootAngle + Mathf.range(inaccuracy + bullet.inaccuracy); - mount.bullet = bullet.create(unit, unit.team, bulletX, bulletY, angle, -1f, (1f - velocityRnd) + Mathf.random(velocityRnd), lifeScl, null, mover, mount.aimX, mount.aimY); + Entityc shooter = unit.controller() instanceof MissileAI ai ? ai.shooter : unit; //Pass the missile's shooter down to its bullets + mount.bullet = bullet.create(shooter, unit.team, bulletX, bulletY, angle, -1f, (1f - velocityRnd) + Mathf.random(velocityRnd), lifeScl, null, mover, mount.aimX, mount.aimY); handleBullet(unit, mount, mount.bullet); if(!continuous){ diff --git a/core/src/mindustry/world/blocks/defense/turrets/Turret.java b/core/src/mindustry/world/blocks/defense/turrets/Turret.java index 6fc1f5ae10..2a3862837f 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/Turret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/Turret.java @@ -468,10 +468,10 @@ public class Turret extends ReloadTurret{ target = Units.bestEnemy(team, x, y, range, e -> !e.dead() && !e.isGrounded() && unitFilter.get(e), unitSort); }else{ target = Units.bestTarget(team, x, y, range, e -> !e.dead() && unitFilter.get(e) && (e.isGrounded() || targetAir) && (!e.isGrounded() || targetGround), b -> targetGround && buildingFilter.get(b), unitSort); + } - if(target == null && canHeal()){ - target = Units.findAllyTile(team, x, y, range, b -> b.damaged() && b != this); - } + if(target == null && canHeal()){ + target = Units.findAllyTile(team, x, y, range, b -> b.damaged() && b != this); } }