improvement range draw

This commit is contained in:
Sharlotte
2022-09-21 07:16:04 +09:00
parent f692e846d8
commit 99bce1165c

View File

@@ -4,14 +4,12 @@ import arc.graphics.Color;
import arc.graphics.g2d.*;
import arc.graphics.gl.FrameBuffer;
import arc.scene.style.TextureRegionDrawable;
import arc.struct.ObjectMap;
import arc.struct.Seq;
import mindustry.Vars;
import mindustry.game.Team;
import mindustry.gen.*;
import mindustry.graphics.Drawf;
import mindustry.world.blocks.defense.turrets.BaseTurret;
import mindustry.world.blocks.defense.turrets.TractorBeamTurret;
import mindustry.world.blocks.defense.turrets.Turret;
import mindustry.type.Weapon;
import mindustry.world.blocks.defense.turrets.*;
import static informatis.SVars.turretRange;
import static informatis.SUtils.*;
@@ -20,10 +18,10 @@ import static mindustry.Vars.player;
public class RangeDraw extends OverDraw {
FrameBuffer effectBuffer = new FrameBuffer();
ObjectMap<Team, Seq<BaseTurret.BaseTurretBuild>> turrets = new ObjectMap<>();
RangeDraw(String name, TextureRegionDrawable icon) {
super(name, icon);
registerOption("blockRange");
registerOption("unitRange");
registerOption("aliceRange");
registerOption("airRange");
@@ -34,44 +32,78 @@ public class RangeDraw extends OverDraw {
public void draw() {
if(!enabled) return;
effectBuffer.resize(graphics.getWidth(), graphics.getHeight());
Unit target = player.unit();
Unit unit = player.unit();
turrets.clear();
effectBuffer.resize(graphics.getWidth(), graphics.getHeight());
for(Team team : Team.baseTeams) {
Draw.drawRange(166 + (Team.baseTeams.length-team.id) * 3, 1, () -> effectBuffer.begin(Color.clear), () -> {
effectBuffer.end();
effectBuffer.blit(turretRange);
});
turrets.put(team, new Seq<>());
}
Groups.build.each(b-> settings.getBool("aliceRange") || player.team() != b.team, b -> {
if(b instanceof BaseTurret.BaseTurretBuild turret) {
float range = turret.range();
if (!isInCamera(b.x, b.y, range)) return;
boolean includeBlock = settings.getBool("blockRange"),
includeUnit = settings.getBool("unitRange"),
includeAir = settings.getBool("airRange"),
includeGround = settings.getBool("groundRange"),
includeAlice = settings.getBool("aliceRange"),
shader = settings.getBool("RangeShader");
Teamc selected = getTarget();
if(selected instanceof BaseTurret.BaseTurretBuild turretBuild) {
Drawf.dashCircle(turretBuild.x, turretBuild.y, turretBuild.range(), turretBuild.team.color);
} else if(selected instanceof Unit unit) {
Drawf.dashCircle(unit.x, unit.y, unit.range(), unit.team.color);
}
if(includeBlock) {
for(Building building : Groups.build) {
if(!((includeAlice || player.team() != building.team)
&& building instanceof BaseTurret.BaseTurretBuild turret && isInCamera(building.x, building.y, turret.range()))) continue;
boolean air = settings.getBool("airRange") && enabled;
boolean ground = settings.getBool("groundRange") && enabled;
boolean valid = false;
if (unit == null) valid = true;
else if (b instanceof Turret.TurretBuild build) {
Turret t = (Turret) build.block;
if(t.targetAir&&!air||t.targetGround&&!ground) return;
if((unit.isFlying() ? t.targetAir : t.targetGround) && build.hasAmmo() && build.canConsume()) valid = true;
} else if (b instanceof TractorBeamTurret.TractorBeamBuild build) {
TractorBeamTurret t = (TractorBeamTurret) build.block;
if(t.targetAir&&!air||t.targetGround&&!ground) return;
if((unit.isFlying() ? t.targetAir : t.targetGround) && build.canConsume()) valid = true;
if (target == null) valid = true;
else if (building instanceof Turret.TurretBuild turretBuild) {
Turret block = (Turret) turretBuild.block;
if(block.targetAir && !includeAir || block.targetGround && !includeGround) continue;
if((target.isFlying() ? block.targetAir : block.targetGround) && turretBuild.hasAmmo() && turretBuild.canConsume()) valid = true;
} else if (building instanceof TractorBeamTurret.TractorBeamBuild tractorBeamBuild) {
TractorBeamTurret block = (TractorBeamTurret) tractorBeamBuild.block;
if(block.targetAir && !includeAir || block.targetGround && !includeGround) continue;
if((target.isFlying() ? block.targetAir : block.targetGround) && tractorBeamBuild.canConsume()) valid = true;
}
int index = valid ? b.team.id : 0;
//non-base teams are considered as crux
int index = valid ? building.team.id > 5 ? 2 : building.team.id : 0;
float range = turret.range();
Draw.color(Team.baseTeams[index].color);
if (settings.getBool("RangeShader")) {
if (shader) {
Draw.z(166+(Team.baseTeams.length-index)*3);
Fill.poly(b.x, b.y, Lines.circleVertices(range), range);
} else Drawf.dashCircle(b.x, b.y, range, b.team.color);
Fill.poly(building.x, building.y, Lines.circleVertices(range), range);
} else Drawf.dashCircle(building.x, building.y, range, Team.baseTeams[index].color);
}
});
}
if(includeUnit) {
for(Unit unit : Groups.unit) {
if(!((includeAlice || player.team() != unit.team) && isInCamera(unit.x, unit.y, unit.range()))) continue;
boolean valid = false;
if (target == null) valid = true;
else if (!(unit.type.targetAir && !includeAir || unit.type.targetGround && !includeGround)
&& (target.isFlying() ?unit.type.targetAir : unit.type.targetGround)
&& unit.canShoot()
) valid = true;
//non-base teams are considered as crux
int index = valid ? unit.team.id > 5 ? 2 : unit.team.id : 0;
float range = unit.range();
Draw.color(Team.baseTeams[index].color);
if (shader) {
Draw.z(166 + (Team.baseTeams.length - index) * 3);
Fill.poly(unit.x, unit.y, Lines.circleVertices(range), range);
} else Drawf.dashCircle(unit.x, unit.y, range, Team.baseTeams[index].color);
}
}
}
}