From e71230755da200b210aa36ce5560df1d68251fb4 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 16 Feb 2020 13:49:29 -0500 Subject: [PATCH] Fixed omnidirectional shooting with ignored rotation --- .../annotations/entity/EntityProcess.java | 1 + core/src/mindustry/content/UnitTypes.java | 2 +- core/src/mindustry/entities/def/WeaponsComp.java | 14 +++++++++----- core/src/mindustry/entities/units/WeaponMount.java | 2 ++ 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java b/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java index 4b1c7c0334..e68e505e02 100644 --- a/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java +++ b/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java @@ -520,6 +520,7 @@ public class EntityProcess extends BaseProcessor{ .returns(int.class).addModifiers(Modifier.PUBLIC).addStatement("return " + def.classID).build()); } + idBuilder.addStaticBlock(idStore.build()); write(idBuilder); diff --git a/core/src/mindustry/content/UnitTypes.java b/core/src/mindustry/content/UnitTypes.java index 128ce17266..e9421b71b6 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -31,7 +31,7 @@ public class UnitTypes implements ContentList{ mass = 1.75f; health = 130; weapons.add(new Weapon("chain-blaster"){{ - reload = 28f; + reload = 14f; x = 4f; alternate = true; ejectEffect = Fx.shellEjectSmall; diff --git a/core/src/mindustry/entities/def/WeaponsComp.java b/core/src/mindustry/entities/def/WeaponsComp.java index 3cbde1a375..ae0b13e9ef 100644 --- a/core/src/mindustry/entities/def/WeaponsComp.java +++ b/core/src/mindustry/entities/def/WeaponsComp.java @@ -67,7 +67,11 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc{ float axisX = this.x + Angles.trnsx(rotation, axisXOffset, weapon.y), axisY = this.y + Angles.trnsy(rotation, axisXOffset, weapon.y); - mount.rotation = Angles.moveToward(mount.rotation, Angles.angle(axisX, axisY, mount.aimX, mount.aimY) - rotation(), weapon.rotateSpeed); + mount.targetRotation = Angles.angle(axisX, axisY, mount.aimX, mount.aimY) - rotation(); + mount.rotation = Angles.moveToward(mount.rotation, mount.targetRotation, weapon.rotateSpeed); + }else{ + mount.rotation = this.rotation; + mount.targetRotation = angleTo(mount.aimX, mount.aimY); } if(mount.shoot){ @@ -75,17 +79,17 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc{ //shoot if applicable //TODO only shoot if angle is reached, don't shoot inaccurately - if(mount.reload <= 0.0001f){ + if(mount.reload <= 0.0001f && Angles.within(mount.rotation, mount.targetRotation, 1.5f)){ for(int i : (weapon.mirror && !weapon.alternate ? Mathf.signs : Mathf.one)){ i *= Mathf.sign(weapon.flipped) * Mathf.sign(mount.side); //m a t h float weaponRotation = rotation + (weapon.rotate ? mount.rotation : 0); float mountX = this.x + Angles.trnsx(rotation, weapon.x * i, weapon.y), - mountY = this.y + Angles.trnsy(rotation, weapon.x * i, weapon.y); + mountY = this.y + Angles.trnsy(rotation, weapon.x * i, weapon.y); float shootX = mountX + Angles.trnsx(weaponRotation, weapon.shootX * i, weapon.shootY), - shootY = mountY + Angles.trnsy(weaponRotation, weapon.shootX * i, weapon.shootY); - float shootAngle = weapon.rotate ? weaponRotation + 90 : Angles.angle(shootX, shootY, mount.aimX, mount.aimY); + shootY = mountY + Angles.trnsy(weaponRotation, weapon.shootX * i, weapon.shootY); + float shootAngle = weapon.rotate ? weaponRotation + 90 : Angles.angle(shootX, shootY, mount.aimX, mount.aimY) + (this.rotation - angleTo(mount.aimX, mount.aimY)); shoot(weapon, shootX, shootY, shootAngle); } diff --git a/core/src/mindustry/entities/units/WeaponMount.java b/core/src/mindustry/entities/units/WeaponMount.java index 35858de595..882c850aa0 100644 --- a/core/src/mindustry/entities/units/WeaponMount.java +++ b/core/src/mindustry/entities/units/WeaponMount.java @@ -9,6 +9,8 @@ public class WeaponMount{ public float reload; /** rotation relative to the unit this mount is on */ public float rotation; + /** destination rotation; do not modify! */ + public float targetRotation; /** aiming position in world coordinates */ public float aimX, aimY; /** side that's being shot - only valid for mirrors */