Skip to content

Commit

Permalink
Fix #175
Browse files Browse the repository at this point in the history
  • Loading branch information
Edivad99 committed Feb 23, 2024
1 parent f9970ed commit e4bfe70
Show file tree
Hide file tree
Showing 9 changed files with 156 additions and 11 deletions.
4 changes: 4 additions & 0 deletions src/api/java/mods/railcraft/api/core/RailcraftConstants.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,8 @@ private RailcraftConstants() {
public static ResourceLocation rl(String path) {
return new ResourceLocation(ID, path);
}

public static String makeTranslationKey(String type, String name) {
return type + "." + ID + "." + name;
}
}
4 changes: 3 additions & 1 deletion src/api/java/mods/railcraft/api/signal/SignalAspect.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ This work (the API) is licensed under the "MIT" License,

import java.util.Optional;
import org.jetbrains.annotations.Nullable;
import mods.railcraft.api.core.RailcraftConstants;
import mods.railcraft.api.util.EnumUtil;
import net.minecraft.network.chat.Component;
import net.minecraft.util.StringRepresentable;
Expand Down Expand Up @@ -59,7 +60,8 @@ public enum SignalAspect implements StringRepresentable {
SignalAspect(String name, int blockLight) {
this.name = name;
this.blockLight = blockLight;
this.displayName = Component.translatable("signal.railcraft.aspect." + name);
this.displayName = Component.translatable(
RailcraftConstants.makeTranslationKey("signal", "aspect." + name));
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
// 1.20.1 2024-02-23T09:21:33.302578 Languages: en_us
c33ecca5f48edd440840cbfbc12cfe8b19dcd49f assets/railcraft/lang/en_us.json
// 1.20.1 2024-02-23T11:26:04.621166 Languages: en_us
7791b433b0091862002ab3ebce68d8cf20f680dd assets/railcraft/lang/en_us.json
2 changes: 1 addition & 1 deletion src/generated/resources/assets/railcraft/lang/en_us.json
Original file line number Diff line number Diff line change
Expand Up @@ -646,7 +646,7 @@
"item.railcraft.wooden_rail": "Wooden Rail",
"item.railcraft.wooden_railbed": "Wooden Railbed",
"item.railcraft.wooden_tie": "Wooden Tie",
"item.railcraft.world_spike_minecart": "Worldspike Minecart",
"item.railcraft.world_spike_minecart": "Minecart with Worldspike",
"item.railcraft.zinc_electrode": "Zinc Electrode",
"item.railcraft.zinc_gear": "Zinc Gear",
"item.railcraft.zinc_ingot": "Zinc Ingot",
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/mods/railcraft/Translations.java
Original file line number Diff line number Diff line change
Expand Up @@ -583,6 +583,6 @@ public static class EnchantmentDescriptions {
}

public static String makeKey(String type, String name) {
return type + "." + RailcraftConstants.ID + "." + name;
return RailcraftConstants.makeTranslationKey(type, name);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,7 @@ private void itemTranslations() {
this.addItem(RailcraftItems.STEEL_TUNNEL_BORE_HEAD, "Steel Tunnel Bore Head");
this.addItem(RailcraftItems.DIAMOND_TUNNEL_BORE_HEAD, "Diamond Tunnel Bore Head");
this.addItem(RailcraftItems.TANK_MINECART, "Minecart with Tank");
this.addItem(RailcraftItems.WORLD_SPIKE_MINECART, "Worldspike Minecart");
this.addItem(RailcraftItems.WORLD_SPIKE_MINECART, "Minecart with Worldspike");
this.addItem(RailcraftItems.CRACKED_FIRESTONE, "Cracked Firestone");
this.addItem(RailcraftItems.RAW_FIRESTONE, "Raw Firestone");
this.addItem(RailcraftItems.CUT_FIRESTONE, "Cut Firestone");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ public class SignalInterlockBoxBlockEntity extends AbstractSignalBoxBlockEntity
private final SimpleSignalController signalController =
new SimpleSignalController(1, this::syncToClient, this, true);

private final SingleSignalReceiver signalReceiver = new SingleSignalReceiver(this,
this::syncToClient, this::signalAspectChanged);
private final SingleSignalReceiver signalReceiver =
new SingleSignalReceiver(this, this::syncToClient, this::signalAspectChanged);

private InterlockController interlockController;

Expand Down Expand Up @@ -63,14 +63,17 @@ public void neighborSignalBoxChanged(AbstractSignalBoxBlockEntity neighborSignal
Direction neighborDirection, boolean removed) {
this.findOrCreateInterlockController();
this.neighborSignalAspect = SignalAspect.GREEN;
for (var direction : Direction.values()) {
for (var direction : Direction.Plane.HORIZONTAL) {
var blockEntity = this.level.getBlockEntity(this.getBlockPos().relative(direction));
if (blockEntity instanceof AbstractSignalBoxBlockEntity signalBox
&& SignalBoxBlock.isAspectEmitter(signalBox.getBlockState())) {
this.neighborSignalAspect = SignalAspect.mostRestrictive(this.neighborSignalAspect,
signalBox.getSignalAspect(direction.getOpposite()));
}
}
if (!this.level.isClientSide()) {
this.interlockController.peersUpdateSignalAspect();
}
}

private void findOrCreateInterlockController() {
Expand Down Expand Up @@ -208,6 +211,10 @@ private void next() {
this.activeSignalBox = this.lockRequests.poll();
} while (this.activeSignalBox != null
&& !isLockableSignalAspect(this.activeSignalBox.getRequestedSignalAspect()));
this.peersUpdateSignalAspect();
}

private void peersUpdateSignalAspect() {
this.peers.forEach(this::updateSignalAspect);
}

Expand All @@ -218,9 +225,9 @@ private void updateSignalAspect(SignalInterlockBoxBlockEntity signalBox) {
signalAspect = SignalAspect.mostRestrictive(signalAspect, box.neighborSignalAspect);
}
signalBox.signalController.setSignalAspect(signalAspect);
return;
} else {
signalBox.signalController.setSignalAspect(SignalAspect.RED);
}
signalBox.signalController.setSignalAspect(SignalAspect.RED);
}

private boolean isActive(SignalInterlockBoxBlockEntity signalBox) {
Expand Down
132 changes: 132 additions & 0 deletions src/test/java/mods/railcraft/InterlockTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
package mods.railcraft;

import mods.railcraft.api.core.RailcraftConstants;
import mods.railcraft.api.signal.SignalAspect;
import mods.railcraft.api.signal.entity.SignalControllerEntity;
import mods.railcraft.api.signal.entity.SignalReceiverEntity;
import mods.railcraft.world.level.block.entity.signal.DistantSignalBlockEntity;
import mods.railcraft.world.level.block.entity.signal.SignalControllerBoxBlockEntity;
import mods.railcraft.world.level.block.entity.signal.SignalInterlockBoxBlockEntity;
import mods.railcraft.world.level.block.entity.signal.SignalReceiverBoxBlockEntity;
import net.minecraft.core.BlockPos;
import net.minecraft.gametest.framework.GameTest;
import net.minecraft.gametest.framework.GameTestHelper;
import net.minecraftforge.gametest.GameTestHolder;
import net.minecraftforge.gametest.PrefixGameTestTemplate;

@GameTestHolder(RailcraftConstants.ID)
@PrefixGameTestTemplate(false)
public class InterlockTest {

private static BlockPos MASTER_LEVER = new BlockPos(1, 2, 3);
private static BlockPos LEVER_1 = new BlockPos(6, 2, 1);
private static BlockPos LEVER_2 = new BlockPos(5, 2, 1);
private static BlockPos LEVER_3 = new BlockPos(4, 2, 1);


@GameTest(template = "interlock", timeoutTicks = 200)
public static void interlock(GameTestHelper helper) {
setupTest(helper);
helper.startSequence()
.thenIdle(20)
.thenExecute(() -> {
helper.pullLever(LEVER_1);
var distant1 = (DistantSignalBlockEntity) helper.getBlockEntity(new BlockPos(6, 3, 6));
var distant2 = (DistantSignalBlockEntity) helper.getBlockEntity(new BlockPos(5, 3, 6));
if (distant1.getPrimarySignalAspect() != SignalAspect.RED) {
helper.fail("Distant 1 should be RED");
}
if (distant2.getPrimarySignalAspect() != SignalAspect.GREEN) {
helper.fail("Distant 2 should be GREEN");
}
})
.thenIdle(20)
.thenExecute(() -> {
helper.pullLever(LEVER_2);
var distant2 = (DistantSignalBlockEntity) helper.getBlockEntity(new BlockPos(5, 3, 6));
var distant3 = (DistantSignalBlockEntity) helper.getBlockEntity(new BlockPos(4, 3, 6));
if (distant2.getPrimarySignalAspect() != SignalAspect.RED) {
helper.fail("Distant 2 should be RED");
}
if (distant3.getPrimarySignalAspect() != SignalAspect.GREEN) {
helper.fail("Distant 3 should be GREEN");
}
})
.thenIdle(20)
.thenExecute(() -> {
helper.pullLever(LEVER_3);
helper.pullLever(LEVER_1);
var distant3 = (DistantSignalBlockEntity) helper.getBlockEntity(new BlockPos(4, 3, 6));
var distant1 = (DistantSignalBlockEntity) helper.getBlockEntity(new BlockPos(6, 3, 6));
if (distant3.getPrimarySignalAspect() != SignalAspect.RED) {
helper.fail("Distant 3 should be RED");
}
if (distant1.getPrimarySignalAspect() != SignalAspect.GREEN) {
helper.fail("Distant 1 should be GREEN");
}
})
.thenIdle(20)
.thenExecute(() -> {
helper.pullLever(MASTER_LEVER);
var distant1 = (DistantSignalBlockEntity) helper.getBlockEntity(new BlockPos(6, 3, 6));
var distant2 = (DistantSignalBlockEntity) helper.getBlockEntity(new BlockPos(5, 3, 6));
var distant3 = (DistantSignalBlockEntity) helper.getBlockEntity(new BlockPos(4, 3, 6));
if (distant1.getPrimarySignalAspect() != SignalAspect.RED) {
helper.fail("Distant 1 should be RED");
}
if (distant2.getPrimarySignalAspect() != SignalAspect.RED) {
helper.fail("Distant 2 should be RED");
}
if (distant3.getPrimarySignalAspect() != SignalAspect.RED) {
helper.fail("Distant 3 should be RED");
}
})
.thenIdle(20)
.thenExecute(() -> {
helper.pullLever(MASTER_LEVER);
var distant1 = (DistantSignalBlockEntity) helper.getBlockEntity(new BlockPos(6, 3, 6));
var distant2 = (DistantSignalBlockEntity) helper.getBlockEntity(new BlockPos(5, 3, 6));
var distant3 = (DistantSignalBlockEntity) helper.getBlockEntity(new BlockPos(4, 3, 6));
if (distant1.getPrimarySignalAspect() != SignalAspect.GREEN) {
helper.fail("Distant 1 should be GREEN");
}
if (distant2.getPrimarySignalAspect() != SignalAspect.RED) {
helper.fail("Distant 2 should be RED");
}
if (distant3.getPrimarySignalAspect() != SignalAspect.RED) {
helper.fail("Distant 3 should be RED");
}
})
.thenSucceed();
}

private static void setupTest(GameTestHelper helper) {
var controller1 = (SignalControllerBoxBlockEntity) helper.getBlockEntity(new BlockPos(6, 2, 2));
var interlock1 = (SignalInterlockBoxBlockEntity) helper.getBlockEntity(new BlockPos(6, 2, 4));
link(controller1, interlock1);
var controller2 = (SignalControllerBoxBlockEntity) helper.getBlockEntity(new BlockPos(5, 2, 2));
var interlock2 = (SignalInterlockBoxBlockEntity) helper.getBlockEntity(new BlockPos(5, 2, 4));
link(controller2, interlock2);
var controller3 = (SignalControllerBoxBlockEntity) helper.getBlockEntity(new BlockPos(4, 2, 2));
var interlock3 = (SignalInterlockBoxBlockEntity) helper.getBlockEntity(new BlockPos(4, 2, 4));
link(controller3, interlock3);

var distant1 = (DistantSignalBlockEntity) helper.getBlockEntity(new BlockPos(6, 3, 6));
var distant2 = (DistantSignalBlockEntity) helper.getBlockEntity(new BlockPos(5, 3, 6));
var distant3 = (DistantSignalBlockEntity) helper.getBlockEntity(new BlockPos(4, 3, 6));
link(interlock1, distant1);
link(interlock2, distant2);
link(interlock3, distant3);

var controller4 = (SignalControllerBoxBlockEntity) helper.getBlockEntity(new BlockPos(1, 2, 4));
var receiver1 = (SignalReceiverBoxBlockEntity) helper.getBlockEntity(new BlockPos(3, 2, 4));
link(controller4, receiver1);
}

private static void link(SignalControllerEntity target, SignalReceiverEntity peer) {
var controller = target.getSignalController();
controller.startLinking();
controller.addPeer(peer);
controller.stopLinking();
}
}
Binary file not shown.

0 comments on commit e4bfe70

Please sign in to comment.