Start reworking tile assigner

This commit is contained in:
Patrick 'Quezler' Mounier
2020-01-01 20:07:22 +01:00
parent 163bf15930
commit b8cede1cf5
3 changed files with 39 additions and 4 deletions

View File

@@ -68,6 +68,22 @@ public class Units{
return boolResult; return boolResult;
} }
/** Returns whether there are any entities on this tile. */
public static void allEntities(Tile tile, Cons<Unit> cons){
float size = tile.block().size * tilesize;
allEntities(tile.drawx() - size/2f, tile.drawy() - size/2f, size, size, cons);
}
public static void allEntities(float x, float y, float width, float height, Cons<Unit> cons){
nearby(x, y, width, height, unit -> {
if(!unit.isFlying()){
unit.hitbox(hitrect);
if(hitrect.overlaps(x, y, width, height)) cons.get(unit);
}
});
}
/** Returns the neareset damaged tile. */ /** Returns the neareset damaged tile. */
public static TileEntity findDamagedTile(Team team, float x, float y){ public static TileEntity findDamagedTile(Team team, float x, float y){
Tile tile = Geometry.findClosest(x, y, indexer.getDamaged(team)); Tile tile = Geometry.findClosest(x, y, indexer.getDamaged(team));

View File

@@ -13,7 +13,6 @@ import mindustry.graphics.*;
import arc.scene.ui.layout.*; import arc.scene.ui.layout.*;
import mindustry.entities.units.*; import mindustry.entities.units.*;
import mindustry.game.EventType.*; import mindustry.game.EventType.*;
import mindustry.entities.traits.*;
import mindustry.entities.Effects.*; import mindustry.entities.Effects.*;
import mindustry.world.blocks.distribution.PlastaniumConveyor.*; import mindustry.world.blocks.distribution.PlastaniumConveyor.*;
@@ -22,7 +21,7 @@ import static mindustry.Vars.*;
public class CraterUnit extends GroundUnit{ public class CraterUnit extends GroundUnit{
private final Effect io = Fx.plasticburn; // effect to play when poofing in and out of existence private final Effect io = Fx.plasticburn; // effect to play when poofing in and out of existence
private int inactivity = 0; private int inactivity = 0;
public TargetTrait purpose; public Tile purpose;
private final UnitState private final UnitState

View File

@@ -5,23 +5,43 @@ import arc.util.*;
import arc.struct.*; import arc.struct.*;
import mindustry.entities.*; import mindustry.entities.*;
import mindustry.entities.type.base.*; import mindustry.entities.type.base.*;
import mindustry.world.*;
import static mindustry.Vars.unitGroup; import static mindustry.Vars.*;
public class Hivemind{ public class Hivemind{
private static long lastFrameUpdated = -1; private static long lastFrameUpdated = -1;
private static Interval timer = new Interval(1); private static Interval timer = new Interval(1);
private static ObjectMap<Tile, CraterUnit> dibs = new ObjectMap<>();
public static void update(){ public static void update(){
if(Core.graphics.getFrameId() == lastFrameUpdated) return; if(Core.graphics.getFrameId() == lastFrameUpdated) return;
lastFrameUpdated = Core.graphics.getFrameId(); lastFrameUpdated = Core.graphics.getFrameId();
if(!timer.get(30)) return; if(!timer.get(30)) return;
dibs.clear();
ObjectSet<CraterUnit> craters = new ObjectSet<>(); ObjectSet<CraterUnit> craters = new ObjectSet<>();
unitGroup.all().each(e -> e instanceof CraterUnit, crater -> craters.add((CraterUnit)crater)); unitGroup.all().each(e -> e instanceof CraterUnit, crater -> craters.add((CraterUnit)crater));
craters.each(crater -> { craters.each(crater -> {
crater.purpose = Units.anyEntities(crater.aspires()) ? crater.on() : crater.aspires(); if(occupied(crater, crater.aspires())){
crater.purpose = crater.on();
}else{
crater.purpose = crater.aspires();
}
dibs.put(crater.purpose, crater);
}); });
} }
private static boolean occupied(CraterUnit crater, Tile tile){
final boolean[] result = {false};
Units.allEntities(tile, unit -> {
if(unit != crater) result[0] = true;
});
if(dibs.containsKey(tile) && dibs.get(tile) != crater) result[0] = true;
return result[0];
}
} }