Turrets target blocks / Added core no-build radius

This commit is contained in:
Anuken
2018-08-15 14:13:50 -04:00
parent 0267cb4006
commit c98fcbd795
8 changed files with 51 additions and 11 deletions

View File

@@ -34,6 +34,8 @@ public class Vars{
public static final float wavespace = 60 * 60 * 1.5f;
//set ridiculously high for now
public static final float coreBuildRange = 800999f;
public static final float enemyCoreBuildRange = 400f;
//discord group URL
public static final String discordURL = "https://discord.gg/BKADYds";
public static final String releasesURL = "https://api.github.com/repos/Anuken/Mindustry/releases";

View File

@@ -142,7 +142,7 @@ public class BlockIndexer{
for(int ty = ry * structQuadrantSize; ty < (ry + 1) * structQuadrantSize && ty < world.height(); ty++){
Tile other = world.tile(tx, ty);
if(other == null || other.entity == null || !pred.test(other)) continue;
if(other == null || other.entity == null || other.getTeam() != team || !pred.test(other)) continue;
TileEntity e = other.entity;

View File

@@ -53,6 +53,9 @@ public class Predict{
* See {@link #intercept(float, float, float, float, float, float, float)}.
*/
public static Vector2 intercept(TargetTrait src, TargetTrait dst, float v){
if(vec.set(dst.getVelocity().sub(src.getVelocity())).isZero()){
return vresult.set(dst.getX(), dst.getY());
}
return intercept(src.getX(), src.getY(), dst.getX(), dst.getY(), dst.getVelocity().x - src.getVelocity().x, dst.getVelocity().x - src.getVelocity().y, v);
}

View File

@@ -147,11 +147,14 @@ public class Units{
}
}
/**
* Returns the closest target enemy. First, units are checked, then tile entities.
*/
/**Returns the closest target enemy. First, units are checked, then tile entities.*/
public static TargetTrait getClosestTarget(Team team, float x, float y, float range){
Unit unit = getClosestEnemy(team, x, y, range, u -> true);
return getClosestTarget(team, x, y, range, u -> true);
}
/**Returns the closest target enemy. First, units are checked, then tile entities.*/
public static TargetTrait getClosestTarget(Team team, float x, float y, float range, Predicate<Unit> unitPred){
Unit unit = getClosestEnemy(team, x, y, range, unitPred);
if(unit != null){
return unit;
}else{

View File

@@ -24,6 +24,7 @@ import io.anuke.ucore.util.Mathf;
import static io.anuke.mindustry.Vars.*;
public class OverlayRenderer{
private float buildFadeTime;
public void drawBottom(){
for(Player player : players){
@@ -58,6 +59,24 @@ public class OverlayRenderer{
input.drawTop();
buildFadeTime = Mathf.lerpDelta(buildFadeTime, input.isPlacing() ? 1f : 0f, 0.06f);
Draw.reset();
Lines.stroke(buildFadeTime*2f);
if(buildFadeTime > 0.005f){
for(TeamData data : state.teams.enemyDataOf(player.getTeam())){
for(Tile core : data.cores){
float dst = Vector2.dst(player.x, player.y, core.drawx(), core.drawy());
if(dst < enemyCoreBuildRange * 1.5f){
Draw.color(Color.DARK_GRAY);
Lines.poly(core.drawx(), core.drawy() - 2, 200, enemyCoreBuildRange);
Draw.color(Palette.accent, data.team.color, 0.5f + Mathf.absin(Timers.time(), 10f, 0.5f));
Lines.poly(core.drawx(), core.drawy(), 200, enemyCoreBuildRange);
}
}
}
}
Draw.reset();
//draw selected block bars and info

View File

@@ -242,7 +242,7 @@ public class WorldGenerator{
int x = sectorX * sectorSize + localX + Short.MAX_VALUE;
int y = sectorY * sectorSize + localY + Short.MAX_VALUE;
Block floor = Blocks.stone;
Block floor;
Block wall = Blocks.air;
double ridge = rid.getValue(x, y, 1f / 400f);
@@ -285,6 +285,8 @@ public class WorldGenerator{
}
}else if(minDst > lerpDst/1.5f){
floor = Blocks.lava;
}else{
floor = Blocks.blackstone;
}
if(temp < 0.6f){

View File

@@ -1,10 +1,12 @@
package io.anuke.mindustry.world;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector2;
import io.anuke.mindustry.content.blocks.Blocks;
import io.anuke.mindustry.entities.Units;
import io.anuke.mindustry.game.EventType.BlockBuildEvent;
import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.game.TeamInfo.TeamData;
import io.anuke.mindustry.type.Recipe;
import io.anuke.mindustry.world.blocks.BuildBlock.BuildEntity;
import io.anuke.ucore.core.Events;
@@ -135,6 +137,15 @@ public class Build{
}
}
//check for enemy cores
for(TeamData data : state.teams.enemyDataOf(team)){
for(Tile core : data.cores){
if(Vector2.dst(x*tilesize + type.offset(), y*tilesize + type.offset(), core.drawx(), core.drawy()) < enemyCoreBuildRange + type.size*tilesize/2f){
return false;
}
}
}
Tile tile = world.tile(x, y);
if(tile == null) return false;

View File

@@ -7,10 +7,10 @@ import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.content.fx.Fx;
import io.anuke.mindustry.entities.Predict;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.entities.Unit;
import io.anuke.mindustry.entities.Units;
import io.anuke.mindustry.entities.bullet.Bullet;
import io.anuke.mindustry.entities.bullet.BulletType;
import io.anuke.mindustry.entities.traits.TargetTrait;
import io.anuke.mindustry.graphics.Layer;
import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.type.AmmoEntry;
@@ -37,7 +37,7 @@ import java.io.IOException;
import static io.anuke.mindustry.Vars.tilesize;
public abstract class Turret extends Block{
protected static final int targetInterval = 15;
protected static final int targetInterval = 20;
protected final int timerTarget = timers++;
@@ -188,11 +188,11 @@ public abstract class Turret extends Block{
if(hasAmmo(tile)){
if(entity.timer.get(timerTarget, targetInterval)){
entity.target = Units.getClosestEnemy(tile.getTeam(),
entity.target = Units.getClosestTarget(tile.getTeam(),
tile.drawx(), tile.drawy(), range, e -> !e.isDead() && (!e.isFlying() || targetAir));
}
if(entity.target != null){
if(!Units.invalidateTarget(entity.target, tile.getTeam(), tile.drawx(), tile.drawy())){
AmmoType type = peekAmmo(tile);
float speed = type.bullet.speed;
if(speed < 0.1f) speed = 9999999f;
@@ -322,7 +322,7 @@ public abstract class Turret extends Block{
public float recoil = 0f;
public float heat;
public int shots;
public Unit target;
public TargetTrait target;
@Override
public void write(DataOutputStream stream) throws IOException{