New power node system / Volatile generators / Drone crash fix
This commit is contained in:
@@ -15,7 +15,7 @@ public class PowerBlocks extends BlockList implements ContentList {
|
|||||||
combustionGenerator = new BurnerGenerator("combustion-generator") {{
|
combustionGenerator = new BurnerGenerator("combustion-generator") {{
|
||||||
powerOutput = 0.06f;
|
powerOutput = 0.06f;
|
||||||
powerCapacity = 40f;
|
powerCapacity = 40f;
|
||||||
itemDuration = 50f;
|
itemDuration = 40f;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
thermalGenerator = new LiquidHeatGenerator("thermal-generator") {{
|
thermalGenerator = new LiquidHeatGenerator("thermal-generator") {{
|
||||||
@@ -29,7 +29,7 @@ public class PowerBlocks extends BlockList implements ContentList {
|
|||||||
turbineGenerator = new TurbineGenerator("turbine-generator") {{
|
turbineGenerator = new TurbineGenerator("turbine-generator") {{
|
||||||
powerOutput = 0.15f;
|
powerOutput = 0.15f;
|
||||||
powerCapacity = 40f;
|
powerCapacity = 40f;
|
||||||
itemDuration = 40f;
|
itemDuration = 30f;
|
||||||
size = 2;
|
size = 2;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import io.anuke.mindustry.entities.TileEntity;
|
|||||||
import io.anuke.mindustry.entities.Units;
|
import io.anuke.mindustry.entities.Units;
|
||||||
import io.anuke.mindustry.entities.effect.ItemDrop;
|
import io.anuke.mindustry.entities.effect.ItemDrop;
|
||||||
import io.anuke.mindustry.entities.traits.BuilderTrait;
|
import io.anuke.mindustry.entities.traits.BuilderTrait;
|
||||||
|
import io.anuke.mindustry.entities.traits.TargetTrait;
|
||||||
import io.anuke.mindustry.entities.units.BaseUnit;
|
import io.anuke.mindustry.entities.units.BaseUnit;
|
||||||
import io.anuke.mindustry.entities.units.FlyingUnit;
|
import io.anuke.mindustry.entities.units.FlyingUnit;
|
||||||
import io.anuke.mindustry.entities.units.UnitState;
|
import io.anuke.mindustry.entities.units.UnitState;
|
||||||
@@ -151,13 +152,15 @@ public class Drone extends FlyingUnit implements BuilderTrait {
|
|||||||
public void drawOver() {
|
public void drawOver() {
|
||||||
trail.draw(Palette.lightTrail, Palette.lightTrail, 3f);
|
trail.draw(Palette.lightTrail, Palette.lightTrail, 3f);
|
||||||
|
|
||||||
if(target instanceof TileEntity && state.is(repair)){
|
TargetTrait entity = target;
|
||||||
|
|
||||||
|
if(entity instanceof TileEntity && state.is(repair)){
|
||||||
float len = 5f;
|
float len = 5f;
|
||||||
Draw.color(Color.BLACK, Color.WHITE, 0.95f + Mathf.absin(Timers.time(), 0.8f, 0.05f));
|
Draw.color(Color.BLACK, Color.WHITE, 0.95f + Mathf.absin(Timers.time(), 0.8f, 0.05f));
|
||||||
Shapes.laser("beam", "beam-end",
|
Shapes.laser("beam", "beam-end",
|
||||||
x + Angles.trnsx(rotation, len),
|
x + Angles.trnsx(rotation, len),
|
||||||
y + Angles.trnsy(rotation, len),
|
y + Angles.trnsy(rotation, len),
|
||||||
target.getX(), target.getY());
|
entity.getX(), entity.getY());
|
||||||
Draw.color();
|
Draw.color();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -35,5 +35,8 @@ public class PowerModule extends BlockModule{
|
|||||||
@Override
|
@Override
|
||||||
public void read(DataInput stream) throws IOException{
|
public void read(DataInput stream) throws IOException{
|
||||||
amount = stream.readFloat();
|
amount = stream.readFloat();
|
||||||
|
if(Float.isNaN(amount)){
|
||||||
|
amount = 0f;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,11 +19,14 @@ import java.io.DataInputStream;
|
|||||||
import java.io.DataOutputStream;
|
import java.io.DataOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import static io.anuke.mindustry.Vars.tilesize;
|
||||||
|
|
||||||
public abstract class ItemGenerator extends PowerGenerator {
|
public abstract class ItemGenerator extends PowerGenerator {
|
||||||
protected float minItemEfficiency = 0.2f;
|
protected float minItemEfficiency = 0.2f;
|
||||||
protected float powerOutput;
|
protected float powerOutput;
|
||||||
protected float itemDuration = 70f;
|
protected float itemDuration = 70f;
|
||||||
protected Effect generateEffect = BlockFx.generatespark;
|
protected Effect generateEffect = BlockFx.generatespark, explodeEffect =
|
||||||
|
BlockFx.generatespark;
|
||||||
protected Color heatColor = Color.valueOf("ff9b59");
|
protected Color heatColor = Color.valueOf("ff9b59");
|
||||||
|
|
||||||
public ItemGenerator(String name) {
|
public ItemGenerator(String name) {
|
||||||
@@ -77,14 +80,20 @@ public abstract class ItemGenerator extends PowerGenerator {
|
|||||||
entity.generateTime -= 1f/itemDuration*mfract;
|
entity.generateTime -= 1f/itemDuration*mfract;
|
||||||
entity.power.amount += maxPower;
|
entity.power.amount += maxPower;
|
||||||
entity.generateTime = Mathf.clamp(entity.generateTime);
|
entity.generateTime = Mathf.clamp(entity.generateTime);
|
||||||
|
|
||||||
|
if(Mathf.chance(Timers.delta() * 0.06 * Mathf.clamp(entity.explosiveness - 0.25f))){
|
||||||
|
entity.damage(Mathf.random(8f));
|
||||||
|
Effects.effect(explodeEffect, tile.worldx() + Mathf.range(size * tilesize/2f), tile.worldy() + Mathf.range(size * tilesize/2f));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(entity.generateTime <= 0f && entity.items.totalItems() > 0){
|
if(entity.generateTime <= 0f && entity.items.totalItems() > 0){
|
||||||
Effects.effect(generateEffect, tile.worldx() + Mathf.range(3f), tile.worldy() + Mathf.range(3f));
|
Effects.effect(generateEffect, tile.worldx() + Mathf.range(size * tilesize/2f), tile.worldy() + Mathf.range(size * tilesize/2f));
|
||||||
for(int i = 0; i < entity.items.items.length; i ++){
|
for(int i = 0; i < entity.items.items.length; i ++){
|
||||||
if(entity.items.items[i] > 0){
|
if(entity.items.items[i] > 0){
|
||||||
entity.items.items[i] --;
|
entity.items.items[i] --;
|
||||||
entity.efficiency = getItemEfficiency(Item.getByID(i));
|
entity.efficiency = getItemEfficiency(Item.getByID(i));
|
||||||
|
entity.explosiveness = Item.getByID(i).explosiveness;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -104,6 +113,7 @@ public abstract class ItemGenerator extends PowerGenerator {
|
|||||||
|
|
||||||
public static class ItemGeneratorEntity extends GeneratorEntity{
|
public static class ItemGeneratorEntity extends GeneratorEntity{
|
||||||
public float efficiency;
|
public float efficiency;
|
||||||
|
public float explosiveness;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void write(DataOutputStream stream) throws IOException {
|
public void write(DataOutputStream stream) throws IOException {
|
||||||
|
|||||||
@@ -11,6 +11,8 @@ import io.anuke.ucore.core.Timers;
|
|||||||
import io.anuke.ucore.graphics.Draw;
|
import io.anuke.ucore.graphics.Draw;
|
||||||
import io.anuke.ucore.util.Mathf;
|
import io.anuke.ucore.util.Mathf;
|
||||||
|
|
||||||
|
import static io.anuke.mindustry.Vars.tilesize;
|
||||||
|
|
||||||
public abstract class ItemLiquidGenerator extends ItemGenerator {
|
public abstract class ItemLiquidGenerator extends ItemGenerator {
|
||||||
protected float minLiquidEfficiency = 0.2f;
|
protected float minLiquidEfficiency = 0.2f;
|
||||||
protected float powerPerLiquid = 0.13f;
|
protected float powerPerLiquid = 0.13f;
|
||||||
@@ -55,6 +57,11 @@ public abstract class ItemLiquidGenerator extends ItemGenerator {
|
|||||||
entity.generateTime -= 1f / itemDuration * mfract;
|
entity.generateTime -= 1f / itemDuration * mfract;
|
||||||
entity.power.amount += maxPower;
|
entity.power.amount += maxPower;
|
||||||
entity.generateTime = Mathf.clamp(entity.generateTime);
|
entity.generateTime = Mathf.clamp(entity.generateTime);
|
||||||
|
|
||||||
|
if(Mathf.chance(Timers.delta() * 0.06 * Mathf.clamp(entity.explosiveness - 0.25f))){
|
||||||
|
entity.damage(Mathf.random(8f));
|
||||||
|
Effects.effect(explodeEffect, tile.worldx() + Mathf.range(size * tilesize/2f), tile.worldy() + Mathf.range(size * tilesize/2f));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (entity.generateTime <= 0f && entity.items.totalItems() > 0) {
|
if (entity.generateTime <= 0f && entity.items.totalItems() > 0) {
|
||||||
@@ -63,6 +70,7 @@ public abstract class ItemLiquidGenerator extends ItemGenerator {
|
|||||||
if (entity.items.items[i] > 0) {
|
if (entity.items.items[i] > 0) {
|
||||||
entity.items.items[i]--;
|
entity.items.items[i]--;
|
||||||
entity.efficiency = getItemEfficiency(Item.getByID(i));
|
entity.efficiency = getItemEfficiency(Item.getByID(i));
|
||||||
|
entity.explosiveness = Item.getByID(i).explosiveness;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,6 +17,12 @@ public class PowerDistributor extends PowerBlock {
|
|||||||
TileEntity entity = tile.entity;
|
TileEntity entity = tile.entity;
|
||||||
int sources = 0;
|
int sources = 0;
|
||||||
|
|
||||||
|
if(entity == null) return;
|
||||||
|
|
||||||
|
if(Float.isNaN(entity.power.amount)){
|
||||||
|
entity.power.amount = 0f;
|
||||||
|
}
|
||||||
|
|
||||||
for(GridPoint2 point : Edges.getEdges(size)){
|
for(GridPoint2 point : Edges.getEdges(size)){
|
||||||
Tile target = tile.getNearby(point);
|
Tile target = tile.getNearby(point);
|
||||||
if(target != null && target.block().hasPower &&
|
if(target != null && target.block().hasPower &&
|
||||||
|
|||||||
@@ -83,11 +83,13 @@ public class PowerNode extends PowerBlock{
|
|||||||
DistributorEntity entity = tile.entity();
|
DistributorEntity entity = tile.entity();
|
||||||
other = other.target();
|
other = other.target();
|
||||||
|
|
||||||
|
Tile result = other;
|
||||||
|
|
||||||
if(linkValid(tile, other)){
|
if(linkValid(tile, other)){
|
||||||
if(linked(tile, other)){
|
if(linked(tile, other)){
|
||||||
CallBlocks.unlinkPowerDistributors(null, tile, other);
|
threads.run(() -> CallBlocks.unlinkPowerDistributors(null, tile, result));
|
||||||
}else if(entity.links.size < maxNodes){
|
}else if(entity.links.size < maxNodes){
|
||||||
CallBlocks.linkPowerDistributors(null, tile, other);
|
threads.run(() -> CallBlocks.linkPowerDistributors(null, tile, result));
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -188,13 +190,21 @@ public class PowerNode extends PowerBlock{
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected boolean shouldDistribute(Tile tile, Tile other) {
|
protected boolean shouldDistribute(Tile tile, Tile other) {
|
||||||
|
return other.entity.power.amount / other.block().powerCapacity <= tile.entity.power.amount / powerCapacity;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean shouldLeechPower(Tile tile, Tile other){
|
||||||
return !(other.block() instanceof PowerNode)
|
return !(other.block() instanceof PowerNode)
|
||||||
|| other.entity.power.amount / other.block().powerCapacity < tile.entity.power.amount / powerCapacity;
|
&& other.entity.power.amount / other.block().powerCapacity > tile.entity.power.amount / powerCapacity;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void distributeLaserPower(Tile tile){
|
protected void distributeLaserPower(Tile tile){
|
||||||
DistributorEntity entity = tile.entity();
|
DistributorEntity entity = tile.entity();
|
||||||
|
|
||||||
|
if(Float.isNaN(entity.power.amount)){
|
||||||
|
entity.power.amount = 0f;
|
||||||
|
}
|
||||||
|
|
||||||
int targets = 0;
|
int targets = 0;
|
||||||
|
|
||||||
//validate everything first.
|
//validate everything first.
|
||||||
@@ -203,8 +213,8 @@ public class PowerNode extends PowerBlock{
|
|||||||
if(!linkValid(tile, target)) {
|
if(!linkValid(tile, target)) {
|
||||||
entity.links.removeIndex(i);
|
entity.links.removeIndex(i);
|
||||||
i --;
|
i --;
|
||||||
}else if(shouldDistribute(tile, target)){
|
}else if(shouldDistribute(tile, target)) {
|
||||||
targets ++;
|
targets++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -212,11 +222,17 @@ public class PowerNode extends PowerBlock{
|
|||||||
|
|
||||||
for(int i = 0; i < entity.links.size; i ++){
|
for(int i = 0; i < entity.links.size; i ++){
|
||||||
Tile target = world.tile(entity.links.get(i));
|
Tile target = world.tile(entity.links.get(i));
|
||||||
if(!shouldDistribute(tile, target)) continue;
|
if(shouldDistribute(tile, target)) {
|
||||||
|
|
||||||
float transmit = Math.min(result * Timers.delta(), entity.power.amount);
|
float transmit = Math.min(result * Timers.delta(), entity.power.amount);
|
||||||
if(target.block().acceptPower(target, tile, transmit)){
|
if (target.block().acceptPower(target, tile, transmit)) {
|
||||||
entity.power.amount -= target.block().addPower(target, transmit);
|
entity.power.amount -= target.block().addPower(target, transmit);
|
||||||
|
}
|
||||||
|
}else if(shouldLeechPower(tile, target)){
|
||||||
|
float diff = (target.entity.power.amount / target.block().powerCapacity - tile.entity.power.amount / powerCapacity)/1.4f;
|
||||||
|
float transmit = Math.min(Math.min(target.block().powerCapacity * diff, target.entity.power.amount), powerCapacity - tile.entity.power.amount);
|
||||||
|
entity.power.amount += transmit;
|
||||||
|
target.entity.power.amount -= transmit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -226,8 +242,7 @@ public class PowerNode extends PowerBlock{
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected boolean linkValid(Tile tile, Tile link){
|
protected boolean linkValid(Tile tile, Tile link){
|
||||||
if(!(tile != link && link != null && link.block().hasPower)
|
if(!(tile != link && link != null && link.block().hasPower)) return false;
|
||||||
|| link.block() instanceof PowerGenerator) return false;
|
|
||||||
|
|
||||||
if(link.block() instanceof PowerNode){
|
if(link.block() instanceof PowerNode){
|
||||||
DistributorEntity oe = link.entity();
|
DistributorEntity oe = link.entity();
|
||||||
|
|||||||
Reference in New Issue
Block a user