From 000249910c6e51a29ca6c55d09f518aad144902c Mon Sep 17 00:00:00 2001 From: trinsdar <30245301+Trinsdar@users.noreply.github.com> Date: Mon, 27 Nov 2023 23:04:52 -0500 Subject: [PATCH 1/5] refactored energy system to be a bit more like ic2 classic --- .../api/capability/TesseractGTCapability.java | 45 +++---- .../java/tesseract/api/gt/GTController.java | 33 +++-- .../java/tesseract/api/gt/GTTransaction.java | 113 ++---------------- .../main/java/tesseract/api/gt/IGTNode.java | 41 ------- .../java/tesseract/api/rf/RFController.java | 2 +- .../fabric/wrapper/EnergyMoveableWrapper.java | 22 ---- .../api/fabric/wrapper/EnergyTileWrapper.java | 26 ---- .../wrapper/IEnergyHandlerMoveable.java | 4 +- .../fabric/wrapper/IEnergyHandlerStorage.java | 6 +- .../api/forge/wrapper/EnergyTileWrapper.java | 20 ---- .../forge/wrapper/IEnergyHandlerStorage.java | 4 +- 11 files changed, 52 insertions(+), 264 deletions(-) diff --git a/common/src/main/java/tesseract/api/capability/TesseractGTCapability.java b/common/src/main/java/tesseract/api/capability/TesseractGTCapability.java index d7204812..0aa4927b 100644 --- a/common/src/main/java/tesseract/api/capability/TesseractGTCapability.java +++ b/common/src/main/java/tesseract/api/capability/TesseractGTCapability.java @@ -24,7 +24,7 @@ public TesseractGTCapability(T tile, Direction dir, boolean isNode, ITransaction } @Override - public long insertAmps(long voltage, long amps, boolean simulate) { + public long insertEu(long voltage, boolean simulate) { if (this.isSending) return 0; this.isSending = true; if (!simulate) { @@ -32,7 +32,7 @@ public long insertAmps(long voltage, long amps, boolean simulate) { old.commit(); } else { long pos = tile.getBlockPos().asLong(); - GTTransaction transaction = new GTTransaction(amps, voltage, t -> {}); + GTTransaction transaction = new GTTransaction(voltage, t -> {}); if (!this.isNode) { TesseractGraphWrappers.GT_ENERGY.getController(tile.getLevel(), pos).insert(pos, side, transaction, callback); } else { @@ -40,18 +40,7 @@ public long insertAmps(long voltage, long amps, boolean simulate) { } this.old = transaction; } - this.isSending = false; - return amps - old.getAvailableAmps(); - } - - @Override - public long insertEu(long voltage, boolean simulate) { - return insertAmps(voltage, 1, simulate) == 1 ? voltage : 0; - } - - @Override - public long extractAmps(long voltage, long amps, boolean simulate) { - return 0; + return voltage - old.eu; } @Override @@ -60,8 +49,6 @@ public long extractEu(long voltage, boolean simulate) { } private void transferAroundPipe(GTTransaction transaction, long pos) { - boolean flag = false; - for (Direction dir : Graph.DIRECTIONS) { if (dir == this.side || !this.tile.connects(dir)) continue; //First, perform cover modifications. @@ -69,28 +56,30 @@ private void transferAroundPipe(GTTransaction transaction, long pos) { if (otherTile != null) { //Check the handler. var cap = TesseractCapUtils.getEnergyHandler(otherTile, dir.getOpposite()); - if (!cap.isPresent()) continue; + if (cap.isEmpty()) continue; //Perform insertion, and add to the transaction. var handler = cap.get(); - long voltage = transaction.voltageOut - Math.round(cable.getLoss()); - long ampsToInsert = handler.availableAmpsInput(voltage); - GTTransaction.TransferData data = new GTTransaction.TransferData(transaction,voltage, ampsToInsert); + long loss = Math.round(cable.getLoss()); + long voltage = transaction.voltage - loss; + long remainingEu = transaction.eu; + long toInsert = Math.min(remainingEu, voltage); + GTTransaction.TransferData data = new GTTransaction.TransferData(transaction, toInsert, transaction.voltage).setLoss(cable.getLoss()); if (this.callback.modify(data, dir, false, true) || this.callback.modify(data, side, true, true)){ continue; } - if (data.getAmps(true) < ampsToInsert) ampsToInsert = data.getAmps(true); - if (data.getLoss() > 0) voltage -= Math.round(data.getLoss()); - long amps = handler.insertAmps(voltage, ampsToInsert, true); - if (amps > 0){ - transaction.addData(amps, cable.getLoss(), t -> { + if (data.getEu() < toInsert) toInsert = data.getEu(); + if (data.getLoss() > 0) toInsert -= Math.round(data.getLoss()); + if (toInsert <= 0) return; + long inserted = handler.insertEu(toInsert, true); + if (inserted > 0){ + transaction.addData(inserted, cable.getLoss(), t -> { if (this.callback.modify(t, dir, false, false) || this.callback.modify(data, side, true, false)){ return; } - handler.insertAmps(t.getVoltage(), t.getAmps(true), false); + handler.insertEu(t.getEu(), false); }); } - if (transaction.getAvailableAmps() == 0) break; - + if (transaction.eu == 0) break; } } } diff --git a/common/src/main/java/tesseract/api/gt/GTController.java b/common/src/main/java/tesseract/api/gt/GTController.java index 9d27fb66..e4793c69 100644 --- a/common/src/main/java/tesseract/api/gt/GTController.java +++ b/common/src/main/java/tesseract/api/gt/GTController.java @@ -167,6 +167,7 @@ public void insert(long pipePos, Direction side, GTTransaction stack, ITransacti IGTNode producer = node.value(side.getOpposite()); long voltage_out = producer.getOutputVoltage(); + if (stack.voltage > voltage_out) return; /* * if (amperage_in <= 0) { // just for sending the last piece of energy @@ -177,26 +178,24 @@ public void insert(long pipePos, Direction side, GTTransaction stack, ITransacti inserted++; for (GTConsumer consumer : list) { - long amperage_in = stack.getAvailableAmps(); + long remainingEu = stack.eu; - if (amperage_in <= 0) { + if (remainingEu <= 0) { break; } long loss = Math.round(consumer.getLoss()); - if (loss < 0 || loss > voltage_out) { + if (loss < 0 || loss > stack.voltage) { continue; } - long amperage = consumer.getRequiredAmperage(voltage_out - loss); - if (amperage <= 0) { // if this consumer received all the energy from the other producers + long lossyVoltage = stack.voltage - loss; + long euInserted = consumer.getNode().insertEu(Math.min(lossyVoltage, remainingEu), true); + if (euInserted <= 0) { // if this consumer received all the energy from the other producers continue; } - - // Remember amperes stored in this consumer - amperage = Math.min(amperage_in, amperage); // If we are here, then path had some invalid cables which not suits the limits // of amps/voltage - stack.addData(amperage, loss, a -> dataCommit(consumer, a)); + stack.addData(euInserted, consumer.getLoss(), a -> dataCommit(consumer, a)); } } @@ -208,18 +207,18 @@ public void insert(long pipePos, Direction side, GTTransaction stack, ITransacti * @param data the transfer data. */ public void dataCommit(GTConsumer consumer, GTTransaction.TransferData data) { - if (!consumer.canHandle(data.getVoltage()) || !consumer.canHandleAmp(data.getTotalAmperage()) || (consumer.getConnection() == ConnectionType.SINGLE - && !(consumer.canHandleAmp(data.getTotalAmperage())))) { + if (!consumer.canHandle(data.getVoltage()) || !consumer.canHandleAmp(1) || (consumer.getConnection() == ConnectionType.SINGLE + && !(consumer.canHandleAmp(1)))) { for (Long2ObjectMap.Entry c : consumer.getFull().long2ObjectEntrySet()) { long pos = c.getLongKey(); IGTCable cable = c.getValue(); - switch (cable.getHandler(data.getVoltage(), data.getTotalAmperage())) { + switch (cable.getHandler(data.getVoltage(), 1)) { case FAIL_VOLTAGE -> { onCableOverVoltage(getWorld(), pos, data.getVoltage()); return; } case FAIL_AMPERAGE -> { - onCableOverAmperage(getWorld(), pos, data.getTotalAmperage()); + onCableOverAmperage(getWorld(), pos, 1); return; } default -> { @@ -235,7 +234,7 @@ public void dataCommit(GTConsumer consumer, GTTransaction.TransferData data) { if (i == null) return Math.toIntExact(data.getTotalAmperage()); return Math.toIntExact(i + data.getTotalAmperage()); });*/ - cable.setHolder(GTHolder.add(cable.getHolder(), data.getTotalAmperage())); + cable.setHolder(GTHolder.add(cable.getHolder(), 1)); if (GTHolder.isOverAmperage(cable.getHolder())) { onCableOverAmperage(getWorld(), pos, GTHolder.getAmperage(cable.getHolder())); return; @@ -246,9 +245,9 @@ public void dataCommit(GTConsumer consumer, GTTransaction.TransferData data) { cableIsActive.addAll(consumer.uninsulatedCables); this.totalLoss += data.getLoss(); - this.totalAmperage += data.getTotalAmperage(); - this.totalVoltage += data.getTotalAmperage() * data.getVoltage(); - consumer.getNode().insertAmps(data.getEnergy(1, true), data.getAmps(true), false); + this.totalAmperage++; + this.totalVoltage += data.getEu(); + consumer.getNode().insertEu(data.getEu(), false); } @Override diff --git a/common/src/main/java/tesseract/api/gt/GTTransaction.java b/common/src/main/java/tesseract/api/gt/GTTransaction.java index 9d1427b2..73e23ad5 100644 --- a/common/src/main/java/tesseract/api/gt/GTTransaction.java +++ b/common/src/main/java/tesseract/api/gt/GTTransaction.java @@ -6,60 +6,32 @@ public class GTTransaction extends Transaction { - public long availableAmps; - public final long voltageOut; + public final long voltage; public long eu; - public long usedAmps; - public final Mode mode; - public GTTransaction(long ampsAvailable, long voltageOut, Consumer consumer) { + public GTTransaction(long voltage, Consumer consumer) { super(consumer); - this.availableAmps = ampsAvailable; - this.voltageOut = voltageOut; - this.usedAmps = 0; - this.mode = Mode.TRANSMIT; - } - - public GTTransaction(long eu, Consumer consumer) { - super(consumer); - this.voltageOut = 0; - this.eu = eu; - this.mode = Mode.INTERNAL; + this.voltage = voltage; + this.eu = voltage; } @Override public boolean isValid() { - return (this.availableAmps > 0 && this.voltageOut > 0) || this.eu > 0; + return this.eu > 0; } @Override public boolean canContinue() { - return availableAmps > 0 || eu > 0; + return eu > 0; } - public long getAvailableAmps() { - return this.availableAmps; - } - - public long addAmps(long amps) { - this.availableAmps += amps; - return amps; - } - public TransferData addData(long amps, double loss, Consumer data) { - TransferData td = new TransferData(this, Math.min(amps, availableAmps), this.voltageOut).setLoss(loss); - this.addData(td); - this.usedAmps += amps; - availableAmps -= amps; - this.onCommit(data); - return td; - } - public TransferData addData(long eu, Consumer data) { + public TransferData addData(long eu, double loss, Consumer data) { eu = Math.min(eu, this.eu); - TransferData dat = this.addData(new TransferData(this, eu)); - this.eu -= eu; + TransferData dat = this.addData(new TransferData(this, eu, this.voltage).setLoss(loss)); + this.eu -= Math.min(this.eu, eu + Math.round(loss)); this.onCommit(data); return dat; } @@ -67,24 +39,13 @@ public TransferData addData(long eu, Consumer data) { public static class TransferData { private final long voltage; private long eu; - private long ampsIn; - private long ampsOut; - private final long totalAmperage; private double loss; public final GTTransaction transaction; - public TransferData(GTTransaction transaction, long amps, long voltage) { - this.ampsIn = this.ampsOut = this.totalAmperage = amps; + public TransferData(GTTransaction transaction, long eu, long voltage) { this.voltage = voltage; this.loss = 0; - this.eu = 0; - this.transaction = transaction; - } - - public TransferData(GTTransaction transaction, long eu) { - this.voltage = 0; this.eu = eu; - this.totalAmperage = 0; this.transaction = transaction; } @@ -92,10 +53,6 @@ public long getEnergy(long amps, boolean input) { return input ? (voltage - Math.round(loss)) * amps : voltage * amps; } - public long getTotalAmperage() { - return totalAmperage; - } - public double getLoss() { return loss; } @@ -114,52 +71,9 @@ public long drainEu(long eu) { return eu; } - public long getAmps(boolean input) { - return input ? ampsIn : ampsOut; - } - - public void useAmps(boolean input, long amps) { - if (input) { - ampsIn -= amps; - } else { - ampsOut -= amps; - } - } - @Override public String toString() { - if (transaction.mode == Mode.INTERNAL) { - return "Internal: " + this.eu; - } else { - return "Transmit amps: " + this.totalAmperage + " voltage: " + this.voltage + " loss: " + this.loss; - } - } - - public long consumeForNode(IGTNode node) { - if (this.transaction.mode == GTTransaction.Mode.TRANSMIT) { - long amps = Math.min(getAmps(true), node.availableAmpsInput(this.getVoltage())); - amps = Math.min(amps, (node.getCapacity() - node.getEnergy()) / node.getInputVoltage()); - useAmps(true, amps); - node.getState().receive(false, amps); - return getEnergy(amps, true); - } else { - long toAdd = Math.min(getEu(), node.getCapacity() - node.getEnergy()); - return drainEu(toAdd); - } - } - - public long extractForNode(IGTNode node) { - if (transaction.mode == GTTransaction.Mode.TRANSMIT) { - long amps = Math.min(getAmps(false), node.availableAmpsOutput()); - amps = Math.min(amps, node.getEnergy() / node.getOutputVoltage()); - node.getState().extract(false, amps); - useAmps(false, amps); - return getEnergy(amps, false); - } else { - long toDrain = Math.min(getEu(), node.getEnergy()); - return drainEu(toDrain); - } - + return "Transmit eu: " + this.eu + " voltage: " + this.voltage + " loss: " + this.loss; } public long getVoltage() { @@ -170,9 +84,4 @@ public GTTransaction getTransaction() { return transaction; } } - - public enum Mode { - INTERNAL, - TRANSMIT - } } diff --git a/common/src/main/java/tesseract/api/gt/IGTNode.java b/common/src/main/java/tesseract/api/gt/IGTNode.java index 5a73db58..73d6af2b 100644 --- a/common/src/main/java/tesseract/api/gt/IGTNode.java +++ b/common/src/main/java/tesseract/api/gt/IGTNode.java @@ -15,47 +15,6 @@ */ public interface IGTNode { - /** - * Inserts x amps of y voltage into the node. - * @param voltage The voltage to be inserted into the node. - * @param amps The amps to be inserted into the node. - * @param simulate If true, the container will not be modified. - * @return The amps that were added to the node. - */ - default long insertAmps(long voltage, long amps, boolean simulate){ - if (voltage <= 0 || amps <= 0) return 0; - long insertedAmps = 0; - for (int i = 0; i < amps; i++){ - long inserted = insertEu(voltage, true); - if (inserted == voltage){ - insertedAmps++; - getState().receive(simulate, amps); - if (!simulate) insertEu(voltage, false); - } else { - break; - } - } - return insertedAmps; - } - - /** - * Extracts x amps of y voltage from the node. - * @param voltage The voltage to be extracted from the node. - * @param amps The amps to be extracted from the node. - * @param simulate If true, the container will not be modified. - * @return The amps that were extracted from the node. - */ - default long extractAmps(long voltage, long amps, boolean simulate){ - if (voltage < 0 || amps < 0) return 0; - amps = Math.min(amps, this.availableAmpsOutput()); - amps = Math.min(amps, this.getEnergy() / this.getOutputVoltage()); - if (!simulate){ - extractEu(voltage * amps, false); - } - this.getState().extract(simulate, amps); - return amps; - } - /** * Extracts a given amount of energy from the node. * @param voltage The amount to be extracted from the node. diff --git a/common/src/main/java/tesseract/api/rf/RFController.java b/common/src/main/java/tesseract/api/rf/RFController.java index c53d3c1e..050bcdd2 100644 --- a/common/src/main/java/tesseract/api/rf/RFController.java +++ b/common/src/main/java/tesseract/api/rf/RFController.java @@ -262,7 +262,7 @@ public void insert(long pipePos, Direction side, RFTransaction transaction, ITra for (RFConsumer consumer : list) { long added = consumer.insert(Math.min(transaction.rf, consumer.getNode().maxInsert()), true); if (added <= 0) continue; - transaction.addData(added, rf -> consumer.insert(rf, true)); + transaction.addData(added, rf -> consumer.insert(rf, false)); } } } \ No newline at end of file diff --git a/fabric/src/main/java/tesseract/api/fabric/wrapper/EnergyMoveableWrapper.java b/fabric/src/main/java/tesseract/api/fabric/wrapper/EnergyMoveableWrapper.java index 33821c06..95245618 100644 --- a/fabric/src/main/java/tesseract/api/fabric/wrapper/EnergyMoveableWrapper.java +++ b/fabric/src/main/java/tesseract/api/fabric/wrapper/EnergyMoveableWrapper.java @@ -24,17 +24,6 @@ public EnergyMoveableWrapper(BlockEntity blockEntity, EnergyMoveable storage) { this.blockEntity = blockEntity; } - @Override - public long extractAmps(long voltage, long amps, boolean simulate) { - if (storage instanceof EnergyExtractable extractable && extractable.canExtract(getTier(voltage))){ - if (extractable.extractEnergy(voltage, Simulation.SIMULATE) == voltage){ - if (!simulate) extractable.extractEnergy(voltage, Simulation.ACT); - return 1; - } - } - return 0; - } - @Override public long extractEu(long voltage, boolean simulate) { if (storage instanceof EnergyExtractable extractable && extractable.canExtract(getTier(voltage))){ @@ -43,17 +32,6 @@ public long extractEu(long voltage, boolean simulate) { return 0; } - @Override - public long insertAmps(long voltage, long amps, boolean simulate) { - if (storage instanceof EnergyInsertable insertable && insertable.canInsert(getTier(voltage))){ - if (insertable.insertEnergy(voltage, Simulation.SIMULATE) == voltage){ - if (!simulate) insertable.insertEnergy(voltage, Simulation.ACT); - return 1; - } - } - return 0; - } - @Override public long insertEu(long voltage, boolean simulate) { if (storage instanceof EnergyInsertable insertable && insertable.canInsert(getTier(voltage))){ diff --git a/fabric/src/main/java/tesseract/api/fabric/wrapper/EnergyTileWrapper.java b/fabric/src/main/java/tesseract/api/fabric/wrapper/EnergyTileWrapper.java index 5e98b8ec..ee1989e3 100644 --- a/fabric/src/main/java/tesseract/api/fabric/wrapper/EnergyTileWrapper.java +++ b/fabric/src/main/java/tesseract/api/fabric/wrapper/EnergyTileWrapper.java @@ -23,32 +23,6 @@ public EnergyTileWrapper(BlockEntity tile, EnergyStorage storage) { this.storage = storage; } - @Override - public long insertAmps(long voltage, long amps, boolean simulate) { - try(Transaction transaction = Transaction.openOuter()) { - long inserted = storage.insert((long) (voltage * TesseractConfig.EU_TO_TRE_RATIO.get()), transaction); - if (inserted == voltage * TesseractConfig.EU_TO_TRE_RATIO.get()){ - if (!simulate) transaction.commit(); - return 1; - } - return 0; - } - - } - - @Override - public long extractAmps(long voltage, long amps, boolean simulate) { - try(Transaction transaction = Transaction.openOuter()) { - long inserted = storage.extract((long) (voltage * TesseractConfig.EU_TO_TRE_RATIO.get()), transaction); - if (inserted == voltage * TesseractConfig.EU_TO_TRE_RATIO.get()){ - if (!simulate) transaction.commit(); - return 1; - } - return 0; - } - - } - @Override public long insertEu(long voltage, boolean simulate) { try(Transaction transaction = Transaction.openOuter()) { diff --git a/fabric/src/main/java/tesseract/api/fabric/wrapper/IEnergyHandlerMoveable.java b/fabric/src/main/java/tesseract/api/fabric/wrapper/IEnergyHandlerMoveable.java index 4a19ac82..38fccffa 100644 --- a/fabric/src/main/java/tesseract/api/fabric/wrapper/IEnergyHandlerMoveable.java +++ b/fabric/src/main/java/tesseract/api/fabric/wrapper/IEnergyHandlerMoveable.java @@ -19,8 +19,8 @@ default long extractEnergy(long maxExtract, Simulation simulation){ @Override default long insertEnergy(long maxInsert, Simulation simulation){ long euToInsert = (long) (maxInsert / TesseractConfig.EU_TO_TRE_RATIO.get()); - long amp = getEnergyHandler().insertAmps(euToInsert, 1, simulation.isSimulating()); - return amp == 1 ? maxInsert : 0; + long inserted = getEnergyHandler().insertEu(euToInsert, simulation.isSimulating()); + return (long) (inserted * TesseractConfig.EU_TO_TRE_RATIO.get()); } @Override diff --git a/fabric/src/main/java/tesseract/api/fabric/wrapper/IEnergyHandlerStorage.java b/fabric/src/main/java/tesseract/api/fabric/wrapper/IEnergyHandlerStorage.java index 49c6c1b4..c39a9124 100644 --- a/fabric/src/main/java/tesseract/api/fabric/wrapper/IEnergyHandlerStorage.java +++ b/fabric/src/main/java/tesseract/api/fabric/wrapper/IEnergyHandlerStorage.java @@ -13,13 +13,13 @@ public interface IEnergyHandlerStorage extends EnergyStorage { @Override default long insert(long maxReceive, TransactionContext context) { long euToInsert = (long) (maxReceive / TesseractConfig.EU_TO_TRE_RATIO.get()); - long amp = getEnergyHandler().insertAmps(euToInsert, 1, true); + long inserted = getEnergyHandler().insertEu(euToInsert, true); context.addCloseCallback((t, r) -> { if (r.wasCommitted()){ - getEnergyHandler().insertAmps(euToInsert, 1, false); + getEnergyHandler().insertEu(inserted, false); } }); - return amp == 1 ? maxReceive : 0; + return (long) (inserted * TesseractConfig.EU_TO_TRE_RATIO.get()); } @Override diff --git a/forge/src/main/java/tesseract/api/forge/wrapper/EnergyTileWrapper.java b/forge/src/main/java/tesseract/api/forge/wrapper/EnergyTileWrapper.java index 1b4e1396..45d5a9c5 100644 --- a/forge/src/main/java/tesseract/api/forge/wrapper/EnergyTileWrapper.java +++ b/forge/src/main/java/tesseract/api/forge/wrapper/EnergyTileWrapper.java @@ -22,26 +22,6 @@ public EnergyTileWrapper(BlockEntity tile, IEnergyStorage storage) { this.storage = storage; } - @Override - public long insertAmps(long voltage, long amps, boolean simulate) { - long inserted = storage.receiveEnergy((int) (voltage * TesseractConfig.EU_TO_FE_RATIO.get()), simulate); - if (inserted == voltage * TesseractConfig.EU_TO_FE_RATIO.get()){ - return 1; - } - return 0; - - } - - @Override - public long extractAmps(long voltage, long amps, boolean simulate) { - long inserted = storage.extractEnergy((int) (voltage * TesseractConfig.EU_TO_FE_RATIO.get()), simulate); - if (inserted == voltage * TesseractConfig.EU_TO_FE_RATIO.get()){ - return 1; - } - return 0; - - } - @Override public long insertEu(long voltage, boolean simulate) { return (long) (storage.receiveEnergy((int) (voltage * TesseractConfig.EU_TO_FE_RATIO.get()), simulate) / TesseractConfig.EU_TO_FE_RATIO.get()); diff --git a/forge/src/main/java/tesseract/api/forge/wrapper/IEnergyHandlerStorage.java b/forge/src/main/java/tesseract/api/forge/wrapper/IEnergyHandlerStorage.java index 63c002ff..108426d4 100644 --- a/forge/src/main/java/tesseract/api/forge/wrapper/IEnergyHandlerStorage.java +++ b/forge/src/main/java/tesseract/api/forge/wrapper/IEnergyHandlerStorage.java @@ -12,8 +12,8 @@ public interface IEnergyHandlerStorage extends IEnergyStorage { @Override default int receiveEnergy(int maxReceive, boolean simulate) { long euToInsert = (long) (maxReceive / TesseractConfig.EU_TO_FE_RATIO.get()); - long amp = getEnergyHandler().insertAmps(euToInsert, 1, simulate); - return amp == 1 ? maxReceive : 0; + long inserted = getEnergyHandler().insertEu(euToInsert, simulate); + return (int) (inserted * TesseractConfig.EU_TO_FE_RATIO.get()); } @Override From 13eb68ab256934d5b5f9b0749ba2004c8e942e68 Mon Sep 17 00:00:00 2001 From: trinsdar <30245301+Trinsdar@users.noreply.github.com> Date: Wed, 29 Nov 2023 23:22:01 -0500 Subject: [PATCH 2/5] mostly finished energy insertion logic --- .../api/capability/TesseractGTCapability.java | 35 ++++++---- .../java/tesseract/api/gt/GTController.java | 70 ++++++++++++++++--- .../java/tesseract/api/gt/GTTransaction.java | 4 +- 3 files changed, 83 insertions(+), 26 deletions(-) diff --git a/common/src/main/java/tesseract/api/capability/TesseractGTCapability.java b/common/src/main/java/tesseract/api/capability/TesseractGTCapability.java index 0aa4927b..aaa31bdd 100644 --- a/common/src/main/java/tesseract/api/capability/TesseractGTCapability.java +++ b/common/src/main/java/tesseract/api/capability/TesseractGTCapability.java @@ -6,10 +6,7 @@ import net.minecraft.world.level.block.entity.BlockEntity; import tesseract.TesseractCapUtils; import tesseract.TesseractGraphWrappers; -import tesseract.api.gt.GTConsumer; -import tesseract.api.gt.GTTransaction; -import tesseract.api.gt.IEnergyHandler; -import tesseract.api.gt.IGTCable; +import tesseract.api.gt.*; import tesseract.graph.Graph; import tesseract.util.Pos; @@ -25,10 +22,9 @@ public TesseractGTCapability(T tile, Direction dir, boolean isNode, ITransaction @Override public long insertEu(long voltage, boolean simulate) { - if (this.isSending) return 0; + if (this.isSending || (!simulate && old == null)) return 0; this.isSending = true; if (!simulate) { - if (old == null) return 0; old.commit(); } else { long pos = tile.getBlockPos().asLong(); @@ -40,6 +36,7 @@ public long insertEu(long voltage, boolean simulate) { } this.old = transaction; } + this.isSending = false; return voltage - old.eu; } @@ -49,6 +46,8 @@ public long extractEu(long voltage, boolean simulate) { } private void transferAroundPipe(GTTransaction transaction, long pos) { + boolean hasInserted = false; + boolean lossAdded = false; for (Direction dir : Graph.DIRECTIONS) { if (dir == this.side || !this.tile.connects(dir)) continue; //First, perform cover modifications. @@ -60,24 +59,30 @@ private void transferAroundPipe(GTTransaction transaction, long pos) { //Perform insertion, and add to the transaction. var handler = cap.get(); long loss = Math.round(cable.getLoss()); - long voltage = transaction.voltage - loss; - long remainingEu = transaction.eu; - long toInsert = Math.min(remainingEu, voltage); - GTTransaction.TransferData data = new GTTransaction.TransferData(transaction, toInsert, transaction.voltage).setLoss(cable.getLoss()); + if (hasInserted && !lossAdded){ + transaction.addData(0, loss, 0, d -> {}); + lossAdded = true; + } + + long remainingEu = lossAdded ? transaction.eu : transaction.eu - loss; + GTTransaction.TransferData data = new GTTransaction.TransferData(transaction, remainingEu, transaction.voltage).setLoss(cable.getLoss()); if (this.callback.modify(data, dir, false, true) || this.callback.modify(data, side, true, true)){ continue; } - if (data.getEu() < toInsert) toInsert = data.getEu(); - if (data.getLoss() > 0) toInsert -= Math.round(data.getLoss()); - if (toInsert <= 0) return; - long inserted = handler.insertEu(toInsert, true); + if (data.getEu() < remainingEu) remainingEu = data.getEu(); + if (data.getLoss() > 0) remainingEu -= Math.round(data.getLoss()); + if (remainingEu <= 0) return; + long inserted = handler.insertEu(remainingEu, true); if (inserted > 0){ - transaction.addData(inserted, cable.getLoss(), t -> { + transaction.addData(inserted, inserted, cable.getLoss(), t -> { if (this.callback.modify(t, dir, false, false) || this.callback.modify(data, side, true, false)){ return; } handler.insertEu(t.getEu(), false); }); + if (transaction.voltage > this.cable.getVoltage()){ + ((IGTEvent)TesseractGraphWrappers.GT_ENERGY.getController(tile.getLevel(), pos)).onCableOverVoltage(tile.getLevel(), pos, transaction.voltage); + } } if (transaction.eu == 0) break; } diff --git a/common/src/main/java/tesseract/api/gt/GTController.java b/common/src/main/java/tesseract/api/gt/GTController.java index e4793c69..54ad84f2 100644 --- a/common/src/main/java/tesseract/api/gt/GTController.java +++ b/common/src/main/java/tesseract/api/gt/GTController.java @@ -1,5 +1,6 @@ package tesseract.api.gt; +import it.unimi.dsi.fastutil.Pair; import it.unimi.dsi.fastutil.longs.*; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import net.minecraft.core.Direction; @@ -18,9 +19,14 @@ import tesseract.util.Node; import tesseract.util.Pos; +import java.util.ArrayList; import java.util.EnumMap; import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Function; /** * Class acts as a controller in the group of an electrical components. @@ -176,27 +182,77 @@ public void insert(long pipePos, Direction side, GTTransaction stack, ITransacti * } */ inserted++; + List>> transferList = new ArrayList<>(); + double previousLoss = 0; for (GTConsumer consumer : list) { long remainingEu = stack.eu; if (remainingEu <= 0) { break; } - long loss = Math.round(consumer.getLoss()); - if (loss < 0 || loss > stack.voltage) { + double loss = consumer.getLoss(); + double appliedLoss = loss == 0 ? 0 : loss > previousLoss ? loss - previousLoss : previousLoss - loss; + previousLoss = loss; + long roundedAppliedLoss = Math.round(appliedLoss); + if (roundedAppliedLoss < 0 || roundedAppliedLoss > remainingEu) { continue; } - long lossyVoltage = stack.voltage - loss; - long euInserted = consumer.getNode().insertEu(Math.min(lossyVoltage, remainingEu), true); + long lossyEu = remainingEu - roundedAppliedLoss; + long euInserted = consumer.getNode().insertEu(lossyEu, true); if (euInserted <= 0) { // if this consumer received all the energy from the other producers continue; } // If we are here, then path had some invalid cables which not suits the limits // of amps/voltage - stack.addData(euInserted, consumer.getLoss(), a -> dataCommit(consumer, a)); + + GTTransaction.TransferData data1 = stack.addData(euInserted, euInserted + roundedAppliedLoss, appliedLoss, a -> {}); + transferList.add((l) -> dataCommit(l, consumer, data1)); + } + if (!transferList.isEmpty()){ + stack.addData(0, 0, 0, d-> dataCommit(transferList)); + } + } + + public void dataCommit(Long2ObjectMap cableList, GTConsumer consumer, GTTransaction.TransferData data){ + if (!consumer.canHandle(data.getVoltage())) { + for (Long2ObjectMap.Entry c : consumer.getFull().long2ObjectEntrySet()) { + long pos = c.getLongKey(); + IGTCable cable = c.getValue(); + if (Objects.requireNonNull(cable.getHandler(data.getVoltage(), 0)) == GTStatus.FAIL_VOLTAGE) { + onCableOverVoltage(getWorld(), pos, data.getVoltage()); + return; + } + } + } else { + for (Long2ObjectMap.Entry c : consumer.getFull().long2ObjectEntrySet()) { + IGTCable cable = c.getValue(); + if (!cableList.containsKey(c.getLongKey())) cableList.put(c.getLongKey(), cable); + } + } + cableIsActive.addAll(consumer.uninsulatedCables); + + this.totalLoss += data.getLoss(); + this.totalVoltage += data.getEu(); + consumer.getNode().insertEu(data.getEu(), false); + } + + public void dataCommit(List>> list){ + Long2ObjectMap cableList = new Long2ObjectOpenHashMap<>(); + for (var pair : list) { + pair.accept(cableList); + } + for (Long2ObjectMap.Entry c : cableList.long2ObjectEntrySet()) { + long pos = c.getLongKey(); + IGTCable cable = c.getValue(); + cable.setHolder(GTHolder.add(cable.getHolder(), 1)); + if (GTHolder.isOverAmperage(cable.getHolder())) { + onCableOverAmperage(getWorld(), pos, GTHolder.getAmperage(cable.getHolder())); + return; + } } + totalAmperage++; } /** @@ -230,10 +286,6 @@ public void dataCommit(GTConsumer consumer, GTTransaction.TransferData data) { for (Long2ObjectMap.Entry c : consumer.getCross().long2ObjectEntrySet()) { long pos = c.getLongKey(); IGTCable cable = c.getValue(); - /*pipeMap.compute(c.getLongKey(), (l, i) ->{ - if (i == null) return Math.toIntExact(data.getTotalAmperage()); - return Math.toIntExact(i + data.getTotalAmperage()); - });*/ cable.setHolder(GTHolder.add(cable.getHolder(), 1)); if (GTHolder.isOverAmperage(cable.getHolder())) { onCableOverAmperage(getWorld(), pos, GTHolder.getAmperage(cable.getHolder())); diff --git a/common/src/main/java/tesseract/api/gt/GTTransaction.java b/common/src/main/java/tesseract/api/gt/GTTransaction.java index 73e23ad5..fbf77807 100644 --- a/common/src/main/java/tesseract/api/gt/GTTransaction.java +++ b/common/src/main/java/tesseract/api/gt/GTTransaction.java @@ -28,10 +28,10 @@ public boolean canContinue() { - public TransferData addData(long eu, double loss, Consumer data) { + public TransferData addData(long eu, long consumedEu, double loss, Consumer data) { eu = Math.min(eu, this.eu); TransferData dat = this.addData(new TransferData(this, eu, this.voltage).setLoss(loss)); - this.eu -= Math.min(this.eu, eu + Math.round(loss)); + this.eu -= Math.min(this.eu, consumedEu); this.onCommit(data); return dat; } From 23e0c7f36a552f61c751140d90033a2864424bbe Mon Sep 17 00:00:00 2001 From: trinsdar <30245301+Trinsdar@users.noreply.github.com> Date: Sun, 3 Dec 2023 20:30:28 -0500 Subject: [PATCH 3/5] bumped to new pre --- common/gradle.properties | 2 +- fabric/gradle.properties | 2 +- forge/gradle.properties | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/common/gradle.properties b/common/gradle.properties index 854a88cc..079b4da7 100644 --- a/common/gradle.properties +++ b/common/gradle.properties @@ -1 +1 @@ -mod_version=0.2.2 \ No newline at end of file +mod_version=0.2.3-pre1 \ No newline at end of file diff --git a/fabric/gradle.properties b/fabric/gradle.properties index 77ef402a..29b418db 100644 --- a/fabric/gradle.properties +++ b/fabric/gradle.properties @@ -1,3 +1,3 @@ energy_version=2.2.0 -mod_version=0.2.2 \ No newline at end of file +mod_version=0.2.3-pre1 \ No newline at end of file diff --git a/forge/gradle.properties b/forge/gradle.properties index f4ec53c9..79beafa7 100644 --- a/forge/gradle.properties +++ b/forge/gradle.properties @@ -1,3 +1,3 @@ loom.platform=forge -mod_version=0.2.2 \ No newline at end of file +mod_version=0.2.3-pre1 \ No newline at end of file From 85a8d231a04a09d0e34f14aa00712f1f06ac453a Mon Sep 17 00:00:00 2001 From: trinsdar <30245301+Trinsdar@users.noreply.github.com> Date: Sun, 3 Dec 2023 22:03:12 -0500 Subject: [PATCH 4/5] updated carbon config --- common/build.gradle | 2 +- fabric/build.gradle | 2 +- forge/build.gradle | 2 +- gradle.properties | 2 ++ 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/common/build.gradle b/common/build.gradle index 489de3a5..4012d616 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -30,7 +30,7 @@ dependencies{ compileOnly("com.electronwill.night-config:toml:${rootProject.nightconfig_version}") compileOnly("com.electronwill.night-config:core:${rootProject.nightconfig_version}") modImplementation("earth.terrarium:botarium-common-${project.minecraft_version}:${project.botarium_version}") - modImplementation "maven.modrinth:carbon-config:2ngFmmhP" + modImplementation "maven.modrinth:carbon-config:${project.carbon_config_fabric_version}" testImplementation('junit:junit:4.11') testImplementation(sourceSets.main.output) } diff --git a/fabric/build.gradle b/fabric/build.gradle index 9a13db0e..976474d5 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -52,7 +52,7 @@ dependencies { } modImplementation(include("earth.terrarium:botarium-fabric-${project.minecraft_version}:${project.botarium_version}")) modCompileOnly("curse.maven:modern_industrialization-405388:3866891") - modImplementation(include("maven.modrinth:carbon-config:2ngFmmhP")) + modImplementation(include("maven.modrinth:carbon-config:${project.carbon_config_fabric_version}")) } processResources { diff --git a/forge/build.gradle b/forge/build.gradle index cbb2ea3c..1a750d2a 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -43,7 +43,7 @@ dependencies { exclude(group: "curse.maven") } testImplementation('junit:junit:4.11') - modImplementation(include("maven.modrinth:carbon-config:IMC0pt5I")) + modImplementation(include("maven.modrinth:carbon-config:${project.carbon_config_forge_version}")) } processResources { diff --git a/gradle.properties b/gradle.properties index 018e04fe..208363bc 100644 --- a/gradle.properties +++ b/gradle.properties @@ -19,6 +19,8 @@ energy_version=2.3.0 nightconfig_version=3.6.5 rei_version=7.0.346 botarium_version=2.0.5 +carbon_config_fabric_version=ec9yfAHJ +carbon_config_forge_version=95tti5dP maven_group=io.github.gregtechintergalactical tesseract_archive_base_name=TesseractAPI From 74bf349ab412cc3a629b6c7f00f4b32b0d805ac8 Mon Sep 17 00:00:00 2001 From: trinsdar <30245301+Trinsdar@users.noreply.github.com> Date: Wed, 17 Jan 2024 23:47:12 -0500 Subject: [PATCH 5/5] disabled group remove illegal argument exceotion --- common/src/main/java/tesseract/graph/Group.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/tesseract/graph/Group.java b/common/src/main/java/tesseract/graph/Group.java index 013d002e..db2ac994 100644 --- a/common/src/main/java/tesseract/graph/Group.java +++ b/common/src/main/java/tesseract/graph/Group.java @@ -279,7 +279,8 @@ private void internalRemove(long pos, Consumer> split) { // The contains() check can be skipped here, because Graph will only call remove() if it knows that the group contains the entry. // For now, it is retained for completeness and debugging purposes. if (!contains(pos)) { - throw new IllegalArgumentException("Group::remove: Tried to call with a position that does not exist within the group."); + //Tesseract.LOGGER.error(new IllegalArgumentException("Group::remove: Tried to call with a position that does not exist within the group.")); + return; } // If removing the entry would not cause a group split, then it is safe to remove the entry directly.