mirror of
https://github.com/Anuken/Mindustry.git
synced 2025-03-04 14:42:08 +07:00
Compile error fix / Additional power transfer implementation
This commit is contained in:
parent
abd87793e4
commit
bf57318307
Binary file not shown.
Before Width: | Height: | Size: 326 B After Width: | Height: | Size: 629 B |
@ -152,7 +152,7 @@ public class Block extends BaseBlock {
|
||||
}
|
||||
}
|
||||
|
||||
entity.power.graph = new PowerGraph();
|
||||
entity.power.graph = new PowerGraph(entity);
|
||||
entity.power.graph.add(tile);
|
||||
}else{
|
||||
//TODO
|
||||
|
@ -366,11 +366,11 @@ public class Conveyor extends Block{
|
||||
ConveyorEntity entity = tile.entity();
|
||||
Array<Object> arr = super.getDebugInfo(tile);
|
||||
arr.addAll(Array.with(
|
||||
"mincarry", entity.minCarry,
|
||||
"minitem", entity.minCarry,
|
||||
"carrying", entity.carrying,
|
||||
"clogHeat", entity.clogHeat,
|
||||
"sleeping", entity.isSleeping()
|
||||
"mincarry", entity.minCarry,
|
||||
"minitem", entity.minCarry,
|
||||
"carrying", entity.carrying,
|
||||
"clogHeat", entity.clogHeat,
|
||||
"sleeping", entity.isSleeping()
|
||||
));
|
||||
return arr;
|
||||
}
|
||||
|
@ -50,7 +50,7 @@ public class FusionReactor extends PowerGenerator{
|
||||
entity.power.amount += powerAdded;
|
||||
entity.totalProgress += entity.warmup * Timers.delta();
|
||||
|
||||
distributePower(tile);
|
||||
tile.entity.power.graph.update();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -106,8 +106,7 @@ public abstract class ItemGenerator extends PowerGenerator{
|
||||
entity.generateTime = 1f;
|
||||
}
|
||||
|
||||
distributePower(tile);
|
||||
|
||||
tile.entity.power.graph.update();
|
||||
}
|
||||
|
||||
protected abstract float getItemEfficiency(Item item);
|
||||
|
@ -77,7 +77,7 @@ public abstract class ItemLiquidGenerator extends ItemGenerator{
|
||||
}
|
||||
}
|
||||
|
||||
distributePower(tile);
|
||||
tile.entity.power.graph.update();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -61,7 +61,7 @@ public abstract class LiquidGenerator extends PowerGenerator{
|
||||
}
|
||||
}
|
||||
|
||||
distributePower(tile);
|
||||
tile.entity.power.graph.update();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -124,7 +124,7 @@ public class NuclearReactor extends PowerGenerator{
|
||||
if(entity.heat >= 0.999f){
|
||||
entity.kill();
|
||||
}else{
|
||||
distributePower(tile);
|
||||
tile.entity.power.graph.update();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -12,6 +12,6 @@ public class PowerDistributor extends PowerBlock{
|
||||
|
||||
@Override
|
||||
public void update(Tile tile){
|
||||
tile.entity.power.graph.distribute(tile);
|
||||
tile.entity.power.graph.update();
|
||||
}
|
||||
}
|
||||
|
@ -1,21 +1,67 @@
|
||||
package io.anuke.mindustry.world.blocks.power;
|
||||
|
||||
import com.badlogic.gdx.utils.ObjectSet;
|
||||
import io.anuke.mindustry.entities.TileEntity;
|
||||
import io.anuke.mindustry.world.Tile;
|
||||
|
||||
import static io.anuke.mindustry.Vars.threads;
|
||||
|
||||
public class PowerGraph{
|
||||
private ObjectSet<Tile> producers = new ObjectSet<>();
|
||||
private ObjectSet<Tile> consumers = new ObjectSet<>();
|
||||
private ObjectSet<Tile> all = new ObjectSet<>();
|
||||
private final ObjectSet<Tile> producers = new ObjectSet<>();
|
||||
private final ObjectSet<Tile> consumers = new ObjectSet<>();
|
||||
private final ObjectSet<Tile> all = new ObjectSet<>();
|
||||
private final TileEntity seed;
|
||||
|
||||
public void distribute(Tile tile){
|
||||
private long lastFrameUpdated;
|
||||
|
||||
public PowerGraph(TileEntity seed){
|
||||
this.seed = seed;
|
||||
}
|
||||
|
||||
public boolean isSeed(TileEntity entity){
|
||||
return seed == entity;
|
||||
}
|
||||
|
||||
public void update(){
|
||||
if(threads.getFrameID() == lastFrameUpdated || consumers.size == 0 || producers.size == 0){
|
||||
return;
|
||||
}
|
||||
|
||||
lastFrameUpdated = threads.getFrameID();
|
||||
|
||||
for(Tile producer : producers){
|
||||
float accumulator = producer.entity.power.amount;
|
||||
|
||||
float toEach = accumulator / consumers.size;
|
||||
float outputs = 0f;
|
||||
|
||||
for(Tile tile : consumers){
|
||||
outputs += Math.min(tile.block().powerCapacity - tile.entity.power.amount, toEach) / toEach;
|
||||
}
|
||||
|
||||
float finalEach = toEach / outputs;
|
||||
float buffer = 0f;
|
||||
|
||||
if(Float.isNaN(finalEach)){
|
||||
return;
|
||||
}
|
||||
|
||||
for(Tile tile : consumers){
|
||||
float used = Math.min(tile.block().powerCapacity - tile.entity.power.amount, finalEach);
|
||||
buffer += used;
|
||||
tile.entity.power.amount += used;
|
||||
}
|
||||
|
||||
producer.entity.power.amount -= buffer;
|
||||
}
|
||||
}
|
||||
|
||||
public void add(Tile tile){
|
||||
all.add(tile);
|
||||
if(tile.block().outputsPower){
|
||||
producers.add(tile);
|
||||
}else{
|
||||
consumers.add(tile);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -110,7 +110,7 @@ public class PowerNode extends PowerBlock{
|
||||
|
||||
@Override
|
||||
public void update(Tile tile){
|
||||
distributeLaserPower(tile);
|
||||
tile.entity.power.graph.update();
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -227,56 +227,6 @@ public class PowerNode extends PowerBlock{
|
||||
return canAccept;
|
||||
}
|
||||
|
||||
protected boolean shouldDistribute(Tile tile, Tile other){
|
||||
return other != null && other.entity != null && other.block().hasPower && other.getTeamID() == tile.getTeamID() && other.entity.power.amount / other.block().powerCapacity <= tile.entity.power.amount / powerCapacity &&
|
||||
!(other.block() instanceof PowerGenerator); //do not distribute to power generators
|
||||
}
|
||||
|
||||
protected boolean shouldLeechPower(Tile tile, Tile other){
|
||||
return other.getTeamID() == tile.getTeamID() && !(other.block() instanceof PowerNode)
|
||||
&& other.block() instanceof PowerDistributor //only suck power from batteries and power generators
|
||||
&& other.entity.power.amount / other.block().powerCapacity > tile.entity.power.amount / powerCapacity;
|
||||
}
|
||||
|
||||
protected void distributeLaserPower(Tile tile){
|
||||
DistributorEntity entity = tile.entity();
|
||||
|
||||
if(Float.isNaN(entity.power.amount)){
|
||||
entity.power.amount = 0f;
|
||||
}
|
||||
|
||||
int targets = 0;
|
||||
|
||||
//validate everything first.
|
||||
for(int i = 0; i < entity.links.size; i++){
|
||||
Tile target = world.tile(entity.links.get(i));
|
||||
if(!linkValid(tile, target)){
|
||||
entity.links.removeIndex(i);
|
||||
i--;
|
||||
}else if(shouldDistribute(tile, target)){
|
||||
targets++;
|
||||
}
|
||||
}
|
||||
|
||||
float result = Math.min(entity.power.amount / targets, powerSpeed * Timers.delta());
|
||||
|
||||
for(int i = 0; i < entity.links.size; i++){
|
||||
Tile target = world.tile(entity.links.get(i));
|
||||
if(targets > 0 && shouldDistribute(tile, target)){
|
||||
|
||||
float transmit = Math.min(result, entity.power.amount);
|
||||
if(target.block().acceptPower(target, tile, 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected boolean linked(Tile tile, Tile other){
|
||||
return tile.<DistributorEntity>entity().links.contains(other.packedPosition());
|
||||
}
|
||||
|
@ -28,7 +28,7 @@ public class SolarGenerator extends PowerGenerator{
|
||||
public void update(Tile tile){
|
||||
addPower(tile, generation * Timers.delta());
|
||||
|
||||
distributePower(tile);
|
||||
tile.entity.power.graph.update();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -22,7 +22,6 @@ public class PowerModule extends BlockModule{
|
||||
}
|
||||
|
||||
float canAccept = Math.min(capacity - amount, add);
|
||||
|
||||
amount += canAccept;
|
||||
|
||||
return canAccept;
|
||||
|
Loading…
Reference in New Issue
Block a user