From 40c5510205e04defd63ddd967f4db17a5ee6857d Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Thu, 15 Jun 2023 10:57:27 -0700 Subject: [PATCH] Better handling of missiles splitting to other missiles (#8603) - Pass a shooter separate to owner into `BulletType#create`. `killShooter` kills the owner while the shooter is passed into the missile ai - `killShooter` no longer kills already dead units - `MissileAI` no longer aims at shooter's aim pos if the shooter is dead --- core/src/mindustry/ai/types/MissileAI.java | 2 +- core/src/mindustry/entities/bullet/BulletType.java | 12 +++++++++--- core/src/mindustry/type/Weapon.java | 4 +++- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/core/src/mindustry/ai/types/MissileAI.java b/core/src/mindustry/ai/types/MissileAI.java index b5d8271975..dc941df8a7 100644 --- a/core/src/mindustry/ai/types/MissileAI.java +++ b/core/src/mindustry/ai/types/MissileAI.java @@ -14,7 +14,7 @@ public class MissileAI extends AIController{ float time = unit instanceof TimedKillc t ? t.time() : 1000000f; - if(time >= unit.type.homingDelay && shooter != null){ + if(time >= unit.type.homingDelay && shooter != null && !shooter.dead()){ unit.lookAt(shooter.aimX, shooter.aimY); } diff --git a/core/src/mindustry/entities/bullet/BulletType.java b/core/src/mindustry/entities/bullet/BulletType.java index 9797160948..45e2c67313 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(); } @@ -726,6 +726,10 @@ public class BulletType extends Content implements Cloneable{ } public @Nullable Bullet create(@Nullable Entityc owner, Team team, float x, float y, float angle, float damage, float velocityScl, float lifetimeScl, Object data, @Nullable Mover mover, float aimX, float aimY){ + return create(owner, owner, team, x, y, angle, damage, velocityScl, lifetimeScl, data, mover, aimX, aimY); + } + + public @Nullable Bullet create(@Nullable Entityc owner, @Nullable Entityc shooter, Team team, float x, float y, float angle, float damage, float velocityScl, float lifetimeScl, Object data, @Nullable Mover mover, float aimX, float aimY){ if(spawnUnit != null){ //don't spawn units clientside! if(!net.client()){ @@ -738,17 +742,19 @@ public class BulletType extends Content implements Cloneable{ } //assign unit owner if(spawned.controller() instanceof MissileAI ai){ - if(owner instanceof Unit unit){ + if(shooter instanceof Unit unit){ ai.shooter = unit; } - if(owner instanceof ControlBlock control){ + if(shooter 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 fd8fd02304..1322ccc4d5 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.*; @@ -458,7 +459,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(unit, 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){