Power net is working (just)

This commit is contained in:
modmuss50 2016-03-07 21:45:06 +00:00
parent 67526480ad
commit f966cdb632
4 changed files with 81 additions and 104 deletions

View file

@ -18,8 +18,6 @@ public class TRTickHandler {
public Item previouslyWearing; public Item previouslyWearing;
public static List<TRPowerNet> oldNets = new ArrayList<>();
@SubscribeEvent(priority = EventPriority.NORMAL, receiveCanceled = true) @SubscribeEvent(priority = EventPriority.NORMAL, receiveCanceled = true)
public void onPlayerTick(TickEvent.PlayerTickEvent e) { public void onPlayerTick(TickEvent.PlayerTickEvent e) {
EntityPlayer player = e.player; EntityPlayer player = e.player;
@ -34,12 +32,6 @@ public class TRTickHandler {
@SubscribeEvent @SubscribeEvent
public void worldTick(TickEvent.WorldTickEvent e) { public void worldTick(TickEvent.WorldTickEvent e) {
if(!oldNets.isEmpty()){
for(TRPowerNet powerNet : oldNets){
MinecraftForge.EVENT_BUS.unregister(powerNet);
}
oldNets.clear();
}
if(!e.world.isRemote) if(!e.world.isRemote)
MinecraftForge.EVENT_BUS.post(new PowerTickEvent()); MinecraftForge.EVENT_BUS.post(new PowerTickEvent());
} }

View file

@ -112,6 +112,17 @@ public abstract class CableMultipart extends Multipart implements IOccludingPart
list.add(boundingBoxes[6].toAABB()); list.add(boundingBoxes[6].toAABB());
} }
@Override
public void onRemoved() {
super.onRemoved();
removeFromNetwork();
}
@Override
public void onUnloaded() {
super.onUnloaded();
removeFromNetwork();
}
@Override @Override
public void addOcclusionBoxes(List<AxisAlignedBB> list) { public void addOcclusionBoxes(List<AxisAlignedBB> list) {
@ -126,6 +137,7 @@ public abstract class CableMultipart extends Multipart implements IOccludingPart
public void onNeighborBlockChange(Block block) { public void onNeighborBlockChange(Block block) {
super.onNeighborBlockChange(block); super.onNeighborBlockChange(block);
nearByChange(); nearByChange();
findAndJoinNetwork(getWorld(), getPos());
} }
public void nearByChange() { public void nearByChange() {
@ -141,6 +153,9 @@ public abstract class CableMultipart extends Multipart implements IOccludingPart
} }
public CableMultipart getPartFromWorld(World world, BlockPos pos, EnumFacing side) { public CableMultipart getPartFromWorld(World world, BlockPos pos, EnumFacing side) {
if(world == null || pos == null){
return null;
}
IMultipartContainer container = MultipartHelper.getPartContainer(world, pos); IMultipartContainer container = MultipartHelper.getPartContainer(world, pos);
if (side != null && container != null) { if (side != null && container != null) {
ISlottedPart slottedPart = container.getPartInSlot(PartSlot.getFaceSlot(side)); ISlottedPart slottedPart = container.getPartInSlot(PartSlot.getFaceSlot(side));
@ -311,22 +326,26 @@ public abstract class CableMultipart extends Multipart implements IOccludingPart
private TRPowerNet network; private TRPowerNet network;
public final void findAndJoinNetwork(World world, BlockPos pos) { public final void findAndJoinNetwork(World world, BlockPos pos) {
network = new TRPowerNet();
network.setIOLimit(this.getCableType().transferRate);
network.addElement(this);
for (EnumFacing dir : EnumFacing.VALUES) { for (EnumFacing dir : EnumFacing.VALUES) {
CableMultipart cableMultipart = getPartFromWorld(getWorld(), getPos().offset(dir), dir); CableMultipart cableMultipart = getPartFromWorld(getWorld(), getPos().offset(dir), dir);
if (cableMultipart != null && cableMultipart.getCableType() == getCableType()) { if (cableMultipart != null && cableMultipart.getCableType() == getCableType()) {
TRPowerNet net = cableMultipart.getNetwork(); TRPowerNet net = cableMultipart.getNetwork();
if (net != null) { if (net != null) {
net.merge(network); network = net;
network.addElement(this);
break;
} }
} }
}
if(network == null){
network = new TRPowerNet(getCableType());
network.addElement(this);
}
network.endpoints.clear();
for (EnumFacing dir : EnumFacing.VALUES) {
TileEntity te = getNeighbourTile(dir); TileEntity te = getNeighbourTile(dir);
if (te != null && te instanceof IEnergyInterfaceTile) { if (te != null && te instanceof IEnergyInterfaceTile) {
if (((IEnergyInterfaceTile) te).canAcceptEnergy(dir) || ((IEnergyInterfaceTile) te).canProvideEnergy(dir)) { network.addConnection((IEnergyInterfaceTile) te, dir.getOpposite());
network.addConnection((IEnergyInterfaceTile) te, dir.getOpposite());
}
} }
} }
} }
@ -356,6 +375,7 @@ public abstract class CableMultipart extends Multipart implements IOccludingPart
} }
public final void resetNetwork() { public final void resetNetwork() {
network.removeElement(this);
network = null; network = null;
} }

View file

@ -72,7 +72,6 @@ public class WaliaPartProvider implements IWailaDataProvider {
//Stolen from https://github.com/amadornes/MCMultiPart/blob/master/src/main/java/mcmultipart/block/BlockMultipart.java //Stolen from https://github.com/amadornes/MCMultiPart/blob/master/src/main/java/mcmultipart/block/BlockMultipart.java
private TileMultipart getMultipartTile(IBlockAccess world, BlockPos pos) { private TileMultipart getMultipartTile(IBlockAccess world, BlockPos pos) {
TileEntity tile = world.getTileEntity(pos); TileEntity tile = world.getTileEntity(pos);
return tile instanceof TileMultipart ? (TileMultipart) tile : null; return tile instanceof TileMultipart ? (TileMultipart) tile : null;
} }

View file

@ -4,54 +4,52 @@ import net.minecraft.util.EnumFacing;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import reborncore.api.power.IEnergyInterfaceTile; import reborncore.api.power.IEnergyInterfaceTile;
import techreborn.events.TRTickHandler;
import techreborn.parts.CableMultipart; import techreborn.parts.CableMultipart;
import techreborn.parts.EnumCableType;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List;
public class TRPowerNet { public class TRPowerNet {
int i = 0; int tick = 0;
private ArrayList<CableMultipart> cables = new ArrayList(); private ArrayList<CableMultipart> cables = new ArrayList();
private ArrayList<EnergyHandler> endpoints = new ArrayList(); public ArrayList<EnergyHandler> endpoints = new ArrayList();
private int energy = 0; private int energy = 0;
private int networkLimit = 1000; EnumCableType cableType;
public TRPowerNet() { public TRPowerNet(EnumCableType cableType) {
this.cableType = cableType;
MinecraftForge.EVENT_BUS.register(this); MinecraftForge.EVENT_BUS.register(this);
} }
public int getIOLimit() { public int getIOLimit() {
return networkLimit; return cableType.transferRate;
}
public void setIOLimit(int limit) {
if (networkLimit != limit) {
networkLimit = limit;
for (int i = 0; i < cables.size(); i++) {
CableMultipart cable = cables.get(i);
if (cable.getCableType().transferRate!= networkLimit) {
networkLimit = cable.getCableType().transferRate;
}
}
}
} }
@SubscribeEvent @SubscribeEvent
public void tick(PowerTickEvent evt) { public void tick(PowerTickEvent evt) {
// if (i > 10) { if(tick < 20){
// for (CableMultipart modCablePart : ModCablePart.partsInWorld) { return;
// if (!ModPartUtils.hasCable(modCablePart.world, modCablePart.location)) { }
// ModCablePart.partsInWorld.remove(modCablePart); 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);
}
}
cables.removeAll(oldCables);
}
if (!cables.isEmpty()) { if (!cables.isEmpty()) {
ArrayList<EnergyHandler> collectibles = new ArrayList(); ArrayList<EnergyHandler> collectibles = new ArrayList();
ArrayList<EnergyHandler> insertibles = new ArrayList(); ArrayList<EnergyHandler> insertibles = new ArrayList();
int maxCanPush = energy;
for (int i = 0; i < endpoints.size(); i++) { for (int i = 0; i < endpoints.size(); i++) {
EnergyHandler ei = endpoints.get(i); EnergyHandler ei = endpoints.get(i);
maxCanPush += ei.getTotalInsertible();
if (ei.isCollectible()) { if (ei.isCollectible()) {
collectibles.add(ei); collectibles.add(ei);
} }
@ -60,27 +58,22 @@ public class TRPowerNet {
} }
} }
maxCanPush = Math.min(this.getIOLimit(), maxCanPush);
for(EnergyHandler handler : collectibles){ for(EnergyHandler handler : collectibles){
int space = maxCanPush - energy; energy += handler.collectEnergy(cableType.transferRate);
energy += handler.collectEnergy(space);
} }
for(EnergyHandler handler : insertibles){ for(EnergyHandler handler : insertibles){
int add = Math.min(energy, 1 + energy / insertibles.size()); energy -= handler.addEnergy(Math.min(energy, cableType.transferRate));
energy -= handler.addEnergy(add);
} }
System.out.println(energy); } else {
MinecraftForge.EVENT_BUS.unregister(this);
} }
tick ++;
} }
public void addElement(CableMultipart te) { public void addElement(CableMultipart te) {
if (!cables.contains(te)) { if (!cables.contains(te)) {
cables.add(te); cables.add(te);
if (te.getCableType().transferRate > 0 && te.getCableType().transferRate != networkLimit) {
this.setIOLimit(Math.min(te.getCableType().transferRate, this.getIOLimit()));
}
} }
} }
@ -90,12 +83,13 @@ public class TRPowerNet {
} }
private void rebuild() { private void rebuild() {
System.out.println("Remapping RF network " + this);
for (int i = 0; i < cables.size(); i++) { for (int i = 0; i < cables.size(); i++) {
CableMultipart te = cables.get(i); CableMultipart te = cables.get(i);
te.setNetwork(null);
te.findAndJoinNetwork(te.getWorld(), te.getPos()); te.findAndJoinNetwork(te.getWorld(), te.getPos());
} }
this.clear(true); this.clear(true);
MinecraftForge.EVENT_BUS.unregister(this);
} }
public void addConnection(IEnergyInterfaceTile ih, EnumFacing dir) { public void addConnection(IEnergyInterfaceTile ih, EnumFacing dir) {
@ -103,9 +97,9 @@ public class TRPowerNet {
return; return;
EnergyHandler has = this.getHandleFrom(ih); EnergyHandler has = this.getHandleFrom(ih);
if (has == null) { if (has == null) {
endpoints.add(new EnergyHandler(ih, dir)); endpoints.add(new EnergyHandler(ih, cableType, dir));
} else { } else {
has.addSide(dir); has.side = dir;
} }
} }
@ -121,8 +115,6 @@ public class TRPowerNet {
EnergyHandler has = this.getHandleFrom(ei.tile); EnergyHandler has = this.getHandleFrom(ei.tile);
if (has == null) { if (has == null) {
endpoints.add(ei); endpoints.add(ei);
} else {
has.merge(ei);
} }
} }
n.clear(false); n.clear(false);
@ -130,8 +122,7 @@ public class TRPowerNet {
CableMultipart wire = li.get(i); CableMultipart wire = li.get(i);
wire.setNetwork(this); wire.setNetwork(this);
} }
if (n.getIOLimit() != 0 && n.networkLimit != networkLimit) MinecraftForge.EVENT_BUS.unregister(n);
this.setIOLimit(Math.min(n.getIOLimit(), this.getIOLimit()));
} }
} }
@ -155,11 +146,7 @@ public class TRPowerNet {
endpoints.clear(); endpoints.clear();
energy = 0; energy = 0;
try { MinecraftForge.EVENT_BUS.unregister(this);
MinecraftForge.EVENT_BUS.unregister(this);
} catch (Exception e) {
e.printStackTrace();
}
} }
@Override @Override
@ -186,13 +173,13 @@ public class TRPowerNet {
private static class EnergyHandler { private static class EnergyHandler {
private final IEnergyInterfaceTile tile; private final IEnergyInterfaceTile tile;
private final ArrayList<EnumFacing> sides = new ArrayList(); private EnumFacing side ;
private final EnumCableType type;
private EnergyHandler(IEnergyInterfaceTile ih, EnumFacing... dirs) { private EnergyHandler(IEnergyInterfaceTile ih, EnumCableType type, EnumFacing dir) {
tile = ih; tile = ih;
for (int i = 0; i < dirs.length; i++) { this.type = type;
this.addSide(dirs[i]); this.side = dir;
}
} }
public boolean isInsertible() { public boolean isInsertible() {
@ -207,66 +194,45 @@ public class TRPowerNet {
return tile == this.tile; return tile == this.tile;
} }
public void addSide(EnumFacing dir) {
if (!sides.contains(dir))
sides.add(dir);
}
public void merge(EnergyHandler ei) {
for (int i = 0; i < ei.sides.size(); i++) {
this.addSide(ei.sides.get(i));
}
}
public int collectEnergy(int max) { public int collectEnergy(int max) {
int total = 0; int total = 0;
for (int i = 0; i < sides.size(); i++) { if (tile.canProvideEnergy(EnumFacing.NORTH)) {
EnumFacing dir = sides.get(i); int collect = (int) Math.min(max, tile.getMaxOutput());
if (tile.canProvideEnergy(dir)) { total = (int) tile.useEnergy(collect, false);
int collect = max - total;
total += tile.useEnergy(collect, false);
}
} }
return total; return total;
} }
public int addEnergy(int max) { public int addEnergy(int max) {
int total = 0; int total = 0;
for (int i = 0; i < sides.size(); i++) { if (tile.canAcceptEnergy(EnumFacing.NORTH)) {
EnumFacing dir = sides.get(i);
if (tile.canAcceptEnergy(dir)) {
int add = max - total; int add = max - total;
total += tile.addEnergy(add, false); total += tile.addEnergy(add, false);
}
} }
System.out.println("Provided " + total);
return total; return total;
} }
public int getTotalCollectible() { public int getTotalCollectible() {
int total = 0; if (tile.canProvideEnergy(EnumFacing.NORTH)) {
for (int i = 0; i < sides.size(); i++) { return (int) Math.min(tile.getMaxOutput(), tile.getEnergy());
EnumFacing dir = sides.get(i);
if (tile.canProvideEnergy(dir)) {
total += tile.useEnergy(Integer.MAX_VALUE, true);
}
} }
return total; return 0;
} }
public int getTotalInsertible() { public int getTotalInsertible() {
int total = 0; int total = 0;
for (int i = 0; i < sides.size(); i++) { if (tile.canAcceptEnergy(EnumFacing.NORTH)) {
EnumFacing dir = sides.get(i); total += tile.addEnergy(type.transferRate, true);
if (tile.canAcceptEnergy(dir)) {
total += tile.addEnergy(Integer.MAX_VALUE, true);
}
} }
return total; return total;
} }
@Override @Override
public String toString() { public String toString() {
return tile + " @ " + sides; return tile + " @ " + side;
} }
} }
} }