TechReborn/src/main/java/techreborn/power/TRPowerNet.java

239 lines
5.9 KiB
Java
Raw Normal View History

2016-03-07 20:05:56 +01:00
package techreborn.power;
import net.minecraft.util.EnumFacing;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import reborncore.api.power.IEnergyInterfaceTile;
import reborncore.common.powerSystem.TilePowerAcceptor;
2016-03-07 22:45:06 +01:00
import techreborn.events.TRTickHandler;
2016-03-07 20:05:56 +01:00
import techreborn.parts.CableMultipart;
2016-03-07 22:45:06 +01:00
import techreborn.parts.EnumCableType;
2016-03-07 20:05:56 +01:00
import java.util.ArrayList;
2016-03-07 22:45:06 +01:00
import java.util.List;
2016-03-07 20:05:56 +01:00
public class TRPowerNet {
2016-03-07 22:45:06 +01:00
int tick = 0;
2016-03-07 20:05:56 +01:00
private ArrayList<CableMultipart> cables = new ArrayList();
2016-03-07 22:45:06 +01:00
public ArrayList<EnergyHandler> endpoints = new ArrayList();
2016-03-07 20:05:56 +01:00
private int energy = 0;
2016-03-07 22:45:06 +01:00
EnumCableType cableType;
2016-03-07 20:05:56 +01:00
2016-03-07 22:45:06 +01:00
public TRPowerNet(EnumCableType cableType) {
this.cableType = cableType;
2016-03-07 20:05:56 +01:00
MinecraftForge.EVENT_BUS.register(this);
}
public int getIOLimit() {
2016-03-07 22:45:06 +01:00
return cableType.transferRate;
2016-03-07 20:05:56 +01:00
}
2016-03-07 22:45:06 +01:00
@SubscribeEvent
public void tick(PowerTickEvent evt) {
if(tick < 20){
tick ++;
2016-03-07 22:45:06 +01:00
return;
}
if(tick % 80 == 0){
List<CableMultipart> oldCables = new ArrayList<>();
for(CableMultipart cableMultipart : cables){
if(cableMultipart.getWorld() == null || cableMultipart.getPos() == null){
oldCables.add(cableMultipart);
}
CableMultipart mp = cableMultipart.getPartFromWorld(cableMultipart.getWorld(), cableMultipart.getPos(), null);
if(mp == null){
oldCables.add(cableMultipart);
2016-03-07 20:05:56 +01:00
}
}
2016-03-07 22:45:06 +01:00
cables.removeAll(oldCables);
2016-03-07 20:05:56 +01:00
}
if (!cables.isEmpty()) {
ArrayList<EnergyHandler> collectibles = new ArrayList();
ArrayList<EnergyHandler> insertibles = new ArrayList();
for (int i = 0; i < endpoints.size(); i++) {
EnergyHandler ei = endpoints.get(i);
if (ei.isCollectible()) {
collectibles.add(ei);
}
if (ei.isInsertible()) {
insertibles.add(ei);
}
}
for(EnergyHandler handler : collectibles){
2016-03-07 22:45:06 +01:00
energy += handler.collectEnergy(cableType.transferRate);
2016-03-07 20:05:56 +01:00
}
for(EnergyHandler handler : insertibles){
2016-03-07 22:45:06 +01:00
energy -= handler.addEnergy(Math.min(energy, cableType.transferRate));
2016-03-07 20:05:56 +01:00
}
2016-03-07 22:45:06 +01:00
} else {
MinecraftForge.EVENT_BUS.unregister(this);
2016-03-07 20:05:56 +01:00
}
2016-03-07 22:45:06 +01:00
tick ++;
2016-03-07 20:05:56 +01:00
}
public void addElement(CableMultipart te) {
if (!cables.contains(te)) {
cables.add(te);
}
}
public void removeElement(CableMultipart te) {
cables.remove(te);
this.rebuild();
}
private void rebuild() {
for (int i = 0; i < cables.size(); i++) {
CableMultipart te = cables.get(i);
2016-03-07 22:45:06 +01:00
te.setNetwork(null);
2016-03-07 20:05:56 +01:00
te.findAndJoinNetwork(te.getWorld(), te.getPos());
}
this.clear(true);
2016-03-07 22:45:06 +01:00
MinecraftForge.EVENT_BUS.unregister(this);
2016-03-07 20:05:56 +01:00
}
public void addConnection(IEnergyInterfaceTile ih, EnumFacing dir) {
if (ih instanceof CableMultipart)
return;
EnergyHandler has = this.getHandleFrom(ih);
if (has == null) {
2016-03-07 22:45:06 +01:00
endpoints.add(new EnergyHandler(ih, cableType, dir));
2016-03-07 20:05:56 +01:00
} else {
2016-03-07 22:45:06 +01:00
has.side = dir;
2016-03-07 20:05:56 +01:00
}
}
public void merge(TRPowerNet n) {
if (n != this) {
ArrayList<CableMultipart> li = new ArrayList();
for (int i = 0; i < n.cables.size(); i++) {
CableMultipart wire = n.cables.get(i);
li.add(wire);
}
for (int i = 0; i < n.endpoints.size(); i++) {
EnergyHandler ei = n.endpoints.get(i);
EnergyHandler has = this.getHandleFrom(ei.tile);
if (has == null) {
endpoints.add(ei);
}
}
n.clear(false);
for (int i = 0; i < li.size(); i++) {
CableMultipart wire = li.get(i);
wire.setNetwork(this);
}
2016-03-07 22:45:06 +01:00
MinecraftForge.EVENT_BUS.unregister(n);
2016-03-07 20:05:56 +01:00
}
}
private EnergyHandler getHandleFrom(IEnergyInterfaceTile tile) {
for (int i = 0; i < endpoints.size(); i++) {
EnergyHandler ei = endpoints.get(i);
if (ei.contains(tile))
return ei;
}
return null;
}
private void clear(boolean clearTiles) {
if (clearTiles) {
for (int i = 0; i < cables.size(); i++) {
cables.get(i).resetNetwork();
}
}
cables.clear();
endpoints.clear();
energy = 0;
2016-03-07 22:45:06 +01:00
MinecraftForge.EVENT_BUS.unregister(this);
2016-03-07 20:05:56 +01:00
}
@Override
public String toString() {
return cables.size() + ": " + endpoints.toString();
}
public int addEnergy(int maxAdd, boolean simulate) {
if (energy >= this.getIOLimit())
return 0;
maxAdd = Math.min(this.getIOLimit(), maxAdd);
if (!simulate)
energy += maxAdd;
return maxAdd;
}
private static class EnergyHandler {
private final IEnergyInterfaceTile tile;
2016-03-07 22:45:06 +01:00
private EnumFacing side ;
private final EnumCableType type;
2016-03-07 20:05:56 +01:00
2016-03-07 22:45:06 +01:00
private EnergyHandler(IEnergyInterfaceTile ih, EnumCableType type, EnumFacing dir) {
2016-03-07 20:05:56 +01:00
tile = ih;
2016-03-07 22:45:06 +01:00
this.type = type;
this.side = dir;
2016-03-07 20:05:56 +01:00
}
public boolean isInsertible() {
return this.getTotalInsertible() > 0;
}
public boolean isCollectible() {
return this.getTotalCollectible() > 0;
}
public boolean contains(IEnergyInterfaceTile tile) {
return tile == this.tile;
}
public int collectEnergy(int max) {
int total = 0;
2016-03-07 22:45:06 +01:00
if (tile.canProvideEnergy(EnumFacing.NORTH)) {
int collect = (int) Math.min(max, tile.getMaxOutput());
total = (int) tile.useEnergy(collect, false);
2016-03-07 20:05:56 +01:00
}
return total;
}
public int addEnergy(int max) {
int total = 0;
2016-03-07 22:45:06 +01:00
if (tile.canAcceptEnergy(EnumFacing.NORTH)) {
if(type.transferRate > tile.getMaxInput()){
if(tile instanceof TilePowerAcceptor){
((TilePowerAcceptor) tile).getWorld().createExplosion(null, ((TilePowerAcceptor) tile).getPos().getX(), ((TilePowerAcceptor) tile).getPos().getY(), ((TilePowerAcceptor) tile).getPos().getZ(), 5F, true);
}
return 0;
}
2016-03-07 20:05:56 +01:00
int add = max - total;
total += tile.addEnergy(add, false);
}
2016-03-07 22:45:06 +01:00
System.out.println("Provided " + total);
2016-03-07 20:05:56 +01:00
return total;
}
public int getTotalCollectible() {
2016-03-07 22:45:06 +01:00
if (tile.canProvideEnergy(EnumFacing.NORTH)) {
return (int) Math.min(tile.getMaxOutput(), tile.getEnergy());
2016-03-07 20:05:56 +01:00
}
2016-03-07 22:45:06 +01:00
return 0;
2016-03-07 20:05:56 +01:00
}
public int getTotalInsertible() {
int total = 0;
2016-03-07 22:45:06 +01:00
if (tile.canAcceptEnergy(EnumFacing.NORTH)) {
total += tile.addEnergy(type.transferRate, true);
2016-03-07 20:05:56 +01:00
}
2016-03-07 22:45:06 +01:00
2016-03-07 20:05:56 +01:00
return total;
}
@Override
public String toString() {
2016-03-07 22:45:06 +01:00
return tile + " @ " + side;
2016-03-07 20:05:56 +01:00
}
}
}