diff --git a/core/src/mindustry/entities/pattern/ShootBarrel.java b/core/src/mindustry/entities/pattern/ShootBarrel.java index dc23b0c4b9..5c564e5551 100644 --- a/core/src/mindustry/entities/pattern/ShootBarrel.java +++ b/core/src/mindustry/entities/pattern/ShootBarrel.java @@ -6,6 +6,14 @@ public class ShootBarrel extends ShootPattern{ /** offset of barrel to start on */ public int barrelOffset = 0; + @Override + public void flip(){ + barrels = barrels.clone(); + for(int i = 0; i < barrels.length; i += 3){ + barrels[i] *= -1; + } + } + @Override public void shoot(int totalShots, BulletHandler handler){ for(int i = 0; i < shots; i++){ diff --git a/core/src/mindustry/entities/pattern/ShootMulti.java b/core/src/mindustry/entities/pattern/ShootMulti.java index 45a7923a58..2d67874939 100644 --- a/core/src/mindustry/entities/pattern/ShootMulti.java +++ b/core/src/mindustry/entities/pattern/ShootMulti.java @@ -12,6 +12,18 @@ public class ShootMulti extends ShootPattern{ public ShootMulti(){ } + //deep copy needed for flips + @Override + public void flip(){ + source = source.copy(); + source.flip(); + dest = dest.clone(); + for(int i = 0; i < dest.length; i++){ + dest[i] = dest[i].copy(); + dest[i].flip(); + } + } + @Override public void shoot(int totalShots, BulletHandler handler){ source.shoot(totalShots, (x, y, rotation, delay, move) -> { diff --git a/core/src/mindustry/entities/pattern/ShootPattern.java b/core/src/mindustry/entities/pattern/ShootPattern.java index e3a6c56efe..2098d24291 100644 --- a/core/src/mindustry/entities/pattern/ShootPattern.java +++ b/core/src/mindustry/entities/pattern/ShootPattern.java @@ -3,7 +3,7 @@ package mindustry.entities.pattern; import mindustry.entities.*; /** Handles different types of bullet patterns for shooting. */ -public class ShootPattern{ +public class ShootPattern implements Cloneable{ /** amount of shots per "trigger pull" */ public int shots = 1; /** delay in ticks before first shot */ @@ -18,6 +18,19 @@ public class ShootPattern{ } } + /** Subclasses should override this to flip its sides. */ + public void flip(){ + + } + + public ShootPattern copy(){ + try{ + return (ShootPattern)clone(); + }catch(CloneNotSupportedException absurd){ + throw new RuntimeException("impending doom", absurd); + } + } + public interface BulletHandler{ /** * @param x x offset of bullet, should be transformed by weapon rotation diff --git a/core/src/mindustry/type/UnitType.java b/core/src/mindustry/type/UnitType.java index 0a20701b70..28dde56f3c 100644 --- a/core/src/mindustry/type/UnitType.java +++ b/core/src/mindustry/type/UnitType.java @@ -512,9 +512,7 @@ public class UnitType extends UnlockableContent{ //mirrors are copies with X values negated if(w.mirror){ Weapon copy = w.copy(); - copy.x *= -1; - copy.shootX *= -1; - copy.flipSprite = !copy.flipSprite; + copy.flip(); mapped.add(copy); //since there are now two weapons, the reload and recoil time must be doubled diff --git a/core/src/mindustry/type/Weapon.java b/core/src/mindustry/type/Weapon.java index c0f46348b5..94c48a9b2a 100644 --- a/core/src/mindustry/type/Weapon.java +++ b/core/src/mindustry/type/Weapon.java @@ -411,6 +411,14 @@ public class Weapon implements Cloneable{ mount.heat = 1f; } + public void flip(){ + x *= -1; + shootX *= -1; + flipSprite = !flipSprite; + shoot = shoot.copy(); + shoot.flip(); + } + public Weapon copy(){ try{ return (Weapon)clone();