Turrets target blocks / Added core no-build radius
This commit is contained in:
@@ -34,6 +34,8 @@ public class Vars{
|
|||||||
public static final float wavespace = 60 * 60 * 1.5f;
|
public static final float wavespace = 60 * 60 * 1.5f;
|
||||||
//set ridiculously high for now
|
//set ridiculously high for now
|
||||||
public static final float coreBuildRange = 800999f;
|
public static final float coreBuildRange = 800999f;
|
||||||
|
|
||||||
|
public static final float enemyCoreBuildRange = 400f;
|
||||||
//discord group URL
|
//discord group URL
|
||||||
public static final String discordURL = "https://discord.gg/BKADYds";
|
public static final String discordURL = "https://discord.gg/BKADYds";
|
||||||
public static final String releasesURL = "https://api.github.com/repos/Anuken/Mindustry/releases";
|
public static final String releasesURL = "https://api.github.com/repos/Anuken/Mindustry/releases";
|
||||||
|
|||||||
@@ -142,7 +142,7 @@ public class BlockIndexer{
|
|||||||
for(int ty = ry * structQuadrantSize; ty < (ry + 1) * structQuadrantSize && ty < world.height(); ty++){
|
for(int ty = ry * structQuadrantSize; ty < (ry + 1) * structQuadrantSize && ty < world.height(); ty++){
|
||||||
Tile other = world.tile(tx, 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;
|
TileEntity e = other.entity;
|
||||||
|
|
||||||
|
|||||||
@@ -53,6 +53,9 @@ public class Predict{
|
|||||||
* See {@link #intercept(float, float, float, float, float, float, float)}.
|
* See {@link #intercept(float, float, float, float, float, float, float)}.
|
||||||
*/
|
*/
|
||||||
public static Vector2 intercept(TargetTrait src, TargetTrait dst, float v){
|
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);
|
return intercept(src.getX(), src.getY(), dst.getX(), dst.getY(), dst.getVelocity().x - src.getVelocity().x, dst.getVelocity().x - src.getVelocity().y, v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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){
|
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){
|
if(unit != null){
|
||||||
return unit;
|
return unit;
|
||||||
}else{
|
}else{
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import io.anuke.ucore.util.Mathf;
|
|||||||
import static io.anuke.mindustry.Vars.*;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
|
|
||||||
public class OverlayRenderer{
|
public class OverlayRenderer{
|
||||||
|
private float buildFadeTime;
|
||||||
|
|
||||||
public void drawBottom(){
|
public void drawBottom(){
|
||||||
for(Player player : players){
|
for(Player player : players){
|
||||||
@@ -58,6 +59,24 @@ public class OverlayRenderer{
|
|||||||
|
|
||||||
input.drawTop();
|
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.reset();
|
||||||
|
|
||||||
//draw selected block bars and info
|
//draw selected block bars and info
|
||||||
|
|||||||
@@ -242,7 +242,7 @@ public class WorldGenerator{
|
|||||||
int x = sectorX * sectorSize + localX + Short.MAX_VALUE;
|
int x = sectorX * sectorSize + localX + Short.MAX_VALUE;
|
||||||
int y = sectorY * sectorSize + localY + Short.MAX_VALUE;
|
int y = sectorY * sectorSize + localY + Short.MAX_VALUE;
|
||||||
|
|
||||||
Block floor = Blocks.stone;
|
Block floor;
|
||||||
Block wall = Blocks.air;
|
Block wall = Blocks.air;
|
||||||
|
|
||||||
double ridge = rid.getValue(x, y, 1f / 400f);
|
double ridge = rid.getValue(x, y, 1f / 400f);
|
||||||
@@ -285,6 +285,8 @@ public class WorldGenerator{
|
|||||||
}
|
}
|
||||||
}else if(minDst > lerpDst/1.5f){
|
}else if(minDst > lerpDst/1.5f){
|
||||||
floor = Blocks.lava;
|
floor = Blocks.lava;
|
||||||
|
}else{
|
||||||
|
floor = Blocks.blackstone;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(temp < 0.6f){
|
if(temp < 0.6f){
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
package io.anuke.mindustry.world;
|
package io.anuke.mindustry.world;
|
||||||
|
|
||||||
import com.badlogic.gdx.math.Rectangle;
|
import com.badlogic.gdx.math.Rectangle;
|
||||||
|
import com.badlogic.gdx.math.Vector2;
|
||||||
import io.anuke.mindustry.content.blocks.Blocks;
|
import io.anuke.mindustry.content.blocks.Blocks;
|
||||||
import io.anuke.mindustry.entities.Units;
|
import io.anuke.mindustry.entities.Units;
|
||||||
import io.anuke.mindustry.game.EventType.BlockBuildEvent;
|
import io.anuke.mindustry.game.EventType.BlockBuildEvent;
|
||||||
import io.anuke.mindustry.game.Team;
|
import io.anuke.mindustry.game.Team;
|
||||||
|
import io.anuke.mindustry.game.TeamInfo.TeamData;
|
||||||
import io.anuke.mindustry.type.Recipe;
|
import io.anuke.mindustry.type.Recipe;
|
||||||
import io.anuke.mindustry.world.blocks.BuildBlock.BuildEntity;
|
import io.anuke.mindustry.world.blocks.BuildBlock.BuildEntity;
|
||||||
import io.anuke.ucore.core.Events;
|
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);
|
Tile tile = world.tile(x, y);
|
||||||
|
|
||||||
if(tile == null) return false;
|
if(tile == null) return false;
|
||||||
|
|||||||
@@ -7,10 +7,10 @@ import com.badlogic.gdx.utils.Array;
|
|||||||
import io.anuke.mindustry.content.fx.Fx;
|
import io.anuke.mindustry.content.fx.Fx;
|
||||||
import io.anuke.mindustry.entities.Predict;
|
import io.anuke.mindustry.entities.Predict;
|
||||||
import io.anuke.mindustry.entities.TileEntity;
|
import io.anuke.mindustry.entities.TileEntity;
|
||||||
import io.anuke.mindustry.entities.Unit;
|
|
||||||
import io.anuke.mindustry.entities.Units;
|
import io.anuke.mindustry.entities.Units;
|
||||||
import io.anuke.mindustry.entities.bullet.Bullet;
|
import io.anuke.mindustry.entities.bullet.Bullet;
|
||||||
import io.anuke.mindustry.entities.bullet.BulletType;
|
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.Layer;
|
||||||
import io.anuke.mindustry.graphics.Palette;
|
import io.anuke.mindustry.graphics.Palette;
|
||||||
import io.anuke.mindustry.type.AmmoEntry;
|
import io.anuke.mindustry.type.AmmoEntry;
|
||||||
@@ -37,7 +37,7 @@ import java.io.IOException;
|
|||||||
import static io.anuke.mindustry.Vars.tilesize;
|
import static io.anuke.mindustry.Vars.tilesize;
|
||||||
|
|
||||||
public abstract class Turret extends Block{
|
public abstract class Turret extends Block{
|
||||||
protected static final int targetInterval = 15;
|
protected static final int targetInterval = 20;
|
||||||
|
|
||||||
protected final int timerTarget = timers++;
|
protected final int timerTarget = timers++;
|
||||||
|
|
||||||
@@ -188,11 +188,11 @@ public abstract class Turret extends Block{
|
|||||||
if(hasAmmo(tile)){
|
if(hasAmmo(tile)){
|
||||||
|
|
||||||
if(entity.timer.get(timerTarget, targetInterval)){
|
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));
|
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);
|
AmmoType type = peekAmmo(tile);
|
||||||
float speed = type.bullet.speed;
|
float speed = type.bullet.speed;
|
||||||
if(speed < 0.1f) speed = 9999999f;
|
if(speed < 0.1f) speed = 9999999f;
|
||||||
@@ -322,7 +322,7 @@ public abstract class Turret extends Block{
|
|||||||
public float recoil = 0f;
|
public float recoil = 0f;
|
||||||
public float heat;
|
public float heat;
|
||||||
public int shots;
|
public int shots;
|
||||||
public Unit target;
|
public TargetTrait target;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void write(DataOutputStream stream) throws IOException{
|
public void write(DataOutputStream stream) throws IOException{
|
||||||
|
|||||||
Reference in New Issue
Block a user