From 4cf3962246c11616d9b0b3f93f0c8a4d17c77d5b Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Wed, 14 Aug 2024 11:25:13 +0200 Subject: [PATCH] refactor: constructor and destructor has its own network node --- .../ConstructorBlockEntity.java | 59 +++------------ .../ConstructorNetworkNode.java | 73 +++++++++++++++++++ .../DestructorBlockEntity.java | 44 ++++------- .../DestructorNetworkNode.java | 57 +++++++++++++++ .../common/importer/ImporterBlockEntity.java | 2 +- .../support/PlayerAwareBlockEntity.java | 1 + .../BaseNetworkNodeContainerBlockEntity.java | 6 +- 7 files changed, 156 insertions(+), 86 deletions(-) create mode 100644 refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/constructordestructor/ConstructorNetworkNode.java create mode 100644 refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/constructordestructor/DestructorNetworkNode.java diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/constructordestructor/ConstructorBlockEntity.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/constructordestructor/ConstructorBlockEntity.java index 6d528d714..212e8a2c3 100644 --- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/constructordestructor/ConstructorBlockEntity.java +++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/constructordestructor/ConstructorBlockEntity.java @@ -1,11 +1,5 @@ package com.refinedmods.refinedstorage.common.constructordestructor; -import com.refinedmods.refinedstorage.api.network.Network; -import com.refinedmods.refinedstorage.api.network.impl.node.SimpleNetworkNode; -import com.refinedmods.refinedstorage.api.network.node.NetworkNodeActor; -import com.refinedmods.refinedstorage.api.network.node.SchedulingMode; -import com.refinedmods.refinedstorage.api.resource.ResourceKey; -import com.refinedmods.refinedstorage.api.storage.Actor; import com.refinedmods.refinedstorage.common.Platform; import com.refinedmods.refinedstorage.common.api.RefinedStorageApi; import com.refinedmods.refinedstorage.common.api.constructordestructor.ConstructorStrategy; @@ -25,7 +19,6 @@ import com.refinedmods.refinedstorage.common.upgrade.UpgradeDestinations; import com.refinedmods.refinedstorage.common.util.ContainerUtil; -import java.util.ArrayList; import java.util.Collection; import java.util.List; import javax.annotation.Nullable; @@ -46,19 +39,15 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.state.BlockState; -public class ConstructorBlockEntity extends BaseNetworkNodeContainerBlockEntity +public class ConstructorBlockEntity extends BaseNetworkNodeContainerBlockEntity implements BlockEntityWithDrops, NetworkNodeExtendedMenuProvider { private static final String TAG_DROP_ITEMS = "di"; private static final String TAG_UPGRADES = "upgr"; - private final Actor actor; - private final List tasks = new ArrayList<>(); private final UpgradeContainer upgradeContainer; private final FilterWithFuzzyMode filter; private final SchedulingModeContainer schedulingModeContainer; - @Nullable - private ConstructorStrategy strategy; private boolean dropItems; public ConstructorBlockEntity(final BlockPos pos, final BlockState state) { @@ -66,9 +55,8 @@ public ConstructorBlockEntity(final BlockPos pos, final BlockState state) { BlockEntities.INSTANCE.getConstructor(), pos, state, - new SimpleNetworkNode(Platform.INSTANCE.getConfig().getConstructor().getEnergyUsage()) + new ConstructorNetworkNode(Platform.INSTANCE.getConfig().getConstructor().getEnergyUsage()) ); - this.actor = new NetworkNodeActor(mainNetworkNode); this.upgradeContainer = new UpgradeContainer(UpgradeDestinations.CONSTRUCTOR, (rate, upgradeEnergyUsage) -> { setWorkTickRate(rate); final long baseEnergyUsage = Platform.INSTANCE.getConfig().getConstructor().getEnergyUsage(); @@ -78,11 +66,14 @@ public ConstructorBlockEntity(final BlockPos pos, final BlockState state) { initialize(serverLevel); } }); - this.schedulingModeContainer = new SchedulingModeContainer(schedulingMode -> setChanged()); + this.schedulingModeContainer = new SchedulingModeContainer(schedulingMode -> { + mainNetworkNode.setSchedulingMode(schedulingMode); + setChanged(); + }); this.filter = FilterWithFuzzyMode.createAndListenForFilters( ResourceContainerImpl.createForFilter(), this::setChanged, - this::setFilters + mainNetworkNode::setFilters ); } @@ -101,15 +92,11 @@ public boolean addUpgradeItem(final Item upgradeItem) { return upgradeContainer.addUpgradeItem(upgradeItem); } - private void setFilters(final List filters) { - this.tasks.clear(); - this.tasks.addAll(filters.stream().map(ConstructorTask::new).toList()); - } - @Override protected void initialize(final ServerLevel level, final Direction direction) { super.initialize(level, direction); - this.strategy = createStrategy(level, direction); + mainNetworkNode.setPlayer(getFakePlayer(level)); + mainNetworkNode.setStrategy(createStrategy(level, direction)); } private ConstructorStrategy createStrategy(final ServerLevel serverLevel, final Direction direction) { @@ -130,15 +117,6 @@ private ConstructorStrategy createStrategy(final ServerLevel serverLevel, final return new CompositeConstructorStrategy(strategies); } - // TODO: Move to own obj :) - @Override - public void postDoWork() { - if (mainNetworkNode.getNetwork() == null || !mainNetworkNode.isActive()) { - return; - } - schedulingModeContainer.execute(tasks); - } - @Override public void saveAdditional(final CompoundTag tag, final HolderLookup.Provider provider) { super.saveAdditional(tag, provider); @@ -233,23 +211,4 @@ protected boolean doesBlockStateChangeWarrantNetworkNodeUpdate(final BlockState final BlockState newBlockState) { return AbstractDirectionalBlock.didDirectionChange(oldBlockState, newBlockState); } - - private class ConstructorTask implements SchedulingMode.ScheduledTask { - private final ResourceKey filter; - - private ConstructorTask(final ResourceKey filter) { - this.filter = filter; - } - - @Override - public boolean run() { - final Network network = mainNetworkNode.getNetwork(); - if (strategy == null || !(level instanceof ServerLevel serverLevel) || network == null) { - return false; - } - final Player player = getFakePlayer(serverLevel); - strategy.apply(filter, actor, player, network); - return true; - } - } } diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/constructordestructor/ConstructorNetworkNode.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/constructordestructor/ConstructorNetworkNode.java new file mode 100644 index 000000000..f1e758cc0 --- /dev/null +++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/constructordestructor/ConstructorNetworkNode.java @@ -0,0 +1,73 @@ +package com.refinedmods.refinedstorage.common.constructordestructor; + +import com.refinedmods.refinedstorage.api.network.impl.node.SimpleNetworkNode; +import com.refinedmods.refinedstorage.api.network.node.NetworkNodeActor; +import com.refinedmods.refinedstorage.api.network.node.SchedulingMode; +import com.refinedmods.refinedstorage.api.resource.ResourceKey; +import com.refinedmods.refinedstorage.api.storage.Actor; +import com.refinedmods.refinedstorage.common.api.constructordestructor.ConstructorStrategy; + +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Nullable; + +import net.minecraft.world.entity.player.Player; + +public class ConstructorNetworkNode extends SimpleNetworkNode { + private final Actor actor = new NetworkNodeActor(this); + private final List tasks = new ArrayList<>(); + + @Nullable + private Player player; + @Nullable + private ConstructorStrategy strategy; + @Nullable + private SchedulingMode schedulingMode; + + ConstructorNetworkNode(final long energyUsage) { + super(energyUsage); + } + + @Override + public void doWork() { + super.doWork(); + if (network == null || !isActive() || schedulingMode == null) { + return; + } + schedulingMode.execute(tasks); + } + + void setPlayer(@Nullable final Player player) { + this.player = player; + } + + void setSchedulingMode(@Nullable final SchedulingMode schedulingMode) { + this.schedulingMode = schedulingMode; + } + + void setFilters(final List filters) { + this.tasks.clear(); + this.tasks.addAll(filters.stream().map(ConstructorTask::new).toList()); + } + + void setStrategy(@Nullable final ConstructorStrategy strategy) { + this.strategy = strategy; + } + + private class ConstructorTask implements SchedulingMode.ScheduledTask { + private final ResourceKey filter; + + private ConstructorTask(final ResourceKey filter) { + this.filter = filter; + } + + @Override + public boolean run() { + if (strategy == null || network == null || player == null) { + return false; + } + strategy.apply(filter, actor, player, network); + return true; + } + } +} diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/constructordestructor/DestructorBlockEntity.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/constructordestructor/DestructorBlockEntity.java index 4e9ab4685..2557517ff 100644 --- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/constructordestructor/DestructorBlockEntity.java +++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/constructordestructor/DestructorBlockEntity.java @@ -1,11 +1,7 @@ package com.refinedmods.refinedstorage.common.constructordestructor; -import com.refinedmods.refinedstorage.api.network.impl.node.SimpleNetworkNode; -import com.refinedmods.refinedstorage.api.network.node.NetworkNodeActor; import com.refinedmods.refinedstorage.api.resource.ResourceKey; -import com.refinedmods.refinedstorage.api.resource.filter.Filter; import com.refinedmods.refinedstorage.api.resource.filter.FilterMode; -import com.refinedmods.refinedstorage.api.storage.Actor; import com.refinedmods.refinedstorage.common.Platform; import com.refinedmods.refinedstorage.common.api.RefinedStorageApi; import com.refinedmods.refinedstorage.common.api.constructordestructor.DestructorStrategy; @@ -43,20 +39,15 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.state.BlockState; -public class DestructorBlockEntity - extends BaseNetworkNodeContainerBlockEntity +public class DestructorBlockEntity extends BaseNetworkNodeContainerBlockEntity implements NetworkNodeExtendedMenuProvider, BlockEntityWithDrops { private static final String TAG_FILTER_MODE = "fim"; private static final String TAG_PICKUP_ITEMS = "pi"; private static final String TAG_UPGRADES = "upgr"; private final FilterWithFuzzyMode filterWithFuzzyMode; - private final Filter filter = new Filter(); - private final Actor actor; private final UpgradeContainer upgradeContainer; - @Nullable - private DestructorStrategy strategy; private boolean pickupItems; public DestructorBlockEntity(final BlockPos pos, final BlockState state) { @@ -64,9 +55,8 @@ public DestructorBlockEntity(final BlockPos pos, final BlockState state) { BlockEntities.INSTANCE.getDestructor(), pos, state, - new SimpleNetworkNode(Platform.INSTANCE.getConfig().getDestructor().getEnergyUsage()) + new DestructorNetworkNode(Platform.INSTANCE.getConfig().getDestructor().getEnergyUsage()) ); - this.actor = new NetworkNodeActor(mainNetworkNode); this.filterWithFuzzyMode = FilterWithFuzzyMode.createAndListenForUniqueFilters( ResourceContainerImpl.createForFilter(), this::setChanged, @@ -111,15 +101,15 @@ public void setPickupItems(final boolean pickupItems) { } void setFilters(final Set filters) { - filter.setFilters(filters); + mainNetworkNode.setFilters(filters); } public FilterMode getFilterMode() { - return filter.getMode(); + return mainNetworkNode.getFilterMode(); } public void setFilterMode(final FilterMode mode) { - filter.setMode(mode); + mainNetworkNode.setFilterMode(mode); setChanged(); } @@ -145,7 +135,7 @@ public final NonNullList getDrops() { @Override public void writeConfiguration(final CompoundTag tag, final HolderLookup.Provider provider) { super.writeConfiguration(tag, provider); - tag.putInt(TAG_FILTER_MODE, FilterModeSettings.getFilterMode(filter.getMode())); + tag.putInt(TAG_FILTER_MODE, FilterModeSettings.getFilterMode(mainNetworkNode.getFilterMode())); tag.putBoolean(TAG_PICKUP_ITEMS, pickupItems); filterWithFuzzyMode.save(tag, provider); } @@ -155,7 +145,7 @@ public void readConfiguration(final CompoundTag tag, final HolderLookup.Provider super.readConfiguration(tag, provider); filterWithFuzzyMode.load(tag, provider); if (tag.contains(TAG_FILTER_MODE)) { - filter.setMode(FilterModeSettings.getFilterMode(tag.getInt(TAG_FILTER_MODE))); + mainNetworkNode.setFilterMode(FilterModeSettings.getFilterMode(tag.getInt(TAG_FILTER_MODE))); } if (tag.contains(TAG_PICKUP_ITEMS)) { pickupItems = tag.getBoolean(TAG_PICKUP_ITEMS); @@ -192,25 +182,19 @@ public AbstractContainerMenu createMenu(final int syncId, final Inventory invent @Override protected void initialize(final ServerLevel level, final Direction direction) { super.initialize(level, direction); + mainNetworkNode.setPlayer(getFakePlayer(level)); + mainNetworkNode.setStrategy(createStrategy(level, direction)); + } + + private CompositeDestructorStrategy createStrategy(final ServerLevel level, + final Direction direction) { final BlockPos pos = getBlockPos().relative(direction); final Direction incomingDirection = direction.getOpposite(); final List strategies = RefinedStorageApi.INSTANCE.getDestructorStrategyFactories() .stream() .flatMap(factory -> factory.create(level, pos, incomingDirection, upgradeContainer, pickupItems).stream()) .toList(); - this.strategy = new CompositeDestructorStrategy(strategies); - } - - @Override - public void postDoWork() { - if (strategy == null - || mainNetworkNode.getNetwork() == null - || !mainNetworkNode.isActive() - || !(level instanceof ServerLevel serverLevel)) { - return; - } - final Player fakePlayer = getFakePlayer(serverLevel); - strategy.apply(filter, actor, mainNetworkNode::getNetwork, fakePlayer); + return new CompositeDestructorStrategy(strategies); } @Override diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/constructordestructor/DestructorNetworkNode.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/constructordestructor/DestructorNetworkNode.java new file mode 100644 index 000000000..7a1ff2ba3 --- /dev/null +++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/constructordestructor/DestructorNetworkNode.java @@ -0,0 +1,57 @@ +package com.refinedmods.refinedstorage.common.constructordestructor; + +import com.refinedmods.refinedstorage.api.network.impl.node.SimpleNetworkNode; +import com.refinedmods.refinedstorage.api.network.node.NetworkNodeActor; +import com.refinedmods.refinedstorage.api.resource.ResourceKey; +import com.refinedmods.refinedstorage.api.resource.filter.Filter; +import com.refinedmods.refinedstorage.api.resource.filter.FilterMode; +import com.refinedmods.refinedstorage.api.storage.Actor; +import com.refinedmods.refinedstorage.common.api.constructordestructor.DestructorStrategy; + +import java.util.Set; +import javax.annotation.Nullable; + +import net.minecraft.world.entity.player.Player; + +public class DestructorNetworkNode extends SimpleNetworkNode { + private final Actor actor = new NetworkNodeActor(this); + private final Filter filter = new Filter(); + + @Nullable + private DestructorStrategy strategy; + @Nullable + private Player player; + + DestructorNetworkNode(final long energyUsage) { + super(energyUsage); + } + + void setStrategy(@Nullable final DestructorStrategy strategy) { + this.strategy = strategy; + } + + void setPlayer(@Nullable final Player player) { + this.player = player; + } + + FilterMode getFilterMode() { + return filter.getMode(); + } + + void setFilterMode(final FilterMode mode) { + filter.setMode(mode); + } + + void setFilters(final Set filters) { + filter.setFilters(filters); + } + + @Override + public void doWork() { + super.doWork(); + if (strategy == null || network == null || !isActive() || player == null) { + return; + } + strategy.apply(filter, actor, this::getNetwork, player); + } +} diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/importer/ImporterBlockEntity.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/importer/ImporterBlockEntity.java index 1f826890d..64423fd2b 100644 --- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/importer/ImporterBlockEntity.java +++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/importer/ImporterBlockEntity.java @@ -61,7 +61,7 @@ public ImporterBlockEntity(final BlockPos pos, final BlockState state) { BlockEntities.INSTANCE.getImporter(), pos, state, - new ImporterNetworkNode(0) + new ImporterNetworkNode(Platform.INSTANCE.getConfig().getImporter().getEnergyUsage()) ); this.filter = FilterWithFuzzyMode.createAndListenForUniqueFilters( ResourceContainerImpl.createForFilter(), diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/support/PlayerAwareBlockEntity.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/support/PlayerAwareBlockEntity.java index ab42f832e..487262900 100644 --- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/support/PlayerAwareBlockEntity.java +++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/support/PlayerAwareBlockEntity.java @@ -2,6 +2,7 @@ import java.util.UUID; +@FunctionalInterface public interface PlayerAwareBlockEntity { void setPlacedBy(UUID playerId); } diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/support/network/BaseNetworkNodeContainerBlockEntity.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/support/network/BaseNetworkNodeContainerBlockEntity.java index 4fadedee6..802432573 100644 --- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/support/network/BaseNetworkNodeContainerBlockEntity.java +++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/support/network/BaseNetworkNodeContainerBlockEntity.java @@ -138,13 +138,9 @@ protected final void setWorkTickRate(final int workTickRate) { public void doWork() { if (workTickRate == 0 || (workTicks++ % workTickRate == 0)) { mainNetworkNode.doWork(); - postDoWork(); } } - protected void postDoWork() { - } - protected boolean doesBlockStateChangeWarrantNetworkNodeUpdate( final BlockState oldBlockState, final BlockState newBlockState @@ -204,7 +200,7 @@ public void saveAdditional(final CompoundTag tag, final HolderLookup.Provider pr public void loadAdditional(final CompoundTag tag, final HolderLookup.Provider provider) { super.loadAdditional(tag, provider); if (tag.hasUUID(TAG_PLACED_BY_PLAYER_ID)) { - placedByPlayerId = tag.getUUID(TAG_PLACED_BY_PLAYER_ID); + setPlacedBy(tag.getUUID(TAG_PLACED_BY_PLAYER_ID)); } readConfiguration(tag, provider); }