import arzumify.located.math.Vec3i; import arzumify.polyenergy.api.EnergyProvider; import arzumify.polyenergy.api.EnergyReceiver; import arzumify.polyenergy.impl.MatchMaker; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerBlockEntityEvents; import net.minecraft.block.entity.BlockEntity; import net.minecraft.server.world.ServerWorld; import java.util.Collection; import java.util.List; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; // Cables can have ONE provider and MANY receivers. public class SimpleCodeOnlyCable implements EnergyProvider, EnergyReceiver, ServerBlockEntityEvents.Unload, ServerBlockEntityEvents.Load { public final long capacity; public final long inputRate; public final long outputRate; public final Vec3i pos; public final String name; public long energy = 0; public final Set providers = ConcurrentHashMap.newKeySet(); public final Set receivers = ConcurrentHashMap.newKeySet(); public SimpleCodeOnlyCable(Vec3i pos, long capacity, long inputRate, long outputRate, String name) { this.capacity = capacity; this.inputRate = inputRate; this.outputRate = outputRate; this.name = name; this.pos = pos; } public static void tick(SimpleCodeOnlyCable cable) { System.out.println(cable.name + " ticking"); var leftToFill = Math.min(cable.inputRate, cable.capacity - cable.energy); for (EnergyProvider provider : cable.providers) { // Less than zero shouldn't be possible, but just in case... if (leftToFill <= 0) { break; } long extracted = provider.extract(leftToFill, cable); cable.energy += extracted; leftToFill -= extracted; } } @Override public long extract(long amount, EnergyReceiver receiver) { System.out.println(name + " extracting " + amount + " energy"); long extracted = Math.min(Math.min(outputRate, amount), energy); energy -= extracted; System.out.println(name + " extracted " + extracted + " energy"); return extracted; } @Override public void ready(EnergyReceiver receiver) { System.out.println(name + " found other receiver"); receivers.add(receiver); receiver.ready(this); } @Override public void unready(EnergyReceiver receiver) { System.out.println(name + " lost other receiver"); receivers.remove(receiver); } @Override public void ready(EnergyProvider provider) { System.out.println(name + " found other provider"); providers.add(provider); } @Override public void unready(EnergyProvider provider) { providers.remove(provider); } @Override public void onLoad(BlockEntity blockEntity, ServerWorld serverWorld) { MatchMaker.matchMaker.Add(this); reload(); } @Override public void onUnload(BlockEntity blockEntity, ServerWorld serverWorld) { MatchMaker.matchMaker.Remove(this); for (EnergyReceiver receiver : receivers) { receiver.unready(this); } for (EnergyProvider provider : providers) { provider.unready(this); } providers.clear(); receivers.clear(); } @Override public Collection points() { return List.of(pos); } @Override public String dimension() { return ""; } public void reload() { var found = MatchMaker.matchMaker.Search(this); if (found != null) { for (var foundEnergyBlocks : found) { if (foundEnergyBlocks instanceof EnergyProvider && !providers.contains(foundEnergyBlocks)) { ((EnergyProvider) foundEnergyBlocks).ready(this); } if (foundEnergyBlocks instanceof EnergyReceiver && !receivers.contains(foundEnergyBlocks)) { ((EnergyReceiver) foundEnergyBlocks).ready(this); } } } } }