package UnitInfo.core; import UnitInfo.ui.*; import arc.*; import arc.graphics.*; import arc.graphics.g2d.*; import arc.input.KeyCode; import arc.math.*; import arc.math.geom.Geometry; import arc.scene.*; import arc.scene.event.HandCursorListener; import arc.scene.style.*; import arc.scene.ui.*; import arc.scene.ui.layout.*; import arc.scene.utils.*; import arc.struct.*; import arc.util.*; import mindustry.*; import mindustry.content.*; import mindustry.entities.Units; import mindustry.entities.units.*; import mindustry.game.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.input.*; import mindustry.logic.Ranged; import mindustry.type.*; import mindustry.ui.*; import mindustry.world.*; import mindustry.world.blocks.ConstructBlock; import mindustry.world.blocks.ControlBlock; import mindustry.world.blocks.defense.turrets.*; import mindustry.world.blocks.storage.*; import static arc.Core.*; import static mindustry.Vars.*; public class HudUi { Seq bars = new Seq<>(); Table weapon = new Table(); Table mainTable = new Table(); Table baseTable = new Table(); Table unitTable = new Table(); Table waveTable = new Table(); Table coreTable = new Table(); Table tileTable = new Table(); Table itemTable = new Table(); float waveScrollPos; float coreScrollPos; float tileScrollPos; float itemScrollPos; Teamc lockedTarget; ImageButton lockButton; boolean locked = false; float charge; float a; int uiIndex = 0; //to update tables int waveamount; int coreamount; Seq strings = new Seq<>(new String[]{"","","","","",""}); Seq numbers = new Seq<>(new Float[]{0f,0f,0f,0f,0f,0f}); Seq colors = new Seq<>(new Color[]{Color.clear,Color.clear,Color.clear,Color.clear,Color.clear,Color.clear}); Seq lastColors = new Seq<>(new Color[]{Color.clear,Color.clear,Color.clear,Color.clear,Color.clear,Color.clear}); CoresItemsDisplay coreItems = new CoresItemsDisplay(Team.baseTeams); @Nullable Teamc target; @SuppressWarnings("unchecked") public T getTarget(){ if(locked && lockedTarget != null) return (T) lockedTarget; //if there is locked target, return it first. Seq units = Groups.unit.intersect(Core.input.mouseWorldX(), Core.input.mouseWorldY(), 4, 4); if(units.size > 0) return (T) units.peek(); //if there is unit, return it. else if(getTile() != null && getTile().build != null) return (T) getTile().build; //if there isn't unit but there is build, return it. else if(player.unit() instanceof BlockUnitUnit && ((BlockUnitUnit)player.unit()).tile() != null) return (T)((BlockUnitUnit)player.unit()).tile(); return (T) player.unit(); //if there are not unit and not build, return player. } public @Nullable Tile getTile(){ return Vars.world.tileWorld(Core.input.mouseWorldX(), Core.input.mouseWorldY()); } public void setEvent(){ Events.run(EventType.Trigger.draw, () -> { if(getTarget() == null || !Core.settings.getBool("select")) return; Posc entity = getTarget(); for(int i = 0; i < 4; i++){ float rot = i * 90f + 45f + (-Time.time) % 360f; float length = (entity instanceof Unit ? ((Unit)entity).hitSize : entity instanceof Building ? ((Building)entity).block.size * tilesize : 0) * 1.5f + 2.5f; Draw.color(Tmp.c1.set(locked ? Color.orange : Color.darkGray).lerp(locked ? Color.scarlet : Color.gray, Mathf.absin(Time.time, 2f, 1f)).a(settings.getInt("selectopacity") / 100f)); Draw.rect("select-arrow", entity.x() + Angles.trnsx(rot, length), entity.y() + Angles.trnsy(rot, length), length / 1.9f, length / 1.9f, rot - 135f); Draw.reset(); } }); Events.on(EventType.ResetEvent.class, e -> { if(settings.getBool("allTeam")) coreItems.teams = Team.all; else coreItems.teams = Team.baseTeams; coreItems.resetUsed(); coreItems.tables.each(Group::clear); }); Events.run(EventType.Trigger.update, ()->{ if((Core.input.keyDown(KeyCode.shiftRight) || Core.input.keyDown(KeyCode.shiftLeft)) && Core.input.keyTap(KeyCode.r)){ lockButton.change(); } if(!settings.getBool("autoShooting")) return; Unit unit = player.unit(); if(unit.type == null) return; boolean omni = unit.type.omniMovement; boolean validHealTarget = unit.type.canHeal && target instanceof Building && ((Building)target).isValid() && target.team() == unit.team && ((Building)target).damaged() && target.within(unit, unit.type.range); boolean boosted = (unit instanceof Mechc && unit.isFlying()); if((unit.type != null && Units.invalidateTarget(target, unit, unit.type.range) && !validHealTarget) || state.isEditor()){ target = null; } float mouseAngle = unit.angleTo(unit.aimX(), unit.aimY()); boolean aimCursor = omni && player.shooting && unit.type.hasWeapons() && unit.type.faceTarget && !boosted && unit.type.rotateShooting; if(aimCursor){ unit.lookAt(mouseAngle); }else{ unit.lookAt(unit.prefRotation()); } //update shooting if not building + not mining if(!player.unit().activelyBuilding() && player.unit().mineTile == null){ //autofire targeting if(input.keyDown(KeyCode.mouseLeft)) { player.shooting = !boosted; unit.aim(player.mouseX = Core.input.mouseWorldX(), player.mouseY = Core.input.mouseWorldY()); } else if(target == null){ player.shooting = false; if(unit instanceof BlockUnitUnit){ if(((BlockUnitUnit)unit).tile() instanceof ControlBlock && !((ControlBlock)((BlockUnitUnit)unit).tile()).shouldAutoTarget()){ Building build = ((BlockUnitUnit)unit).tile(); float range = build instanceof Ranged ? ((Ranged)build).range() : 0f; boolean targetGround = build instanceof Turret.TurretBuild && ((Turret) build.block).targetAir; boolean targetAir = build instanceof Turret.TurretBuild && ((Turret) build.block).targetGround; target = Units.closestTarget(build.team, build.x, build.y, range, u -> u.checkTarget(targetAir, targetGround), u -> targetGround); } else target = null; } else if(unit.type != null){ float range = unit.hasWeapons() ? unit.range() : 0f; target = Units.closestTarget(unit.team, unit.x, unit.y, range, u -> u.checkTarget(unit.type.targetAir, unit.type.targetGround), u -> unit.type.targetGround); if(unit.type.canHeal && target == null){ target = Geometry.findClosest(unit.x, unit.y, indexer.getDamaged(Team.sharded)); if(target != null && !unit.within(target, range)){ target = null; } } } }else { player.shooting = !boosted; unit.rotation(Angles.angle(unit.x, unit.y, target.x(), target.y())); unit.aim(target.x(), target.y()); } } unit.controlWeapons(player.shooting && !boosted); }); } public void reset(int index, Seq