More wheels to reinvent! Yayy!
This commit is contained in:
parent
c2ee6331c5
commit
d7d093db20
|
@ -36,6 +36,9 @@ dependencies {
|
|||
|
||||
// Fabric API. This is technically optional, but you probably want it anyway.
|
||||
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
|
||||
|
||||
// Located
|
||||
implementation "arzumify:located:1.0.0"
|
||||
}
|
||||
|
||||
processResources {
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
package arzumify.cursedenergy.api;
|
||||
|
||||
public interface EnergyBlock {
|
||||
import arzumify.located.api.Provider;
|
||||
|
||||
public interface EnergyBlock extends Provider {
|
||||
}
|
||||
|
|
|
@ -1,30 +1,7 @@
|
|||
package arzumify.cursedenergy.api;
|
||||
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Vec3i;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import arzumify.located.impl.MatchMaker;
|
||||
|
||||
public class SearchForNeighbours {
|
||||
private static final Vec3i[] directions = new Vec3i[]{
|
||||
new Vec3i(1, 0, 0),
|
||||
new Vec3i(-1, 0, 0),
|
||||
new Vec3i(0, 1, 0),
|
||||
new Vec3i(0, -1, 0),
|
||||
new Vec3i(0, 0, 1),
|
||||
new Vec3i(0, 0, -1)
|
||||
};
|
||||
|
||||
public static Set<EnergyBlock> searchForNeighbours(World world, BlockPos pos) {
|
||||
var neighbours = new HashSet<EnergyBlock>();
|
||||
for (var direction : directions) {
|
||||
var entity = world.getBlockEntity(pos.add(direction));
|
||||
if (entity instanceof EnergyBlock) {
|
||||
neighbours.add((EnergyBlock) entity);
|
||||
}
|
||||
}
|
||||
return neighbours;
|
||||
}
|
||||
public static MatchMaker<EnergyBlock> matchMaker = new MatchMaker<>();
|
||||
}
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
/*
|
||||
TESTS ARE BROKEN IN CURSED EDITION
|
||||
DO NOT TRY TO TEST
|
||||
*/
|
|
@ -1,118 +0,0 @@
|
|||
import arzumify.cursedenergy.api.EnergyProvider;
|
||||
import arzumify.cursedenergy.api.EnergyReceiver;
|
||||
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerBlockEntityEvents;
|
||||
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
|
||||
import net.minecraft.block.entity.BlockEntity;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.server.world.ServerWorld;
|
||||
import net.minecraft.util.math.Vec3i;
|
||||
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import static arzumify.cursedenergy.api.SearchForNeighbours.searchForNeighbours;
|
||||
|
||||
/**
|
||||
* SimpleCable, but implemented using only the API and not the actual block entity for testing purposes.
|
||||
* All fields are public for testing purposes.
|
||||
*/
|
||||
public class SimpleCodeOnlyCable implements EnergyProvider, EnergyReceiver, ServerBlockEntityEvents.Unload, ServerBlockEntityEvents.Load, ServerTickEvents.EndTick {
|
||||
public final long capacity;
|
||||
public final long inputRate;
|
||||
public final long outputRate;
|
||||
public final String name;
|
||||
public final Set<EnergyProvider> providers = ConcurrentHashMap.newKeySet();
|
||||
public final Set<EnergyProvider> blackListed = ConcurrentHashMap.newKeySet();
|
||||
public final Set<EnergyReceiver> receivers = ConcurrentHashMap.newKeySet();
|
||||
public long energy = 0;
|
||||
|
||||
public SimpleCodeOnlyCable(Vec3i pos, long capacity, long inputRate, long outputRate, String name) {
|
||||
this.capacity = capacity;
|
||||
this.inputRate = inputRate;
|
||||
this.outputRate = outputRate;
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public static void tick(SimpleCodeOnlyCable Cable) {
|
||||
System.out.println(Cable.name + " ticking");
|
||||
// Split the energy between all receivers
|
||||
var energyToGive = Cable.energy / Cable.receivers.size();
|
||||
|
||||
for (EnergyReceiver receiver : Cable.receivers) {
|
||||
var taken = receiver.receive(energyToGive, Cable);
|
||||
Cable.energy -= taken;
|
||||
if (receiver instanceof EnergyProvider) {
|
||||
Cable.blackListed.add((EnergyProvider) receiver);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public long receive(long amount, EnergyProvider provider) {
|
||||
if (!blackListed.contains(provider)) {
|
||||
System.out.println(name + " receiving " + amount + " energy");
|
||||
long received = Math.min(Math.min(inputRate, amount), capacity - energy);
|
||||
energy += received;
|
||||
System.out.println(name + " received " + received + " energy");
|
||||
blackListed.add(provider);
|
||||
return received;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void ready(EnergyReceiver receiver) {
|
||||
System.out.println(name + " found other receiver");
|
||||
receivers.add(receiver);
|
||||
receiver.ready(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void ready(EnergyProvider provider) {
|
||||
System.out.println(name + " found other provider");
|
||||
providers.add(provider);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unready(EnergyReceiver receiver) {
|
||||
System.out.println(name + " lost other receiver");
|
||||
receivers.remove(receiver);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unready(EnergyProvider provider) {
|
||||
System.out.println(name + " lost other provider");
|
||||
providers.remove(provider);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLoad(BlockEntity blockEntity, ServerWorld serverWorld) {
|
||||
var energyBlocks = searchForNeighbours(serverWorld, blockEntity.getPos());
|
||||
for (var block : energyBlocks) {
|
||||
if (block instanceof EnergyProvider) {
|
||||
((EnergyProvider) block).ready(this);
|
||||
}
|
||||
if (block instanceof EnergyReceiver) {
|
||||
ready((EnergyReceiver) block);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUnload(BlockEntity blockEntity, ServerWorld serverWorld) {
|
||||
for (var provider : providers) {
|
||||
provider.unready(this);
|
||||
}
|
||||
providers.clear();
|
||||
for (var receiver : receivers) {
|
||||
receiver.unready(this);
|
||||
}
|
||||
receivers.clear();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEndTick(MinecraftServer server) {
|
||||
blackListed.clear();
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue