Flying unit factory implementation, bugfixes
@ -25,7 +25,7 @@ allprojects {
|
||||
appName = 'Mindustry'
|
||||
gdxVersion = '1.9.8'
|
||||
aiVersion = '1.8.1'
|
||||
uCoreVersion = '64d13cc'
|
||||
uCoreVersion = '238babe'
|
||||
|
||||
getVersionString = {
|
||||
String buildVersion = getBuildVersion()
|
||||
|
BIN
core/assets-raw/sprites/blocks/production/flierfactory-top.png
Normal file
After Width: | Height: | Size: 255 B |
Before Width: | Height: | Size: 421 B After Width: | Height: | Size: 297 B |
BIN
core/assets-raw/sprites/units/flier.png
Normal file
After Width: | Height: | Size: 307 B |
Before Width: | Height: | Size: 195 B After Width: | Height: | Size: 195 B |
Before Width: | Height: | Size: 177 B After Width: | Height: | Size: 177 B |
Before Width: | Height: | Size: 264 B After Width: | Height: | Size: 264 B |
Before Width: | Height: | Size: 93 KiB After Width: | Height: | Size: 93 KiB |
@ -1,7 +1,7 @@
|
||||
#Autogenerated file. Do not modify.
|
||||
#Sun Mar 25 13:11:36 EDT 2018
|
||||
#Sun Mar 25 15:04:04 EDT 2018
|
||||
version=release
|
||||
androidBuildCode=641
|
||||
androidBuildCode=650
|
||||
name=Mindustry
|
||||
code=3.4
|
||||
build=custom build
|
||||
|
@ -3,7 +3,7 @@ package io.anuke.mindustry.content.blocks;
|
||||
import io.anuke.mindustry.world.Block;
|
||||
import io.anuke.mindustry.world.Tile;
|
||||
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 static final Block
|
||||
|
@ -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.ShieldBlock;
|
||||
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 static final Block
|
||||
|
||||
coalgenerator = new ItemPowerGenerator("coalgenerator") {{
|
||||
coalgenerator = new io.anuke.mindustry.world.blocks.types.power.ItemPowerGenerator("coalgenerator") {{
|
||||
generateItem = Items.coal;
|
||||
powerOutput = 0.04f;
|
||||
powerCapacity = 40f;
|
||||
}},
|
||||
|
||||
thermalgenerator = new LiquidPowerGenerator("thermalgenerator") {{
|
||||
thermalgenerator = new io.anuke.mindustry.world.blocks.types.power.LiquidPowerGenerator("thermalgenerator") {{
|
||||
generateLiquid = Liquids.lava;
|
||||
maxLiquidGenerate = 0.5f;
|
||||
powerPerLiquid = 0.08f;
|
||||
@ -26,7 +26,7 @@ public class PowerBlocks {
|
||||
generateEffect = Fx.redgeneratespark;
|
||||
}},
|
||||
|
||||
combustiongenerator = new LiquidPowerGenerator("combustiongenerator") {{
|
||||
combustiongenerator = new io.anuke.mindustry.world.blocks.types.power.LiquidPowerGenerator("combustiongenerator") {{
|
||||
generateLiquid = Liquids.oil;
|
||||
maxLiquidGenerate = 0.4f;
|
||||
powerPerLiquid = 0.12f;
|
||||
@ -40,16 +40,16 @@ public class PowerBlocks {
|
||||
itemDuration = 240f;
|
||||
}},
|
||||
|
||||
solarpanel = new SolarGenerator("solarpanel") {{
|
||||
solarpanel = new io.anuke.mindustry.world.blocks.types.power.SolarGenerator("solarpanel") {{
|
||||
generation = 0.003f;
|
||||
}},
|
||||
|
||||
largesolarpanel = new SolarGenerator("largesolarpanel") {{
|
||||
largesolarpanel = new io.anuke.mindustry.world.blocks.types.power.SolarGenerator("largesolarpanel") {{
|
||||
size = 3;
|
||||
generation = 0.012f;
|
||||
}},
|
||||
|
||||
nuclearReactor = new NuclearReactor("nuclearreactor") {{
|
||||
nuclearReactor = new io.anuke.mindustry.world.blocks.types.power.NuclearReactor("nuclearreactor") {{
|
||||
size = 3;
|
||||
health = 600;
|
||||
breaktime *= 2.3f;
|
||||
@ -74,16 +74,16 @@ public class PowerBlocks {
|
||||
health = 400;
|
||||
}},
|
||||
|
||||
battery = new PowerGenerator("battery") {{
|
||||
battery = new io.anuke.mindustry.world.blocks.types.power.PowerGenerator("battery") {{
|
||||
powerCapacity = 320f;
|
||||
}},
|
||||
|
||||
batteryLarge = new PowerGenerator("batterylarge") {{
|
||||
batteryLarge = new io.anuke.mindustry.world.blocks.types.power.PowerGenerator("batterylarge") {{
|
||||
size = 3;
|
||||
powerCapacity = 2000f;
|
||||
}},
|
||||
|
||||
powernode = new PowerDistributor("powernode"),
|
||||
powernode = new io.anuke.mindustry.world.blocks.types.power.PowerDistributor("powernode"),
|
||||
|
||||
teleporter = new Teleporter("teleporter");
|
||||
}
|
||||
|
@ -1,6 +1,8 @@
|
||||
package io.anuke.mindustry.content.blocks;
|
||||
|
||||
import io.anuke.mindustry.content.Items;
|
||||
import io.anuke.mindustry.content.UnitTypes;
|
||||
import io.anuke.mindustry.resource.ItemStack;
|
||||
import io.anuke.mindustry.world.Block;
|
||||
import io.anuke.mindustry.world.blocks.types.production.UnitFactory;
|
||||
|
||||
@ -9,5 +11,10 @@ public class UnitBlocks {
|
||||
|
||||
flierFactory = new UnitFactory("flierfactory"){{
|
||||
type = UnitTypes.flier;
|
||||
produceTime = 400;
|
||||
size = 2;
|
||||
requirements = new ItemStack[]{
|
||||
new ItemStack(Items.stone, 5)
|
||||
};
|
||||
}};
|
||||
}
|
||||
|
@ -38,6 +38,8 @@ public class Units {
|
||||
Unit[] result = {null};
|
||||
float[] cdist = {0};
|
||||
|
||||
rect.setSize(range*2f).setCenter(x, y);
|
||||
|
||||
getNearbyEnemies(team, rect, e -> {
|
||||
if (!predicate.test(e))
|
||||
return;
|
||||
|
@ -12,6 +12,7 @@ import io.anuke.ucore.util.Timer;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
import static io.anuke.mindustry.Vars.state;
|
||||
import static io.anuke.mindustry.Vars.unitGroups;
|
||||
|
||||
public class BaseUnit extends Unit {
|
||||
@ -71,7 +72,7 @@ public class BaseUnit extends Unit {
|
||||
|
||||
@Override
|
||||
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
|
||||
|
@ -2,27 +2,47 @@ package io.anuke.mindustry.entities.units;
|
||||
|
||||
import com.badlogic.gdx.math.Vector2;
|
||||
import com.badlogic.gdx.utils.ObjectSet;
|
||||
import io.anuke.mindustry.entities.BulletType;
|
||||
import io.anuke.mindustry.entities.Unit;
|
||||
import io.anuke.mindustry.game.TeamInfo.TeamData;
|
||||
import io.anuke.mindustry.graphics.Fx;
|
||||
import io.anuke.mindustry.world.Tile;
|
||||
import io.anuke.ucore.core.Effects;
|
||||
import io.anuke.ucore.core.Timers;
|
||||
import io.anuke.ucore.graphics.Draw;
|
||||
import io.anuke.ucore.util.Angles;
|
||||
|
||||
import static io.anuke.mindustry.Vars.state;
|
||||
|
||||
public class FlyingUnitType extends UnitType {
|
||||
private static Vector2 vec = new Vector2();
|
||||
|
||||
protected float boosterLength = 4.5f;
|
||||
|
||||
public FlyingUnitType(String 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
|
||||
public void draw(BaseUnit unit) {
|
||||
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);
|
||||
}
|
||||
@ -30,10 +50,22 @@ public class FlyingUnitType extends UnitType {
|
||||
@Override
|
||||
public void behavior(BaseUnit unit) {
|
||||
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
|
||||
|
@ -1,6 +1,7 @@
|
||||
package io.anuke.mindustry.entities.units;
|
||||
|
||||
import com.badlogic.gdx.utils.Array;
|
||||
import io.anuke.mindustry.entities.Bullet;
|
||||
import io.anuke.mindustry.entities.BulletType;
|
||||
import io.anuke.mindustry.entities.Unit;
|
||||
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.ucore.core.Effects;
|
||||
import io.anuke.ucore.core.Timers;
|
||||
import io.anuke.ucore.util.Angles;
|
||||
import io.anuke.ucore.util.Mathf;
|
||||
|
||||
import static io.anuke.mindustry.Vars.tilesize;
|
||||
@ -21,6 +23,8 @@ public abstract class UnitType {
|
||||
private static int timerIndex = 0;
|
||||
|
||||
protected static final int timerTarget = timerIndex++;
|
||||
protected static final int timerBoost = timerIndex++;
|
||||
protected static final int timerReload = timerIndex++;
|
||||
|
||||
public final String name;
|
||||
public final byte id;
|
||||
@ -35,6 +39,8 @@ public abstract class UnitType {
|
||||
protected float mass = 1f;
|
||||
protected boolean isFlying;
|
||||
protected float drag = 0.1f;
|
||||
protected float maxVelocity = 5f;
|
||||
protected float reload = 40f;
|
||||
|
||||
public UnitType(String name){
|
||||
this.id = lastid++;
|
||||
@ -64,6 +70,7 @@ public abstract class UnitType {
|
||||
|
||||
//TODO logic
|
||||
|
||||
unit.velocity.limit(maxVelocity);
|
||||
unit.x += unit.velocity.x / mass;
|
||||
unit.y += unit.velocity.y / mass;
|
||||
|
||||
@ -88,8 +95,10 @@ public abstract class UnitType {
|
||||
}
|
||||
}
|
||||
|
||||
public void onShoot(BaseUnit unit, BulletType type, float rotation){
|
||||
//TODO remove?
|
||||
public void shoot(BaseUnit unit, BulletType type, float rotation, float translation){
|
||||
new Bullet(type, unit,
|
||||
unit.x + Angles.trnsx(rotation, translation),
|
||||
unit.y + Angles.trnsy(rotation, translation), rotation).add();
|
||||
}
|
||||
|
||||
public void onDeath(BaseUnit unit){
|
||||
|
@ -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.Router;
|
||||
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.ucore.util.Bundles;
|
||||
|
||||
|
@ -30,8 +30,8 @@ public class MapIO {
|
||||
Pixmap pixmap = new Pixmap(data.width(), data.height(), Format.RGBA8888);
|
||||
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();
|
||||
Block floor = Block.getByID(marker.floor);
|
||||
Block wall = Block.getByID(marker.wall);
|
||||
|
@ -3,6 +3,8 @@ package io.anuke.mindustry.io.versions;
|
||||
import com.badlogic.gdx.utils.IntMap;
|
||||
import com.badlogic.gdx.utils.TimeUtils;
|
||||
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.UnitType;
|
||||
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.world.Block;
|
||||
import io.anuke.mindustry.world.Tile;
|
||||
import io.anuke.mindustry.content.blocks.Blocks;
|
||||
import io.anuke.mindustry.world.blocks.types.BlockPart;
|
||||
import io.anuke.ucore.core.Core;
|
||||
import io.anuke.ucore.entities.Entities;
|
||||
import io.anuke.ucore.entities.EntityGroup;
|
||||
import io.anuke.ucore.util.Bits;
|
||||
|
||||
@ -140,6 +142,8 @@ public class Save16 extends SaveFileVersion {
|
||||
short width = stream.readShort();
|
||||
short height = stream.readShort();
|
||||
|
||||
Entities.resizeTree(0, 0, width * tilesize, height * tilesize);
|
||||
|
||||
Tile[][] tiles = world.createTiles(width, height);
|
||||
|
||||
for(int x = 0; x < width; x ++){
|
||||
@ -161,6 +165,8 @@ public class Save16 extends SaveFileVersion {
|
||||
byte team = Bits.getLeftByte(tr);
|
||||
byte rotation = Bits.getRightByte(tr);
|
||||
|
||||
Team t = Team.values()[team];
|
||||
|
||||
tile.setTeam(Team.values()[team]);
|
||||
tile.entity.health = health;
|
||||
tile.setRotation(rotation);
|
||||
@ -170,6 +176,11 @@ public class Save16 extends SaveFileVersion {
|
||||
if (tile.entity.liquid != null) tile.entity.liquid.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;
|
||||
|
@ -7,7 +7,8 @@ public enum BarType {
|
||||
inventory(Color.GREEN),
|
||||
power(Color.YELLOW),
|
||||
liquid(Color.ROYAL),
|
||||
heat(Color.CORAL);
|
||||
heat(Color.CORAL),
|
||||
production(Color.PURPLE);
|
||||
|
||||
public final Color color;
|
||||
|
||||
|
@ -8,7 +8,6 @@ import io.anuke.mindustry.game.Team;
|
||||
import io.anuke.mindustry.io.MapTileData;
|
||||
import io.anuke.mindustry.io.MapTileData.TileDataMarker;
|
||||
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.world;
|
||||
@ -27,9 +26,9 @@ public class WorldGenerator {
|
||||
Noise.setSeed(world.getSeed());
|
||||
|
||||
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();
|
||||
tiles[x][y] = new Tile(x, y, tile.floor, tile.wall, tile.rotation, tile.team);
|
||||
|
||||
|
@ -133,7 +133,7 @@ public class Turret extends Block{
|
||||
|
||||
if(entity.timer.get(timerTarget, targetInterval)){
|
||||
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){
|
||||
|
@ -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 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.BlockBar;
|
||||
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.Effect;
|
||||
import io.anuke.ucore.core.Timers;
|
@ -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.graphics.Fx;
|
||||
@ -11,7 +11,7 @@ import io.anuke.ucore.graphics.Draw;
|
||||
import io.anuke.ucore.util.Mathf;
|
||||
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 float powerPerLiquid = 0.13f;
|
||||
/**Maximum liquid used per frame.*/
|
@ -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 io.anuke.mindustry.content.Liquids;
|
||||
@ -24,7 +24,7 @@ import java.io.IOException;
|
||||
|
||||
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 Translator tr = new Translator();
|
@ -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.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,
|
||||
((PowerDistributor)link.block()).laserRange * tilesize) - tilesize/2f;
|
||||
}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;
|
||||
}
|
||||
}
|
||||
|
@ -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 io.anuke.mindustry.entities.TileEntity;
|
@ -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.ucore.core.Timers;
|
||||
|
||||
public class SolarGenerator extends PowerGenerator {
|
||||
public class SolarGenerator extends io.anuke.mindustry.world.blocks.types.power.PowerGenerator {
|
||||
/**power generated per frame*/
|
||||
protected float generation = 0.005f;
|
||||
|
@ -1,13 +1,22 @@
|
||||
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.units.BaseUnit;
|
||||
import io.anuke.mindustry.entities.units.UnitType;
|
||||
import io.anuke.mindustry.resource.Item;
|
||||
import io.anuke.mindustry.resource.ItemStack;
|
||||
import io.anuke.mindustry.world.BarType;
|
||||
import io.anuke.mindustry.world.Block;
|
||||
import io.anuke.mindustry.world.BlockBar;
|
||||
import io.anuke.mindustry.world.Tile;
|
||||
import io.anuke.mindustry.world.blocks.types.modules.InventoryModule;
|
||||
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.DataOutputStream;
|
||||
@ -18,6 +27,7 @@ public class UnitFactory extends Block {
|
||||
protected ItemStack[] requirements;
|
||||
protected float produceTime = 1000f;
|
||||
protected float powerUse = 0.1f;
|
||||
protected String unitRegion;
|
||||
|
||||
public UnitFactory(String name) {
|
||||
super(name);
|
||||
@ -26,6 +36,43 @@ public class UnitFactory extends Block {
|
||||
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
|
||||
public void update(Tile tile) {
|
||||
UnitFactoryEntity entity = tile.entity();
|
||||
@ -40,7 +87,8 @@ public class UnitFactory extends Block {
|
||||
|
||||
if(entity.buildTime >= produceTime){
|
||||
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;
|
||||
|
||||
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
|
||||
public TileEntity getEntity() {
|
||||
return new UnitFactoryEntity();
|
||||
|