diff --git a/core/src/mindustry/Vars.java b/core/src/mindustry/Vars.java index dfd2984e75..7b6da2a683 100644 --- a/core/src/mindustry/Vars.java +++ b/core/src/mindustry/Vars.java @@ -68,6 +68,8 @@ public class Vars implements Loadable{ public static final String reportIssueURL = "https://github.com/Anuken/Mindustry/issues/new?labels=bug&template=bug_report.md"; /** list of built-in servers.*/ public static final Seq defaultServers = Seq.with(); + /** whether multi-tile mining is enabled */ + public static final boolean multimine = false; /** maximum distance between mine and core that supports automatic transferring */ public static final float mineTransferRange = 220f; /** max chat message length */ diff --git a/core/src/mindustry/ai/BlockIndexer.java b/core/src/mindustry/ai/BlockIndexer.java index 5f96f00764..26782e380a 100644 --- a/core/src/mindustry/ai/BlockIndexer.java +++ b/core/src/mindustry/ai/BlockIndexer.java @@ -314,6 +314,7 @@ public class BlockIndexer{ /** Find the closest ore block relative to a position. */ public Tile findClosestOre(Unit unit, Item item){ + if(multimine) return findClosestOre(unit.x, unit.y, item); if(!(unit instanceof Minerc miner)) return null; TileArray arr = getOrePositions(item); diff --git a/core/src/mindustry/ai/types/FormationAI.java b/core/src/mindustry/ai/types/FormationAI.java index 3c5a2b99b4..65bc5f9529 100644 --- a/core/src/mindustry/ai/types/FormationAI.java +++ b/core/src/mindustry/ai/types/FormationAI.java @@ -2,14 +2,19 @@ package mindustry.ai.types; import arc.math.*; import arc.math.geom.*; +import arc.struct.*; import arc.util.*; import mindustry.ai.formations.*; import mindustry.entities.units.*; import mindustry.gen.*; import mindustry.type.*; +import mindustry.world.*; import mindustry.world.blocks.storage.CoreBlock.*; +import static mindustry.Vars.*; + public class FormationAI extends AIController implements FormationMember{ + private static Seq tiles = new Seq<>(); public Unit leader; private Vec3 target = new Vec3(); @@ -51,19 +56,33 @@ public class FormationAI extends AIController implements FormationMember{ Vec2 realtarget = vec.set(target); - float margin = 3f; + float margin = 4f; float speed = unit.realSpeed(); if(unit.dst(realtarget) <= margin){ - unit.vel.approachDelta(Vec2.ZERO, speed * type.accel / 2f); + //unit.vel.approachDelta(Vec2.ZERO, speed * type.accel / 2f); }else{ unit.moveAt(realtarget.sub(unit).limit(speed)); } if(unit instanceof Minerc mine && leader instanceof Minerc com){ - if(mine.validMine(com.mineTile())){ - mine.mineTile(com.mineTile()); + if(com.mineTile() != null){ + if(multimine){ + mine.mineTile(mine.validMine(com.mineTile()) ? com.mineTile() : null); + }else{ + if(mine.mineTile() == null){ + tiles.clear(); + com.mineTile().circle(6, (cx, cy) -> { + Tile tile = world.tile(cx, cy); + if(mine.validMine(tile) && tile.drop() == com.mineTile().drop() && tile != com.mineTile()){ + tiles.add(tile); + } + }); + Tile min = tiles.min(t -> t.dst2(com.mineTile())); + mine.mineTile(min); + } + } CoreBuild core = unit.team.core(); @@ -77,7 +96,6 @@ public class FormationAI extends AIController implements FormationMember{ }else{ mine.mineTile(null); } - } if(unit instanceof Builderc build && leader instanceof Builderc com && com.activelyBuilding()){ diff --git a/core/src/mindustry/content/Bullets.java b/core/src/mindustry/content/Bullets.java index c8ad4d22f9..16aa3916ea 100644 --- a/core/src/mindustry/content/Bullets.java +++ b/core/src/mindustry/content/Bullets.java @@ -474,7 +474,7 @@ public class Bullets implements ContentList{ drag = 0.001f; ammoMultiplier = 2f; statusDuration = 60f * 4f; - damage = 0.1f; + damage = 0.2f; }}; heavyCryoShot = new LiquidBulletType(Liquids.cryofluid){{ @@ -485,7 +485,7 @@ public class Bullets implements ContentList{ drag = 0.001f; ammoMultiplier = 2f; statusDuration = 60f * 4f; - damage = 0.1f; + damage = 0.2f; }}; heavySlagShot = new LiquidBulletType(Liquids.slag){{ @@ -507,7 +507,7 @@ public class Bullets implements ContentList{ drag = 0.001f; ammoMultiplier = 2f; statusDuration = 60f * 4f; - damage = 0.1f; + damage = 0.2f; }}; driverBolt = new MassDriverBolt(); diff --git a/core/src/mindustry/entities/comp/MinerComp.java b/core/src/mindustry/entities/comp/MinerComp.java index c8a841f3d5..9476d855f5 100644 --- a/core/src/mindustry/entities/comp/MinerComp.java +++ b/core/src/mindustry/entities/comp/MinerComp.java @@ -37,7 +37,7 @@ abstract class MinerComp implements Itemsc, Posc, Teamc, Rotc, Drawc, Unitc{ public boolean validMine(Tile tile, boolean checkDst){ return !(tile == null || tile.block() != Blocks.air || (!within(tile.worldx(), tile.worldy(), miningRange) && checkDst) - || tile.drop() == null || !canMine(tile.drop())) && state.teams.canMine(self(), tile); + || tile.drop() == null || !canMine(tile.drop())) && state.teams.isValidMine(self(), tile); } public boolean validMine(Tile tile){ @@ -105,7 +105,7 @@ abstract class MinerComp implements Itemsc, Posc, Teamc, Rotc, Drawc, Unitc{ float ex = mineTile.worldx() + Mathf.sin(Time.time() + 48, swingScl, swingMag); float ey = mineTile.worldy() + Mathf.sin(Time.time() + 48, swingScl + 2f, swingMag); - Draw.z(Layer.flyingUnit - 0.1f); + Draw.z(Layer.flyingUnitLow - 0.1f); Draw.color(Color.lightGray, Color.white, 1f - flashScl + Mathf.absin(Time.time(), 0.5f, flashScl)); diff --git a/core/src/mindustry/game/Teams.java b/core/src/mindustry/game/Teams.java index fd2d3f441c..69bb1a87f0 100644 --- a/core/src/mindustry/game/Teams.java +++ b/core/src/mindustry/game/Teams.java @@ -145,15 +145,16 @@ public class Teams{ } } - /** @return whether this ore is taken. */ - public boolean canMine(Unit unit, Tile tile){ + /** @return whether this ore is not taken. */ + public boolean isValidMine(Unit unit, Tile tile){ + if(multimine) return true; if(tile == null) return false; Unit u = mined.get(tile.pos()); return u == unit || u == null; } public void registerMined(Tile tile, Unit unit){ - if(tile == null || unit == null) return; + if(tile == null || unit == null || multimine) return; mined.put(tile.pos(), unit); }