From 3bb2b646dba3763c20501858bb3bcd9cd943a6b6 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 11 Apr 2020 10:03:47 -0400 Subject: [PATCH] Networked unit control / Mimic AI prototype --- .../revisions/BuilderUnitEntity/0.json | 1 - .../revisions/BuilderUnitEntity/1.json | 1 - .../resources/revisions/BulletEntity/0.json | 1 - .../resources/revisions/BulletEntity/1.json | 1 - .../resources/revisions/DecalEntity/0.json | 1 - .../resources/revisions/FireEntity/0.json | 1 - .../revisions/GroundEffectEntity/0.json | 1 - .../revisions/GroundEffectEntity/1.json | 1 - .../resources/revisions/LegsUnitEntity/0.json | 1 - .../resources/revisions/LegsUnitEntity/1.json | 1 - .../revisions/MinerUnitEntity/0.json | 1 - .../revisions/MinerUnitEntity/1.json | 1 - .../resources/revisions/PlayerEntity/0.json | 1 - .../resources/revisions/PuddleEntity/0.json | 1 - .../revisions/StandardEffectEntity/0.json | 1 - .../revisions/StandardEffectEntity/1.json | 1 - .../resources/revisions/TileEntity/0.json | 1 - .../resources/revisions/TileEntity/1.json | 1 - .../resources/revisions/TileEntity/2.json | 1 - .../resources/revisions/UnitEntity/0.json | 1 - .../resources/revisions/UnitEntity/1.json | 1 - .../revisions/UnitWaterMoveEntity/0.json | 1 - .../revisions/UnitWaterMoveEntity/1.json | 1 - .../resources/revisions/WeatherEntity/0.json | 1 - .../resources/revisions/WeatherEntity/1.json | 1 - core/src/mindustry/ai/types/MimicAI.java | 31 +++++++++++++++++++ .../mindustry/entities/def/FlyingComp.java | 8 +++-- core/src/mindustry/entities/def/TileComp.java | 1 + core/src/mindustry/entities/def/UnitComp.java | 13 ++++++++ .../mindustry/entities/def/WeaponsComp.java | 8 ++++- core/src/mindustry/input/DesktopInput.java | 27 +++++++++++----- core/src/mindustry/input/InputHandler.java | 10 ++++++ 32 files changed, 87 insertions(+), 36 deletions(-) delete mode 100644 annotations/src/main/resources/revisions/BuilderUnitEntity/0.json delete mode 100644 annotations/src/main/resources/revisions/BuilderUnitEntity/1.json delete mode 100644 annotations/src/main/resources/revisions/BulletEntity/0.json delete mode 100644 annotations/src/main/resources/revisions/BulletEntity/1.json delete mode 100644 annotations/src/main/resources/revisions/DecalEntity/0.json delete mode 100644 annotations/src/main/resources/revisions/FireEntity/0.json delete mode 100644 annotations/src/main/resources/revisions/GroundEffectEntity/0.json delete mode 100644 annotations/src/main/resources/revisions/GroundEffectEntity/1.json delete mode 100644 annotations/src/main/resources/revisions/LegsUnitEntity/0.json delete mode 100644 annotations/src/main/resources/revisions/LegsUnitEntity/1.json delete mode 100644 annotations/src/main/resources/revisions/MinerUnitEntity/0.json delete mode 100644 annotations/src/main/resources/revisions/MinerUnitEntity/1.json delete mode 100644 annotations/src/main/resources/revisions/PlayerEntity/0.json delete mode 100644 annotations/src/main/resources/revisions/PuddleEntity/0.json delete mode 100644 annotations/src/main/resources/revisions/StandardEffectEntity/0.json delete mode 100644 annotations/src/main/resources/revisions/StandardEffectEntity/1.json delete mode 100644 annotations/src/main/resources/revisions/TileEntity/0.json delete mode 100644 annotations/src/main/resources/revisions/TileEntity/1.json delete mode 100644 annotations/src/main/resources/revisions/TileEntity/2.json delete mode 100644 annotations/src/main/resources/revisions/UnitEntity/0.json delete mode 100644 annotations/src/main/resources/revisions/UnitEntity/1.json delete mode 100644 annotations/src/main/resources/revisions/UnitWaterMoveEntity/0.json delete mode 100644 annotations/src/main/resources/revisions/UnitWaterMoveEntity/1.json delete mode 100644 annotations/src/main/resources/revisions/WeatherEntity/0.json delete mode 100644 annotations/src/main/resources/revisions/WeatherEntity/1.json create mode 100644 core/src/mindustry/ai/types/MimicAI.java diff --git a/annotations/src/main/resources/revisions/BuilderUnitEntity/0.json b/annotations/src/main/resources/revisions/BuilderUnitEntity/0.json deleted file mode 100644 index a3e717b9b7..0000000000 --- a/annotations/src/main/resources/revisions/BuilderUnitEntity/0.json +++ /dev/null @@ -1 +0,0 @@ -{fields:[{name:drownTime,type:float,size:4},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:rotation,type:float,size:4},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/BuilderUnitEntity/1.json b/annotations/src/main/resources/revisions/BuilderUnitEntity/1.json deleted file mode 100644 index 23551d87ee..0000000000 --- a/annotations/src/main/resources/revisions/BuilderUnitEntity/1.json +++ /dev/null @@ -1 +0,0 @@ -{version:1,fields:[{name:drownTime,type:float,size:4},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:range,type:float,size:4},{name:rotation,type:float,size:4},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/BulletEntity/0.json b/annotations/src/main/resources/revisions/BulletEntity/0.json deleted file mode 100644 index d48581d45f..0000000000 --- a/annotations/src/main/resources/revisions/BulletEntity/0.json +++ /dev/null @@ -1 +0,0 @@ -{fields:[{name:damage,type:float,size:4},{name:lifetime,type:float,size:4},{name:team,type:mindustry.game.Team,size:-1},{name:time,type:float,size:4},{name:type,type:mindustry.entities.bullet.BulletType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/BulletEntity/1.json b/annotations/src/main/resources/revisions/BulletEntity/1.json deleted file mode 100644 index 12fac9d49b..0000000000 --- a/annotations/src/main/resources/revisions/BulletEntity/1.json +++ /dev/null @@ -1 +0,0 @@ -{version:1,fields:[{name:damage,type:float,size:4},{name:data,type:java.lang.Object,size:-1},{name:lifetime,type:float,size:4},{name:team,type:mindustry.game.Team,size:-1},{name:time,type:float,size:4},{name:type,type:mindustry.entities.bullet.BulletType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/DecalEntity/0.json b/annotations/src/main/resources/revisions/DecalEntity/0.json deleted file mode 100644 index b8d564d18c..0000000000 --- a/annotations/src/main/resources/revisions/DecalEntity/0.json +++ /dev/null @@ -1 +0,0 @@ -{fields:[{name:color,type:arc.graphics.Color,size:-1},{name:lifetime,type:float,size:4},{name:rotation,type:float,size:4},{name:time,type:float,size:4},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/FireEntity/0.json b/annotations/src/main/resources/revisions/FireEntity/0.json deleted file mode 100644 index a5423a835b..0000000000 --- a/annotations/src/main/resources/revisions/FireEntity/0.json +++ /dev/null @@ -1 +0,0 @@ -{fields:[{name:baseFlammability,type:float,size:4},{name:block,type:mindustry.world.Block,size:-1},{name:lifetime,type:float,size:4},{name:puddleFlammability,type:float,size:4},{name:tile,type:mindustry.world.Tile,size:-1},{name:time,type:float,size:4},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/GroundEffectEntity/0.json b/annotations/src/main/resources/revisions/GroundEffectEntity/0.json deleted file mode 100644 index b6304be289..0000000000 --- a/annotations/src/main/resources/revisions/GroundEffectEntity/0.json +++ /dev/null @@ -1 +0,0 @@ -{fields:[{name:color,type:arc.graphics.Color,size:-1},{name:lifetime,type:float,size:4},{name:offsetX,type:float,size:4},{name:offsetY,type:float,size:4},{name:rotation,type:float,size:4},{name:time,type:float,size:4},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/GroundEffectEntity/1.json b/annotations/src/main/resources/revisions/GroundEffectEntity/1.json deleted file mode 100644 index 30c8ffb44e..0000000000 --- a/annotations/src/main/resources/revisions/GroundEffectEntity/1.json +++ /dev/null @@ -1 +0,0 @@ -{version:1,fields:[{name:color,type:arc.graphics.Color,size:-1},{name:data,type:java.lang.Object,size:-1},{name:lifetime,type:float,size:4},{name:offsetX,type:float,size:4},{name:offsetY,type:float,size:4},{name:rotation,type:float,size:4},{name:time,type:float,size:4},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/LegsUnitEntity/0.json b/annotations/src/main/resources/revisions/LegsUnitEntity/0.json deleted file mode 100644 index 8946f13fa4..0000000000 --- a/annotations/src/main/resources/revisions/LegsUnitEntity/0.json +++ /dev/null @@ -1 +0,0 @@ -{fields:[{name:baseRotation,type:float,size:4},{name:drownTime,type:float,size:4},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:rotation,type:float,size:4},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/LegsUnitEntity/1.json b/annotations/src/main/resources/revisions/LegsUnitEntity/1.json deleted file mode 100644 index 8f4169f9d3..0000000000 --- a/annotations/src/main/resources/revisions/LegsUnitEntity/1.json +++ /dev/null @@ -1 +0,0 @@ -{version:1,fields:[{name:baseRotation,type:float,size:4},{name:drownTime,type:float,size:4},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:range,type:float,size:4},{name:rotation,type:float,size:4},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/MinerUnitEntity/0.json b/annotations/src/main/resources/revisions/MinerUnitEntity/0.json deleted file mode 100644 index d8ae40cd01..0000000000 --- a/annotations/src/main/resources/revisions/MinerUnitEntity/0.json +++ /dev/null @@ -1 +0,0 @@ -{fields:[{name:drownTime,type:float,size:4},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:mineTile,type:mindustry.world.Tile,size:-1},{name:rotation,type:float,size:4},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/MinerUnitEntity/1.json b/annotations/src/main/resources/revisions/MinerUnitEntity/1.json deleted file mode 100644 index 0321e5b69d..0000000000 --- a/annotations/src/main/resources/revisions/MinerUnitEntity/1.json +++ /dev/null @@ -1 +0,0 @@ -{version:1,fields:[{name:drownTime,type:float,size:4},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:mineTile,type:mindustry.world.Tile,size:-1},{name:range,type:float,size:4},{name:rotation,type:float,size:4},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/PlayerEntity/0.json b/annotations/src/main/resources/revisions/PlayerEntity/0.json deleted file mode 100644 index 5b9d12787d..0000000000 --- a/annotations/src/main/resources/revisions/PlayerEntity/0.json +++ /dev/null @@ -1 +0,0 @@ -{fields:[{name:admin,type:boolean,size:1},{name:color,type:arc.graphics.Color,size:-1},{name:lastText,type:java.lang.String,size:-1},{name:mouseX,type:float,size:4},{name:mouseY,type:float,size:4},{name:name,type:java.lang.String,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:textFadeTime,type:float,size:4},{name:typing,type:boolean,size:1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/PuddleEntity/0.json b/annotations/src/main/resources/revisions/PuddleEntity/0.json deleted file mode 100644 index 09114ed8ea..0000000000 --- a/annotations/src/main/resources/revisions/PuddleEntity/0.json +++ /dev/null @@ -1 +0,0 @@ -{fields:[{name:accepting,type:float,size:4},{name:amount,type:float,size:4},{name:generation,type:int,size:4},{name:lastRipple,type:float,size:4},{name:liquid,type:mindustry.type.Liquid,size:-1},{name:tile,type:mindustry.world.Tile,size:-1},{name:updateTime,type:float,size:4},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/StandardEffectEntity/0.json b/annotations/src/main/resources/revisions/StandardEffectEntity/0.json deleted file mode 100644 index b6304be289..0000000000 --- a/annotations/src/main/resources/revisions/StandardEffectEntity/0.json +++ /dev/null @@ -1 +0,0 @@ -{fields:[{name:color,type:arc.graphics.Color,size:-1},{name:lifetime,type:float,size:4},{name:offsetX,type:float,size:4},{name:offsetY,type:float,size:4},{name:rotation,type:float,size:4},{name:time,type:float,size:4},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/StandardEffectEntity/1.json b/annotations/src/main/resources/revisions/StandardEffectEntity/1.json deleted file mode 100644 index 30c8ffb44e..0000000000 --- a/annotations/src/main/resources/revisions/StandardEffectEntity/1.json +++ /dev/null @@ -1 +0,0 @@ -{version:1,fields:[{name:color,type:arc.graphics.Color,size:-1},{name:data,type:java.lang.Object,size:-1},{name:lifetime,type:float,size:4},{name:offsetX,type:float,size:4},{name:offsetY,type:float,size:4},{name:rotation,type:float,size:4},{name:time,type:float,size:4},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/TileEntity/0.json b/annotations/src/main/resources/revisions/TileEntity/0.json deleted file mode 100644 index 2e02b6b8d2..0000000000 --- a/annotations/src/main/resources/revisions/TileEntity/0.json +++ /dev/null @@ -1 +0,0 @@ -{fields:[{name:health,type:float,size:4},{name:team,type:mindustry.game.Team,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/TileEntity/1.json b/annotations/src/main/resources/revisions/TileEntity/1.json deleted file mode 100644 index edafbbad0d..0000000000 --- a/annotations/src/main/resources/revisions/TileEntity/1.json +++ /dev/null @@ -1 +0,0 @@ -{version:1,fields:[{name:health,type:float,size:4},{name:team,type:mindustry.game.Team,size:-1},{name:updateFlow,type:boolean,size:1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/TileEntity/2.json b/annotations/src/main/resources/revisions/TileEntity/2.json deleted file mode 100644 index 9e3cfda794..0000000000 --- a/annotations/src/main/resources/revisions/TileEntity/2.json +++ /dev/null @@ -1 +0,0 @@ -{version:2,fields:[{name:health,type:float,size:4},{name:team,type:mindustry.game.Team,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/UnitEntity/0.json b/annotations/src/main/resources/revisions/UnitEntity/0.json deleted file mode 100644 index a3e717b9b7..0000000000 --- a/annotations/src/main/resources/revisions/UnitEntity/0.json +++ /dev/null @@ -1 +0,0 @@ -{fields:[{name:drownTime,type:float,size:4},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:rotation,type:float,size:4},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/UnitEntity/1.json b/annotations/src/main/resources/revisions/UnitEntity/1.json deleted file mode 100644 index 23551d87ee..0000000000 --- a/annotations/src/main/resources/revisions/UnitEntity/1.json +++ /dev/null @@ -1 +0,0 @@ -{version:1,fields:[{name:drownTime,type:float,size:4},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:range,type:float,size:4},{name:rotation,type:float,size:4},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/UnitWaterMoveEntity/0.json b/annotations/src/main/resources/revisions/UnitWaterMoveEntity/0.json deleted file mode 100644 index a3e717b9b7..0000000000 --- a/annotations/src/main/resources/revisions/UnitWaterMoveEntity/0.json +++ /dev/null @@ -1 +0,0 @@ -{fields:[{name:drownTime,type:float,size:4},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:rotation,type:float,size:4},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/UnitWaterMoveEntity/1.json b/annotations/src/main/resources/revisions/UnitWaterMoveEntity/1.json deleted file mode 100644 index 23551d87ee..0000000000 --- a/annotations/src/main/resources/revisions/UnitWaterMoveEntity/1.json +++ /dev/null @@ -1 +0,0 @@ -{version:1,fields:[{name:drownTime,type:float,size:4},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:range,type:float,size:4},{name:rotation,type:float,size:4},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/WeatherEntity/0.json b/annotations/src/main/resources/revisions/WeatherEntity/0.json deleted file mode 100644 index eaaaeead96..0000000000 --- a/annotations/src/main/resources/revisions/WeatherEntity/0.json +++ /dev/null @@ -1 +0,0 @@ -{fields:[]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/WeatherEntity/1.json b/annotations/src/main/resources/revisions/WeatherEntity/1.json deleted file mode 100644 index 254fbf608c..0000000000 --- a/annotations/src/main/resources/revisions/WeatherEntity/1.json +++ /dev/null @@ -1 +0,0 @@ -{version:1,fields:[{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/core/src/mindustry/ai/types/MimicAI.java b/core/src/mindustry/ai/types/MimicAI.java new file mode 100644 index 0000000000..6e4ea74ca3 --- /dev/null +++ b/core/src/mindustry/ai/types/MimicAI.java @@ -0,0 +1,31 @@ +package mindustry.ai.types; + +import arc.util.ArcAnnotate.*; +import arc.util.*; +import mindustry.entities.units.*; +import mindustry.gen.*; + +public class MimicAI extends AIController{ + public @Nullable Unitc control; + + public MimicAI(@Nullable Unitc control){ + this.control = control; + } + + public MimicAI(){ + } + + @Override + public void update(){ + if(control != null){ + unit.controlWeapons(control.isRotate(), control.isShooting()); + //TODO this isn't accurate + unit.moveAt(Tmp.v1.set(control.vel()).limit(unit.type().speed)); + if(control.isShooting()){ + unit.aimLook(control.aimX(), control.aimY()); + }else{ + unit.lookAt(unit.vel().angle()); + } + } + } +} diff --git a/core/src/mindustry/entities/def/FlyingComp.java b/core/src/mindustry/entities/def/FlyingComp.java index 4d87489e6a..0662d0dfa6 100644 --- a/core/src/mindustry/entities/def/FlyingComp.java +++ b/core/src/mindustry/entities/def/FlyingComp.java @@ -12,6 +12,8 @@ import static mindustry.Vars.net; @Component abstract class FlyingComp implements Posc, Velc, Healthc, Hitboxc{ + private static final Vec2 tmp1 = new Vec2(), tmp2 = new Vec2(); + @Import float x, y, drag; @Import Vec2 vel; @@ -37,9 +39,9 @@ abstract class FlyingComp implements Posc, Velc, Healthc, Hitboxc{ } void moveAt(Vec2 vector, float acceleration){ - Vec2 t = Tmp.v3.set(vector).scl(floorSpeedMultiplier()); //target vector - Tmp.v1.set(t).sub(vel).limit(acceleration * vector.len()); //delta vector - vel.add(Tmp.v1); + Vec2 t = tmp1.set(vector).scl(floorSpeedMultiplier()); //target vector + tmp2.set(t).sub(vel).limit(acceleration * vector.len()); //delta vector + vel.add(tmp2); } float floorSpeedMultiplier(){ diff --git a/core/src/mindustry/entities/def/TileComp.java b/core/src/mindustry/entities/def/TileComp.java index 289d09a5c6..a9a3e3e632 100644 --- a/core/src/mindustry/entities/def/TileComp.java +++ b/core/src/mindustry/entities/def/TileComp.java @@ -956,6 +956,7 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc{ Events.fire(new BlockDestroyEvent(tile)); block.breakSound.at(tile); onDestroyed(); + tile.remove(); remove(); } diff --git a/core/src/mindustry/entities/def/UnitComp.java b/core/src/mindustry/entities/def/UnitComp.java index 0db594fce9..89e15106b5 100644 --- a/core/src/mindustry/entities/def/UnitComp.java +++ b/core/src/mindustry/entities/def/UnitComp.java @@ -34,6 +34,11 @@ abstract class UnitComp implements Healthc, Velc, Statusc, Teamc, Itemsc, Hitbox lookAt(pos); } + public void aimLook(float x, float y){ + aim(x, y); + lookAt(x, y); + } + @Override public float clipSize(){ return type.region.getWidth() * 2f; @@ -109,6 +114,14 @@ abstract class UnitComp implements Healthc, Velc, Statusc, Teamc, Itemsc, Hitbox lookAt(angleTo(pos)); } + public void lookAt(float x, float y){ + lookAt(angleTo(x, y)); + } + + public boolean isAI(){ + return controller instanceof AIController; + } + @Override public void afterRead(){ //set up type info after reading diff --git a/core/src/mindustry/entities/def/WeaponsComp.java b/core/src/mindustry/entities/def/WeaponsComp.java index 0dc04a3061..fc345467e7 100644 --- a/core/src/mindustry/entities/def/WeaponsComp.java +++ b/core/src/mindustry/entities/def/WeaponsComp.java @@ -21,7 +21,8 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc{ /** weapon mount array, never null */ @ReadOnly WeaponMount[] mounts = {}; - @ReadOnly float range; + @ReadOnly transient float range, aimX, aimY; + @ReadOnly transient boolean isRotate, isShooting; boolean inRange(Position other){ return within(other, range); @@ -41,6 +42,8 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc{ mount.rotate = rotate; mount.shoot = shoot; } + isRotate = rotate; + isShooting = shoot; } void aim(Position pos){ @@ -59,6 +62,9 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc{ mount.aimX = x; mount.aimY = y; } + + aimX = x; + aimY = y; } /** Update shooting and rotation for this unit. */ diff --git a/core/src/mindustry/input/DesktopInput.java b/core/src/mindustry/input/DesktopInput.java index d3dba8096f..c0aae9dd9a 100644 --- a/core/src/mindustry/input/DesktopInput.java +++ b/core/src/mindustry/input/DesktopInput.java @@ -4,6 +4,7 @@ import arc.*; import arc.Graphics.*; import arc.Graphics.Cursor.*; import arc.graphics.g2d.*; +import arc.input.*; import arc.math.*; import arc.math.geom.*; import arc.scene.*; @@ -13,6 +14,8 @@ import arc.scene.ui.layout.*; import arc.util.ArcAnnotate.*; import arc.util.*; import mindustry.*; +import mindustry.ai.types.*; +import mindustry.content.*; import mindustry.entities.*; import mindustry.entities.units.*; import mindustry.game.EventType.*; @@ -170,15 +173,25 @@ public class DesktopInput extends InputHandler{ Core.camera.position.lerpDelta(player, 0.08f); } - //TODO remove: debug unit possession - if(Core.input.keyTap(Binding.select)){ - Unitc unit = Units.closest(state.rules.defaultTeam, Core.input.mouseWorld().x, Core.input.mouseWorld().y, 40f, u -> true); - if(unit != null){ - unit.hitbox(Tmp.r1); - if(Tmp.r1.contains(Core.input.mouseWorld())){ - player.unit(unit); + if(!scene.hasMouse()){ + if(Core.input.keyTap(Binding.select)){ + Unitc unit = Units.closest(player.team(), Core.input.mouseWorld().x, Core.input.mouseWorld().y, 40f, u -> true); + if(unit != null){ + unit.hitbox(Tmp.r1); + if(Tmp.r1.contains(Core.input.mouseWorld())){ + Call.onUnitControl(player, unit); + } } } + + if(Core.input.keyTap(KeyCode.Q) && !player.dead()){ + Fx.commandSend.at(player); + Units.nearby(player.team(), player.x(), player.y(), 200f, u -> { + if(u.isAI()){ + u.controller(new MimicAI(player.unit())); + } + }); + } } if(!player.dead() && !state.isPaused() && !(Core.scene.getKeyboardFocus() instanceof TextField)){ diff --git a/core/src/mindustry/input/InputHandler.java b/core/src/mindustry/input/InputHandler.java index b9fc0585c1..cd6dbc6a10 100644 --- a/core/src/mindustry/input/InputHandler.java +++ b/core/src/mindustry/input/InputHandler.java @@ -168,6 +168,16 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ Core.app.post(() -> Events.fire(new TapConfigEvent(tile, player, value))); } + @Remote(targets = Loc.both, called = Loc.server, forward = true) + public static void onUnitControl(Playerc player, @Nullable Unitc unit){ + if(unit == null){ + player.clearUnit(); + //make sure it's AI controlled, so players can't overwrite each other + }else if(unit.isAI() && unit.team() == player.team()){ + player.unit(unit); + } + } + public Eachable allRequests(){ return cons -> { for(BuildRequest request : player.builder().requests()) cons.get(request);