diff --git a/src/main/java/com/thebrokenrail/energonrelics/block/entity/SolarPanelBlockEntity.java b/src/main/java/com/thebrokenrail/energonrelics/block/entity/SolarPanelBlockEntity.java index c534802..21aab94 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/block/entity/SolarPanelBlockEntity.java +++ b/src/main/java/com/thebrokenrail/energonrelics/block/entity/SolarPanelBlockEntity.java @@ -38,7 +38,7 @@ public class SolarPanelBlockEntity extends EnergyGeneratorBlockEntity { @Override protected void serverTick() { - setEnergy(getDisplayEnergy()); super.serverTick(); + setEnergy(getDisplayEnergy()); } } diff --git a/src/main/java/com/thebrokenrail/energonrelics/block/entity/battery/PassiveBatteryControllerBlockEntity.java b/src/main/java/com/thebrokenrail/energonrelics/block/entity/battery/PassiveBatteryControllerBlockEntity.java index ba1da2f..7d92af5 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/block/entity/battery/PassiveBatteryControllerBlockEntity.java +++ b/src/main/java/com/thebrokenrail/energonrelics/block/entity/battery/PassiveBatteryControllerBlockEntity.java @@ -97,6 +97,7 @@ public class PassiveBatteryControllerBlockEntity extends EnergyReceiverBlockEnti @Override protected void handlePropagatedAction(Action.PropagatedAction action) { + super.handlePropagatedAction(action); handlePropagatedActionWithGenerator(action); } diff --git a/src/main/java/com/thebrokenrail/energonrelics/block/entity/reactor/ReactorControllerBlockEntity.java b/src/main/java/com/thebrokenrail/energonrelics/block/entity/reactor/ReactorControllerBlockEntity.java index f5efde6..bcceab8 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/block/entity/reactor/ReactorControllerBlockEntity.java +++ b/src/main/java/com/thebrokenrail/energonrelics/block/entity/reactor/ReactorControllerBlockEntity.java @@ -33,6 +33,7 @@ public class ReactorControllerBlockEntity extends EnergyGeneratorBlockEntity { @Override protected void serverTick() { + super.serverTick(); if (getCachedState().get(ReactorControllerBlock.POWERED)) { Reactor reactor = getReactor(); if (reactor != null && !reactor.core.isReacting()) { @@ -62,7 +63,6 @@ public class ReactorControllerBlockEntity extends EnergyGeneratorBlockEntity { } } setEnergy(getDisplayEnergy()); - super.serverTick(); } @Override diff --git a/src/main/java/com/thebrokenrail/energonrelics/energy/core/EnergyProviderBlockEntity.java b/src/main/java/com/thebrokenrail/energonrelics/energy/core/EnergyProviderBlockEntity.java index 1127871..c017cac 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/energy/core/EnergyProviderBlockEntity.java +++ b/src/main/java/com/thebrokenrail/energonrelics/energy/core/EnergyProviderBlockEntity.java @@ -36,6 +36,12 @@ public class EnergyProviderBlockEntity extends BlockEntity implements EnergyProv scheduledTicks.clear(); } + private void schedule() { + if (!scheduledTicks.contains(this)) { + scheduledTicks.add(this); + } + } + public EnergyProviderBlockEntity(BlockEntityType type) { super(type); } @@ -95,7 +101,11 @@ public class EnergyProviderBlockEntity extends BlockEntity implements EnergyProv private final List completedActions = new ArrayList<>(); protected void handlePropagatedAction(Action.PropagatedAction action) { - throw new UnsupportedOperationException(); + if (!isEnergyProvider()) { + throw new UnsupportedOperationException(); + } else { + schedule(); + } } private void tickPropagatedActions() { @@ -116,7 +126,7 @@ public class EnergyProviderBlockEntity extends BlockEntity implements EnergyProv @Override public final void tick() { if (hasWorld() && !Objects.requireNonNull(getWorld()).isClient()) { - scheduledTicks.add(this); + schedule(); } } diff --git a/src/main/java/com/thebrokenrail/energonrelics/energy/core/EnergyReceiverBlockEntity.java b/src/main/java/com/thebrokenrail/energonrelics/energy/core/EnergyReceiverBlockEntity.java index 1921459..52645e4 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/energy/core/EnergyReceiverBlockEntity.java +++ b/src/main/java/com/thebrokenrail/energonrelics/energy/core/EnergyReceiverBlockEntity.java @@ -10,43 +10,18 @@ import net.minecraft.nbt.IntArrayTag; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.Tickable; import net.minecraft.util.math.Vec3d; -import net.minecraft.util.registry.RegistryKey; -import net.minecraft.world.World; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Objects; public abstract class EnergyReceiverBlockEntity extends EnergyProviderBlockEntity implements Tickable { - private class SelfProvider implements EnergyProvider { - @Override - public void addPropagatedAction(Action.PropagatedAction action) { - action.pay(0); - } - - @Override - public boolean isNetwork(int network) { - return true; - } - - @Override - public boolean isWithinDistance(Vec3d pos) { - return true; - } - - @Override - public RegistryKey getRegistryKey() { - return Objects.requireNonNull(getWorld()).getRegistryKey(); - } - } - public EnergyReceiverBlockEntity(BlockEntityType type) { super(type); } + private final List pendingPropagatedActions = new ArrayList<>(); private final List pendingActions = new ArrayList<>(); - private final EnergyProvider selfProvider = new SelfProvider(); private final List providers = new ArrayList<>(); private final List networks = new ArrayList<>(); @@ -63,36 +38,42 @@ public abstract class EnergyReceiverBlockEntity extends EnergyProviderBlockEntit @Override public void serverTick() { - if (hasWorld() && !Objects.requireNonNull(getWorld()).isClient()) { - ServerWorld world = (ServerWorld) getWorld(); - NetworkComponent component = NetworkComponent.getInstance(world); + super.serverTick(); - providers.clear(); - // At Least One Energy Provider Is Always Required - providers.add(selfProvider); - for (int network : networks) { - List potentialProviders = component.getSource(world, network); - for (EnergyProvider provider : potentialProviders) { - if (provider.getRegistryKey().equals(getWorld().getRegistryKey())) { - Vec3d pos = new Vec3d(getPos().getX() + 0.5d, getPos().getY() + 0.5d, getPos().getZ() + 0.5d); - if (provider.isWithinDistance(pos)) { - providers.add(provider); - } + ServerWorld world = (ServerWorld) getWorld(); + assert world != null; + NetworkComponent component = NetworkComponent.getInstance(world); + + providers.clear(); + for (int network : networks) { + List potentialProviders = component.getSource(world, network); + for (EnergyProvider provider : potentialProviders) { + if (provider.getRegistryKey().equals(getWorld().getRegistryKey())) { + Vec3d pos = new Vec3d(getPos().getX() + 0.5d, getPos().getY() + 0.5d, getPos().getZ() + 0.5d); + if (provider.isWithinDistance(pos)) { + providers.add(provider); } } } + } - totalCost = 0; - pendingActions.clear(); - tickEnergy(); + totalCost = 0; + pendingActions.clear(); + tickEnergy(); - super.serverTick(); + for (Action.PropagatedAction action : pendingPropagatedActions) { + propagateAction(action); + } + pendingPropagatedActions.clear(); - for (Action.PropagatedAction action : pendingActions) { + for (Action.PropagatedAction action : pendingActions) { + if (providers.size() > 0) { action.expandPayments(providers.size()); for (EnergyProvider provider : providers) { provider.addPropagatedAction(action); } + } else { + action.pay(0); } } } @@ -103,9 +84,10 @@ public abstract class EnergyReceiverBlockEntity extends EnergyProviderBlockEntit @Override protected void handlePropagatedAction(Action.PropagatedAction action) { + super.handlePropagatedAction(action); // Propagate Action To Energy Providers if (isEnergyProviderActive()) { - propagateAction(action); + pendingPropagatedActions.add(action); } else { action.pay(0); } diff --git a/src/main/java/com/thebrokenrail/energonrelics/energy/helper/EnergyGeneratorBlockEntity.java b/src/main/java/com/thebrokenrail/energonrelics/energy/helper/EnergyGeneratorBlockEntity.java index e778fd3..476ea56 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/energy/helper/EnergyGeneratorBlockEntity.java +++ b/src/main/java/com/thebrokenrail/energonrelics/energy/helper/EnergyGeneratorBlockEntity.java @@ -28,6 +28,7 @@ public abstract class EnergyGeneratorBlockEntity extends EnergyProviderBlockEnti @Override protected void handlePropagatedAction(Action.PropagatedAction action) { + super.handlePropagatedAction(action); handlePropagatedActionWithGenerator(action); }