Skip to content

Commit

Permalink
refactor: constructor and destructor has its own network node
Browse files Browse the repository at this point in the history
  • Loading branch information
raoulvdberge committed Aug 14, 2024
1 parent 366a7bb commit 4cf3962
Show file tree
Hide file tree
Showing 7 changed files with 156 additions and 86 deletions.
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;
Expand All @@ -46,29 +39,24 @@
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.state.BlockState;

public class ConstructorBlockEntity extends BaseNetworkNodeContainerBlockEntity<SimpleNetworkNode>
public class ConstructorBlockEntity extends BaseNetworkNodeContainerBlockEntity<ConstructorNetworkNode>
implements BlockEntityWithDrops, NetworkNodeExtendedMenuProvider<ResourceContainerData> {
private static final String TAG_DROP_ITEMS = "di";
private static final String TAG_UPGRADES = "upgr";

private final Actor actor;
private final List<ConstructorTask> 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) {
super(
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();
Expand All @@ -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
);
}

Expand All @@ -101,15 +92,11 @@ public boolean addUpgradeItem(final Item upgradeItem) {
return upgradeContainer.addUpgradeItem(upgradeItem);
}

private void setFilters(final List<ResourceKey> 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) {
Expand All @@ -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);
Expand Down Expand Up @@ -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;
}
}
}
Original file line number Diff line number Diff line change
@@ -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<ConstructorTask> 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<ResourceKey> 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;
}
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -43,30 +39,24 @@
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.state.BlockState;

public class DestructorBlockEntity
extends BaseNetworkNodeContainerBlockEntity<SimpleNetworkNode>
public class DestructorBlockEntity extends BaseNetworkNodeContainerBlockEntity<DestructorNetworkNode>
implements NetworkNodeExtendedMenuProvider<ResourceContainerData>, 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) {
super(
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,
Expand Down Expand Up @@ -111,15 +101,15 @@ public void setPickupItems(final boolean pickupItems) {
}

void setFilters(final Set<ResourceKey> 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();
}

Expand All @@ -145,7 +135,7 @@ public final NonNullList<ItemStack> 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);
}
Expand All @@ -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);
Expand Down Expand Up @@ -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<DestructorStrategy> 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
Expand Down
Original file line number Diff line number Diff line change
@@ -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<ResourceKey> 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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import java.util.UUID;

@FunctionalInterface
public interface PlayerAwareBlockEntity {
void setPlacedBy(UUID playerId);
}
Loading

0 comments on commit 4cf3962

Please sign in to comment.