123 lines
4.0 KiB
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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|