From 1618d9be12451cc980b05478d67556af622fa887 Mon Sep 17 00:00:00 2001 From: Boblet Date: Fri, 5 Apr 2024 14:51:36 +0200 Subject: [PATCH] enough for today, my head hurts --- .../api/hbm/energymk2/IEnergyProviderMK2.java | 9 +++-- .../api/hbm/energymk2/IEnergyReceiverMK2.java | 15 ++++++- .../java/api/hbm/energymk2/Nodespace.java | 39 ++++++++++++++++--- .../machine/TileEntityMachineDetector.java | 7 ++-- .../machine/TileEntityMachineMiniRTG.java | 9 +++-- 5 files changed, 60 insertions(+), 19 deletions(-) diff --git a/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java b/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java index 99d029f62..b8a05e0ae 100644 --- a/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java +++ b/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java @@ -3,7 +3,6 @@ package api.hbm.energymk2; import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; -import api.hbm.energy.IEnergyConnector; import api.hbm.energymk2.Nodespace.PowerNode; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.nbt.NBTTagCompound; @@ -11,7 +10,9 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public interface IEnergyProviderMK2 extends IEnergyConnector { +public interface IEnergyProviderMK2 extends IEnergyConnectorMK2 { + + public void setPower(long power); public default void tryProvide(World world, int x, int y, int z, ForgeDirection dir) { @@ -22,7 +23,7 @@ public interface IEnergyProviderMK2 extends IEnergyConnector { IEnergyConductorMK2 con = (IEnergyConductorMK2) te; if(!con.canConnect(dir.getOpposite())) return; - PowerNode node = con.createNode(); + PowerNode node = Nodespace.getNode(world, x, y, z); if(node != null && node.net != null) { node.net.addProvider(this); @@ -30,6 +31,8 @@ public interface IEnergyProviderMK2 extends IEnergyConnector { } } + //TODO: direct transfer + if(particleDebug) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "network"); diff --git a/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java b/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java index 677aa596f..d68837692 100644 --- a/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java +++ b/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java @@ -12,7 +12,18 @@ import net.minecraftforge.common.util.ForgeDirection; public interface IEnergyReceiverMK2 extends IEnergyConnectorMK2 { - public long transferPower(long power); + public default long transferPower(long power) { + if(power + this.getPower() <= this.getMaxPower()) { + this.setPower(power + this.getPower()); + return 0; + } + long capacity = this.getMaxPower() - this.getPower(); + long overshoot = power - capacity; + this.setPower(this.getMaxPower()); + return overshoot; + } + + public void setPower(long power); public default void trySubscribe(World world, int x, int y, int z, ForgeDirection dir) { @@ -23,7 +34,7 @@ public interface IEnergyReceiverMK2 extends IEnergyConnectorMK2 { IEnergyConductorMK2 con = (IEnergyConductorMK2) te; if(!con.canConnect(dir.getOpposite())) return; - PowerNode node = con.createNode(); + PowerNode node = Nodespace.getNode(world, x, y, z); if(node != null && node.net != null) { node.net.addReceiver(this); diff --git a/src/main/java/api/hbm/energymk2/Nodespace.java b/src/main/java/api/hbm/energymk2/Nodespace.java index ae6afd5bc..2a9f4c23a 100644 --- a/src/main/java/api/hbm/energymk2/Nodespace.java +++ b/src/main/java/api/hbm/energymk2/Nodespace.java @@ -1,5 +1,6 @@ package api.hbm.energymk2; +import java.math.BigInteger; import java.util.HashMap; import java.util.HashSet; import java.util.Map.Entry; @@ -49,9 +50,8 @@ public class Nodespace { } } - // UNUSED DO NOT TOUCH /** Grabs all neighbor nodes from the given node's connection points and removes them from the network entirely, forcing a hard reconnect */ - private static void markNeigbors(World world, PowerNode node) { + @Deprecated private static void markNeigbors(World world, PowerNode node) { for(DirPos con : node.connections) { PowerNode conNode = getNode(world, con.getX(), con.getY(), con.getZ()); @@ -72,9 +72,9 @@ public class Nodespace { node.recentlyChanged = false; } - if(node.hasValidNet()) { + /*if(node.hasValidNet()) { - /*for(BlockPos pos : node.positions) { + for(BlockPos pos : node.positions) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "marker"); data.setInteger("color", node.net.hashCode() % 0xffffff); @@ -82,8 +82,35 @@ public class Nodespace { data.setDouble("dist", 50D); data.setString("label", "" + node.net.links.size()); PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, pos.getX(), pos.getY(), pos.getZ()), new TargetPoint(world.provider.dimensionId, pos.getX(), pos.getY(), pos.getZ(), 50)); - }*/ - } + } + }*/ + } + } + + updatePowerNets(); + } + + private static void updatePowerNets() { + + int timeout = 3_000; + + for(PowerNetMK2 net : activePowerNets) { + + long timestamp = System.currentTimeMillis(); + + //TODO: start over, impose a per-tick transfer limit in order to avoid bigints + + BigInteger supply = BigInteger.valueOf(0); + BigInteger demand = BigInteger.valueOf(0); + + for(Entry entry : net.providerEntries.entrySet()) { + IEnergyProviderMK2 provider = entry.getKey(); + if(provider.isLoaded() && timestamp - entry.getValue() < timeout) supply = supply.add(BigInteger.valueOf(provider.getPower())); + } + + for(Entry entry : net.receiverEntries.entrySet()) { + IEnergyReceiverMK2 receiver = entry.getKey(); + if(receiver.isLoaded() && timestamp - entry.getValue() < timeout) demand = demand.add(BigInteger.valueOf(receiver.getMaxPower() - receiver.getPower())); } } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDetector.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDetector.java index 8f62d9f47..b4d1a8d39 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDetector.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDetector.java @@ -2,15 +2,15 @@ package com.hbm.tileentity.machine; import com.hbm.tileentity.TileEntityLoadedBase; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineDetector extends TileEntityLoadedBase implements IEnergyUser { +public class TileEntityMachineDetector extends TileEntityLoadedBase implements IEnergyReceiverMK2 { long power; @Override - public void updateEntity() { + public void updateEntity() { if(!worldObj.isRemote) { @@ -56,5 +56,4 @@ public class TileEntityMachineDetector extends TileEntityLoadedBase implements I public ConnectionPriority getPriority() { return ConnectionPriority.HIGH; } - } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiniRTG.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiniRTG.java index cf6c1372d..ba194d48d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiniRTG.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiniRTG.java @@ -4,12 +4,12 @@ import com.hbm.blocks.ModBlocks; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.CompatEnergyControl; -import api.hbm.energy.IEnergyGenerator; +import api.hbm.energymk2.IEnergyProviderMK2; import api.hbm.tile.IInfoProviderEC; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineMiniRTG extends TileEntityLoadedBase implements IEnergyGenerator, IInfoProviderEC { +public class TileEntityMachineMiniRTG extends TileEntityLoadedBase implements IEnergyProviderMK2, IInfoProviderEC { public long power; boolean tact = false; @@ -24,8 +24,9 @@ public class TileEntityMachineMiniRTG extends TileEntityLoadedBase implements IE if(power > getMaxPower()) power = getMaxPower(); - for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) - this.sendPower(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { + this.tryProvide(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); + } } }