enough for today, my head hurts

This commit is contained in:
Boblet 2024-04-05 14:51:36 +02:00
parent 3cb6e855a8
commit 1618d9be12
5 changed files with 60 additions and 19 deletions

View File

@ -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");

View File

@ -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);

View File

@ -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<IEnergyProviderMK2, Long> entry : net.providerEntries.entrySet()) {
IEnergyProviderMK2 provider = entry.getKey();
if(provider.isLoaded() && timestamp - entry.getValue() < timeout) supply = supply.add(BigInteger.valueOf(provider.getPower()));
}
for(Entry<IEnergyReceiverMK2, Long> entry : net.receiverEntries.entrySet()) {
IEnergyReceiverMK2 receiver = entry.getKey();
if(receiver.isLoaded() && timestamp - entry.getValue() < timeout) demand = demand.add(BigInteger.valueOf(receiver.getMaxPower() - receiver.getPower()));
}
}
}

View File

@ -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;
}
}

View File

@ -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);
}
}
}