Flying unit factory implementation, bugfixes

This commit is contained in:
Anuken
2018-03-25 15:04:29 -04:00
parent 3418979f4d
commit 684b57d139
31 changed files with 479 additions and 345 deletions

View File

@@ -25,7 +25,7 @@ allprojects {
appName = 'Mindustry' appName = 'Mindustry'
gdxVersion = '1.9.8' gdxVersion = '1.9.8'
aiVersion = '1.8.1' aiVersion = '1.8.1'
uCoreVersion = '64d13cc' uCoreVersion = '238babe'
getVersionString = { getVersionString = {
String buildVersion = getBuildVersion() String buildVersion = getBuildVersion()

Binary file not shown.

After

Width:  |  Height:  |  Size: 255 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 421 B

After

Width:  |  Height:  |  Size: 297 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 307 B

View File

Before

Width:  |  Height:  |  Size: 195 B

After

Width:  |  Height:  |  Size: 195 B

View File

Before

Width:  |  Height:  |  Size: 177 B

After

Width:  |  Height:  |  Size: 177 B

View File

Before

Width:  |  Height:  |  Size: 264 B

After

Width:  |  Height:  |  Size: 264 B

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 93 KiB

After

Width:  |  Height:  |  Size: 93 KiB

View File

@@ -1,7 +1,7 @@
#Autogenerated file. Do not modify. #Autogenerated file. Do not modify.
#Sun Mar 25 13:11:36 EDT 2018 #Sun Mar 25 15:04:04 EDT 2018
version=release version=release
androidBuildCode=641 androidBuildCode=650
name=Mindustry name=Mindustry
code=3.4 code=3.4
build=custom build build=custom build

View File

@@ -3,7 +3,7 @@ package io.anuke.mindustry.content.blocks;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.types.PowerBlock; import io.anuke.mindustry.world.blocks.types.PowerBlock;
import io.anuke.mindustry.world.blocks.types.generation.PowerDistributor; import io.anuke.mindustry.world.blocks.types.power.PowerDistributor;
public class DebugBlocks { public class DebugBlocks {
public static final Block public static final Block

View File

@@ -7,18 +7,18 @@ import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.blocks.types.defense.RepairTurret; import io.anuke.mindustry.world.blocks.types.defense.RepairTurret;
import io.anuke.mindustry.world.blocks.types.defense.ShieldBlock; import io.anuke.mindustry.world.blocks.types.defense.ShieldBlock;
import io.anuke.mindustry.world.blocks.types.distribution.Teleporter; import io.anuke.mindustry.world.blocks.types.distribution.Teleporter;
import io.anuke.mindustry.world.blocks.types.generation.*; import io.anuke.mindustry.world.blocks.types.power.ItemPowerGenerator;
public class PowerBlocks { public class PowerBlocks {
public static final Block public static final Block
coalgenerator = new ItemPowerGenerator("coalgenerator") {{ coalgenerator = new io.anuke.mindustry.world.blocks.types.power.ItemPowerGenerator("coalgenerator") {{
generateItem = Items.coal; generateItem = Items.coal;
powerOutput = 0.04f; powerOutput = 0.04f;
powerCapacity = 40f; powerCapacity = 40f;
}}, }},
thermalgenerator = new LiquidPowerGenerator("thermalgenerator") {{ thermalgenerator = new io.anuke.mindustry.world.blocks.types.power.LiquidPowerGenerator("thermalgenerator") {{
generateLiquid = Liquids.lava; generateLiquid = Liquids.lava;
maxLiquidGenerate = 0.5f; maxLiquidGenerate = 0.5f;
powerPerLiquid = 0.08f; powerPerLiquid = 0.08f;
@@ -26,7 +26,7 @@ public class PowerBlocks {
generateEffect = Fx.redgeneratespark; generateEffect = Fx.redgeneratespark;
}}, }},
combustiongenerator = new LiquidPowerGenerator("combustiongenerator") {{ combustiongenerator = new io.anuke.mindustry.world.blocks.types.power.LiquidPowerGenerator("combustiongenerator") {{
generateLiquid = Liquids.oil; generateLiquid = Liquids.oil;
maxLiquidGenerate = 0.4f; maxLiquidGenerate = 0.4f;
powerPerLiquid = 0.12f; powerPerLiquid = 0.12f;
@@ -40,16 +40,16 @@ public class PowerBlocks {
itemDuration = 240f; itemDuration = 240f;
}}, }},
solarpanel = new SolarGenerator("solarpanel") {{ solarpanel = new io.anuke.mindustry.world.blocks.types.power.SolarGenerator("solarpanel") {{
generation = 0.003f; generation = 0.003f;
}}, }},
largesolarpanel = new SolarGenerator("largesolarpanel") {{ largesolarpanel = new io.anuke.mindustry.world.blocks.types.power.SolarGenerator("largesolarpanel") {{
size = 3; size = 3;
generation = 0.012f; generation = 0.012f;
}}, }},
nuclearReactor = new NuclearReactor("nuclearreactor") {{ nuclearReactor = new io.anuke.mindustry.world.blocks.types.power.NuclearReactor("nuclearreactor") {{
size = 3; size = 3;
health = 600; health = 600;
breaktime *= 2.3f; breaktime *= 2.3f;
@@ -74,16 +74,16 @@ public class PowerBlocks {
health = 400; health = 400;
}}, }},
battery = new PowerGenerator("battery") {{ battery = new io.anuke.mindustry.world.blocks.types.power.PowerGenerator("battery") {{
powerCapacity = 320f; powerCapacity = 320f;
}}, }},
batteryLarge = new PowerGenerator("batterylarge") {{ batteryLarge = new io.anuke.mindustry.world.blocks.types.power.PowerGenerator("batterylarge") {{
size = 3; size = 3;
powerCapacity = 2000f; powerCapacity = 2000f;
}}, }},
powernode = new PowerDistributor("powernode"), powernode = new io.anuke.mindustry.world.blocks.types.power.PowerDistributor("powernode"),
teleporter = new Teleporter("teleporter"); teleporter = new Teleporter("teleporter");
} }

View File

@@ -1,6 +1,8 @@
package io.anuke.mindustry.content.blocks; package io.anuke.mindustry.content.blocks;
import io.anuke.mindustry.content.Items;
import io.anuke.mindustry.content.UnitTypes; import io.anuke.mindustry.content.UnitTypes;
import io.anuke.mindustry.resource.ItemStack;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.blocks.types.production.UnitFactory; import io.anuke.mindustry.world.blocks.types.production.UnitFactory;
@@ -9,5 +11,10 @@ public class UnitBlocks {
flierFactory = new UnitFactory("flierfactory"){{ flierFactory = new UnitFactory("flierfactory"){{
type = UnitTypes.flier; type = UnitTypes.flier;
produceTime = 400;
size = 2;
requirements = new ItemStack[]{
new ItemStack(Items.stone, 5)
};
}}; }};
} }

View File

@@ -38,6 +38,8 @@ public class Units {
Unit[] result = {null}; Unit[] result = {null};
float[] cdist = {0}; float[] cdist = {0};
rect.setSize(range*2f).setCenter(x, y);
getNearbyEnemies(team, rect, e -> { getNearbyEnemies(team, rect, e -> {
if (!predicate.test(e)) if (!predicate.test(e))
return; return;

View File

@@ -12,6 +12,7 @@ import io.anuke.ucore.util.Timer;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import static io.anuke.mindustry.Vars.state;
import static io.anuke.mindustry.Vars.unitGroups; import static io.anuke.mindustry.Vars.unitGroups;
public class BaseUnit extends Unit { public class BaseUnit extends Unit {
@@ -71,7 +72,7 @@ public class BaseUnit extends Unit {
@Override @Override
public boolean collides(SolidEntity other){ public boolean collides(SolidEntity other){
return (other instanceof Bullet) && !(((Bullet) other).owner instanceof BaseUnit); return other instanceof Bullet && state.teams.areEnemies((((Bullet) other).team), team);
} }
@Override @Override

View File

@@ -2,27 +2,47 @@ package io.anuke.mindustry.entities.units;
import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.ObjectSet; import com.badlogic.gdx.utils.ObjectSet;
import io.anuke.mindustry.entities.BulletType;
import io.anuke.mindustry.entities.Unit; import io.anuke.mindustry.entities.Unit;
import io.anuke.mindustry.game.TeamInfo.TeamData; import io.anuke.mindustry.game.TeamInfo.TeamData;
import io.anuke.mindustry.graphics.Fx;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Timers; import io.anuke.ucore.core.Timers;
import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.util.Angles;
import static io.anuke.mindustry.Vars.state; import static io.anuke.mindustry.Vars.state;
public class FlyingUnitType extends UnitType { public class FlyingUnitType extends UnitType {
private static Vector2 vec = new Vector2(); private static Vector2 vec = new Vector2();
protected float boosterLength = 4.5f;
public FlyingUnitType(String name) { public FlyingUnitType(String name) {
super(name); super(name);
speed = 1f; speed = 0.2f;
maxVelocity = 4f;
drag = 0.01f;
}
@Override
public void update(BaseUnit unit) {
super.update(unit);
unit.rotation = unit.velocity.angle();
if(unit.velocity.len() > 0.2f && unit.timer.get(timerBoost, 2f)){
Effects.effect(Fx.dashsmoke, unit.x + Angles.trnsx(unit.rotation + 180f, boosterLength),
unit.y + Angles.trnsy(unit.rotation + 180f, boosterLength));
}
} }
@Override @Override
public void draw(BaseUnit unit) { public void draw(BaseUnit unit) {
Draw.alpha(unit.hitTime / Unit.hitDuration); Draw.alpha(unit.hitTime / Unit.hitDuration);
Draw.rect(name, unit.x, unit.y, unit.rotation); Draw.rect(name, unit.x, unit.y, unit.rotation - 90);
Draw.alpha(1f); Draw.alpha(1f);
} }
@@ -30,10 +50,22 @@ public class FlyingUnitType extends UnitType {
@Override @Override
public void behavior(BaseUnit unit) { public void behavior(BaseUnit unit) {
vec.set(unit.target.x - unit.x, unit.target.y - unit.y); vec.set(unit.target.x - unit.x, unit.target.y - unit.y);
vec.setLength(speed);
unit.velocity.lerp(vec, 0.1f * Timers.delta()); //TODO clamp it so it doesn't glitch out at low fps float ang = vec.angle();
float circleLength = 40f;
if(vec.len() < circleLength){
vec.rotate((circleLength-vec.len())/circleLength * 180f);
}
vec.setLength(speed * Timers.delta());
unit.velocity.add(vec); //TODO clamp it so it doesn't glitch out at low fps
if(unit.timer.get(timerReload, reload)){
shoot(unit, BulletType.shot, ang, 4f);
}
} }
@Override @Override

View File

@@ -1,6 +1,7 @@
package io.anuke.mindustry.entities.units; package io.anuke.mindustry.entities.units;
import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.entities.Bullet;
import io.anuke.mindustry.entities.BulletType; import io.anuke.mindustry.entities.BulletType;
import io.anuke.mindustry.entities.Unit; import io.anuke.mindustry.entities.Unit;
import io.anuke.mindustry.entities.Units; import io.anuke.mindustry.entities.Units;
@@ -9,6 +10,7 @@ import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.net.NetEvents; import io.anuke.mindustry.net.NetEvents;
import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Timers; import io.anuke.ucore.core.Timers;
import io.anuke.ucore.util.Angles;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;
import static io.anuke.mindustry.Vars.tilesize; import static io.anuke.mindustry.Vars.tilesize;
@@ -21,6 +23,8 @@ public abstract class UnitType {
private static int timerIndex = 0; private static int timerIndex = 0;
protected static final int timerTarget = timerIndex++; protected static final int timerTarget = timerIndex++;
protected static final int timerBoost = timerIndex++;
protected static final int timerReload = timerIndex++;
public final String name; public final String name;
public final byte id; public final byte id;
@@ -35,6 +39,8 @@ public abstract class UnitType {
protected float mass = 1f; protected float mass = 1f;
protected boolean isFlying; protected boolean isFlying;
protected float drag = 0.1f; protected float drag = 0.1f;
protected float maxVelocity = 5f;
protected float reload = 40f;
public UnitType(String name){ public UnitType(String name){
this.id = lastid++; this.id = lastid++;
@@ -64,6 +70,7 @@ public abstract class UnitType {
//TODO logic //TODO logic
unit.velocity.limit(maxVelocity);
unit.x += unit.velocity.x / mass; unit.x += unit.velocity.x / mass;
unit.y += unit.velocity.y / mass; unit.y += unit.velocity.y / mass;
@@ -88,8 +95,10 @@ public abstract class UnitType {
} }
} }
public void onShoot(BaseUnit unit, BulletType type, float rotation){ public void shoot(BaseUnit unit, BulletType type, float rotation, float translation){
//TODO remove? new Bullet(type, unit,
unit.x + Angles.trnsx(rotation, translation),
unit.y + Angles.trnsy(rotation, translation), rotation).add();
} }
public void onDeath(BaseUnit unit){ public void onDeath(BaseUnit unit){

View File

@@ -9,7 +9,7 @@ import io.anuke.mindustry.world.blocks.types.defense.Turret;
import io.anuke.mindustry.world.blocks.types.distribution.Conveyor; import io.anuke.mindustry.world.blocks.types.distribution.Conveyor;
import io.anuke.mindustry.world.blocks.types.distribution.Router; import io.anuke.mindustry.world.blocks.types.distribution.Router;
import io.anuke.mindustry.world.blocks.types.production.Drill; import io.anuke.mindustry.world.blocks.types.production.Drill;
import io.anuke.mindustry.world.blocks.types.generation.PowerDistributor; import io.anuke.mindustry.world.blocks.types.power.PowerDistributor;
import io.anuke.mindustry.world.blocks.types.production.Smelter; import io.anuke.mindustry.world.blocks.types.production.Smelter;
import io.anuke.ucore.util.Bundles; import io.anuke.ucore.util.Bundles;

View File

@@ -30,8 +30,8 @@ public class MapIO {
Pixmap pixmap = new Pixmap(data.width(), data.height(), Format.RGBA8888); Pixmap pixmap = new Pixmap(data.width(), data.height(), Format.RGBA8888);
data.position(0, 0); data.position(0, 0);
for(int x = 0; x < data.width(); x ++){ for(int y = 0; y < data.height(); y ++){
for(int y = 0; y < data.height(); y ++){ for(int x = 0; x < data.width(); x ++){
TileDataMarker marker = data.read(); TileDataMarker marker = data.read();
Block floor = Block.getByID(marker.floor); Block floor = Block.getByID(marker.floor);
Block wall = Block.getByID(marker.wall); Block wall = Block.getByID(marker.wall);

View File

@@ -3,6 +3,8 @@ package io.anuke.mindustry.io.versions;
import com.badlogic.gdx.utils.IntMap; import com.badlogic.gdx.utils.IntMap;
import com.badlogic.gdx.utils.TimeUtils; import com.badlogic.gdx.utils.TimeUtils;
import io.anuke.mindustry.content.Weapons; import io.anuke.mindustry.content.Weapons;
import io.anuke.mindustry.content.blocks.Blocks;
import io.anuke.mindustry.content.blocks.StorageBlocks;
import io.anuke.mindustry.entities.units.BaseUnit; import io.anuke.mindustry.entities.units.BaseUnit;
import io.anuke.mindustry.entities.units.UnitType; import io.anuke.mindustry.entities.units.UnitType;
import io.anuke.mindustry.game.Difficulty; import io.anuke.mindustry.game.Difficulty;
@@ -13,9 +15,9 @@ import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.resource.Upgrade; import io.anuke.mindustry.resource.Upgrade;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.content.blocks.Blocks;
import io.anuke.mindustry.world.blocks.types.BlockPart; import io.anuke.mindustry.world.blocks.types.BlockPart;
import io.anuke.ucore.core.Core; import io.anuke.ucore.core.Core;
import io.anuke.ucore.entities.Entities;
import io.anuke.ucore.entities.EntityGroup; import io.anuke.ucore.entities.EntityGroup;
import io.anuke.ucore.util.Bits; import io.anuke.ucore.util.Bits;
@@ -140,6 +142,8 @@ public class Save16 extends SaveFileVersion {
short width = stream.readShort(); short width = stream.readShort();
short height = stream.readShort(); short height = stream.readShort();
Entities.resizeTree(0, 0, width * tilesize, height * tilesize);
Tile[][] tiles = world.createTiles(width, height); Tile[][] tiles = world.createTiles(width, height);
for(int x = 0; x < width; x ++){ for(int x = 0; x < width; x ++){
@@ -161,6 +165,8 @@ public class Save16 extends SaveFileVersion {
byte team = Bits.getLeftByte(tr); byte team = Bits.getLeftByte(tr);
byte rotation = Bits.getRightByte(tr); byte rotation = Bits.getRightByte(tr);
Team t = Team.values()[team];
tile.setTeam(Team.values()[team]); tile.setTeam(Team.values()[team]);
tile.entity.health = health; tile.entity.health = health;
tile.setRotation(rotation); tile.setRotation(rotation);
@@ -170,6 +176,11 @@ public class Save16 extends SaveFileVersion {
if (tile.entity.liquid != null) tile.entity.liquid.read(stream); if (tile.entity.liquid != null) tile.entity.liquid.read(stream);
tile.entity.read(stream); tile.entity.read(stream);
if(tile.block() == StorageBlocks.core &&
state.teams.has(t)){
state.teams.get(t).cores.add(tile);
}
} }
tiles[x][y] = tile; tiles[x][y] = tile;

View File

@@ -7,7 +7,8 @@ public enum BarType {
inventory(Color.GREEN), inventory(Color.GREEN),
power(Color.YELLOW), power(Color.YELLOW),
liquid(Color.ROYAL), liquid(Color.ROYAL),
heat(Color.CORAL); heat(Color.CORAL),
production(Color.PURPLE);
public final Color color; public final Color color;

View File

@@ -8,7 +8,6 @@ import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.io.MapTileData; import io.anuke.mindustry.io.MapTileData;
import io.anuke.mindustry.io.MapTileData.TileDataMarker; import io.anuke.mindustry.io.MapTileData.TileDataMarker;
import io.anuke.ucore.noise.Noise; import io.anuke.ucore.noise.Noise;
import io.anuke.ucore.util.Log;
import static io.anuke.mindustry.Vars.state; import static io.anuke.mindustry.Vars.state;
import static io.anuke.mindustry.Vars.world; import static io.anuke.mindustry.Vars.world;
@@ -27,9 +26,9 @@ public class WorldGenerator {
Noise.setSeed(world.getSeed()); Noise.setSeed(world.getSeed());
IntArray multiblocks = new IntArray(); IntArray multiblocks = new IntArray();
for(int x = 0; x < data.width(); x ++){ for(int y = 0; y < data.height(); y ++){
for(int y = 0; y < data.height(); y ++){ for(int x = 0; x < data.width(); x ++){
TileDataMarker tile = data.read(); TileDataMarker tile = data.read();
tiles[x][y] = new Tile(x, y, tile.floor, tile.wall, tile.rotation, tile.team); tiles[x][y] = new Tile(x, y, tile.floor, tile.wall, tile.rotation, tile.team);

View File

@@ -133,7 +133,7 @@ public class Turret extends Block{
if(entity.timer.get(timerTarget, targetInterval)){ if(entity.timer.get(timerTarget, targetInterval)){
entity.target = Units.getClosestEnemy(tile.getTeam(), entity.target = Units.getClosestEnemy(tile.getTeam(),
tile.worldx(), tile.worldy(), range, e -> !e.isDead()); tile.drawx(), tile.drawy(), range, e -> !e.isDead());
} }
if(entity.target != null){ if(entity.target != null){

View File

@@ -1,4 +1,4 @@
package io.anuke.mindustry.world.blocks.types.generation; package io.anuke.mindustry.world.blocks.types.power;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
import io.anuke.mindustry.graphics.Fx; import io.anuke.mindustry.graphics.Fx;
@@ -6,7 +6,6 @@ import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.world.BarType; import io.anuke.mindustry.world.BarType;
import io.anuke.mindustry.world.BlockBar; import io.anuke.mindustry.world.BlockBar;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.types.generation.PowerGenerator.GeneratorEntity;
import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Effects.Effect; import io.anuke.ucore.core.Effects.Effect;
import io.anuke.ucore.core.Timers; import io.anuke.ucore.core.Timers;

View File

@@ -1,4 +1,4 @@
package io.anuke.mindustry.world.blocks.types.generation; package io.anuke.mindustry.world.blocks.types.power;
import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.graphics.Fx; import io.anuke.mindustry.graphics.Fx;
@@ -11,7 +11,7 @@ import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Strings; import io.anuke.ucore.util.Strings;
public class LiquidPowerGenerator extends PowerGenerator { public class LiquidPowerGenerator extends io.anuke.mindustry.world.blocks.types.power.PowerGenerator {
public Liquid generateLiquid; public Liquid generateLiquid;
public float powerPerLiquid = 0.13f; public float powerPerLiquid = 0.13f;
/**Maximum liquid used per frame.*/ /**Maximum liquid used per frame.*/

View File

@@ -1,4 +1,4 @@
package io.anuke.mindustry.world.blocks.types.generation; package io.anuke.mindustry.world.blocks.types.power;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
import io.anuke.mindustry.content.Liquids; import io.anuke.mindustry.content.Liquids;
@@ -24,7 +24,7 @@ import java.io.IOException;
import static io.anuke.mindustry.Vars.tilesize; import static io.anuke.mindustry.Vars.tilesize;
public class NuclearReactor extends LiquidPowerGenerator{ public class NuclearReactor extends io.anuke.mindustry.world.blocks.types.power.LiquidPowerGenerator {
protected final int timerFuel = timers++; protected final int timerFuel = timers++;
protected final Translator tr = new Translator(); protected final Translator tr = new Translator();

View File

@@ -1,4 +1,4 @@
package io.anuke.mindustry.world.blocks.types.generation; package io.anuke.mindustry.world.blocks.types.power;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.math.Vector2;
@@ -258,7 +258,8 @@ public class PowerDistributor extends PowerBlock{
return Vector2.dst(tile.worldx(), tile.worldy(), link.worldx(), link.worldy()) <= Math.max(laserRange * tilesize, return Vector2.dst(tile.worldx(), tile.worldy(), link.worldx(), link.worldy()) <= Math.max(laserRange * tilesize,
((PowerDistributor)link.block()).laserRange * tilesize) - tilesize/2f; ((PowerDistributor)link.block()).laserRange * tilesize) - tilesize/2f;
}else{ }else{
return Vector2.dst(tile.worldx(), tile.worldy(), link.worldx(), link.worldy()) <= laserRange * tilesize - tilesize/2f; return Vector2.dst(tile.worldx(), tile.worldy(), link.worldx(), link.worldy())
<= laserRange * tilesize - tilesize/2f + (link.block().size-1)*tilesize;
} }
} }

View File

@@ -1,4 +1,4 @@
package io.anuke.mindustry.world.blocks.types.generation; package io.anuke.mindustry.world.blocks.types.power;
import com.badlogic.gdx.math.GridPoint2; import com.badlogic.gdx.math.GridPoint2;
import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.TileEntity;

View File

@@ -1,9 +1,9 @@
package io.anuke.mindustry.world.blocks.types.generation; package io.anuke.mindustry.world.blocks.types.power;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.ucore.core.Timers; import io.anuke.ucore.core.Timers;
public class SolarGenerator extends PowerGenerator { public class SolarGenerator extends io.anuke.mindustry.world.blocks.types.power.PowerGenerator {
/**power generated per frame*/ /**power generated per frame*/
protected float generation = 0.005f; protected float generation = 0.005f;

View File

@@ -1,13 +1,22 @@
package io.anuke.mindustry.world.blocks.types.production; package io.anuke.mindustry.world.blocks.types.production;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import io.anuke.mindustry.Vars;
import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.entities.units.BaseUnit; import io.anuke.mindustry.entities.units.BaseUnit;
import io.anuke.mindustry.entities.units.UnitType; import io.anuke.mindustry.entities.units.UnitType;
import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.resource.ItemStack; import io.anuke.mindustry.resource.ItemStack;
import io.anuke.mindustry.world.BarType;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.BlockBar;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.types.modules.InventoryModule; import io.anuke.mindustry.world.blocks.types.modules.InventoryModule;
import io.anuke.ucore.core.Timers; import io.anuke.ucore.core.Timers;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.graphics.Lines;
import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Tmp;
import java.io.DataInputStream; import java.io.DataInputStream;
import java.io.DataOutputStream; import java.io.DataOutputStream;
@@ -18,6 +27,7 @@ public class UnitFactory extends Block {
protected ItemStack[] requirements; protected ItemStack[] requirements;
protected float produceTime = 1000f; protected float produceTime = 1000f;
protected float powerUse = 0.1f; protected float powerUse = 0.1f;
protected String unitRegion;
public UnitFactory(String name) { public UnitFactory(String name) {
super(name); super(name);
@@ -26,6 +36,43 @@ public class UnitFactory extends Block {
hasPower = true; hasPower = true;
} }
@Override
public void setBars() {
super.setBars();
bars.add(new BlockBar(BarType.production, true, tile -> tile.<UnitFactoryEntity>entity().buildTime / produceTime));
bars.remove(BarType.inventory);
}
@Override
public void draw(Tile tile) {
UnitFactoryEntity entity = tile.entity();
TextureRegion region = Draw.region(unitRegion == null ? type.name : unitRegion);
int w = (int)(entity.buildTime/produceTime * region.getRegionWidth());
Draw.rect(name(), tile.drawx(), tile.drawy());
Draw.alpha(0.2f);
//Draw.rect(region, tile.drawx(), tile.drawy());
Draw.color();
Tmp.tr1.setRegion(region, region.getRegionWidth() - w, 0, w, region.getRegionHeight());
Draw.rect(Tmp.tr1, tile.drawx(), tile.drawy());
Draw.color("accent");
Lines.lineAngleCenter(
tile.drawx() + Mathf.sin(Timers.time(), 5f, Vars.tilesize/2f*size - 2f),
tile.drawy(),
90,
size * Vars.tilesize - 4f);
Draw.reset();
Draw.rect(name + "-top", tile.drawx(), tile.drawy());
}
@Override @Override
public void update(Tile tile) { public void update(Tile tile) {
UnitFactoryEntity entity = tile.entity(); UnitFactoryEntity entity = tile.entity();
@@ -40,7 +87,8 @@ public class UnitFactory extends Block {
if(entity.buildTime >= produceTime){ if(entity.buildTime >= produceTime){
BaseUnit unit = new BaseUnit(type, tile.getTeam()); BaseUnit unit = new BaseUnit(type, tile.getTeam());
unit.set(tile.drawx(), tile.drawy()); unit.set(tile.drawx(), tile.drawy()).add();
unit.velocity.y = 4f;
entity.buildTime = 0f; entity.buildTime = 0f;
for(ItemStack stack : requirements){ for(ItemStack stack : requirements){
@@ -50,6 +98,16 @@ public class UnitFactory extends Block {
} }
} }
@Override
public boolean acceptItem(Item item, Tile tile, Tile source) {
for(ItemStack stack : requirements){
if(item == stack.item && tile.entity.inventory.getItem(item) <= stack.amount*2){
return true;
}
}
return false;
}
@Override @Override
public TileEntity getEntity() { public TileEntity getEntity() {
return new UnitFactoryEntity(); return new UnitFactoryEntity();