polyenergy/src/test/java/SimpleCodeOnlyCable.java

123 lines
4.0 KiB
Java

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<EnergyProvider> providers = ConcurrentHashMap.newKeySet();
public final Set<EnergyReceiver> 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<Vec3i> 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);
}
}
}
}
}