Skip to content

Commit 5b950a2

Browse files
authored
Rework targeted modules (#258)
* Rework targeted modules * Add some game tests * Fix a couple of bugs discovered by game tests 😛
1 parent e1e160f commit 5b950a2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+1120
-640
lines changed

.github/workflows/main.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name: "Build applicable branches on push or pull request"
1+
name: "Build applicable branches on push"
22

33
# Controls when the action will run. Triggers the workflow on push or pull request
44
# events for the branches listed
@@ -53,4 +53,4 @@ jobs:
5353
if:
5454
env.DISCORD_WEBHOOK != null
5555
with:
56-
args: 'Build complete for project {{ EVENT_PAYLOAD.repository.full_name }} (Minecraft ${{ steps.mod_meta.outputs.mc_version}}): ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}.'
56+
args: 'Build complete for project {{ EVENT_PAYLOAD.repository.full_name }} (Minecraft ${{ steps.mod_meta.outputs.mc_version}}): ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}.'

.github/workflows/prs.yml

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
name: Build PRs
2+
3+
on: [push, pull_request]
4+
5+
jobs:
6+
build:
7+
runs-on: ubuntu-latest
8+
steps:
9+
- name: Checkout repository
10+
uses: actions/checkout@v4
11+
with:
12+
fetch-depth: 0
13+
fetch-tags: true
14+
15+
- name: Setup JDK 21
16+
uses: actions/setup-java@v4
17+
with:
18+
java-version: '21'
19+
distribution: 'temurin'
20+
21+
- name: Setup Gradle
22+
uses: gradle/actions/setup-gradle@v4
23+
24+
- name: Build with Gradle
25+
run: ./gradlew build
26+
27+
- name: Run gametests
28+
run: ./gradlew runGameTestServer

build.gradle

+25
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,14 @@ repositories {
5353
}
5454
}
5555

56+
sourceSets {
57+
test {
58+
runs {
59+
modIdentifier 'modularrouterstest'
60+
}
61+
}
62+
}
63+
5664
group = project.mod_group_id
5765

5866
base {
@@ -62,6 +70,15 @@ base {
6270
java {
6371
toolchain.languageVersion = JavaLanguageVersion.of(21)
6472
withSourcesJar()
73+
74+
registerFeature('testUtils') {
75+
usingSourceSet(sourceSets.test)
76+
withSourcesJar()
77+
}
78+
}
79+
80+
minecraft {
81+
accessTransformers.file(project.file('src/main/resources/META-INF/accesstransformer.cfg'))
6582
}
6683

6784
runs {
@@ -81,10 +98,12 @@ runs {
8198

8299
jvmArguments.addAll '-Xmx4G'
83100

101+
modSource project.sourceSets.test
84102
modSource project.sourceSets.main
85103
}
86104

87105
client {
106+
systemProperty 'neoforge.enableGameTest', 'true'
88107
// Comma-separated list of namespaces to load gametests from. Empty = all namespaces.
89108
systemProperty 'forge.enabledGameTestNamespaces', project.mod_id
90109
}
@@ -112,6 +131,7 @@ sourceSets.main.resources { srcDir 'src/generated/resources' }
112131

113132
dependencies {
114133
implementation "net.neoforged:neoforge:${neo_version}"
134+
localRuntime(testImplementation("net.neoforged:testframework:${neo_version}"))
115135

116136
implementation("mcjty.theoneprobe:theoneprobe:${top_version}") {
117137
transitive = false
@@ -169,6 +189,7 @@ publishing {
169189
}
170190
repositories {
171191
maven {
192+
name 'local'
172193
url "file://${project.projectDir}/repo"
173194
}
174195
if (System.getenv("MODMAVEN_USER") != null) {
@@ -188,6 +209,10 @@ tasks.withType(JavaCompile).configureEach {
188209
options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation
189210
}
190211

212+
test {
213+
enabled = false
214+
}
215+
191216
Closure<ReleaseType> getReleaseType = { type ->
192217
switch(type) {
193218
case "alpha": return ReleaseType.ALPHA

gradle.properties

+3
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,6 @@ jade_curse_id=5639932
3131
jei_version=19.16.4.161
3232
patchouli_version=1.21-87-NEOFORGE
3333
ffs_version=21.0.0
34+
35+
# Prevent NG attempting to make the test sourceset a junit one
36+
neogradle.subsystems.conventions.sourcesets.automatic-inclusion=false

src/main/java/me/desht/modularrouters/api/event/AddModuleTargetEvent.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package me.desht.modularrouters.api.event;
22

3-
import me.desht.modularrouters.item.module.TargetedModule;
3+
import me.desht.modularrouters.item.module.ModuleItem;
44
import net.minecraft.world.item.ItemStack;
55
import net.minecraft.world.item.context.UseOnContext;
66
import net.neoforged.bus.api.Event;
@@ -12,12 +12,12 @@
1212
* This event can be used to allow a module to target blocks it otherwise couldn't in conjunction with {@link ExecuteModuleEvent}.
1313
*/
1414
public final class AddModuleTargetEvent extends Event {
15-
private final TargetedModule item;
15+
private final ModuleItem item;
1616
private final UseOnContext context;
1717
private boolean valid;
1818

1919
@ApiStatus.Internal
20-
public AddModuleTargetEvent(TargetedModule item, UseOnContext context, boolean valid) {
20+
public AddModuleTargetEvent(ModuleItem item, UseOnContext context, boolean valid) {
2121
this.item = item;
2222
this.context = context;
2323
this.valid = valid;
@@ -26,7 +26,7 @@ public AddModuleTargetEvent(TargetedModule item, UseOnContext context, boolean v
2626
/**
2727
* {@return the module type}
2828
*/
29-
public TargetedModule getModuleType() {
29+
public ModuleItem getModuleType() {
3030
return item;
3131
}
3232

src/main/java/me/desht/modularrouters/block/tile/ModularRouterBlockEntity.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -446,7 +446,7 @@ private boolean runAllModules(boolean powered, boolean pulsed) {
446446

447447
for (CompiledIndexedModule cim : compiledModules) {
448448
CompiledModule cm = cim.compiledModule;
449-
if (cm != null && cm.hasTarget() && cm.getEnergyCost() <= getEnergyStorage().getEnergyStored() && cm.shouldRun(powered, pulsed)) {
449+
if (cm != null && cm.shouldExecute() && cm.getEnergyCost() <= getEnergyStorage().getEnergyStored() && cm.checkRedstone(powered, pulsed)) {
450450
var event = cm.getEvent();
451451
if (event != null) {
452452
event.setExecuted(false);

src/main/java/me/desht/modularrouters/client/gui/module/FluidModuleScreen.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import me.desht.modularrouters.container.ModuleMenu;
1111
import me.desht.modularrouters.core.ModBlocks;
1212
import me.desht.modularrouters.core.ModDataComponents;
13-
import me.desht.modularrouters.logic.compiled.CompiledFluidModule1;
13+
import me.desht.modularrouters.logic.compiled.CompiledFluidModule;
1414
import me.desht.modularrouters.logic.settings.TransferDirection;
1515
import net.minecraft.Util;
1616
import net.minecraft.client.gui.GuiGraphics;
@@ -47,7 +47,7 @@ public FluidModuleScreen(ModuleMenu container, Inventory inv, Component displayN
4747
public void init() {
4848
super.init();
4949

50-
CompiledFluidModule1 cfm = new CompiledFluidModule1(null, moduleItemStack);
50+
CompiledFluidModule cfm = new CompiledFluidModule(null, moduleItemStack);
5151

5252
int max = ConfigHolder.common.router.baseTickRate.get() * ConfigHolder.common.router.fluidMaxTransferRate.get();
5353
maxTransferField = new IntegerTextField(font, leftPos + 152, topPos + 23, 34, 12,
@@ -113,7 +113,7 @@ public void containerTick() {
113113
@Override
114114
protected ItemStack buildModifiedItemStack() {
115115
return Util.make(super.buildModifiedItemStack(), stack ->
116-
stack.set(ModDataComponents.FLUID_SETTINGS, new CompiledFluidModule1.FluidModuleSettings(
116+
stack.set(ModDataComponents.FLUID_SETTINGS, new CompiledFluidModule.FluidModuleSettings(
117117
maxTransferField.getIntValue(),
118118
fluidDirButton.getState(),
119119
forceEmptyButton.isToggled(),

src/main/java/me/desht/modularrouters/client/render/area/IPositionProvider.java

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package me.desht.modularrouters.client.render.area;
22

3-
import me.desht.modularrouters.item.module.TargetedModule;
3+
import me.desht.modularrouters.item.module.ITargetedModule;
44
import me.desht.modularrouters.logic.ModuleTarget;
55
import net.minecraft.world.item.ItemStack;
66

@@ -19,8 +19,10 @@ public interface IPositionProvider {
1919
* @return a list of block positions that has been retrieved from the itemstack
2020
*/
2121
default List<ModuleTarget> getStoredPositions(@Nonnull ItemStack stack) {
22-
ModuleTarget target = TargetedModule.getTarget(stack);
23-
return target == null ? List.of() : List.of(target);
22+
if (stack.getItem() instanceof ITargetedModule) {
23+
return List.copyOf(ITargetedModule.getTargets(stack, false));
24+
}
25+
return List.of();
2426
}
2527

2628
/**

src/main/java/me/desht/modularrouters/core/ModDataComponents.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,10 @@ public class ModDataComponents {
6464
.persistent(CompiledFlingerModule.FlingerSettings.CODEC)
6565
.networkSynchronized(CompiledFlingerModule.FlingerSettings.STREAM_CODEC)
6666
);
67-
public static final Supplier<DataComponentType<CompiledFluidModule1.FluidModuleSettings>> FLUID_SETTINGS
67+
public static final Supplier<DataComponentType<CompiledFluidModule.FluidModuleSettings>> FLUID_SETTINGS
6868
= COMPONENTS.registerComponentType("fluid_settings", builder -> builder
69-
.persistent(CompiledFluidModule1.FluidModuleSettings.CODEC)
70-
.networkSynchronized(CompiledFluidModule1.FluidModuleSettings.STREAM_CODEC)
69+
.persistent(CompiledFluidModule.FluidModuleSettings.CODEC)
70+
.networkSynchronized(CompiledFluidModule.FluidModuleSettings.STREAM_CODEC)
7171
);
7272
public static final Supplier<DataComponentType<CompiledPlayerModule.PlayerSettings>> PLAYER_SETTINGS
7373
= COMPONENTS.registerComponentType("player_settings", builder -> builder

src/main/java/me/desht/modularrouters/item/module/DistributorModule.java

+1-9
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,19 @@
11
package me.desht.modularrouters.item.module;
22

3-
import com.google.common.collect.ImmutableList;
43
import me.desht.modularrouters.client.util.ClientUtil;
54
import me.desht.modularrouters.client.util.TintColor;
65
import me.desht.modularrouters.config.ConfigHolder;
76
import me.desht.modularrouters.container.ModuleMenu;
87
import me.desht.modularrouters.core.ModDataComponents;
98
import me.desht.modularrouters.core.ModItems;
109
import me.desht.modularrouters.core.ModMenuTypes;
11-
import me.desht.modularrouters.logic.ModuleTarget;
1210
import me.desht.modularrouters.logic.compiled.CompiledDistributorModule;
1311
import me.desht.modularrouters.logic.compiled.CompiledDistributorModule.DistributorSettings;
1412
import net.minecraft.ChatFormatting;
1513
import net.minecraft.network.chat.Component;
1614
import net.minecraft.world.inventory.MenuType;
1715
import net.minecraft.world.item.ItemStack;
1816

19-
import javax.annotation.Nonnull;
2017
import java.util.List;
2118

2219
public class DistributorModule extends SenderModule2 {
@@ -44,18 +41,13 @@ public MenuType<? extends ModuleMenu> getMenuType() {
4441
return ModMenuTypes.DISTRIBUTOR_MENU.get();
4542
}
4643

47-
@Override
48-
public List<ModuleTarget> getStoredPositions(@Nonnull ItemStack stack) {
49-
return ImmutableList.copyOf(TargetedModule.getTargets(stack, false));
50-
}
51-
5244
@Override
5345
public TintColor getItemTint() {
5446
return TINT_COLOR;
5547
}
5648

5749
@Override
58-
protected int getMaxTargets() {
50+
public int getMaxTargets() {
5951
return 8;
6052
}
6153

src/main/java/me/desht/modularrouters/item/module/EnergyDistributorModule.java

+3-13
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,15 @@
11
package me.desht.modularrouters.item.module;
22

3-
import com.google.common.collect.ImmutableList;
43
import me.desht.modularrouters.client.render.area.IPositionProvider;
54
import me.desht.modularrouters.client.util.TintColor;
65
import me.desht.modularrouters.config.ConfigHolder;
76
import me.desht.modularrouters.core.ModItems;
8-
import me.desht.modularrouters.logic.ModuleTarget;
97
import me.desht.modularrouters.logic.compiled.CompiledEnergyDistributorModule;
108
import net.minecraft.world.item.ItemStack;
119
import net.minecraft.world.item.context.UseOnContext;
1210
import net.neoforged.neoforge.capabilities.Capabilities;
1311

14-
import javax.annotation.Nonnull;
15-
import java.util.List;
16-
17-
public class EnergyDistributorModule extends TargetedModule implements IRangedModule, IPositionProvider {
12+
public class EnergyDistributorModule extends ModuleItem implements IRangedModule, IPositionProvider, ITargetedModule {
1813
private static final TintColor TINT_COLOR = new TintColor(79, 9, 90);
1914

2015
public EnergyDistributorModule() {
@@ -43,17 +38,12 @@ public int getHardMaxRange() {
4338
}
4439

4540
@Override
46-
public List<ModuleTarget> getStoredPositions(@Nonnull ItemStack stack) {
47-
return ImmutableList.copyOf(TargetedModule.getTargets(stack, false));
48-
}
49-
50-
@Override
51-
protected boolean isValidTarget(UseOnContext ctx) {
41+
public boolean isValidTarget(UseOnContext ctx) {
5242
return ctx.getLevel().getCapability(Capabilities.EnergyStorage.BLOCK, ctx.getClickedPos(), ctx.getClickedFace()) != null;
5343
}
5444

5545
@Override
56-
protected int getMaxTargets() {
46+
public int getMaxTargets() {
5747
return 8;
5848
}
5949

src/main/java/me/desht/modularrouters/item/module/FluidModule1.java

+9-15
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
package me.desht.modularrouters.item.module;
22

3+
import me.desht.modularrouters.api.matching.IItemMatcher;
34
import me.desht.modularrouters.client.util.TintColor;
45
import me.desht.modularrouters.config.ConfigHolder;
56
import me.desht.modularrouters.container.ModuleMenu;
67
import me.desht.modularrouters.core.ModDataComponents;
78
import me.desht.modularrouters.core.ModItems;
89
import me.desht.modularrouters.core.ModMenuTypes;
910
import me.desht.modularrouters.item.smartfilter.SmartFilterItem;
10-
import me.desht.modularrouters.logic.compiled.CompiledFluidModule1;
11-
import me.desht.modularrouters.logic.compiled.CompiledFluidModule1.FluidModuleSettings;
11+
import me.desht.modularrouters.logic.compiled.CompiledFluidModule;
12+
import me.desht.modularrouters.logic.compiled.CompiledFluidModule.FluidModuleSettings;
1213
import me.desht.modularrouters.logic.filter.matchers.FluidMatcher;
13-
import me.desht.modularrouters.api.matching.IItemMatcher;
1414
import net.minecraft.ChatFormatting;
1515
import net.minecraft.network.chat.Component;
1616
import net.minecraft.world.inventory.MenuType;
@@ -27,7 +27,7 @@ public class FluidModule1 extends ModuleItem {
2727
private static final TintColor TINT_COLOR = new TintColor(79, 191, 255);
2828

2929
public FluidModule1() {
30-
super(ModItems.defaultProps(), CompiledFluidModule1::new);
30+
super(ModItems.defaultProps(), CompiledFluidModule::new);
3131
}
3232

3333
@Override
@@ -50,7 +50,11 @@ protected Component getFilterItemDisplayName(ItemStack stack) {
5050
protected void addExtraInformation(ItemStack stack, List<Component> list) {
5151
super.addExtraInformation(stack, list);
5252

53-
addFluidModuleInformation(stack, list);
53+
FluidModuleSettings settings = stack.getOrDefault(ModDataComponents.FLUID_SETTINGS.get(), FluidModuleSettings.DEFAULT);
54+
list.add(xlate("modularrouters.itemText.transfer_direction",
55+
xlate(settings.direction().getTranslationKey()).withStyle(ChatFormatting.AQUA)).withStyle(ChatFormatting.YELLOW));
56+
list.add(xlate("modularrouters.itemText.fluid.maxTransfer",
57+
colorText(settings.maxTransfer(), ChatFormatting.AQUA)).withStyle(ChatFormatting.YELLOW));
5458
}
5559

5660
@Override
@@ -81,14 +85,4 @@ public boolean isFluidModule() {
8185
public TintColor getItemTint() {
8286
return TINT_COLOR;
8387
}
84-
85-
static void addFluidModuleInformation(ItemStack stack, List<Component> list) {
86-
// CompiledFluidModule1 cfm = new CompiledFluidModule1(null, stack);
87-
FluidModuleSettings settings = stack.getOrDefault(ModDataComponents.FLUID_SETTINGS.get(), FluidModuleSettings.DEFAULT);
88-
list.add(xlate("modularrouters.itemText.transfer_direction",
89-
xlate(settings.direction().getTranslationKey()).withStyle(ChatFormatting.AQUA)).withStyle(ChatFormatting.YELLOW));
90-
list.add(xlate("modularrouters.itemText.fluid.maxTransfer",
91-
colorText(settings.maxTransfer(), ChatFormatting.AQUA)).withStyle(ChatFormatting.YELLOW));
92-
}
93-
9488
}

0 commit comments

Comments
 (0)