From f1f5a41cfdc87d2571d3433359426ca3b4205aaa Mon Sep 17 00:00:00 2001 From: Cedric Date: Fri, 6 Feb 2026 09:13:48 +0100 Subject: [PATCH 01/61] fix: issue with names sometimes not shown in signalbox --- .../signals/handler/NameHandler.java | 30 +++++++++++++------ 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/handler/NameHandler.java b/src/main/java/com/troblecodings/signals/handler/NameHandler.java index ab1c81f5d..84ca4f7e6 100644 --- a/src/main/java/com/troblecodings/signals/handler/NameHandler.java +++ b/src/main/java/com/troblecodings/signals/handler/NameHandler.java @@ -45,6 +45,7 @@ import net.minecraftforge.fml.common.Mod.EventHandler; import net.minecraftforge.fml.common.event.FMLServerStoppingEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.PlayerEvent.PlayerLoggedInEvent; import net.minecraftforge.fml.common.network.FMLEventChannel; import net.minecraftforge.fml.common.network.FMLNetworkEvent.ClientCustomPacketEvent; import net.minecraftforge.fml.common.network.NetworkRegistry; @@ -159,8 +160,8 @@ public static void runTaskWhenNameLoaded(final StateInfo info, listener.update(info, name, ChangedState.UPDATED); } else { synchronized (TASKS_WHEN_LOAD) { - final List list = TASKS_WHEN_LOAD.computeIfAbsent(info, - _u -> new ArrayList<>()); + final List list = + TASKS_WHEN_LOAD.computeIfAbsent(info, _u -> new ArrayList<>()); if (!list.contains(listener)) { list.add(listener); } @@ -258,6 +259,16 @@ public static void onWorldUnload(final WorldEvent.Unload unload) { } } + @SubscribeEvent + public static void onPlayerJoin(final PlayerLoggedInEvent event) { + final EntityPlayer player = event.player; + final Map names; + synchronized (ALL_NAMES) { + names = ImmutableMap.copyOf(ALL_NAMES); + } + names.forEach((info, map) -> sendTo(player, packToBuffer(info.pos, map))); + } + private static void createToFile(final StateInfo info, final String name) { NameHandlerFileV2 file; synchronized (ALL_LEVEL_FILES) { @@ -327,13 +338,14 @@ public static void loadNames(final List infos, infos.forEach(info -> { boolean isLoaded = false; synchronized (LOAD_COUNTER) { - final List> holders = LOAD_COUNTER.computeIfAbsent(info.info, - _u -> new ArrayList<>()); + final List> holders = + LOAD_COUNTER.computeIfAbsent(info.info, _u -> new ArrayList<>()); if (holders.size() > 0) { isLoaded = true; } - if (!holders.contains(info.holder)) + if (!holders.contains(info.holder)) { holders.add(info.holder); + } } if (isLoaded) { if (player == null) @@ -383,8 +395,8 @@ public static void unloadNames(final List infos) { writeService.execute(() -> { infos.forEach(info -> { synchronized (LOAD_COUNTER) { - final List> holders = LOAD_COUNTER.getOrDefault(info.info, - new ArrayList<>()); + final List> holders = + LOAD_COUNTER.getOrDefault(info.info, new ArrayList<>()); holders.remove(info.holder); if (!holders.isEmpty()) return; @@ -402,8 +414,8 @@ public static void unloadNames(final List infos) { } private static void sendTo(final EntityPlayer player, final ByteBuffer buf) { - final PacketBuffer buffer = new PacketBuffer( - Unpooled.copiedBuffer((ByteBuffer) buf.position(0))); + final PacketBuffer buffer = + new PacketBuffer(Unpooled.copiedBuffer((ByteBuffer) buf.position(0))); if (player instanceof EntityPlayerMP) { final EntityPlayerMP server = (EntityPlayerMP) player; channel.sendTo(new FMLProxyPacket(buffer, CHANNELNAME), server); From e8f0aca4e5e0cbde454f786e90c57e4ffd352817 Mon Sep 17 00:00:00 2001 From: Cedric Date: Mon, 9 Feb 2026 14:43:30 +0100 Subject: [PATCH 02/61] maby fix: issues with signal states not been shown --- .../signals/handler/ClientSignalStateHandler.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java b/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java index 468029207..79c286436 100644 --- a/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java +++ b/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java @@ -23,7 +23,8 @@ public class ClientSignalStateHandler implements INetworkSync { - private static final Map> CURRENTLY_LOADED_STATES = new HashMap<>(); + private static final Map> CURRENTLY_LOADED_STATES = + new HashMap<>(); public static final Map getClientStates(final StateInfo info) { synchronized (CURRENTLY_LOADED_STATES) { @@ -45,9 +46,9 @@ public void deserializeClient(final ReadBuffer buffer) { return; } final Signal signal = Signal.getSignalByID(signalID); - final Map newProperties = buffer.getMapWithCombinedValueFunc( - NetworkBufferWrappers.getSEPropertyFunc(signal), - (buf, prop) -> prop.getObjFromID(buf.getByteToUnsignedInt())); + final Map newProperties = + buffer.getMapWithCombinedValueFunc(NetworkBufferWrappers.getSEPropertyFunc(signal), + (buf, prop) -> prop.getObjFromID(buf.getByteToUnsignedInt())); final Map properties; boolean contains; synchronized (CURRENTLY_LOADED_STATES) { @@ -62,17 +63,17 @@ public void deserializeClient(final ReadBuffer buffer) { final Chunk chunk = level.getChunkFromBlockCoords(signalPos); if (chunk == null) return; - chunk.markDirty(); final IBlockState state = level.getBlockState(signalPos); if (state == null) return; + level.notifyBlockUpdate(signalPos, state, state, 3); mc.renderGlobal.notifyLightSet(signalPos); mc.renderGlobal.notifyBlockUpdate(level, signalPos, state, state, 8); - level.notifyBlockUpdate(signalPos, state, state, 3); final TileEntity tile = level.getTileEntity(signalPos); if (tile != null && tile instanceof SignalTileEntity) { ((SignalTileEntity) tile).updateAnimationStates(properties, !contains); } + chunk.markDirty(); }); } From 4afbb6dedb220a5fdfe31aaf85a4b2f7f837a0a3 Mon Sep 17 00:00:00 2001 From: Cedric Date: Mon, 9 Feb 2026 14:57:05 +0100 Subject: [PATCH 03/61] Revert "maby fix: issues with signal states not been shown" This reverts commit e8f0aca4e5e0cbde454f786e90c57e4ffd352817. --- .../signals/handler/ClientSignalStateHandler.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java b/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java index 79c286436..468029207 100644 --- a/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java +++ b/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java @@ -23,8 +23,7 @@ public class ClientSignalStateHandler implements INetworkSync { - private static final Map> CURRENTLY_LOADED_STATES = - new HashMap<>(); + private static final Map> CURRENTLY_LOADED_STATES = new HashMap<>(); public static final Map getClientStates(final StateInfo info) { synchronized (CURRENTLY_LOADED_STATES) { @@ -46,9 +45,9 @@ public void deserializeClient(final ReadBuffer buffer) { return; } final Signal signal = Signal.getSignalByID(signalID); - final Map newProperties = - buffer.getMapWithCombinedValueFunc(NetworkBufferWrappers.getSEPropertyFunc(signal), - (buf, prop) -> prop.getObjFromID(buf.getByteToUnsignedInt())); + final Map newProperties = buffer.getMapWithCombinedValueFunc( + NetworkBufferWrappers.getSEPropertyFunc(signal), + (buf, prop) -> prop.getObjFromID(buf.getByteToUnsignedInt())); final Map properties; boolean contains; synchronized (CURRENTLY_LOADED_STATES) { @@ -63,17 +62,17 @@ public void deserializeClient(final ReadBuffer buffer) { final Chunk chunk = level.getChunkFromBlockCoords(signalPos); if (chunk == null) return; + chunk.markDirty(); final IBlockState state = level.getBlockState(signalPos); if (state == null) return; - level.notifyBlockUpdate(signalPos, state, state, 3); mc.renderGlobal.notifyLightSet(signalPos); mc.renderGlobal.notifyBlockUpdate(level, signalPos, state, state, 8); + level.notifyBlockUpdate(signalPos, state, state, 3); final TileEntity tile = level.getTileEntity(signalPos); if (tile != null && tile instanceof SignalTileEntity) { ((SignalTileEntity) tile).updateAnimationStates(properties, !contains); } - chunk.markDirty(); }); } From 7d074ca60809a47901eb96d3f638d3a638f199f4 Mon Sep 17 00:00:00 2001 From: Cedric Date: Mon, 9 Feb 2026 15:02:48 +0100 Subject: [PATCH 04/61] ref: revert the revert, added debug output --- .../signals/handler/ClientSignalStateHandler.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java b/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java index 468029207..337957573 100644 --- a/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java +++ b/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java @@ -23,7 +23,8 @@ public class ClientSignalStateHandler implements INetworkSync { - private static final Map> CURRENTLY_LOADED_STATES = new HashMap<>(); + private static final Map> CURRENTLY_LOADED_STATES = + new HashMap<>(); public static final Map getClientStates(final StateInfo info) { synchronized (CURRENTLY_LOADED_STATES) { @@ -45,9 +46,10 @@ public void deserializeClient(final ReadBuffer buffer) { return; } final Signal signal = Signal.getSignalByID(signalID); - final Map newProperties = buffer.getMapWithCombinedValueFunc( - NetworkBufferWrappers.getSEPropertyFunc(signal), - (buf, prop) -> prop.getObjFromID(buf.getByteToUnsignedInt())); + final Map newProperties = + buffer.getMapWithCombinedValueFunc(NetworkBufferWrappers.getSEPropertyFunc(signal), + (buf, prop) -> prop.getObjFromID(buf.getByteToUnsignedInt())); + System.out.println("Updateing [" + signalPos + "] with [" + newProperties + "]!"); final Map properties; boolean contains; synchronized (CURRENTLY_LOADED_STATES) { @@ -62,17 +64,17 @@ public void deserializeClient(final ReadBuffer buffer) { final Chunk chunk = level.getChunkFromBlockCoords(signalPos); if (chunk == null) return; - chunk.markDirty(); final IBlockState state = level.getBlockState(signalPos); if (state == null) return; + level.notifyBlockUpdate(signalPos, state, state, 3); mc.renderGlobal.notifyLightSet(signalPos); mc.renderGlobal.notifyBlockUpdate(level, signalPos, state, state, 8); - level.notifyBlockUpdate(signalPos, state, state, 3); final TileEntity tile = level.getTileEntity(signalPos); if (tile != null && tile instanceof SignalTileEntity) { ((SignalTileEntity) tile).updateAnimationStates(properties, !contains); } + chunk.markDirty(); }); } From 916fab36173249d7865b246da3e789f981c7fe7a Mon Sep 17 00:00:00 2001 From: Cedric Date: Mon, 9 Feb 2026 15:20:38 +0100 Subject: [PATCH 05/61] ref: changed debug output --- .../troblecodings/signals/blocks/Signal.java | 21 +++---- .../signals/handler/SignalStateHandler.java | 61 ++++++++++--------- .../signals/tileentitys/BasicBlockEntity.java | 6 +- 3 files changed, 45 insertions(+), 43 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/blocks/Signal.java b/src/main/java/com/troblecodings/signals/blocks/Signal.java index e77e588eb..ced3e2275 100644 --- a/src/main/java/com/troblecodings/signals/blocks/Signal.java +++ b/src/main/java/com/troblecodings/signals/blocks/Signal.java @@ -72,8 +72,8 @@ public class Signal extends BasicBlock { public static final Map SIGNALS = new HashMap<>(); public static final List SIGNAL_IDS = new ArrayList<>(); - public static final PropertyEnum ANGEL = PropertyEnum.create("angel", - SignalAngel.class); + public static final PropertyEnum ANGEL = + PropertyEnum.create("angel", SignalAngel.class); public static final SEProperty CUSTOMNAME = new SEProperty("customname", JsonEnum.BOOLEAN, "false", ChangeableStage.AUTOMATICSTAGE, t -> true, 0); public static final TileEntitySupplierWrapper SUPPLIER = SignalTileEntity::new; @@ -157,8 +157,8 @@ public ItemStack getPickBlock(final IBlockState state, final RayTraceResult targ public IBlockState getStateForPlacement(final World world, final BlockPos pos, final EnumFacing facing, final float hitX, final float hitY, final float hitZ, final int meta, final EntityLivingBase placer, final EnumHand hand) { - final int index = 15 - - (MathHelper.floor(placer.getRotationYawHead() * 16.0F / 360.0F - 0.5D) & 15); + final int index = + 15 - (MathHelper.floor(placer.getRotationYawHead() * 16.0F / 360.0F - 0.5D) & 15); return getDefaultState().withProperty(ANGEL, SignalAngel.values()[index]); } @@ -200,6 +200,7 @@ public IBlockState getExtendedState(final IBlockState state, final IBlockAccess final Map properties = world.isRemote ? ClientSignalStateHandler.getClientStates(new StateInfo(info.world, info.pos)) : tile.getProperties(); + System.out.println("Loading [" + pos + "] with [" + properties + "]!"); properties.forEach((property, value) -> { if (signalProperties.contains(property)) { blockState.getAndUpdate(oldState -> oldState.withProperty(property, value)); @@ -502,13 +503,11 @@ public void getUpdate(final World world, final BlockPos pos) { if (sound.duration == 1) { world.playSound(null, pos, sound.state, SoundCategory.BLOCKS, 1.0F, 1.0F); - } else { - if (world.isUpdateScheduled(pos, this)) - return; - else { - if (sound.predicate.test(properties)) { - world.scheduleUpdate(pos, this, 1); - } + } else if (world.isUpdateScheduled(pos, this)) + return; + else { + if (sound.predicate.test(properties)) { + world.scheduleUpdate(pos, this, 1); } } }); diff --git a/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java b/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java index dce012110..1711dbbf5 100644 --- a/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java +++ b/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java @@ -58,11 +58,14 @@ private SignalStateHandler() { private static ExecutorService writeService = Executors.newFixedThreadPool(5); private static final ExecutorService THREAD_SERVICE = Executors.newCachedThreadPool(); - private static final Map> CURRENTLY_LOADED_STATES = new HashMap<>(); + private static final Map> CURRENTLY_LOADED_STATES = + new HashMap<>(); private static final Map ALL_LEVEL_FILES = new HashMap<>(); private static final Map>> SIGNAL_COUNTER = new HashMap<>(); - private static final Map> ALL_LISTENERS = new HashMap<>(); - private static final Map> TASKS_WHEN_LOAD = new HashMap<>(); + private static final Map> ALL_LISTENERS = + new HashMap<>(); + private static final Map> TASKS_WHEN_LOAD = + new HashMap<>(); private static final String CHANNELNAME = "statehandlernet"; private static FMLEventChannel channel; @@ -121,8 +124,8 @@ public static void runTaskWhenSignalLoaded(final SignalStateInfo info, listener.update(info, properties, ChangedState.UPDATED); } else { synchronized (TASKS_WHEN_LOAD) { - final List list = TASKS_WHEN_LOAD.computeIfAbsent(info, - _u -> new ArrayList<>()); + final List list = + TASKS_WHEN_LOAD.computeIfAbsent(info, _u -> new ArrayList<>()); if (!list.contains(listener)) { list.add(listener); } @@ -134,10 +137,11 @@ public static void addListener(final SignalStateInfo info, final SignalStateList if (!info.isValid() || info.worldNullOrClientSide()) return; synchronized (ALL_LISTENERS) { - final List listeners = ALL_LISTENERS.computeIfAbsent(info, - _u -> new ArrayList<>()); - if (!listeners.contains(listener)) + final List listeners = + ALL_LISTENERS.computeIfAbsent(info, _u -> new ArrayList<>()); + if (!listeners.contains(listener)) { listeners.add(listener); + } } } @@ -178,8 +182,8 @@ private static void statesToBuffer(final Signal signal, final Map { if (property.equals(Signal.CUSTOMNAME)) return; - readData[signal.getIDFromProperty( - property)] = (byte) (property.getParent().getIDFromValue(string) + 1); + readData[signal.getIDFromProperty(property)] = + (byte) (property.getParent().getIDFromValue(string) + 1); }); } @@ -244,8 +248,8 @@ public static void setStates(final SignalStateInfo info, final Map oldStates = new HashMap<>( - CURRENTLY_LOADED_STATES.get(info)); + final Map oldStates = + new HashMap<>(CURRENTLY_LOADED_STATES.get(info)); states.entrySet().stream().filter(entry -> { final String oldState = oldStates.get(entry.getKey()); return !entry.getValue().equals(oldState); @@ -279,11 +283,9 @@ public static Map getStates(final SignalStateInfo info) { } if (states != null) return states; - else { - if (info.world.isRemote) - return new HashMap<>(); - return readAndSerialize(info); - } + if (info.world.isRemote) + return new HashMap<>(); + return readAndSerialize(info); } public static void setState(final SignalStateInfo info, final SEProperty property, @@ -325,11 +327,10 @@ private static Map readAndSerialize(final SignalStateInfo st OpenSignalsMain.getLogger() .warn("Position [" + stateInfo + "] not found on client!"); return map; - } else { - OpenSignalsMain.getLogger() - .warn("Position [" + stateInfo + "] not found in file, recovering!"); - pos = file.create(stateInfo.pos); } + OpenSignalsMain.getLogger() + .warn("Position [" + stateInfo + "] not found in file, recovering!"); + pos = file.create(stateInfo.pos); } buffer = file.read(pos); } @@ -463,6 +464,7 @@ private static void sendToPlayer(final SignalStateInfo stateInfo, final Map properties, final EntityPlayer player) { if (properties == null || properties.isEmpty()) return; + System.out.println("Sending [" + stateInfo.pos + "] with [" + properties + "]!"); sendTo(player, packToByteBuffer(stateInfo, properties)); } @@ -472,6 +474,7 @@ private static void sendToAll(final SignalStateInfo stateInfo, return; final ByteBuffer buffer = packToByteBuffer(stateInfo, properties); final List players = ImmutableList.copyOf(stateInfo.world.playerEntities); + System.out.println("Sending [" + stateInfo.pos + "] with [" + properties + "]!"); players.forEach(player -> sendTo(player, buffer)); } @@ -497,8 +500,8 @@ public static void onChunkWatch(final ChunkWatchEvent.Watch event) { ImmutableMap.copyOf(chunk.getTileEntityMap()).forEach((pos, tile) -> { if (tile instanceof SignalTileEntity) { final SignalTileEntity signalTile = (SignalTileEntity) tile; - final SignalStateInfo info = new SignalStateInfo(world, pos, - signalTile.getSignal()); + final SignalStateInfo info = + new SignalStateInfo(world, pos, signalTile.getSignal()); states.add(new SignalStateLoadHoler(info, new LoadHolder<>(player))); } }); @@ -544,8 +547,8 @@ public static void loadSignals(final List signals, signals.forEach(info -> { boolean isLoaded = false; synchronized (SIGNAL_COUNTER) { - final List> holders = SIGNAL_COUNTER.computeIfAbsent(info.info, - _u -> new ArrayList<>()); + final List> holders = + SIGNAL_COUNTER.computeIfAbsent(info.info, _u -> new ArrayList<>()); if (holders.size() > 0) { isLoaded = true; } @@ -589,8 +592,8 @@ public static void unloadSignals(final List signals) { writeService.execute(() -> { signals.forEach(info -> { synchronized (SIGNAL_COUNTER) { - final List> holders = SIGNAL_COUNTER.getOrDefault(info.info, - new ArrayList<>()); + final List> holders = + SIGNAL_COUNTER.getOrDefault(info.info, new ArrayList<>()); holders.remove(info.holder); if (!holders.isEmpty()) return; @@ -609,8 +612,8 @@ public static void unloadSignals(final List signals) { } private static void sendTo(final EntityPlayer player, final ByteBuffer buf) { - final PacketBuffer buffer = new PacketBuffer( - Unpooled.copiedBuffer((ByteBuffer) buf.position(0))); + final PacketBuffer buffer = + new PacketBuffer(Unpooled.copiedBuffer((ByteBuffer) buf.position(0))); if (player instanceof EntityPlayerMP) { final EntityPlayerMP server = (EntityPlayerMP) player; channel.sendTo(new FMLProxyPacket(buffer, CHANNELNAME), server); diff --git a/src/main/java/com/troblecodings/signals/tileentitys/BasicBlockEntity.java b/src/main/java/com/troblecodings/signals/tileentitys/BasicBlockEntity.java index bdafeef8a..3a71c28cf 100644 --- a/src/main/java/com/troblecodings/signals/tileentitys/BasicBlockEntity.java +++ b/src/main/java/com/troblecodings/signals/tileentitys/BasicBlockEntity.java @@ -23,7 +23,6 @@ public class BasicBlockEntity extends TileEntity implements NamableWrapper, IChu protected final ArrayList linkedPositions = new ArrayList<>(); public BasicBlockEntity() { - super(); } public void saveWrapper(final NBTWrapper wrapper) { @@ -75,8 +74,9 @@ public void syncClient(final World world, final BlockPos pos) { @Override public String getNameWrapper() { final StateInfo info = new StateInfo(world, pos); - final String customName = world.isRemote ? ClientNameHandler.getClientName(info) - : NameHandler.getName(info); + final String customName = + world.isRemote ? ClientNameHandler.getClientName(info) : NameHandler.getName(info); + System.out.println("Loaded [" + pos + "] with [" + customName + "]!"); return customName; } From 3391db71672483faa36230dc7c44f7690c257815 Mon Sep 17 00:00:00 2001 From: Cedric Date: Mon, 9 Feb 2026 15:42:31 +0100 Subject: [PATCH 06/61] ref: changed debug output --- .../signals/handler/ClientSignalStateHandler.java | 1 + .../troblecodings/signals/handler/SignalStateHandler.java | 6 ++++-- .../troblecodings/signals/tileentitys/BasicBlockEntity.java | 1 - 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java b/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java index 337957573..c49d3d738 100644 --- a/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java +++ b/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java @@ -42,6 +42,7 @@ public void deserializeClient(final ReadBuffer buffer) { final int signalID = buffer.getInt(); final boolean remove = buffer.getBoolean(); if (remove) { + System.out.println("Removed [" + signalPos + "]!"); setRemoved(stateInfo); return; } diff --git a/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java b/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java index 1711dbbf5..3c831f5ed 100644 --- a/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java +++ b/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java @@ -464,7 +464,8 @@ private static void sendToPlayer(final SignalStateInfo stateInfo, final Map properties, final EntityPlayer player) { if (properties == null || properties.isEmpty()) return; - System.out.println("Sending [" + stateInfo.pos + "] with [" + properties + "]!"); + System.out.println( + "Sending [" + stateInfo.pos + "] to [" + player + "] with [" + properties + "]!"); sendTo(player, packToByteBuffer(stateInfo, properties)); } @@ -474,7 +475,8 @@ private static void sendToAll(final SignalStateInfo stateInfo, return; final ByteBuffer buffer = packToByteBuffer(stateInfo, properties); final List players = ImmutableList.copyOf(stateInfo.world.playerEntities); - System.out.println("Sending [" + stateInfo.pos + "] with [" + properties + "]!"); + System.out.println( + "Sending [" + stateInfo.pos + "] to [" + players + "] with [" + properties + "]!"); players.forEach(player -> sendTo(player, buffer)); } diff --git a/src/main/java/com/troblecodings/signals/tileentitys/BasicBlockEntity.java b/src/main/java/com/troblecodings/signals/tileentitys/BasicBlockEntity.java index 3a71c28cf..c08525c19 100644 --- a/src/main/java/com/troblecodings/signals/tileentitys/BasicBlockEntity.java +++ b/src/main/java/com/troblecodings/signals/tileentitys/BasicBlockEntity.java @@ -76,7 +76,6 @@ public String getNameWrapper() { final StateInfo info = new StateInfo(world, pos); final String customName = world.isRemote ? ClientNameHandler.getClientName(info) : NameHandler.getName(info); - System.out.println("Loaded [" + pos + "] with [" + customName + "]!"); return customName; } From 2edb3733bbc31e475f2fc5d8e3c0d08721a094ea Mon Sep 17 00:00:00 2001 From: Cedric Date: Mon, 9 Feb 2026 16:09:38 +0100 Subject: [PATCH 07/61] ref: added new method to maby fix issue with missing data --- .../signals/handler/SignalStateHandler.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java b/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java index 3c831f5ed..1d279f765 100644 --- a/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java +++ b/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java @@ -34,6 +34,7 @@ import com.troblecodings.signals.tileentitys.SignalTileEntity; import io.netty.buffer.Unpooled; +import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.network.PacketBuffer; @@ -41,6 +42,7 @@ import net.minecraft.world.World; import net.minecraft.world.WorldServer; import net.minecraft.world.chunk.Chunk; +import net.minecraftforge.event.entity.EntityJoinWorldEvent; import net.minecraftforge.event.world.ChunkWatchEvent; import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.fml.common.event.FMLServerStoppingEvent; @@ -482,6 +484,7 @@ private static void sendToAll(final SignalStateInfo stateInfo, @SubscribeEvent public static void onPlayerJoin(final PlayerLoggedInEvent event) { + System.out.println("Called PlayerLoggedIn for [" + event.player + "]!"); final EntityPlayer player = event.player; final Map> properties; synchronized (CURRENTLY_LOADED_STATES) { @@ -490,6 +493,19 @@ public static void onPlayerJoin(final PlayerLoggedInEvent event) { properties.forEach((info, map) -> sendTo(info, map, player)); } + @SubscribeEvent + public static void onEntityJoinWorldEvent(final EntityJoinWorldEvent event) { + System.out.println("Called EntityJoinWorldEvent for [" + event.getEntity() + "]!"); + final Entity entity = event.getEntity(); + if (!(entity instanceof EntityPlayer)) + return; + final Map> properties; + synchronized (CURRENTLY_LOADED_STATES) { + properties = ImmutableMap.copyOf(CURRENTLY_LOADED_STATES); + } + properties.forEach((info, map) -> sendTo(info, map, (EntityPlayer) entity)); + } + @SubscribeEvent public static void onChunkWatch(final ChunkWatchEvent.Watch event) { final Chunk chunk = event.getChunkInstance(); From 88b87b14a436cc5bbe8ed950e73d3ff400f4328b Mon Sep 17 00:00:00 2001 From: Cedric Date: Mon, 9 Feb 2026 16:25:39 +0100 Subject: [PATCH 08/61] ref: removed debug output; hopefully fix: issues with names and states not shown --- .../troblecodings/signals/blocks/Signal.java | 7 ++----- .../handler/ClientSignalStateHandler.java | 2 -- .../signals/handler/NameHandler.java | 11 +++++++---- .../signals/handler/SignalStateHandler.java | 17 ----------------- 4 files changed, 9 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/blocks/Signal.java b/src/main/java/com/troblecodings/signals/blocks/Signal.java index ced3e2275..65955bc5e 100644 --- a/src/main/java/com/troblecodings/signals/blocks/Signal.java +++ b/src/main/java/com/troblecodings/signals/blocks/Signal.java @@ -200,7 +200,6 @@ public IBlockState getExtendedState(final IBlockState state, final IBlockAccess final Map properties = world.isRemote ? ClientSignalStateHandler.getClientStates(new StateInfo(info.world, info.pos)) : tile.getProperties(); - System.out.println("Loading [" + pos + "] with [" + properties + "]!"); properties.forEach((property, value) -> { if (signalProperties.contains(property)) { blockState.getAndUpdate(oldState -> oldState.withProperty(property, value)); @@ -505,10 +504,8 @@ public void getUpdate(final World world, final BlockPos pos) { world.playSound(null, pos, sound.state, SoundCategory.BLOCKS, 1.0F, 1.0F); } else if (world.isUpdateScheduled(pos, this)) return; - else { - if (sound.predicate.test(properties)) { - world.scheduleUpdate(pos, this, 1); - } + else if (sound.predicate.test(properties)) { + world.scheduleUpdate(pos, this, 1); } }); } diff --git a/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java b/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java index c49d3d738..79c286436 100644 --- a/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java +++ b/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java @@ -42,7 +42,6 @@ public void deserializeClient(final ReadBuffer buffer) { final int signalID = buffer.getInt(); final boolean remove = buffer.getBoolean(); if (remove) { - System.out.println("Removed [" + signalPos + "]!"); setRemoved(stateInfo); return; } @@ -50,7 +49,6 @@ public void deserializeClient(final ReadBuffer buffer) { final Map newProperties = buffer.getMapWithCombinedValueFunc(NetworkBufferWrappers.getSEPropertyFunc(signal), (buf, prop) -> prop.getObjFromID(buf.getByteToUnsignedInt())); - System.out.println("Updateing [" + signalPos + "] with [" + newProperties + "]!"); final Map properties; boolean contains; synchronized (CURRENTLY_LOADED_STATES) { diff --git a/src/main/java/com/troblecodings/signals/handler/NameHandler.java b/src/main/java/com/troblecodings/signals/handler/NameHandler.java index 84ca4f7e6..5f458a6ca 100644 --- a/src/main/java/com/troblecodings/signals/handler/NameHandler.java +++ b/src/main/java/com/troblecodings/signals/handler/NameHandler.java @@ -32,6 +32,7 @@ import io.netty.buffer.Unpooled; import net.minecraft.block.Block; +import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.network.PacketBuffer; @@ -40,12 +41,12 @@ import net.minecraft.world.World; import net.minecraft.world.WorldServer; import net.minecraft.world.chunk.Chunk; +import net.minecraftforge.event.entity.EntityJoinWorldEvent; import net.minecraftforge.event.world.ChunkWatchEvent; import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.fml.common.Mod.EventHandler; import net.minecraftforge.fml.common.event.FMLServerStoppingEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.gameevent.PlayerEvent.PlayerLoggedInEvent; import net.minecraftforge.fml.common.network.FMLEventChannel; import net.minecraftforge.fml.common.network.FMLNetworkEvent.ClientCustomPacketEvent; import net.minecraftforge.fml.common.network.NetworkRegistry; @@ -260,13 +261,15 @@ public static void onWorldUnload(final WorldEvent.Unload unload) { } @SubscribeEvent - public static void onPlayerJoin(final PlayerLoggedInEvent event) { - final EntityPlayer player = event.player; + public static void onEntityJoinWorldEvent(final EntityJoinWorldEvent event) { + final Entity entity = event.getEntity(); + if (!(entity instanceof EntityPlayer)) + return; final Map names; synchronized (ALL_NAMES) { names = ImmutableMap.copyOf(ALL_NAMES); } - names.forEach((info, map) -> sendTo(player, packToBuffer(info.pos, map))); + names.forEach((info, map) -> sendTo((EntityPlayer) entity, packToBuffer(info.pos, map))); } private static void createToFile(final StateInfo info, final String name) { diff --git a/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java b/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java index 1d279f765..50864838d 100644 --- a/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java +++ b/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java @@ -47,7 +47,6 @@ import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.fml.common.event.FMLServerStoppingEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.gameevent.PlayerEvent.PlayerLoggedInEvent; import net.minecraftforge.fml.common.network.FMLEventChannel; import net.minecraftforge.fml.common.network.FMLNetworkEvent.ClientCustomPacketEvent; import net.minecraftforge.fml.common.network.NetworkRegistry; @@ -466,8 +465,6 @@ private static void sendToPlayer(final SignalStateInfo stateInfo, final Map properties, final EntityPlayer player) { if (properties == null || properties.isEmpty()) return; - System.out.println( - "Sending [" + stateInfo.pos + "] to [" + player + "] with [" + properties + "]!"); sendTo(player, packToByteBuffer(stateInfo, properties)); } @@ -477,25 +474,11 @@ private static void sendToAll(final SignalStateInfo stateInfo, return; final ByteBuffer buffer = packToByteBuffer(stateInfo, properties); final List players = ImmutableList.copyOf(stateInfo.world.playerEntities); - System.out.println( - "Sending [" + stateInfo.pos + "] to [" + players + "] with [" + properties + "]!"); players.forEach(player -> sendTo(player, buffer)); } - @SubscribeEvent - public static void onPlayerJoin(final PlayerLoggedInEvent event) { - System.out.println("Called PlayerLoggedIn for [" + event.player + "]!"); - final EntityPlayer player = event.player; - final Map> properties; - synchronized (CURRENTLY_LOADED_STATES) { - properties = ImmutableMap.copyOf(CURRENTLY_LOADED_STATES); - } - properties.forEach((info, map) -> sendTo(info, map, player)); - } - @SubscribeEvent public static void onEntityJoinWorldEvent(final EntityJoinWorldEvent event) { - System.out.println("Called EntityJoinWorldEvent for [" + event.getEntity() + "]!"); final Entity entity = event.getEntity(); if (!(entity instanceof EntityPlayer)) return; From 8f75a8719684664e475ff15f1392fb101573965c Mon Sep 17 00:00:00 2001 From: Cedric Date: Fri, 16 Jan 2026 13:58:15 +0100 Subject: [PATCH 09/61] feat: first try for new networking --- .../signals/guis/ContainerSignalBox.java | 106 ++++- .../network/SignalBoxNetworkHandler.java | 370 ++++++++++++++++++ .../signals/network/SignalBoxNetworkMode.java | 53 +++ .../signalbox/entrys/PathOptionEntry.java | 23 ++ 4 files changed, 539 insertions(+), 13 deletions(-) create mode 100644 src/main/java/com/troblecodings/signals/network/SignalBoxNetworkHandler.java create mode 100644 src/main/java/com/troblecodings/signals/network/SignalBoxNetworkMode.java diff --git a/src/main/java/com/troblecodings/signals/guis/ContainerSignalBox.java b/src/main/java/com/troblecodings/signals/guis/ContainerSignalBox.java index 2abe344fb..e04b3affa 100644 --- a/src/main/java/com/troblecodings/signals/guis/ContainerSignalBox.java +++ b/src/main/java/com/troblecodings/signals/guis/ContainerSignalBox.java @@ -55,15 +55,14 @@ public class ContainerSignalBox extends ContainerBase implements UIClientSync, IChunkLoadable { + public SignalBoxGrid grid; + public SignalBoxTileEntity tile; + protected final Map> greenSignals = new HashMap<>(); protected final Map> possibleSubsidiaries = new HashMap<>(); - protected final Map> enabledSubsidiaryTypes = - new HashMap<>(); + protected final Map> enabledSubsidiaryTypes = new HashMap<>(); protected final Map, PathType> nextPathways = new HashMap<>(); protected final Map> validInConnections = new HashMap<>(); - protected SignalBoxGrid grid; - private EntityPlayer player; - private final Map posForType = new HashMap<>(); - private SignalBoxTileEntity tile; + private final Map propertiesForType = new HashMap<>(); private Consumer infoUpdates; private Consumer> colorUpdates; private Runnable counterUpdater; @@ -85,7 +84,9 @@ public void sendAllDataToRemote() { buffer.putEnumValue(SignalBoxNetwork.SEND_GRID); buffer.putBlockPos(info.pos); grid.writeNetwork(buffer); - final StateInfo identifier = new StateInfo(info.world, tile.getPos()); + final StateInfo identifier = new StateInfo(info.world, tile.getBlockPos()); + final Map> possibleSubsidiaries = SignalBoxHandler + .getPossibleSubsidiaries(identifier); final Map positions = SignalBoxHandler.getAllLinkedPos(identifier); final Map, PathType> nextPathways = grid.getNextPathways(); buffer.putMap(positions, WriteBuffer.BLOCKPOS_CONSUMER, WriteBuffer.getEnumConsumer()); @@ -138,6 +139,58 @@ public void deserializeClient(final ReadBuffer buffer) { if (!subsidiares.isEmpty()) { enabledSubsidiaryTypes.put(node.getPoint(), subsidiares); } + possibleSubsidiaries.put(signalPos, validSubsidiaries); + } + final int size = buffer.getInt(); + for (int i = 0; i < size; i++) { + final BlockPos blockPos = buffer.getBlockPos(); + final LinkType type = LinkType.of(buffer); + propertiesForType.put(blockPos, type); + } + final int nextPathwaySize = buffer.getByteToUnsignedInt(); + for (int i = 0; i < nextPathwaySize; i++) { + final Point start = Point.of(buffer); + final Point end = Point.of(buffer); + final PathType type = buffer.getEnumValue(PathType.class); + nextPathways.put(Maps.immutableEntry(start, end), type); + } + final int validInConnectionsSize = buffer.getByteToUnsignedInt(); + for (int i = 0; i < validInConnectionsSize; i++) { + final BlockPos boxPos = buffer.getBlockPos(); + final List points = new ArrayList<>(); + final int listSize = buffer.getByteToUnsignedInt(); + for (int j = 0; j < listSize; j++) { + points.add(Point.of(buffer)); + } + validInConnections.put(boxPos, points); + } + final int greenSignalsSize = buffer.getInt(); + for (int i = 0; i < greenSignalsSize; i++) { + final MainSignalIdentifier identifier = MainSignalIdentifier.of(buffer); + + final Map subsidiary = enabledSubsidiaryTypes + .getOrDefault(identifier.getPoint(), new HashMap<>()); + final SubsidiaryEntry entry = subsidiary.get(identifier.getModeSet()); + if (entry != null) { + identifier.state = SignalState + .combine(entry.enumValue.getSubsidiaryShowType()); + } + + final List greenSignals = this.greenSignals + .computeIfAbsent(identifier.getPoint(), _u -> new ArrayList<>()); + greenSignals.add(identifier); + } + enabledSubsidiaryTypes.forEach((point, map) -> { + map.forEach((modeSet, subsidiary) -> { + final MainSignalIdentifier identifier = new MainSignalIdentifier( + new ModeIdentifier(point, modeSet), + grid.getNode(point).getOption(modeSet).get() + .getEntry(PathEntryType.SIGNAL).get(), + SignalState.combine(subsidiary.enumValue.getSubsidiaryShowType())); + final List greenSignals = this.greenSignals + .computeIfAbsent(identifier.getPoint(), _u -> new ArrayList<>()); + greenSignals.add(identifier); + }); }); update(); loadPossibleSubsidiaires(); @@ -180,8 +233,35 @@ public void deserializeClient(final ReadBuffer buffer) { nextPathways.remove(Maps.immutableEntry(start, end)); break; } - case SET_SIGNAL_STATE: { - grid.readUpdateNetwork(buffer, false).forEach(updateSignalState); + case SET_SIGNALS: { + final List pointUpdates = new ArrayList<>(); + final int redSignalSize = buffer.getByteToUnsignedInt(); + for (int i = 0; i < redSignalSize; i++) { + final MainSignalIdentifier identifier = MainSignalIdentifier.of(buffer); + greenSignals.remove(identifier.getPoint()); + pointUpdates.add(identifier.getPoint()); + removeFromEnabledSubsidiaries(identifier); + } + final int greenSignalSize = buffer.getByteToUnsignedInt(); + for (int i = 0; i < greenSignalSize; i++) { + final MainSignalIdentifier modeIdentifier = MainSignalIdentifier.of(buffer); + final List greenSignals = this.greenSignals + .computeIfAbsent(modeIdentifier.getPoint(), _u -> new ArrayList<>()); + + final Map subsidiary = enabledSubsidiaryTypes + .getOrDefault(modeIdentifier.getPoint(), new HashMap<>()); + final SubsidiaryEntry entry = subsidiary.get(modeIdentifier.getModeSet()); + if (entry != null) { + modeIdentifier.state = SignalState + .combine(entry.enumValue.getSubsidiaryShowType()); + } + if (!greenSignals.contains(modeIdentifier)) { + greenSignals.add(modeIdentifier); + } + + pointUpdates.add(modeIdentifier.getPoint()); + } + signalUpdates.accept(pointUpdates); break; } case SEND_COUNTER: { @@ -223,8 +303,8 @@ public void deserializeServer(final ReadBuffer buffer) { final Point point = Point.of(buffer); final EnumGuiMode guiMode = EnumGuiMode.of(buffer); final Rotation rotation = deserializeRotation(buffer); - final PathEntryType entryType = - PathEntryType.ALL_ENTRIES.get(buffer.getByteToUnsignedInt()); + final PathEntryType entryType = PathEntryType.ALL_ENTRIES + .get(buffer.getByteToUnsignedInt()); final ModeSet modeSet = new ModeSet(guiMode, rotation); grid.getNode(point).getOption(modeSet) .ifPresent(entry -> entry.removeEntry(entryType)); @@ -387,8 +467,8 @@ private void deserializeEntry(final ReadBuffer buffer, final T type) { final Point point = Point.of(buffer); final EnumGuiMode guiMode = EnumGuiMode.of(buffer); final Rotation rotation = deserializeRotation(buffer); - final PathEntryType entryType = - (PathEntryType) PathEntryType.ALL_ENTRIES.get(buffer.getByteToUnsignedInt()); + final PathEntryType entryType = (PathEntryType) PathEntryType.ALL_ENTRIES + .get(buffer.getByteToUnsignedInt()); final SignalBoxNode node = tile.getSignalBoxGrid().getNode(point); final ModeSet modeSet = new ModeSet(guiMode, rotation); final Optional option = node.getOption(modeSet); diff --git a/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkHandler.java b/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkHandler.java new file mode 100644 index 000000000..617319332 --- /dev/null +++ b/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkHandler.java @@ -0,0 +1,370 @@ +package com.troblecodings.signals.network; + +import java.util.List; +import java.util.Objects; +import java.util.Optional; + +import com.troblecodings.core.ReadBuffer; +import com.troblecodings.core.WriteBuffer; +import com.troblecodings.core.interfaces.INetworkSync; +import com.troblecodings.signals.OpenSignalsMain; +import com.troblecodings.signals.core.ModeIdentifier; +import com.troblecodings.signals.core.StateInfo; +import com.troblecodings.signals.core.SubsidiaryEntry; +import com.troblecodings.signals.core.TrainNumber; +import com.troblecodings.signals.enums.PathType; +import com.troblecodings.signals.enums.PathwayRequestResult; +import com.troblecodings.signals.guis.ContainerSignalBox; +import com.troblecodings.signals.handler.SignalBoxHandler; +import com.troblecodings.signals.signalbox.ModeSet; +import com.troblecodings.signals.signalbox.Point; +import com.troblecodings.signals.signalbox.SignalBoxGrid; +import com.troblecodings.signals.signalbox.SignalBoxNode; +import com.troblecodings.signals.signalbox.SignalBoxPathway; +import com.troblecodings.signals.signalbox.entrys.IPathEntry; +import com.troblecodings.signals.signalbox.entrys.PathEntryType; +import com.troblecodings.signals.signalbox.entrys.PathOptionEntry; + +import net.minecraft.core.BlockPos; + +public class SignalBoxNetworkHandler implements INetworkSync { + + private static final boolean ADD = true; + private static final boolean REMOVE = false; + + private final SignalBoxNetworkMode GRID = new SignalBoxNetworkMode(this::readForGrid); + + private final SignalBoxNetworkMode ENTRY = new SignalBoxNetworkMode(this::readEntry); + + private final SignalBoxNetworkMode NODE_SPECIAL_ENTRIES = new SignalBoxNetworkMode( + this::readNodeSpecialEntries); + + private final SignalBoxNetworkMode PATHWAY = new SignalBoxNetworkMode(this::readPathwayAction); + + private final SignalBoxNetworkMode PATHWAY_SAVER = new SignalBoxNetworkMode( + this::readSavedPathway); + + private final SignalBoxNetworkMode SUBSIDIARY = new SignalBoxNetworkMode(this::readSubsidiary); + + private final SignalBoxNetworkMode TRAINNUMBER = new SignalBoxNetworkMode( + this::updateTrainNumber); + + private final SignalBoxNetworkMode DEBUG_POINTS = new SignalBoxNetworkMode( + this::readDebugPoints); + + private final ContainerSignalBox container; + + public SignalBoxNetworkHandler(final ContainerSignalBox container) { + this.container = container; + } + + public void sendAddEntry(final ModeIdentifier ident, final PathEntryType entryType, + final IPathEntry entry) { + final WriteBuffer buffer = getEntryBuffer(ident, entryType, ADD); + entry.writeNetwork(buffer); + sendBuffer(buffer); + } + + public void sendEntryRemove(final ModeIdentifier ident, final PathEntryType type) { + sendBuffer(getEntryBuffer(ident, type, REMOVE)); + } + + public void sendAll() { + final WriteBuffer buffer = getGridBuffer(GridNetworkMode.SEND_ALL); + getGrid().writeNetwork(buffer); + sendBuffer(buffer); + } + + public void sendCounter() { + final WriteBuffer buffer = getGridBuffer(GridNetworkMode.COUNTER); + buffer.putInt(getGrid().getCurrentCounter()); + sendBuffer(buffer); + } + + public void sendNodeLabel(final Point point, final String label) { + final WriteBuffer buffer = getPointBuffer(point, NodeNetworkMode.LABEL); + buffer.putString(label); + sendBuffer(buffer); + } + + public void sendAutoPoint(final Point point, final boolean autoPoint) { + final WriteBuffer buffer = getPointBuffer(point, NodeNetworkMode.AUTO_POINT); + buffer.putBoolean(autoPoint); + sendBuffer(buffer); + } + + public void sendRequestPathway(final Point p1, final Point p2, final PathType type) { + final WriteBuffer buffer = getPathwayBuffer(PathwayNetworkMode.REQUEST); + p1.writeNetwork(buffer); + p2.writeNetwork(buffer); + buffer.putEnumValue(type); + sendBuffer(buffer); + } + + public void sendResetPathway(final Point p1) { + final WriteBuffer buffer = getPathwayBuffer(PathwayNetworkMode.RESET); + p1.writeNetwork(buffer); + sendBuffer(buffer); + } + + public void sendRequestResponse(final PathwayRequestResult result) { + final WriteBuffer buffer = getPathwayBuffer(PathwayNetworkMode.RESPONSE); + buffer.putEnumValue(result); + sendBuffer(buffer); + } + + public void sendResetAllPathway() { + sendBuffer(getPathwayBuffer(PathwayNetworkMode.RESET_ALL_PATHWAYS)); + } + + public void sendResetAllSignals() { + sendBuffer(getPathwayBuffer(PathwayNetworkMode.RESET_ALL_SIGNALS)); + } + + public void sendAddSavedPathway(final Point start, final Point end, final PathType type, + final PathwayRequestResult result) { + final WriteBuffer buffer = getSavedPathwayBuffer(start, end); + buffer.putBoolean(ADD); + buffer.putEnumValue(type); + buffer.putEnumValue(result); + sendBuffer(buffer); + } + + public void sendRemoveSavedPathway(final Point start, final Point end) { + final WriteBuffer buffer = getSavedPathwayBuffer(start, end); + buffer.putBoolean(REMOVE); + sendBuffer(buffer); + } + + public void sendRemovePos(final BlockPos pos) { + final WriteBuffer buffer = getGridBuffer(GridNetworkMode.REMOVE_POS); + buffer.putBlockPos(pos); + sendBuffer(buffer); + } + + public void sendSubsidiary(final ModeIdentifier ident, final SubsidiaryEntry entry) { + final WriteBuffer buffer = SUBSIDIARY.getBuffer(); + ident.writeNetwork(buffer); + entry.writeNetwork(buffer); + sendBuffer(buffer); + } + + public void sendOutputUpdate(final Point point, final List list) { + final WriteBuffer buffer = getPointBuffer(point, NodeNetworkMode.MANUELL_OUTPUT); + // TODO Send list of outputs + sendBuffer(buffer); + } + + public void updateTrainNumber(final Point point, final TrainNumber number) { + final WriteBuffer buffer = TRAINNUMBER.getBuffer(); + point.writeNetwork(buffer); + number.writeNetwork(buffer); + sendBuffer(buffer); + } + + public void sendDebugPoints(final List points) { + final WriteBuffer buffer = DEBUG_POINTS.getBuffer(); + // TODO write List on Buffer + sendBuffer(buffer); + } + + private void readEntry(final ReadBuffer buffer) { + final boolean state = buffer.getBoolean(); + final ModeIdentifier ident = ModeIdentifier.of(buffer); + final PathEntryType entryType = PathEntryType.ALL_ENTRIES.get(buffer.getInt()); + final SignalBoxNode node = getGrid().getNode(ident.point); + final Optional optionEntry = node.getOption(ident.mode); + if (state == REMOVE) { + optionEntry.ifPresent(entry -> entry.removeEntry(entryType)); + return; + } + final IPathEntry entry = entryType.newValue(); + entry.readNetwork(buffer); + optionEntry.ifPresent(e -> e.addEntry(entryType, entry)); + } + + private void readForGrid(final ReadBuffer buffer) { + final SignalBoxGrid grid = getGrid(); + final GridNetworkMode mode = buffer.getEnumValue(GridNetworkMode.class); + if (mode.equals(GridNetworkMode.SEND_ALL)) { + grid.readNetwork(buffer); + } else if (mode.equals(GridNetworkMode.COUNTER)) { + grid.setCurrentCounter(buffer.getInt()); + } else { + final BlockPos pos = buffer.getBlockPos(); + SignalBoxHandler.unlinkPosFromSignalBox( + new StateInfo(container.tile.getLevel(), container.tile.getBlockPos()), pos); + } + } + + private void readNodeSpecialEntries(final ReadBuffer buffer) { + final NodeNetworkMode mode = buffer.getEnumValue(NodeNetworkMode.class); + final Point point = Point.of(buffer); + final SignalBoxNode node = getGrid().getNode(point); + if (mode.equals(NodeNetworkMode.LABEL)) { + node.setCustomText(buffer.getString()); + } else if (mode.equals(NodeNetworkMode.AUTO_POINT)) { + node.setAutoPoint(buffer.getBoolean()); + getGrid().updatePathwayToAutomatic(point); + } else { + // TODO Set List of manuellOutputs on Node + } + } + + private void readPathwayAction(final ReadBuffer buffer) { + final SignalBoxGrid grid = getGrid(); + final PathwayNetworkMode mode = buffer.getEnumValue(PathwayNetworkMode.class); + if (mode.equals(PathwayNetworkMode.RESPONSE)) { + final PathwayRequestResult result = buffer.getEnumValue(PathwayRequestResult.class); + // TODO Send to Container/GUI + } + if (mode.equals(PathwayNetworkMode.RESET_ALL_PATHWAYS)) { + grid.resetAllPathways(); + return; + } + if (mode.equals(PathwayNetworkMode.RESET_ALL_SIGNALS)) { + grid.resetAllSignals(); + return; + } + final Point p1 = Point.of(buffer); + if (mode.equals(PathwayNetworkMode.RESET)) { + resetPathway(p1); + return; + } + final Point p2 = Point.of(buffer); + final PathType type = buffer.getEnumValue(PathType.class); + final PathwayRequestResult request = grid.requestWay(p1, p2, type); + if (!request.isPass()) { + final SignalBoxNode endNode = grid.getNode(p2); + if (request.canBeAddedToSaver() && type.equals(PathType.NORMAL) + && !endNode.containsOutConnection() && grid.addNextPathway(p1, p2, type)) { + sendAddSavedPathway(p1, p2, type, request); + return; + } + sendRequestResponse(request); + } + } + + private void resetPathway(final Point p1) { + final SignalBoxGrid grid = getGrid(); + final SignalBoxPathway pw = grid.getPathwayByStartPoint(p1); + final boolean isShuntingPath = pw != null ? pw.isShuntingPath() : false; + if (grid.resetPathway(p1) && !isShuntingPath) { + grid.countOne(); + sendCounter(); + } + } + + private void readSavedPathway(final ReadBuffer buffer) { + final Point start = Point.of(buffer); + final Point end = Point.of(buffer); + final boolean state = buffer.getBoolean(); + if (state == REMOVE) + // TODO Remove from Container + return; + final PathType type = buffer.getEnumValue(PathType.class); + final PathwayRequestResult result = buffer.getEnumValue(PathwayRequestResult.class); + // TODO set in Container + } + + private void readSubsidiary(final ReadBuffer buffer) { + final ModeIdentifier ident = ModeIdentifier.of(buffer); + final SubsidiaryEntry entry = SubsidiaryEntry.of(buffer); + // TODO Set of Subsidioary + } + + private void updateTrainNumber(final ReadBuffer buffer) { + final Point point = Point.of(buffer); + final TrainNumber number = TrainNumber.of(buffer); + // TODO Update trainnumber + } + + private void readDebugPoints(final ReadBuffer buffer) { + // TODO Read Debug List + } + + private WriteBuffer getSavedPathwayBuffer(final Point p1, final Point p2) { + final WriteBuffer buffer = PATHWAY_SAVER.getBuffer(); + p1.writeNetwork(buffer); + p2.writeNetwork(buffer); + return buffer; + } + + private WriteBuffer getPointBuffer(final Point point, final NodeNetworkMode mode) { + final WriteBuffer buffer = NODE_SPECIAL_ENTRIES.getBuffer(); + buffer.putEnumValue(mode); + point.writeNetwork(buffer); + return buffer; + } + + private WriteBuffer getGridBuffer(final GridNetworkMode mode) { + final WriteBuffer buffer = GRID.getBuffer(); + buffer.putEnumValue(mode); + return buffer; + } + + private WriteBuffer getPathwayBuffer(final PathwayNetworkMode mode) { + final WriteBuffer buffer = PATHWAY.getBuffer(); + buffer.putEnumValue(mode); + return buffer; + } + + private WriteBuffer getEntryBuffer(final ModeIdentifier ident, final PathEntryType type, + final boolean state) { + final WriteBuffer buffer = ENTRY.getBuffer(); + buffer.putBoolean(state); + ident.writeNetwork(buffer); + buffer.putInt(type.getID()); + return buffer; + } + + protected SignalBoxGrid getGrid() { + return container.grid; + } + + @Override + public void deserializeClient(final ReadBuffer buf) { + executeRead(buf); + } + + @Override + public void deserializeServer(final ReadBuffer buf) { + executeRead(buf); + } + + private void executeRead(final ReadBuffer buffer) { + final SignalBoxNetworkMode mode = SignalBoxNetworkMode.getModeFromBuffer(buffer); + mode.executeRead(buffer); + } + + private void sendBuffer(final WriteBuffer buffer) { + OpenSignalsMain.network.sendTo(container.getPlayer(), buffer); + } + + @Override + public int hashCode() { + return Objects.hash(container); + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) + return true; + if ((obj == null) || (getClass() != obj.getClass())) + return false; + SignalBoxNetworkHandler other = (SignalBoxNetworkHandler) obj; + return Objects.equals(container, other.container); + } + + private static enum PathwayNetworkMode { + REQUEST, RESET, RESPONSE, RESET_ALL_PATHWAYS, RESET_ALL_SIGNALS; + } + + private static enum NodeNetworkMode { + LABEL, AUTO_POINT, MANUELL_OUTPUT; + } + + private static enum GridNetworkMode { + SEND_ALL, COUNTER, REMOVE_POS; + } +} \ No newline at end of file diff --git a/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkMode.java b/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkMode.java new file mode 100644 index 000000000..18f08bfaf --- /dev/null +++ b/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkMode.java @@ -0,0 +1,53 @@ +package com.troblecodings.signals.network; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.function.Consumer; + +import com.troblecodings.core.ReadBuffer; +import com.troblecodings.core.WriteBuffer; + +public class SignalBoxNetworkMode { + + private static final List NETWORK_ENTRIES = new ArrayList<>(); + + private int id; + private final Consumer read; + + public SignalBoxNetworkMode(final Consumer read) { + this.read = read; + this.id = NETWORK_ENTRIES.size(); + NETWORK_ENTRIES.add(this); + } + + public static SignalBoxNetworkMode getModeFromBuffer(final ReadBuffer buffer) { + return NETWORK_ENTRIES.get(buffer.getInt()); + } + + public void executeRead(final ReadBuffer buffer) { + read.accept(buffer); + } + + public WriteBuffer getBuffer() { + final WriteBuffer buffer = new WriteBuffer(); + buffer.putInt(id); + return buffer; + } + + @Override + public int hashCode() { + return Objects.hash(id, read); + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) + return true; + if ((obj == null) || (getClass() != obj.getClass())) + return false; + final SignalBoxNetworkMode other = (SignalBoxNetworkMode) obj; + return id == other.id && Objects.equals(read, other.read); + } + +} \ No newline at end of file diff --git a/src/main/java/com/troblecodings/signals/signalbox/entrys/PathOptionEntry.java b/src/main/java/com/troblecodings/signals/signalbox/entrys/PathOptionEntry.java index 58545c466..791bc0c5b 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/entrys/PathOptionEntry.java +++ b/src/main/java/com/troblecodings/signals/signalbox/entrys/PathOptionEntry.java @@ -36,6 +36,14 @@ public void setEntry(final PathEntryType type, final T value) { pathEntry.setValue(value); } + public void addEntry(final PathEntryType entryType, final IPathEntry entry) { + if (entryType == null) { + pathEntrys.remove(entryType); + return; + } + pathEntrys.put(entryType, entry); + } + public void removeEntry(final PathEntryType type) { pathEntrys.remove(type); } @@ -107,4 +115,19 @@ public void writeNetwork(final WriteBuffer buffer) { WriteBuffer.getINetworkSaveableConsumer()); } + public void writeUpdateNetwork(final WriteBuffer builder) { + int size = 0; + for (final PathEntryType entry : pathEntrys.keySet()) { + if (entry.equals(PathEntryType.PATHUSAGE) || entry.equals(PathEntryType.TRAINNUMBER)) { + size++; + } + } + builder.putByte((byte) size); + pathEntrys.forEach((mode, entry) -> { + if (mode.equals(PathEntryType.PATHUSAGE) || mode.equals(PathEntryType.TRAINNUMBER)) { + builder.putByte((byte) mode.getID()); + entry.writeNetwork(builder); + } + }); + } } \ No newline at end of file From 39d784c324f0ac801add5790109eae9279a52c2e Mon Sep 17 00:00:00 2001 From: Cedric Date: Tue, 20 Jan 2026 00:13:59 +0100 Subject: [PATCH 10/61] ref: changed networking system for signal box --- .../signals/core/NetworkBufferWrappers.java | 12 +- .../signals/enums/SignalBoxNetwork.java | 12 - .../signals/guis/ContainerSignalBox.java | 513 +++++------------- .../signals/guis/GuiSignalBox.java | 389 ++----------- .../signals/guis/ModeDropDownBoxUI.java | 41 +- .../troblecodings/signals/guis/SidePanel.java | 50 +- .../PathOptionEntryNetworkHandler.java | 55 ++ .../network/SignalBoxNetworkHandler.java | 260 ++++++--- .../signals/network/SignalBoxNetworkMode.java | 10 +- .../signalbox/InterSignalBoxPathway.java | 38 +- .../signals/signalbox/PathwayData.java | 23 +- .../signals/signalbox/SignalBoxGrid.java | 68 +-- .../signals/signalbox/SignalBoxNode.java | 112 +++- .../signals/signalbox/SignalBoxPathway.java | 71 +-- .../signals/signalbox/debug/DebugFactory.java | 7 +- .../signalbox/debug/DebugOptionEntry.java | 6 +- .../signalbox/debug/SignalBoxFactory.java | 5 +- .../signalbox/entrys/PathOptionEntry.java | 20 +- 18 files changed, 638 insertions(+), 1054 deletions(-) delete mode 100644 src/main/java/com/troblecodings/signals/enums/SignalBoxNetwork.java create mode 100644 src/main/java/com/troblecodings/signals/network/PathOptionEntryNetworkHandler.java diff --git a/src/main/java/com/troblecodings/signals/core/NetworkBufferWrappers.java b/src/main/java/com/troblecodings/signals/core/NetworkBufferWrappers.java index a6d4b315c..b415af6b7 100644 --- a/src/main/java/com/troblecodings/signals/core/NetworkBufferWrappers.java +++ b/src/main/java/com/troblecodings/signals/core/NetworkBufferWrappers.java @@ -7,6 +7,7 @@ import com.troblecodings.core.WriteBuffer; import com.troblecodings.signals.SEProperty; import com.troblecodings.signals.blocks.Signal; +import com.troblecodings.signals.network.SignalBoxNetworkHandler; import com.troblecodings.signals.signalbox.Point; import com.troblecodings.signals.signalbox.SignalBoxNode; import com.troblecodings.signals.signalbox.entrys.PathEntryType; @@ -33,14 +34,17 @@ public static BiConsumer getSEPropertyConsumer(final Si public static final Function> PATHENTRYTYPE_FUNCTION = buf -> PathEntryType.ALL_ENTRIES .get(buf.getByteToUnsignedInt()); - public static Function getSignalBoxNodeFunc() { + public static Function getSignalBoxNodeFunc( + final SignalBoxNetworkHandler network) { return buffer -> getSignalBoxNodeFunc( - ReadBuffer.getINetworkSaveableFunction(Point.class).apply(buffer)).apply(buffer); + ReadBuffer.getINetworkSaveableFunction(Point.class).apply(buffer), network) + .apply(buffer); } - public static Function getSignalBoxNodeFunc(final Point point) { + public static Function getSignalBoxNodeFunc(final Point point, + final SignalBoxNetworkHandler network) { return buffer -> { - final SignalBoxNode node = new SignalBoxNode(point); + final SignalBoxNode node = new SignalBoxNode(point, network); node.readNetwork(buffer); return node; }; diff --git a/src/main/java/com/troblecodings/signals/enums/SignalBoxNetwork.java b/src/main/java/com/troblecodings/signals/enums/SignalBoxNetwork.java deleted file mode 100644 index 083ae3ddd..000000000 --- a/src/main/java/com/troblecodings/signals/enums/SignalBoxNetwork.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.troblecodings.signals.enums; - -public enum SignalBoxNetwork { - - SEND_POS_ENTRY, SEND_INT_ENTRY, REMOVE_ENTRY, REQUEST_PW, REMOVE_POS, RESET_PW, SEND_GRID, - SEND_PW_UPDATE, RESET_ALL_PW, SEND_CHANGED_MODES, REQUEST_LINKED_POS, PW_REQUEST_RESPONSE, - REQUEST_SUBSIDIARY, SEND_ZS2_ENTRY, UPDATE_RS_OUTPUT, OUTPUT_UPDATE, RESET_SUBSIDIARY, - SET_AUTO_POINT, SEND_NAME, SEND_BOOL_ENTRY, ADDED_TO_SAVER, REMOVE_SAVEDPW, SEND_POINT_ENTRY, - SET_SIGNAL_STATE, SEND_COUNTER, SEND_TRAIN_NUMBER, RESET_ALL_SIGNALS, SEND_POSIDENT_LIST, - SEND_CONNECTED_TRAINNUMBERS, SEND_ZS6_ENTRY, SEND_DEBUG_POINTS; - -} \ No newline at end of file diff --git a/src/main/java/com/troblecodings/signals/guis/ContainerSignalBox.java b/src/main/java/com/troblecodings/signals/guis/ContainerSignalBox.java index e04b3affa..389c93737 100644 --- a/src/main/java/com/troblecodings/signals/guis/ContainerSignalBox.java +++ b/src/main/java/com/troblecodings/signals/guis/ContainerSignalBox.java @@ -4,7 +4,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Optional; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; @@ -20,31 +19,25 @@ import com.troblecodings.signals.blocks.Signal; import com.troblecodings.signals.contentpacks.SubsidiarySignalParser; import com.troblecodings.signals.core.ModeIdentifier; -import com.troblecodings.signals.core.PosIdentifier; import com.troblecodings.signals.core.StateInfo; import com.troblecodings.signals.core.SubsidiaryState; -import com.troblecodings.signals.core.TrainNumber; -import com.troblecodings.signals.enums.EnumGuiMode; import com.troblecodings.signals.enums.LinkType; import com.troblecodings.signals.enums.PathType; -import com.troblecodings.signals.enums.PathwayRequestResult; import com.troblecodings.signals.enums.PathwayRequestResult.PathwayRequestMode; -import com.troblecodings.signals.enums.SignalBoxNetwork; import com.troblecodings.signals.handler.ClientSignalStateHandler; import com.troblecodings.signals.handler.SignalBoxHandler; import com.troblecodings.signals.handler.SignalStateInfo; +import com.troblecodings.signals.network.SignalBoxNetworkHandler; import com.troblecodings.signals.properties.PredicatedPropertyBase.ConfigProperty; import com.troblecodings.signals.signalbox.MainSignalIdentifier.SignalState; import com.troblecodings.signals.signalbox.ModeSet; import com.troblecodings.signals.signalbox.Point; import com.troblecodings.signals.signalbox.SignalBoxGrid; import com.troblecodings.signals.signalbox.SignalBoxNode; -import com.troblecodings.signals.signalbox.SignalBoxPathway; import com.troblecodings.signals.signalbox.SignalBoxTileEntity; import com.troblecodings.signals.signalbox.config.ResetInfo; import com.troblecodings.signals.signalbox.config.SignalConfig; import com.troblecodings.signals.signalbox.entrys.PathEntryType; -import com.troblecodings.signals.signalbox.entrys.PathOptionEntry; import com.troblecodings.signals.tileentitys.IChunkLoadable; import net.minecraft.block.Block; @@ -62,12 +55,15 @@ public class ContainerSignalBox extends ContainerBase implements UIClientSync, I protected final Map> enabledSubsidiaryTypes = new HashMap<>(); protected final Map, PathType> nextPathways = new HashMap<>(); protected final Map> validInConnections = new HashMap<>(); - private final Map propertiesForType = new HashMap<>(); + protected SignalBoxGrid grid; + protected SignalBoxTileEntity tile; + + private final Map posForType = new HashMap<>(); private Consumer infoUpdates; - private Consumer> colorUpdates; + private Consumer nodeUpdate; private Runnable counterUpdater; - private Consumer> trainNumberUpdater; private Consumer> debugPoints; + private SignalBoxNetworkHandler network = new SignalBoxNetworkHandler(); protected Consumer updateSignalState = (node) -> { }; @@ -80,10 +76,12 @@ public ContainerSignalBox(final GuiInfo info) { @Override public void sendAllDataToRemote() { this.grid = tile.getSignalBoxGrid(); - final WriteBuffer buffer = new WriteBuffer(); - buffer.putEnumValue(SignalBoxNetwork.SEND_GRID); - buffer.putBlockPos(info.pos); - grid.writeNetwork(buffer); + initializeNetwork(); + sendInitialisationPacket(); + network.sendAll(); + } + + public void addAdditionalInitialisationData(final WriteBuffer buffer) { final StateInfo identifier = new StateInfo(info.world, tile.getBlockPos()); final Map> possibleSubsidiaries = SignalBoxHandler .getPossibleSubsidiaries(identifier); @@ -109,183 +107,49 @@ public void sendAllDataToRemote() { }); buffer.putMap(validInConnections, WriteBuffer.BLOCKPOS_CONSUMER, (b, list) -> b.putISaveableList(list)); - OpenSignalsMain.network.sendTo(info.player, buffer); } - @Override - public void deserializeClient(final ReadBuffer buffer) { - final SignalBoxNetwork mode = buffer.getEnumValue(SignalBoxNetwork.class); - switch (mode) { - case SEND_GRID: { - final BlockPos pos = buffer.getBlockPos(); - if (this.tile == null) { - this.tile = (SignalBoxTileEntity) info.world.getTileEntity(pos); - } - grid = tile.getSignalBoxGrid(); - grid.readNetwork(buffer); - posForType.clear(); - nextPathways.clear(); - validInConnections.clear(); - posForType.putAll(buffer.getMap(ReadBuffer.BLOCKPOS_FUNCTION, - ReadBuffer.getEnumFunction(LinkType.class))); - nextPathways - .putAll(buffer.getMap((b -> Maps.immutableEntry(Point.of(b), Point.of(b))), - b -> b.getEnumValue(PathType.class))); - validInConnections.putAll(buffer.getMap(ReadBuffer.BLOCKPOS_FUNCTION, - b -> b.getList(ReadBuffer.getINetworkSaveableFunction(Point.class)))); - grid.getNodes().forEach(node -> { - final Map subsidiares = - new HashMap<>(node.getSubsidiaryStates()); - if (!subsidiares.isEmpty()) { - enabledSubsidiaryTypes.put(node.getPoint(), subsidiares); - } - possibleSubsidiaries.put(signalPos, validSubsidiaries); - } - final int size = buffer.getInt(); - for (int i = 0; i < size; i++) { - final BlockPos blockPos = buffer.getBlockPos(); - final LinkType type = LinkType.of(buffer); - propertiesForType.put(blockPos, type); - } - final int nextPathwaySize = buffer.getByteToUnsignedInt(); - for (int i = 0; i < nextPathwaySize; i++) { - final Point start = Point.of(buffer); - final Point end = Point.of(buffer); - final PathType type = buffer.getEnumValue(PathType.class); - nextPathways.put(Maps.immutableEntry(start, end), type); - } - final int validInConnectionsSize = buffer.getByteToUnsignedInt(); - for (int i = 0; i < validInConnectionsSize; i++) { - final BlockPos boxPos = buffer.getBlockPos(); - final List points = new ArrayList<>(); - final int listSize = buffer.getByteToUnsignedInt(); - for (int j = 0; j < listSize; j++) { - points.add(Point.of(buffer)); - } - validInConnections.put(boxPos, points); - } - final int greenSignalsSize = buffer.getInt(); - for (int i = 0; i < greenSignalsSize; i++) { - final MainSignalIdentifier identifier = MainSignalIdentifier.of(buffer); - - final Map subsidiary = enabledSubsidiaryTypes - .getOrDefault(identifier.getPoint(), new HashMap<>()); - final SubsidiaryEntry entry = subsidiary.get(identifier.getModeSet()); - if (entry != null) { - identifier.state = SignalState - .combine(entry.enumValue.getSubsidiaryShowType()); - } - - final List greenSignals = this.greenSignals - .computeIfAbsent(identifier.getPoint(), _u -> new ArrayList<>()); - greenSignals.add(identifier); - } - enabledSubsidiaryTypes.forEach((point, map) -> { - map.forEach((modeSet, subsidiary) -> { - final MainSignalIdentifier identifier = new MainSignalIdentifier( - new ModeIdentifier(point, modeSet), - grid.getNode(point).getOption(modeSet).get() - .getEntry(PathEntryType.SIGNAL).get(), - SignalState.combine(subsidiary.enumValue.getSubsidiaryShowType())); - final List greenSignals = this.greenSignals - .computeIfAbsent(identifier.getPoint(), _u -> new ArrayList<>()); - greenSignals.add(identifier); - }); - }); - update(); - loadPossibleSubsidiaires(); - break; - } - case SEND_PW_UPDATE: { - colorUpdates.accept(grid.readUpdateNetwork(buffer, true)); - break; - } - case PW_REQUEST_RESPONSE: { - final PathwayRequestMode result = buffer.getEnumValue(PathwayRequestMode.class); - infoUpdates.accept(I18Wrapper.format("error." + result.getName())); - break; - } - case ADDED_TO_SAVER: { - final PathwayRequestMode result = buffer.getEnumValue(PathwayRequestMode.class); - final Point start = Point.of(buffer); - final Point end = Point.of(buffer); - final PathType type = buffer.getEnumValue(PathType.class); - nextPathways.put(Maps.immutableEntry(start, end), type); - infoUpdates.accept(I18Wrapper.format("error." + result.getName()) + " - " - + I18Wrapper.format("info.pathwaysaver")); - break; - } - case OUTPUT_UPDATE: { - final Point point = Point.of(buffer); - final ModeSet modeSet = ModeSet.of(buffer); - final boolean state = buffer.getBoolean(); - final SignalBoxNode node = grid.getNode(point); - if (state) { - node.addManuellOutput(modeSet); - } else { - node.removeManuellOutput(modeSet); - } - break; - } - case REMOVE_SAVEDPW: { - final Point start = Point.of(buffer); - final Point end = Point.of(buffer); - nextPathways.remove(Maps.immutableEntry(start, end)); - break; + public void readAdditionalInitialisationData(final ReadBuffer buffer) { + posForType.clear(); + nextPathways.clear(); + validInConnections.clear(); + posForType.putAll(buffer.getMap(ReadBuffer.BLOCKPOS_FUNCTION, + ReadBuffer.getEnumFunction(LinkType.class))); + nextPathways.putAll(buffer.getMap((b -> Maps.immutableEntry(Point.of(b), Point.of(b))), + b -> b.getEnumValue(PathType.class))); + validInConnections.putAll(buffer.getMap(ReadBuffer.BLOCKPOS_FUNCTION, + b -> b.getList(ReadBuffer.getINetworkSaveableFunction(Point.class)))); + grid.getNodes().forEach(node -> { + final Map subsidiares = new HashMap<>( + node.getSubsidiaryStates()); + if (!subsidiares.isEmpty()) { + enabledSubsidiaryTypes.put(node.getPoint(), subsidiares); } - case SET_SIGNALS: { - final List pointUpdates = new ArrayList<>(); - final int redSignalSize = buffer.getByteToUnsignedInt(); - for (int i = 0; i < redSignalSize; i++) { - final MainSignalIdentifier identifier = MainSignalIdentifier.of(buffer); - greenSignals.remove(identifier.getPoint()); - pointUpdates.add(identifier.getPoint()); - removeFromEnabledSubsidiaries(identifier); - } - final int greenSignalSize = buffer.getByteToUnsignedInt(); - for (int i = 0; i < greenSignalSize; i++) { - final MainSignalIdentifier modeIdentifier = MainSignalIdentifier.of(buffer); - final List greenSignals = this.greenSignals - .computeIfAbsent(modeIdentifier.getPoint(), _u -> new ArrayList<>()); - - final Map subsidiary = enabledSubsidiaryTypes - .getOrDefault(modeIdentifier.getPoint(), new HashMap<>()); - final SubsidiaryEntry entry = subsidiary.get(modeIdentifier.getModeSet()); - if (entry != null) { - modeIdentifier.state = SignalState - .combine(entry.enumValue.getSubsidiaryShowType()); - } - if (!greenSignals.contains(modeIdentifier)) { - greenSignals.add(modeIdentifier); - } + }); + update(); + loadPossibleSubsidiaires(); + } - pointUpdates.add(modeIdentifier.getPoint()); - } - signalUpdates.accept(pointUpdates); - break; - } - case SEND_COUNTER: { - grid.setCounter(buffer.getInt()); - counterUpdater.run(); - break; - } - case SEND_TRAIN_NUMBER: { - trainNumberUpdater.accept(buffer.getList(buf -> { - final Point point = Point.of(buffer); - final SignalBoxNode node = grid.getNode(point); - node.readNetwork(buffer); - return node; - })); - break; - } - case SEND_DEBUG_POINTS: { - debugPoints.accept( - buffer.getList(ReadBuffer.getINetworkSaveableFunction(Point.class))); - break; - } - default: - break; + private void sendInitialisationPacket() { + final WriteBuffer buffer = new WriteBuffer(); + buffer.putBlockPos(info.pos); + OpenSignalsMain.network.sendTo(getPlayer(), buffer); + } + + public SignalBoxNetworkHandler getNetwork() { + return network; + } + + @Override + public void deserializeClient(final ReadBuffer buffer) { + if (tile == null) { + final BlockPos pos = buffer.getBlockPos(); + this.tile = (SignalBoxTileEntity) info.world.getBlockEntity(pos); + this.grid = tile.getSignalBoxGrid(); + initializeNetwork(); + return; } + network.desirializeBuffer(buffer); } @Override @@ -293,194 +157,55 @@ public void deserializeServer(final ReadBuffer buffer) { if (grid == null) { grid = tile.getSignalBoxGrid(); } - final SignalBoxNetwork mode = buffer.getEnumValue(SignalBoxNetwork.class); - switch (mode) { - case SEND_INT_ENTRY: { - deserializeEntry(buffer, buffer.getByteToUnsignedInt()); - break; - } - case REMOVE_ENTRY: { - final Point point = Point.of(buffer); - final EnumGuiMode guiMode = EnumGuiMode.of(buffer); - final Rotation rotation = deserializeRotation(buffer); - final PathEntryType entryType = PathEntryType.ALL_ENTRIES - .get(buffer.getByteToUnsignedInt()); - final ModeSet modeSet = new ModeSet(guiMode, rotation); - grid.getNode(point).getOption(modeSet) - .ifPresent(entry -> entry.removeEntry(entryType)); - break; - } - case SEND_POS_ENTRY: { - deserializeEntry(buffer, buffer.getBlockPos()); - break; - } - case SEND_ZS2_ENTRY: { - deserializeEntry(buffer, buffer.getByte()); - break; - } - case SEND_ZS6_ENTRY: { - deserializeEntry(buffer, buffer.getTcBoolean()); - break; - } - case REMOVE_POS: { - final BlockPos pos = buffer.getBlockPos(); - SignalBoxHandler - .unlinkPosFromSignalBox(new StateInfo(tile.getWorld(), tile.getPos()), pos); - break; - } - case RESET_PW: { - final Point point = Point.of(buffer); - final SignalBoxPathway pw = grid.getPathwayByStartPoint(point); - final boolean isShuntingPath = pw != null ? pw.isShuntingPath() : false; - if (grid.resetPathway(point) && !isShuntingPath) { - grid.count(); - final WriteBuffer sucess = new WriteBuffer(); - sucess.putEnumValue(SignalBoxNetwork.SEND_COUNTER); - sucess.putInt(grid.getCurrentCounter()); - OpenSignalsMain.network.sendTo(info.player, sucess); - } - break; - } - case REQUEST_PW: { - final Point start = Point.of(buffer); - final Point end = Point.of(buffer); - final PathType type = buffer.getEnumValue(PathType.class); - final PathwayRequestResult request = grid.requestWay(start, end, type); - if (!request.wasSuccesfull()) { - final SignalBoxNode endNode = grid.getNode(end); - if (request.canBeAddedToSaver(type) && !endNode.containsOutConnection() - && grid.addNextPathway(start, end, type)) { - final WriteBuffer sucess = new WriteBuffer(); - sucess.putEnumValue(SignalBoxNetwork.ADDED_TO_SAVER); - sucess.putEnumValue(request.getMode()); - start.writeNetwork(sucess); - end.writeNetwork(sucess); - sucess.putEnumValue(type); - OpenSignalsMain.network.sendTo(info.player, sucess); - break; - } - final WriteBuffer error = new WriteBuffer(); - error.putEnumValue(SignalBoxNetwork.PW_REQUEST_RESPONSE); - error.putEnumValue(request.getMode()); - OpenSignalsMain.network.sendTo(info.player, error); - } - break; - } - case RESET_ALL_PW: { - grid.resetAllPathways(); - break; - } - case SEND_CHANGED_MODES: { - grid.readUpdateNetwork(buffer, true); - break; - } - case REQUEST_SUBSIDIARY: { - final SubsidiaryState entry = SubsidiaryState.of(buffer); - final Point point = Point.of(buffer); - final ModeSet modeSet = ModeSet.of(buffer); - final boolean enable = buffer.getBoolean(); - updateServerSubsidiary(point, modeSet, entry, enable); - break; - } - case UPDATE_RS_OUTPUT: { - final Point point = Point.of(buffer); - final ModeSet modeSet = ModeSet.of(buffer); - final boolean state = buffer.getBoolean(); - final BlockPos pos = grid.updateManuellRSOutput(point, modeSet, state); - if (pos != null) { - SignalBoxHandler.updateRedstoneOutput(new StateInfo(info.world, pos), state); - final WriteBuffer sucess = new WriteBuffer(); - sucess.putEnumValue(SignalBoxNetwork.OUTPUT_UPDATE); - point.writeNetwork(sucess); - modeSet.writeNetwork(sucess); - sucess.putBoolean(state); - OpenSignalsMain.network.sendTo(info.player, sucess); - } - break; - } - case SET_AUTO_POINT: { - final Point point = Point.of(buffer); - final boolean state = buffer.getBoolean(); - final SignalBoxNode node = tile.getSignalBoxGrid().getNode(point); - node.setAutoPoint(state); - grid.updatePathwayToAutomatic(point); - break; - } - case SEND_NAME: { - final Point point = Point.of(buffer); - final SignalBoxNode node = tile.getSignalBoxGrid().getNode(point); - node.setCustomText(buffer.getString()); - break; - } - case SEND_BOOL_ENTRY: { - deserializeEntry(buffer, buffer.getBoolean()); - break; - } - case REMOVE_SAVEDPW: { - final Point start = Point.of(buffer); - final Point end = Point.of(buffer); - grid.removeNextPathway(start, end); - break; - } - case SEND_POINT_ENTRY: { - deserializeEntry(buffer, Point.of(buffer)); - break; - } - case SEND_COUNTER: { - grid.setCounter(buffer.getInt()); - break; - } - case SEND_TRAIN_NUMBER: { - final Point point = Point.of(buffer); - final TrainNumber number = TrainNumber.of(buffer); - grid.updateTrainNumber(point, number); - break; - } - case RESET_ALL_SIGNALS: { - grid.resetAllSignals(); - break; - } - case SEND_POSIDENT_LIST: { - deserializeEntry(buffer, buffer - .getList(ReadBuffer.getINetworkSaveableFunction(PosIdentifier.class))); - break; - } - case SEND_CONNECTED_TRAINNUMBERS: { - deserializeEntry(buffer, ModeIdentifier.of(buffer)); - break; - } - case SET_SIGNAL_STATE: { - final Point point = Point.of(buffer); - final EnumGuiMode guiMode = EnumGuiMode.of(buffer); - final Rotation rotation = deserializeRotation(buffer); - final SignalState state = buffer.getEnumValue(SignalState.class); - grid.getNodeChecked(point) - .ifPresent(node -> node.updateState(new ModeSet(guiMode, rotation), state)); - } - default: - break; - } + network.desirializeBuffer(buffer); + tile.setChanged(); } - @SuppressWarnings("unchecked") - private void deserializeEntry(final ReadBuffer buffer, final T type) { - final Point point = Point.of(buffer); - final EnumGuiMode guiMode = EnumGuiMode.of(buffer); - final Rotation rotation = deserializeRotation(buffer); - final PathEntryType entryType = (PathEntryType) PathEntryType.ALL_ENTRIES - .get(buffer.getByteToUnsignedInt()); - final SignalBoxNode node = tile.getSignalBoxGrid().getNode(point); - final ModeSet modeSet = new ModeSet(guiMode, rotation); - final Optional option = node.getOption(modeSet); - if (option.isPresent()) { - option.get().setEntry(entryType, type); - } else { - node.addAndSetEntry(modeSet, entryType, type); - } + public void handlePathwayRequestResponse(final PathwayRequestMode result) { + if (!isClientSide()) + return; + infoUpdates.accept(I18Wrapper.format("error." + result.getName())); + } + + public void handleAddSavedPathway(final Point p1, final Point p2, final PathType type, + final PathwayRequestMode result) { + if (!isClientSide()) + return; + nextPathways.put(Maps.immutableEntry(p1, p2), type); + infoUpdates.accept(I18Wrapper.format("error." + result.getName()) + " - " + + I18Wrapper.format("info.pathwaysaver")); + } + + public void handleRemoveSavedPathway(final Point p1, final Point p2) { + if (!isClientSide()) + return; + nextPathways.remove(Maps.immutableEntry(p1, p2)); + } + + public void handleDebugPoints(final List debugPoints) { + if (!isClientSide()) + return; + this.debugPoints.accept(debugPoints); } - private static Rotation deserializeRotation(final ReadBuffer buffer) { - return Rotation.values()[buffer.getByteToUnsignedInt()]; + public void handleCounterUpdate() { + if (!isClientSide()) + return; + counterUpdater.run(); + } + + public void handleNodeUpdate(final SignalBoxNode node) { + if (!isClientSide()) + return; + nodeUpdate.accept(node); + + } + + private void initializeNetwork() { + if (grid == null) + return; + grid.setUpNetwork(this); + this.network.setUpNetwork(this); } private void loadPossibleSubsidiaires() { @@ -525,32 +250,48 @@ protected void updateClientSubsidiary(final Point point, final ModeSet mode, } } - private void updateServerSubsidiary(final Point point, final ModeSet mode, - final SubsidiaryState state, final boolean enable) { - final World world = tile.getWorld(); - grid.getNodeChecked(point).ifPresent((node) -> { - node.getOption(mode) + public void updateServerSubsidiary(final ModeIdentifier ident, final SubsidiaryState state, + final boolean enable) { + if (isClientSide()) + return; + final Level world = tile.getLevel(); + grid.getNodeChecked(ident.point).ifPresent((node) -> { + node.getOption(ident.mode) .ifPresent(entry -> entry.getEntry(PathEntryType.SIGNAL).ifPresent(pos -> { final Signal signal = SignalBoxHandler .getSignal(new StateInfo(world, tile.getPos()), pos); final SignalStateInfo info = new SignalStateInfo(world, pos, signal); if (enable) { SignalConfig.loadSubsidiary(info, state); - node.updateState(mode, + node.updateState(ident.mode, SignalState.combine(state.getSubsidiaryShowType())); - node.setSubsidiaryState(mode, state); + node.setSubsidiaryState(ident.mode, state); } else { SignalConfig.reset(new ResetInfo(info)); - node.updateState(mode, SignalState.RED); - node.removeSubsidiaryState(mode); + node.updateState(ident.mode, SignalState.RED); + node.removeSubsidiaryState(ident.mode); } })); }); } + public SignalBoxTileEntity getTile() { + return this.tile; + } + + public SignalBoxGrid getGrid() { + return this.grid; + } + + public boolean isClientSide() { + return this.info.world.isClientSide; + } + @Override - public void onContainerClosed(final EntityPlayer playerIn) { - super.onContainerClosed(playerIn); + public void removed(final Player playerIn) { + super.removed(playerIn); + grid.removeNetwork(); + network.removeNetwork(); if (this.tile != null) { this.tile.remove(this); } @@ -580,18 +321,14 @@ protected void setInfoConsumer(final Consumer consumer) { this.infoUpdates = consumer; } - protected void setColorUpdater(final Consumer> updater) { - this.colorUpdates = updater; + protected void setNodeUpdater(final Consumer consumer) { + this.nodeUpdate = consumer; } protected void setConuterUpdater(final Runnable run) { this.counterUpdater = run; } - protected void setTrainNumberUpdater(final Consumer> updater) { - this.trainNumberUpdater = updater; - } - protected void setDebugPointUpdater(final Consumer> points) { this.debugPoints = points; } diff --git a/src/main/java/com/troblecodings/signals/guis/GuiSignalBox.java b/src/main/java/com/troblecodings/signals/guis/GuiSignalBox.java index f79bd3d18..6abcc8b67 100644 --- a/src/main/java/com/troblecodings/signals/guis/GuiSignalBox.java +++ b/src/main/java/com/troblecodings/signals/guis/GuiSignalBox.java @@ -13,9 +13,6 @@ import java.util.stream.Collectors; import com.troblecodings.core.I18Wrapper; -import com.troblecodings.core.TCBoolean; -import com.troblecodings.core.WriteBuffer; -import com.troblecodings.guilib.ecs.ContainerBase; import com.troblecodings.guilib.ecs.DrawUtil.DisableIntegerable; import com.troblecodings.guilib.ecs.DrawUtil.EnumIntegerable; import com.troblecodings.guilib.ecs.DrawUtil.SizeIntegerables; @@ -38,7 +35,6 @@ import com.troblecodings.signals.OpenSignalsMain; import com.troblecodings.signals.config.ConfigHandler; import com.troblecodings.signals.core.ModeIdentifier; -import com.troblecodings.signals.core.PosIdentifier; import com.troblecodings.signals.core.StateInfo; import com.troblecodings.signals.core.SubsidiaryHolder; import com.troblecodings.signals.core.SubsidiaryState; @@ -49,16 +45,14 @@ import com.troblecodings.signals.enums.PathType; import com.troblecodings.signals.enums.PathwayRequestResult.PathwayRequestMode; import com.troblecodings.signals.enums.ShowTypes; -import com.troblecodings.signals.enums.SignalBoxNetwork; import com.troblecodings.signals.enums.SignalBoxPage; import com.troblecodings.signals.guis.UISignalBoxRendering.BoxEntity; import com.troblecodings.signals.guis.UISignalBoxRendering.SelectionType; import com.troblecodings.signals.guis.UISignalBoxRendering.SignalBoxConsumer; import com.troblecodings.signals.handler.ClientNameHandler; -import com.troblecodings.signals.handler.ClientRenderUpdate; +import com.troblecodings.signals.network.SignalBoxNetworkHandler; import com.troblecodings.signals.signalbox.MainSignalIdentifier.SignalState; import com.troblecodings.signals.signalbox.ModeSet; -import com.troblecodings.signals.signalbox.Path; import com.troblecodings.signals.signalbox.Point; import com.troblecodings.signals.signalbox.SignalBoxNode; import com.troblecodings.signals.signalbox.SignalBoxUtil; @@ -91,13 +85,11 @@ public class GuiSignalBox extends GuiBase { private final UIEntity lowerEntity = new UIEntity(); private final UIEntity bottomEntity = new UIEntity(); protected final ContainerSignalBox container; + protected final SignalBoxNetworkHandler network; private SignalBoxPage page = SignalBoxPage.OPERATION; private SignalBoxNode lastTile = null; private UIEntity mainButton; - private final GuiInfo info; - private final Map changedModes = new HashMap<>(); private UIEntity splitter = new UIEntity(); - private boolean allPacketsRecived = false; private SidePanel helpPage; protected UISignalBoxRendering rendering; protected final Map enabledSubsidiaries = new HashMap<>(); @@ -106,19 +98,24 @@ public class GuiSignalBox extends GuiBase { public GuiSignalBox(final GuiInfo info) { super(info); this.container = (ContainerSignalBox) info.base; + this.network = container.getNetwork(); container.setInfoConsumer(this::infoUpdate); - container.setColorUpdater(this::applyColorChanges); container.setConuterUpdater(this::updateCounter); - container.setTrainNumberUpdater(this::updateTrainNumbers); + container.setNodeUpdater(this::updateNode); container.updateSignalState = this::updateSignalState; - this.info = info; } public SignalBoxPage getPage() { return page; } - private void updateSignalState(final SignalBoxNode node) { + private void updateNode(final SignalBoxNode node) { + updateSignalState(node); + updateTrainNumbers(node); + updateColor(node); + } + + protected void updateSignalState(final SignalBoxNode node) { node.forEach((mode) -> { checkForSubsidiary(node, mode); rendering.updateSignalState(node.getPoint(), mode, node.getState(mode)); @@ -141,21 +138,19 @@ public void infoUpdate(final String errorString) { return; } - private void updateTrainNumbers(final List nodes) { - nodes.forEach(node -> { - node.iterator().forEachRemaining(modeSet -> { - if (!(modeSet.mode == EnumGuiMode.TRAIN_NUMBER)) - return; - node.getOption(modeSet).ifPresent(option -> { - final TrainNumber number = - option.getEntry(PathEntryType.TRAINNUMBER).orElse(TrainNumber.DEFAULT); - final ModeIdentifier modeIdent = new ModeIdentifier(node.getPoint(), modeSet); - if (number.trainNumber.isEmpty()) { - rendering.removeTrainNumber(modeIdent); - } else { - rendering.putTrainNumber(modeIdent, number.trainNumber); - } - }); + private void updateTrainNumbers(final SignalBoxNode node) { + node.iterator().forEachRemaining(modeSet -> { + if (!(modeSet.mode == EnumGuiMode.TRAIN_NUMBER)) + return; + node.getOption(modeSet).ifPresent(option -> { + final TrainNumber number = option.getEntry(PathEntryType.TRAINNUMBER) + .orElse(TrainNumber.DEFAULT); + final ModeIdentifier modeIdent = new ModeIdentifier(node.getPoint(), modeSet); + if (number.trainNumber.isEmpty()) { + rendering.removeTrainNumber(modeIdent); + } else { + rendering.putTrainNumber(modeIdent, number.trainNumber); + } }); }); } @@ -188,13 +183,11 @@ protected void selectLink(final UIEntity parent, final SignalBoxNode node, if (!option.getEntry(entryType).isPresent()) return; option.removeEntry(entryType); - removeEntryFromServer(node, mode, rotation, entryType); } else { final Optional pathEntry = option.getEntry(entryType); if (pathEntry.isPresent() && pathEntry.get().equals(setPos)) return; option.setEntry(entryType, setPos); - sendPosEntryToServer(setPos, node, mode, rotation, entryType); } }, option.getEntry(entryType).map(entry -> positions.indexOf(entry)).orElse(-1)); parent.add(blockSelect); @@ -212,7 +205,7 @@ public static String getSignalInfo(final BlockPos signalPos, final LinkType type protected void disableSubsidiary(final BlockPos pos, final SubsidiaryHolder holder) { final SubsidiaryState state = holder.entry; - sendSubsidiaryRequest(state, holder.point, holder.modeSet, false); + network.sendSubsidiary(new ModeIdentifier(holder.point, holder.modeSet), state, false); container.updateClientSubsidiary(holder.point, holder.modeSet, state, false); enabledSubsidiaries.remove(pos); helpPage.helpUsageMode(null); @@ -239,7 +232,6 @@ private void updateTileWithMode(final UIMenu menu, final UISignalBoxRendering re } else { rendering.addMode(point, modeSet); } - this.changedModes.put(point, container.grid.getNode(point)); } private void tileNormal(final UISignalBoxRendering rendering, final Point tile, @@ -284,7 +276,7 @@ private void checkForMultiplePathTypes(final SignalBoxNode start, final SignalBo infoUpdate( I18Wrapper.format("error." + PathwayRequestMode.NO_EQUAL_PATH_TYPE.getName())); } else if (possibleTypes.size() == 1) { - sendPWRequest(lastTile.getPoint(), end.getPoint(), possibleTypes.get(0)); + network.sendRequestPathway(start.getPoint(), end.getPoint(), possibleTypes.get(0)); } else if (possibleTypes.size() > 1) { push(GuiElements.createScreen(entity -> { entity.add(GuiElements.createButton(I18Wrapper.format("btn.return"), e -> pop())); @@ -294,7 +286,7 @@ private void checkForMultiplePathTypes(final SignalBoxNode start, final SignalBo entity.add(GuiElements.createSpacerV(10)); possibleTypes .forEach(type -> entity.add(GuiElements.createButton(type.name(), e -> { - sendPWRequest(start.getPoint(), end.getPoint(), type); + network.sendRequestPathway(start.getPoint(), end.getPoint(), type); pop(); }))); })); @@ -368,7 +360,7 @@ private void buildTileConfigList(final SignalBoxNode node, namingInput.setOnTextUpdate(str -> { node.setCustomText(str); - sendName(node.getPoint(), str); + network.sendNodeLabel(node.getPoint(), str); rendering.updateNodeLabeling(node.getPoint(), str); }); @@ -469,7 +461,7 @@ private void initializePageSettings(final UIEntity entity, btn.add(new UIToolTip(I18Wrapper.format("sb.highlight"))); layout.add(btn); layout.add(GuiElements.createButton("x", 20, e -> { - removeBlockPos(p); + network.sendRemovePos(p); list.remove(layout); })); list.add(layout); @@ -491,7 +483,6 @@ private void initializePageSettings(final UIEntity entity, private void initializeFieldUsage(final UIEntity entity) { reset(); - sendModeChanges(); page = SignalBoxPage.OPERATION; initializeFieldTemplate(this::tileNormal, false); resetSelection(entity); @@ -528,7 +519,8 @@ private void initializeFieldEdit(final UIEntity entity) { menu.setConsumer( (selection, rotation) -> helpPage.updateNextNode(selection, rotation)); resetSelection(entity); - resetAllPathways(); + network.sendResetAllPathways(); + resetColors(); helpPage.updateNextNode(menu.getSelection(), menu.getRotation()); this.lastTile = null; @@ -563,7 +555,7 @@ private void initializeFieldTemplate(final SignalBoxConsumer consumer, final List nodes = container.grid.getNodes(); buildColors(nodes); - updateTrainNumbers(nodes); + nodes.forEach(this::updateTrainNumbers); } public void updateCounter() { @@ -626,301 +618,16 @@ private void disableBottomEntity() { bottomEntity.getParent().update(); } - private void sendPWRequest(final Point start, final Point end, final PathType type) { - if (!allPacketsRecived) - return; - final WriteBuffer buffer = new WriteBuffer(); - buffer.putEnumValue(SignalBoxNetwork.REQUEST_PW); - start.writeNetwork(buffer); - end.writeNetwork(buffer); - buffer.putEnumValue(type); - OpenSignalsMain.network.sendTo(info.player, buffer); - } - - protected void resetPathwayOnServer(final SignalBoxNode node) { - if (!allPacketsRecived) - return; - final WriteBuffer buffer = new WriteBuffer(); - buffer.putEnumValue(SignalBoxNetwork.RESET_PW); - node.getPoint().writeNetwork(buffer); - OpenSignalsMain.network.sendTo(info.player, buffer); - } - - private void sendPosEntryToServer(final BlockPos pos, final SignalBoxNode node, - final EnumGuiMode mode, final Rotation rotation, final PathEntryType entry) { - if (!allPacketsRecived) - return; - final WriteBuffer buffer = new WriteBuffer(); - buffer.putEnumValue(SignalBoxNetwork.SEND_POS_ENTRY); - buffer.putBlockPos(pos); - node.getPoint().writeNetwork(buffer); - buffer.putByte((byte) mode.ordinal()); - buffer.putByte((byte) rotation.ordinal()); - buffer.putByte((byte) entry.getID()); - OpenSignalsMain.network.sendTo(info.player, buffer); - } - - protected void sendIntEntryToServer(final int speed, final SignalBoxNode node, - final EnumGuiMode mode, final Rotation rotation, final PathEntryType entry) { - if (speed == 127 || !allPacketsRecived) - return; - final WriteBuffer buffer = new WriteBuffer(); - buffer.putEnumValue(SignalBoxNetwork.SEND_INT_ENTRY); - buffer.putByte((byte) speed); - node.getPoint().writeNetwork(buffer); - buffer.putByte((byte) mode.ordinal()); - buffer.putByte((byte) rotation.ordinal()); - buffer.putByte((byte) entry.getID()); - OpenSignalsMain.network.sendTo(info.player, buffer); - } - - protected void sendZS2Entry(final byte value, final SignalBoxNode node, final EnumGuiMode mode, - final Rotation rotation, final PathEntryType entry) { - if (!allPacketsRecived) - return; - final WriteBuffer buffer = new WriteBuffer(); - buffer.putEnumValue(SignalBoxNetwork.SEND_ZS2_ENTRY); - buffer.putByte(value); - node.getPoint().writeNetwork(buffer); - buffer.putByte((byte) mode.ordinal()); - buffer.putByte((byte) rotation.ordinal()); - buffer.putByte((byte) entry.getID()); - OpenSignalsMain.network.sendTo(info.player, buffer); - } - - protected void sendZS6Entry(final boolean value, final SignalBoxNode node, - final EnumGuiMode mode, final Rotation rotation, final PathEntryType entry) { - if (!allPacketsRecived) - return; - final WriteBuffer buffer = new WriteBuffer(); - buffer.putEnumValue(SignalBoxNetwork.SEND_ZS6_ENTRY); - buffer.putBoolean(value); - node.getPoint().writeNetwork(buffer); - buffer.putByte((byte) mode.ordinal()); - buffer.putByte((byte) rotation.ordinal()); - buffer.putByte((byte) entry.getID()); - OpenSignalsMain.network.sendTo(info.player, buffer); - } - - protected void sendPointEntry(final Point point, final SignalBoxNode node, - final EnumGuiMode mode, final Rotation rotation, final PathEntryType entry) { - if (!allPacketsRecived) - return; - final WriteBuffer buffer = new WriteBuffer(); - buffer.putEnumValue(SignalBoxNetwork.SEND_POINT_ENTRY); - point.writeNetwork(buffer); - node.getPoint().writeNetwork(buffer); - buffer.putByte((byte) mode.ordinal()); - buffer.putByte((byte) rotation.ordinal()); - buffer.putByte((byte) entry.getID()); - OpenSignalsMain.network.sendTo(info.player, buffer); - } - - protected void removeEntryFromServer(final SignalBoxNode node, final EnumGuiMode mode, - final Rotation rotation, final PathEntryType entry) { - if (!allPacketsRecived) - return; - final WriteBuffer buffer = new WriteBuffer(); - buffer.putEnumValue(SignalBoxNetwork.REMOVE_ENTRY); - node.getPoint().writeNetwork(buffer); - buffer.putByte((byte) mode.ordinal()); - buffer.putByte((byte) rotation.ordinal()); - buffer.putByte((byte) entry.getID()); - OpenSignalsMain.network.sendTo(info.player, buffer); - } - - private void resetAllPathways() { - if (!allPacketsRecived) - return; - final WriteBuffer buffer = new WriteBuffer(); - buffer.putEnumValue(SignalBoxNetwork.RESET_ALL_PW); - OpenSignalsMain.network.sendTo(info.player, buffer); - resetColors(container.grid.getNodes()); - rendering.clearTrainNumbers(); - } - - private void sendModeChanges() { - if (changedModes.isEmpty() || !allPacketsRecived) - return; - final WriteBuffer buffer = new WriteBuffer(); - buffer.putEnumValue(SignalBoxNetwork.SEND_CHANGED_MODES); - buffer.putINetworkSaveableMap(changedModes); - container.grid.putAllNodes(changedModes); - changedModes.clear(); - OpenSignalsMain.network.sendTo(info.player, buffer); - } - - private void removeBlockPos(final BlockPos pos) { - if (!allPacketsRecived) - return; - final WriteBuffer buffer = new WriteBuffer(); - buffer.putEnumValue(SignalBoxNetwork.REMOVE_POS); - buffer.putBlockPos(pos); - OpenSignalsMain.network.sendTo(info.player, buffer); - } - - protected void sendSubsidiaryRequest(final SubsidiaryState entry, final Point point, - final ModeSet mode, final boolean enable) { - if (!allPacketsRecived) - return; - final WriteBuffer buffer = new WriteBuffer(); - buffer.putEnumValue(SignalBoxNetwork.REQUEST_SUBSIDIARY); - entry.writeNetwork(buffer); - point.writeNetwork(buffer); - mode.writeNetwork(buffer); - buffer.putBoolean(enable); - OpenSignalsMain.network.sendTo(info.player, buffer); - } - - protected void changeRedstoneOutput(final Point point, final ModeSet mode, - final boolean state) { - if (!allPacketsRecived) - return; - final WriteBuffer buffer = new WriteBuffer(); - buffer.putEnumValue(SignalBoxNetwork.UPDATE_RS_OUTPUT); - point.writeNetwork(buffer); - mode.writeNetwork(buffer); - buffer.putBoolean(state); - OpenSignalsMain.network.sendTo(info.player, buffer); - rendering.setColor(point, mode, state ? OUTPUT_COLOR : SignalBoxUtil.FREE_COLOR); - } - - protected void setAutoPoint(final Point point, final byte state) { - if (!allPacketsRecived) - return; - final WriteBuffer buffer = new WriteBuffer(); - buffer.putEnumValue(SignalBoxNetwork.SET_AUTO_POINT); - point.writeNetwork(buffer); - buffer.putBoolean(state == 1); - OpenSignalsMain.network.sendTo(info.player, buffer); - } - - private void sendName(final Point point, final String name) { - if (!allPacketsRecived) - return; - final WriteBuffer buffer = new WriteBuffer(); - buffer.putEnumValue(SignalBoxNetwork.SEND_NAME); - point.writeNetwork(buffer); - buffer.putString(name); - OpenSignalsMain.network.sendTo(info.player, buffer); - } - - protected void sendBoolEntry(final boolean state, final Point point, final ModeSet mode, - final PathEntryType entry) { - if (!allPacketsRecived) - return; - final WriteBuffer buffer = new WriteBuffer(); - buffer.putEnumValue(SignalBoxNetwork.SEND_BOOL_ENTRY); - buffer.putBoolean(state); - point.writeNetwork(buffer); - mode.writeNetwork(buffer); - buffer.putByte((byte) entry.getID()); - OpenSignalsMain.network.sendTo(info.player, buffer); - } - - protected void removeNextPathwayFromServer(final Point start, final Point end) { - if (!allPacketsRecived) - return; - final WriteBuffer buffer = new WriteBuffer(); - buffer.putEnumValue(SignalBoxNetwork.REMOVE_SAVEDPW); - start.writeNetwork(buffer); - end.writeNetwork(buffer); - OpenSignalsMain.network.sendTo(info.player, buffer); - } - - protected void sendCurrentCounterToServer() { - if (!allPacketsRecived) - return; - final WriteBuffer buffer = new WriteBuffer(); - buffer.putEnumValue(SignalBoxNetwork.SEND_COUNTER); - buffer.putInt(container.grid.getCurrentCounter()); - OpenSignalsMain.network.sendTo(info.player, buffer); - } - - protected void sendTrainNumber(final Point point, final String number) { - if (!allPacketsRecived) - return; - final WriteBuffer buffer = new WriteBuffer(); - buffer.putEnumValue(SignalBoxNetwork.SEND_TRAIN_NUMBER); - point.writeNetwork(buffer); - buffer.putString(number); - OpenSignalsMain.network.sendTo(info.player, buffer); - } - - protected void deleteTrainNumber(final Point point) { - if (!allPacketsRecived) - return; - final WriteBuffer buffer = new WriteBuffer(); - buffer.putEnumValue(SignalBoxNetwork.SEND_TRAIN_NUMBER); - point.writeNetwork(buffer); - buffer.putString(TrainNumber.DEFAULT.trainNumber); - OpenSignalsMain.network.sendTo(info.player, buffer); - } - - protected void resetAllSignals() { - if (!allPacketsRecived) - return; - final WriteBuffer buffer = new WriteBuffer(); - buffer.putEnumValue(SignalBoxNetwork.RESET_ALL_SIGNALS); - OpenSignalsMain.network.sendTo(info.player, buffer); - container.grid.resetAllSignals(); - } - - protected void sendPosIdentList(final List list, final SignalBoxNode node, - final EnumGuiMode mode, final Rotation rotation, - final PathEntryType> entry) { - if (!allPacketsRecived) - return; - final WriteBuffer buffer = new WriteBuffer(); - buffer.putEnumValue(SignalBoxNetwork.SEND_POSIDENT_LIST); - buffer.putISaveableList(list); - node.getPoint().writeNetwork(buffer); - buffer.putByte((byte) mode.ordinal()); - buffer.putByte((byte) rotation.ordinal()); - buffer.putByte((byte) entry.getID()); - OpenSignalsMain.network.sendTo(info.player, buffer); - } - - protected void sendConnetedTrainNumbers(final ModeIdentifier ident, final SignalBoxNode node, - final EnumGuiMode mode, final Rotation rotation) { - if (!allPacketsRecived) - return; - final WriteBuffer buffer = new WriteBuffer(); - buffer.putEnumValue(SignalBoxNetwork.SEND_CONNECTED_TRAINNUMBERS); - ident.writeNetwork(buffer); - node.getPoint().writeNetwork(buffer); - buffer.putByte((byte) mode.ordinal()); - buffer.putByte((byte) rotation.ordinal()); - buffer.putByte((byte) PathEntryType.CONNECTED_TRAINNUMBER.getID()); - OpenSignalsMain.network.sendTo(info.player, buffer); - } - - protected void updateSignalStateOnServer(final Point point, final ModeSet mode, - final SignalState state) { - if (!allPacketsRecived) - return; - final WriteBuffer buffer = new WriteBuffer(); - buffer.putEnumValue(SignalBoxNetwork.SET_SIGNAL_STATE); - point.writeNetwork(buffer); - buffer.putByte((byte) mode.mode.ordinal()); - buffer.putByte((byte) mode.rotation.ordinal()); - buffer.putEnumValue(state); - OpenSignalsMain.network.sendTo(info.player, buffer); - } - private void reset() { lowerEntity.clear(); } @Override public void updateFromContainer() { - if (!allPacketsRecived) { - updateEnabledSubsidiaries(); - initializeBasicUI(); - enabledSubsidiaries.values() - .forEach(holder -> updateSignalState(container.grid.getNode(holder.point))); - allPacketsRecived = true; - } + updateEnabledSubsidiaries(); + initializeBasicUI(); + enabledSubsidiaries.values() + .forEach(holder -> updateSignalState(container.grid.getNode(holder.point))); } private void updateEnabledSubsidiaries() { @@ -947,8 +654,8 @@ private void buildColors(final List nodes) { }); } - private void resetColors(final List nodes) { - nodes.forEach(node -> { + private void resetColors() { + container.grid.getNodes().forEach(node -> { node.forEach(mode -> { final EnumGuiMode guiMode = mode.mode; final PathOptionEntry entry = node.getOption(mode).get(); @@ -971,18 +678,14 @@ private void resetColors(final List nodes) { }); } - private void applyColorChanges(final List listOfNodes) { - for (int i = listOfNodes.size() - 2; i > 0; i--) { - final Point oldPos = listOfNodes.get(i - 1).getPoint(); - final Point newPos = listOfNodes.get(i + 1).getPoint(); - final Path path = new Path(oldPos, newPos); - final SignalBoxNode current = listOfNodes.get(i); - final ModeSet modeSet = current.getMode(path); - current.getOption(modeSet) - .ifPresent(poe -> rendering.setColor(current.getPoint(), modeSet, - poe.getEntry(PathEntryType.PATHUSAGE) - .orElseGet(() -> EnumPathUsage.FREE).getColor())); - } + private void updateColor(final SignalBoxNode node) { + node.toPathIdentifier().forEach(ident -> { + node.getOption(ident.getMode()).ifPresent(poe -> { + rendering.setColor(node.getPoint(), ident.getMode(), + poe.getEntry(PathEntryType.PATHUSAGE).orElseGet(() -> EnumPathUsage.FREE) + .getColor()); + }); + }); } @Override diff --git a/src/main/java/com/troblecodings/signals/guis/ModeDropDownBoxUI.java b/src/main/java/com/troblecodings/signals/guis/ModeDropDownBoxUI.java index a1f9a95b7..11068e139 100644 --- a/src/main/java/com/troblecodings/signals/guis/ModeDropDownBoxUI.java +++ b/src/main/java/com/troblecodings/signals/guis/ModeDropDownBoxUI.java @@ -117,11 +117,9 @@ public void addElements(final UIEntity parent) { final int speed = id > 0 ? id : 127; final Optional opt = option.getEntry(PathEntryType.SPEED); if (speed == 127 && opt.isPresent()) { - gui.removeEntryFromServer(node, mode, rotation, PathEntryType.SPEED); option.removeEntry(PathEntryType.SPEED); } else if ((opt.isPresent() && opt.get() != speed) || (!opt.isPresent() && speed != 127)) { - gui.sendIntEntryToServer(speed, node, mode, rotation, PathEntryType.SPEED); option.setEntry(PathEntryType.SPEED, speed); } }, option.getEntry(PathEntryType.SPEED).filter(n -> n < 16).orElse(127)); @@ -141,10 +139,8 @@ public void addElements(final UIEntity parent) { final UIEntity zs2Entity = GuiElements.createEnumElement(JsonEnumHolder.ZS32, e -> { if (e == 0) { - gui.removeEntryFromServer(node, mode, rotation, PathEntryType.ZS2); option.removeEntry(PathEntryType.ZS2); } else { - gui.sendZS2Entry((byte) e, node, mode, rotation, PathEntryType.ZS2); option.setEntry(PathEntryType.ZS2, (byte) e); } }, option.getEntry(PathEntryType.ZS2).orElse((byte) 0)); @@ -152,7 +148,6 @@ public void addElements(final UIEntity parent) { Optional opt = option.getEntry(PathEntryType.ZS6); parent.add(GuiElements.createBoolElement(BoolIntegerables.of("zs6_state"), e -> { final boolean state = e == 1 ? true : false; - gui.sendZS6Entry(state, node, mode, rotation, PathEntryType.ZS6); option.setEntry(PathEntryType.ZS6, TCBoolean.valueOf(state)); }, opt.isPresent() && opt.get().booleanValue() ? 1 : 0)); } @@ -164,8 +159,6 @@ public void addElements(final UIEntity parent) { parent.add( GuiElements.createBoolElement(BoolIntegerables.of("signal_repeater"), e -> { final boolean state = e == 1 ? true : false; - gui.sendBoolEntry(state, node.getPoint(), modeSet, - PathEntryType.SIGNAL_REPEATER); option.setEntry(PathEntryType.SIGNAL_REPEATER, state); }, opt.isPresent() && opt.get() ? 1 : 0)); break; @@ -183,7 +176,7 @@ public void addElements(final UIEntity parent) { final BoxEntity boxEntity = UISignalBoxRendering.createSignalBoxEntity( grid, false, (rendering, point, mouseKey) -> { final SignalBoxNode node = grid.getNodeChecked(point) - .orElseGet(() -> new SignalBoxNode()); + .orElse(new SignalBoxNode(grid.getNetwork())); if (mouseKey != MouseEvent.LEFT_MOUSE || node.isEmpty()) return; final AtomicReference vp = @@ -213,13 +206,9 @@ public void addElements(final UIEntity parent) { } if (preSignalsList.isEmpty()) { option.removeEntry(PathEntryType.PRESIGNALS); - gui.removeEntryFromServer(this.node, mode, rotation, - PathEntryType.PRESIGNALS); } else { option.setEntry(PathEntryType.PRESIGNALS, preSignalsList); - gui.sendPosIdentList(preSignalsList, this.node, mode, - rotation, PathEntryType.PRESIGNALS); } }); preSignalsList.forEach(ident -> { @@ -248,7 +237,7 @@ public void addElements(final UIEntity parent) { final BoxEntity boxEntity = UISignalBoxRendering.createSignalBoxEntity( gui.container.grid, false, (rendering, point, mouseKey) -> { final SignalBoxNode node = grid.getNodeChecked(point) - .orElse(new SignalBoxNode()); + .orElse(new SignalBoxNode(grid.getNetwork())); if (mouseKey != MouseEvent.LEFT_MOUSE || node.isEmpty()) return; final Point select = @@ -256,14 +245,10 @@ public void addElements(final UIEntity parent) { .orElse(new Point(-1, -1)); if (point.equals(select)) { rendering.removeSelection(SelectionType.FIRST); - gui.removeEntryFromServer(this.node, mode, rotation, - PathEntryType.PROTECTIONWAY_END); option.removeEntry(PathEntryType.PROTECTIONWAY_END); } else { rendering.addSelection(GuiSignalBox.SELECTION_COLOR, point, SelectionType.FIRST); - gui.sendPointEntry(point, this.node, mode, rotation, - PathEntryType.PROTECTIONWAY_END); option.setEntry(PathEntryType.PROTECTIONWAY_END, point); } }); @@ -291,8 +276,6 @@ public void addElements(final UIEntity parent) { e -> { final boolean state = e == 1 ? true : false; option.setEntry(PathEntryType.CAN_BE_OVERSTPEPPED, state); - gui.sendBoolEntry(state, node.getPoint(), modeSet, - PathEntryType.CAN_BE_OVERSTPEPPED); }, option.getEntry(PathEntryType.CAN_BE_OVERSTPEPPED).orElse(false) ? 1 : 0)); break; @@ -301,7 +284,6 @@ public void addElements(final UIEntity parent) { parent.add(GuiElements.createEnumElement( new SizeIntegerables<>("delay", 60, get -> String.valueOf(get)), i -> { option.setEntry(PathEntryType.DELAY, i); - gui.sendIntEntryToServer(i, node, mode, rotation, PathEntryType.DELAY); }, option.getEntry(PathEntryType.DELAY).orElse(0))); break; } @@ -329,10 +311,8 @@ public void addElements(final UIEntity parent) { final Point point = e >= 0 ? validInConnections.get(e) : null; if (point == null) { option.removeEntry(PathEntryType.POINT); - gui.removeEntryFromServer(node, mode, rotation, PathEntryType.POINT); } else { option.setEntry(PathEntryType.POINT, point); - gui.sendPointEntry(point, node, mode, rotation, PathEntryType.POINT); } }, option.getEntry(PathEntryType.POINT) .map(point -> validInConnections.indexOf(point)).orElse(-1))); @@ -354,21 +334,17 @@ public void addElements(final UIEntity parent) { final BoxEntity boxEntity = UISignalBoxRendering.createSignalBoxEntity( gui.container.grid, false, (rendering, point, mouseKey) -> { final SignalBoxNode node = grid.getNodeChecked(point) - .orElse(new SignalBoxNode()); + .orElse(new SignalBoxNode(grid.getNetwork())); if (mouseKey != MouseEvent.LEFT_MOUSE || !node.isValidEnd()) return; final Point select = option.getEntry(PathEntryType.POINT) .orElse(new Point(-1, -1)); if (point.equals(select)) { rendering.removeSelection(SelectionType.FIRST); - gui.removeEntryFromServer(this.node, mode, rotation, - PathEntryType.POINT); option.removeEntry(PathEntryType.POINT); } else { rendering.addSelection(GuiSignalBox.SELECTION_COLOR, point, SelectionType.FIRST); - gui.sendPointEntry(point, this.node, mode, rotation, - PathEntryType.POINT); option.setEntry(PathEntryType.POINT, point); } }); @@ -406,7 +382,8 @@ public void addElements(final UIEntity parent) { if (mouseKey != MouseEvent.LEFT_MOUSE) return; final SignalBoxNode node = gui.container.grid - .getNodeChecked(point).orElse(new SignalBoxNode()); + .getNodeChecked(point) + .orElse(new SignalBoxNode(grid.getNetwork())); if (node.isEmpty()) return; @@ -530,11 +507,9 @@ private static void connectToEachOther(final ModeIdentifier ident1, final ModeId final SignalBoxGrid grid, final GuiSignalBox gui) { final SignalBoxNode node1 = grid.getNode(ident1.point); node1.getOption(ident1.mode).get().setEntry(PathEntryType.CONNECTED_TRAINNUMBER, ident2); - gui.sendConnetedTrainNumbers(ident2, node1, ident1.mode.mode, ident1.mode.rotation); final SignalBoxNode node2 = grid.getNode(ident2.point); node2.getOption(ident2.mode).get().setEntry(PathEntryType.CONNECTED_TRAINNUMBER, ident1); - gui.sendConnetedTrainNumbers(ident1, node2, ident2.mode.mode, ident2.mode.rotation); } private static void disconnectFromEachOther(final ModeIdentifier ident1, @@ -542,14 +517,10 @@ private static void disconnectFromEachOther(final ModeIdentifier ident1, final SignalBoxNode node1 = grid.getNode(ident1.point); node1.getOption(ident1.mode) .ifPresent(entry -> entry.removeEntry(PathEntryType.CONNECTED_TRAINNUMBER)); - gui.removeEntryFromServer(node1, ident1.mode.mode, ident1.mode.rotation, - PathEntryType.CONNECTED_TRAINNUMBER); final SignalBoxNode node2 = grid.getNode(ident2.point); node2.getOption(ident2.mode) .ifPresent(entry -> entry.removeEntry(PathEntryType.CONNECTED_TRAINNUMBER)); - gui.removeEntryFromServer(node2, ident2.mode.mode, ident2.mode.rotation, - PathEntryType.CONNECTED_TRAINNUMBER); } private void changeShowState() { @@ -598,10 +569,8 @@ private UIEntity getTextFieldEntityforType(final EnumGuiMode mode, final Rotatio } if (i != defaultValue) { option.setEntry(type, i); - gui.sendIntEntryToServer(i, node, mode, rotation, type); } else { option.removeEntry(type); - gui.removeEntryFromServer(node, mode, rotation, type); } }); textInputEntity.add(input); diff --git a/src/main/java/com/troblecodings/signals/guis/SidePanel.java b/src/main/java/com/troblecodings/signals/guis/SidePanel.java index 512bdd15a..aa72eebe8 100644 --- a/src/main/java/com/troblecodings/signals/guis/SidePanel.java +++ b/src/main/java/com/troblecodings/signals/guis/SidePanel.java @@ -30,9 +30,11 @@ import com.troblecodings.guilib.ecs.entitys.transform.UIRotate; import com.troblecodings.guilib.ecs.entitys.transform.UIScale; import com.troblecodings.signals.OpenSignalsMain; +import com.troblecodings.signals.core.ModeIdentifier; import com.troblecodings.signals.core.StateInfo; import com.troblecodings.signals.core.SubsidiaryHolder; import com.troblecodings.signals.core.SubsidiaryState; +import com.troblecodings.signals.core.TrainNumber; import com.troblecodings.signals.enums.EnumGuiMode; import com.troblecodings.signals.enums.EnumPathUsage; import com.troblecodings.signals.enums.SignalBoxPage; @@ -41,6 +43,7 @@ import com.troblecodings.signals.signalbox.ModeSet; import com.troblecodings.signals.signalbox.Point; import com.troblecodings.signals.signalbox.SignalBoxNode; +import com.troblecodings.signals.signalbox.SignalBoxUtil; import com.troblecodings.signals.signalbox.entrys.PathEntryType; import com.troblecodings.signals.signalbox.entrys.PathOptionEntry; @@ -153,7 +156,7 @@ private UIEntity getIcons() { emergencyEntity.setHeight(20); emergencyEntity.setWidth(20); emergencyEntity.add(new UITexture(EMERGENCY)); - emergencyEntity.add(new UIClickable(e -> gui.resetAllSignals())); + emergencyEntity.add(new UIClickable(e -> gui.network.sendResetAllSignals())); emergencyEntity.add(new UIToolTip(I18Wrapper.format("info.usage.emergency.desc"))); list.add(emergencyEntity); @@ -286,7 +289,8 @@ public void helpUsageMode(final SignalBoxNode node) { helpList.add(getSpacerLine()); final UIEntity shButton = GuiElements.createButton( - " " + I18Wrapper.format("info.usage.emergency"), e -> gui.resetAllSignals()); + " " + I18Wrapper.format("info.usage.emergency"), + e -> gui.network.sendResetAllSignals()); shButton.add(new UIToolTip(I18Wrapper.format("info.usage.emergency.desc"))); final UIEntity emergencyEntity = new UIEntity(); @@ -357,9 +361,8 @@ public void helpUsageMode(final SignalBoxNode node) { helpList.add(GuiElements.createLabel(I18Wrapper.format("info.usage.node"), new UIEntity().getBasicTextColor(), 0.8f)); if (guiModes.contains(EnumGuiMode.HP)) { - final UIEntity entity = - GuiElements.createBoolElement(BoolIntegerables.of("auto_pathway"), e -> { - gui.setAutoPoint(node.getPoint(), (byte) e); + final UIEntity entity = GuiElements + .createBoolElement(BoolIntegerables.of("auto_pathway"), e -> { node.setAutoPoint(e == 1 ? true : false); }, node.isAutoPoint() ? 1 : 0); entity.setScale(0.95f); @@ -389,7 +392,7 @@ public void helpUsageMode(final SignalBoxNode node) { final UIEntity buttonYes = GuiElements.createButton(I18Wrapper.format("btn.yes"), e1 -> { gui.pop(); - gui.resetPathwayOnServer(node); + gui.network.sendResetPathway(node.getPoint()); }); final UIEntity buttonNo = GuiElements .createButton(I18Wrapper.format("btn.no"), e2 -> gui.pop()); @@ -453,17 +456,17 @@ public void helpUsageMode(final SignalBoxNode node) { node.removeSubsidiaryState(mode); subsidiaries.remove(signalPos); } - gui.sendSubsidiaryRequest(state, node.getPoint(), - mode, enable); + gui.network.sendSubsidiary( + new ModeIdentifier(node.getPoint(), mode), + state, enable); gui.container.updateClientSubsidiary( node.getPoint(), mode, state, enable); - gui.container.updateSignalState.accept(node); + gui.updateSignalState(node); gui.pop(); helpUsageMode(node); if (state.isCountable() && enable) { gui.container.grid.count(); gui.updateCounter(); - gui.sendCurrentCounterToServer(); } }, defaultValue)); }); @@ -550,20 +553,22 @@ public void helpUsageMode(final SignalBoxNode node) { textureEntity.add(new UIToolTip(I18Wrapper .format("info.usage.rs.desc"))); if (turnOff) { - gui.changeRedstoneOutput( - node.getPoint(), mode, false); + node.removeManuellOutput(mode); outputStatus.setText(I18Wrapper .format("info.usage.rs.false")); textureEntity.add(new UITexture( GuiSignalBox.REDSTONE_OFF)); } else { - gui.changeRedstoneOutput( - node.getPoint(), mode, true); + node.addManuellOutput(mode); outputStatus.setText(I18Wrapper .format("info.usage.rs.true")); textureEntity.add(new UITexture( GuiSignalBox.REDSTONE_ON)); } + gui.rendering.setColor(node.getPoint(), + mode, + !turnOff ? GuiSignalBox.OUTPUT_COLOR + : SignalBoxUtil.FREE_COLOR); })); } gui.pop(); @@ -604,16 +609,17 @@ public void helpUsageMode(final SignalBoxNode node) { lowerEntity.setInherits(true); lowerEntity.add(new UIBox(UIBox.HBOX, 5)); lowerEntity.add(GuiElements.createSpacerH(7)); - final UIEntity save = - GuiElements.createButton(I18Wrapper.format("btn.save"), e1 -> { - gui.sendTrainNumber(node.getPoint(), input.getText()); + final UIEntity save = GuiElements + .createButton(I18Wrapper.format("btn.save"), e1 -> { + gui.network.updateTrainNumber(node.getPoint(), + new TrainNumber(input.getText())); input.setText(""); gui.pop(); }); save.add(new UIToolTip(I18Wrapper.format("sb.trainnumber.save"))); lowerEntity.add(save); final UIEntity remove = GuiElements.createButton("x", e1 -> { - gui.deleteTrainNumber(node.getPoint()); + gui.network.updateTrainNumber(node.getPoint(), TrainNumber.DEFAULT); gui.pop(); }); remove.add(new UIToolTip(I18Wrapper.format("sb.trainnumber.remove"))); @@ -789,14 +795,16 @@ private void addManuellRStoUI() { textureEntity.clear(); textureEntity.add(new UIToolTip(I18Wrapper.format("info.usage.rs.desc"))); if (turnOff) { - gui.changeRedstoneOutput(currentNode.getPoint(), mode, false); + currentNode.removeManuellOutput(mode); outputStatus.setText(I18Wrapper.format("info.usage.rs.false")); textureEntity.add(new UITexture(GuiSignalBox.REDSTONE_OFF)); } else { - gui.changeRedstoneOutput(currentNode.getPoint(), mode, true); + currentNode.addManuellOutput(mode); outputStatus.setText(I18Wrapper.format("info.usage.rs.true")); textureEntity.add(new UITexture(GuiSignalBox.REDSTONE_ON)); } + gui.rendering.setColor(currentNode.getPoint(), mode, + !turnOff ? GuiSignalBox.OUTPUT_COLOR : SignalBoxUtil.FREE_COLOR); })); gui.push(GuiElements.createScreen(entity -> entity.add(info))); }); @@ -843,7 +851,7 @@ private void addSavedPathsToUI() { layout.add(GuiElements.createButton("x", 20, _u -> { gui.container.nextPathways.remove(entry); list.remove(layout); - gui.removeNextPathwayFromServer(entry.getKey(), entry.getValue()); + gui.network.sendRemoveSavedPathway(entry.getKey(), entry.getValue()); gui.pop(); })); list.add(layout); diff --git a/src/main/java/com/troblecodings/signals/network/PathOptionEntryNetworkHandler.java b/src/main/java/com/troblecodings/signals/network/PathOptionEntryNetworkHandler.java new file mode 100644 index 000000000..d4dff0d60 --- /dev/null +++ b/src/main/java/com/troblecodings/signals/network/PathOptionEntryNetworkHandler.java @@ -0,0 +1,55 @@ +package com.troblecodings.signals.network; + +import java.util.Objects; + +import com.troblecodings.signals.core.ModeIdentifier; +import com.troblecodings.signals.signalbox.entrys.IPathEntry; +import com.troblecodings.signals.signalbox.entrys.PathEntryType; + +public class PathOptionEntryNetworkHandler { + + private SignalBoxNetworkHandler network = null; + private ModeIdentifier ident = null; + + public void setUpNetwork(final SignalBoxNetworkHandler network, final ModeIdentifier ident) { + this.network = network; + this.ident = ident; + } + + public void removeNetwork() { + this.network = null; + this.ident = null; + } + + private boolean isNetworkConnected() { + return network != null && ident != null; + } + + public void sendEntryAdd(final PathEntryType entryType, final IPathEntry entry) { + if (!isNetworkConnected()) + return; + network.sendEntryAdd(ident, entryType, entry); + } + + public void sendEntryRemove(final PathEntryType entryType) { + if (!isNetworkConnected()) + return; + network.sendEntryRemove(ident, entryType); + } + + @Override + public int hashCode() { + return Objects.hash(ident, network); + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) + return true; + if ((obj == null) || (getClass() != obj.getClass())) + return false; + final PathOptionEntryNetworkHandler other = (PathOptionEntryNetworkHandler) obj; + return Objects.equals(ident, other.ident) && Objects.equals(network, other.network); + } + +} diff --git a/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkHandler.java b/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkHandler.java index 617319332..cf5ced954 100644 --- a/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkHandler.java +++ b/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkHandler.java @@ -6,17 +6,16 @@ import com.troblecodings.core.ReadBuffer; import com.troblecodings.core.WriteBuffer; -import com.troblecodings.core.interfaces.INetworkSync; import com.troblecodings.signals.OpenSignalsMain; import com.troblecodings.signals.core.ModeIdentifier; import com.troblecodings.signals.core.StateInfo; -import com.troblecodings.signals.core.SubsidiaryEntry; +import com.troblecodings.signals.core.SubsidiaryState; import com.troblecodings.signals.core.TrainNumber; import com.troblecodings.signals.enums.PathType; import com.troblecodings.signals.enums.PathwayRequestResult; +import com.troblecodings.signals.enums.PathwayRequestResult.PathwayRequestMode; import com.troblecodings.signals.guis.ContainerSignalBox; import com.troblecodings.signals.handler.SignalBoxHandler; -import com.troblecodings.signals.signalbox.ModeSet; import com.troblecodings.signals.signalbox.Point; import com.troblecodings.signals.signalbox.SignalBoxGrid; import com.troblecodings.signals.signalbox.SignalBoxNode; @@ -27,73 +26,119 @@ import net.minecraft.core.BlockPos; -public class SignalBoxNetworkHandler implements INetworkSync { +public class SignalBoxNetworkHandler { - private static final boolean ADD = true; - private static final boolean REMOVE = false; + private static final byte REMOVE = 0; + private static final byte ADD = 1; - private final SignalBoxNetworkMode GRID = new SignalBoxNetworkMode(this::readForGrid); + private static final SignalBoxNetworkMode GRID = new SignalBoxNetworkMode( + (b, n) -> n.readForGrid(b)); - private final SignalBoxNetworkMode ENTRY = new SignalBoxNetworkMode(this::readEntry); + private static final SignalBoxNetworkMode ENTRY = new SignalBoxNetworkMode( + (b, n) -> n.readEntry(b)); - private final SignalBoxNetworkMode NODE_SPECIAL_ENTRIES = new SignalBoxNetworkMode( - this::readNodeSpecialEntries); + private static final SignalBoxNetworkMode NODE_SPECIAL_ENTRIES = new SignalBoxNetworkMode( + (b, n) -> n.readNodeSpecialEntries(b)); - private final SignalBoxNetworkMode PATHWAY = new SignalBoxNetworkMode(this::readPathwayAction); + private static final SignalBoxNetworkMode PATHWAY = new SignalBoxNetworkMode( + (b, n) -> n.readPathwayAction(b)); - private final SignalBoxNetworkMode PATHWAY_SAVER = new SignalBoxNetworkMode( - this::readSavedPathway); + private static final SignalBoxNetworkMode PATHWAY_SAVER = new SignalBoxNetworkMode( + (b, n) -> n.readSavedPathway(b)); - private final SignalBoxNetworkMode SUBSIDIARY = new SignalBoxNetworkMode(this::readSubsidiary); + private static final SignalBoxNetworkMode SUBSIDIARY = new SignalBoxNetworkMode( + (b, n) -> n.readSubsidiary(b)); - private final SignalBoxNetworkMode TRAINNUMBER = new SignalBoxNetworkMode( - this::updateTrainNumber); + private static final SignalBoxNetworkMode TRAINNUMBER = new SignalBoxNetworkMode( + (b, n) -> n.readUpdateTrainNumber(b)); - private final SignalBoxNetworkMode DEBUG_POINTS = new SignalBoxNetworkMode( - this::readDebugPoints); + private static final SignalBoxNetworkMode DEBUG_POINTS = new SignalBoxNetworkMode( + (b, n) -> n.readDebugPoints(b)); - private final ContainerSignalBox container; + private ContainerSignalBox container = null; - public SignalBoxNetworkHandler(final ContainerSignalBox container) { + public void setUpNetwork(final ContainerSignalBox container) { this.container = container; } - public void sendAddEntry(final ModeIdentifier ident, final PathEntryType entryType, + public void removeNetwork() { + this.container = null; + } + + private boolean containerConnected() { + return container != null; + } + + public ContainerSignalBox getContainer() { + return container; + } + + public void sendModeAdd(final ModeIdentifier ident) { + if (!containerConnected()) + return; + sendBuffer(getEntryBuffer(ident, EntryNetworkMode.MODE_ADD)); + } + + public void sendModeRemove(final ModeIdentifier ident) { + if (!containerConnected()) + return; + sendBuffer(getEntryBuffer(ident, EntryNetworkMode.MODE_REMOVE)); + } + + public void sendEntryAdd(final ModeIdentifier ident, final PathEntryType entryType, final IPathEntry entry) { - final WriteBuffer buffer = getEntryBuffer(ident, entryType, ADD); + if (!containerConnected()) + return; + final WriteBuffer buffer = getEntryBuffer(ident, EntryNetworkMode.ENTRY_ADD); + buffer.putInt(entryType.getID()); entry.writeNetwork(buffer); sendBuffer(buffer); } public void sendEntryRemove(final ModeIdentifier ident, final PathEntryType type) { - sendBuffer(getEntryBuffer(ident, type, REMOVE)); + if (!containerConnected()) + return; + final WriteBuffer buffer = getEntryBuffer(ident, EntryNetworkMode.ENTRY_REMOVE); + buffer.putInt(type.getID()); + sendBuffer(buffer); } public void sendAll() { + if (!containerConnected()) + return; final WriteBuffer buffer = getGridBuffer(GridNetworkMode.SEND_ALL); getGrid().writeNetwork(buffer); + container.addAdditionalInitialisationData(buffer); sendBuffer(buffer); } public void sendCounter() { + if (!containerConnected()) + return; final WriteBuffer buffer = getGridBuffer(GridNetworkMode.COUNTER); buffer.putInt(getGrid().getCurrentCounter()); sendBuffer(buffer); } public void sendNodeLabel(final Point point, final String label) { - final WriteBuffer buffer = getPointBuffer(point, NodeNetworkMode.LABEL); + if (!containerConnected()) + return; + final WriteBuffer buffer = getNodeBuffer(point, NodeNetworkMode.LABEL); buffer.putString(label); sendBuffer(buffer); } public void sendAutoPoint(final Point point, final boolean autoPoint) { - final WriteBuffer buffer = getPointBuffer(point, NodeNetworkMode.AUTO_POINT); + if (!containerConnected()) + return; + final WriteBuffer buffer = getNodeBuffer(point, NodeNetworkMode.AUTO_POINT); buffer.putBoolean(autoPoint); sendBuffer(buffer); } public void sendRequestPathway(final Point p1, final Point p2, final PathType type) { + if (!containerConnected()) + return; final WriteBuffer buffer = getPathwayBuffer(PathwayNetworkMode.REQUEST); p1.writeNetwork(buffer); p2.writeNetwork(buffer); @@ -102,60 +147,84 @@ public void sendRequestPathway(final Point p1, final Point p2, final PathType ty } public void sendResetPathway(final Point p1) { + if (!containerConnected()) + return; final WriteBuffer buffer = getPathwayBuffer(PathwayNetworkMode.RESET); p1.writeNetwork(buffer); sendBuffer(buffer); } public void sendRequestResponse(final PathwayRequestResult result) { + if (!containerConnected()) + return; final WriteBuffer buffer = getPathwayBuffer(PathwayNetworkMode.RESPONSE); - buffer.putEnumValue(result); + buffer.putEnumValue(result.getMode()); sendBuffer(buffer); } - public void sendResetAllPathway() { + public void sendResetAllPathways() { + if (!containerConnected()) + return; sendBuffer(getPathwayBuffer(PathwayNetworkMode.RESET_ALL_PATHWAYS)); } public void sendResetAllSignals() { + if (!containerConnected()) + return; sendBuffer(getPathwayBuffer(PathwayNetworkMode.RESET_ALL_SIGNALS)); } public void sendAddSavedPathway(final Point start, final Point end, final PathType type, final PathwayRequestResult result) { + if (!containerConnected()) + return; final WriteBuffer buffer = getSavedPathwayBuffer(start, end); - buffer.putBoolean(ADD); + buffer.putByte(ADD); buffer.putEnumValue(type); - buffer.putEnumValue(result); + buffer.putEnumValue(result.getMode()); sendBuffer(buffer); } public void sendRemoveSavedPathway(final Point start, final Point end) { + if (!containerConnected()) + return; final WriteBuffer buffer = getSavedPathwayBuffer(start, end); - buffer.putBoolean(REMOVE); + buffer.putByte(REMOVE); sendBuffer(buffer); } public void sendRemovePos(final BlockPos pos) { + if (!containerConnected()) + return; final WriteBuffer buffer = getGridBuffer(GridNetworkMode.REMOVE_POS); buffer.putBlockPos(pos); sendBuffer(buffer); } - public void sendSubsidiary(final ModeIdentifier ident, final SubsidiaryEntry entry) { + public void sendSubsidiary(final ModeIdentifier ident, final SubsidiaryState entry, + final boolean enable) { + if (!containerConnected()) + return; final WriteBuffer buffer = SUBSIDIARY.getBuffer(); ident.writeNetwork(buffer); entry.writeNetwork(buffer); + buffer.putBoolean(enable); sendBuffer(buffer); } - public void sendOutputUpdate(final Point point, final List list) { - final WriteBuffer buffer = getPointBuffer(point, NodeNetworkMode.MANUELL_OUTPUT); - // TODO Send list of outputs + public void sendOutputUpdates(final SignalBoxNode node) { + if (!containerConnected()) + return; + if (node == null) + throw new IllegalArgumentException("Node is null, this shouldn't be the case!"); + final WriteBuffer buffer = getNodeBuffer(node.getPoint(), NodeNetworkMode.MANUELL_OUTPUT); + node.writeManuellEnabledOutputs(buffer); sendBuffer(buffer); } public void updateTrainNumber(final Point point, final TrainNumber number) { + if (!containerConnected()) + return; final WriteBuffer buffer = TRAINNUMBER.getBuffer(); point.writeNetwork(buffer); number.writeNetwork(buffer); @@ -163,24 +232,40 @@ public void updateTrainNumber(final Point point, final TrainNumber number) { } public void sendDebugPoints(final List points) { + if (!containerConnected()) + return; final WriteBuffer buffer = DEBUG_POINTS.getBuffer(); - // TODO write List on Buffer + buffer.putISaveableList(points); + sendBuffer(buffer); + } + + public void sendUpdateSignalStates(final SignalBoxNode node) { + if (!containerConnected()) + return; + final WriteBuffer buffer = getNodeBuffer(node.getPoint(), NodeNetworkMode.SIGNAL_STATE); + node.writeSignalStates(buffer); sendBuffer(buffer); } private void readEntry(final ReadBuffer buffer) { - final boolean state = buffer.getBoolean(); + final EntryNetworkMode mode = buffer.getEnumValue(EntryNetworkMode.class); final ModeIdentifier ident = ModeIdentifier.of(buffer); + final SignalBoxNode node = getGrid().getOrCreateNode(ident.point); + if (mode.equals(EntryNetworkMode.MODE_ADD) || mode.equals(EntryNetworkMode.MODE_REMOVE)) { + node.applyModeNetworkChanges(ident); + return; + } final PathEntryType entryType = PathEntryType.ALL_ENTRIES.get(buffer.getInt()); - final SignalBoxNode node = getGrid().getNode(ident.point); final Optional optionEntry = node.getOption(ident.mode); - if (state == REMOVE) { - optionEntry.ifPresent(entry -> entry.removeEntry(entryType)); + if (mode.equals(EntryNetworkMode.ENTRY_REMOVE)) { + optionEntry.ifPresent(entry -> entry.removeEntryNoNetwork(entryType)); + container.handleNodeUpdate(node); return; } final IPathEntry entry = entryType.newValue(); entry.readNetwork(buffer); optionEntry.ifPresent(e -> e.addEntry(entryType, entry)); + container.handleNodeUpdate(node); } private void readForGrid(final ReadBuffer buffer) { @@ -188,26 +273,36 @@ private void readForGrid(final ReadBuffer buffer) { final GridNetworkMode mode = buffer.getEnumValue(GridNetworkMode.class); if (mode.equals(GridNetworkMode.SEND_ALL)) { grid.readNetwork(buffer); + container.readAdditionalInitialisationData(buffer); } else if (mode.equals(GridNetworkMode.COUNTER)) { - grid.setCurrentCounter(buffer.getInt()); + grid.setCounterFromNetwork(buffer.getInt()); + container.handleCounterUpdate(); } else { final BlockPos pos = buffer.getBlockPos(); - SignalBoxHandler.unlinkPosFromSignalBox( - new StateInfo(container.tile.getLevel(), container.tile.getBlockPos()), pos); + SignalBoxHandler.unlinkPosFromSignalBox(new StateInfo(container.getTile().getLevel(), + container.getTile().getBlockPos()), pos); } } private void readNodeSpecialEntries(final ReadBuffer buffer) { final NodeNetworkMode mode = buffer.getEnumValue(NodeNetworkMode.class); final Point point = Point.of(buffer); - final SignalBoxNode node = getGrid().getNode(point); + final SignalBoxGrid grid = getGrid(); + final SignalBoxNode node = grid.getNode(point); if (mode.equals(NodeNetworkMode.LABEL)) { node.setCustomText(buffer.getString()); - } else if (mode.equals(NodeNetworkMode.AUTO_POINT)) { - node.setAutoPoint(buffer.getBoolean()); - getGrid().updatePathwayToAutomatic(point); - } else { - // TODO Set List of manuellOutputs on Node + } + if (mode.equals(NodeNetworkMode.AUTO_POINT)) { + node.setAutoPointFromNetwork(buffer.getBoolean()); + grid.updatePathwayToAutomatic(point); + } + if (mode.equals(NodeNetworkMode.MANUELL_OUTPUT)) { + // TODO Set off Output in World + node.readManuellEnabledOutputs(buffer); + } + if (mode.equals(NodeNetworkMode.SIGNAL_STATE)) { + node.readSignalStates(buffer); + container.handleNodeUpdate(node); } } @@ -215,8 +310,7 @@ private void readPathwayAction(final ReadBuffer buffer) { final SignalBoxGrid grid = getGrid(); final PathwayNetworkMode mode = buffer.getEnumValue(PathwayNetworkMode.class); if (mode.equals(PathwayNetworkMode.RESPONSE)) { - final PathwayRequestResult result = buffer.getEnumValue(PathwayRequestResult.class); - // TODO Send to Container/GUI + container.handlePathwayRequestResponse(buffer.getEnumValue(PathwayRequestMode.class)); } if (mode.equals(PathwayNetworkMode.RESET_ALL_PATHWAYS)) { grid.resetAllPathways(); @@ -234,9 +328,9 @@ private void readPathwayAction(final ReadBuffer buffer) { final Point p2 = Point.of(buffer); final PathType type = buffer.getEnumValue(PathType.class); final PathwayRequestResult request = grid.requestWay(p1, p2, type); - if (!request.isPass()) { + if (!request.wasSuccesfull()) { final SignalBoxNode endNode = grid.getNode(p2); - if (request.canBeAddedToSaver() && type.equals(PathType.NORMAL) + if (request.canBeAddedToSaver(type) && type.equals(PathType.NORMAL) && !endNode.containsOutConnection() && grid.addNextPathway(p1, p2, type)) { sendAddSavedPathway(p1, p2, type, request); return; @@ -250,37 +344,39 @@ private void resetPathway(final Point p1) { final SignalBoxPathway pw = grid.getPathwayByStartPoint(p1); final boolean isShuntingPath = pw != null ? pw.isShuntingPath() : false; if (grid.resetPathway(p1) && !isShuntingPath) { - grid.countOne(); - sendCounter(); + grid.count(); } } private void readSavedPathway(final ReadBuffer buffer) { - final Point start = Point.of(buffer); - final Point end = Point.of(buffer); - final boolean state = buffer.getBoolean(); - if (state == REMOVE) - // TODO Remove from Container + final Point p1 = Point.of(buffer); + final Point p2 = Point.of(buffer); + final byte state = buffer.getByte(); + if (state == REMOVE) { + container.handleRemoveSavedPathway(p1, p2); return; + } final PathType type = buffer.getEnumValue(PathType.class); - final PathwayRequestResult result = buffer.getEnumValue(PathwayRequestResult.class); - // TODO set in Container + final PathwayRequestMode result = buffer.getEnumValue(PathwayRequestMode.class); + container.handleAddSavedPathway(p1, p2, type, result); } private void readSubsidiary(final ReadBuffer buffer) { final ModeIdentifier ident = ModeIdentifier.of(buffer); - final SubsidiaryEntry entry = SubsidiaryEntry.of(buffer); - // TODO Set of Subsidioary + final SubsidiaryState entry = SubsidiaryState.of(buffer); + final boolean state = buffer.getBoolean(); + container.updateServerSubsidiary(ident, entry, state); } - private void updateTrainNumber(final ReadBuffer buffer) { + private void readUpdateTrainNumber(final ReadBuffer buffer) { final Point point = Point.of(buffer); final TrainNumber number = TrainNumber.of(buffer); - // TODO Update trainnumber + getGrid().updateTrainNumber(point, number); } private void readDebugPoints(final ReadBuffer buffer) { - // TODO Read Debug List + container.handleDebugPoints( + buffer.getList(ReadBuffer.getINetworkSaveableFunction(Point.class))); } private WriteBuffer getSavedPathwayBuffer(final Point p1, final Point p2) { @@ -290,7 +386,7 @@ private WriteBuffer getSavedPathwayBuffer(final Point p1, final Point p2) { return buffer; } - private WriteBuffer getPointBuffer(final Point point, final NodeNetworkMode mode) { + private WriteBuffer getNodeBuffer(final Point point, final NodeNetworkMode mode) { final WriteBuffer buffer = NODE_SPECIAL_ENTRIES.getBuffer(); buffer.putEnumValue(mode); point.writeNetwork(buffer); @@ -309,35 +405,25 @@ private WriteBuffer getPathwayBuffer(final PathwayNetworkMode mode) { return buffer; } - private WriteBuffer getEntryBuffer(final ModeIdentifier ident, final PathEntryType type, - final boolean state) { + private WriteBuffer getEntryBuffer(final ModeIdentifier ident, final EntryNetworkMode mode) { final WriteBuffer buffer = ENTRY.getBuffer(); - buffer.putBoolean(state); + buffer.putEnumValue(mode); ident.writeNetwork(buffer); - buffer.putInt(type.getID()); return buffer; } protected SignalBoxGrid getGrid() { - return container.grid; + return container.getGrid(); } - @Override - public void deserializeClient(final ReadBuffer buf) { - executeRead(buf); - } - - @Override - public void deserializeServer(final ReadBuffer buf) { - executeRead(buf); - } - - private void executeRead(final ReadBuffer buffer) { + public void desirializeBuffer(final ReadBuffer buffer) { final SignalBoxNetworkMode mode = SignalBoxNetworkMode.getModeFromBuffer(buffer); - mode.executeRead(buffer); + mode.executeRead(buffer, this); } private void sendBuffer(final WriteBuffer buffer) { + if (!containerConnected()) + return; OpenSignalsMain.network.sendTo(container.getPlayer(), buffer); } @@ -361,10 +447,14 @@ private static enum PathwayNetworkMode { } private static enum NodeNetworkMode { - LABEL, AUTO_POINT, MANUELL_OUTPUT; + LABEL, AUTO_POINT, MANUELL_OUTPUT, SIGNAL_STATE; } private static enum GridNetworkMode { SEND_ALL, COUNTER, REMOVE_POS; } + + private static enum EntryNetworkMode { + MODE_ADD, MODE_REMOVE, ENTRY_ADD, ENTRY_REMOVE; + } } \ No newline at end of file diff --git a/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkMode.java b/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkMode.java index 18f08bfaf..b5d8e7c63 100644 --- a/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkMode.java +++ b/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkMode.java @@ -3,7 +3,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; -import java.util.function.Consumer; +import java.util.function.BiConsumer; import com.troblecodings.core.ReadBuffer; import com.troblecodings.core.WriteBuffer; @@ -13,9 +13,9 @@ public class SignalBoxNetworkMode { private static final List NETWORK_ENTRIES = new ArrayList<>(); private int id; - private final Consumer read; + private final BiConsumer read; - public SignalBoxNetworkMode(final Consumer read) { + public SignalBoxNetworkMode(final BiConsumer read) { this.read = read; this.id = NETWORK_ENTRIES.size(); NETWORK_ENTRIES.add(this); @@ -25,8 +25,8 @@ public static SignalBoxNetworkMode getModeFromBuffer(final ReadBuffer buffer) { return NETWORK_ENTRIES.get(buffer.getInt()); } - public void executeRead(final ReadBuffer buffer) { - read.accept(buffer); + public void executeRead(final ReadBuffer buffer, final SignalBoxNetworkHandler network) { + read.accept(buffer, network); } public WriteBuffer getBuffer() { diff --git a/src/main/java/com/troblecodings/signals/signalbox/InterSignalBoxPathway.java b/src/main/java/com/troblecodings/signals/signalbox/InterSignalBoxPathway.java index a8dcef2e3..dc0b3e916 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/InterSignalBoxPathway.java +++ b/src/main/java/com/troblecodings/signals/signalbox/InterSignalBoxPathway.java @@ -1,7 +1,5 @@ package com.troblecodings.signals.signalbox; -import java.util.ArrayList; -import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicReference; @@ -70,8 +68,9 @@ public void postRead(final NBTWrapper tag) { } else { final AtomicReference otherGrid = new AtomicReference<>(); otherGrid.set(SignalBoxHandler.getGrid(new StateInfo(world, otherPos))); - if (otherGrid.get() == null) + if (otherGrid.get() == null) { loadTileAndExecute(otherPos, tile -> otherGrid.set(tile.getSignalBoxGrid())); + } final SignalBoxPathway otherPathway = otherGrid.get().getPathwayByLastPoint(end); pathwayToBlock = (InterSignalBoxPathway) otherPathway; @@ -88,8 +87,9 @@ public void postRead(final NBTWrapper tag) { } else { final AtomicReference otherGrid = new AtomicReference<>(); otherGrid.set(SignalBoxHandler.getGrid(new StateInfo(world, otherPos))); - if (otherGrid.get() == null) + if (otherGrid.get() == null) { loadTileAndExecute(otherPos, tile -> otherGrid.set(tile.getSignalBoxGrid())); + } final SignalBoxPathway otherPathway = otherGrid.get().getPathwayByLastPoint(end); pathwayToReset = (InterSignalBoxPathway) otherPathway; @@ -106,9 +106,10 @@ public void onLoad() { if (blockPW != null) { final AtomicReference otherGrid = new AtomicReference<>(); otherGrid.set(SignalBoxHandler.getGrid(new StateInfo(world, blockPW.getKey()))); - if (otherGrid.get() == null) + if (otherGrid.get() == null) { loadTileAndExecute(blockPW.getKey(), tile -> otherGrid.set(tile.getSignalBoxGrid())); + } if (otherGrid.get() != null) { final SignalBoxPathway otherPathway = otherGrid.get() @@ -123,9 +124,10 @@ public void onLoad() { if (resetPW != null) { final AtomicReference otherGrid = new AtomicReference<>(); otherGrid.set(SignalBoxHandler.getGrid(new StateInfo(world, resetPW.getKey()))); - if (otherGrid.get() == null) + if (otherGrid.get() == null) { loadTileAndExecute(resetPW.getKey(), tile -> otherGrid.set(tile.getSignalBoxGrid())); + } if (otherGrid.get() != null) { final SignalBoxPathway otherPathway = otherGrid.get() @@ -145,12 +147,13 @@ protected SignalStateInfo getLastSignalInfo() { if (pathwayToBlock != null) { final MainSignalIdentifier otherLastSignal = pathwayToBlock.data.getEndSignal(); if (otherLastSignal != null) { - final Signal nextSignal = SignalBoxHandler.getSignal( - new StateInfo(pathwayToBlock.tile.getWorld(), pathwayToBlock.tile.getPos()), - otherLastSignal.pos); - if (nextSignal != null) - lastSignalInfo = new SignalStateInfo(tile.getWorld(), otherLastSignal.pos, + final Signal nextSignal = SignalBoxHandler + .getSignal(new StateInfo(pathwayToBlock.tile.getLevel(), + pathwayToBlock.tile.getBlockPos()), otherLastSignal.pos); + if (nextSignal != null) { + lastSignalInfo = new SignalStateInfo(tile.getLevel(), otherLastSignal.pos, nextSignal); + } } } return super.getLastSignalInfo(); @@ -217,7 +220,6 @@ public boolean tryBlock(final BlockPos position) { pathwayToBlock = (InterSignalBoxPathway) pw; pathwayToBlock.setPathStatus(EnumPathUsage.BLOCKED); pathwayToBlock.updateTrainNumber(trainNumber); - otherGrid.updateToNet(pathwayToBlock); }); } return result; @@ -225,17 +227,14 @@ public boolean tryBlock(final BlockPos position) { @Override protected void updateSignalStates() { - final List nodes = new ArrayList<>(); final MainSignalIdentifier startSignal = data.getStartSignal(); final MainSignalIdentifier lastSignal = data.getEndSignal(); if (startSignal != null) { if (isBlocked) return; startSignal.updateSignalState(SignalState.GREEN); - nodes.add(startSignal.node); data.getPreSignals().forEach(signalIdent -> { signalIdent.updateSignalState(SignalState.GREEN); - nodes.add(signalIdent.node); }); } final Map distantSignalPositions = data @@ -243,19 +242,20 @@ protected void updateSignalStates() { distantSignalPositions.forEach((holder, position) -> { if (holder.shouldTurnSignalOff()) { position.updateSignalState(SignalState.OFF); - nodes.add(position.node); return; } final SignalBoxPathway next = getNextPathway(); SignalState toSet = SignalState.RED; if (lastSignal != null && next != null && !next.isEmptyOrBroken()) { - if (!next.isExecutingSignalSet) + if (!next.isExecutingSignalSet) { toSet = SignalState.GREEN; + } } else if (pathwayToBlock != null) { final SignalBoxPathway otherNext = pathwayToBlock.getNextPathway(); if (otherNext != null && !otherNext.isEmptyOrBroken()) { - if (!otherNext.isExecutingSignalSet) + if (!otherNext.isExecutingSignalSet) { toSet = SignalState.GREEN; + } } else { toSet = SignalState.RED; } @@ -268,9 +268,7 @@ protected void updateSignalStates() { toSet = SignalState.OFF; } position.updateSignalState(toSet); - nodes.add(position.node); }); - updateSignalsOnClient(nodes); } public void setOtherPathwayToBlock(final InterSignalBoxPathway pathway) { diff --git a/src/main/java/com/troblecodings/signals/signalbox/PathwayData.java b/src/main/java/com/troblecodings/signals/signalbox/PathwayData.java index e6e85805a..d5e884a5a 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/PathwayData.java +++ b/src/main/java/com/troblecodings/signals/signalbox/PathwayData.java @@ -220,17 +220,12 @@ protected boolean resetProtectionWay() { Thread.sleep(protectionWayResetDelay * 1000); } catch (final InterruptedException e) { } - final World world = pathway.tile.getWorld(); - world.getMinecraftServer() - .addScheduledTask(() -> pathway.loadTileAndExecute(tile -> { - final SignalBoxGrid grid = tile.getSignalBoxGrid(); - final SignalBoxPathway pw = grid.getPathwayByLastPoint(getLastPoint()); - if (pw == null) - return; - pw.directResetOfProtectionWay(); - pw.removeProtectionWay(); - grid.updateToNet(pw); - })); + this.protectionWayNodes = copy; + directResetOfProtectionWay(); + final Level world = pathway.tile.getLevel(); + world.getServer().execute(() -> { + removeProtectionWay(); + }); }).start(); return true; } @@ -290,7 +285,7 @@ private void initalize() { .ifPresent(value -> zs6State.set(value.booleanValue())); optionEntry.getEntry(PathEntryType.CONNECTED_TRAINNUMBER).ifPresent(ident -> { final Optional entry = grid.getNodeChecked(ident.point) - .orElse(new SignalBoxNode()).getOption(ident.mode); + .orElse(new SignalBoxNode(grid.getNetwork())).getOption(ident.mode); if (entry.isPresent()) { trainNumberDisplays.add(ident); } else { @@ -365,7 +360,9 @@ private void initalize() { posIdents.removeIf(ident -> !grid.getNode(ident.getPoint()).has(ident.getModeSet())); this.preSignals = ImmutableList.copyOf(posIdents.stream().map(ident -> { final PathOptionEntry vpEntry = grid.getNode(ident.getPoint()) - .getOption(ident.getModeSet()).orElse(new PathOptionEntry()); + .getOption(ident.getModeSet()) + .orElse(SignalBoxFactory.getFactory().getEntry( + new ModeIdentifier(ident.getPoint(), ident.getModeSet()))); return new OtherSignalIdentifier(ident.getPoint(), ident.getModeSet(), ident.pos, vpEntry.getEntry(PathEntryType.SIGNAL_REPEATER).orElse(false), EnumGuiMode.VP, grid); diff --git a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java index faeaf9506..d1bab4e5b 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java +++ b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java @@ -1,6 +1,5 @@ package com.troblecodings.signals.signalbox; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -27,7 +26,8 @@ import com.troblecodings.signals.enums.PathType; import com.troblecodings.signals.enums.PathwayRequestResult; import com.troblecodings.signals.enums.PathwayRequestResult.PathwayRequestMode; -import com.troblecodings.signals.enums.SignalBoxNetwork; +import com.troblecodings.signals.guis.ContainerSignalBox; +import com.troblecodings.signals.network.SignalBoxNetworkHandler; import com.troblecodings.signals.signalbox.debug.SignalBoxFactory; import com.troblecodings.signals.signalbox.entrys.PathEntryType; import com.troblecodings.signals.signalbox.entrys.PathOptionEntry; @@ -54,6 +54,7 @@ public class SignalBoxGrid implements INetworkSaveable, ISaveable { protected final SignalBoxFactory factory; protected SignalBoxTileEntity tile; private int counter; + private final SignalBoxNetworkHandler network = new SignalBoxNetworkHandler(); public SignalBoxGrid() { this.factory = SignalBoxFactory.getFactory(); @@ -96,7 +97,6 @@ public boolean resetPathway(final Point p1) { return false; } resetPathway(pathway); - updateToNet(pathway); tryNextPathways(); return true; } @@ -107,7 +107,6 @@ private boolean checkManuellResetOfProtectionWay(final Point p1) { return false; final boolean isReset = pathway.directResetOfProtectionWay(); if (isReset) { - updateToNet(pathway); pathway.removeProtectionWay(); } return isReset; @@ -122,7 +121,8 @@ protected void resetPathway(final SignalBoxPathway pathway) { } public void updateMode(final Point point, final ModeSet mode) { - final SignalBoxNode node = this.modeGrid.computeIfAbsent(point, SignalBoxNode::new); + final SignalBoxNode node = this.modeGrid.computeIfAbsent(point, + p -> new SignalBoxNode(p, network)); if (!node.has(mode)) { node.add(mode); } else { @@ -130,16 +130,16 @@ public void updateMode(final Point point, final ModeSet mode) { } } - protected void updateToNet(final SignalBoxPathway pathway) { - if (tile == null || !tile.isBlocked()) - return; - final List allNodes = new ArrayList<>(); - allNodes.addAll(pathway.getListOfNodes()); - allNodes.addAll(pathway.getProtectionWayNodes()); - final WriteBuffer buffer = new WriteBuffer(); - buffer.putEnumValue(SignalBoxNetwork.SEND_PW_UPDATE); - buffer.putList(allNodes, NetworkBufferWrappers.POINT_SIGNALBOXNODE_CONSUMER); - OpenSignalsMain.network.sendTo(tile.get(0).getPlayer(), buffer); + public void setUpNetwork(final ContainerSignalBox container) { + network.setUpNetwork(container); + } + + public void removeNetwork() { + network.removeNetwork(); + } + + public SignalBoxNetworkHandler getNetwork() { + return network; } public PathwayRequestResult requestWay(final Point p1, final Point p2, final PathType type) { @@ -179,7 +179,6 @@ protected void addPathway(final PathwayData data) { way.setUpPathwayStatus(); way.updatePathwaySignals(); onWayAdd(way); - updateToNet(way); } protected void updatePrevious(final SignalBoxPathway pathway) { @@ -239,14 +238,12 @@ private void tryBlock(final List pathways, final BlockPos pos) try { if (pathway.tryBlock(pos)) { updatePrevious(pathway); - updateToNet(pathway); } } catch (final Exception e) { OpenSignalsMain.getLogger().error( "There was an issue while trying to block " + pathway + "! Resetting!"); e.printStackTrace(); resetPathway(pathway); - updateToNet(pathway); tryNextPathways(); } @@ -261,24 +258,21 @@ private void tryReset(final List pathways, final BlockPos pos) if (optPoint.isPresent()) { if (pathway.isEmptyOrBroken()) { resetPathway(pathway); - updateToNet(pathway); pathway.checkReRequest(); } else { - updateToNet(pathway); pathway.compact(optPoint.get()); this.startsToPath.remove(first); this.startsToPath.put(pathway.getFirstPoint(), pathway); } } if (pathway.checkResetOfProtectionWay(pos)) { - updateToNet(pathway); + pathway.removeProtectionWay(); } } catch (final Exception e) { OpenSignalsMain.getLogger().error( "There was an issue while trying to reset " + pathway + "! Resetting!"); e.printStackTrace(); resetPathway(pathway); - updateToNet(pathway); } }); tryNextPathways(); @@ -302,6 +296,9 @@ private void tryNextPathways() { pointEntry.getValue().writeNetwork(buffer); OpenSignalsMain.network.sendTo(tile.get(0).getPlayer(), buffer); } + network.sendRemoveSavedPathway(entry.getKey(), entry.getValue()); + toRemove.put(entry, type); + return; } }); executingTryNextPWs = false; @@ -332,7 +329,8 @@ public SignalBoxPathway getPathwayByLastPoint(final Point end) { } public void updateTrainNumber(final Point point, final TrainNumber number) { - final SignalBoxNode node = modeGrid.computeIfAbsent(point, p -> new SignalBoxNode(p)); + final SignalBoxNode node = modeGrid.computeIfAbsent(point, + p -> new SignalBoxNode(p, network)); startsToPath.values().forEach(pathway -> pathway.checkTrainNumberUpdate(number, node)); } @@ -379,7 +377,7 @@ public void writePathways(final NBTWrapper tag) { public void read(final NBTWrapper tag) { modeGrid.clear(); tag.getList(NODE_LIST).forEach(comp -> { - final SignalBoxNode node = new SignalBoxNode(); + final SignalBoxNode node = new SignalBoxNode(network); node.read(comp); modeGrid.put(node.getPoint(), node); final List subsidiaryTags = comp.getList(SUBSIDIARY_LIST); @@ -454,6 +452,10 @@ public SignalBoxNode getNode(final Point point) { return modeGrid.get(point); } + public SignalBoxNode getOrCreateNode(final Point point) { + return modeGrid.computeIfAbsent(point, p -> new SignalBoxNode(p, network)); + } + public Optional getNodeChecked(final Point point) { return Optional.ofNullable(getNode(point)); } @@ -472,6 +474,11 @@ public void count() { public void setCounter(final int counter) { this.counter = (counter < MAX_COUNTS ? counter : 0); + network.sendCounter(); + } + + public void setCounterFromNetwork(final int counter) { + this.counter = counter; } protected Map getModeGrid() { @@ -487,7 +494,7 @@ public void readNetwork(final ReadBuffer buffer) { modeGrid.clear(); modeGrid.putAll(buffer.getMapWithCombinedValueFunc( ReadBuffer.getINetworkSaveableFunction(Point.class), - (b, point) -> NetworkBufferWrappers.getSignalBoxNodeFunc(point).apply(b))); + (b, point) -> NetworkBufferWrappers.getSignalBoxNodeFunc(point, network).apply(b))); counter = buffer.getInt(); } @@ -502,9 +509,9 @@ public List readUpdateNetwork(final ReadBuffer buffer, final bool final Point point = Point.of(buf); SignalBoxNode node; if (override) { - node = new SignalBoxNode(point); + node = new SignalBoxNode(point, network); } else { - node = modeGrid.computeIfAbsent(point, _u -> new SignalBoxNode(point)); + node = modeGrid.computeIfAbsent(point, _u -> new SignalBoxNode(point, network)); } node.readNetwork(buf); modeGrid.put(point, node); @@ -536,11 +543,6 @@ public List getAllPoints() { } public void sendDebugPointUpdates(final List points) { - if (tile == null || !tile.isBlocked()) - return; - final WriteBuffer buffer = new WriteBuffer(); - buffer.putEnumValue(SignalBoxNetwork.SEND_DEBUG_POINTS); - buffer.putISaveableList(points); - OpenSignalsMain.network.sendTo(tile.get(0).getPlayer(), buffer); + network.sendDebugPoints(points); } } \ No newline at end of file diff --git a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxNode.java b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxNode.java index ed071aa84..3e90d2acd 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxNode.java +++ b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxNode.java @@ -13,18 +13,19 @@ import javax.annotation.Nullable; -import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.troblecodings.core.NBTWrapper; import com.troblecodings.core.ReadBuffer; import com.troblecodings.core.WriteBuffer; import com.troblecodings.core.interfaces.INetworkSaveable; import com.troblecodings.core.interfaces.ISaveable; +import com.troblecodings.signals.core.ModeIdentifier; import com.troblecodings.signals.core.SubsidiaryState; import com.troblecodings.signals.enums.EnumGuiMode; import com.troblecodings.signals.enums.EnumPathUsage; import com.troblecodings.signals.enums.PathType; import com.troblecodings.signals.enums.PathwayRequestResult.PathwayRequestMode; +import com.troblecodings.signals.network.SignalBoxNetworkHandler; import com.troblecodings.signals.signalbox.MainSignalIdentifier.SignalState; import com.troblecodings.signals.signalbox.SignalBoxUtil.PathIdentifier; import com.troblecodings.signals.signalbox.debug.SignalBoxFactory; @@ -42,32 +43,50 @@ public class SignalBoxNode implements INetworkSaveable, ISaveable, Iterable enabledSubsidiaryStates = new HashMap<>(); private final List manuellEnabledOutputs = new ArrayList<>(); private final Point point; + private final SignalBoxNetworkHandler network; private boolean isAutoPoint = false; private String customText = ""; - public SignalBoxNode() { - this(new Point()); + public SignalBoxNode(final SignalBoxNetworkHandler network) { + this(new Point(), network); } - public SignalBoxNode(final Point point) { + public SignalBoxNode(final Point point, final SignalBoxNetworkHandler network) { this.point = Objects.requireNonNull(point); + this.network = Objects.requireNonNull(network); } public void add(final ModeSet modeSet) { - possibleModes.put(modeSet, SignalBoxFactory.getFactory().getEntry()); + final ModeIdentifier ident = new ModeIdentifier(point, modeSet); + final PathOptionEntry entry = SignalBoxFactory.getFactory().getEntry(ident); + entry.setUpNetwork(network); + possibleModes.put(modeSet, entry); + network.sendModeAdd(ident); + } + + public boolean has(final ModeSet modeSet) { + return possibleModes.containsKey(modeSet); + } + + public void remove(final ModeSet modeSet) { + possibleModes.remove(modeSet); + network.sendModeRemove(new ModeIdentifier(point, modeSet)); } public void addAndSetEntry(final ModeSet mode, final PathEntryType entry, final T type) { final PathOptionEntry optionEntry = possibleModes.computeIfAbsent(mode, - _u -> SignalBoxFactory.getFactory().getEntry()); + _u -> SignalBoxFactory.getFactory().getEntry(new ModeIdentifier(point, mode))); + optionEntry.setUpNetwork(network); optionEntry.setEntry(entry, type); } public void updateState(final ModeSet modeSet, final SignalState state) { - if (state == SignalState.RED) + if (state == SignalState.RED) { this.signalStates.remove(modeSet); - else + } else { this.signalStates.put(modeSet, state); + } + network.sendUpdateSignalStates(this); } public SignalState getState(final ModeSet modeSet) { @@ -90,18 +109,16 @@ public Map getSubsidiaryStates() { return ImmutableMap.copyOf(enabledSubsidiaryStates); } - public boolean has(final ModeSet modeSet) { - return possibleModes.containsKey(modeSet); - } - public void addManuellOutput(final ModeSet mode) { if (!manuellEnabledOutputs.contains(mode)) { manuellEnabledOutputs.add(mode); + network.sendOutputUpdates(this); } } public void removeManuellOutput(final ModeSet mode) { manuellEnabledOutputs.remove(mode); + network.sendOutputUpdates(this); } public List clearAllManuellOutputs() { @@ -109,19 +126,17 @@ public List clearAllManuellOutputs() { manuellEnabledOutputs.forEach(mode -> returnList .add(possibleModes.get(mode).getEntry(PathEntryType.OUTPUT).get())); manuellEnabledOutputs.clear(); + network.sendOutputUpdates(this); return returnList; } - public List getManuellEnabledOutputs() { - return ImmutableList.copyOf(manuellEnabledOutputs); - } - - public void remove(final ModeSet modeSet) { - possibleModes.remove(modeSet); + public void setAutoPointFromNetwork(final boolean isAutoPoint) { + this.isAutoPoint = isAutoPoint; } public void setAutoPoint(final boolean isAutoPoint) { this.isAutoPoint = isAutoPoint; + network.sendAutoPoint(point, isAutoPoint); } public boolean isAutoPoint() { @@ -265,9 +280,10 @@ public void read(final NBTWrapper compound) { final SignalBoxFactory factory = SignalBoxFactory.getFactory(); final boolean oldOutputSystem = compound.contains(ENABLED_OUTPUTS); compound.getList(POINT_LIST).forEach(tag -> { - final PathOptionEntry entry = factory.getEntry(); - entry.read(tag); final ModeSet mode = new ModeSet(tag); + final PathOptionEntry entry = factory.getEntry(new ModeIdentifier(point, mode)); + entry.setUpNetwork(network); + entry.read(tag); possibleModes.put(mode, entry); if (!oldOutputSystem) if (tag.getBoolean(ENABLED_OUTPUTS)) { @@ -278,8 +294,9 @@ public void read(final NBTWrapper compound) { final String stateName = tag.getString(SIGNAL_STATE); if (stateName != null && !stateName.isEmpty()) { final SignalState state = SignalState.valueOf(stateName); - if (!state.equals(SignalState.RED)) + if (!state.equals(SignalState.RED)) { signalStates.put(mode, state); + } } if (tag.contains(SUBSIDIARY_ENTRY)) { final NBTWrapper subsidiaryWrapper = tag.getWrapper(SUBSIDIARY_ENTRY); @@ -379,7 +396,9 @@ public boolean isUsedInDirection(final Point point, @Nullable final EnumPathUsag if (mode == null) { continue; } - final EnumPathUsage usage = getOption(mode).orElse(new PathOptionEntry()) + final EnumPathUsage usage = getOption(mode) + .orElse(SignalBoxFactory.getFactory() + .getEntry(new ModeIdentifier(this.point, mode))) .getEntry(PathEntryType.PATHUSAGE).orElse(EnumPathUsage.FREE); if (!(usage.equals(exclude) || usage.equals(EnumPathUsage.FREE))) return true; @@ -471,11 +490,13 @@ public void readNetwork(final ReadBuffer buffer) { possibleModes.clear(); manuellEnabledOutputs.clear(); final SignalBoxFactory factory = SignalBoxFactory.getFactory(); - buffer.getMap(ReadBuffer.getINetworkSaveableFunction(ModeSet.class), (buf) -> { - final PathOptionEntry entry = factory.getEntry(); - entry.readNetwork(buf); - return entry; - }).forEach((mode, entry) -> possibleModes.put(mode, entry)); + buffer.getMapWithCombinedValueFunc(ReadBuffer.getINetworkSaveableFunction(ModeSet.class), + (buf, mode) -> { + final PathOptionEntry entry = factory.getEntry(new ModeIdentifier(point, mode)); + entry.setUpNetwork(network); + entry.readNetwork(buf); + return entry; + }).forEach((mode, entry) -> possibleModes.put(mode, entry)); buffer.getList(ReadBuffer.getINetworkSaveableFunction(ModeSet.class)).forEach(mode -> { if (!manuellEnabledOutputs.contains(mode)) { manuellEnabledOutputs.add(mode); @@ -507,6 +528,43 @@ public void writeNetwork(final WriteBuffer buffer) { (buf, entry) -> entry.writeNetwork(buf)); } + public void applyModeNetworkChanges(final ModeIdentifier ident) { + if (!has(ident.mode)) { + final PathOptionEntry entry = SignalBoxFactory.getFactory().getEntry(ident); + entry.setUpNetwork(network); + possibleModes.put(ident.mode, entry); + } else { + possibleModes.remove(ident.mode); + } + } + + public void writeManuellEnabledOutputs(final WriteBuffer buffer) { + buffer.putISaveableList(manuellEnabledOutputs); + } + + public void writeSignalStates(final WriteBuffer buffer) { + buffer.putMap(signalStates, WriteBuffer.getINetworkSaveableConsumer(), + WriteBuffer.getEnumConsumer()); + buffer.putMap(enabledSubsidiaryStates, WriteBuffer.getINetworkSaveableConsumer(), + (buf, state) -> state.writeNetwork(buf)); + } + + public void readManuellEnabledOutputs(final ReadBuffer buffer) { + manuellEnabledOutputs.clear(); + manuellEnabledOutputs + .addAll(buffer.getList(ReadBuffer.getINetworkSaveableFunction(ModeSet.class))); + } + + public void readSignalStates(final ReadBuffer buffer) { + signalStates.clear(); + enabledSubsidiaryStates.clear(); + signalStates.putAll(buffer.getMap(ReadBuffer.getINetworkSaveableFunction(ModeSet.class), + ReadBuffer.getEnumFunction(SignalState.class))); + enabledSubsidiaryStates + .putAll(buffer.getMap(ReadBuffer.getINetworkSaveableFunction(ModeSet.class), + buf -> SubsidiaryState.of(buf))); + } + public String getCustomText() { return customText; } diff --git a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxPathway.java b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxPathway.java index 12afb194e..19a757b32 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxPathway.java +++ b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxPathway.java @@ -1,6 +1,5 @@ package com.troblecodings.signals.signalbox; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; @@ -12,19 +11,15 @@ import javax.annotation.Nullable; import com.troblecodings.core.NBTWrapper; -import com.troblecodings.core.WriteBuffer; -import com.troblecodings.signals.OpenSignalsMain; import com.troblecodings.signals.blocks.RedstoneIO; import com.troblecodings.signals.blocks.Signal; import com.troblecodings.signals.core.BlockPosSignalHolder; import com.troblecodings.signals.core.ModeIdentifier; -import com.troblecodings.signals.core.NetworkBufferWrappers; import com.troblecodings.signals.core.StateInfo; import com.troblecodings.signals.core.TrainNumber; import com.troblecodings.signals.enums.EnumGuiMode; import com.troblecodings.signals.enums.EnumPathUsage; import com.troblecodings.signals.enums.PathType; -import com.troblecodings.signals.enums.SignalBoxNetwork; import com.troblecodings.signals.handler.SignalBoxHandler; import com.troblecodings.signals.handler.SignalStateInfo; import com.troblecodings.signals.signalbox.MainSignalIdentifier.SignalState; @@ -249,17 +244,13 @@ private void updatePreSignals() { } protected void updateSignalStates() { - // TODO Just workaround until the new networking comes - final List nodesToUpdate = new ArrayList<>(); final MainSignalIdentifier startSignal = data.getStartSignal(); final MainSignalIdentifier endSignal = data.getEndSignal(); if (startSignal != null) { if (!isBlocked) { startSignal.updateSignalState(SignalState.GREEN); - nodesToUpdate.add(startSignal.node); data.getPreSignals().forEach(signalIdent -> { signalIdent.updateSignalState(SignalState.GREEN); - nodesToUpdate.add(signalIdent.node); }); } } @@ -288,36 +279,17 @@ protected void updateSignalStates() { stateToSet = SignalState.OFF; } position.updateSignalState(stateToSet); - nodesToUpdate.add(position.node); }); - updateSignalsOnClient(nodesToUpdate); } protected void updatePathwayOnGrid() { grid.updatePrevious(this); - grid.updateToNet(this); } protected void setSignalBoxGrid(final SignalBoxGrid grid) { this.grid = grid; } - protected void updateSignalsOnClient(final List nodes) { - if (nodes.isEmpty()) - return; - final World world = tile.getWorld(); - if (world == null || world.isRemote) - return; - world.getMinecraftServer().addScheduledTask(() -> { - if (tile == null || !tile.isBlocked()) - return; - final WriteBuffer buffer = new WriteBuffer(); - buffer.putEnumValue(SignalBoxNetwork.SET_SIGNAL_STATE); - buffer.putList(nodes, NetworkBufferWrappers.POINT_SIGNALBOXNODE_CONSUMER); - OpenSignalsMain.network.sendTo(tile.get(0).getPlayer(), buffer); - }); - } - public void resetPathway() { resetPathway(null); } @@ -331,15 +303,13 @@ public void resetAllSignals() { private void resetFirstSignal() { final MainSignalIdentifier startSignal = data.getStartSignal(); if (startSignal != null) { - final StateInfo stateInfo = new StateInfo(tile.getWorld(), tile.getPos()); - final List nodes = new ArrayList<>(); + final StateInfo stateInfo = new StateInfo(tile.getLevel(), tile.getBlockPos()); final Signal current = SignalBoxHandler.getSignal(stateInfo, startSignal.pos); if (current == null) return; SignalConfig.reset( new ResetInfo(new SignalStateInfo(tile.getWorld(), startSignal.pos, current))); startSignal.updateSignalState(SignalState.RED); - nodes.add(startSignal.node); data.getPreSignals().forEach(ident -> { final Signal currentPreSignal = SignalBoxHandler.getSignal(stateInfo, ident.pos); if (currentPreSignal == null) @@ -348,14 +318,11 @@ private void resetFirstSignal() { new SignalStateInfo(tile.getWorld(), ident.pos, currentPreSignal), ident.isRepeater)); ident.updateSignalState(SignalState.RED); - nodes.add(ident.node); }); - updateSignalsOnClient(nodes); } } private void resetOther() { - final List nodes = new ArrayList<>(); final Map distantSignalPositions = data .getOtherSignals(); distantSignalPositions.values().forEach((position) -> { @@ -367,9 +334,7 @@ private void resetOther() { new ResetInfo(new SignalStateInfo(tile.getWorld(), position.pos, current), position.isRepeater)); position.updateSignalState(SignalState.RED); - nodes.add(position.node); }); - updateSignalsOnClient(nodes); } public void resetPathway(final @Nullable Point point) { @@ -378,7 +343,6 @@ public void resetPathway(final @Nullable Point point) { if (data.totalPathwayReset(point)) { resetOther(); resetAllTrainNumbers(); - sendTrainNumberUpdates(); directResetOfProtectionWay(); } } @@ -392,7 +356,6 @@ public void postReset() { } public void compact(final Point point) { - final List nodes = new ArrayList<>(); data.foreachPath((path, node) -> { final Rotation rotation = SignalBoxUtil .getRotationFromDelta(node.getPoint().delta(path.point1)); @@ -415,20 +378,16 @@ public void compact(final Point point) { new SignalStateInfo(tile.getWorld(), position, current), identifier.isRepeater)); identifier.updateSignalState(SignalState.RED); - nodes.add(identifier.node); final OtherSignalIdentifier otherIdent = distantSignalPositions .get(new BlockPosSignalHolder(position, true)); if (otherIdent != null) { otherIdent.updateSignalState(SignalState.RED); - nodes.add(otherIdent.node); } })); } }, point); resetAllTrainNumbers(data.getTrainNumberDisplays()); - sendTrainNumberUpdates(); data.compact(point); - updateSignalsOnClient(nodes); updateTrainNumber(trainNumber); updateSignalStates(); } @@ -533,24 +492,16 @@ protected void updateTrainNumber(final TrainNumber number) { final List trainNumberDisplays = data.getTrainNumberDisplays(); if (trainNumberDisplays == null || number == null) return; - trainNumberDisplays.forEach(ident -> grid.getNode(ident.point).getOption(ident.mode) - .orElse(new PathOptionEntry()).setEntry(PathEntryType.TRAINNUMBER, number)); - this.trainNumber = number; - sendTrainNumberUpdates(); - } - - private void sendTrainNumberUpdates() { - if (!this.tile.isBlocked()) - return; - final List trainNumberDisplays = data.getTrainNumberDisplays(); - final WriteBuffer buffer = new WriteBuffer(); - buffer.putEnumValue(SignalBoxNetwork.SEND_TRAIN_NUMBER); - buffer.putList(trainNumberDisplays, (buf, ident) -> { - final SignalBoxNode node = grid.getNode(ident.point); - node.getPoint().writeNetwork(buffer); - node.writeNetwork(buffer); + trainNumberDisplays.forEach(ident -> { + final PathOptionEntry entry = grid.getNode(ident.point).getOption(ident.mode) + .orElse(new PathOptionEntry(ident)); + if (number.equals(TrainNumber.DEFAULT)) { + entry.removeEntry(PathEntryType.TRAINNUMBER); + } else { + entry.setEntry(PathEntryType.TRAINNUMBER, number); + } }); - OpenSignalsMain.network.sendTo(tile.get(0).getPlayer(), buffer); + this.trainNumber = number; } private void resetAllTrainNumbers() { @@ -563,7 +514,7 @@ private void resetAllTrainNumbers(final List trainNumberDisplays final SignalBoxNode node = grid.getNode(ident.point); if (node == null) return; - node.getOption(ident.mode).orElse(new PathOptionEntry()) + node.getOption(ident.mode).orElse(new PathOptionEntry(ident)) .removeEntry(PathEntryType.TRAINNUMBER); }); } diff --git a/src/main/java/com/troblecodings/signals/signalbox/debug/DebugFactory.java b/src/main/java/com/troblecodings/signals/signalbox/debug/DebugFactory.java index efac94a4f..07bdd5d5d 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/debug/DebugFactory.java +++ b/src/main/java/com/troblecodings/signals/signalbox/debug/DebugFactory.java @@ -1,5 +1,6 @@ package com.troblecodings.signals.signalbox.debug; +import com.troblecodings.signals.core.ModeIdentifier; import com.troblecodings.signals.signalbox.ConnectionChecker; import com.troblecodings.signals.signalbox.SignalBoxGrid; import com.troblecodings.signals.signalbox.entrys.PathOptionEntry; @@ -25,9 +26,9 @@ public SignalBoxGrid getGrid() { } @Override - public PathOptionEntry getEntry() { + public PathOptionEntry getEntry(final ModeIdentifier ident) { if (enableDebugPathEntry) - return new DebugOptionEntry(); - return super.getEntry(); + return new DebugOptionEntry(ident); + return super.getEntry(ident); } } diff --git a/src/main/java/com/troblecodings/signals/signalbox/debug/DebugOptionEntry.java b/src/main/java/com/troblecodings/signals/signalbox/debug/DebugOptionEntry.java index 64a566b95..0a3ba0bac 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/debug/DebugOptionEntry.java +++ b/src/main/java/com/troblecodings/signals/signalbox/debug/DebugOptionEntry.java @@ -4,12 +4,17 @@ import com.troblecodings.core.NBTWrapper; import com.troblecodings.signals.OpenSignalsMain; +import com.troblecodings.signals.core.ModeIdentifier; import com.troblecodings.signals.enums.EnumPathUsage; import com.troblecodings.signals.signalbox.entrys.PathEntryType; import com.troblecodings.signals.signalbox.entrys.PathOptionEntry; public class DebugOptionEntry extends PathOptionEntry { + public DebugOptionEntry(final ModeIdentifier ident) { + super(ident); + } + @Override public void setEntry(final PathEntryType type, final T value) { OpenSignalsMain.getLogger().debug(type); @@ -21,7 +26,6 @@ public void setEntry(final PathEntryType type, final T value) { public Optional getEntry(final PathEntryType type) { final Optional entry = super.getEntry(type); if (entry.filter(n -> n.equals(EnumPathUsage.SELECTED)).isPresent()) { - return entry; } return entry; } diff --git a/src/main/java/com/troblecodings/signals/signalbox/debug/SignalBoxFactory.java b/src/main/java/com/troblecodings/signals/signalbox/debug/SignalBoxFactory.java index 11ca93575..8f8c03818 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/debug/SignalBoxFactory.java +++ b/src/main/java/com/troblecodings/signals/signalbox/debug/SignalBoxFactory.java @@ -1,6 +1,7 @@ package com.troblecodings.signals.signalbox.debug; import com.troblecodings.signals.OpenSignalsMain; +import com.troblecodings.signals.core.ModeIdentifier; import com.troblecodings.signals.signalbox.ConnectionChecker; import com.troblecodings.signals.signalbox.ConnectionChecker.ConnectionCheckerNormal; import com.troblecodings.signals.signalbox.ConnectionChecker.ConnectionCheckerShunting; @@ -39,8 +40,8 @@ public SignalBoxGrid getGrid() { return new SignalBoxGrid(); } - public PathOptionEntry getEntry() { - return new PathOptionEntry(); + public PathOptionEntry getEntry(final ModeIdentifier ident) { + return new PathOptionEntry(ident); } public PathwayData getPathwayData() { diff --git a/src/main/java/com/troblecodings/signals/signalbox/entrys/PathOptionEntry.java b/src/main/java/com/troblecodings/signals/signalbox/entrys/PathOptionEntry.java index 791bc0c5b..8e262cf09 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/entrys/PathOptionEntry.java +++ b/src/main/java/com/troblecodings/signals/signalbox/entrys/PathOptionEntry.java @@ -12,11 +12,19 @@ import com.troblecodings.core.WriteBuffer; import com.troblecodings.core.interfaces.INetworkSaveable; import com.troblecodings.core.interfaces.ISaveable; +import com.troblecodings.signals.core.ModeIdentifier; import com.troblecodings.signals.core.NetworkBufferWrappers; +import com.troblecodings.signals.network.SignalBoxNetworkHandler; public class PathOptionEntry implements INetworkSaveable, ISaveable { + private SignalBoxNetworkHandler network = new SignalBoxNetworkHandler(); private final Map, IPathEntry> pathEntrys = new HashMap<>(); + private final ModeIdentifier ident; + + public PathOptionEntry(final ModeIdentifier ident) { + this.ident = ident; + } @SuppressWarnings("unchecked") public Optional getEntry(final PathEntryType type) { @@ -34,24 +42,34 @@ public void setEntry(final PathEntryType type, final T value) { final IPathEntry pathEntry = (IPathEntry) pathEntrys.computeIfAbsent(type, pType -> pType.newValue()); pathEntry.setValue(value); + network.sendEntryAdd(ident, type, pathEntry); } public void addEntry(final PathEntryType entryType, final IPathEntry entry) { - if (entryType == null) { + if (entry == null) { pathEntrys.remove(entryType); return; } pathEntrys.put(entryType, entry); } + public void removeEntryNoNetwork(final PathEntryType type) { + pathEntrys.remove(type); + } + public void removeEntry(final PathEntryType type) { pathEntrys.remove(type); + network.sendEntryRemove(ident, type); } public boolean containsEntry(final PathEntryType type) { return pathEntrys.containsKey(type); } + public void setUpNetwork(final SignalBoxNetworkHandler network) { + this.network = network; + } + @Override public int hashCode() { return Objects.hash(pathEntrys); From 4002db57c99ae8f77c929289310ded9ce30f2868 Mon Sep 17 00:00:00 2001 From: Cedric Date: Tue, 20 Jan 2026 00:14:50 +0100 Subject: [PATCH 11/61] ref: removed unused --- .../PathOptionEntryNetworkHandler.java | 55 ------------------- 1 file changed, 55 deletions(-) delete mode 100644 src/main/java/com/troblecodings/signals/network/PathOptionEntryNetworkHandler.java diff --git a/src/main/java/com/troblecodings/signals/network/PathOptionEntryNetworkHandler.java b/src/main/java/com/troblecodings/signals/network/PathOptionEntryNetworkHandler.java deleted file mode 100644 index d4dff0d60..000000000 --- a/src/main/java/com/troblecodings/signals/network/PathOptionEntryNetworkHandler.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.troblecodings.signals.network; - -import java.util.Objects; - -import com.troblecodings.signals.core.ModeIdentifier; -import com.troblecodings.signals.signalbox.entrys.IPathEntry; -import com.troblecodings.signals.signalbox.entrys.PathEntryType; - -public class PathOptionEntryNetworkHandler { - - private SignalBoxNetworkHandler network = null; - private ModeIdentifier ident = null; - - public void setUpNetwork(final SignalBoxNetworkHandler network, final ModeIdentifier ident) { - this.network = network; - this.ident = ident; - } - - public void removeNetwork() { - this.network = null; - this.ident = null; - } - - private boolean isNetworkConnected() { - return network != null && ident != null; - } - - public void sendEntryAdd(final PathEntryType entryType, final IPathEntry entry) { - if (!isNetworkConnected()) - return; - network.sendEntryAdd(ident, entryType, entry); - } - - public void sendEntryRemove(final PathEntryType entryType) { - if (!isNetworkConnected()) - return; - network.sendEntryRemove(ident, entryType); - } - - @Override - public int hashCode() { - return Objects.hash(ident, network); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) - return true; - if ((obj == null) || (getClass() != obj.getClass())) - return false; - final PathOptionEntryNetworkHandler other = (PathOptionEntryNetworkHandler) obj; - return Objects.equals(ident, other.ident) && Objects.equals(network, other.network); - } - -} From d8af6d3cea2c156510e82313f75deddf56ea933f Mon Sep 17 00:00:00 2001 From: Cedric Date: Tue, 20 Jan 2026 11:11:37 +0100 Subject: [PATCH 12/61] fix: new network issues, ref: better code performance --- .../signals/guis/ContainerSignalBox.java | 60 +++++++---------- .../signals/guis/GuiSignalBox.java | 32 ++++----- .../troblecodings/signals/guis/SidePanel.java | 16 +++-- .../network/PathOptionEntryNetwork.java | 50 ++++++++++++++ .../network/SignalBoxNetworkHandler.java | 44 +++++++++---- .../signals/signalbox/PathwayData.java | 3 +- .../signals/signalbox/SignalBoxGrid.java | 18 +++-- .../signals/signalbox/SignalBoxNode.java | 65 ++++++++++--------- .../signals/signalbox/SignalBoxPathway.java | 7 +- .../signals/signalbox/debug/DebugFactory.java | 7 +- .../signalbox/debug/DebugOptionEntry.java | 5 -- .../signalbox/debug/SignalBoxFactory.java | 5 +- .../signalbox/entrys/PathOptionEntry.java | 16 ++--- 13 files changed, 189 insertions(+), 139 deletions(-) create mode 100644 src/main/java/com/troblecodings/signals/network/PathOptionEntryNetwork.java diff --git a/src/main/java/com/troblecodings/signals/guis/ContainerSignalBox.java b/src/main/java/com/troblecodings/signals/guis/ContainerSignalBox.java index 389c93737..cca160793 100644 --- a/src/main/java/com/troblecodings/signals/guis/ContainerSignalBox.java +++ b/src/main/java/com/troblecodings/signals/guis/ContainerSignalBox.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicReference; +import java.util.function.BiConsumer; import java.util.function.Consumer; import com.google.common.collect.Maps; @@ -59,14 +60,18 @@ public class ContainerSignalBox extends ContainerBase implements UIClientSync, I protected SignalBoxTileEntity tile; private final Map posForType = new HashMap<>(); - private Consumer infoUpdates; - private Consumer nodeUpdate; - private Runnable counterUpdater; - private Consumer> debugPoints; private SignalBoxNetworkHandler network = new SignalBoxNetworkHandler(); protected Consumer updateSignalState = (node) -> { }; + protected Consumer infoUpdates = (label) -> { + }; + protected BiConsumer> nodeUpdate = (node, entry) -> { + }; + protected Runnable counterUpdater = () -> { + }; + protected Consumer> debugPoints = (list) -> { + }; public ContainerSignalBox(final GuiInfo info) { super(info); @@ -177,28 +182,23 @@ public void handleAddSavedPathway(final Point p1, final Point p2, final PathType } public void handleRemoveSavedPathway(final Point p1, final Point p2) { - if (!isClientSide()) - return; nextPathways.remove(Maps.immutableEntry(p1, p2)); } public void handleDebugPoints(final List debugPoints) { - if (!isClientSide()) - return; this.debugPoints.accept(debugPoints); } public void handleCounterUpdate() { - if (!isClientSide()) - return; counterUpdater.run(); } - public void handleNodeUpdate(final SignalBoxNode node) { - if (!isClientSide()) - return; - nodeUpdate.accept(node); + public void handleNodeUpdate(final SignalBoxNode node, final PathEntryType type) { + nodeUpdate.accept(node, type); + } + public void handleSignalStateUpdate(final SignalBoxNode node) { + updateSignalState.accept(node); } private void initializeNetwork() { @@ -236,16 +236,18 @@ private void loadPossibleSubsidiaires() { } - protected void updateClientSubsidiary(final Point point, final ModeSet mode, + protected void updateClientSubsidiary(final SignalBoxNode node, final ModeSet mode, final SubsidiaryState state, final boolean enable) { - final Map map = - enabledSubsidiaryTypes.computeIfAbsent(point, (_u) -> new HashMap<>()); + final Map map = enabledSubsidiaryTypes + .computeIfAbsent(node.getPoint(), (_u) -> new HashMap<>()); if (enable) { map.put(mode, state); + node.setSubsidiaryState(mode, state); } else { map.remove(mode); + node.removeSubsidiaryState(mode); if (map.isEmpty()) { - enabledSubsidiaryTypes.remove(point); + enabledSubsidiaryTypes.remove(node.getPoint()); } } } @@ -263,13 +265,13 @@ public void updateServerSubsidiary(final ModeIdentifier ident, final SubsidiaryS final SignalStateInfo info = new SignalStateInfo(world, pos, signal); if (enable) { SignalConfig.loadSubsidiary(info, state); - node.updateState(ident.mode, - SignalState.combine(state.getSubsidiaryShowType())); node.setSubsidiaryState(ident.mode, state); + node.updateStateNoNetwork(ident.mode, + SignalState.combine(state.getSubsidiaryShowType())); } else { SignalConfig.reset(new ResetInfo(info)); - node.updateState(ident.mode, SignalState.RED); node.removeSubsidiaryState(ident.mode); + node.updateStateNoNetwork(ident.mode, SignalState.RED); } })); }); @@ -316,20 +318,4 @@ public boolean canInteractWith(final EntityPlayer playerIn) { } return true; } - - protected void setInfoConsumer(final Consumer consumer) { - this.infoUpdates = consumer; - } - - protected void setNodeUpdater(final Consumer consumer) { - this.nodeUpdate = consumer; - } - - protected void setConuterUpdater(final Runnable run) { - this.counterUpdater = run; - } - - protected void setDebugPointUpdater(final Consumer> points) { - this.debugPoints = points; - } } \ No newline at end of file diff --git a/src/main/java/com/troblecodings/signals/guis/GuiSignalBox.java b/src/main/java/com/troblecodings/signals/guis/GuiSignalBox.java index 6abcc8b67..f0d4bdc2e 100644 --- a/src/main/java/com/troblecodings/signals/guis/GuiSignalBox.java +++ b/src/main/java/com/troblecodings/signals/guis/GuiSignalBox.java @@ -99,9 +99,9 @@ public GuiSignalBox(final GuiInfo info) { super(info); this.container = (ContainerSignalBox) info.base; this.network = container.getNetwork(); - container.setInfoConsumer(this::infoUpdate); - container.setConuterUpdater(this::updateCounter); - container.setNodeUpdater(this::updateNode); + container.infoUpdates = this::infoUpdate; + container.counterUpdater = this::updateCounter; + container.nodeUpdate = this::updateNode; container.updateSignalState = this::updateSignalState; } @@ -109,10 +109,13 @@ public SignalBoxPage getPage() { return page; } - private void updateNode(final SignalBoxNode node) { - updateSignalState(node); - updateTrainNumbers(node); - updateColor(node); + private void updateNode(final SignalBoxNode node, final PathEntryType type) { + if (type.equals(PathEntryType.PATHUSAGE)) { + updateColor(node); + } + if (type.equals(PathEntryType.TRAINNUMBER)) { + updateTrainNumbers(node); + } } protected void updateSignalState(final SignalBoxNode node) { @@ -123,15 +126,13 @@ protected void updateSignalState(final SignalBoxNode node) { } private void checkForSubsidiary(final SignalBoxNode node, final ModeSet mode) { - final Map subsidiary = - container.enabledSubsidiaryTypes.getOrDefault(node.getPoint(), new HashMap<>()); - final SubsidiaryState state = subsidiary.get(mode); + final SubsidiaryState state = node.getSubsidiaryState(mode); if (state != null) { node.updateState(mode, SignalState.combine(state.getSubsidiaryShowType())); } } - public void infoUpdate(final String errorString) { + protected void infoUpdate(final String errorString) { final UIToolTip tooltip = new UIToolTip(errorString, true); lowerEntity.add(tooltip); executor.schedule(() -> lowerEntity.remove(tooltip), 3, TimeUnit.SECONDS); @@ -206,11 +207,11 @@ public static String getSignalInfo(final BlockPos signalPos, final LinkType type protected void disableSubsidiary(final BlockPos pos, final SubsidiaryHolder holder) { final SubsidiaryState state = holder.entry; network.sendSubsidiary(new ModeIdentifier(holder.point, holder.modeSet), state, false); - container.updateClientSubsidiary(holder.point, holder.modeSet, state, false); enabledSubsidiaries.remove(pos); helpPage.helpUsageMode(null); container.grid.getNodeChecked(holder.point).ifPresent(node -> { + container.updateClientSubsidiary(node, holder.modeSet, state, false); node.removeSubsidiaryState(holder.modeSet); node.updateState(holder.modeSet, SignalState.RED); rendering.updateSignalState(holder.point, holder.modeSet, SignalState.RED); @@ -558,7 +559,7 @@ private void initializeFieldTemplate(final SignalBoxConsumer consumer, nodes.forEach(this::updateTrainNumbers); } - public void updateCounter() { + protected void updateCounter() { helpPage.updateCounterButton(); } @@ -624,13 +625,14 @@ private void reset() { @Override public void updateFromContainer() { - updateEnabledSubsidiaries(); + updateAllEnabledSubsidiaries(); initializeBasicUI(); enabledSubsidiaries.values() .forEach(holder -> updateSignalState(container.grid.getNode(holder.point))); } - private void updateEnabledSubsidiaries() { + private void updateAllEnabledSubsidiaries() { + enabledSubsidiaries.clear(); container.enabledSubsidiaryTypes.forEach((point, map) -> map.forEach((modeSet, state) -> { final SignalBoxNode node = container.grid.getNode(point); if (node == null) diff --git a/src/main/java/com/troblecodings/signals/guis/SidePanel.java b/src/main/java/com/troblecodings/signals/guis/SidePanel.java index aa72eebe8..9976e73a5 100644 --- a/src/main/java/com/troblecodings/signals/guis/SidePanel.java +++ b/src/main/java/com/troblecodings/signals/guis/SidePanel.java @@ -452,15 +452,15 @@ public void helpUsageMode(final SignalBoxNode node) { node.getPoint(), mode)); node.setSubsidiaryState(mode, state); } else { - node.updateState(mode, SignalState.RED); node.removeSubsidiaryState(mode); + node.updateState(mode, SignalState.RED); subsidiaries.remove(signalPos); } gui.network.sendSubsidiary( new ModeIdentifier(node.getPoint(), mode), state, enable); - gui.container.updateClientSubsidiary( - node.getPoint(), mode, state, enable); + gui.container.updateClientSubsidiary(node, mode, + state, enable); gui.updateSignalState(node); gui.pop(); helpUsageMode(node); @@ -553,13 +553,15 @@ public void helpUsageMode(final SignalBoxNode node) { textureEntity.add(new UIToolTip(I18Wrapper .format("info.usage.rs.desc"))); if (turnOff) { - node.removeManuellOutput(mode); + gui.network.sendManuellOutputRemove( + node.getPoint(), mode); outputStatus.setText(I18Wrapper .format("info.usage.rs.false")); textureEntity.add(new UITexture( GuiSignalBox.REDSTONE_OFF)); } else { - node.addManuellOutput(mode); + gui.network.sendManuellOutputAdd( + node.getPoint(), mode); outputStatus.setText(I18Wrapper .format("info.usage.rs.true")); textureEntity.add(new UITexture( @@ -795,11 +797,11 @@ private void addManuellRStoUI() { textureEntity.clear(); textureEntity.add(new UIToolTip(I18Wrapper.format("info.usage.rs.desc"))); if (turnOff) { - currentNode.removeManuellOutput(mode); + gui.network.sendManuellOutputRemove(currentNode.getPoint(), mode); outputStatus.setText(I18Wrapper.format("info.usage.rs.false")); textureEntity.add(new UITexture(GuiSignalBox.REDSTONE_OFF)); } else { - currentNode.addManuellOutput(mode); + gui.network.sendManuellOutputAdd(currentNode.getPoint(), mode); outputStatus.setText(I18Wrapper.format("info.usage.rs.true")); textureEntity.add(new UITexture(GuiSignalBox.REDSTONE_ON)); } diff --git a/src/main/java/com/troblecodings/signals/network/PathOptionEntryNetwork.java b/src/main/java/com/troblecodings/signals/network/PathOptionEntryNetwork.java new file mode 100644 index 000000000..08f8c1d5a --- /dev/null +++ b/src/main/java/com/troblecodings/signals/network/PathOptionEntryNetwork.java @@ -0,0 +1,50 @@ +package com.troblecodings.signals.network; + +import java.util.Objects; + +import com.troblecodings.signals.core.ModeIdentifier; +import com.troblecodings.signals.signalbox.entrys.IPathEntry; +import com.troblecodings.signals.signalbox.entrys.PathEntryType; + +public class PathOptionEntryNetwork { + + private SignalBoxNetworkHandler network; + private ModeIdentifier ident; + + public void sendEntryAdd(final PathEntryType type, final IPathEntry entry) { + if (network == null) + throw new IllegalArgumentException( + "Tried to send entry without network beeing connected!"); + network.sendEntryAdd(ident, type, entry); + } + + public void sendEntryRemove(final PathEntryType type) { + if (network == null) + throw new IllegalArgumentException( + "Tried to send entry without network beeing connected!"); + network.sendEntryRemove(ident, type); + } + + public PathOptionEntryNetwork setUpNetwork(final SignalBoxNetworkHandler network, + final ModeIdentifier ident) { + this.network = network; + this.ident = ident; + return this; + } + + @Override + public int hashCode() { + return Objects.hash(ident, network); + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) + return true; + if ((obj == null) || (getClass() != obj.getClass())) + return false; + final PathOptionEntryNetwork other = (PathOptionEntryNetwork) obj; + return Objects.equals(ident, other.ident) && Objects.equals(network, other.network); + } + +} \ No newline at end of file diff --git a/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkHandler.java b/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkHandler.java index cf5ced954..22170587c 100644 --- a/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkHandler.java +++ b/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkHandler.java @@ -16,6 +16,7 @@ import com.troblecodings.signals.enums.PathwayRequestResult.PathwayRequestMode; import com.troblecodings.signals.guis.ContainerSignalBox; import com.troblecodings.signals.handler.SignalBoxHandler; +import com.troblecodings.signals.signalbox.ModeSet; import com.troblecodings.signals.signalbox.Point; import com.troblecodings.signals.signalbox.SignalBoxGrid; import com.troblecodings.signals.signalbox.SignalBoxNode; @@ -212,13 +213,18 @@ public void sendSubsidiary(final ModeIdentifier ident, final SubsidiaryState ent sendBuffer(buffer); } - public void sendOutputUpdates(final SignalBoxNode node) { - if (!containerConnected()) - return; - if (node == null) - throw new IllegalArgumentException("Node is null, this shouldn't be the case!"); - final WriteBuffer buffer = getNodeBuffer(node.getPoint(), NodeNetworkMode.MANUELL_OUTPUT); - node.writeManuellEnabledOutputs(buffer); + public void sendManuellOutputAdd(final Point point, final ModeSet mode) { + sendManuellOutput(point, mode, NodeNetworkMode.MANUELL_OUTPUT_ADD); + } + + public void sendManuellOutputRemove(final Point point, final ModeSet mode) { + sendManuellOutput(point, mode, NodeNetworkMode.MANUELL_OUTPUT_REMOVE); + } + + private void sendManuellOutput(final Point point, final ModeSet mode, + final NodeNetworkMode network) { + final WriteBuffer buffer = getNodeBuffer(point, network); + mode.writeNetwork(buffer); sendBuffer(buffer); } @@ -259,13 +265,13 @@ private void readEntry(final ReadBuffer buffer) { final Optional optionEntry = node.getOption(ident.mode); if (mode.equals(EntryNetworkMode.ENTRY_REMOVE)) { optionEntry.ifPresent(entry -> entry.removeEntryNoNetwork(entryType)); - container.handleNodeUpdate(node); + container.handleNodeUpdate(node, entryType); return; } final IPathEntry entry = entryType.newValue(); entry.readNetwork(buffer); optionEntry.ifPresent(e -> e.addEntry(entryType, entry)); - container.handleNodeUpdate(node); + container.handleNodeUpdate(node, entryType); } private void readForGrid(final ReadBuffer buffer) { @@ -296,13 +302,23 @@ private void readNodeSpecialEntries(final ReadBuffer buffer) { node.setAutoPointFromNetwork(buffer.getBoolean()); grid.updatePathwayToAutomatic(point); } - if (mode.equals(NodeNetworkMode.MANUELL_OUTPUT)) { - // TODO Set off Output in World - node.readManuellEnabledOutputs(buffer); + if (mode.equals(NodeNetworkMode.MANUELL_OUTPUT_ADD) + || mode.equals(NodeNetworkMode.MANUELL_OUTPUT_REMOVE)) { + handleManuellOutput(node, buffer.getINetworkSaveable(ModeSet.class), mode); } if (mode.equals(NodeNetworkMode.SIGNAL_STATE)) { node.readSignalStates(buffer); - container.handleNodeUpdate(node); + container.handleSignalStateUpdate(node); + } + } + + private void handleManuellOutput(final SignalBoxNode node, final ModeSet mode, + final NodeNetworkMode network) { + final boolean state = network.equals(NodeNetworkMode.MANUELL_OUTPUT_ADD) ? true : false; + if (container.isClientSide()) { + node.handleManuellEnabledOutputUpdate(mode, state); + } else { + getGrid().updateManuellRSOutput(node.getPoint(), mode, state); } } @@ -447,7 +463,7 @@ private static enum PathwayNetworkMode { } private static enum NodeNetworkMode { - LABEL, AUTO_POINT, MANUELL_OUTPUT, SIGNAL_STATE; + LABEL, AUTO_POINT, MANUELL_OUTPUT_ADD, MANUELL_OUTPUT_REMOVE, SIGNAL_STATE; } private static enum GridNetworkMode { diff --git a/src/main/java/com/troblecodings/signals/signalbox/PathwayData.java b/src/main/java/com/troblecodings/signals/signalbox/PathwayData.java index d5e884a5a..60c96afb3 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/PathwayData.java +++ b/src/main/java/com/troblecodings/signals/signalbox/PathwayData.java @@ -361,8 +361,7 @@ private void initalize() { this.preSignals = ImmutableList.copyOf(posIdents.stream().map(ident -> { final PathOptionEntry vpEntry = grid.getNode(ident.getPoint()) .getOption(ident.getModeSet()) - .orElse(SignalBoxFactory.getFactory().getEntry( - new ModeIdentifier(ident.getPoint(), ident.getModeSet()))); + .orElse(SignalBoxFactory.getFactory().getEntry()); return new OtherSignalIdentifier(ident.getPoint(), ident.getModeSet(), ident.pos, vpEntry.getEntry(PathEntryType.SIGNAL_REPEATER).orElse(false), EnumGuiMode.VP, grid); diff --git a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java index d1bab4e5b..6df210609 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java +++ b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java @@ -20,6 +20,7 @@ import com.troblecodings.signals.blocks.CombinedRedstoneInput; import com.troblecodings.signals.core.NetworkBufferWrappers; import com.troblecodings.signals.core.RedstoneUpdatePacket; +import com.troblecodings.signals.core.StateInfo; import com.troblecodings.signals.core.SubsidiaryState; import com.troblecodings.signals.core.TrainNumber; import com.troblecodings.signals.enums.EnumPathUsage; @@ -27,6 +28,7 @@ import com.troblecodings.signals.enums.PathwayRequestResult; import com.troblecodings.signals.enums.PathwayRequestResult.PathwayRequestMode; import com.troblecodings.signals.guis.ContainerSignalBox; +import com.troblecodings.signals.handler.SignalBoxHandler; import com.troblecodings.signals.network.SignalBoxNetworkHandler; import com.troblecodings.signals.signalbox.debug.SignalBoxFactory; import com.troblecodings.signals.signalbox.entrys.PathEntryType; @@ -519,23 +521,19 @@ public List readUpdateNetwork(final ReadBuffer buffer, final bool }); } - public BlockPos updateManuellRSOutput(final Point point, final ModeSet mode, - final boolean state) { + public void updateManuellRSOutput(final Point point, final ModeSet mode, final boolean state) { final SignalBoxNode node = modeGrid.get(point); if (node == null) - return null; + return; final PathOptionEntry entry = node.getOption(mode).get(); final Optional outputPos = entry.getEntry(PathEntryType.OUTPUT); final EnumPathUsage usage = entry.getEntry(PathEntryType.PATHUSAGE).orElse(EnumPathUsage.FREE); if (!outputPos.isPresent() || !usage.equals(EnumPathUsage.FREE)) - return null; - if (state) { - node.addManuellOutput(mode); - } else { - node.removeManuellOutput(mode); - } - return outputPos.get(); + return; + node.handleManuellEnabledOutputUpdate(mode, state); + SignalBoxHandler.updateRedstoneOutput(new StateInfo(tile.getLevel(), outputPos.get()), + state); } public List getAllPoints() { diff --git a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxNode.java b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxNode.java index 3e90d2acd..7c5ff34fb 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxNode.java +++ b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxNode.java @@ -25,6 +25,7 @@ import com.troblecodings.signals.enums.EnumPathUsage; import com.troblecodings.signals.enums.PathType; import com.troblecodings.signals.enums.PathwayRequestResult.PathwayRequestMode; +import com.troblecodings.signals.network.PathOptionEntryNetwork; import com.troblecodings.signals.network.SignalBoxNetworkHandler; import com.troblecodings.signals.signalbox.MainSignalIdentifier.SignalState; import com.troblecodings.signals.signalbox.SignalBoxUtil.PathIdentifier; @@ -44,6 +45,7 @@ public class SignalBoxNode implements INetworkSaveable, ISaveable, Iterable manuellEnabledOutputs = new ArrayList<>(); private final Point point; private final SignalBoxNetworkHandler network; + private final SignalBoxFactory factory = SignalBoxFactory.getFactory(); private boolean isAutoPoint = false; private String customText = ""; @@ -58,8 +60,8 @@ public SignalBoxNode(final Point point, final SignalBoxNetworkHandler network) { public void add(final ModeSet modeSet) { final ModeIdentifier ident = new ModeIdentifier(point, modeSet); - final PathOptionEntry entry = SignalBoxFactory.getFactory().getEntry(ident); - entry.setUpNetwork(network); + final PathOptionEntry entry = factory.getEntry(); + entry.setUpNetwork(new PathOptionEntryNetwork().setUpNetwork(network, ident)); possibleModes.put(modeSet, entry); network.sendModeAdd(ident); } @@ -75,18 +77,24 @@ public void remove(final ModeSet modeSet) { public void addAndSetEntry(final ModeSet mode, final PathEntryType entry, final T type) { final PathOptionEntry optionEntry = possibleModes.computeIfAbsent(mode, - _u -> SignalBoxFactory.getFactory().getEntry(new ModeIdentifier(point, mode))); - optionEntry.setUpNetwork(network); + _u -> factory.getEntry()); + optionEntry.setUpNetwork(new PathOptionEntryNetwork().setUpNetwork(network, + new ModeIdentifier(point, mode))); optionEntry.setEntry(entry, type); } public void updateState(final ModeSet modeSet, final SignalState state) { + updateStateNoNetwork(modeSet, state); + network.sendUpdateSignalStates(this); + } + + public void updateStateNoNetwork(final ModeSet modeSet, final SignalState state) { if (state == SignalState.RED) { this.signalStates.remove(modeSet); + this.enabledSubsidiaryStates.remove(modeSet); } else { this.signalStates.put(modeSet, state); } - network.sendUpdateSignalStates(this); } public SignalState getState(final ModeSet modeSet) { @@ -112,21 +120,22 @@ public Map getSubsidiaryStates() { public void addManuellOutput(final ModeSet mode) { if (!manuellEnabledOutputs.contains(mode)) { manuellEnabledOutputs.add(mode); - network.sendOutputUpdates(this); + network.sendManuellOutputAdd(point, mode); } } public void removeManuellOutput(final ModeSet mode) { manuellEnabledOutputs.remove(mode); - network.sendOutputUpdates(this); + network.sendManuellOutputRemove(point, mode); } public List clearAllManuellOutputs() { final List returnList = new ArrayList<>(); - manuellEnabledOutputs.forEach(mode -> returnList - .add(possibleModes.get(mode).getEntry(PathEntryType.OUTPUT).get())); + manuellEnabledOutputs.forEach(mode -> { + network.sendManuellOutputRemove(point, mode); + returnList.add(possibleModes.get(mode).getEntry(PathEntryType.OUTPUT).get()); + }); manuellEnabledOutputs.clear(); - network.sendOutputUpdates(this); return returnList; } @@ -277,12 +286,12 @@ public void write(final NBTWrapper compound) { @Override public void read(final NBTWrapper compound) { - final SignalBoxFactory factory = SignalBoxFactory.getFactory(); final boolean oldOutputSystem = compound.contains(ENABLED_OUTPUTS); compound.getList(POINT_LIST).forEach(tag -> { final ModeSet mode = new ModeSet(tag); - final PathOptionEntry entry = factory.getEntry(new ModeIdentifier(point, mode)); - entry.setUpNetwork(network); + final PathOptionEntry entry = factory.getEntry(); + entry.setUpNetwork(new PathOptionEntryNetwork().setUpNetwork(network, + new ModeIdentifier(point, mode))); entry.read(tag); possibleModes.put(mode, entry); if (!oldOutputSystem) @@ -396,9 +405,7 @@ public boolean isUsedInDirection(final Point point, @Nullable final EnumPathUsag if (mode == null) { continue; } - final EnumPathUsage usage = getOption(mode) - .orElse(SignalBoxFactory.getFactory() - .getEntry(new ModeIdentifier(this.point, mode))) + final EnumPathUsage usage = getOption(mode).orElse(factory.getEntry()) .getEntry(PathEntryType.PATHUSAGE).orElse(EnumPathUsage.FREE); if (!(usage.equals(exclude) || usage.equals(EnumPathUsage.FREE))) return true; @@ -489,11 +496,11 @@ public Iterator iterator() { public void readNetwork(final ReadBuffer buffer) { possibleModes.clear(); manuellEnabledOutputs.clear(); - final SignalBoxFactory factory = SignalBoxFactory.getFactory(); buffer.getMapWithCombinedValueFunc(ReadBuffer.getINetworkSaveableFunction(ModeSet.class), (buf, mode) -> { - final PathOptionEntry entry = factory.getEntry(new ModeIdentifier(point, mode)); - entry.setUpNetwork(network); + final PathOptionEntry entry = factory.getEntry(); + entry.setUpNetwork(new PathOptionEntryNetwork().setUpNetwork(network, + new ModeIdentifier(point, mode))); entry.readNetwork(buf); return entry; }).forEach((mode, entry) -> possibleModes.put(mode, entry)); @@ -530,18 +537,14 @@ public void writeNetwork(final WriteBuffer buffer) { public void applyModeNetworkChanges(final ModeIdentifier ident) { if (!has(ident.mode)) { - final PathOptionEntry entry = SignalBoxFactory.getFactory().getEntry(ident); - entry.setUpNetwork(network); + final PathOptionEntry entry = factory.getEntry(); + entry.setUpNetwork(new PathOptionEntryNetwork().setUpNetwork(network, ident)); possibleModes.put(ident.mode, entry); } else { possibleModes.remove(ident.mode); } } - public void writeManuellEnabledOutputs(final WriteBuffer buffer) { - buffer.putISaveableList(manuellEnabledOutputs); - } - public void writeSignalStates(final WriteBuffer buffer) { buffer.putMap(signalStates, WriteBuffer.getINetworkSaveableConsumer(), WriteBuffer.getEnumConsumer()); @@ -549,10 +552,14 @@ public void writeSignalStates(final WriteBuffer buffer) { (buf, state) -> state.writeNetwork(buf)); } - public void readManuellEnabledOutputs(final ReadBuffer buffer) { - manuellEnabledOutputs.clear(); - manuellEnabledOutputs - .addAll(buffer.getList(ReadBuffer.getINetworkSaveableFunction(ModeSet.class))); + public void handleManuellEnabledOutputUpdate(final ModeSet mode, final boolean state) { + if (state) { + if (!manuellEnabledOutputs.contains(mode)) { + manuellEnabledOutputs.add(mode); + } + } else { + manuellEnabledOutputs.remove(mode); + } } public void readSignalStates(final ReadBuffer buffer) { diff --git a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxPathway.java b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxPathway.java index 19a757b32..229764f15 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxPathway.java +++ b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxPathway.java @@ -26,6 +26,7 @@ import com.troblecodings.signals.signalbox.config.ConfigInfo; import com.troblecodings.signals.signalbox.config.ResetInfo; import com.troblecodings.signals.signalbox.config.SignalConfig; +import com.troblecodings.signals.signalbox.debug.SignalBoxFactory; import com.troblecodings.signals.signalbox.entrys.PathEntryType; import com.troblecodings.signals.signalbox.entrys.PathOptionEntry; import com.troblecodings.signals.tileentitys.IChunkLoadable; @@ -47,6 +48,8 @@ public class SignalBoxPathway implements IChunkLoadable { protected TrainNumber trainNumber; protected boolean isExecutingSignalSet = false; + protected final SignalBoxFactory factory = SignalBoxFactory.getFactory(); + public void setTile(final SignalBoxTileEntity tile) { this.tile = tile; } @@ -494,7 +497,7 @@ protected void updateTrainNumber(final TrainNumber number) { return; trainNumberDisplays.forEach(ident -> { final PathOptionEntry entry = grid.getNode(ident.point).getOption(ident.mode) - .orElse(new PathOptionEntry(ident)); + .orElse(factory.getEntry()); if (number.equals(TrainNumber.DEFAULT)) { entry.removeEntry(PathEntryType.TRAINNUMBER); } else { @@ -514,7 +517,7 @@ private void resetAllTrainNumbers(final List trainNumberDisplays final SignalBoxNode node = grid.getNode(ident.point); if (node == null) return; - node.getOption(ident.mode).orElse(new PathOptionEntry(ident)) + node.getOption(ident.mode).orElse(factory.getEntry()) .removeEntry(PathEntryType.TRAINNUMBER); }); } diff --git a/src/main/java/com/troblecodings/signals/signalbox/debug/DebugFactory.java b/src/main/java/com/troblecodings/signals/signalbox/debug/DebugFactory.java index 07bdd5d5d..efac94a4f 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/debug/DebugFactory.java +++ b/src/main/java/com/troblecodings/signals/signalbox/debug/DebugFactory.java @@ -1,6 +1,5 @@ package com.troblecodings.signals.signalbox.debug; -import com.troblecodings.signals.core.ModeIdentifier; import com.troblecodings.signals.signalbox.ConnectionChecker; import com.troblecodings.signals.signalbox.SignalBoxGrid; import com.troblecodings.signals.signalbox.entrys.PathOptionEntry; @@ -26,9 +25,9 @@ public SignalBoxGrid getGrid() { } @Override - public PathOptionEntry getEntry(final ModeIdentifier ident) { + public PathOptionEntry getEntry() { if (enableDebugPathEntry) - return new DebugOptionEntry(ident); - return super.getEntry(ident); + return new DebugOptionEntry(); + return super.getEntry(); } } diff --git a/src/main/java/com/troblecodings/signals/signalbox/debug/DebugOptionEntry.java b/src/main/java/com/troblecodings/signals/signalbox/debug/DebugOptionEntry.java index 0a3ba0bac..3d3e94f53 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/debug/DebugOptionEntry.java +++ b/src/main/java/com/troblecodings/signals/signalbox/debug/DebugOptionEntry.java @@ -4,17 +4,12 @@ import com.troblecodings.core.NBTWrapper; import com.troblecodings.signals.OpenSignalsMain; -import com.troblecodings.signals.core.ModeIdentifier; import com.troblecodings.signals.enums.EnumPathUsage; import com.troblecodings.signals.signalbox.entrys.PathEntryType; import com.troblecodings.signals.signalbox.entrys.PathOptionEntry; public class DebugOptionEntry extends PathOptionEntry { - public DebugOptionEntry(final ModeIdentifier ident) { - super(ident); - } - @Override public void setEntry(final PathEntryType type, final T value) { OpenSignalsMain.getLogger().debug(type); diff --git a/src/main/java/com/troblecodings/signals/signalbox/debug/SignalBoxFactory.java b/src/main/java/com/troblecodings/signals/signalbox/debug/SignalBoxFactory.java index 8f8c03818..11ca93575 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/debug/SignalBoxFactory.java +++ b/src/main/java/com/troblecodings/signals/signalbox/debug/SignalBoxFactory.java @@ -1,7 +1,6 @@ package com.troblecodings.signals.signalbox.debug; import com.troblecodings.signals.OpenSignalsMain; -import com.troblecodings.signals.core.ModeIdentifier; import com.troblecodings.signals.signalbox.ConnectionChecker; import com.troblecodings.signals.signalbox.ConnectionChecker.ConnectionCheckerNormal; import com.troblecodings.signals.signalbox.ConnectionChecker.ConnectionCheckerShunting; @@ -40,8 +39,8 @@ public SignalBoxGrid getGrid() { return new SignalBoxGrid(); } - public PathOptionEntry getEntry(final ModeIdentifier ident) { - return new PathOptionEntry(ident); + public PathOptionEntry getEntry() { + return new PathOptionEntry(); } public PathwayData getPathwayData() { diff --git a/src/main/java/com/troblecodings/signals/signalbox/entrys/PathOptionEntry.java b/src/main/java/com/troblecodings/signals/signalbox/entrys/PathOptionEntry.java index 8e262cf09..33b8d0d40 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/entrys/PathOptionEntry.java +++ b/src/main/java/com/troblecodings/signals/signalbox/entrys/PathOptionEntry.java @@ -12,19 +12,13 @@ import com.troblecodings.core.WriteBuffer; import com.troblecodings.core.interfaces.INetworkSaveable; import com.troblecodings.core.interfaces.ISaveable; -import com.troblecodings.signals.core.ModeIdentifier; import com.troblecodings.signals.core.NetworkBufferWrappers; -import com.troblecodings.signals.network.SignalBoxNetworkHandler; +import com.troblecodings.signals.network.PathOptionEntryNetwork; public class PathOptionEntry implements INetworkSaveable, ISaveable { - private SignalBoxNetworkHandler network = new SignalBoxNetworkHandler(); + private PathOptionEntryNetwork network = new PathOptionEntryNetwork(); private final Map, IPathEntry> pathEntrys = new HashMap<>(); - private final ModeIdentifier ident; - - public PathOptionEntry(final ModeIdentifier ident) { - this.ident = ident; - } @SuppressWarnings("unchecked") public Optional getEntry(final PathEntryType type) { @@ -42,7 +36,7 @@ public void setEntry(final PathEntryType type, final T value) { final IPathEntry pathEntry = (IPathEntry) pathEntrys.computeIfAbsent(type, pType -> pType.newValue()); pathEntry.setValue(value); - network.sendEntryAdd(ident, type, pathEntry); + network.sendEntryAdd(type, pathEntry); } public void addEntry(final PathEntryType entryType, final IPathEntry entry) { @@ -59,14 +53,14 @@ public void removeEntryNoNetwork(final PathEntryType type) { public void removeEntry(final PathEntryType type) { pathEntrys.remove(type); - network.sendEntryRemove(ident, type); + network.sendEntryRemove(type); } public boolean containsEntry(final PathEntryType type) { return pathEntrys.containsKey(type); } - public void setUpNetwork(final SignalBoxNetworkHandler network) { + public void setUpNetwork(final PathOptionEntryNetwork network) { this.network = network; } From 4e1785b2511071de0d942dd272fa052b66274b18 Mon Sep 17 00:00:00 2001 From: Cedric Date: Tue, 27 Jan 2026 19:31:49 +0100 Subject: [PATCH 13/61] ref: added tests for network; ref: removed old tests --- .../network/SignalBoxNetworkHandler.java | 83 +++++---- .../signals/signalbox/SignalBoxGrid.java | 14 +- .../signals/signalbox/SignalBoxNode.java | 19 +- .../signalbox/debug/DebugNetworkHandler.java | 101 ++++++++++ .../signalbox/debug/SignalBoxFactory.java | 4 + ...{NameFileTest.java => NameFileTestV2.java} | 36 ++-- .../signals/test/SignalBoxNetworkTest.java | 173 ++++++++++++++++++ .../signals/test/StateFileTest.java | 155 ---------------- .../signals/test/StateFileTestV2.java | 6 +- 9 files changed, 361 insertions(+), 230 deletions(-) create mode 100644 src/main/java/com/troblecodings/signals/signalbox/debug/DebugNetworkHandler.java rename src/test/java/com/troblecodings/signals/test/{NameFileTest.java => NameFileTestV2.java} (66%) create mode 100644 src/test/java/com/troblecodings/signals/test/SignalBoxNetworkTest.java delete mode 100644 src/test/java/com/troblecodings/signals/test/StateFileTest.java diff --git a/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkHandler.java b/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkHandler.java index 22170587c..7e5ab1e8a 100644 --- a/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkHandler.java +++ b/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkHandler.java @@ -2,7 +2,6 @@ import java.util.List; import java.util.Objects; -import java.util.Optional; import com.troblecodings.core.ReadBuffer; import com.troblecodings.core.WriteBuffer; @@ -32,31 +31,31 @@ public class SignalBoxNetworkHandler { private static final byte REMOVE = 0; private static final byte ADD = 1; - private static final SignalBoxNetworkMode GRID = new SignalBoxNetworkMode( - (b, n) -> n.readForGrid(b)); + protected static final SignalBoxNetworkMode GRID = + new SignalBoxNetworkMode((b, n) -> n.readForGrid(b)); - private static final SignalBoxNetworkMode ENTRY = new SignalBoxNetworkMode( - (b, n) -> n.readEntry(b)); + protected static final SignalBoxNetworkMode ENTRY = + new SignalBoxNetworkMode((b, n) -> n.readEntry(b)); - private static final SignalBoxNetworkMode NODE_SPECIAL_ENTRIES = new SignalBoxNetworkMode( - (b, n) -> n.readNodeSpecialEntries(b)); + protected static final SignalBoxNetworkMode NODE_SPECIAL_ENTRIES = + new SignalBoxNetworkMode((b, n) -> n.readNodeSpecialEntries(b)); - private static final SignalBoxNetworkMode PATHWAY = new SignalBoxNetworkMode( - (b, n) -> n.readPathwayAction(b)); + protected static final SignalBoxNetworkMode PATHWAY = + new SignalBoxNetworkMode((b, n) -> n.readPathwayAction(b)); - private static final SignalBoxNetworkMode PATHWAY_SAVER = new SignalBoxNetworkMode( - (b, n) -> n.readSavedPathway(b)); + protected static final SignalBoxNetworkMode PATHWAY_SAVER = + new SignalBoxNetworkMode((b, n) -> n.readSavedPathway(b)); - private static final SignalBoxNetworkMode SUBSIDIARY = new SignalBoxNetworkMode( - (b, n) -> n.readSubsidiary(b)); + protected static final SignalBoxNetworkMode SUBSIDIARY = + new SignalBoxNetworkMode((b, n) -> n.readSubsidiary(b)); - private static final SignalBoxNetworkMode TRAINNUMBER = new SignalBoxNetworkMode( - (b, n) -> n.readUpdateTrainNumber(b)); + protected static final SignalBoxNetworkMode TRAINNUMBER = + new SignalBoxNetworkMode((b, n) -> n.readUpdateTrainNumber(b)); - private static final SignalBoxNetworkMode DEBUG_POINTS = new SignalBoxNetworkMode( - (b, n) -> n.readDebugPoints(b)); + protected static final SignalBoxNetworkMode DEBUG_POINTS = + new SignalBoxNetworkMode((b, n) -> n.readDebugPoints(b)); - private ContainerSignalBox container = null; + protected ContainerSignalBox container = null; public void setUpNetwork(final ContainerSignalBox container) { this.container = container; @@ -66,7 +65,7 @@ public void removeNetwork() { this.container = null; } - private boolean containerConnected() { + protected boolean containerConnected() { return container != null; } @@ -253,7 +252,7 @@ public void sendUpdateSignalStates(final SignalBoxNode node) { sendBuffer(buffer); } - private void readEntry(final ReadBuffer buffer) { + protected void readEntry(final ReadBuffer buffer) { final EntryNetworkMode mode = buffer.getEnumValue(EntryNetworkMode.class); final ModeIdentifier ident = ModeIdentifier.of(buffer); final SignalBoxNode node = getGrid().getOrCreateNode(ident.point); @@ -262,19 +261,19 @@ private void readEntry(final ReadBuffer buffer) { return; } final PathEntryType entryType = PathEntryType.ALL_ENTRIES.get(buffer.getInt()); - final Optional optionEntry = node.getOption(ident.mode); + final PathOptionEntry optionEntry = node.getOrCreateOption(ident.mode); if (mode.equals(EntryNetworkMode.ENTRY_REMOVE)) { - optionEntry.ifPresent(entry -> entry.removeEntryNoNetwork(entryType)); + optionEntry.removeEntryNoNetwork(entryType); container.handleNodeUpdate(node, entryType); return; } final IPathEntry entry = entryType.newValue(); entry.readNetwork(buffer); - optionEntry.ifPresent(e -> e.addEntry(entryType, entry)); + optionEntry.addEntry(entryType, entry); container.handleNodeUpdate(node, entryType); } - private void readForGrid(final ReadBuffer buffer) { + protected void readForGrid(final ReadBuffer buffer) { final SignalBoxGrid grid = getGrid(); final GridNetworkMode mode = buffer.getEnumValue(GridNetworkMode.class); if (mode.equals(GridNetworkMode.SEND_ALL)) { @@ -290,7 +289,7 @@ private void readForGrid(final ReadBuffer buffer) { } } - private void readNodeSpecialEntries(final ReadBuffer buffer) { + protected void readNodeSpecialEntries(final ReadBuffer buffer) { final NodeNetworkMode mode = buffer.getEnumValue(NodeNetworkMode.class); final Point point = Point.of(buffer); final SignalBoxGrid grid = getGrid(); @@ -312,7 +311,7 @@ private void readNodeSpecialEntries(final ReadBuffer buffer) { } } - private void handleManuellOutput(final SignalBoxNode node, final ModeSet mode, + protected void handleManuellOutput(final SignalBoxNode node, final ModeSet mode, final NodeNetworkMode network) { final boolean state = network.equals(NodeNetworkMode.MANUELL_OUTPUT_ADD) ? true : false; if (container.isClientSide()) { @@ -322,7 +321,7 @@ private void handleManuellOutput(final SignalBoxNode node, final ModeSet mode, } } - private void readPathwayAction(final ReadBuffer buffer) { + protected void readPathwayAction(final ReadBuffer buffer) { final SignalBoxGrid grid = getGrid(); final PathwayNetworkMode mode = buffer.getEnumValue(PathwayNetworkMode.class); if (mode.equals(PathwayNetworkMode.RESPONSE)) { @@ -355,7 +354,7 @@ private void readPathwayAction(final ReadBuffer buffer) { } } - private void resetPathway(final Point p1) { + protected void resetPathway(final Point p1) { final SignalBoxGrid grid = getGrid(); final SignalBoxPathway pw = grid.getPathwayByStartPoint(p1); final boolean isShuntingPath = pw != null ? pw.isShuntingPath() : false; @@ -364,7 +363,7 @@ private void resetPathway(final Point p1) { } } - private void readSavedPathway(final ReadBuffer buffer) { + protected void readSavedPathway(final ReadBuffer buffer) { final Point p1 = Point.of(buffer); final Point p2 = Point.of(buffer); final byte state = buffer.getByte(); @@ -377,51 +376,51 @@ private void readSavedPathway(final ReadBuffer buffer) { container.handleAddSavedPathway(p1, p2, type, result); } - private void readSubsidiary(final ReadBuffer buffer) { + protected void readSubsidiary(final ReadBuffer buffer) { final ModeIdentifier ident = ModeIdentifier.of(buffer); final SubsidiaryState entry = SubsidiaryState.of(buffer); final boolean state = buffer.getBoolean(); container.updateServerSubsidiary(ident, entry, state); } - private void readUpdateTrainNumber(final ReadBuffer buffer) { + protected void readUpdateTrainNumber(final ReadBuffer buffer) { final Point point = Point.of(buffer); final TrainNumber number = TrainNumber.of(buffer); getGrid().updateTrainNumber(point, number); } - private void readDebugPoints(final ReadBuffer buffer) { + protected void readDebugPoints(final ReadBuffer buffer) { container.handleDebugPoints( buffer.getList(ReadBuffer.getINetworkSaveableFunction(Point.class))); } - private WriteBuffer getSavedPathwayBuffer(final Point p1, final Point p2) { + protected WriteBuffer getSavedPathwayBuffer(final Point p1, final Point p2) { final WriteBuffer buffer = PATHWAY_SAVER.getBuffer(); p1.writeNetwork(buffer); p2.writeNetwork(buffer); return buffer; } - private WriteBuffer getNodeBuffer(final Point point, final NodeNetworkMode mode) { + protected WriteBuffer getNodeBuffer(final Point point, final NodeNetworkMode mode) { final WriteBuffer buffer = NODE_SPECIAL_ENTRIES.getBuffer(); buffer.putEnumValue(mode); point.writeNetwork(buffer); return buffer; } - private WriteBuffer getGridBuffer(final GridNetworkMode mode) { + protected WriteBuffer getGridBuffer(final GridNetworkMode mode) { final WriteBuffer buffer = GRID.getBuffer(); buffer.putEnumValue(mode); return buffer; } - private WriteBuffer getPathwayBuffer(final PathwayNetworkMode mode) { + protected WriteBuffer getPathwayBuffer(final PathwayNetworkMode mode) { final WriteBuffer buffer = PATHWAY.getBuffer(); buffer.putEnumValue(mode); return buffer; } - private WriteBuffer getEntryBuffer(final ModeIdentifier ident, final EntryNetworkMode mode) { + protected WriteBuffer getEntryBuffer(final ModeIdentifier ident, final EntryNetworkMode mode) { final WriteBuffer buffer = ENTRY.getBuffer(); buffer.putEnumValue(mode); ident.writeNetwork(buffer); @@ -437,7 +436,7 @@ public void desirializeBuffer(final ReadBuffer buffer) { mode.executeRead(buffer, this); } - private void sendBuffer(final WriteBuffer buffer) { + protected void sendBuffer(final WriteBuffer buffer) { if (!containerConnected()) return; OpenSignalsMain.network.sendTo(container.getPlayer(), buffer); @@ -458,19 +457,19 @@ public boolean equals(final Object obj) { return Objects.equals(container, other.container); } - private static enum PathwayNetworkMode { + protected static enum PathwayNetworkMode { REQUEST, RESET, RESPONSE, RESET_ALL_PATHWAYS, RESET_ALL_SIGNALS; } - private static enum NodeNetworkMode { + protected static enum NodeNetworkMode { LABEL, AUTO_POINT, MANUELL_OUTPUT_ADD, MANUELL_OUTPUT_REMOVE, SIGNAL_STATE; } - private static enum GridNetworkMode { + protected static enum GridNetworkMode { SEND_ALL, COUNTER, REMOVE_POS; } - private static enum EntryNetworkMode { + protected static enum EntryNetworkMode { MODE_ADD, MODE_REMOVE, ENTRY_ADD, ENTRY_REMOVE; } } \ No newline at end of file diff --git a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java index 6df210609..3d0325de5 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java +++ b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java @@ -59,7 +59,11 @@ public class SignalBoxGrid implements INetworkSaveable, ISaveable { private final SignalBoxNetworkHandler network = new SignalBoxNetworkHandler(); public SignalBoxGrid() { - this.factory = SignalBoxFactory.getFactory(); + this(SignalBoxFactory.getFactory()); + } + + public SignalBoxGrid(final SignalBoxFactory factory) { + this.factory = factory; } public void setTile(final SignalBoxTileEntity tile) { @@ -123,8 +127,8 @@ protected void resetPathway(final SignalBoxPathway pathway) { } public void updateMode(final Point point, final ModeSet mode) { - final SignalBoxNode node = this.modeGrid.computeIfAbsent(point, - p -> new SignalBoxNode(p, network)); + final SignalBoxNode node = + this.modeGrid.computeIfAbsent(point, p -> new SignalBoxNode(p, network)); if (!node.has(mode)) { node.add(mode); } else { @@ -331,8 +335,8 @@ public SignalBoxPathway getPathwayByLastPoint(final Point end) { } public void updateTrainNumber(final Point point, final TrainNumber number) { - final SignalBoxNode node = modeGrid.computeIfAbsent(point, - p -> new SignalBoxNode(p, network)); + final SignalBoxNode node = + modeGrid.computeIfAbsent(point, p -> new SignalBoxNode(p, network)); startsToPath.values().forEach(pathway -> pathway.checkTrainNumberUpdate(number, node)); } diff --git a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxNode.java b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxNode.java index 7c5ff34fb..a94f9c095 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxNode.java +++ b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxNode.java @@ -76,8 +76,8 @@ public void remove(final ModeSet modeSet) { } public void addAndSetEntry(final ModeSet mode, final PathEntryType entry, final T type) { - final PathOptionEntry optionEntry = possibleModes.computeIfAbsent(mode, - _u -> factory.getEntry()); + final PathOptionEntry optionEntry = + possibleModes.computeIfAbsent(mode, _u -> factory.getEntry()); optionEntry.setUpNetwork(new PathOptionEntryNetwork().setUpNetwork(network, new ModeIdentifier(point, mode))); optionEntry.setEntry(entry, type); @@ -338,6 +338,13 @@ public ModeSet getMode(final Path path) { return possibleConnections.get(path); } + public PathOptionEntry getOrCreateOption(final ModeSet mode) { + final PathOptionEntry entry = possibleModes.computeIfAbsent(mode, _u -> factory.getEntry()); + entry.setUpNetwork(new PathOptionEntryNetwork().setUpNetwork(network, + new ModeIdentifier(point, mode))); + return entry; + } + public Optional getOption(final ModeSet mode) { return Optional.ofNullable(possibleModes.get(mode)); } @@ -356,10 +363,10 @@ public List getPossibleTypes(final SignalBoxNode other) { final Set otherMode = other.possibleModes.keySet().stream() .map(mode -> mode.mode).collect(Collectors.toSet()); for (final PathType type : PathType.values()) { - final boolean thisContains = Arrays.stream(type.getModes()) - .anyMatch(thisMode::contains); - final boolean otherContains = Arrays.stream(type.getModes()) - .anyMatch(otherMode::contains); + final boolean thisContains = + Arrays.stream(type.getModes()).anyMatch(thisMode::contains); + final boolean otherContains = + Arrays.stream(type.getModes()).anyMatch(otherMode::contains); if (thisContains && otherContains) { possibleTypes.add(type); } diff --git a/src/main/java/com/troblecodings/signals/signalbox/debug/DebugNetworkHandler.java b/src/main/java/com/troblecodings/signals/signalbox/debug/DebugNetworkHandler.java new file mode 100644 index 000000000..c57d4e49f --- /dev/null +++ b/src/main/java/com/troblecodings/signals/signalbox/debug/DebugNetworkHandler.java @@ -0,0 +1,101 @@ +package com.troblecodings.signals.signalbox.debug; + +import com.troblecodings.core.ReadBuffer; +import com.troblecodings.core.WriteBuffer; +import com.troblecodings.signals.core.ModeIdentifier; +import com.troblecodings.signals.core.StateInfo; +import com.troblecodings.signals.handler.SignalBoxHandler; +import com.troblecodings.signals.network.SignalBoxNetworkHandler; +import com.troblecodings.signals.signalbox.ModeSet; +import com.troblecodings.signals.signalbox.Point; +import com.troblecodings.signals.signalbox.SignalBoxGrid; +import com.troblecodings.signals.signalbox.SignalBoxNode; +import com.troblecodings.signals.signalbox.entrys.IPathEntry; +import com.troblecodings.signals.signalbox.entrys.PathEntryType; +import com.troblecodings.signals.signalbox.entrys.PathOptionEntry; + +import io.netty.buffer.Unpooled; +import net.minecraft.core.BlockPos; + +public class DebugNetworkHandler extends SignalBoxNetworkHandler { + + private final SignalBoxGrid grid; + + public DebugNetworkHandler(final SignalBoxGrid grid) { + this.grid = grid; + } + + @Override + protected boolean containerConnected() { + return true; + } + + @Override + protected SignalBoxGrid getGrid() { + return grid; + } + + @Override + protected void sendBuffer(final WriteBuffer buffer) { + desirializeBuffer(new ReadBuffer( + Unpooled.copiedBuffer(buffer.getBuildedBuffer().position(0)).nioBuffer())); + } + + @Override + protected void readNodeSpecialEntries(final ReadBuffer buffer) { + final NodeNetworkMode mode = buffer.getEnumValue(NodeNetworkMode.class); + final Point point = Point.of(buffer); + final SignalBoxGrid grid = getGrid(); + final SignalBoxNode node = grid.getNode(point); + if (mode.equals(NodeNetworkMode.LABEL)) { + node.setCustomText(buffer.getString()); + } + if (mode.equals(NodeNetworkMode.AUTO_POINT)) { + node.setAutoPointFromNetwork(buffer.getBoolean()); + } + if (mode.equals(NodeNetworkMode.MANUELL_OUTPUT_ADD) + || mode.equals(NodeNetworkMode.MANUELL_OUTPUT_REMOVE)) { + node.handleManuellEnabledOutputUpdate(buffer.getINetworkSaveable(ModeSet.class), + mode.equals(NodeNetworkMode.MANUELL_OUTPUT_ADD) ? true : false); + } + if (mode.equals(NodeNetworkMode.SIGNAL_STATE)) { + node.readSignalStates(buffer); + } + } + + @Override + protected void readForGrid(final ReadBuffer buffer) { + final SignalBoxGrid grid = getGrid(); + final GridNetworkMode mode = buffer.getEnumValue(GridNetworkMode.class); + if (mode.equals(GridNetworkMode.SEND_ALL)) { + grid.readNetwork(buffer); + } else if (mode.equals(GridNetworkMode.COUNTER)) { + grid.setCounterFromNetwork(buffer.getInt()); + } else { + final BlockPos pos = buffer.getBlockPos(); + SignalBoxHandler.unlinkPosFromSignalBox(new StateInfo(container.getTile().getLevel(), + container.getTile().getBlockPos()), pos); + } + } + + @Override + protected void readEntry(final ReadBuffer buffer) { + final EntryNetworkMode mode = buffer.getEnumValue(EntryNetworkMode.class); + final ModeIdentifier ident = ModeIdentifier.of(buffer); + final SignalBoxNode node = getGrid().getOrCreateNode(ident.point); + if (mode.equals(EntryNetworkMode.MODE_ADD) || mode.equals(EntryNetworkMode.MODE_REMOVE)) { + node.applyModeNetworkChanges(ident); + return; + } + final PathEntryType entryType = PathEntryType.ALL_ENTRIES.get(buffer.getInt()); + final PathOptionEntry optionEntry = node.getOrCreateOption(ident.mode); + if (mode.equals(EntryNetworkMode.ENTRY_REMOVE)) { + optionEntry.removeEntryNoNetwork(entryType); + return; + } + final IPathEntry entry = entryType.newValue(); + entry.readNetwork(buffer); + optionEntry.addEntry(entryType, entry); + } + +} \ No newline at end of file diff --git a/src/main/java/com/troblecodings/signals/signalbox/debug/SignalBoxFactory.java b/src/main/java/com/troblecodings/signals/signalbox/debug/SignalBoxFactory.java index 11ca93575..e3998f648 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/debug/SignalBoxFactory.java +++ b/src/main/java/com/troblecodings/signals/signalbox/debug/SignalBoxFactory.java @@ -23,6 +23,10 @@ public static final SignalBoxFactory getFactory() { return factory; } + public static void setUpFactoryForTests() { + factory = new DebugFactory(); + } + public ConnectionChecker getConnectionCheckerNormal() { return new ConnectionCheckerNormal(); } diff --git a/src/test/java/com/troblecodings/signals/test/NameFileTest.java b/src/test/java/com/troblecodings/signals/test/NameFileTestV2.java similarity index 66% rename from src/test/java/com/troblecodings/signals/test/NameFileTest.java rename to src/test/java/com/troblecodings/signals/test/NameFileTestV2.java index 485e78204..40a656f5f 100644 --- a/src/test/java/com/troblecodings/signals/test/NameFileTest.java +++ b/src/test/java/com/troblecodings/signals/test/NameFileTestV2.java @@ -17,14 +17,12 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import com.troblecodings.signals.core.OSMapEntry; -import com.troblecodings.signals.handler.NameHandlerFile; -import com.troblecodings.signals.handler.SignalStateFile; -import com.troblecodings.signals.handler.SignalStatePos; +import com.troblecodings.signals.handler.NameHandlerFileV2; +import com.troblecodings.signals.handler.SignalStatePosV2; import net.minecraft.util.math.BlockPos; -public class NameFileTest { +public class NameFileTestV2 { private static Path path = null; @@ -57,10 +55,10 @@ public static void resetAll() throws IOException { @Test public void testWriteAndRead() { - final BlockPos pos = GIRSyncEntryTests.randomBlockPos(); + final BlockPos pos = StateFileTestV2.getRandomBlockPos(); final String name = "wdasdfdgsddfwadsdf"; - final NameHandlerFile file = new NameHandlerFile(path); - final SignalStatePos statePos = file.createState(pos, name); + final NameHandlerFileV2 file = new NameHandlerFileV2(path); + final SignalStatePosV2 statePos = file.createState(pos, name); final String nameInFile = file.getString(statePos); assertEquals(name, nameInFile); @@ -70,7 +68,7 @@ public void testWriteAndRead() { file.deleteIndex(pos); assertNull(file.find(pos)); - final SignalStatePos statePos2 = file.createState(pos, name); + final SignalStatePosV2 statePos2 = file.createState(pos, name); final String nameInFile2 = file.getString(statePos2); assertEquals(name, nameInFile2); @@ -79,31 +77,31 @@ public void testWriteAndRead() { @Test public void testException() { - final NameHandlerFile file = new NameHandlerFile(path); + final NameHandlerFileV2 file = new NameHandlerFileV2(path); String str = ""; for (int i = 0; i < 129; i++) { str += "A"; } final String s = str; assertThrowsExactly(IllegalArgumentException.class, - () -> file.createState(GIRSyncEntryTests.randomBlockPos(), s)); + () -> file.createState(StateFileTestV2.getRandomBlockPos(), s)); } @Test public void moreThanPossible() { - final NameHandlerFile file = new NameHandlerFile(path); + final NameHandlerFileV2 file = new NameHandlerFileV2(path); final Map allNames = new HashMap<>(); - final List> listOfPos = new ArrayList<>(); + final List> listOfPos = new ArrayList<>(); String testString = ""; - for (int i = 0; i < SignalStateFile.MAX_ELEMENTS_PER_FILE + 10; i++) { + for (int i = 0; i < 5000; i++) { testString = "test_" + String.valueOf(i); - final BlockPos firstcreate = GIRSyncEntryTests.randomBlockPos(); - final SignalStatePos pos = file.createState(firstcreate, testString); - listOfPos.add(new OSMapEntry<>(firstcreate, pos)); + final BlockPos firstcreate = StateFileTestV2.getRandomBlockPos(); + final SignalStatePosV2 pos = file.createState(firstcreate, testString); + listOfPos.add(Map.entry(firstcreate, pos)); allNames.put(firstcreate, testString); } - for (int i = 0; i < listOfPos.size() / 1000; i++) { - final Map.Entry entry = listOfPos.get(i); + for (int i = 0; i < listOfPos.size(); i++) { + final Map.Entry entry = listOfPos.get(i); assertEquals(entry.getValue(), file.find(entry.getKey())); assertEquals(allNames.get(entry.getKey()), file.getString(entry.getValue())); } diff --git a/src/test/java/com/troblecodings/signals/test/SignalBoxNetworkTest.java b/src/test/java/com/troblecodings/signals/test/SignalBoxNetworkTest.java new file mode 100644 index 000000000..ee44a2983 --- /dev/null +++ b/src/test/java/com/troblecodings/signals/test/SignalBoxNetworkTest.java @@ -0,0 +1,173 @@ +package com.troblecodings.signals.test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Maps; +import com.troblecodings.signals.core.ModeIdentifier; +import com.troblecodings.signals.enums.EnumGuiMode; +import com.troblecodings.signals.signalbox.ModeSet; +import com.troblecodings.signals.signalbox.Point; +import com.troblecodings.signals.signalbox.SignalBoxGrid; +import com.troblecodings.signals.signalbox.debug.DebugNetworkHandler; +import com.troblecodings.signals.signalbox.debug.SignalBoxFactory; +import com.troblecodings.signals.signalbox.entrys.IPathEntry; +import com.troblecodings.signals.signalbox.entrys.PathEntryType; +import com.troblecodings.signals.signalbox.entrys.PathOptionEntry; + +import net.minecraft.world.level.block.Rotation; + +public class SignalBoxNetworkTest { + + private static final Random RANDOM = new Random(); + + private SignalBoxGrid grid = new SignalBoxGrid(null); + private DebugNetworkHandler handler = new DebugNetworkHandler(grid); + + @BeforeAll + public static void setUpFactory() { + SignalBoxFactory.setUpFactoryForTests(); + } + + @Test + public void testAddAndRemoveMode() { + final Map modes = new HashMap<>(); + for (int i = 0; i < 500; i++) { + Point point = getRandPoint(); + while (modes.containsKey(point)) { + point = getRandPoint(); + } + final ModeSet mode = getRandModeSet(); + handler.sendModeAdd(new ModeIdentifier(point, mode)); + modes.put(point, mode); + } + modes.forEach((point, mode) -> { + assertTrue(grid.getNode(point).getModes().keySet().contains(mode)); + handler.sendModeRemove(new ModeIdentifier(point, mode)); + assertTrue(!grid.getNode(point).getModes().keySet().contains(mode)); + }); + } + + @Test + public void testCounter() { + final int counter = RANDOM.nextInt(0, 1000); + grid.setCounter(counter); + handler.sendCounter(); + assertEquals(counter, grid.getCurrentCounter()); + } + + @Test + public void testAddAndRemoveEntry() { + final Map>> entries = + new HashMap<>(); + for (int i = 0; i < 500; i++) { + final ModeSet mode = getRandModeSet(); + ModeIdentifier modeIdent = new ModeIdentifier(getRandPoint(), mode); + while (entries.containsKey(modeIdent)) { + modeIdent = new ModeIdentifier(getRandPoint(), mode); + } + final PathOptionEntry entry = new PathOptionEntry(); + final PathEntryType entryType = getRandEntryType(); + final IPathEntry iPathEntry = entryType.newValue(); + entry.addEntry(entryType, iPathEntry); + handler.sendEntryAdd(modeIdent, entryType, iPathEntry); + entries.put(modeIdent, Maps.immutableEntry(entry, entryType)); + } + entries.forEach((modeIdent, entry) -> { + assertTrue(grid.getNode(modeIdent.point).getOption(modeIdent.mode).get() + .equals(entry.getKey())); + handler.sendEntryRemove(modeIdent, entry.getValue()); + assertTrue(!grid.getNode(modeIdent.point).getOption(modeIdent.mode).get() + .equals(entry.getKey())); + }); + } + + @Test + public void testNodeLabel() { + final Map labels = new HashMap<>(); + for (int i = 0; i < 500; i++) { + Point point = getRandPoint(); + while (labels.containsKey(point)) { + point = getRandPoint(); + } + final ModeSet mode = getRandModeSet(); + handler.sendModeAdd(new ModeIdentifier(point, mode)); + handler.sendNodeLabel(point, "Test"); + labels.put(point, "Test"); + } + labels.forEach( + (point, label) -> assertTrue(grid.getNode(point).getCustomText().equals(label))); + } + + @Test + public void testAutoPoint() { + final List points = new ArrayList<>(); + for (int i = 0; i < 500; i++) { + Point point = getRandPoint(); + while (points.contains(point)) { + point = getRandPoint(); + } + final ModeSet mode = getRandModeSet(); + handler.sendModeAdd(new ModeIdentifier(point, mode)); + handler.sendAutoPoint(point, true); + points.add(point); + } + points.forEach(point -> assertTrue(grid.getNode(point).isAutoPoint())); + } + + @Test + public void testManuellOutput() { + final List points = new ArrayList<>(); + for (int i = 0; i < 500; i++) { + Point point = getRandPoint(); + final ModeSet mode = getRandModeSet(); + final ModeIdentifier ident = new ModeIdentifier(point, mode); + while (points.contains(ident)) { + point = getRandPoint(); + } + handler.sendModeAdd(ident); + handler.sendManuellOutputAdd(point, mode); + points.add(ident); + } + points.forEach(ident -> { + assertTrue(grid.getNode(ident.point).containsManuellOutput(ident.mode)); + handler.sendManuellOutputRemove(ident.point, ident.mode); + assertTrue(!grid.getNode(ident.point).containsManuellOutput(ident.mode)); + }); + } + + @BeforeEach + public void initializeNewGridAndNetwork() { + grid = new SignalBoxGrid(null); + handler = new DebugNetworkHandler(grid); + } + + private Point getRandPoint() { + return new Point(RANDOM.nextInt(0, 101), RANDOM.nextInt(0, 101)); + } + + private ModeSet getRandModeSet() { + return new ModeSet(EnumGuiMode.values()[RANDOM.nextInt(0, EnumGuiMode.values().length)], + Rotation.values()[RANDOM.nextInt(0, Rotation.values().length)]); + } + + private static final List> POSSIBLE_TYPES = ImmutableList.of(PathEntryType.ZS6, + PathEntryType.DELAY, PathEntryType.PATHWAY_COSTS, PathEntryType.SIGNAL_REPEATER, + PathEntryType.PRESIGNALS, PathEntryType.SIGNAL_REPEATER); + + private PathEntryType getRandEntryType() { + return POSSIBLE_TYPES.get(RANDOM.nextInt(0, POSSIBLE_TYPES.size())); + } + +} diff --git a/src/test/java/com/troblecodings/signals/test/StateFileTest.java b/src/test/java/com/troblecodings/signals/test/StateFileTest.java deleted file mode 100644 index 513d95465..000000000 --- a/src/test/java/com/troblecodings/signals/test/StateFileTest.java +++ /dev/null @@ -1,155 +0,0 @@ -package com.troblecodings.signals.test; - -import static org.junit.jupiter.api.Assertions.assertArrayEquals; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import com.troblecodings.signals.core.OSMapEntry; -import com.troblecodings.signals.handler.SignalStateFile; -import com.troblecodings.signals.handler.SignalStatePos; - -import net.minecraft.util.math.BlockPos; - -public class StateFileTest { - - private static Path path = null; - - @BeforeEach - public void reset() throws IOException { - path = Paths.get("test/statefiles"); - if (Files.exists(path)) { - Files.list(path).forEach(t -> { - try { - Files.deleteIfExists(t); - } catch (final IOException e) { - e.printStackTrace(); - } - }); - } - } - - @AfterAll - public static void resetAll() throws IOException { - if (Files.exists(path)) { - Files.list(path).forEach(t -> { - try { - Files.deleteIfExists(t); - } catch (final IOException e) { - e.printStackTrace(); - } - }); - } - } - - @Test - public void creationAndAddition() { - final SignalStateFile file = new SignalStateFile(path); - final BlockPos firstcreate = GIRSyncEntryTests.randomBlockPos(); - final SignalStatePos createPos = file.create(firstcreate); - assertFalse(createPos.offset < SignalStateFile.MAX_OFFSET_OF_INDEX); - assertNotNull(createPos); - - final SignalStatePos position = file.find(firstcreate); - assertNotNull(position); - assertEquals(position, createPos); - - final SignalStateFile file2 = new SignalStateFile(path); - final SignalStatePos position2 = file2.find(firstcreate); - assertNotNull(position2); - assertEquals(position2, createPos); - } - - @Test - public void readAndWrite() { - final SignalStateFile file = new SignalStateFile(path); - - final BlockPos firstcreate = GIRSyncEntryTests.randomBlockPos(); - final SignalStatePos positionInFile = file.create(firstcreate); - final ByteBuffer buffer = ByteBuffer.allocate(SignalStateFile.STATE_BLOCK_SIZE); - GIRSyncEntryTests.RANDOM.nextBytes(buffer.array()); - file.write(positionInFile, buffer); - - final ByteBuffer outbuffer = file.read(positionInFile); - - assertArrayEquals(buffer.array(), outbuffer.array()); - } - - @Test - public void moreThenPossible() { - final SignalStateFile file = new SignalStateFile(path); - final List> listOfPos = new ArrayList<>(); - for (int i = 0; i < SignalStateFile.MAX_ELEMENTS_PER_FILE + 10; i++) { - final BlockPos firstcreate = GIRSyncEntryTests.randomBlockPos(); - listOfPos.add(new OSMapEntry<>(firstcreate, file.create(firstcreate))); - } - for (int i = 0; i < listOfPos.size() / 1000; i++) { - final Map.Entry entry = listOfPos.get(i); - assertEquals(entry.getValue(), file.find(entry.getKey())); - } - } - - @Test - public void readAndWriteCritical() { - final SignalStateFile file = new SignalStateFile(path); - - final BlockPos firstcreate = GIRSyncEntryTests.randomBlockPos(); - final SignalStatePos positionInFile = file.create(firstcreate); - - final ByteBuffer buffer = ByteBuffer.allocate(SignalStateFile.STATE_BLOCK_SIZE); - buffer.array()[0] = (byte) 0xFF; - buffer.array()[255] = (byte) 0x0F; - file.write(positionInFile, buffer); - - final BlockPos secondCreate = GIRSyncEntryTests.randomBlockPos(); - final SignalStatePos secondpositionInFile = file.create(secondCreate); - file.write(secondpositionInFile, buffer); - - final ByteBuffer outbuffer = file.read(positionInFile); - assertArrayEquals(buffer.array(), outbuffer.array()); - - final ByteBuffer outbuffer2 = file.read(secondpositionInFile); - assertArrayEquals(buffer.array(), outbuffer2.array()); - } - - @Test - public void testDelete() { - final SignalStateFile file = new SignalStateFile(path); - final BlockPos first = GIRSyncEntryTests.randomBlockPos(); - final SignalStatePos posInFile = file.create(first); - - final ByteBuffer buffer = ByteBuffer.allocate(SignalStateFile.STATE_BLOCK_SIZE); - buffer.array()[0] = (byte) 0xFF; - buffer.array()[255] = (byte) 0x0F; - file.write(posInFile, buffer); - - final SignalStatePos posToFind = file.find(first); - - assertEquals(posInFile, posToFind); - file.deleteIndex(first); - assertNull(file.find(first)); - - final SignalStatePos secondPos = file.create(first); - file.write(secondPos, buffer); - - final SignalStatePos secondPosToFind = file.find(first); - - assertEquals(secondPos, secondPosToFind); - file.deleteIndex(first); - assertNull(file.find(first)); - } -} \ No newline at end of file diff --git a/src/test/java/com/troblecodings/signals/test/StateFileTestV2.java b/src/test/java/com/troblecodings/signals/test/StateFileTestV2.java index 4746ded26..d6e793f51 100644 --- a/src/test/java/com/troblecodings/signals/test/StateFileTestV2.java +++ b/src/test/java/com/troblecodings/signals/test/StateFileTestV2.java @@ -63,8 +63,8 @@ public static void resetAll() throws IOException { private static final Random RANDOM = new Random(); - private static BlockPos getRandomBlockPos() { - return new BlockPos(RANDOM.nextInt(), RANDOM.nextInt(321), RANDOM.nextInt()); + public static BlockPos getRandomBlockPos() { + return new BlockPos(RANDOM.nextInt(), RANDOM.nextInt(-64, 321), RANDOM.nextInt()); } @Test @@ -123,7 +123,7 @@ public void moreThenPossible() { file.write(statePos, buffer); listOfPos.add(Maps.immutableEntry(firstcreate, statePos)); } - for (int i = 0; i < listOfPos.size() / 1000; i++) { + for (int i = 0; i < listOfPos.size(); i++) { final Map.Entry entry = listOfPos.get(i); final SignalStatePosV2 findPos = file.find(entry.getKey()); assertEquals(buffer, file.read(findPos)); From bde6e1c3e457f5179299c6c82f68d79838204ed6 Mon Sep 17 00:00:00 2001 From: Cedric Date: Tue, 27 Jan 2026 20:41:20 +0100 Subject: [PATCH 14/61] ref: better network performance; fix: issues with Pathways --- .../signals/guis/ModeDropDownBoxUI.java | 25 ++++++++++++++----- .../network/SignalBoxNetworkHandler.java | 2 ++ .../signals/signalbox/SignalBoxGrid.java | 2 +- .../signals/signalbox/SignalBoxNode.java | 4 --- .../signalbox/entrys/PathOptionEntry.java | 19 ++++++++------ 5 files changed, 34 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/guis/ModeDropDownBoxUI.java b/src/main/java/com/troblecodings/signals/guis/ModeDropDownBoxUI.java index 11068e139..b026614e8 100644 --- a/src/main/java/com/troblecodings/signals/guis/ModeDropDownBoxUI.java +++ b/src/main/java/com/troblecodings/signals/guis/ModeDropDownBoxUI.java @@ -148,6 +148,7 @@ public void addElements(final UIEntity parent) { Optional opt = option.getEntry(PathEntryType.ZS6); parent.add(GuiElements.createBoolElement(BoolIntegerables.of("zs6_state"), e -> { final boolean state = e == 1 ? true : false; + // TODO option.setEntry(PathEntryType.ZS6, TCBoolean.valueOf(state)); }, opt.isPresent() && opt.get().booleanValue() ? 1 : 0)); } @@ -159,7 +160,11 @@ public void addElements(final UIEntity parent) { parent.add( GuiElements.createBoolElement(BoolIntegerables.of("signal_repeater"), e -> { final boolean state = e == 1 ? true : false; - option.setEntry(PathEntryType.SIGNAL_REPEATER, state); + if (state) { + option.setEntry(PathEntryType.SIGNAL_REPEATER, state); + } else { + option.removeEntry(PathEntryType.SIGNAL_REPEATER); + } }, opt.isPresent() && opt.get() ? 1 : 0)); break; case HP: { @@ -275,7 +280,11 @@ public void addElements(final UIEntity parent) { parent.add(GuiElements.createBoolElement(BoolIntegerables.of("can_be_overstepped"), e -> { final boolean state = e == 1 ? true : false; - option.setEntry(PathEntryType.CAN_BE_OVERSTPEPPED, state); + if (state) { + option.setEntry(PathEntryType.CAN_BE_OVERSTPEPPED, state); + } else { + option.removeEntry(PathEntryType.CAN_BE_OVERSTPEPPED); + } }, option.getEntry(PathEntryType.CAN_BE_OVERSTPEPPED).orElse(false) ? 1 : 0)); break; @@ -283,7 +292,11 @@ public void addElements(final UIEntity parent) { case BUE: { parent.add(GuiElements.createEnumElement( new SizeIntegerables<>("delay", 60, get -> String.valueOf(get)), i -> { - option.setEntry(PathEntryType.DELAY, i); + if (i == 0) { + option.removeEntry(PathEntryType.DELAY); + } else { + option.setEntry(PathEntryType.DELAY, i); + } }, option.getEntry(PathEntryType.DELAY).orElse(0))); break; } @@ -381,9 +394,9 @@ public void addElements(final UIEntity parent) { gui.container.grid, false, (rendering, point, mouseKey) -> { if (mouseKey != MouseEvent.LEFT_MOUSE) return; - final SignalBoxNode node = gui.container.grid - .getNodeChecked(point) - .orElse(new SignalBoxNode(grid.getNetwork())); + final SignalBoxNode node = + gui.container.grid.getNodeChecked(point).orElse( + new SignalBoxNode(grid.getNetwork())); if (node.isEmpty()) return; diff --git a/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkHandler.java b/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkHandler.java index 7e5ab1e8a..5f95e91ca 100644 --- a/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkHandler.java +++ b/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkHandler.java @@ -258,6 +258,7 @@ protected void readEntry(final ReadBuffer buffer) { final SignalBoxNode node = getGrid().getOrCreateNode(ident.point); if (mode.equals(EntryNetworkMode.MODE_ADD) || mode.equals(EntryNetworkMode.MODE_REMOVE)) { node.applyModeNetworkChanges(ident); + node.post(); return; } final PathEntryType entryType = PathEntryType.ALL_ENTRIES.get(buffer.getInt()); @@ -326,6 +327,7 @@ protected void readPathwayAction(final ReadBuffer buffer) { final PathwayNetworkMode mode = buffer.getEnumValue(PathwayNetworkMode.class); if (mode.equals(PathwayNetworkMode.RESPONSE)) { container.handlePathwayRequestResponse(buffer.getEnumValue(PathwayRequestMode.class)); + return; } if (mode.equals(PathwayNetworkMode.RESET_ALL_PATHWAYS)) { grid.resetAllPathways(); diff --git a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java index 3d0325de5..41fdd49b7 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java +++ b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java @@ -134,6 +134,7 @@ public void updateMode(final Point point, final ModeSet mode) { } else { node.remove(mode); } + node.post(); } public void setUpNetwork(final ContainerSignalBox container) { @@ -207,7 +208,6 @@ protected void updatePrevious(final SignalBoxPathway pathway) { public void resetAllPathways() { ImmutableSet.copyOf(this.startsToPath.values()).forEach(this::resetPathway); clearPaths(); - modeGrid.values().forEach(SignalBoxNode::resetEnumPathUsage); } public void resetAllSignals() { diff --git a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxNode.java b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxNode.java index a94f9c095..0797978c7 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxNode.java +++ b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxNode.java @@ -591,8 +591,4 @@ public Map getModes() { return ImmutableMap.copyOf(possibleModes); } - public void resetEnumPathUsage() { - possibleModes.values().forEach(entry -> entry.removeEntry(PathEntryType.PATHUSAGE)); - } - } \ No newline at end of file diff --git a/src/main/java/com/troblecodings/signals/signalbox/entrys/PathOptionEntry.java b/src/main/java/com/troblecodings/signals/signalbox/entrys/PathOptionEntry.java index 33b8d0d40..d4a4e9210 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/entrys/PathOptionEntry.java +++ b/src/main/java/com/troblecodings/signals/signalbox/entrys/PathOptionEntry.java @@ -33,10 +33,15 @@ public void setEntry(final PathEntryType type, final T value) { pathEntrys.remove(type); return; } - final IPathEntry pathEntry = (IPathEntry) pathEntrys.computeIfAbsent(type, - pType -> pType.newValue()); + final IPathEntry pathEntry = + (IPathEntry) pathEntrys.computeIfAbsent(type, pType -> pType.newValue()); + final T oldValue = pathEntry.getValue(); pathEntry.setValue(value); - network.sendEntryAdd(type, pathEntry); + if (!value.equals(oldValue)) { + network.sendEntryAdd(type, pathEntry); + } else { + System.out.println(); + } } public void addEntry(final PathEntryType entryType, final IPathEntry entry) { @@ -95,8 +100,8 @@ public void write(final NBTWrapper tag) { @Override public void read(final NBTWrapper tag) { - final List> tagSet = tag.keySet().stream().map(PathEntryType::getType) - .collect(Collectors.toList()); + final List> tagSet = + tag.keySet().stream().map(PathEntryType::getType).collect(Collectors.toList()); tagSet.forEach(entry -> { if (entry != null) { if (tag.contains(entry.getName())) { @@ -114,8 +119,8 @@ public void read(final NBTWrapper tag) { public void readNetwork(final ReadBuffer buffer) { pathEntrys.putAll(buffer.getMapWithCombinedValueFunc( NetworkBufferWrappers.PATHENTRYTYPE_FUNCTION, (buf, type) -> { - final IPathEntry entry = pathEntrys.computeIfAbsent(type, - _u -> type.newValue()); + final IPathEntry entry = + pathEntrys.computeIfAbsent(type, _u -> type.newValue()); entry.readNetwork(buffer); return entry; })); From cedebdaaf399d2374bcaab5bdecd5e5273af4d34 Mon Sep 17 00:00:00 2001 From: Cedric Date: Tue, 27 Jan 2026 21:12:42 +0100 Subject: [PATCH 15/61] ref: removed unused debug --- .../troblecodings/signals/signalbox/entrys/PathOptionEntry.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/signalbox/entrys/PathOptionEntry.java b/src/main/java/com/troblecodings/signals/signalbox/entrys/PathOptionEntry.java index d4a4e9210..5f8a51e5a 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/entrys/PathOptionEntry.java +++ b/src/main/java/com/troblecodings/signals/signalbox/entrys/PathOptionEntry.java @@ -39,8 +39,6 @@ public void setEntry(final PathEntryType type, final T value) { pathEntry.setValue(value); if (!value.equals(oldValue)) { network.sendEntryAdd(type, pathEntry); - } else { - System.out.println(); } } From 9132fdb943cb484293d5f2bb29db9202a8e41c47 Mon Sep 17 00:00:00 2001 From: Cedric Date: Tue, 27 Jan 2026 21:16:50 +0100 Subject: [PATCH 16/61] ref: better networking performance --- .../com/troblecodings/signals/guis/ModeDropDownBoxUI.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/guis/ModeDropDownBoxUI.java b/src/main/java/com/troblecodings/signals/guis/ModeDropDownBoxUI.java index b026614e8..c634a2804 100644 --- a/src/main/java/com/troblecodings/signals/guis/ModeDropDownBoxUI.java +++ b/src/main/java/com/troblecodings/signals/guis/ModeDropDownBoxUI.java @@ -148,8 +148,11 @@ public void addElements(final UIEntity parent) { Optional opt = option.getEntry(PathEntryType.ZS6); parent.add(GuiElements.createBoolElement(BoolIntegerables.of("zs6_state"), e -> { final boolean state = e == 1 ? true : false; - // TODO - option.setEntry(PathEntryType.ZS6, TCBoolean.valueOf(state)); + if (state) { + option.setEntry(PathEntryType.ZS6, TCBoolean.valueOf(state)); + } else { + option.removeEntry(PathEntryType.ZS6); + } }, opt.isPresent() && opt.get().booleanValue() ? 1 : 0)); } break; From aaa5abac53e836a0e73fc2c73dd04eeca0cc6a8d Mon Sep 17 00:00:00 2001 From: Cedric Date: Tue, 27 Jan 2026 22:55:14 +0100 Subject: [PATCH 17/61] fix: issues with manuell output --- .../troblecodings/signals/guis/SidePanel.java | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/guis/SidePanel.java b/src/main/java/com/troblecodings/signals/guis/SidePanel.java index 9976e73a5..04be79328 100644 --- a/src/main/java/com/troblecodings/signals/guis/SidePanel.java +++ b/src/main/java/com/troblecodings/signals/guis/SidePanel.java @@ -288,9 +288,9 @@ public void helpUsageMode(final SignalBoxNode node) { helpList.add(getSpacerLine()); - final UIEntity shButton = GuiElements.createButton( - " " + I18Wrapper.format("info.usage.emergency"), - e -> gui.network.sendResetAllSignals()); + final UIEntity shButton = + GuiElements.createButton(" " + I18Wrapper.format("info.usage.emergency"), + e -> gui.network.sendResetAllSignals()); shButton.add(new UIToolTip(I18Wrapper.format("info.usage.emergency.desc"))); final UIEntity emergencyEntity = new UIEntity(); @@ -361,8 +361,8 @@ public void helpUsageMode(final SignalBoxNode node) { helpList.add(GuiElements.createLabel(I18Wrapper.format("info.usage.node"), new UIEntity().getBasicTextColor(), 0.8f)); if (guiModes.contains(EnumGuiMode.HP)) { - final UIEntity entity = GuiElements - .createBoolElement(BoolIntegerables.of("auto_pathway"), e -> { + final UIEntity entity = + GuiElements.createBoolElement(BoolIntegerables.of("auto_pathway"), e -> { node.setAutoPoint(e == 1 ? true : false); }, node.isAutoPoint() ? 1 : 0); entity.setScale(0.95f); @@ -553,15 +553,13 @@ public void helpUsageMode(final SignalBoxNode node) { textureEntity.add(new UIToolTip(I18Wrapper .format("info.usage.rs.desc"))); if (turnOff) { - gui.network.sendManuellOutputRemove( - node.getPoint(), mode); + node.removeManuellOutput(mode); outputStatus.setText(I18Wrapper .format("info.usage.rs.false")); textureEntity.add(new UITexture( GuiSignalBox.REDSTONE_OFF)); } else { - gui.network.sendManuellOutputAdd( - node.getPoint(), mode); + node.addManuellOutput(mode); outputStatus.setText(I18Wrapper .format("info.usage.rs.true")); textureEntity.add(new UITexture( @@ -611,8 +609,8 @@ public void helpUsageMode(final SignalBoxNode node) { lowerEntity.setInherits(true); lowerEntity.add(new UIBox(UIBox.HBOX, 5)); lowerEntity.add(GuiElements.createSpacerH(7)); - final UIEntity save = GuiElements - .createButton(I18Wrapper.format("btn.save"), e1 -> { + final UIEntity save = + GuiElements.createButton(I18Wrapper.format("btn.save"), e1 -> { gui.network.updateTrainNumber(node.getPoint(), new TrainNumber(input.getText())); input.setText(""); @@ -797,11 +795,11 @@ private void addManuellRStoUI() { textureEntity.clear(); textureEntity.add(new UIToolTip(I18Wrapper.format("info.usage.rs.desc"))); if (turnOff) { - gui.network.sendManuellOutputRemove(currentNode.getPoint(), mode); + currentNode.removeManuellOutput(mode); outputStatus.setText(I18Wrapper.format("info.usage.rs.false")); textureEntity.add(new UITexture(GuiSignalBox.REDSTONE_OFF)); } else { - gui.network.sendManuellOutputAdd(currentNode.getPoint(), mode); + currentNode.addManuellOutput(mode); outputStatus.setText(I18Wrapper.format("info.usage.rs.true")); textureEntity.add(new UITexture(GuiSignalBox.REDSTONE_ON)); } From bd888c9d63be7fa362744c2f082c85a1ce429bdc Mon Sep 17 00:00:00 2001 From: Cedric Date: Tue, 27 Jan 2026 23:04:53 +0100 Subject: [PATCH 18/61] ref: better code performance --- .../signals/network/SignalBoxNetworkHandler.java | 2 +- .../signals/signalbox/SignalBoxGrid.java | 15 --------------- .../signals/signalbox/SignalBoxNode.java | 11 ++++++----- .../signalbox/debug/DebugNetworkHandler.java | 2 +- 4 files changed, 8 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkHandler.java b/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkHandler.java index 5f95e91ca..26e5a5421 100644 --- a/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkHandler.java +++ b/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkHandler.java @@ -257,7 +257,7 @@ protected void readEntry(final ReadBuffer buffer) { final ModeIdentifier ident = ModeIdentifier.of(buffer); final SignalBoxNode node = getGrid().getOrCreateNode(ident.point); if (mode.equals(EntryNetworkMode.MODE_ADD) || mode.equals(EntryNetworkMode.MODE_REMOVE)) { - node.applyModeNetworkChanges(ident); + node.applyModeNetworkChanges(ident.mode); node.post(); return; } diff --git a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java index 41fdd49b7..3235e991c 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java +++ b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java @@ -510,21 +510,6 @@ public void writeNetwork(final WriteBuffer buffer) { buffer.putInt(counter); } - public List readUpdateNetwork(final ReadBuffer buffer, final boolean override) { - return buffer.getList((buf) -> { - final Point point = Point.of(buf); - SignalBoxNode node; - if (override) { - node = new SignalBoxNode(point, network); - } else { - node = modeGrid.computeIfAbsent(point, _u -> new SignalBoxNode(point, network)); - } - node.readNetwork(buf); - modeGrid.put(point, node); - return node; - }); - } - public void updateManuellRSOutput(final Point point, final ModeSet mode, final boolean state) { final SignalBoxNode node = modeGrid.get(point); if (node == null) diff --git a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxNode.java b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxNode.java index 0797978c7..b4d832c14 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxNode.java +++ b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxNode.java @@ -542,13 +542,14 @@ public void writeNetwork(final WriteBuffer buffer) { (buf, entry) -> entry.writeNetwork(buf)); } - public void applyModeNetworkChanges(final ModeIdentifier ident) { - if (!has(ident.mode)) { + public void applyModeNetworkChanges(final ModeSet mode) { + if (!has(mode)) { final PathOptionEntry entry = factory.getEntry(); - entry.setUpNetwork(new PathOptionEntryNetwork().setUpNetwork(network, ident)); - possibleModes.put(ident.mode, entry); + entry.setUpNetwork(new PathOptionEntryNetwork().setUpNetwork(network, + new ModeIdentifier(point, mode))); + possibleModes.put(mode, entry); } else { - possibleModes.remove(ident.mode); + possibleModes.remove(mode); } } diff --git a/src/main/java/com/troblecodings/signals/signalbox/debug/DebugNetworkHandler.java b/src/main/java/com/troblecodings/signals/signalbox/debug/DebugNetworkHandler.java index c57d4e49f..93d23ca66 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/debug/DebugNetworkHandler.java +++ b/src/main/java/com/troblecodings/signals/signalbox/debug/DebugNetworkHandler.java @@ -84,7 +84,7 @@ protected void readEntry(final ReadBuffer buffer) { final ModeIdentifier ident = ModeIdentifier.of(buffer); final SignalBoxNode node = getGrid().getOrCreateNode(ident.point); if (mode.equals(EntryNetworkMode.MODE_ADD) || mode.equals(EntryNetworkMode.MODE_REMOVE)) { - node.applyModeNetworkChanges(ident); + node.applyModeNetworkChanges(ident.mode); return; } final PathEntryType entryType = PathEntryType.ALL_ENTRIES.get(buffer.getInt()); From b4166352fcece95cd11a5f6c3bc963e810780428 Mon Sep 17 00:00:00 2001 From: Cedric Date: Tue, 3 Feb 2026 17:42:33 +0100 Subject: [PATCH 19/61] fix: issues with saved pw not removed --- .../troblecodings/signals/network/SignalBoxNetworkHandler.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkHandler.java b/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkHandler.java index 26e5a5421..4bfc71359 100644 --- a/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkHandler.java +++ b/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkHandler.java @@ -370,6 +370,7 @@ protected void readSavedPathway(final ReadBuffer buffer) { final Point p2 = Point.of(buffer); final byte state = buffer.getByte(); if (state == REMOVE) { + getGrid().removeNextPathway(p1, p2); container.handleRemoveSavedPathway(p1, p2); return; } From 043e5e81c667c4f48bce71f6ad2fc9669b8085e9 Mon Sep 17 00:00:00 2001 From: Cedric Date: Wed, 4 Feb 2026 10:09:36 +0100 Subject: [PATCH 20/61] fix: no pathway reset when block is destroyed --- .../com/troblecodings/signals/blocks/SignalBox.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/java/com/troblecodings/signals/blocks/SignalBox.java b/src/main/java/com/troblecodings/signals/blocks/SignalBox.java index b79b54252..df431b888 100644 --- a/src/main/java/com/troblecodings/signals/blocks/SignalBox.java +++ b/src/main/java/com/troblecodings/signals/blocks/SignalBox.java @@ -67,6 +67,19 @@ public void onBlockPlacedBy(final World worldIn, final BlockPos pos, final IBloc SignalBoxHandler.relinkAllRedstoneIOs(new StateInfo(worldIn, pos)); } + @Override + public void playerWillDestroy(final Level world, final BlockPos pos, final BlockState state, + final Player player) { + if (!world.isClientSide) { + final SignalBoxTileEntity tile = (SignalBoxTileEntity) world.getBlockEntity(pos); + tile.unlink(); + tile.getSignalBoxGrid().resetAllPathways(); + SignalBoxHandler.removeSignalBox(new StateInfo(world, pos)); + SignalBoxHandler.onPosRemove(new StateInfo(world, pos)); + } + super.playerWillDestroy(world, pos, state, player); + } + @Override public void breakBlock(final World worldIn, final BlockPos pos, final IBlockState state) { if (!worldIn.isRemote) { From 16047a4bd7318dc34467cb317858adfc9285ff26 Mon Sep 17 00:00:00 2001 From: Cedric Date: Wed, 4 Feb 2026 10:16:48 +0100 Subject: [PATCH 21/61] ref: changed SIGNAL IDs to hash of the name --- .../troblecodings/signals/blocks/Signal.java | 22 +++-- .../contentpacks/SignalSystemParser.java | 6 +- .../signals/guis/GuiSignalBridge.java | 82 +++++++++---------- 3 files changed, 57 insertions(+), 53 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/blocks/Signal.java b/src/main/java/com/troblecodings/signals/blocks/Signal.java index 65955bc5e..bc7329589 100644 --- a/src/main/java/com/troblecodings/signals/blocks/Signal.java +++ b/src/main/java/com/troblecodings/signals/blocks/Signal.java @@ -71,9 +71,9 @@ public class Signal extends BasicBlock { }; public static final Map SIGNALS = new HashMap<>(); - public static final List SIGNAL_IDS = new ArrayList<>(); - public static final PropertyEnum ANGEL = - PropertyEnum.create("angel", SignalAngel.class); + public static final Map SIGNAL_IDS = new HashMap<>(); + public static final EnumProperty ANGEL = + EnumProperty.create("angel", SignalAngel.class); public static final SEProperty CUSTOMNAME = new SEProperty("customname", JsonEnum.BOOLEAN, "false", ChangeableStage.AUTOMATICSTAGE, t -> true, 0); public static final TileEntitySupplierWrapper SUPPLIER = SignalTileEntity::new; @@ -86,9 +86,13 @@ public class Signal extends BasicBlock { public Signal(final SignalProperties prop) { super(Material.ROCK); this.prop = prop; - this.id = SIGNAL_IDS.size(); - SIGNAL_IDS.add(this); - this.setDefaultState(getDefaultState().withProperty(ANGEL, SignalAngel.ANGEL0)); + this.id = name.hashCode(); + if (SIGNAL_IDS.containsKey(this.id)) { + OpenSignalsMain.exitMinecraftWithMessage("Hash [" + this.id + "] already exists for [" + + name + "]! Need to choose an other name!"); + } + SIGNAL_IDS.put(this.id, this); + registerDefaultState(defaultBlockState().setValue(ANGEL, SignalAngel.ANGEL0)); prop.placementtool.addSignal(this); for (int i = 0; i < signalProperties.size(); i++) { final SEProperty property = signalProperties.get(i); @@ -501,11 +505,11 @@ public void getUpdate(final World world, final BlockPos pos) { return; if (sound.duration == 1) { - world.playSound(null, pos, sound.state, SoundCategory.BLOCKS, 1.0F, 1.0F); - } else if (world.isUpdateScheduled(pos, this)) + world.playSound(null, pos, sound.state, SoundSource.BLOCKS, 1.0F, 1.0F); + } else if (world.getBlockTicks().hasScheduledTick(pos, this)) return; else if (sound.predicate.test(properties)) { - world.scheduleUpdate(pos, this, 1); + world.scheduleTick(pos, this, 1); } }); } diff --git a/src/main/java/com/troblecodings/signals/contentpacks/SignalSystemParser.java b/src/main/java/com/troblecodings/signals/contentpacks/SignalSystemParser.java index 3d269f977..0502fa857 100644 --- a/src/main/java/com/troblecodings/signals/contentpacks/SignalSystemParser.java +++ b/src/main/java/com/troblecodings/signals/contentpacks/SignalSystemParser.java @@ -21,8 +21,8 @@ public class SignalSystemParser { private static final Gson GSON = new Gson(); public static Map getAllSignals() { - final List> systems = OpenSignalsMain.contentPacks - .getFiles("signalsystems"); + final List> systems = + OpenSignalsMain.contentPacks.getFiles("signalsystems"); final Map properties = new HashMap<>(); systems.forEach(entry -> { properties.put(entry.getKey(), @@ -55,6 +55,6 @@ public Signal createSignalSystem(final String fileName) { Signal.nextConsumer = list -> { list.addAll(properties); }; - return new Signal(systemProperties.build(info)); + return new Signal(systemProperties.build(info), name); } } \ No newline at end of file diff --git a/src/main/java/com/troblecodings/signals/guis/GuiSignalBridge.java b/src/main/java/com/troblecodings/signals/guis/GuiSignalBridge.java index 4745906ee..ae7e9ef97 100644 --- a/src/main/java/com/troblecodings/signals/guis/GuiSignalBridge.java +++ b/src/main/java/com/troblecodings/signals/guis/GuiSignalBridge.java @@ -64,8 +64,8 @@ public class GuiSignalBridge extends GuiBase { private static final UIBorder SELECTED_BORDER = new UIBorder(0xFF00FF00, 1); private static final int TILE_WIDTH = 13; private static final int TILE_COUNT = 15; - private static final UIToolTip COLLISION_TOOLTIP = new UIToolTip( - I18Wrapper.format("gui.signalbridge.collision"), true); + private static final UIToolTip COLLISION_TOOLTIP = + new UIToolTip(I18Wrapper.format("gui.signalbridge.collision"), true); private final UIEntity leftEntity = new UIEntity(); private final UIEntity middleEntity = new UIEntity(); @@ -82,7 +82,7 @@ public class GuiSignalBridge extends GuiBase { private boolean loaded = false; static { - Signal.SIGNAL_IDS.stream().filter(signal -> signal.isForSignalBridge()) + Signal.SIGNAL_IDS.values().stream().filter(signal -> signal.isForSignalBridge()) .forEach(SIGNALS_FOR_BRIDGE::add); } @@ -110,8 +110,8 @@ private void initInternal() { header.add(GuiElements.createLabel(I18Wrapper.format("gui.signalbridge.title"), header.getBasicTextColor(), 1.1f)); header.add(GuiElements.createSpacerH(10)); - final UIEntity editButton = GuiElements - .createButton(I18Wrapper.format("gui.signalbridge.edit"), e -> { + final UIEntity editButton = + GuiElements.createButton(I18Wrapper.format("gui.signalbridge.edit"), e -> { updateAvailableBridgeParts(SignalBridgeType.BASE); buildGrid(); resetSelection(e); @@ -119,8 +119,8 @@ private void initInternal() { editButton.add(new UIToolTip(I18Wrapper.format("gui.signalbridge.edit.desc"))); header.add(editButton); resetSelection(editButton); - final UIEntity preview = GuiElements - .createButton(I18Wrapper.format("gui.signalbridge.preview"), e -> { + final UIEntity preview = + GuiElements.createButton(I18Wrapper.format("gui.signalbridge.preview"), e -> { buildBridgePreview(); buildBridgeList(); resetSelection(e); @@ -155,8 +155,8 @@ private void updateAvailableBridgeParts(final SignalBridgeType type) { list.setInherits(true); list.add(new UIBox(UIBox.VBOX, 1).setPageable(false)); - final List typeBlocks = SignalBridgeBlockParser.SIGNAL_BRIDGE_BLOCKS - .getOrDefault(type, new ArrayList<>()); + final List typeBlocks = + SignalBridgeBlockParser.SIGNAL_BRIDGE_BLOCKS.getOrDefault(type, new ArrayList<>()); typeBlocks.forEach(block -> { final UIEntity blockEntity = createPreviewForBlock(block, 14, -2, 1.9f, 80, 60, true, 0, 0, true, SignalBridgeRenderData.EMPTY_WRAPPER); @@ -217,9 +217,9 @@ private void buildGrid() { row.add(tile); final SignalBridgeBasicBlock savedBlock = container.builder.getBlockOnPoint(point); if (savedBlock != null) { - final UIEntity blockEntity = createPreviewForBlock(savedBlock, 15, -1, 0.7f, - TILE_WIDTH, TILE_WIDTH, false, -9.5f, 1.5f, false, - SignalBridgeRenderData.EMPTY_WRAPPER); + final UIEntity blockEntity = + createPreviewForBlock(savedBlock, 15, -1, 0.7f, TILE_WIDTH, TILE_WIDTH, + false, -9.5f, 1.5f, false, SignalBridgeBuilder.EMPTY_WRAPPER); tile.add(blockEntity); } if (point.equals(container.builder.getStartPoint())) { @@ -301,9 +301,9 @@ private void buildBridgeList() { scroll.add(list); list.setInherits(true); list.add(new UIBox(UIBox.VBOX, 1).setPageable(false)); - final IIntegerable availableSignals = SizeIntegerables.of( - I18Wrapper.format("gui.signalbridge.signals"), SIGNALS_FOR_BRIDGE.size(), - i -> SIGNALS_FOR_BRIDGE.get(i)); + final IIntegerable availableSignals = + SizeIntegerables.of(I18Wrapper.format("gui.signalbridge.signals"), + SIGNALS_FOR_BRIDGE.size(), i -> SIGNALS_FOR_BRIDGE.get(i)); final UIEntity addButton = GuiElements.createButton("+", e -> { disableMultiRenderer(); push(GuiElements.createScreen(searchPanel -> { @@ -408,9 +408,9 @@ private void buildBridgeList() { addButton.add(new UIToolTip(I18Wrapper.format("gui.signalbridge.plusbutton.desc"))); list.add(addButton); container.allSignals.forEach((name, entry) -> { - final UIEntity blockEntity = createPreviewForBlock(entry.getKey(), 14, -3.5f, 1.9f, 80, - 100, true, 0, 0, true, name, - new ModelInfoWrapper(entry.getKey(), renderData.getDataForName(name)), 100); + final UIEntity blockEntity = + createPreviewForBlock(entry.getKey(), 14, -3.5f, 1.9f, 80, 100, true, 0, 0, + true, name, new ModelInfoWrapper(renderData.getDataForName(name)), 100); blockEntity.add(new UIClickable(e -> { addUISelection(name); currentSignal = name; @@ -554,14 +554,14 @@ private void buildSystemToAddSignal(final String name, final Signal signal, removeUISelection(name); disableRightEntity(); })); - for (final Axis axis : EnumFacing.Axis.values()) { - for (final AxisDirection axisDirection : EnumFacing.AxisDirection.values()) { - final String buttonName = axis.getName() - + (axisDirection == AxisDirection.POSITIVE ? "+" : "-"); + for (final Axis axis : Direction.Axis.values()) { + for (final AxisDirection axisDirection : Direction.AxisDirection.values()) { + final String buttonName = + axis.getName() + (axisDirection == AxisDirection.POSITIVE ? "+" : "-"); final UIEntity button = GuiElements.createButton(buttonName, e -> { final int step = axisDirection == AxisDirection.POSITIVE ? -1 : 1; - final VectorWrapper vector = container.builder.getVecForSignal(entry) - .addOnAxis(axis, step); + final VectorWrapper vector = + container.builder.getVecForSignal(entry).addOnAxis(axis, step); checkCollision(name, vector, signal); container.builder.setNewSignalPos(signal, name, vector); updateMultiRenderer(); @@ -596,8 +596,8 @@ private void disableRightEntity() { private void checkMaxAndMins(final VectorWrapper vector) { for (final Axis axis : Axis.values()) { for (final AxisDirection axisDirection : AxisDirection.values()) { - final String buttonName = axis.getName() - + (axisDirection == AxisDirection.POSITIVE ? "+" : "-"); + final String buttonName = + axis.getName() + (axisDirection == AxisDirection.POSITIVE ? "+" : "-"); final UIEntity button = nameForButton.get(buttonName); switch (axis) { case X: { @@ -629,10 +629,9 @@ private void checkMaxAndMins(final VectorWrapper vector) { } private static void checkEnableAndDisable(final AxisDirection axisDirection, final int min, - final float max, final float value, final UIEntity button) { - if (value >= max && axisDirection == AxisDirection.POSITIVE) { - disableSelection(button); - } else if (value <= min && axisDirection == AxisDirection.NEGATIVE) { + final int max, final float value, final UIEntity button) { + if ((value >= max && axisDirection == AxisDirection.POSITIVE) + || (value <= min && axisDirection == AxisDirection.NEGATIVE)) { disableSelection(button); } else { enableSelection(button); @@ -669,9 +668,9 @@ private void buildSignalPropertiesSelection(final Signal signal, final String na final Map.Entry> entry = container.allSignals.get(name); previewSidebar.clear(); signal.getProperties().forEach(property -> { - final int value = entry.getValue().containsKey(property) - ? entry.getValue().get(property) - : property.getParent().getIDFromValue(property.getDefault()); + final int value = + entry.getValue().containsKey(property) ? entry.getValue().get(property) + : property.getParent().getIDFromValue(property.getDefault()); of(property, inp -> applyPropertyChanges(name, property, inp), value); }); previewSidebar.update(signal); @@ -713,10 +712,10 @@ private static UIEntity createPreviewForBlock(final BasicBlock block, final floa blockEntity.setHeight(height); blockEntity.add(new UIColor(GuiSignalBox.BACKGROUND_COLOR)); if (showName) { - final UILabel label = new UILabel( - customName.isEmpty() - ? I18Wrapper.format("tile." - + block.delegate.name().getResourcePath() + ".name") + final UILabel label = + new UILabel(customName.isEmpty() + ? I18Wrapper.format("block." + OpenSignalsMain.MODID + "." + + block.delegate.name().getPath()) : customName); label.setCenterY(false); label.setTextColor(blockEntity.getBasicTextColor()); @@ -732,8 +731,9 @@ private static UIEntity createPreviewForBlock(final BasicBlock block, final floa preview.add(new UIScale(previewScale, previewScale, previewScale)); if (enableRotation) { - preview.add(new UIDrag((x, y) -> renderer - .updateRotation(QuaternionWrapper.fromXYZ(0, (float) x * 0.1f, 0)), 1)); + preview.add(new UIDrag( + (x, y) -> renderer.updateRotation(Quaternion.fromXYZ(0, (float) x * 0.1f, 0)), + 1)); } preview.add(new UIScissor()); @@ -792,8 +792,8 @@ private void applyPropertyChanges(final String signalName, final SEProperty prop final int valueId) { if (!loaded) return; - final Map.Entry> entry = container.allSignals - .get(signalName); + final Map.Entry> entry = + container.allSignals.get(signalName); final Signal signal = entry.getKey(); final int propertyId = signal.getIDFromProperty(property); final WriteBuffer buffer = new WriteBuffer(); From 93021fd61416001c1be5a6d4823348f71ee8470b Mon Sep 17 00:00:00 2001 From: Cedric Date: Wed, 4 Feb 2026 10:44:18 +0100 Subject: [PATCH 22/61] ref: changed system, when client animations get updated --- .../animation/SignalAnimationHandler.java | 5 +- .../handler/ClientSignalStateHandler.java | 12 ++--- .../signals/handler/SignalStateHandler.java | 47 +++++++------------ .../signals/tileentitys/SignalTileEntity.java | 2 + 4 files changed, 29 insertions(+), 37 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/animation/SignalAnimationHandler.java b/src/main/java/com/troblecodings/signals/animation/SignalAnimationHandler.java index d0d372452..071240b08 100644 --- a/src/main/java/com/troblecodings/signals/animation/SignalAnimationHandler.java +++ b/src/main/java/com/troblecodings/signals/animation/SignalAnimationHandler.java @@ -117,11 +117,12 @@ private void updateAnimation(final ModelTranslation translation, final float tic translation.setUpNewTranslation(animation.getModelTranslation()); } - public void updateStates(final Map properties, final boolean firstLoad) { + public void updateStates(final Map properties, + final boolean loadToFinalState) { if (properties == null || properties.isEmpty()) return; final ModelInfoWrapper wrapper = new ModelInfoWrapper(tile.getBlockType(), properties); - if (firstLoad) { + if (loadToFinalState) { updateToFinalizedAnimations(wrapper); } else { updateAnimations(wrapper); diff --git a/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java b/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java index 79c286436..c82a2aff8 100644 --- a/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java +++ b/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java @@ -10,6 +10,7 @@ import com.troblecodings.signals.blocks.Signal; import com.troblecodings.signals.core.NetworkBufferWrappers; import com.troblecodings.signals.core.StateInfo; +import com.troblecodings.signals.enums.ChangedState; import com.troblecodings.signals.tileentitys.SignalTileEntity; import net.minecraft.block.state.IBlockState; @@ -40,8 +41,9 @@ public void deserializeClient(final ReadBuffer buffer) { final BlockPos signalPos = buffer.getBlockPos(); final StateInfo stateInfo = new StateInfo(level, signalPos); final int signalID = buffer.getInt(); - final boolean remove = buffer.getBoolean(); - if (remove) { + final ChangedState changedState = buffer.getEnumValue(ChangedState.class); + if (changedState.equals(ChangedState.REMOVED_FROM_CACHE) + || changedState.equals(ChangedState.REMOVED_FROM_FILE)) { setRemoved(stateInfo); return; } @@ -49,11 +51,9 @@ public void deserializeClient(final ReadBuffer buffer) { final Map newProperties = buffer.getMapWithCombinedValueFunc(NetworkBufferWrappers.getSEPropertyFunc(signal), (buf, prop) -> prop.getObjFromID(buf.getByteToUnsignedInt())); - final Map properties; - boolean contains; synchronized (CURRENTLY_LOADED_STATES) { - contains = CURRENTLY_LOADED_STATES.containsKey(stateInfo); - properties = CURRENTLY_LOADED_STATES.computeIfAbsent(stateInfo, _u -> new HashMap<>()); + final Map properties = + CURRENTLY_LOADED_STATES.computeIfAbsent(stateInfo, _u -> new HashMap<>()); properties.putAll(newProperties); CURRENTLY_LOADED_STATES.put(stateInfo, properties); } diff --git a/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java b/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java index 50864838d..d35dd23b3 100644 --- a/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java +++ b/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java @@ -102,7 +102,7 @@ public static void createStates(final SignalStateInfo info, synchronized (SIGNAL_COUNTER) { SIGNAL_COUNTER.put(info, list); } - sendToAll(info, states); + sendToAll(info, states, ChangedState.UPDATED); createToFile(info, states); }); } @@ -424,28 +424,29 @@ public static void setRemoved(final SignalStateInfo info) { synchronized (SIGNAL_COUNTER) { SIGNAL_COUNTER.remove(info); } + sendRemoved(info, ChangedState.REMOVED_FROM_FILE); updateListeners(info, removedProperties, ChangedState.REMOVED_FROM_FILE); synchronized (ALL_LISTENERS) { ALL_LISTENERS.remove(info); } } - public static void sendRemoved(final SignalStateInfo info) { + private static void sendRemoved(final SignalStateInfo info, final ChangedState state) { final WriteBuffer buffer = new WriteBuffer(); buffer.putBlockPos(info.pos); buffer.putInt(info.signal.getID()); - buffer.putBoolean(true); - info.world.playerEntities.forEach(player -> sendTo(player, buffer.getBuildedBuffer())); + buffer.putEnumValue(state); + info.world.players().forEach(player -> sendTo(player, buffer.getBuildedBuffer())); } public static ByteBuffer packToByteBuffer(final SignalStateInfo stateInfo, - final Map properties) { + final Map properties, final ChangedState state) { if (properties.size() > 254) throw new IllegalStateException("Too many SEProperties!"); final WriteBuffer buffer = new WriteBuffer(); buffer.putBlockPos(stateInfo.pos); buffer.putInt(stateInfo.signal.getID()); - buffer.putBoolean(false); + buffer.putEnumValue(state); buffer.putMapWithCombinedValueConsumer(properties, NetworkBufferWrappers.getSEPropertyConsumer(stateInfo.signal), (buf, prop, value) -> buf.putByte((byte) prop.getParent().getIDFromValue(value))); @@ -453,40 +454,28 @@ public static ByteBuffer packToByteBuffer(final SignalStateInfo stateInfo, } private static void sendTo(final SignalStateInfo info, final Map properties, - final @Nullable EntityPlayer player) { + final @Nullable Player player, final ChangedState state) { if (player == null) { - sendToAll(info, properties); + sendToAll(info, properties, state); } else { - sendToPlayer(info, properties, player); + sendToPlayer(info, properties, player, state); } } private static void sendToPlayer(final SignalStateInfo stateInfo, - final Map properties, final EntityPlayer player) { + final Map properties, final Player player, + final ChangedState state) { if (properties == null || properties.isEmpty()) return; - sendTo(player, packToByteBuffer(stateInfo, properties)); + sendTo(player, packToByteBuffer(stateInfo, properties, state)); } private static void sendToAll(final SignalStateInfo stateInfo, - final Map properties) { + final Map properties, final ChangedState state) { if (properties == null || properties.isEmpty()) return; - final ByteBuffer buffer = packToByteBuffer(stateInfo, properties); - final List players = ImmutableList.copyOf(stateInfo.world.playerEntities); - players.forEach(player -> sendTo(player, buffer)); - } - - @SubscribeEvent - public static void onEntityJoinWorldEvent(final EntityJoinWorldEvent event) { - final Entity entity = event.getEntity(); - if (!(entity instanceof EntityPlayer)) - return; - final Map> properties; - synchronized (CURRENTLY_LOADED_STATES) { - properties = ImmutableMap.copyOf(CURRENTLY_LOADED_STATES); - } - properties.forEach((info, map) -> sendTo(info, map, (EntityPlayer) entity)); + final ByteBuffer buffer = packToByteBuffer(stateInfo, properties, state); + stateInfo.world.players().forEach(playerEntity -> sendTo(playerEntity, buffer)); } @SubscribeEvent @@ -562,14 +551,14 @@ public static void loadSignals(final List signals, synchronized (CURRENTLY_LOADED_STATES) { sendProperties = CURRENTLY_LOADED_STATES.get(info.info); } - sendTo(info.info, sendProperties, player); + sendTo(info.info, sendProperties, player, ChangedState.ADDED_TO_CACHE); return; } final Map properties = readAndSerialize(info.info); synchronized (CURRENTLY_LOADED_STATES) { CURRENTLY_LOADED_STATES.put(info.info, properties); } - sendToAll(info.info, properties); + sendTo(info.info, properties, player, ChangedState.ADDED_TO_CACHE); updateListeners(info.info, properties, ChangedState.ADDED_TO_CACHE); final List tasks; synchronized (TASKS_WHEN_LOAD) { diff --git a/src/main/java/com/troblecodings/signals/tileentitys/SignalTileEntity.java b/src/main/java/com/troblecodings/signals/tileentitys/SignalTileEntity.java index f27958193..ef7c5d053 100644 --- a/src/main/java/com/troblecodings/signals/tileentitys/SignalTileEntity.java +++ b/src/main/java/com/troblecodings/signals/tileentitys/SignalTileEntity.java @@ -13,6 +13,8 @@ import com.troblecodings.signals.core.RenderOverlayInfo; import com.troblecodings.signals.core.SignalStateListener; import com.troblecodings.signals.core.StateInfo; +import com.troblecodings.signals.core.TileEntityInfo; +import com.troblecodings.signals.enums.ChangedState; import com.troblecodings.signals.handler.ClientSignalStateHandler; import com.troblecodings.signals.handler.SignalStateHandler; import com.troblecodings.signals.handler.SignalStateInfo; From 8a12f3bd5410398f97f0a361347bb8a67973d42a Mon Sep 17 00:00:00 2001 From: Cedric Date: Thu, 5 Feb 2026 22:37:44 +0100 Subject: [PATCH 23/61] ref: added default entry for better networking and testing --- .../signalbox/entrys/BlockposEntry.java | 5 ++++ .../signals/signalbox/entrys/BoolEntry.java | 5 ++++ .../signals/signalbox/entrys/ByteEntry.java | 5 ++++ .../signals/signalbox/entrys/EnumEntry.java | 5 ++++ .../signals/signalbox/entrys/IPathEntry.java | 2 ++ .../signalbox/entrys/IntegerEntry.java | 5 ++++ .../signalbox/entrys/ListBlockPosEntry.java | 5 ++++ .../signalbox/entrys/ModeIdentifierEntry.java | 5 ++++ .../signalbox/entrys/PathOptionEntry.java | 12 ++++++---- .../signals/signalbox/entrys/PointEntry.java | 5 ++++ .../signals/signalbox/entrys/TCBoolEntry.java | 5 ++++ .../signalbox/entrys/TrainNumberEntry.java | 5 ++++ .../signals/test/SignalBoxNetworkTest.java | 23 ++++++++++++------- 13 files changed, 74 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/signalbox/entrys/BlockposEntry.java b/src/main/java/com/troblecodings/signals/signalbox/entrys/BlockposEntry.java index c009895b5..85cdc18aa 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/entrys/BlockposEntry.java +++ b/src/main/java/com/troblecodings/signals/signalbox/entrys/BlockposEntry.java @@ -42,6 +42,11 @@ public void setValue(final BlockPos pPosition) { this.position = pPosition; } + @Override + public BlockPos getDefaultValue() { + return BlockPos.ZERO; + } + @Override public void readNetwork(final ReadBuffer buffer) { this.position = buffer.getBlockPos(); diff --git a/src/main/java/com/troblecodings/signals/signalbox/entrys/BoolEntry.java b/src/main/java/com/troblecodings/signals/signalbox/entrys/BoolEntry.java index 3a1affb26..e04276858 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/entrys/BoolEntry.java +++ b/src/main/java/com/troblecodings/signals/signalbox/entrys/BoolEntry.java @@ -58,6 +58,11 @@ public void accept(final int value) { this.setValue(getObjFromID(value)); } + @Override + public Boolean getDefaultValue() { + return false; + } + @Override public void readNetwork(final ReadBuffer buffer) { value = buffer.getBoolean(); diff --git a/src/main/java/com/troblecodings/signals/signalbox/entrys/ByteEntry.java b/src/main/java/com/troblecodings/signals/signalbox/entrys/ByteEntry.java index bba6014a2..ec0a7f81c 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/entrys/ByteEntry.java +++ b/src/main/java/com/troblecodings/signals/signalbox/entrys/ByteEntry.java @@ -33,6 +33,11 @@ public Byte getValue() { return (byte) value; } + @Override + public Byte getDefaultValue() { + return 0; + } + @Override public void setValue(final Byte value) { this.value = value; diff --git a/src/main/java/com/troblecodings/signals/signalbox/entrys/EnumEntry.java b/src/main/java/com/troblecodings/signals/signalbox/entrys/EnumEntry.java index 458949c73..a48180453 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/entrys/EnumEntry.java +++ b/src/main/java/com/troblecodings/signals/signalbox/entrys/EnumEntry.java @@ -64,6 +64,11 @@ public void accept(final int value) { setValue(getObjFromID(value)); } + @Override + public T getDefaultValue() { + return enumClass.getEnumConstants()[0]; + } + @Override public void readNetwork(final ReadBuffer buffer) { this.enumValue = buffer.getEnumValue(enumClass); diff --git a/src/main/java/com/troblecodings/signals/signalbox/entrys/IPathEntry.java b/src/main/java/com/troblecodings/signals/signalbox/entrys/IPathEntry.java index 2fd8f87c9..4433e2e20 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/entrys/IPathEntry.java +++ b/src/main/java/com/troblecodings/signals/signalbox/entrys/IPathEntry.java @@ -37,6 +37,8 @@ public void setName(final String name) { */ public abstract void setValue(T value); + public abstract T getDefaultValue(); + @Override public int hashCode() { return Objects.hash(name, this.getValue()); diff --git a/src/main/java/com/troblecodings/signals/signalbox/entrys/IntegerEntry.java b/src/main/java/com/troblecodings/signals/signalbox/entrys/IntegerEntry.java index c049fd6cd..f0f34349a 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/entrys/IntegerEntry.java +++ b/src/main/java/com/troblecodings/signals/signalbox/entrys/IntegerEntry.java @@ -35,6 +35,11 @@ public void accept(final int value) { this.setValue(value); } + @Override + public Integer getDefaultValue() { + return 0; + } + @Override public void readNetwork(final ReadBuffer buffer) { this.value = buffer.getInt(); diff --git a/src/main/java/com/troblecodings/signals/signalbox/entrys/ListBlockPosEntry.java b/src/main/java/com/troblecodings/signals/signalbox/entrys/ListBlockPosEntry.java index c4e4ee48e..9f1ebd84c 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/entrys/ListBlockPosEntry.java +++ b/src/main/java/com/troblecodings/signals/signalbox/entrys/ListBlockPosEntry.java @@ -48,6 +48,11 @@ public void setValue(final List value) { this.list = new ArrayList<>(value); } + @Override + public List getDefaultValue() { + return new ArrayList<>(); + } + public void add(final PosIdentifier pos) { list.add(pos); } diff --git a/src/main/java/com/troblecodings/signals/signalbox/entrys/ModeIdentifierEntry.java b/src/main/java/com/troblecodings/signals/signalbox/entrys/ModeIdentifierEntry.java index 8eef62fb9..da2263b9f 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/entrys/ModeIdentifierEntry.java +++ b/src/main/java/com/troblecodings/signals/signalbox/entrys/ModeIdentifierEntry.java @@ -34,6 +34,11 @@ public ModeIdentifier getValue() { return identifier; } + @Override + public ModeIdentifier getDefaultValue() { + return new ModeIdentifier(null, null); + } + @Override public void setValue(final ModeIdentifier value) { identifier = value; diff --git a/src/main/java/com/troblecodings/signals/signalbox/entrys/PathOptionEntry.java b/src/main/java/com/troblecodings/signals/signalbox/entrys/PathOptionEntry.java index 5f8a51e5a..914ff4f05 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/entrys/PathOptionEntry.java +++ b/src/main/java/com/troblecodings/signals/signalbox/entrys/PathOptionEntry.java @@ -89,11 +89,13 @@ public String toString() { @Override public void write(final NBTWrapper tag) { - pathEntrys.forEach((type, option) -> { - final NBTWrapper entry = new NBTWrapper(); - option.write(entry); - tag.putWrapper(type.getName(), entry); - }); + pathEntrys.entrySet().stream().filter( + entry -> !entry.getValue().getValue().equals(entry.getValue().getDefaultValue())) + .forEach(entry -> { + final NBTWrapper entryWrapper = new NBTWrapper(); + entry.getValue().write(entryWrapper); + tag.putWrapper(entry.getKey().getName(), entryWrapper); + }); } @Override diff --git a/src/main/java/com/troblecodings/signals/signalbox/entrys/PointEntry.java b/src/main/java/com/troblecodings/signals/signalbox/entrys/PointEntry.java index 1593c7fdc..ae4a67062 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/entrys/PointEntry.java +++ b/src/main/java/com/troblecodings/signals/signalbox/entrys/PointEntry.java @@ -35,6 +35,11 @@ public Point getValue() { return point; } + @Override + public Point getDefaultValue() { + return new Point(-1, -1); + } + @Override public void setValue(final Point value) { this.point = value; diff --git a/src/main/java/com/troblecodings/signals/signalbox/entrys/TCBoolEntry.java b/src/main/java/com/troblecodings/signals/signalbox/entrys/TCBoolEntry.java index e83691d04..430136b3c 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/entrys/TCBoolEntry.java +++ b/src/main/java/com/troblecodings/signals/signalbox/entrys/TCBoolEntry.java @@ -60,6 +60,11 @@ public void accept(final int value) { this.setValue(getObjFromID(value)); } + @Override + public TCBoolean getDefaultValue() { + return TCBoolean.FALSE; + } + @Override public void readNetwork(final ReadBuffer buffer) { value = buffer.getBoolean(); diff --git a/src/main/java/com/troblecodings/signals/signalbox/entrys/TrainNumberEntry.java b/src/main/java/com/troblecodings/signals/signalbox/entrys/TrainNumberEntry.java index 81773e611..ad549fef2 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/entrys/TrainNumberEntry.java +++ b/src/main/java/com/troblecodings/signals/signalbox/entrys/TrainNumberEntry.java @@ -34,6 +34,11 @@ public TrainNumber getValue() { return number; } + @Override + public TrainNumber getDefaultValue() { + return TrainNumber.DEFAULT; + } + @Override public void setValue(final TrainNumber value) { number = value; diff --git a/src/test/java/com/troblecodings/signals/test/SignalBoxNetworkTest.java b/src/test/java/com/troblecodings/signals/test/SignalBoxNetworkTest.java index ee44a2983..be4d81f83 100644 --- a/src/test/java/com/troblecodings/signals/test/SignalBoxNetworkTest.java +++ b/src/test/java/com/troblecodings/signals/test/SignalBoxNetworkTest.java @@ -8,12 +8,13 @@ import java.util.List; import java.util.Map; import java.util.Random; +import java.util.stream.Collectors; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.troblecodings.signals.core.ModeIdentifier; import com.troblecodings.signals.enums.EnumGuiMode; @@ -23,8 +24,10 @@ import com.troblecodings.signals.signalbox.debug.DebugNetworkHandler; import com.troblecodings.signals.signalbox.debug.SignalBoxFactory; import com.troblecodings.signals.signalbox.entrys.IPathEntry; +import com.troblecodings.signals.signalbox.entrys.ModeIdentifierEntry; import com.troblecodings.signals.signalbox.entrys.PathEntryType; import com.troblecodings.signals.signalbox.entrys.PathOptionEntry; +import com.troblecodings.signals.signalbox.entrys.PointEntry; import net.minecraft.world.level.block.Rotation; @@ -67,8 +70,9 @@ public void testCounter() { assertEquals(counter, grid.getCurrentCounter()); } + @SuppressWarnings("unchecked") @Test - public void testAddAndRemoveEntry() { + public void testAddAndRemoveEntry() { final Map>> entries = new HashMap<>(); for (int i = 0; i < 500; i++) { @@ -78,8 +82,9 @@ public void testAddAndRemoveEntry() { modeIdent = new ModeIdentifier(getRandPoint(), mode); } final PathOptionEntry entry = new PathOptionEntry(); - final PathEntryType entryType = getRandEntryType(); - final IPathEntry iPathEntry = entryType.newValue(); + final PathEntryType entryType = (PathEntryType) getRandEntryType(); + final IPathEntry iPathEntry = entryType.newValue(); + iPathEntry.setValue(iPathEntry.getDefaultValue()); entry.addEntry(entryType, iPathEntry); handler.sendEntryAdd(modeIdent, entryType, iPathEntry); entries.put(modeIdent, Maps.immutableEntry(entry, entryType)); @@ -162,12 +167,14 @@ private ModeSet getRandModeSet() { Rotation.values()[RANDOM.nextInt(0, Rotation.values().length)]); } - private static final List> POSSIBLE_TYPES = ImmutableList.of(PathEntryType.ZS6, - PathEntryType.DELAY, PathEntryType.PATHWAY_COSTS, PathEntryType.SIGNAL_REPEATER, - PathEntryType.PRESIGNALS, PathEntryType.SIGNAL_REPEATER); + private static final List> PATHENTRY_TYPES = + Lists.newArrayList(PathEntryType.ALL_ENTRIES).stream() + .filter(entry -> !(entry.getEntryClass().equals(ModeIdentifierEntry.class) + || entry.getEntryClass().equals(PointEntry.class))) + .collect(Collectors.toList()); private PathEntryType getRandEntryType() { - return POSSIBLE_TYPES.get(RANDOM.nextInt(0, POSSIBLE_TYPES.size())); + return PATHENTRY_TYPES.get(RANDOM.nextInt(0, PATHENTRY_TYPES.size())); } } From 9c0b4c24c4e39c275a4b6dbc9c841c802d5bef99 Mon Sep 17 00:00:00 2001 From: Cedric Date: Thu, 5 Feb 2026 23:23:58 +0100 Subject: [PATCH 24/61] fix: issue with presignals not resetting --- .../signals/signalbox/SignalBoxPathway.java | 41 +++++++++---------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxPathway.java b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxPathway.java index 229764f15..192b95d19 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxPathway.java +++ b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxPathway.java @@ -188,8 +188,9 @@ protected void setSignals() { protected void setSignals(final SignalStateInfo lastSignal) { if (isExecutingSignalSet || tile == null) return; - final World world = tile.getWorld(); - final StateInfo identifier = new StateInfo(world, tile.getPos()); + isExecutingSignalSet = true; + final Level world = tile.getLevel(); + final StateInfo identifier = new StateInfo(world, tile.getBlockPos()); final MainSignalIdentifier startSignal = data.getStartSignal(); if (startSignal != null) { if (isBlocked) @@ -201,22 +202,17 @@ protected void setSignals(final SignalStateInfo lastSignal) { SignalConfig.change(new ConfigInfo(firstInfo, lastSignal, data)); updatePreSignals(); } - final SignalBoxPathway next = getNextPathway(); - if (next != null && (next.isEmptyOrBroken() || next.isBlocked)) { - updateSignalStates(); - return; - } - final Map distantSignalPositions = data - .getOtherSignals(); + final Map distantSignalPositions = + data.getOtherSignals(); distantSignalPositions.forEach((holder, position) -> { if (holder.shouldTurnSignalOff()) return; final Signal current = SignalBoxHandler.getSignal(identifier, position.pos); if (current == null) return; - final ConfigInfo info = new ConfigInfo( - new SignalStateInfo(world, position.pos, current), lastSignal, data, - position.isRepeater); + final ConfigInfo info = + new ConfigInfo(new SignalStateInfo(world, position.pos, current), lastSignal, + data, position.isRepeater); if (position.guiMode.equals(EnumGuiMode.HP)) { SignalConfig.loadDisable(info); } else { @@ -224,6 +220,7 @@ protected void setSignals(final SignalStateInfo lastSignal) { } }); updateSignalStates(); + isExecutingSignalSet = false; } private void updatePreSignals() { @@ -257,8 +254,8 @@ protected void updateSignalStates() { }); } } - final Map distantSignalPositions = data - .getOtherSignals(); + final Map distantSignalPositions = + data.getOtherSignals(); distantSignalPositions.forEach((holder, position) -> { if (holder.shouldTurnSignalOff()) { position.updateSignalState(SignalState.OFF); @@ -326,8 +323,8 @@ private void resetFirstSignal() { } private void resetOther() { - final Map distantSignalPositions = data - .getOtherSignals(); + final Map distantSignalPositions = + data.getOtherSignals(); distantSignalPositions.values().forEach((position) -> { final Signal current = SignalBoxHandler .getSignal(new StateInfo(tile.getWorld(), tile.getPos()), position.pos); @@ -360,8 +357,8 @@ public void postReset() { public void compact(final Point point) { data.foreachPath((path, node) -> { - final Rotation rotation = SignalBoxUtil - .getRotationFromDelta(node.getPoint().delta(path.point1)); + final Rotation rotation = + SignalBoxUtil.getRotationFromDelta(node.getPoint().delta(path.point1)); for (final EnumGuiMode mode : Arrays.asList(EnumGuiMode.VP, EnumGuiMode.RS, EnumGuiMode.HP, EnumGuiMode.ZS3)) { node.getOption(new ModeSet(mode, rotation)).ifPresent( @@ -370,8 +367,8 @@ public void compact(final Point point) { new StateInfo(tile.getWorld(), tile.getPos()), position); if (current == null) return; - final Map distantSignalPositions = data - .getOtherSignals(); + final Map distantSignalPositions = + data.getOtherSignals(); final OtherSignalIdentifier identifier = distantSignalPositions .getOrDefault(new BlockPosSignalHolder(position), new OtherSignalIdentifier(point, @@ -496,8 +493,8 @@ protected void updateTrainNumber(final TrainNumber number) { if (trainNumberDisplays == null || number == null) return; trainNumberDisplays.forEach(ident -> { - final PathOptionEntry entry = grid.getNode(ident.point).getOption(ident.mode) - .orElse(factory.getEntry()); + final PathOptionEntry entry = + grid.getNode(ident.point).getOption(ident.mode).orElse(factory.getEntry()); if (number.equals(TrainNumber.DEFAULT)) { entry.removeEntry(PathEntryType.TRAINNUMBER); } else { From 33b16e636212409d6daf86dfebad6552b56add34 Mon Sep 17 00:00:00 2001 From: Cedric Date: Thu, 5 Feb 2026 23:48:11 +0100 Subject: [PATCH 25/61] ref: removed try-catch in Grid --- .../signals/signalbox/SignalBoxGrid.java | 73 +++++++------------ .../signals/signalbox/SignalBoxPathway.java | 5 +- 2 files changed, 29 insertions(+), 49 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java index 3235e991c..ad89c373d 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java +++ b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java @@ -150,27 +150,19 @@ public SignalBoxNetworkHandler getNetwork() { } public PathwayRequestResult requestWay(final Point p1, final Point p2, final PathType type) { - try { - final PathwayRequestResult result = SignalBoxUtil.requestPathway(this, p1, p2, type); - if (!result.wasSuccesfull()) { - if (result.getMode().equals(PathwayRequestMode.PASS)) - return PathwayRequestResult.getByMode(PathwayRequestMode.NO_PATH); - return result; - } - final PathwayData data = result.getPathwayData(); - if (checkPathwayData(data)) - return PathwayRequestResult.getByMode(PathwayRequestMode.ALREADY_USED); - if (data.isEmpty()) + final PathwayRequestResult result = SignalBoxUtil.requestPathway(this, p1, p2, type); + if (!result.wasSuccesfull()) { + if (result.getMode().equals(PathwayRequestMode.PASS)) return PathwayRequestResult.getByMode(PathwayRequestMode.NO_PATH); - addPathway(data); return result; - } catch (final Exception e) { - OpenSignalsMain.getLogger().error("There was an issue with creating a pathway from " - + p1 + " to " + p2 + "! Resetting!"); - e.printStackTrace(); - resetPathway(p1); } - return PathwayRequestResult.getByMode(PathwayRequestMode.NO_PATH); + final PathwayData data = result.getPathwayData(); + if (checkPathwayData(data)) + return PathwayRequestResult.getByMode(PathwayRequestMode.ALREADY_USED); + if (data.isEmpty()) + return PathwayRequestResult.getByMode(PathwayRequestMode.NO_PATH); + addPathway(data); + return result; } private boolean checkPathwayData(final PathwayData data) { @@ -241,16 +233,8 @@ public void updateInput(final RedstoneUpdatePacket update) { private void tryBlock(final List pathways, final BlockPos pos) { pathways.forEach(pathway -> { - try { - if (pathway.tryBlock(pos)) { - updatePrevious(pathway); - } - } catch (final Exception e) { - OpenSignalsMain.getLogger().error( - "There was an issue while trying to block " + pathway + "! Resetting!"); - e.printStackTrace(); - resetPathway(pathway); - tryNextPathways(); + if (pathway.tryBlock(pos)) { + updatePrevious(pathway); } }); @@ -258,27 +242,20 @@ private void tryBlock(final List pathways, final BlockPos pos) private void tryReset(final List pathways, final BlockPos pos) { pathways.forEach(pathway -> { - try { - final Point first = pathway.getFirstPoint(); - final Optional optPoint = pathway.tryReset(pos); - if (optPoint.isPresent()) { - if (pathway.isEmptyOrBroken()) { - resetPathway(pathway); - pathway.checkReRequest(); - } else { - pathway.compact(optPoint.get()); - this.startsToPath.remove(first); - this.startsToPath.put(pathway.getFirstPoint(), pathway); - } - } - if (pathway.checkResetOfProtectionWay(pos)) { - pathway.removeProtectionWay(); + final Point first = pathway.getFirstPoint(); + final Optional optPoint = pathway.tryReset(pos); + if (optPoint.isPresent()) { + if (pathway.isEmptyOrBroken()) { + resetPathway(pathway); + pathway.checkReRequest(); + } else { + pathway.compact(optPoint.get()); + this.startsToPath.remove(first); + this.startsToPath.put(pathway.getFirstPoint(), pathway); } - } catch (final Exception e) { - OpenSignalsMain.getLogger().error( - "There was an issue while trying to reset " + pathway + "! Resetting!"); - e.printStackTrace(); - resetPathway(pathway); + } + if (pathway.checkResetOfProtectionWay(pos)) { + pathway.removeProtectionWay(); } }); tryNextPathways(); diff --git a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxPathway.java b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxPathway.java index 192b95d19..f3fb38b88 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxPathway.java +++ b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxPathway.java @@ -453,7 +453,10 @@ private boolean tryReversReset(final BlockPos pos, final SignalBoxNode node, } private boolean isPowerd(final BlockPos pos) { - final IBlockState state = tile.getWorld().getBlockState(pos); + final Level world = tile.getLevel(); + if (world == null) + return false; + final BlockState state = world.getBlockState(pos); if (state == null || !(state.getBlock() instanceof RedstoneIO)) return false; return state.getValue(RedstoneIO.POWER); From a7824049fb90fa117e9690cb149b94c07e057cb5 Mon Sep 17 00:00:00 2001 From: Cedric Date: Thu, 5 Feb 2026 23:50:03 +0100 Subject: [PATCH 26/61] ref: added null check --- .../com/troblecodings/signals/signalbox/SignalBoxUtil.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxUtil.java b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxUtil.java index 43d999cdd..f3637fae3 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxUtil.java +++ b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxUtil.java @@ -286,7 +286,9 @@ public static boolean isPathBlocked(final SignalBoxGrid grid, final SignalBoxNod } private static boolean isPowerd(final SignalBoxTileEntity tile, final BlockPos pos) { - final World world = tile.getWorld(); + if (tile == null) + return false; + final Level world = tile.getLevel(); if (world == null) { OpenSignalsMain.getLogger() .error("The world is null when trying to load a blockstate to create a pathway!" From 4462fc70771c90d24f599375b0d0a656fab4203c Mon Sep 17 00:00:00 2001 From: Cedric Date: Fri, 6 Feb 2026 00:02:40 +0100 Subject: [PATCH 27/61] ref: better code performance ContainerPlacementtool --- .../signals/guis/ContainerPlacementtool.java | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/guis/ContainerPlacementtool.java b/src/main/java/com/troblecodings/signals/guis/ContainerPlacementtool.java index 5ca658502..c8ec3df71 100644 --- a/src/main/java/com/troblecodings/signals/guis/ContainerPlacementtool.java +++ b/src/main/java/com/troblecodings/signals/guis/ContainerPlacementtool.java @@ -43,20 +43,24 @@ private void sendItemProperties(final EntityPlayer player) { final NBTWrapper wrapper = NBTWrapper.getOrCreateWrapper(stack); final int signalID = wrapper.getInteger(Placementtool.BLOCK_TYPE_ID); signal = tool.getObjFromID(signalID); - final List properites = signal.getProperties(); + final List properties = signal.getProperties().stream() + .filter(property -> wrapper.contains(property.getName())).toList(); + final WriteBuffer buffer = new WriteBuffer(); final List propertiesToSend = new ArrayList<>(); - for (int i = 0; i < properites.size(); i++) { - final SEProperty property = properites.get(i); + for (int i = 0; i < properties.size(); i++) { + final SEProperty property = properties.get(i); if (wrapper.contains(property.getName())) { propertiesToSend.add((byte) i); final String value = wrapper.getString(property.getName()); propertiesToSend.add((byte) property.getParent().getIDFromValue(value)); } } - final WriteBuffer buffer = new WriteBuffer(); buffer.putInt(signalID); - buffer.putByte((byte) propertiesToSend.size()); - propertiesToSend.forEach(buffer::putByte); + buffer.putList(properties, (buf, prop) -> { + buffer.putByte((byte) signal.getIDFromProperty(prop)); + final String value = wrapper.getString(prop.getName()); + buffer.putByte((byte) prop.getParent().getIDFromValue(value)); + }); final String signalName = wrapper.getString(SIGNAL_NAME); buffer.putString(signalName); OpenSignalsMain.network.sendTo(player, buffer); @@ -94,16 +98,16 @@ public void deserializeServer(final ReadBuffer buffer) { @Override public void deserializeClient(final ReadBuffer buffer) { signalID = buffer.getInt(); - final int size = buffer.getByteToUnsignedInt(); - final Placementtool tool = (Placementtool) info.player.getHeldItemMainhand().getItem(); + final Placementtool tool = (Placementtool) info.player.getMainHandItem().getItem(); final Signal signal = tool.getObjFromID(signalID); final List signalProperties = signal.getProperties(); properties.clear(); - for (int i = 0; i < size / 2; i++) { - final SEProperty property = signalProperties.get(buffer.getByteToUnsignedInt()); - final int value = buffer.getByteToUnsignedInt(); - properties.put(property, value); - } + buffer.getList(buf -> { + final SEProperty prop = signalProperties.get(buf.getByteToUnsignedInt()); + final int value = buf.getByteToUnsignedInt(); + properties.put(prop, value); + return prop; + }); signalName = buffer.getString(); signalProperties.forEach(property -> { if (!properties.containsKey(property)) { From acb07f7544763c6ce29f60d3cdaab1d8163bb0bc Mon Sep 17 00:00:00 2001 From: Cedric Date: Mon, 9 Feb 2026 13:19:38 +0100 Subject: [PATCH 28/61] ref: removed unnesissary data save --- .../java/com/troblecodings/signals/signalbox/SignalBoxGrid.java | 2 +- .../java/com/troblecodings/signals/signalbox/SignalBoxNode.java | 2 -- .../troblecodings/signals/signalbox/entrys/PathOptionEntry.java | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java index ad89c373d..96fe1a7cd 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java +++ b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java @@ -335,7 +335,7 @@ public void write(final NBTWrapper tag) { public void writePathways(final NBTWrapper tag) { if (!startsToPath.isEmpty()) { tag.putList(PATHWAY_LIST, startsToPath.values().stream() - .filter(pw -> !pw.isEmptyOrBroken()).map(pathway -> { + .filter(SignalBoxPathway::isEmptyOrBroken).map(pathway -> { final NBTWrapper path = new NBTWrapper(); pathway.write(path); return path; diff --git a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxNode.java b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxNode.java index b4d832c14..b11cc0f7f 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxNode.java +++ b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxNode.java @@ -260,8 +260,6 @@ public void write(final NBTWrapper compound) { entry.getValue().write(wrapper); if (manuellEnabledOutputs.contains(entry.getKey())) { wrapper.putBoolean(ENABLED_OUTPUTS, true); - } else { - wrapper.putBoolean(ENABLED_OUTPUTS, false); } final SignalState state = signalStates.getOrDefault(entry.getKey(), SignalState.RED); if (!state.equals(SignalState.RED)) { diff --git a/src/main/java/com/troblecodings/signals/signalbox/entrys/PathOptionEntry.java b/src/main/java/com/troblecodings/signals/signalbox/entrys/PathOptionEntry.java index 914ff4f05..fbe1f644c 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/entrys/PathOptionEntry.java +++ b/src/main/java/com/troblecodings/signals/signalbox/entrys/PathOptionEntry.java @@ -90,7 +90,7 @@ public String toString() { @Override public void write(final NBTWrapper tag) { pathEntrys.entrySet().stream().filter( - entry -> !entry.getValue().getValue().equals(entry.getValue().getDefaultValue())) + entry -> !entry.getValue().getDefaultValue().equals(entry.getValue().getValue())) .forEach(entry -> { final NBTWrapper entryWrapper = new NBTWrapper(); entry.getValue().write(entryWrapper); From 91ce9635dbe3ba9dbc74535d52b9a0511fe91d46 Mon Sep 17 00:00:00 2001 From: Cedric Date: Mon, 9 Feb 2026 13:20:41 +0100 Subject: [PATCH 29/61] fix: problems with not saveing pws --- .../java/com/troblecodings/signals/signalbox/SignalBoxGrid.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java index 96fe1a7cd..ad89c373d 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java +++ b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java @@ -335,7 +335,7 @@ public void write(final NBTWrapper tag) { public void writePathways(final NBTWrapper tag) { if (!startsToPath.isEmpty()) { tag.putList(PATHWAY_LIST, startsToPath.values().stream() - .filter(SignalBoxPathway::isEmptyOrBroken).map(pathway -> { + .filter(pw -> !pw.isEmptyOrBroken()).map(pathway -> { final NBTWrapper path = new NBTWrapper(); pathway.write(path); return path; From ffb8be2f57925a3245eb6c2a22d4bf16d4d84e5f Mon Sep 17 00:00:00 2001 From: Cedric Date: Tue, 10 Feb 2026 10:27:09 +0100 Subject: [PATCH 30/61] fix: version specific issues --- .../animation/SignalAnimationHandler.java | 4 +- .../troblecodings/signals/blocks/Signal.java | 17 ++--- .../signals/blocks/SignalBox.java | 17 +---- .../signals/guis/ContainerPlacementtool.java | 6 +- .../signals/guis/ContainerSignalBox.java | 37 +++++----- .../signals/guis/GuiSignalBox.java | 6 +- .../signals/guis/GuiSignalBridge.java | 27 ++++--- .../handler/ClientSignalStateHandler.java | 2 +- .../signals/handler/SignalStateHandler.java | 25 +++++-- .../network/SignalBoxNetworkHandler.java | 7 +- .../signalbox/InterSignalBoxPathway.java | 48 ++++++------- .../signals/signalbox/PathwayData.java | 70 ++++++++++--------- .../signals/signalbox/SignalBoxGrid.java | 13 +--- .../signals/signalbox/SignalBoxPathway.java | 14 ++-- .../signals/signalbox/SignalBoxUtil.java | 2 +- .../signalbox/debug/DebugNetworkHandler.java | 13 ++-- .../signalbox/entrys/BlockposEntry.java | 2 +- .../signals/tileentitys/SignalTileEntity.java | 13 ++-- .../signals/test/NameFileTestV2.java | 3 +- .../signals/test/SignalBoxNetworkTest.java | 12 ++-- .../signals/test/StateFileTestV2.java | 2 +- 21 files changed, 171 insertions(+), 169 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/animation/SignalAnimationHandler.java b/src/main/java/com/troblecodings/signals/animation/SignalAnimationHandler.java index 071240b08..0a2902bcc 100644 --- a/src/main/java/com/troblecodings/signals/animation/SignalAnimationHandler.java +++ b/src/main/java/com/troblecodings/signals/animation/SignalAnimationHandler.java @@ -170,8 +170,8 @@ public void updateAnimationListFromBlock() { map.forEach((entry, animations) -> { final IBakedModel model = SignalCustomModel.getModelFromLocation( new ResourceLocation(OpenSignalsMain.MODID, entry.getKey())); - final ModelTranslation translation = new ModelTranslation(VectorWrapper.ZERO, - QuaternionWrapper.ONE); + final ModelTranslation translation = + new ModelTranslation(VectorWrapper.ZERO, QuaternionWrapper.ONE); translation.setModelTranslation(entry.getValue().copy()); final BufferBuilder buffer = getBufferFromModel(model, entry.getValue().copy()); animationPerModel.put(Maps.immutableEntry(model, buffer), diff --git a/src/main/java/com/troblecodings/signals/blocks/Signal.java b/src/main/java/com/troblecodings/signals/blocks/Signal.java index bc7329589..de9da0c69 100644 --- a/src/main/java/com/troblecodings/signals/blocks/Signal.java +++ b/src/main/java/com/troblecodings/signals/blocks/Signal.java @@ -22,6 +22,7 @@ import com.troblecodings.signals.core.StateInfo; import com.troblecodings.signals.core.TileEntitySupplierWrapper; import com.troblecodings.signals.enums.ChangeableStage; +import com.troblecodings.signals.enums.ChangedState; import com.troblecodings.signals.handler.ClientSignalStateHandler; import com.troblecodings.signals.handler.NameHandler; import com.troblecodings.signals.handler.SignalBoxHandler; @@ -72,8 +73,8 @@ public class Signal extends BasicBlock { public static final Map SIGNALS = new HashMap<>(); public static final Map SIGNAL_IDS = new HashMap<>(); - public static final EnumProperty ANGEL = - EnumProperty.create("angel", SignalAngel.class); + public static final PropertyEnum ANGEL = + PropertyEnum.create("angel", SignalAngel.class); public static final SEProperty CUSTOMNAME = new SEProperty("customname", JsonEnum.BOOLEAN, "false", ChangeableStage.AUTOMATICSTAGE, t -> true, 0); public static final TileEntitySupplierWrapper SUPPLIER = SignalTileEntity::new; @@ -83,7 +84,7 @@ public class Signal extends BasicBlock { private List signalProperties; private final Map signalPropertiesToInt = new HashMap<>(); - public Signal(final SignalProperties prop) { + public Signal(final SignalProperties prop, final String name) { super(Material.ROCK); this.prop = prop; this.id = name.hashCode(); @@ -92,7 +93,7 @@ public Signal(final SignalProperties prop) { + name + "]! Need to choose an other name!"); } SIGNAL_IDS.put(this.id, this); - registerDefaultState(defaultBlockState().setValue(ANGEL, SignalAngel.ANGEL0)); + this.setDefaultState(getDefaultState().withProperty(ANGEL, SignalAngel.ANGEL0)); prop.placementtool.addSignal(this); for (int i = 0; i < signalProperties.size(); i++) { final SEProperty property = signalProperties.get(i); @@ -267,7 +268,7 @@ public void breakBlock(final World worldIn, final BlockPos pos, final IBlockStat }, block -> block instanceof GhostBlock); if (!worldIn.isRemote) { final SignalStateInfo info = new SignalStateInfo(worldIn, pos, this); - SignalStateHandler.sendRemoved(info); + SignalStateHandler.sendRemoved(info, ChangedState.REMOVED_FROM_FILE); NameHandler.sendRemoved(new StateInfo(worldIn, pos)); new Thread(() -> { SignalStateHandler.setRemoved(new SignalStateInfo(worldIn, pos, this)); @@ -505,11 +506,11 @@ public void getUpdate(final World world, final BlockPos pos) { return; if (sound.duration == 1) { - world.playSound(null, pos, sound.state, SoundSource.BLOCKS, 1.0F, 1.0F); - } else if (world.getBlockTicks().hasScheduledTick(pos, this)) + world.playSound(null, pos, sound.state, SoundCategory.BLOCKS, 1.0F, 1.0F); + } else if (world.isUpdateScheduled(pos, this)) return; else if (sound.predicate.test(properties)) { - world.scheduleTick(pos, this, 1); + world.scheduleUpdate(pos, this, 1); } }); } diff --git a/src/main/java/com/troblecodings/signals/blocks/SignalBox.java b/src/main/java/com/troblecodings/signals/blocks/SignalBox.java index df431b888..a376ce3b9 100644 --- a/src/main/java/com/troblecodings/signals/blocks/SignalBox.java +++ b/src/main/java/com/troblecodings/signals/blocks/SignalBox.java @@ -67,23 +67,12 @@ public void onBlockPlacedBy(final World worldIn, final BlockPos pos, final IBloc SignalBoxHandler.relinkAllRedstoneIOs(new StateInfo(worldIn, pos)); } - @Override - public void playerWillDestroy(final Level world, final BlockPos pos, final BlockState state, - final Player player) { - if (!world.isClientSide) { - final SignalBoxTileEntity tile = (SignalBoxTileEntity) world.getBlockEntity(pos); - tile.unlink(); - tile.getSignalBoxGrid().resetAllPathways(); - SignalBoxHandler.removeSignalBox(new StateInfo(world, pos)); - SignalBoxHandler.onPosRemove(new StateInfo(world, pos)); - } - super.playerWillDestroy(world, pos, state, player); - } - @Override public void breakBlock(final World worldIn, final BlockPos pos, final IBlockState state) { if (!worldIn.isRemote) { - ((SignalBoxTileEntity) worldIn.getTileEntity(pos)).unlink(); + final SignalBoxTileEntity tile = (SignalBoxTileEntity) worldIn.getTileEntity(pos); + tile.unlink(); + tile.getSignalBoxGrid().resetAllPathways(); SignalBoxHandler.removeSignalBox(new StateInfo(worldIn, pos)); SignalBoxHandler.onPosRemove(new StateInfo(worldIn, pos)); } diff --git a/src/main/java/com/troblecodings/signals/guis/ContainerPlacementtool.java b/src/main/java/com/troblecodings/signals/guis/ContainerPlacementtool.java index c8ec3df71..dd7496a7d 100644 --- a/src/main/java/com/troblecodings/signals/guis/ContainerPlacementtool.java +++ b/src/main/java/com/troblecodings/signals/guis/ContainerPlacementtool.java @@ -4,6 +4,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import com.troblecodings.core.NBTWrapper; import com.troblecodings.core.ReadBuffer; @@ -44,7 +45,8 @@ private void sendItemProperties(final EntityPlayer player) { final int signalID = wrapper.getInteger(Placementtool.BLOCK_TYPE_ID); signal = tool.getObjFromID(signalID); final List properties = signal.getProperties().stream() - .filter(property -> wrapper.contains(property.getName())).toList(); + .filter(property -> wrapper.contains(property.getName())) + .collect(Collectors.toList()); final WriteBuffer buffer = new WriteBuffer(); final List propertiesToSend = new ArrayList<>(); for (int i = 0; i < properties.size(); i++) { @@ -98,7 +100,7 @@ public void deserializeServer(final ReadBuffer buffer) { @Override public void deserializeClient(final ReadBuffer buffer) { signalID = buffer.getInt(); - final Placementtool tool = (Placementtool) info.player.getMainHandItem().getItem(); + final Placementtool tool = (Placementtool) info.player.getHeldItemMainhand().getItem(); final Signal signal = tool.getObjFromID(signalID); final List signalProperties = signal.getProperties(); properties.clear(); diff --git a/src/main/java/com/troblecodings/signals/guis/ContainerSignalBox.java b/src/main/java/com/troblecodings/signals/guis/ContainerSignalBox.java index cca160793..a418f2581 100644 --- a/src/main/java/com/troblecodings/signals/guis/ContainerSignalBox.java +++ b/src/main/java/com/troblecodings/signals/guis/ContainerSignalBox.java @@ -30,6 +30,7 @@ import com.troblecodings.signals.handler.SignalStateInfo; import com.troblecodings.signals.network.SignalBoxNetworkHandler; import com.troblecodings.signals.properties.PredicatedPropertyBase.ConfigProperty; +import com.troblecodings.signals.signalbox.MainSignalIdentifier; import com.troblecodings.signals.signalbox.MainSignalIdentifier.SignalState; import com.troblecodings.signals.signalbox.ModeSet; import com.troblecodings.signals.signalbox.Point; @@ -43,7 +44,6 @@ import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.util.Rotation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -53,11 +53,10 @@ public class ContainerSignalBox extends ContainerBase implements UIClientSync, I public SignalBoxTileEntity tile; protected final Map> greenSignals = new HashMap<>(); protected final Map> possibleSubsidiaries = new HashMap<>(); - protected final Map> enabledSubsidiaryTypes = new HashMap<>(); + protected final Map> enabledSubsidiaryTypes = + new HashMap<>(); protected final Map, PathType> nextPathways = new HashMap<>(); protected final Map> validInConnections = new HashMap<>(); - protected SignalBoxGrid grid; - protected SignalBoxTileEntity tile; private final Map posForType = new HashMap<>(); private SignalBoxNetworkHandler network = new SignalBoxNetworkHandler(); @@ -87,9 +86,7 @@ public void sendAllDataToRemote() { } public void addAdditionalInitialisationData(final WriteBuffer buffer) { - final StateInfo identifier = new StateInfo(info.world, tile.getBlockPos()); - final Map> possibleSubsidiaries = SignalBoxHandler - .getPossibleSubsidiaries(identifier); + final StateInfo identifier = new StateInfo(info.world, tile.getPos()); final Map positions = SignalBoxHandler.getAllLinkedPos(identifier); final Map, PathType> nextPathways = grid.getNextPathways(); buffer.putMap(positions, WriteBuffer.BLOCKPOS_CONSUMER, WriteBuffer.getEnumConsumer()); @@ -125,8 +122,8 @@ public void readAdditionalInitialisationData(final ReadBuffer buffer) { validInConnections.putAll(buffer.getMap(ReadBuffer.BLOCKPOS_FUNCTION, b -> b.getList(ReadBuffer.getINetworkSaveableFunction(Point.class)))); grid.getNodes().forEach(node -> { - final Map subsidiares = new HashMap<>( - node.getSubsidiaryStates()); + final Map subsidiares = + new HashMap<>(node.getSubsidiaryStates()); if (!subsidiares.isEmpty()) { enabledSubsidiaryTypes.put(node.getPoint(), subsidiares); } @@ -149,7 +146,7 @@ public SignalBoxNetworkHandler getNetwork() { public void deserializeClient(final ReadBuffer buffer) { if (tile == null) { final BlockPos pos = buffer.getBlockPos(); - this.tile = (SignalBoxTileEntity) info.world.getBlockEntity(pos); + this.tile = (SignalBoxTileEntity) info.world.getTileEntity(pos); this.grid = tile.getSignalBoxGrid(); initializeNetwork(); return; @@ -163,7 +160,7 @@ public void deserializeServer(final ReadBuffer buffer) { grid = tile.getSignalBoxGrid(); } network.desirializeBuffer(buffer); - tile.setChanged(); + tile.markDirty(); } public void handlePathwayRequestResponse(final PathwayRequestMode result) { @@ -238,8 +235,8 @@ private void loadPossibleSubsidiaires() { protected void updateClientSubsidiary(final SignalBoxNode node, final ModeSet mode, final SubsidiaryState state, final boolean enable) { - final Map map = enabledSubsidiaryTypes - .computeIfAbsent(node.getPoint(), (_u) -> new HashMap<>()); + final Map map = + enabledSubsidiaryTypes.computeIfAbsent(node.getPoint(), (_u) -> new HashMap<>()); if (enable) { map.put(mode, state); node.setSubsidiaryState(mode, state); @@ -256,7 +253,7 @@ public void updateServerSubsidiary(final ModeIdentifier ident, final SubsidiaryS final boolean enable) { if (isClientSide()) return; - final Level world = tile.getLevel(); + final World world = tile.getWorld(); grid.getNodeChecked(ident.point).ifPresent((node) -> { node.getOption(ident.mode) .ifPresent(entry -> entry.getEntry(PathEntryType.SIGNAL).ifPresent(pos -> { @@ -286,12 +283,12 @@ public SignalBoxGrid getGrid() { } public boolean isClientSide() { - return this.info.world.isClientSide; + return this.info.world.isRemote; } @Override - public void removed(final Player playerIn) { - super.removed(playerIn); + public void onContainerClosed(final EntityPlayer playerIn) { + super.onContainerClosed(playerIn); grid.removeNetwork(); network.removeNetwork(); if (this.tile != null) { @@ -301,7 +298,7 @@ public void removed(final Player playerIn) { @Override public EntityPlayer getPlayer() { - return this.player; + return this.info.player; } public Map getPositionForTypes() { @@ -312,8 +309,8 @@ public Map getPositionForTypes() { public boolean canInteractWith(final EntityPlayer playerIn) { if (tile.isBlocked() && !tile.isValid(playerIn)) return false; - if (this.player == null) { - this.player = playerIn; + if (this.info.player == null) { + this.info.player = playerIn; this.tile.add(this); } return true; diff --git a/src/main/java/com/troblecodings/signals/guis/GuiSignalBox.java b/src/main/java/com/troblecodings/signals/guis/GuiSignalBox.java index f0d4bdc2e..9daa3220d 100644 --- a/src/main/java/com/troblecodings/signals/guis/GuiSignalBox.java +++ b/src/main/java/com/troblecodings/signals/guis/GuiSignalBox.java @@ -13,6 +13,7 @@ import java.util.stream.Collectors; import com.troblecodings.core.I18Wrapper; +import com.troblecodings.guilib.ecs.ContainerBase; import com.troblecodings.guilib.ecs.DrawUtil.DisableIntegerable; import com.troblecodings.guilib.ecs.DrawUtil.EnumIntegerable; import com.troblecodings.guilib.ecs.DrawUtil.SizeIntegerables; @@ -50,6 +51,7 @@ import com.troblecodings.signals.guis.UISignalBoxRendering.SelectionType; import com.troblecodings.signals.guis.UISignalBoxRendering.SignalBoxConsumer; import com.troblecodings.signals.handler.ClientNameHandler; +import com.troblecodings.signals.handler.ClientRenderUpdate; import com.troblecodings.signals.network.SignalBoxNetworkHandler; import com.troblecodings.signals.signalbox.MainSignalIdentifier.SignalState; import com.troblecodings.signals.signalbox.ModeSet; @@ -144,8 +146,8 @@ private void updateTrainNumbers(final SignalBoxNode node) { if (!(modeSet.mode == EnumGuiMode.TRAIN_NUMBER)) return; node.getOption(modeSet).ifPresent(option -> { - final TrainNumber number = option.getEntry(PathEntryType.TRAINNUMBER) - .orElse(TrainNumber.DEFAULT); + final TrainNumber number = + option.getEntry(PathEntryType.TRAINNUMBER).orElse(TrainNumber.DEFAULT); final ModeIdentifier modeIdent = new ModeIdentifier(node.getPoint(), modeSet); if (number.trainNumber.isEmpty()) { rendering.removeTrainNumber(modeIdent); diff --git a/src/main/java/com/troblecodings/signals/guis/GuiSignalBridge.java b/src/main/java/com/troblecodings/signals/guis/GuiSignalBridge.java index ae7e9ef97..f20b39f1a 100644 --- a/src/main/java/com/troblecodings/signals/guis/GuiSignalBridge.java +++ b/src/main/java/com/troblecodings/signals/guis/GuiSignalBridge.java @@ -217,9 +217,9 @@ private void buildGrid() { row.add(tile); final SignalBridgeBasicBlock savedBlock = container.builder.getBlockOnPoint(point); if (savedBlock != null) { - final UIEntity blockEntity = - createPreviewForBlock(savedBlock, 15, -1, 0.7f, TILE_WIDTH, TILE_WIDTH, - false, -9.5f, 1.5f, false, SignalBridgeBuilder.EMPTY_WRAPPER); + final UIEntity blockEntity = createPreviewForBlock(savedBlock, 15, -1, 0.7f, + TILE_WIDTH, TILE_WIDTH, false, -9.5f, 1.5f, false, + SignalBridgeRenderData.EMPTY_WRAPPER); tile.add(blockEntity); } if (point.equals(container.builder.getStartPoint())) { @@ -408,9 +408,9 @@ private void buildBridgeList() { addButton.add(new UIToolTip(I18Wrapper.format("gui.signalbridge.plusbutton.desc"))); list.add(addButton); container.allSignals.forEach((name, entry) -> { - final UIEntity blockEntity = - createPreviewForBlock(entry.getKey(), 14, -3.5f, 1.9f, 80, 100, true, 0, 0, - true, name, new ModelInfoWrapper(renderData.getDataForName(name)), 100); + final UIEntity blockEntity = createPreviewForBlock(entry.getKey(), 14, -3.5f, 1.9f, 80, + 100, true, 0, 0, true, name, + new ModelInfoWrapper(entry.getKey(), renderData.getDataForName(name)), 100); blockEntity.add(new UIClickable(e -> { addUISelection(name); currentSignal = name; @@ -554,8 +554,8 @@ private void buildSystemToAddSignal(final String name, final Signal signal, removeUISelection(name); disableRightEntity(); })); - for (final Axis axis : Direction.Axis.values()) { - for (final AxisDirection axisDirection : Direction.AxisDirection.values()) { + for (final Axis axis : EnumFacing.Axis.values()) { + for (final AxisDirection axisDirection : EnumFacing.AxisDirection.values()) { final String buttonName = axis.getName() + (axisDirection == AxisDirection.POSITIVE ? "+" : "-"); final UIEntity button = GuiElements.createButton(buttonName, e -> { @@ -712,10 +712,10 @@ private static UIEntity createPreviewForBlock(final BasicBlock block, final floa blockEntity.setHeight(height); blockEntity.add(new UIColor(GuiSignalBox.BACKGROUND_COLOR)); if (showName) { - final UILabel label = - new UILabel(customName.isEmpty() + final UILabel label = new UILabel( + customName.isEmpty() ? I18Wrapper.format("block." + OpenSignalsMain.MODID + "." - + block.delegate.name().getPath()) + + block.delegate.name().getResourcePath()) : customName); label.setCenterY(false); label.setTextColor(blockEntity.getBasicTextColor()); @@ -731,9 +731,8 @@ private static UIEntity createPreviewForBlock(final BasicBlock block, final floa preview.add(new UIScale(previewScale, previewScale, previewScale)); if (enableRotation) { - preview.add(new UIDrag( - (x, y) -> renderer.updateRotation(Quaternion.fromXYZ(0, (float) x * 0.1f, 0)), - 1)); + preview.add(new UIDrag((x, y) -> renderer + .updateRotation(QuaternionWrapper.fromXYZ(0, (float) x * 0.1f, 0)), 1)); } preview.add(new UIScissor()); diff --git a/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java b/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java index c82a2aff8..ab71710dd 100644 --- a/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java +++ b/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java @@ -71,7 +71,7 @@ public void deserializeClient(final ReadBuffer buffer) { mc.renderGlobal.notifyBlockUpdate(level, signalPos, state, state, 8); final TileEntity tile = level.getTileEntity(signalPos); if (tile != null && tile instanceof SignalTileEntity) { - ((SignalTileEntity) tile).updateAnimationStates(properties, !contains); + ((SignalTileEntity) tile).updateAnimationState(newProperties, changedState); } chunk.markDirty(); }); diff --git a/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java b/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java index d35dd23b3..23a513418 100644 --- a/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java +++ b/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java @@ -263,7 +263,7 @@ public static void setStates(final SignalStateInfo info, final Map { - sendToAll(info, changedProperties); + sendToAll(info, changedProperties, ChangedState.UPDATED); info.world.getMinecraftServer() .addScheduledTask(() -> info.signal.getUpdate(info.world, info.pos)); if (!contains.get()) { @@ -431,12 +431,12 @@ public static void setRemoved(final SignalStateInfo info) { } } - private static void sendRemoved(final SignalStateInfo info, final ChangedState state) { + public static void sendRemoved(final SignalStateInfo info, final ChangedState state) { final WriteBuffer buffer = new WriteBuffer(); buffer.putBlockPos(info.pos); buffer.putInt(info.signal.getID()); buffer.putEnumValue(state); - info.world.players().forEach(player -> sendTo(player, buffer.getBuildedBuffer())); + info.world.playerEntities.forEach(player -> sendTo(player, buffer.getBuildedBuffer())); } public static ByteBuffer packToByteBuffer(final SignalStateInfo stateInfo, @@ -454,7 +454,7 @@ public static ByteBuffer packToByteBuffer(final SignalStateInfo stateInfo, } private static void sendTo(final SignalStateInfo info, final Map properties, - final @Nullable Player player, final ChangedState state) { + final @Nullable EntityPlayer player, final ChangedState state) { if (player == null) { sendToAll(info, properties, state); } else { @@ -463,7 +463,7 @@ private static void sendTo(final SignalStateInfo info, final Map properties, final Player player, + final Map properties, final EntityPlayer player, final ChangedState state) { if (properties == null || properties.isEmpty()) return; @@ -475,7 +475,20 @@ private static void sendToAll(final SignalStateInfo stateInfo, if (properties == null || properties.isEmpty()) return; final ByteBuffer buffer = packToByteBuffer(stateInfo, properties, state); - stateInfo.world.players().forEach(playerEntity -> sendTo(playerEntity, buffer)); + stateInfo.world.playerEntities.forEach(playerEntity -> sendTo(playerEntity, buffer)); + } + + @SubscribeEvent + public static void onEntityJoinWorldEvent(final EntityJoinWorldEvent event) { + final Entity entity = event.getEntity(); + if (!(entity instanceof EntityPlayer)) + return; + final Map> properties; + synchronized (CURRENTLY_LOADED_STATES) { + properties = ImmutableMap.copyOf(CURRENTLY_LOADED_STATES); + } + properties.forEach( + (info, map) -> sendTo(info, map, (EntityPlayer) entity, ChangedState.UPDATED)); } @SubscribeEvent diff --git a/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkHandler.java b/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkHandler.java index 4bfc71359..67565931b 100644 --- a/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkHandler.java +++ b/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkHandler.java @@ -24,7 +24,7 @@ import com.troblecodings.signals.signalbox.entrys.PathEntryType; import com.troblecodings.signals.signalbox.entrys.PathOptionEntry; -import net.minecraft.core.BlockPos; +import net.minecraft.util.math.BlockPos; public class SignalBoxNetworkHandler { @@ -285,8 +285,9 @@ protected void readForGrid(final ReadBuffer buffer) { container.handleCounterUpdate(); } else { final BlockPos pos = buffer.getBlockPos(); - SignalBoxHandler.unlinkPosFromSignalBox(new StateInfo(container.getTile().getLevel(), - container.getTile().getBlockPos()), pos); + SignalBoxHandler.unlinkPosFromSignalBox( + new StateInfo(container.getTile().getWorld(), container.getTile().getPos()), + pos); } } diff --git a/src/main/java/com/troblecodings/signals/signalbox/InterSignalBoxPathway.java b/src/main/java/com/troblecodings/signals/signalbox/InterSignalBoxPathway.java index dc0b3e916..4f7393f87 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/InterSignalBoxPathway.java +++ b/src/main/java/com/troblecodings/signals/signalbox/InterSignalBoxPathway.java @@ -112,11 +112,10 @@ public void onLoad() { } if (otherGrid.get() != null) { - final SignalBoxPathway otherPathway = otherGrid.get() - .getPathwayByLastPoint(blockPW.getValue()); - if (!(otherPathway instanceof InterSignalBoxPathway)) { + final SignalBoxPathway otherPathway = + otherGrid.get().getPathwayByLastPoint(blockPW.getValue()); + if (!(otherPathway instanceof InterSignalBoxPathway)) return; - } pathwayToBlock = (InterSignalBoxPathway) otherPathway; blockPW = null; } @@ -130,11 +129,10 @@ public void onLoad() { } if (otherGrid.get() != null) { - final SignalBoxPathway otherPathway = otherGrid.get() - .getPathwayByLastPoint(resetPW.getValue()); - if (!(otherPathway instanceof InterSignalBoxPathway)) { + final SignalBoxPathway otherPathway = + otherGrid.get().getPathwayByLastPoint(resetPW.getValue()); + if (!(otherPathway instanceof InterSignalBoxPathway)) return; - } pathwayToReset = (InterSignalBoxPathway) otherPathway; resetPW = null; } @@ -147,12 +145,12 @@ protected SignalStateInfo getLastSignalInfo() { if (pathwayToBlock != null) { final MainSignalIdentifier otherLastSignal = pathwayToBlock.data.getEndSignal(); if (otherLastSignal != null) { - final Signal nextSignal = SignalBoxHandler - .getSignal(new StateInfo(pathwayToBlock.tile.getLevel(), - pathwayToBlock.tile.getBlockPos()), otherLastSignal.pos); + final Signal nextSignal = SignalBoxHandler.getSignal( + new StateInfo(pathwayToBlock.tile.getWorld(), pathwayToBlock.tile.getPos()), + otherLastSignal.pos); if (nextSignal != null) { - lastSignalInfo = new SignalStateInfo(tile.getLevel(), otherLastSignal.pos, - nextSignal); + lastSignalInfo = + new SignalStateInfo(tile.getWorld(), otherLastSignal.pos, nextSignal); } } } @@ -182,9 +180,8 @@ public void compact(final Point point) { final SignalBoxGrid otherGrid = tile.getSignalBoxGrid(); pathwayToBlock = (InterSignalBoxPathway) otherGrid .getPathwayByLastPoint(pathwayToBlock.getLastPoint()); - if (pathwayToBlock == null) { + if (pathwayToBlock == null) return; - } pathwayToBlock.setOtherPathwayToReset(this); }); } @@ -196,11 +193,10 @@ public void resetPathway(final Point point) { if (data.totalPathwayReset(point) && pathwayToReset != null) { pathwayToReset.loadTileAndExecute(tile -> { final SignalBoxGrid otherGrid = tile.getSignalBoxGrid(); - final SignalBoxPathway pw = otherGrid - .getPathwayByLastPoint(pathwayToReset.getLastPoint()); - if (pw == null) { + final SignalBoxPathway pw = + otherGrid.getPathwayByLastPoint(pathwayToReset.getLastPoint()); + if (pw == null) return; - } otherGrid.resetPathway(pw.getFirstPoint()); }); } @@ -212,8 +208,8 @@ public boolean tryBlock(final BlockPos position) { if (result && pathwayToBlock != null) { pathwayToBlock.loadTileAndExecute(otherTile -> { final SignalBoxGrid otherGrid = otherTile.getSignalBoxGrid(); - final SignalBoxPathway pw = otherGrid - .getPathwayByLastPoint(pathwayToBlock.getLastPoint()); + final SignalBoxPathway pw = + otherGrid.getPathwayByLastPoint(pathwayToBlock.getLastPoint()); if (pw == null || !(pw instanceof InterSignalBoxPathway)) { pathwayToBlock = null; } @@ -237,8 +233,8 @@ protected void updateSignalStates() { signalIdent.updateSignalState(SignalState.GREEN); }); } - final Map distantSignalPositions = data - .getOtherSignals(); + final Map distantSignalPositions = + data.getOtherSignals(); distantSignalPositions.forEach((holder, position) -> { if (holder.shouldTurnSignalOff()) { position.updateSignalState(SignalState.OFF); @@ -272,16 +268,14 @@ protected void updateSignalStates() { } public void setOtherPathwayToBlock(final InterSignalBoxPathway pathway) { - if (!(pathway instanceof InterSignalBoxPathway)) { + if (!(pathway instanceof InterSignalBoxPathway)) return; - } this.pathwayToBlock = pathway; } public void setOtherPathwayToReset(final InterSignalBoxPathway pathway) { - if (!(pathway instanceof InterSignalBoxPathway)) { + if (!(pathway instanceof InterSignalBoxPathway)) return; - } this.pathwayToReset = pathway; } diff --git a/src/main/java/com/troblecodings/signals/signalbox/PathwayData.java b/src/main/java/com/troblecodings/signals/signalbox/PathwayData.java index 60c96afb3..a16bdd220 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/PathwayData.java +++ b/src/main/java/com/troblecodings/signals/signalbox/PathwayData.java @@ -147,8 +147,8 @@ private boolean checkForShuntingPath() { if (option == null) { continue; } - final EnumPathUsage usage = option.getEntry(PathEntryType.PATHUSAGE) - .orElse(EnumPathUsage.FREE); + final EnumPathUsage usage = + option.getEntry(PathEntryType.PATHUSAGE).orElse(EnumPathUsage.FREE); if (!(usage.equals(EnumPathUsage.FREE) || usage.equals(EnumPathUsage.PROTECTED))) { final ArrayList listOfNodes = new ArrayList<>(); for (Point point = previous; point != null; point = newNodes.get(point)) { @@ -174,8 +174,8 @@ private boolean checkForProtectionWay() { .getOption(signalIdent.getModeSet()).orElse(null); if ((option == null) || grid.startsToPath.containsKey(lastPoint)) return true; - final Point protectionWayEnd = option.getEntry(PathEntryType.PROTECTIONWAY_END) - .orElse(lastPoint); + final Point protectionWayEnd = + option.getEntry(PathEntryType.PROTECTIONWAY_END).orElse(lastPoint); if (lastPoint.equals(protectionWayEnd)) return true; this.protectionWayNodes = ImmutableList @@ -220,12 +220,16 @@ protected boolean resetProtectionWay() { Thread.sleep(protectionWayResetDelay * 1000); } catch (final InterruptedException e) { } - this.protectionWayNodes = copy; - directResetOfProtectionWay(); - final Level world = pathway.tile.getLevel(); - world.getServer().execute(() -> { - removeProtectionWay(); - }); + final World world = pathway.tile.getWorld(); + world.getMinecraftServer() + .addScheduledTask(() -> pathway.loadTileAndExecute(tile -> { + final SignalBoxGrid grid = tile.getSignalBoxGrid(); + final SignalBoxPathway pw = grid.getPathwayByLastPoint(getLastPoint()); + if (pw == null) + return; + pw.directResetOfProtectionWay(); + pw.removeProtectionWay(); + })); }).start(); return true; } @@ -297,16 +301,16 @@ private void initalize() { } }); }); - final Rotation rotation = SignalBoxUtil - .getRotationFromDelta(node.getPoint().delta(path.point1)); + final Rotation rotation = + SignalBoxUtil.getRotationFromDelta(node.getPoint().delta(path.point1)); for (final EnumGuiMode mode : Arrays.asList(EnumGuiMode.VP, EnumGuiMode.RS, EnumGuiMode.HP, EnumGuiMode.ZS3)) { final ModeSet modeSet = new ModeSet(mode, rotation); node.getOption(modeSet).ifPresent(option -> { // TODO Why is this not present? option.getEntry(PathEntryType.SIGNAL).ifPresent(position -> { - final Optional repeaterOption = option - .getEntry(PathEntryType.SIGNAL_REPEATER); + final Optional repeaterOption = + option.getEntry(PathEntryType.SIGNAL_REPEATER); final OtherSignalIdentifier ident = new OtherSignalIdentifier( node.getPoint(), modeSet, position, repeaterOption.isPresent() && repeaterOption.get(), mode, grid); @@ -341,27 +345,27 @@ private void initalize() { this.listOfNodes.get(this.listOfNodes.size() - 2), Rotation.NONE); final SignalBoxNode lastNode = this.listOfNodes.get(0); this.lastPoint = lastNode.getPoint(); - final MainSignalIdentifier lastPos = makeFromNext(type, lastNode, this.listOfNodes.get(1), - Rotation.CLOCKWISE_180); + final MainSignalIdentifier lastPos = + makeFromNext(type, lastNode, this.listOfNodes.get(1), Rotation.CLOCKWISE_180); if (lastPos != null) { endSignal = Optional.of(lastPos); - final PathOptionEntry option = grid.getNode(lastPos.getPoint()) - .getOption(lastPos.getModeSet()).orElse(null); - this.protectionWayReset = option.getEntry(PathEntryType.PROTECTIONWAY_RESET) - .orElse(null); + final PathOptionEntry option = + grid.getNode(lastPos.getPoint()).getOption(lastPos.getModeSet()).orElse(null); + this.protectionWayReset = + option.getEntry(PathEntryType.PROTECTIONWAY_RESET).orElse(null); this.protectionWayResetDelay = option.getEntry(PathEntryType.DELAY).orElse(0); } if (firstPos != null) { startSignal = Optional.of(firstPos); - final PathOptionEntry entry = grid.getNode(firstPos.getPoint()) - .getOption(firstPos.getModeSet()).orElse(null); - final List posIdents = entry.getEntry(PathEntryType.PRESIGNALS) - .orElse(new ArrayList<>()); + final PathOptionEntry entry = + grid.getNode(firstPos.getPoint()).getOption(firstPos.getModeSet()).orElse(null); + final List posIdents = + entry.getEntry(PathEntryType.PRESIGNALS).orElse(new ArrayList<>()); posIdents.removeIf(ident -> !grid.getNode(ident.getPoint()).has(ident.getModeSet())); this.preSignals = ImmutableList.copyOf(posIdents.stream().map(ident -> { - final PathOptionEntry vpEntry = grid.getNode(ident.getPoint()) - .getOption(ident.getModeSet()) - .orElse(SignalBoxFactory.getFactory().getEntry()); + final PathOptionEntry vpEntry = + grid.getNode(ident.getPoint()).getOption(ident.getModeSet()) + .orElse(SignalBoxFactory.getFactory().getEntry()); return new OtherSignalIdentifier(ident.getPoint(), ident.getModeSet(), ident.pos, vpEntry.getEntry(PathEntryType.SIGNAL_REPEATER).orElse(false), EnumGuiMode.VP, grid); @@ -460,8 +464,8 @@ public void read(final NBTWrapper tag) { } private List getNodesFromNBT(final NBTWrapper tag, final String keyNBT) { - final com.google.common.collect.ImmutableList.Builder nodeBuilder = ImmutableList - .builder(); + final com.google.common.collect.ImmutableList.Builder nodeBuilder = + ImmutableList.builder(); tag.getList(keyNBT).forEach(nodeNBT -> { final SignalBoxNode node = getNodeFromNBT(nodeNBT); if (node == null) @@ -564,8 +568,8 @@ private PathwayData requestInterSignalBoxPathway(final SignalBoxGrid grid) { final SignalBoxNode endNode = listOfNodes.get(0); PathOptionEntry outConnectionEntry = null; for (final Rotation rot : Rotation.values()) { - final Optional entry = endNode - .getOption(new ModeSet(EnumGuiMode.OUT_CONNECTION, rot)); + final Optional entry = + endNode.getOption(new ModeSet(EnumGuiMode.OUT_CONNECTION, rot)); if (entry.isPresent()) { outConnectionEntry = entry.get(); break; @@ -594,8 +598,8 @@ private PathwayData requestInterSignalBoxPathway(final SignalBoxGrid grid) { } if (inConnectionEntry == null) return; - final Optional otherEndPoint = inConnectionEntry - .getEntry(PathEntryType.POINT); + final Optional otherEndPoint = + inConnectionEntry.getEntry(PathEntryType.POINT); if (!otherEndPoint.isPresent()) return; final PathwayRequestResult endRequeset = SignalBoxUtil.requestPathway(endGrid, diff --git a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java index ad89c373d..8a632b229 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java +++ b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java @@ -272,16 +272,7 @@ private void tryNextPathways() { requestWay(pointEntry.getKey(), pointEntry.getValue(), type); if (request.wasSuccesfull()) { nextPathways.remove(pointEntry); - if (tile != null && tile.isBlocked()) { - final WriteBuffer buffer = new WriteBuffer(); - buffer.putEnumValue(SignalBoxNetwork.REMOVE_SAVEDPW); - pointEntry.getKey().writeNetwork(buffer); - pointEntry.getValue().writeNetwork(buffer); - OpenSignalsMain.network.sendTo(tile.get(0).getPlayer(), buffer); - } - network.sendRemoveSavedPathway(entry.getKey(), entry.getValue()); - toRemove.put(entry, type); - return; + network.sendRemoveSavedPathway(pointEntry.getKey(), pointEntry.getValue()); } }); executingTryNextPWs = false; @@ -498,7 +489,7 @@ public void updateManuellRSOutput(final Point point, final ModeSet mode, final b if (!outputPos.isPresent() || !usage.equals(EnumPathUsage.FREE)) return; node.handleManuellEnabledOutputUpdate(mode, state); - SignalBoxHandler.updateRedstoneOutput(new StateInfo(tile.getLevel(), outputPos.get()), + SignalBoxHandler.updateRedstoneOutput(new StateInfo(tile.getWorld(), outputPos.get()), state); } diff --git a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxPathway.java b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxPathway.java index f3fb38b88..51ba9acb8 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxPathway.java +++ b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxPathway.java @@ -189,8 +189,8 @@ protected void setSignals(final SignalStateInfo lastSignal) { if (isExecutingSignalSet || tile == null) return; isExecutingSignalSet = true; - final Level world = tile.getLevel(); - final StateInfo identifier = new StateInfo(world, tile.getBlockPos()); + final World world = tile.getWorld(); + final StateInfo identifier = new StateInfo(world, tile.getPos()); final MainSignalIdentifier startSignal = data.getStartSignal(); if (startSignal != null) { if (isBlocked) @@ -231,8 +231,8 @@ private void updatePreSignals() { final Signal first = SignalBoxHandler.getSignal(identifier, startSignal.pos); if (first == null) return; - final SignalStateInfo firstInfo = new SignalStateInfo(tile.getWorld(), startSignal.pos, - first); + final SignalStateInfo firstInfo = + new SignalStateInfo(tile.getWorld(), startSignal.pos, first); data.getPreSignals().forEach(posIdent -> { final Signal current = SignalBoxHandler.getSignal(identifier, posIdent.pos); if (current == null) @@ -303,7 +303,7 @@ public void resetAllSignals() { private void resetFirstSignal() { final MainSignalIdentifier startSignal = data.getStartSignal(); if (startSignal != null) { - final StateInfo stateInfo = new StateInfo(tile.getLevel(), tile.getBlockPos()); + final StateInfo stateInfo = new StateInfo(tile.getWorld(), tile.getPos()); final Signal current = SignalBoxHandler.getSignal(stateInfo, startSignal.pos); if (current == null) return; @@ -453,10 +453,10 @@ private boolean tryReversReset(final BlockPos pos, final SignalBoxNode node, } private boolean isPowerd(final BlockPos pos) { - final Level world = tile.getLevel(); + final World world = tile.getWorld(); if (world == null) return false; - final BlockState state = world.getBlockState(pos); + final IBlockState state = world.getBlockState(pos); if (state == null || !(state.getBlock() instanceof RedstoneIO)) return false; return state.getValue(RedstoneIO.POWER); diff --git a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxUtil.java b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxUtil.java index f3637fae3..e22078204 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxUtil.java +++ b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxUtil.java @@ -288,7 +288,7 @@ public static boolean isPathBlocked(final SignalBoxGrid grid, final SignalBoxNod private static boolean isPowerd(final SignalBoxTileEntity tile, final BlockPos pos) { if (tile == null) return false; - final Level world = tile.getLevel(); + final World world = tile.getWorld(); if (world == null) { OpenSignalsMain.getLogger() .error("The world is null when trying to load a blockstate to create a pathway!" diff --git a/src/main/java/com/troblecodings/signals/signalbox/debug/DebugNetworkHandler.java b/src/main/java/com/troblecodings/signals/signalbox/debug/DebugNetworkHandler.java index 93d23ca66..362c96090 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/debug/DebugNetworkHandler.java +++ b/src/main/java/com/troblecodings/signals/signalbox/debug/DebugNetworkHandler.java @@ -1,5 +1,7 @@ package com.troblecodings.signals.signalbox.debug; +import java.nio.ByteBuffer; + import com.troblecodings.core.ReadBuffer; import com.troblecodings.core.WriteBuffer; import com.troblecodings.signals.core.ModeIdentifier; @@ -15,7 +17,7 @@ import com.troblecodings.signals.signalbox.entrys.PathOptionEntry; import io.netty.buffer.Unpooled; -import net.minecraft.core.BlockPos; +import net.minecraft.util.math.BlockPos; public class DebugNetworkHandler extends SignalBoxNetworkHandler { @@ -37,8 +39,8 @@ protected SignalBoxGrid getGrid() { @Override protected void sendBuffer(final WriteBuffer buffer) { - desirializeBuffer(new ReadBuffer( - Unpooled.copiedBuffer(buffer.getBuildedBuffer().position(0)).nioBuffer())); + desirializeBuffer(new ReadBuffer(Unpooled + .copiedBuffer((ByteBuffer) buffer.getBuildedBuffer().position(0)).nioBuffer())); } @Override @@ -73,8 +75,9 @@ protected void readForGrid(final ReadBuffer buffer) { grid.setCounterFromNetwork(buffer.getInt()); } else { final BlockPos pos = buffer.getBlockPos(); - SignalBoxHandler.unlinkPosFromSignalBox(new StateInfo(container.getTile().getLevel(), - container.getTile().getBlockPos()), pos); + SignalBoxHandler.unlinkPosFromSignalBox( + new StateInfo(container.getTile().getWorld(), container.getTile().getPos()), + pos); } } diff --git a/src/main/java/com/troblecodings/signals/signalbox/entrys/BlockposEntry.java b/src/main/java/com/troblecodings/signals/signalbox/entrys/BlockposEntry.java index 85cdc18aa..f9fabd140 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/entrys/BlockposEntry.java +++ b/src/main/java/com/troblecodings/signals/signalbox/entrys/BlockposEntry.java @@ -44,7 +44,7 @@ public void setValue(final BlockPos pPosition) { @Override public BlockPos getDefaultValue() { - return BlockPos.ZERO; + return BlockPos.ORIGIN; } @Override diff --git a/src/main/java/com/troblecodings/signals/tileentitys/SignalTileEntity.java b/src/main/java/com/troblecodings/signals/tileentitys/SignalTileEntity.java index ef7c5d053..6fab8f073 100644 --- a/src/main/java/com/troblecodings/signals/tileentitys/SignalTileEntity.java +++ b/src/main/java/com/troblecodings/signals/tileentitys/SignalTileEntity.java @@ -13,7 +13,6 @@ import com.troblecodings.signals.core.RenderOverlayInfo; import com.troblecodings.signals.core.SignalStateListener; import com.troblecodings.signals.core.StateInfo; -import com.troblecodings.signals.core.TileEntityInfo; import com.troblecodings.signals.enums.ChangedState; import com.troblecodings.signals.handler.ClientSignalStateHandler; import com.troblecodings.signals.handler.SignalStateHandler; @@ -21,8 +20,10 @@ import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; +import net.minecraft.client.Minecraft; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -75,9 +76,13 @@ public SignalAnimationHandler getAnimationHandler() { return handler; } - public void updateAnimationStates(final Map properties, - final boolean firstLoad) { - handler.updateStates(properties, firstLoad); + public void updateAnimationState(final Map properties, + final ChangedState state) { + final World world = Minecraft.getMinecraft().world; + final boolean loadFinilizedState = state.equals(ChangedState.ADDED_TO_CACHE) + || state.equals(ChangedState.ADDED_TO_FILE) + || (state.equals(ChangedState.UPDATED) && !world.isBlockLoaded(pos)); + handler.updateStates(properties, loadFinilizedState); } @Override diff --git a/src/test/java/com/troblecodings/signals/test/NameFileTestV2.java b/src/test/java/com/troblecodings/signals/test/NameFileTestV2.java index 40a656f5f..151217ab6 100644 --- a/src/test/java/com/troblecodings/signals/test/NameFileTestV2.java +++ b/src/test/java/com/troblecodings/signals/test/NameFileTestV2.java @@ -17,6 +17,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import com.google.common.collect.Maps; import com.troblecodings.signals.handler.NameHandlerFileV2; import com.troblecodings.signals.handler.SignalStatePosV2; @@ -97,7 +98,7 @@ public void moreThanPossible() { testString = "test_" + String.valueOf(i); final BlockPos firstcreate = StateFileTestV2.getRandomBlockPos(); final SignalStatePosV2 pos = file.createState(firstcreate, testString); - listOfPos.add(Map.entry(firstcreate, pos)); + listOfPos.add(Maps.immutableEntry(firstcreate, pos)); allNames.put(firstcreate, testString); } for (int i = 0; i < listOfPos.size(); i++) { diff --git a/src/test/java/com/troblecodings/signals/test/SignalBoxNetworkTest.java b/src/test/java/com/troblecodings/signals/test/SignalBoxNetworkTest.java index be4d81f83..e72cad0c7 100644 --- a/src/test/java/com/troblecodings/signals/test/SignalBoxNetworkTest.java +++ b/src/test/java/com/troblecodings/signals/test/SignalBoxNetworkTest.java @@ -29,7 +29,7 @@ import com.troblecodings.signals.signalbox.entrys.PathOptionEntry; import com.troblecodings.signals.signalbox.entrys.PointEntry; -import net.minecraft.world.level.block.Rotation; +import net.minecraft.util.Rotation; public class SignalBoxNetworkTest { @@ -64,7 +64,7 @@ public void testAddAndRemoveMode() { @Test public void testCounter() { - final int counter = RANDOM.nextInt(0, 1000); + final int counter = RANDOM.nextInt(1000); grid.setCounter(counter); handler.sendCounter(); assertEquals(counter, grid.getCurrentCounter()); @@ -159,12 +159,12 @@ public void initializeNewGridAndNetwork() { } private Point getRandPoint() { - return new Point(RANDOM.nextInt(0, 101), RANDOM.nextInt(0, 101)); + return new Point(RANDOM.nextInt(101), RANDOM.nextInt(101)); } private ModeSet getRandModeSet() { - return new ModeSet(EnumGuiMode.values()[RANDOM.nextInt(0, EnumGuiMode.values().length)], - Rotation.values()[RANDOM.nextInt(0, Rotation.values().length)]); + return new ModeSet(EnumGuiMode.values()[RANDOM.nextInt(EnumGuiMode.values().length)], + Rotation.values()[RANDOM.nextInt(Rotation.values().length)]); } private static final List> PATHENTRY_TYPES = @@ -174,7 +174,7 @@ private ModeSet getRandModeSet() { .collect(Collectors.toList()); private PathEntryType getRandEntryType() { - return PATHENTRY_TYPES.get(RANDOM.nextInt(0, PATHENTRY_TYPES.size())); + return PATHENTRY_TYPES.get(RANDOM.nextInt(PATHENTRY_TYPES.size())); } } diff --git a/src/test/java/com/troblecodings/signals/test/StateFileTestV2.java b/src/test/java/com/troblecodings/signals/test/StateFileTestV2.java index d6e793f51..45f080687 100644 --- a/src/test/java/com/troblecodings/signals/test/StateFileTestV2.java +++ b/src/test/java/com/troblecodings/signals/test/StateFileTestV2.java @@ -64,7 +64,7 @@ public static void resetAll() throws IOException { private static final Random RANDOM = new Random(); public static BlockPos getRandomBlockPos() { - return new BlockPos(RANDOM.nextInt(), RANDOM.nextInt(-64, 321), RANDOM.nextInt()); + return new BlockPos(RANDOM.nextInt(), RANDOM.nextInt(321), RANDOM.nextInt()); } @Test From 6cb569713fe01d25884310be20b4fe2d8d44993b Mon Sep 17 00:00:00 2001 From: Cedric Date: Tue, 10 Feb 2026 11:21:40 +0100 Subject: [PATCH 31/61] fix: issues with animation and UI --- .../signals/guis/ContainerSignalBox.java | 22 +++++-------------- .../handler/ClientSignalStateHandler.java | 6 ++--- 2 files changed, 9 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/guis/ContainerSignalBox.java b/src/main/java/com/troblecodings/signals/guis/ContainerSignalBox.java index a418f2581..196558655 100644 --- a/src/main/java/com/troblecodings/signals/guis/ContainerSignalBox.java +++ b/src/main/java/com/troblecodings/signals/guis/ContainerSignalBox.java @@ -15,7 +15,6 @@ import com.troblecodings.guilib.ecs.ContainerBase; import com.troblecodings.guilib.ecs.GuiInfo; import com.troblecodings.guilib.ecs.interfaces.UIClientSync; -import com.troblecodings.signals.OpenSignalsMain; import com.troblecodings.signals.SEProperty; import com.troblecodings.signals.blocks.Signal; import com.troblecodings.signals.contentpacks.SubsidiarySignalParser; @@ -75,13 +74,13 @@ public class ContainerSignalBox extends ContainerBase implements UIClientSync, I public ContainerSignalBox(final GuiInfo info) { super(info); this.tile = info.getTile(SignalBoxTileEntity.class); + this.grid = tile.getSignalBoxGrid(); + initializeNetwork(); } @Override public void sendAllDataToRemote() { - this.grid = tile.getSignalBoxGrid(); initializeNetwork(); - sendInitialisationPacket(); network.sendAll(); } @@ -132,24 +131,15 @@ public void readAdditionalInitialisationData(final ReadBuffer buffer) { loadPossibleSubsidiaires(); } - private void sendInitialisationPacket() { - final WriteBuffer buffer = new WriteBuffer(); - buffer.putBlockPos(info.pos); - OpenSignalsMain.network.sendTo(getPlayer(), buffer); - } - public SignalBoxNetworkHandler getNetwork() { return network; } @Override public void deserializeClient(final ReadBuffer buffer) { - if (tile == null) { - final BlockPos pos = buffer.getBlockPos(); - this.tile = (SignalBoxTileEntity) info.world.getTileEntity(pos); + if (grid == null) { this.grid = tile.getSignalBoxGrid(); initializeNetwork(); - return; } network.desirializeBuffer(buffer); } @@ -289,9 +279,9 @@ public boolean isClientSide() { @Override public void onContainerClosed(final EntityPlayer playerIn) { super.onContainerClosed(playerIn); - grid.removeNetwork(); - network.removeNetwork(); - if (this.tile != null) { + if (this.grid != null) { + grid.removeNetwork(); + network.removeNetwork(); this.tile.remove(this); } } diff --git a/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java b/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java index ab71710dd..750bc0908 100644 --- a/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java +++ b/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java @@ -51,9 +51,9 @@ public void deserializeClient(final ReadBuffer buffer) { final Map newProperties = buffer.getMapWithCombinedValueFunc(NetworkBufferWrappers.getSEPropertyFunc(signal), (buf, prop) -> prop.getObjFromID(buf.getByteToUnsignedInt())); + final Map properties; synchronized (CURRENTLY_LOADED_STATES) { - final Map properties = - CURRENTLY_LOADED_STATES.computeIfAbsent(stateInfo, _u -> new HashMap<>()); + properties = CURRENTLY_LOADED_STATES.computeIfAbsent(stateInfo, _u -> new HashMap<>()); properties.putAll(newProperties); CURRENTLY_LOADED_STATES.put(stateInfo, properties); } @@ -71,7 +71,7 @@ public void deserializeClient(final ReadBuffer buffer) { mc.renderGlobal.notifyBlockUpdate(level, signalPos, state, state, 8); final TileEntity tile = level.getTileEntity(signalPos); if (tile != null && tile instanceof SignalTileEntity) { - ((SignalTileEntity) tile).updateAnimationState(newProperties, changedState); + ((SignalTileEntity) tile).updateAnimationState(properties, changedState); } chunk.markDirty(); }); From 2f2e3bb8de329532db8a5ac6d916dde17ddb0925 Mon Sep 17 00:00:00 2001 From: Cedric Date: Tue, 10 Feb 2026 11:50:42 +0100 Subject: [PATCH 32/61] ref: better handling of reset protectionway --- .../signals/signalbox/PathwayData.java | 4 ++-- .../signals/signalbox/SignalBoxGrid.java | 10 ++-------- .../signals/signalbox/SignalBoxPathway.java | 14 +++----------- 3 files changed, 7 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/signalbox/PathwayData.java b/src/main/java/com/troblecodings/signals/signalbox/PathwayData.java index a16bdd220..0a1965e11 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/PathwayData.java +++ b/src/main/java/com/troblecodings/signals/signalbox/PathwayData.java @@ -228,7 +228,6 @@ protected boolean resetProtectionWay() { if (pw == null) return; pw.directResetOfProtectionWay(); - pw.removeProtectionWay(); })); }).start(); return true; @@ -248,10 +247,11 @@ protected boolean directResetOfProtectionWay() { .updateRedstoneOutput(new StateInfo(pathway.tile.getWorld(), pos), false)); option.removeEntry(PathEntryType.PATHUSAGE); }); + removeProtectionWay(); return true; } - protected void removeProtectionWay() { + private void removeProtectionWay() { this.protectionWayNodes = ImmutableList.of(); } diff --git a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java index 8a632b229..183b78c9f 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java +++ b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java @@ -111,11 +111,7 @@ private boolean checkManuellResetOfProtectionWay(final Point p1) { final SignalBoxPathway pathway = endsToPath.get(p1); if (pathway == null) return false; - final boolean isReset = pathway.directResetOfProtectionWay(); - if (isReset) { - pathway.removeProtectionWay(); - } - return isReset; + return pathway.directResetOfProtectionWay(); } protected void resetPathway(final SignalBoxPathway pathway) { @@ -254,9 +250,7 @@ private void tryReset(final List pathways, final BlockPos pos) this.startsToPath.put(pathway.getFirstPoint(), pathway); } } - if (pathway.checkResetOfProtectionWay(pos)) { - pathway.removeProtectionWay(); - } + pathway.checkResetOfProtectionWay(pos); }); tryNextPathways(); } diff --git a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxPathway.java b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxPathway.java index 51ba9acb8..dc68569a8 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxPathway.java +++ b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxPathway.java @@ -119,24 +119,16 @@ private void setProtectionWay() { }); } - public boolean checkResetOfProtectionWay(final BlockPos position) { + public void checkResetOfProtectionWay(final BlockPos position) { if (!data.canResetProtectionWay(position)) - return false; - return resetProtectionWay(); - } - - public boolean resetProtectionWay() { - return data.resetProtectionWay(); + return; + data.resetProtectionWay(); } public boolean directResetOfProtectionWay() { return data.directResetOfProtectionWay(); } - public void removeProtectionWay() { - data.removeProtectionWay(); - } - public void setUpPathwayStatus() { setPathStatus(EnumPathUsage.SELECTED); } From e6f58594474e1066a8a61fd1af892286a3b70126 Mon Sep 17 00:00:00 2001 From: Cedric Date: Tue, 10 Feb 2026 14:30:30 +0100 Subject: [PATCH 33/61] fix: issues with null-world and no names & properties --- .../signals/handler/ClientNameHandler.java | 24 +++++----- .../handler/ClientSignalStateHandler.java | 45 ++++++++++--------- 2 files changed, 34 insertions(+), 35 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/handler/ClientNameHandler.java b/src/main/java/com/troblecodings/signals/handler/ClientNameHandler.java index 7db712271..71a08fc77 100644 --- a/src/main/java/com/troblecodings/signals/handler/ClientNameHandler.java +++ b/src/main/java/com/troblecodings/signals/handler/ClientNameHandler.java @@ -27,20 +27,18 @@ public static String getClientName(final StateInfo info) { @Override public void deserializeClient(final ReadBuffer buffer) { final Minecraft mc = Minecraft.getMinecraft(); - final BlockPos pos = buffer.getBlockPos(); - final boolean removed = buffer.getBoolean(); - if (removed) { - setRemoved(pos); - return; - } - final String name = buffer.getString(); - synchronized (CLIENT_NAMES) { - CLIENT_NAMES.put(new StateInfo(mc.world, pos), name); - } - final WorldClient level = mc.world; - if (level == null) - return; mc.addScheduledTask(() -> { + final BlockPos pos = buffer.getBlockPos(); + final boolean removed = buffer.getBoolean(); + if (removed) { + setRemoved(pos); + return; + } + final String name = buffer.getString(); + final WorldClient level = mc.world; + synchronized (CLIENT_NAMES) { + CLIENT_NAMES.put(new StateInfo(level, pos), name); + } level.getChunkFromBlockCoords(pos).markDirty(); final IBlockState state = level.getBlockState(pos); if (state == null) diff --git a/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java b/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java index 750bc0908..326378deb 100644 --- a/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java +++ b/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java @@ -37,29 +37,30 @@ public static final Map getClientStates(final StateInfo info @Override public void deserializeClient(final ReadBuffer buffer) { final Minecraft mc = Minecraft.getMinecraft(); - final World level = mc.world; - final BlockPos signalPos = buffer.getBlockPos(); - final StateInfo stateInfo = new StateInfo(level, signalPos); - final int signalID = buffer.getInt(); - final ChangedState changedState = buffer.getEnumValue(ChangedState.class); - if (changedState.equals(ChangedState.REMOVED_FROM_CACHE) - || changedState.equals(ChangedState.REMOVED_FROM_FILE)) { - setRemoved(stateInfo); - return; - } - final Signal signal = Signal.getSignalByID(signalID); - final Map newProperties = - buffer.getMapWithCombinedValueFunc(NetworkBufferWrappers.getSEPropertyFunc(signal), - (buf, prop) -> prop.getObjFromID(buf.getByteToUnsignedInt())); - final Map properties; - synchronized (CURRENTLY_LOADED_STATES) { - properties = CURRENTLY_LOADED_STATES.computeIfAbsent(stateInfo, _u -> new HashMap<>()); - properties.putAll(newProperties); - CURRENTLY_LOADED_STATES.put(stateInfo, properties); - } - if (level == null) - return; mc.addScheduledTask(() -> { + final World level = mc.world; + final BlockPos signalPos = buffer.getBlockPos(); + final StateInfo stateInfo = new StateInfo(level, signalPos); + final int signalID = buffer.getInt(); + final ChangedState changedState = buffer.getEnumValue(ChangedState.class); + if (changedState.equals(ChangedState.REMOVED_FROM_CACHE) + || changedState.equals(ChangedState.REMOVED_FROM_FILE)) { + setRemoved(stateInfo); + return; + } + final Signal signal = Signal.getSignalByID(signalID); + final Map newProperties = buffer.getMapWithCombinedValueFunc( + NetworkBufferWrappers.getSEPropertyFunc(signal), + (buf, prop) -> prop.getObjFromID(buf.getByteToUnsignedInt())); + final Map properties; + synchronized (CURRENTLY_LOADED_STATES) { + properties = + CURRENTLY_LOADED_STATES.computeIfAbsent(stateInfo, _u -> new HashMap<>()); + properties.putAll(newProperties); + CURRENTLY_LOADED_STATES.put(stateInfo, properties); + } + if (level == null) + return; final Chunk chunk = level.getChunkFromBlockCoords(signalPos); if (chunk == null) return; From fe6f435eb435363bd719ed28ab5954f1b0b39f17 Mon Sep 17 00:00:00 2001 From: Cedric Date: Tue, 10 Feb 2026 14:30:50 +0100 Subject: [PATCH 34/61] ref: better code performance; fix: issue with client side --- .../signals/tileentitys/BasicBlockEntity.java | 3 --- .../signals/tileentitys/SignalTileEntity.java | 10 +++------- .../signals/tileentitys/SyncableTileEntity.java | 6 +----- 3 files changed, 4 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/tileentitys/BasicBlockEntity.java b/src/main/java/com/troblecodings/signals/tileentitys/BasicBlockEntity.java index c08525c19..d20a3e632 100644 --- a/src/main/java/com/troblecodings/signals/tileentitys/BasicBlockEntity.java +++ b/src/main/java/com/troblecodings/signals/tileentitys/BasicBlockEntity.java @@ -22,9 +22,6 @@ public class BasicBlockEntity extends TileEntity implements NamableWrapper, IChu public static final String POS_TAG = "posTag"; protected final ArrayList linkedPositions = new ArrayList<>(); - public BasicBlockEntity() { - } - public void saveWrapper(final NBTWrapper wrapper) { } diff --git a/src/main/java/com/troblecodings/signals/tileentitys/SignalTileEntity.java b/src/main/java/com/troblecodings/signals/tileentitys/SignalTileEntity.java index 6fab8f073..cbe58bc0b 100644 --- a/src/main/java/com/troblecodings/signals/tileentitys/SignalTileEntity.java +++ b/src/main/java/com/troblecodings/signals/tileentitys/SignalTileEntity.java @@ -20,10 +20,8 @@ import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; -import net.minecraft.client.Minecraft; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -76,13 +74,11 @@ public SignalAnimationHandler getAnimationHandler() { return handler; } + @SideOnly(Side.CLIENT) public void updateAnimationState(final Map properties, final ChangedState state) { - final World world = Minecraft.getMinecraft().world; - final boolean loadFinilizedState = state.equals(ChangedState.ADDED_TO_CACHE) - || state.equals(ChangedState.ADDED_TO_FILE) - || (state.equals(ChangedState.UPDATED) && !world.isBlockLoaded(pos)); - handler.updateStates(properties, loadFinilizedState); + handler.updateStates(properties, state.equals(ChangedState.ADDED_TO_CACHE) + || state.equals(ChangedState.ADDED_TO_FILE)); } @Override diff --git a/src/main/java/com/troblecodings/signals/tileentitys/SyncableTileEntity.java b/src/main/java/com/troblecodings/signals/tileentitys/SyncableTileEntity.java index 0512ac5f0..6228f19d4 100644 --- a/src/main/java/com/troblecodings/signals/tileentitys/SyncableTileEntity.java +++ b/src/main/java/com/troblecodings/signals/tileentitys/SyncableTileEntity.java @@ -7,17 +7,13 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.math.BlockPos; import net.minecraft.network.NetworkManager; import net.minecraft.network.play.server.SPacketUpdateTileEntity; +import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; public class SyncableTileEntity extends BasicBlockEntity { - public SyncableTileEntity() { - super(); - } - protected final ArrayList clientSyncs = new ArrayList<>(); @Override From 5a04e96067813dc6060c74bcbd5c9accc9899b0b Mon Sep 17 00:00:00 2001 From: Cedric Date: Tue, 10 Feb 2026 15:33:08 +0100 Subject: [PATCH 35/61] fix: no try of next pws when protection way is rested --- .../java/com/troblecodings/signals/signalbox/PathwayData.java | 1 + .../java/com/troblecodings/signals/signalbox/SignalBoxGrid.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/troblecodings/signals/signalbox/PathwayData.java b/src/main/java/com/troblecodings/signals/signalbox/PathwayData.java index 0a1965e11..011b69736 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/PathwayData.java +++ b/src/main/java/com/troblecodings/signals/signalbox/PathwayData.java @@ -228,6 +228,7 @@ protected boolean resetProtectionWay() { if (pw == null) return; pw.directResetOfProtectionWay(); + grid.tryNextPathways(); })); }).start(); return true; diff --git a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java index 183b78c9f..ebc51128e 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java +++ b/src/main/java/com/troblecodings/signals/signalbox/SignalBoxGrid.java @@ -257,7 +257,7 @@ private void tryReset(final List pathways, final BlockPos pos) private boolean executingTryNextPWs = false; - private void tryNextPathways() { + protected void tryNextPathways() { if (executingTryNextPWs) return; executingTryNextPWs = true; From d16216a639567da0361418fc3f0a5fb53301041d Mon Sep 17 00:00:00 2001 From: Cedric Date: Tue, 10 Feb 2026 15:33:20 +0100 Subject: [PATCH 36/61] ref: better save of names and states --- .../troblecodings/signals/handler/NameHandler.java | 13 +++++++++---- .../signals/handler/SignalStateHandler.java | 13 +++++++++---- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/handler/NameHandler.java b/src/main/java/com/troblecodings/signals/handler/NameHandler.java index 5f458a6ca..bd4d14ffc 100644 --- a/src/main/java/com/troblecodings/signals/handler/NameHandler.java +++ b/src/main/java/com/troblecodings/signals/handler/NameHandler.java @@ -70,6 +70,12 @@ public static void init() { @EventHandler public static void onServerStop(final FMLServerStoppingEvent event) { + Map map; + synchronized (ALL_NAMES) { + map = ImmutableMap.copyOf(ALL_NAMES); + } + writeService.execute(() -> map.entrySet().stream() + .forEach(entry -> createToFile(entry.getKey(), entry.getValue()))); writeService.shutdown(); try { writeService.awaitTermination(10, TimeUnit.MINUTES); @@ -245,10 +251,9 @@ public static void onWorldSave(final WorldEvent.Save event) { synchronized (ALL_NAMES) { map = ImmutableMap.copyOf(ALL_NAMES); } - writeService.execute(() -> { - map.entrySet().stream().filter(entry -> entry.getKey().world.equals(world)) - .forEach(entry -> createToFile(entry.getKey(), entry.getValue())); - }); + writeService.execute( + () -> map.entrySet().stream().filter(entry -> entry.getKey().world.equals(world)) + .forEach(entry -> createToFile(entry.getKey(), entry.getValue()))); } @SubscribeEvent diff --git a/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java b/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java index 23a513418..5f1b8c422 100644 --- a/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java +++ b/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java @@ -79,6 +79,12 @@ public static void registerToNetworkChannel(final Object object) { } public static void onServerStop(final FMLServerStoppingEvent event) { + final Map> maps; + synchronized (CURRENTLY_LOADED_STATES) { + maps = ImmutableMap.copyOf(CURRENTLY_LOADED_STATES); + } + writeService.execute(() -> maps.entrySet().stream() + .forEach(entry -> createToFile(entry.getKey(), entry.getValue()))); writeService.shutdown(); try { writeService.awaitTermination(10, TimeUnit.MINUTES); @@ -394,10 +400,9 @@ public static void onWorldSave(final WorldEvent.Save save) { synchronized (CURRENTLY_LOADED_STATES) { maps = ImmutableMap.copyOf(CURRENTLY_LOADED_STATES); } - writeService.execute(() -> { - maps.entrySet().stream().filter(entry -> entry.getKey().world.equals(world)) - .forEach(entry -> createToFile(entry.getKey(), entry.getValue())); - }); + writeService.execute( + () -> maps.entrySet().stream().filter(entry -> entry.getKey().world.equals(world)) + .forEach(entry -> createToFile(entry.getKey(), entry.getValue()))); } @SubscribeEvent From 3e30f14a2ea49cac6dfbe53ede61f440dc88275a Mon Sep 17 00:00:00 2001 From: Cedric Date: Sat, 14 Feb 2026 16:13:07 +0100 Subject: [PATCH 37/61] fix: issues with RS can't be added to saver --- .../signals/network/SignalBoxNetworkHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkHandler.java b/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkHandler.java index 67565931b..d72878c32 100644 --- a/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkHandler.java +++ b/src/main/java/com/troblecodings/signals/network/SignalBoxNetworkHandler.java @@ -348,8 +348,8 @@ protected void readPathwayAction(final ReadBuffer buffer) { final PathwayRequestResult request = grid.requestWay(p1, p2, type); if (!request.wasSuccesfull()) { final SignalBoxNode endNode = grid.getNode(p2); - if (request.canBeAddedToSaver(type) && type.equals(PathType.NORMAL) - && !endNode.containsOutConnection() && grid.addNextPathway(p1, p2, type)) { + if (request.canBeAddedToSaver(type) && !endNode.containsOutConnection() + && grid.addNextPathway(p1, p2, type)) { sendAddSavedPathway(p1, p2, type, request); return; } From c08850f3d3ef7955614aa097ca89d3946cfffc27 Mon Sep 17 00:00:00 2001 From: Cedric Date: Thu, 19 Feb 2026 14:50:15 +0100 Subject: [PATCH 38/61] fix: subsidiary signal not turns off, when changeing to EDITOR mode --- .../troblecodings/signals/guis/GuiSignalBox.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/java/com/troblecodings/signals/guis/GuiSignalBox.java b/src/main/java/com/troblecodings/signals/guis/GuiSignalBox.java index 9daa3220d..e658c733b 100644 --- a/src/main/java/com/troblecodings/signals/guis/GuiSignalBox.java +++ b/src/main/java/com/troblecodings/signals/guis/GuiSignalBox.java @@ -523,6 +523,7 @@ private void initializeFieldEdit(final UIEntity entity) { (selection, rotation) -> helpPage.updateNextNode(selection, rotation)); resetSelection(entity); network.sendResetAllPathways(); + resetAllSubsidiarySignals(); resetColors(); helpPage.updateNextNode(menu.getSelection(), menu.getRotation()); this.lastTile = null; @@ -692,6 +693,19 @@ private void updateColor(final SignalBoxNode node) { }); } + private void resetAllSubsidiarySignals() { + final SubsidiaryState dummy = SubsidiaryState.ALL_STATES.get(0); + container.enabledSubsidiaryTypes.forEach((point, states) -> { + final SignalBoxNode node = container.grid.getNode(point); + states.keySet().forEach(mode -> { + node.updateState(mode, SignalState.RED); + network.sendSubsidiary(new ModeIdentifier(point, mode), dummy, false); + }); + updateSignalState(node); + }); + container.enabledSubsidiaryTypes.clear(); + } + @Override public ContainerBase getNewGuiContainer(final GuiInfo info) { return new ContainerSignalBox(info); From 57ae961178245f3baf85ae0240b63a86041a1423 Mon Sep 17 00:00:00 2001 From: Cedric Date: Thu, 19 Feb 2026 15:11:55 +0100 Subject: [PATCH 39/61] fix: pathway can't be set with activated subsidiary --- .../signals/enums/PathwayRequestResult.java | 13 +++++++------ .../troblecodings/signals/guis/GuiSignalBox.java | 8 ++++++++ .../resources/assets/opensignals/lang/de_de.lang | 1 + .../resources/assets/opensignals/lang/en_us.lang | 1 + 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/enums/PathwayRequestResult.java b/src/main/java/com/troblecodings/signals/enums/PathwayRequestResult.java index 3f0bfa984..6d2f810e3 100644 --- a/src/main/java/com/troblecodings/signals/enums/PathwayRequestResult.java +++ b/src/main/java/com/troblecodings/signals/enums/PathwayRequestResult.java @@ -9,12 +9,14 @@ public class PathwayRequestResult { - private static final Map MODE_TO_RESULT = new HashMap<>(); + private static final Map MODE_TO_RESULT = + new HashMap<>(); static { for (final PathwayRequestMode mode : PathwayRequestMode.values()) { - if (mode == PathwayRequestMode.PASS) + if (mode == PathwayRequestMode.PASS) { continue; + } MODE_TO_RESULT.put(mode, new PathwayRequestResult(mode)); } } @@ -71,9 +73,7 @@ public int hashCode() { public boolean equals(final Object obj) { if (this == obj) return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) + if ((obj == null) || (getClass() != obj.getClass())) return false; final PathwayRequestResult other = (PathwayRequestResult) obj; return Objects.equals(data, other.data) && mode == other.mode; @@ -84,7 +84,8 @@ public enum PathwayRequestMode { NO_EQUAL_PATH_TYPE("no_equal_path_type"), NOT_IN_GRID("not_in_grid"), ALREADY_USED("already_used"), OVERSTEPPING("overstepping"), INPUT_BLOCKING("input_blocking"), NO_PATH("no_path"), - NO_INTERSIGNALBOX_SELECTED("no_intersignalbox_selected"), PASS("pass"); + NO_INTERSIGNALBOX_SELECTED("no_intersignalbox_selected"), + SUBISIDIARY_ENABLED("subsidiary_enabled"), PASS("pass"); private final String name; diff --git a/src/main/java/com/troblecodings/signals/guis/GuiSignalBox.java b/src/main/java/com/troblecodings/signals/guis/GuiSignalBox.java index e658c733b..7334367cd 100644 --- a/src/main/java/com/troblecodings/signals/guis/GuiSignalBox.java +++ b/src/main/java/com/troblecodings/signals/guis/GuiSignalBox.java @@ -275,6 +275,13 @@ private void tileNormal(final UISignalBoxRendering rendering, final Point tile, private void checkForMultiplePathTypes(final SignalBoxNode start, final SignalBoxNode end) { final List possibleTypes = start.getPossibleTypes(end); + for (final ModeSet mode : start.getModes().keySet()) { + if (start.getSubsidiaryState(mode) != null) { + infoUpdate(I18Wrapper + .format("error." + PathwayRequestMode.SUBISIDIARY_ENABLED.getName())); + return; + } + } if (possibleTypes.isEmpty()) { infoUpdate( I18Wrapper.format("error." + PathwayRequestMode.NO_EQUAL_PATH_TYPE.getName())); @@ -703,6 +710,7 @@ private void resetAllSubsidiarySignals() { }); updateSignalState(node); }); + enabledSubsidiaries.clear(); container.enabledSubsidiaryTypes.clear(); } diff --git a/src/main/resources/assets/opensignals/lang/de_de.lang b/src/main/resources/assets/opensignals/lang/de_de.lang index 07b1650b7..6af12fe09 100644 --- a/src/main/resources/assets/opensignals/lang/de_de.lang +++ b/src/main/resources/assets/opensignals/lang/de_de.lang @@ -175,6 +175,7 @@ error.overstepping=Überschreiten error.no_path=Kein Fahrstraße möglich error.no_intersignalbox_selected=Kein Stellwerk verbunden error.input_blocking=aktiver Input blockiert +error.subsidiary_enabled=Eingeschaltetes ZS Signal error.pass=Erfolg # SignalboxLinkingPage diff --git a/src/main/resources/assets/opensignals/lang/en_us.lang b/src/main/resources/assets/opensignals/lang/en_us.lang index 9878a3a39..3b4927012 100644 --- a/src/main/resources/assets/opensignals/lang/en_us.lang +++ b/src/main/resources/assets/opensignals/lang/en_us.lang @@ -175,6 +175,7 @@ error.overstepping=Overstepped error.no_path=No path available error.no_intersignalbox_selected=No signalbox connected error.input_blocking=active Input is blocking +error.subsidiary_enabled=Activated subsidiary error.pass=Pass # SignalboxLinkingPage From 8ef41499b4fbe4150ecdb61adf94a4a11b681514 Mon Sep 17 00:00:00 2001 From: Cedric Date: Thu, 19 Feb 2026 17:58:24 +0100 Subject: [PATCH 40/61] ref: added debug --- .../java/com/troblecodings/signals/blocks/Signal.java | 1 + .../troblecodings/signals/models/ModelInfoWrapper.java | 10 ++++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/blocks/Signal.java b/src/main/java/com/troblecodings/signals/blocks/Signal.java index de9da0c69..2f32fc707 100644 --- a/src/main/java/com/troblecodings/signals/blocks/Signal.java +++ b/src/main/java/com/troblecodings/signals/blocks/Signal.java @@ -211,6 +211,7 @@ public IBlockState getExtendedState(final IBlockState state, final IBlockAccess } else { OpenSignalsMain.getLogger().error("Tried to set invalid SEProperty [" + property + "] on [" + this + "]. Rejected!"); + OpenSignalsMain.getLogger().error("Properties on [" + pos + "]=" + properties); } }); return blockState.get(); diff --git a/src/main/java/com/troblecodings/signals/models/ModelInfoWrapper.java b/src/main/java/com/troblecodings/signals/models/ModelInfoWrapper.java index 9e70705d4..2000285af 100644 --- a/src/main/java/com/troblecodings/signals/models/ModelInfoWrapper.java +++ b/src/main/java/com/troblecodings/signals/models/ModelInfoWrapper.java @@ -4,6 +4,7 @@ import java.util.Optional; import com.troblecodings.core.interfaces.BlockModelDataWrapper; +import com.troblecodings.signals.OpenSignalsMain; import com.troblecodings.signals.SEProperty; import net.minecraft.block.Block; @@ -25,8 +26,9 @@ public ModelInfoWrapper(final Block block) { public ModelInfoWrapper(final Block block, final Map properties) { this(block); - properties.forEach((property, - value) -> state = ((IExtendedBlockState) state).withProperty(property, value)); + OpenSignalsMain.getLogger().error("[" + block + "] with=" + properties); + properties.forEach((property, value) -> state = + ((IExtendedBlockState) state).withProperty(property, value)); } @Override @@ -40,8 +42,8 @@ public boolean hasProperty(final IUnlistedProperty prop) { @SuppressWarnings("unchecked") public T getData(final IUnlistedProperty prop) { - final Optional opt = (Optional) ((IExtendedBlockState) state).getUnlistedProperties() - .get(prop); + final Optional opt = + (Optional) ((IExtendedBlockState) state).getUnlistedProperties().get(prop); if (opt.isPresent()) return opt.get(); return null; From 5bf0420587344af43edac94a25a26167ea3232c9 Mon Sep 17 00:00:00 2001 From: Cedric Date: Thu, 19 Feb 2026 18:22:22 +0100 Subject: [PATCH 41/61] ref: changed Debug --- src/main/java/com/troblecodings/signals/blocks/Signal.java | 1 + .../troblecodings/signals/handler/ClientSignalStateHandler.java | 2 ++ .../java/com/troblecodings/signals/models/ModelInfoWrapper.java | 2 -- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/blocks/Signal.java b/src/main/java/com/troblecodings/signals/blocks/Signal.java index 2f32fc707..6ebcc0432 100644 --- a/src/main/java/com/troblecodings/signals/blocks/Signal.java +++ b/src/main/java/com/troblecodings/signals/blocks/Signal.java @@ -243,6 +243,7 @@ protected BlockStateContainer createBlockState() { nextConsumer = _u -> { }; properties.add(CUSTOMNAME); + System.out.println("Registerd [" + properties + "] for [" + this + "]!"); this.signalProperties = ImmutableList.copyOf(properties); return new ExtendedBlockState(this, new IProperty[] { ANGEL diff --git a/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java b/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java index 326378deb..3648a77f3 100644 --- a/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java +++ b/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java @@ -52,6 +52,8 @@ public void deserializeClient(final ReadBuffer buffer) { final Map newProperties = buffer.getMapWithCombinedValueFunc( NetworkBufferWrappers.getSEPropertyFunc(signal), (buf, prop) -> prop.getObjFromID(buf.getByteToUnsignedInt())); + System.out.println("Recived Properties for [" + signal + "] on [" + signalPos + + "] Properties=" + newProperties); final Map properties; synchronized (CURRENTLY_LOADED_STATES) { properties = diff --git a/src/main/java/com/troblecodings/signals/models/ModelInfoWrapper.java b/src/main/java/com/troblecodings/signals/models/ModelInfoWrapper.java index 2000285af..e8b6c17e4 100644 --- a/src/main/java/com/troblecodings/signals/models/ModelInfoWrapper.java +++ b/src/main/java/com/troblecodings/signals/models/ModelInfoWrapper.java @@ -4,7 +4,6 @@ import java.util.Optional; import com.troblecodings.core.interfaces.BlockModelDataWrapper; -import com.troblecodings.signals.OpenSignalsMain; import com.troblecodings.signals.SEProperty; import net.minecraft.block.Block; @@ -26,7 +25,6 @@ public ModelInfoWrapper(final Block block) { public ModelInfoWrapper(final Block block, final Map properties) { this(block); - OpenSignalsMain.getLogger().error("[" + block + "] with=" + properties); properties.forEach((property, value) -> state = ((IExtendedBlockState) state).withProperty(property, value)); } From f61531cff86d65a2b60519e26e3ffa840e384869 Mon Sep 17 00:00:00 2001 From: Cedric Date: Thu, 19 Feb 2026 18:41:38 +0100 Subject: [PATCH 42/61] ref: added more debug --- .../com/troblecodings/signals/handler/SignalStateHandler.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java b/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java index 5f1b8c422..0c8adbd2c 100644 --- a/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java +++ b/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java @@ -376,6 +376,8 @@ private static Map readAndSerialize(final SignalStateInfo st } }); } + System.out.println("Loaded [" + stateInfo.pos + "] for [" + stateInfo.signal + "] with [" + + map + "]!"); return map; } From 382f5b451e80bca9fb32d0fbd523f974db03152b Mon Sep 17 00:00:00 2001 From: Cedric Date: Thu, 19 Feb 2026 21:56:53 +0100 Subject: [PATCH 43/61] ref: changed debug output --- .../com/troblecodings/signals/handler/SignalStateHandler.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java b/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java index 0c8adbd2c..5efb3e88e 100644 --- a/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java +++ b/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java @@ -378,6 +378,9 @@ private static Map readAndSerialize(final SignalStateInfo st } System.out.println("Loaded [" + stateInfo.pos + "] for [" + stateInfo.signal + "] with [" + map + "]!"); + for (final StackTraceElement e : Thread.currentThread().getStackTrace()) { + System.out.println(" " + e.toString()); + } return map; } From 90c31a371d8c3e06cd5d9ad2a89537a7a4ee1518 Mon Sep 17 00:00:00 2001 From: Cedric Date: Fri, 20 Feb 2026 11:03:30 +0100 Subject: [PATCH 44/61] ref: changed debug --- .../java/com/troblecodings/signals/blocks/Signal.java | 1 - .../signals/handler/SignalStateHandler.java | 11 ++++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/blocks/Signal.java b/src/main/java/com/troblecodings/signals/blocks/Signal.java index 6ebcc0432..2f32fc707 100644 --- a/src/main/java/com/troblecodings/signals/blocks/Signal.java +++ b/src/main/java/com/troblecodings/signals/blocks/Signal.java @@ -243,7 +243,6 @@ protected BlockStateContainer createBlockState() { nextConsumer = _u -> { }; properties.add(CUSTOMNAME); - System.out.println("Registerd [" + properties + "] for [" + this + "]!"); this.signalProperties = ImmutableList.copyOf(properties); return new ExtendedBlockState(this, new IProperty[] { ANGEL diff --git a/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java b/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java index 5efb3e88e..bddd9aade 100644 --- a/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java +++ b/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java @@ -14,6 +14,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; import javax.annotation.Nullable; @@ -376,11 +377,6 @@ private static Map readAndSerialize(final SignalStateInfo st } }); } - System.out.println("Loaded [" + stateInfo.pos + "] for [" + stateInfo.signal + "] with [" - + map + "]!"); - for (final StackTraceElement e : Thread.currentThread().getStackTrace()) { - System.out.println(" " + e.toString()); - } return map; } @@ -556,6 +552,11 @@ public static void loadSignals(final List signals, final @Nullable EntityPlayer player) { if (signals == null || signals.isEmpty()) return; + System.out.println("Loading " + + signals.stream().map(loader -> loader.info).collect(Collectors.toList())); + for (final StackTraceElement e : Thread.currentThread().getStackTrace()) { + System.out.println(" " + e.toString()); + } THREAD_SERVICE.execute(() -> { signals.forEach(info -> { boolean isLoaded = false; From d65308cc46d07248b5e341544f0c93c836d5fd0e Mon Sep 17 00:00:00 2001 From: Cedric Date: Fri, 20 Feb 2026 11:33:38 +0100 Subject: [PATCH 45/61] ref: added automatic unlink when signals are not equal --- .../SignalControllerTileEntity.java | 70 ++++++++++++------- 1 file changed, 43 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/tileentitys/SignalControllerTileEntity.java b/src/main/java/com/troblecodings/signals/tileentitys/SignalControllerTileEntity.java index 0f49450d6..a0fc1bc5d 100644 --- a/src/main/java/com/troblecodings/signals/tileentitys/SignalControllerTileEntity.java +++ b/src/main/java/com/troblecodings/signals/tileentitys/SignalControllerTileEntity.java @@ -67,7 +67,6 @@ public class SignalControllerTileEntity extends SyncableTileEntity private static final String RS_BOOLEAN = "rs_boolean"; public SignalControllerTileEntity() { - super(); } public void setLastMode(final EnumMode state) { @@ -90,14 +89,16 @@ public void setProfile(final int profile) { public void removePropertyFromProfile(final Byte profile, final SEProperty property) { final Map properties = allStates.get(profile); - if (properties != null) + if (properties != null) { properties.remove(property); + } } public void removeProfileFromDirection(final EnumFacing direction, final EnumState state) { final Map properties = enabledStates.get(direction); - if (properties != null) + if (properties != null) { properties.remove(state); + } } public void updateRedstoneProfile(final Byte profile, final SEProperty property, @@ -146,11 +147,13 @@ public void saveWrapper(final NBTWrapper wrapper) { wrapper.putBlockPos(BLOCK_POS_ID, linkedSignalPosition); wrapper.putString(SIGNAL_NAME, linkedSignal.getSignalTypeName()); wrapper.putInteger(LAST_PROFILE, lastProfile); - if (lastState != null) + if (lastState != null) { wrapper.putInteger(ENUM_MODE, lastState.ordinal()); + } for (final EnumFacing direction : EnumFacing.values()) { - if (!enabledStates.containsKey(direction)) + if (!enabledStates.containsKey(direction)) { continue; + } final NBTWrapper comp = new NBTWrapper(); enabledStates.get(direction) @@ -185,8 +188,9 @@ public void loadWrapper(final NBTWrapper wrapper) { lastProfile = wrapper.getInteger(LAST_PROFILE); lastState = EnumMode.values()[wrapper.getInteger(ENUM_MODE)]; for (final EnumFacing direction : EnumFacing.values()) { - if (!wrapper.contains(direction.getName())) + if (!wrapper.contains(direction.getName())) { continue; + } final NBTWrapper comp = wrapper.getWrapper(direction.getName()); final Map map = new HashMap<>(); comp.keySet().stream().forEach(str -> { @@ -196,13 +200,14 @@ public void loadWrapper(final NBTWrapper wrapper) { map.put(state, (byte) comp.getInteger(state.getNameWrapper())); }); enabledStates.put(direction, map); - if (comp.contains(RS_BOOLEAN)) - currentStates[direction.ordinal()] = comp.getWrapper(RS_BOOLEAN) - .getBoolean(RS_BOOLEAN); + if (comp.contains(RS_BOOLEAN)) { + currentStates[direction.ordinal()] = + comp.getWrapper(RS_BOOLEAN).getBoolean(RS_BOOLEAN); + } } final List list = wrapper.getList(ALLSTATES); - final List properites = linkedSignal == null ? new ArrayList<>() - : linkedSignal.getProperties(); + final List properites = + linkedSignal == null ? new ArrayList<>() : linkedSignal.getProperties(); list.forEach(compund -> { final int profile = compund.getInteger(PROFILE); final NBTWrapper comp = compund.getWrapper(PROPERITES); @@ -215,19 +220,27 @@ public void loadWrapper(final NBTWrapper wrapper) { }); allStates.put((byte) profile, properties); }); - if (wrapper.contains(LINKED_RS_INPUT)) + if (wrapper.contains(LINKED_RS_INPUT)) { linkedRSInput = wrapper.getBlockPos(LINKED_RS_INPUT); - profileRSInput = (byte) (wrapper.contains(RS_INPUT_PROFILE) - ? wrapper.getInteger(RS_INPUT_PROFILE) - : -1); + } + profileRSInput = + (byte) (wrapper.contains(RS_INPUT_PROFILE) ? wrapper.getInteger(RS_INPUT_PROFILE) + : -1); } @Override public void onLoad() { if (!world.isRemote) { if (linkedSignalPosition != null && linkedSignal != null) { - final SignalStateInfo info = new SignalStateInfo(world, linkedSignalPosition, - linkedSignal); + final Block thisBlock = world.getBlockState(this.getLinkedPosition()).getBlock(); + if (!thisBlock.equals(linkedSignal)) { + OpenSignalsMain.getLogger().error("Unlinked wrong signal data for [" + getPos() + + "]! Saved block=" + linkedSignal + ", Real block=" + thisBlock); + unlink(); + return; + } + final SignalStateInfo info = + new SignalStateInfo(world, linkedSignalPosition, linkedSignal); final LoadHolder holder = new LoadHolder<>(new StateInfo(world, pos)); SignalStateHandler.loadSignal(new SignalStateLoadHoler(info, holder)); SignalStateHandler.addListener(info, listener); @@ -237,9 +250,9 @@ public void onLoad() { } public void unloadSignal() { - if (linkedSignalPosition != null & linkedSignal != null) { - final SignalStateInfo info = new SignalStateInfo(world, linkedSignalPosition, - linkedSignal); + if (linkedSignalPosition != null && linkedSignal != null) { + final SignalStateInfo info = + new SignalStateInfo(world, linkedSignalPosition, linkedSignal); final LoadHolder holder = new LoadHolder<>(new StateInfo(world, pos)); SignalStateHandler.unloadSignal(new SignalStateLoadHoler(info, holder)); NameHandler.unloadName(new StateLoadHolder(info.toStateInfo(), holder)); @@ -270,7 +283,8 @@ public boolean link(final BlockPos pos, final NBTTagCompound tag) { onLoad(); this.syncClient(); return true; - } else if (block instanceof RedstoneInput) { + } + if (block instanceof RedstoneInput) { linkedRSInput = pos; loadChunkAndGetTile(RedstoneIOTileEntity.class, world, pos, (tile, _u) -> tile.linkController(getPos())); @@ -300,20 +314,22 @@ public void redstoneUpdate() { if (world.isRemote || linkedSignalPosition == null) return; for (final EnumFacing face : EnumFacing.values()) { - if (!this.enabledStates.containsKey(face)) + if (!this.enabledStates.containsKey(face)) { continue; + } final boolean state = this.world.isSidePowered(pos.offset(face), face); final boolean old = this.currentStates[face.ordinal()]; - if (state == old) + if (state == old) { continue; + } this.currentStates[face.ordinal()] = state; final EnumState currenState = state ? EnumState.ONSTATE : EnumState.OFFSTATE; final Byte profile = this.enabledStates.get(face).get(currenState); if (profile == null || !allStates.containsKey(profile)) { continue; } - final SignalStateInfo info = new SignalStateInfo(world, linkedSignalPosition, - linkedSignal); + final SignalStateInfo info = + new SignalStateInfo(world, linkedSignalPosition, linkedSignal); SignalStateHandler.runTaskWhenSignalLoaded(info, (stateInfo, _u1, _u2) -> SignalStateHandler.setStates(info, allStates.get(profile))); } @@ -324,8 +340,8 @@ public void updateFromRSInput() { return; final Map properties = allStates.get(profileRSInput); if (properties != null) { - final SignalStateInfo info = new SignalStateInfo(world, linkedSignalPosition, - linkedSignal); + final SignalStateInfo info = + new SignalStateInfo(world, linkedSignalPosition, linkedSignal); SignalStateHandler.runTaskWhenSignalLoaded(info, (stateInfo, _u1, _u2) -> SignalStateHandler.setStates(info, properties)); } From 66db9036777e75e9346c8e5ab82bd0ee8265a122 Mon Sep 17 00:00:00 2001 From: Cedric Date: Fri, 20 Feb 2026 11:44:48 +0100 Subject: [PATCH 46/61] ref: better output; ref: removed debug --- .../signals/handler/ClientSignalStateHandler.java | 2 -- .../troblecodings/signals/handler/SignalStateHandler.java | 6 ------ .../signals/tileentitys/SignalControllerTileEntity.java | 6 ++++-- 3 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java b/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java index 3648a77f3..326378deb 100644 --- a/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java +++ b/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java @@ -52,8 +52,6 @@ public void deserializeClient(final ReadBuffer buffer) { final Map newProperties = buffer.getMapWithCombinedValueFunc( NetworkBufferWrappers.getSEPropertyFunc(signal), (buf, prop) -> prop.getObjFromID(buf.getByteToUnsignedInt())); - System.out.println("Recived Properties for [" + signal + "] on [" + signalPos - + "] Properties=" + newProperties); final Map properties; synchronized (CURRENTLY_LOADED_STATES) { properties = diff --git a/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java b/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java index bddd9aade..5f1b8c422 100644 --- a/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java +++ b/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java @@ -14,7 +14,6 @@ import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.stream.Collectors; import javax.annotation.Nullable; @@ -552,11 +551,6 @@ public static void loadSignals(final List signals, final @Nullable EntityPlayer player) { if (signals == null || signals.isEmpty()) return; - System.out.println("Loading " - + signals.stream().map(loader -> loader.info).collect(Collectors.toList())); - for (final StackTraceElement e : Thread.currentThread().getStackTrace()) { - System.out.println(" " + e.toString()); - } THREAD_SERVICE.execute(() -> { signals.forEach(info -> { boolean isLoaded = false; diff --git a/src/main/java/com/troblecodings/signals/tileentitys/SignalControllerTileEntity.java b/src/main/java/com/troblecodings/signals/tileentitys/SignalControllerTileEntity.java index a0fc1bc5d..c90d531ea 100644 --- a/src/main/java/com/troblecodings/signals/tileentitys/SignalControllerTileEntity.java +++ b/src/main/java/com/troblecodings/signals/tileentitys/SignalControllerTileEntity.java @@ -234,8 +234,10 @@ public void onLoad() { if (linkedSignalPosition != null && linkedSignal != null) { final Block thisBlock = world.getBlockState(this.getLinkedPosition()).getBlock(); if (!thisBlock.equals(linkedSignal)) { - OpenSignalsMain.getLogger().error("Unlinked wrong signal data for [" + getPos() - + "]! Saved block=" + linkedSignal + ", Real block=" + thisBlock); + OpenSignalsMain.getLogger() + .error("Unlinked wrong signal data for [" + getPos() + "]! Linked Pos=" + + getLinkedPos() + ", Saved block=" + linkedSignal + + ", Real block=" + thisBlock); unlink(); return; } From 66521665de64d49d6243751c5cc035794fb15b3f Mon Sep 17 00:00:00 2001 From: Cedric Date: Mon, 23 Feb 2026 13:29:10 +0100 Subject: [PATCH 47/61] fix: issue with 2 players in signal box --- .../com/troblecodings/signals/guis/ContainerSignalBox.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/guis/ContainerSignalBox.java b/src/main/java/com/troblecodings/signals/guis/ContainerSignalBox.java index 196558655..ab00ca001 100644 --- a/src/main/java/com/troblecodings/signals/guis/ContainerSignalBox.java +++ b/src/main/java/com/troblecodings/signals/guis/ContainerSignalBox.java @@ -59,6 +59,7 @@ public class ContainerSignalBox extends ContainerBase implements UIClientSync, I private final Map posForType = new HashMap<>(); private SignalBoxNetworkHandler network = new SignalBoxNetworkHandler(); + private EntityPlayer player; protected Consumer updateSignalState = (node) -> { }; @@ -299,8 +300,8 @@ public Map getPositionForTypes() { public boolean canInteractWith(final EntityPlayer playerIn) { if (tile.isBlocked() && !tile.isValid(playerIn)) return false; - if (this.info.player == null) { - this.info.player = playerIn; + if (this.player == null) { + this.player = playerIn; this.tile.add(this); } return true; From 9496c37ea0595efc5843cf3e0e9c37f84fce6ee7 Mon Sep 17 00:00:00 2001 From: Cedric Date: Mon, 23 Feb 2026 13:33:59 +0100 Subject: [PATCH 48/61] fix: protection way was not required when next pathway was present --- .../java/com/troblecodings/signals/signalbox/PathwayData.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/troblecodings/signals/signalbox/PathwayData.java b/src/main/java/com/troblecodings/signals/signalbox/PathwayData.java index 011b69736..68807edd4 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/PathwayData.java +++ b/src/main/java/com/troblecodings/signals/signalbox/PathwayData.java @@ -172,7 +172,8 @@ private boolean checkForProtectionWay() { final MainSignalIdentifier signalIdent = endSignal.get(); final PathOptionEntry option = grid.getNode(signalIdent.getPoint()) .getOption(signalIdent.getModeSet()).orElse(null); - if ((option == null) || grid.startsToPath.containsKey(lastPoint)) + final SignalBoxPathway next = grid.getPathwayByStartPoint(lastPoint); + if ((option == null) || next != null && !next.isBlocked) return true; final Point protectionWayEnd = option.getEntry(PathEntryType.PROTECTIONWAY_END).orElse(lastPoint); From c5ab80ed9e2e4ff2b2e75354125cfbdc786c4693 Mon Sep 17 00:00:00 2001 From: Cedric Date: Mon, 23 Feb 2026 18:32:54 +0100 Subject: [PATCH 49/61] ref: added debug --- .../troblecodings/signals/handler/ClientSignalStateHandler.java | 1 + .../com/troblecodings/signals/handler/SignalStateHandler.java | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java b/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java index 326378deb..557131de0 100644 --- a/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java +++ b/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java @@ -52,6 +52,7 @@ public void deserializeClient(final ReadBuffer buffer) { final Map newProperties = buffer.getMapWithCombinedValueFunc( NetworkBufferWrappers.getSEPropertyFunc(signal), (buf, prop) -> prop.getObjFromID(buf.getByteToUnsignedInt())); + System.out.println("Recived [" + stateInfo + "] with " + newProperties); final Map properties; synchronized (CURRENTLY_LOADED_STATES) { properties = diff --git a/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java b/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java index 5f1b8c422..8d16ab48e 100644 --- a/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java +++ b/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java @@ -472,6 +472,7 @@ private static void sendToPlayer(final SignalStateInfo stateInfo, final ChangedState state) { if (properties == null || properties.isEmpty()) return; + System.out.println("Sending [" + stateInfo + "] with " + properties); sendTo(player, packToByteBuffer(stateInfo, properties, state)); } @@ -479,6 +480,7 @@ private static void sendToAll(final SignalStateInfo stateInfo, final Map properties, final ChangedState state) { if (properties == null || properties.isEmpty()) return; + System.out.println("Sending [" + stateInfo + "] with " + properties); final ByteBuffer buffer = packToByteBuffer(stateInfo, properties, state); stateInfo.world.playerEntities.forEach(playerEntity -> sendTo(playerEntity, buffer)); } From afec5b776765ada716ddabff6f5d9c04903cfbfa Mon Sep 17 00:00:00 2001 From: Cedric Date: Tue, 24 Feb 2026 10:16:14 +0100 Subject: [PATCH 50/61] ref: added more debug output --- .../com/troblecodings/signals/handler/SignalStateHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java b/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java index 8d16ab48e..05d0969f0 100644 --- a/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java +++ b/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java @@ -472,7 +472,7 @@ private static void sendToPlayer(final SignalStateInfo stateInfo, final ChangedState state) { if (properties == null || properties.isEmpty()) return; - System.out.println("Sending [" + stateInfo + "] with " + properties); + System.out.println("Sending [" + stateInfo + "] with " + properties + " to " + player); sendTo(player, packToByteBuffer(stateInfo, properties, state)); } @@ -480,7 +480,7 @@ private static void sendToAll(final SignalStateInfo stateInfo, final Map properties, final ChangedState state) { if (properties == null || properties.isEmpty()) return; - System.out.println("Sending [" + stateInfo + "] with " + properties); + System.out.println("Sending [" + stateInfo + "] with " + properties + " to all!"); final ByteBuffer buffer = packToByteBuffer(stateInfo, properties, state); stateInfo.world.playerEntities.forEach(playerEntity -> sendTo(playerEntity, buffer)); } From 224c92668f7c4009fbcb290615db826bea41c728 Mon Sep 17 00:00:00 2001 From: Cedric Date: Tue, 24 Feb 2026 10:33:02 +0100 Subject: [PATCH 51/61] ref: new debug --- .../com/troblecodings/signals/handler/SignalStateHandler.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java b/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java index 05d0969f0..494eb646f 100644 --- a/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java +++ b/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java @@ -480,7 +480,8 @@ private static void sendToAll(final SignalStateInfo stateInfo, final Map properties, final ChangedState state) { if (properties == null || properties.isEmpty()) return; - System.out.println("Sending [" + stateInfo + "] with " + properties + " to all!"); + System.out.println("Sending [" + stateInfo + "] with " + properties + " to " + + stateInfo.world.playerEntities); final ByteBuffer buffer = packToByteBuffer(stateInfo, properties, state); stateInfo.world.playerEntities.forEach(playerEntity -> sendTo(playerEntity, buffer)); } @@ -512,6 +513,7 @@ public static void onChunkWatch(final ChunkWatchEvent.Watch event) { final SignalTileEntity signalTile = (SignalTileEntity) tile; final SignalStateInfo info = new SignalStateInfo(world, pos, signalTile.getSignal()); + System.out.println("Loading " + info + " for " + player); states.add(new SignalStateLoadHoler(info, new LoadHolder<>(player))); } }); From 5e483cd2835ce9d90ed80a320025b57c5cbcbd71 Mon Sep 17 00:00:00 2001 From: Cedric Date: Tue, 24 Feb 2026 10:57:32 +0100 Subject: [PATCH 52/61] ref: changed debug --- .../signals/handler/SignalStateHandler.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java b/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java index 494eb646f..9d7a74052 100644 --- a/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java +++ b/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java @@ -470,16 +470,23 @@ private static void sendTo(final SignalStateInfo info, final Map properties, final EntityPlayer player, final ChangedState state) { - if (properties == null || properties.isEmpty()) + if (properties == null || properties.isEmpty()) { + System.out.println("Returning Sending for " + player + " because properties is empty"); return; + } + System.out.println("Sending [" + stateInfo + "] with " + properties + " to " + player); sendTo(player, packToByteBuffer(stateInfo, properties, state)); } private static void sendToAll(final SignalStateInfo stateInfo, final Map properties, final ChangedState state) { - if (properties == null || properties.isEmpty()) + if (properties == null || properties.isEmpty()) { + System.out.println("Returning Sending for " + stateInfo.world.playerEntities + + " because properties is empty"); return; + } + System.out.println("Sending [" + stateInfo + "] with " + properties + " to " + stateInfo.world.playerEntities); final ByteBuffer buffer = packToByteBuffer(stateInfo, properties, state); @@ -553,8 +560,10 @@ public static void loadSignal(final SignalStateLoadHoler info, public static void loadSignals(final List signals, final @Nullable EntityPlayer player) { - if (signals == null || signals.isEmpty()) + if (signals == null || signals.isEmpty()) { + System.out.println("Returning load of list for " + player + "because empty!"); return; + } THREAD_SERVICE.execute(() -> { signals.forEach(info -> { boolean isLoaded = false; From c98eb5963125f9a3c6645102e8223f6ada35b512 Mon Sep 17 00:00:00 2001 From: Cedric Date: Tue, 24 Feb 2026 10:59:03 +0100 Subject: [PATCH 53/61] ref; changed debug --- .../troblecodings/signals/handler/SignalStateHandler.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java b/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java index 9d7a74052..b994b3ee2 100644 --- a/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java +++ b/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java @@ -471,7 +471,8 @@ private static void sendToPlayer(final SignalStateInfo stateInfo, final Map properties, final EntityPlayer player, final ChangedState state) { if (properties == null || properties.isEmpty()) { - System.out.println("Returning Sending for " + player + " because properties is empty"); + System.out.println("Returning Sending of " + stateInfo + " for " + player + + " because properties is empty"); return; } @@ -482,8 +483,8 @@ private static void sendToPlayer(final SignalStateInfo stateInfo, private static void sendToAll(final SignalStateInfo stateInfo, final Map properties, final ChangedState state) { if (properties == null || properties.isEmpty()) { - System.out.println("Returning Sending for " + stateInfo.world.playerEntities - + " because properties is empty"); + System.out.println("Returning Sending of " + stateInfo + "for " + + stateInfo.world.playerEntities + " because properties is empty"); return; } From 4f738d78d537ba5f7a914bdf1fdaccb60763fd86 Mon Sep 17 00:00:00 2001 From: Cedric Date: Tue, 24 Feb 2026 11:11:26 +0100 Subject: [PATCH 54/61] ref: hopefully fixed issue with missing signals --- .../troblecodings/signals/handler/SignalStateHandler.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java b/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java index b994b3ee2..a5c5e530f 100644 --- a/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java +++ b/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java @@ -579,11 +579,8 @@ public static void loadSignals(final List signals, } } if (isLoaded) { - Map sendProperties; - synchronized (CURRENTLY_LOADED_STATES) { - sendProperties = CURRENTLY_LOADED_STATES.get(info.info); - } - sendTo(info.info, sendProperties, player, ChangedState.ADDED_TO_CACHE); + runTaskWhenSignalLoaded(info.info, (stateInfo, props, _u) -> sendTo(stateInfo, + props, player, ChangedState.ADDED_TO_CACHE)); return; } final Map properties = readAndSerialize(info.info); From a8bfabc7c45a15169404fb365ecbbe0f2ce9726f Mon Sep 17 00:00:00 2001 From: Cedric Date: Tue, 24 Feb 2026 11:33:37 +0100 Subject: [PATCH 55/61] ref: removed debug --- .../handler/ClientSignalStateHandler.java | 1 - .../signals/handler/SignalStateHandler.java | 20 +++---------------- 2 files changed, 3 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java b/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java index 557131de0..326378deb 100644 --- a/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java +++ b/src/main/java/com/troblecodings/signals/handler/ClientSignalStateHandler.java @@ -52,7 +52,6 @@ public void deserializeClient(final ReadBuffer buffer) { final Map newProperties = buffer.getMapWithCombinedValueFunc( NetworkBufferWrappers.getSEPropertyFunc(signal), (buf, prop) -> prop.getObjFromID(buf.getByteToUnsignedInt())); - System.out.println("Recived [" + stateInfo + "] with " + newProperties); final Map properties; synchronized (CURRENTLY_LOADED_STATES) { properties = diff --git a/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java b/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java index a5c5e530f..6bf9f5dbd 100644 --- a/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java +++ b/src/main/java/com/troblecodings/signals/handler/SignalStateHandler.java @@ -470,26 +470,15 @@ private static void sendTo(final SignalStateInfo info, final Map properties, final EntityPlayer player, final ChangedState state) { - if (properties == null || properties.isEmpty()) { - System.out.println("Returning Sending of " + stateInfo + " for " + player - + " because properties is empty"); + if (properties == null || properties.isEmpty()) return; - } - - System.out.println("Sending [" + stateInfo + "] with " + properties + " to " + player); sendTo(player, packToByteBuffer(stateInfo, properties, state)); } private static void sendToAll(final SignalStateInfo stateInfo, final Map properties, final ChangedState state) { - if (properties == null || properties.isEmpty()) { - System.out.println("Returning Sending of " + stateInfo + "for " - + stateInfo.world.playerEntities + " because properties is empty"); + if (properties == null || properties.isEmpty()) return; - } - - System.out.println("Sending [" + stateInfo + "] with " + properties + " to " - + stateInfo.world.playerEntities); final ByteBuffer buffer = packToByteBuffer(stateInfo, properties, state); stateInfo.world.playerEntities.forEach(playerEntity -> sendTo(playerEntity, buffer)); } @@ -521,7 +510,6 @@ public static void onChunkWatch(final ChunkWatchEvent.Watch event) { final SignalTileEntity signalTile = (SignalTileEntity) tile; final SignalStateInfo info = new SignalStateInfo(world, pos, signalTile.getSignal()); - System.out.println("Loading " + info + " for " + player); states.add(new SignalStateLoadHoler(info, new LoadHolder<>(player))); } }); @@ -561,10 +549,8 @@ public static void loadSignal(final SignalStateLoadHoler info, public static void loadSignals(final List signals, final @Nullable EntityPlayer player) { - if (signals == null || signals.isEmpty()) { - System.out.println("Returning load of list for " + player + "because empty!"); + if (signals == null || signals.isEmpty()) return; - } THREAD_SERVICE.execute(() -> { signals.forEach(info -> { boolean isLoaded = false; From 44f3d0edb618f918e1cfd86cbfa75b22c99aa672 Mon Sep 17 00:00:00 2001 From: Cedric Date: Thu, 26 Feb 2026 23:39:12 +0100 Subject: [PATCH 56/61] feat: added config option for blocking of RS path with activated input --- .../com/troblecodings/signals/config/ConfigHandler.java | 6 +++++- .../com/troblecodings/signals/signalbox/PathwayData.java | 7 ++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/troblecodings/signals/config/ConfigHandler.java b/src/main/java/com/troblecodings/signals/config/ConfigHandler.java index 769502ea2..4d63e2590 100644 --- a/src/main/java/com/troblecodings/signals/config/ConfigHandler.java +++ b/src/main/java/com/troblecodings/signals/config/ConfigHandler.java @@ -26,9 +26,13 @@ private ConfigHandler() { public static int lightEmission = 1; @Name("canAddRSPathToSaver") - @Comment("ShuntingPaths can be added to PathwaySaver.") + @Comment("ShuntingPaths can be added to PathwaySaver. Default: false") public static boolean canAddRSPathToSaver = false; + @Name("canInputBlockShuntingPath") + @Comment("Choose wether a blocking input can prevent setting a shunting path. Default: false") + public static boolean canInputBlockShuntingPath = false; + @Name("Signalbox background color") @Comment("Change the background color of the signalbox gui. Default: -7631989") public static int signalboxBackgroundColor = 0xFF8B8B8B; diff --git a/src/main/java/com/troblecodings/signals/signalbox/PathwayData.java b/src/main/java/com/troblecodings/signals/signalbox/PathwayData.java index 68807edd4..c1f6430e5 100644 --- a/src/main/java/com/troblecodings/signals/signalbox/PathwayData.java +++ b/src/main/java/com/troblecodings/signals/signalbox/PathwayData.java @@ -23,6 +23,7 @@ import com.google.common.collect.ImmutableMap; import com.troblecodings.core.NBTWrapper; import com.troblecodings.signals.OpenSignalsMain; +import com.troblecodings.signals.config.ConfigHandler; import com.troblecodings.signals.core.BlockPosSignalHolder; import com.troblecodings.signals.core.JsonEnumHolder; import com.troblecodings.signals.core.ModeIdentifier; @@ -50,6 +51,8 @@ public class PathwayData { private static final String LIST_OF_PROTECTIONWAY_NODES = "listOfProtectionWayNodes"; private static final String PATH_TYPE = "pathType"; private static final String IS_INTERSIGNALBOX_PATHWAY = "isInterSignalBoxPathway"; + private static final boolean CAN_INPUT_BLOCK_SHUNTING_PATH = + ConfigHandler.canInputBlockShuntingPath; protected SignalBoxGrid grid = null; private final Map mapOfResetPositions = new HashMap<>(); @@ -160,7 +163,9 @@ private boolean checkForShuntingPath() { this.initalize(); break; } - if (current.isUsedInDirection(oldPos, EnumPathUsage.PROTECTED)) + if (current.isUsedInDirection(oldPos, EnumPathUsage.PROTECTED) + || (CAN_INPUT_BLOCK_SHUNTING_PATH + && SignalBoxUtil.isPathBlocked(grid, current, path))) return false; } return true; From 9cb2c754e8faec5374bf3c43e2acbc3208317c2c Mon Sep 17 00:00:00 2001 From: Skywalkervalle <64580908+Skywalkervalle@users.noreply.github.com> Date: Wed, 11 Feb 2026 20:14:04 +0100 Subject: [PATCH 57/61] Update mast_lamp Small fix: - Change texture path (from "opensignals:blocks/default/orange" to "opensignals:blocks/lamps/lamp_yellow") - change UV for "lamp" --- .../opensignals/models/block/mast_lamps.json | 115 +++++++++++++++++- 1 file changed, 114 insertions(+), 1 deletion(-) diff --git a/src/main/resources/assets/opensignals/models/block/mast_lamps.json b/src/main/resources/assets/opensignals/models/block/mast_lamps.json index aab5cfba8..e2fa0fe5f 100644 --- a/src/main/resources/assets/opensignals/models/block/mast_lamps.json +++ b/src/main/resources/assets/opensignals/models/block/mast_lamps.json @@ -1 +1,114 @@ -{"credit": "Made with Blockbench by Mc_Jeronimo", "textures": {"1": "opensignals:blocks/default/yellow", "2": "opensignals:blocks/default/orange", "particle": "opensignals:blocks/default/yellow"}, "elements": [{"name": "lamp body", "from": [9, 10, 7], "to": [12, 12, 9], "faces": {"north": {"uv": [0, 0, 3, 2], "texture": "#1"}, "east": {"uv": [0, 0, 2, 2], "texture": "#1"}, "south": {"uv": [0, 0, 3, 2], "texture": "#1"}, "west": {"uv": [0, 0, 2, 2], "texture": "#1"}, "up": {"uv": [0, 0, 3, 2], "texture": "#1"}, "down": {"uv": [0, 0, 3, 2], "texture": "#1"}}}, {"name": "lamp", "from": [10, 12, 7.5], "to": [11, 12.5, 8.5], "faces": {"north": {"uv": [0, 0, 2, 2], "texture": "#2"}, "east": {"uv": [0, 0, 2, 2], "texture": "#2"}, "south": {"uv": [0, 0, 2, 2], "texture": "#2"}, "west": {"uv": [0, 0, 2, 2], "texture": "#2"}, "up": {"uv": [0, 0, 2, 2], "texture": "#2"}, "down": {"uv": [0, 0, 2, 2], "texture": "#2"}}}, {"name": "lamp", "from": [10, 13.5, 7.5], "to": [11, 14, 8.5], "faces": {"north": {"uv": [0, 0, 2, 2], "texture": "#2"}, "east": {"uv": [0, 0, 2, 2], "texture": "#2"}, "south": {"uv": [0, 0, 2, 2], "texture": "#2"}, "west": {"uv": [0, 0, 2, 2], "texture": "#2"}, "up": {"uv": [0, 0, 2, 2], "texture": "#2"}, "down": {"uv": [0, 0, 2, 2], "texture": "#2"}}}, {"name": "lamp", "from": [9.5, 12.5, 7.5], "to": [11.5, 13.5, 8.5], "faces": {"north": {"uv": [0, 0, 2, 2], "texture": "#2"}, "east": {"uv": [0, 0, 2, 2], "texture": "#2"}, "south": {"uv": [0, 0, 2, 2], "texture": "#2"}, "west": {"uv": [0, 0, 2, 2], "texture": "#2"}, "up": {"uv": [0, 0, 2, 2], "texture": "#2"}, "down": {"uv": [0, 0, 2, 2], "texture": "#2"}}}, {"name": "lamp body", "from": [4, 4, 7], "to": [7, 6, 9], "faces": {"north": {"uv": [0, 0, 3, 2], "texture": "#1"}, "east": {"uv": [0, 0, 2, 2], "texture": "#1"}, "south": {"uv": [0, 0, 3, 2], "texture": "#1"}, "west": {"uv": [0, 0, 2, 2], "texture": "#1"}, "up": {"uv": [0, 0, 3, 2], "texture": "#1"}, "down": {"uv": [0, 0, 3, 2], "texture": "#1"}}}, {"name": "lamp", "from": [5, 6, 7.5], "to": [6, 6.5, 8.5], "faces": {"north": {"uv": [0, 0, 2, 2], "texture": "#2"}, "east": {"uv": [0, 0, 2, 2], "texture": "#2"}, "south": {"uv": [0, 0, 2, 2], "texture": "#2"}, "west": {"uv": [0, 0, 2, 2], "texture": "#2"}, "up": {"uv": [0, 0, 2, 2], "texture": "#2"}, "down": {"uv": [0, 0, 2, 2], "texture": "#2"}}}, {"name": "lamp", "from": [4.5, 6.5, 7.5], "to": [6.5, 7.5, 8.5], "faces": {"north": {"uv": [0, 0, 2, 2], "texture": "#2"}, "east": {"uv": [0, 0, 2, 2], "texture": "#2"}, "south": {"uv": [0, 0, 2, 2], "texture": "#2"}, "west": {"uv": [0, 0, 2, 2], "texture": "#2"}, "up": {"uv": [0, 0, 2, 2], "texture": "#2"}, "down": {"uv": [0, 0, 2, 2], "texture": "#2"}}}, {"name": "lamp", "from": [5, 7.5, 7.5], "to": [6, 8, 8.5], "faces": {"north": {"uv": [0, 0, 2, 2], "texture": "#2"}, "east": {"uv": [0, 0, 2, 2], "texture": "#2"}, "south": {"uv": [0, 0, 2, 2], "texture": "#2"}, "west": {"uv": [0, 0, 2, 2], "texture": "#2"}, "up": {"uv": [0, 0, 2, 2], "texture": "#2"}, "down": {"uv": [0, 0, 2, 2], "texture": "#2"}}}]} \ No newline at end of file +{ + "credit": "Made with Blockbench by Mc_Jeronimo modded by SkywalkerValle", + "textures": { + "1": "opensignals:blocks/default/yellow", + "3": "opensignals:blocks/lamps/lamp_yellow", + "particle": "opensignals:blocks/default/yellow" + }, + "elements": [ + { + "name": "lamp body", + "from": [9, 10, 7], + "to": [12, 12, 9], + "faces": { + "north": {"uv": [0, 0, 3, 2], "texture": "#1"}, + "east": {"uv": [0, 0, 2, 2], "texture": "#1"}, + "south": {"uv": [0, 0, 3, 2], "texture": "#1"}, + "west": {"uv": [0, 0, 2, 2], "texture": "#1"}, + "up": {"uv": [0, 0, 3, 2], "texture": "#1"}, + "down": {"uv": [0, 0, 3, 2], "texture": "#1"} + } + }, + { + "name": "lamp", + "from": [10, 12, 7.5], + "to": [11, 12.5, 8.5], + "faces": { + "north": {"uv": [1, 1, 3, 3], "texture": "#3"}, + "east": {"uv": [1, 1, 3, 3], "texture": "#3"}, + "south": {"uv": [1, 1, 3, 3], "texture": "#3"}, + "west": {"uv": [1, 1, 3, 3], "texture": "#3"}, + "up": {"uv": [1, 1, 3, 3], "texture": "#3"}, + "down": {"uv": [1, 1, 3, 3], "texture": "#3"} + } + }, + { + "name": "lamp", + "from": [10, 13.5, 7.5], + "to": [11, 14, 8.5], + "faces": { + "north": {"uv": [1, 1, 3, 3], "texture": "#3"}, + "east": {"uv": [1, 1, 3, 3], "texture": "#3"}, + "south": {"uv": [1, 1, 3, 3], "texture": "#3"}, + "west": {"uv": [1, 1, 3, 3], "texture": "#3"}, + "up": {"uv": [1, 1, 3, 3], "texture": "#3"}, + "down": {"uv": [1, 1, 3, 3], "texture": "#3"} + } + }, + { + "name": "lamp", + "from": [9.5, 12.5, 7.5], + "to": [11.5, 13.5, 8.5], + "faces": { + "north": {"uv": [1, 1, 3, 3], "texture": "#3"}, + "east": {"uv": [1, 1, 3, 3], "texture": "#3"}, + "south": {"uv": [1, 1, 3, 3], "texture": "#3"}, + "west": {"uv": [1, 1, 3, 3], "texture": "#3"}, + "up": {"uv": [1, 1, 3, 3], "texture": "#3"}, + "down": {"uv": [1, 1, 3, 3], "texture": "#3"} + } + }, + { + "name": "lamp body", + "from": [4, 4, 7], + "to": [7, 6, 9], + "faces": { + "north": {"uv": [0, 0, 3, 2], "texture": "#1"}, + "east": {"uv": [0, 0, 2, 2], "texture": "#1"}, + "south": {"uv": [0, 0, 3, 2], "texture": "#1"}, + "west": {"uv": [0, 0, 2, 2], "texture": "#1"}, + "up": {"uv": [0, 0, 3, 2], "texture": "#1"}, + "down": {"uv": [0, 0, 3, 2], "texture": "#1"} + } + }, + { + "name": "lamp", + "from": [5, 6, 7.5], + "to": [6, 6.5, 8.5], + "faces": { + "north": {"uv": [1, 1, 3, 3], "texture": "#3"}, + "east": {"uv": [1, 1, 3, 3], "texture": "#3"}, + "south": {"uv": [1, 1, 3, 3], "texture": "#3"}, + "west": {"uv": [1, 1, 3, 3], "texture": "#3"}, + "up": {"uv": [1, 1, 3, 3], "texture": "#3"}, + "down": {"uv": [1, 1, 3, 3], "texture": "#3"} + } + }, + { + "name": "lamp", + "from": [4.5, 6.5, 7.5], + "to": [6.5, 7.5, 8.5], + "faces": { + "north": {"uv": [1, 1, 3, 3], "texture": "#3"}, + "east": {"uv": [1, 1, 3, 3], "texture": "#3"}, + "south": {"uv": [1, 1, 3, 3], "texture": "#3"}, + "west": {"uv": [1, 1, 3, 3], "texture": "#3"}, + "up": {"uv": [1, 1, 3, 3], "texture": "#3"}, + "down": {"uv": [1, 1, 3, 3], "texture": "#3"} + } + }, + { + "name": "lamp", + "from": [5, 7.5, 7.5], + "to": [6, 8, 8.5], + "faces": { + "north": {"uv": [1, 1, 3, 3], "texture": "#3"}, + "east": {"uv": [1, 1, 3, 3], "texture": "#3"}, + "south": {"uv": [1, 1, 3, 3], "texture": "#3"}, + "west": {"uv": [1, 1, 3, 3], "texture": "#3"}, + "up": {"uv": [1, 1, 3, 3], "texture": "#3"}, + "down": {"uv": [1, 1, 3, 3], "texture": "#3"} + } + } + ] +} \ No newline at end of file From 19de0fcc08a360d6863e9474ab0d1037233c2ff8 Mon Sep 17 00:00:00 2001 From: Skywalkervalle <64580908+Skywalkervalle@users.noreply.github.com> Date: Fri, 13 Feb 2026 21:55:11 +0100 Subject: [PATCH 58/61] fix Zs8 for Hl-Signalsytem --- .../assets/opensignals/signalconfigs/subsidiary/hl.json | 1 - .../assets/opensignals/signalconfigs/subsidiary/hlbridge.json | 1 - 2 files changed, 2 deletions(-) diff --git a/src/main/resources/assets/opensignals/signalconfigs/subsidiary/hl.json b/src/main/resources/assets/opensignals/signalconfigs/subsidiary/hl.json index 77fcf364d..d1e4f02b3 100644 --- a/src/main/resources/assets/opensignals/signalconfigs/subsidiary/hl.json +++ b/src/main/resources/assets/opensignals/signalconfigs/subsidiary/hl.json @@ -13,7 +13,6 @@ "ZS8": [ "zs2.ZS8", "mainlightsignallightbar.OFF", - "zs2.OFF", "zs2v.OFF" ], "ZP9": [ diff --git a/src/main/resources/assets/opensignals/signalconfigs/subsidiary/hlbridge.json b/src/main/resources/assets/opensignals/signalconfigs/subsidiary/hlbridge.json index 5f3b41996..0fd059837 100644 --- a/src/main/resources/assets/opensignals/signalconfigs/subsidiary/hlbridge.json +++ b/src/main/resources/assets/opensignals/signalconfigs/subsidiary/hlbridge.json @@ -13,7 +13,6 @@ "ZS8": [ "zs2.ZS8", "mainlightsignallightbar.OFF", - "zs2.OFF", "zs2v.OFF" ], "ZP9": [ From 4d509be4c62317f8a27ce0eff4f9de203e200531 Mon Sep 17 00:00:00 2001 From: Skywalkervalle <64580908+Skywalkervalle@users.noreply.github.com> Date: Sun, 15 Feb 2026 20:45:24 +0100 Subject: [PATCH 59/61] fix upper UV at ks_mast -> now green and not any more transparent --- .../opensignals/models/block/ks/ks_mast1.json | 32 +++++++++++++++++- .../opensignals/models/block/ks/ks_mast2.json | 32 +++++++++++++++++- .../opensignals/models/block/ks/ks_mast3.json | 32 +++++++++++++++++- .../opensignals/models/block/ks/ks_mast4.json | 33 ++++++++++++++++++- 4 files changed, 125 insertions(+), 4 deletions(-) diff --git a/src/main/resources/assets/opensignals/models/block/ks/ks_mast1.json b/src/main/resources/assets/opensignals/models/block/ks/ks_mast1.json index 7ecbb565f..cc9ce0063 100644 --- a/src/main/resources/assets/opensignals/models/block/ks/ks_mast1.json +++ b/src/main/resources/assets/opensignals/models/block/ks/ks_mast1.json @@ -1 +1,31 @@ -{"credit": "Made with Blockbench by Mc_Jeronimo", "texture_size": [32, 32], "textures": {"0": "opensignals:blocks/default/mast", "particle": "opensignals:blocks/default/mast"}, "elements": [{"name": "mast4", "from": [7, 0, 10], "to": [9, 16, 13], "faces": {"north": {"uv": [0, 0, 1, 8], "texture": "#0"}, "east": {"uv": [0, 0, 0.5, 8], "texture": "#0"}, "south": {"uv": [0, 0, 1, 8], "texture": "#0"}, "west": {"uv": [0, 0, 0.5, 8], "texture": "#0"}, "down": {"uv": [0, 0, 1, 0.5], "texture": "#0"}}}], "groups": [{"name": "mast2", "origin": [-8, 32, -27], "children": [0]}]} \ No newline at end of file +{ + "credit": "Made with Blockbench by Mc_Jeronimo", + "texture_size": [32, 32], + "textures": { + "0": "opensignals:blocks/default/mast", + "particle": "opensignals:blocks/default/mast" + }, + "elements": [ + { + "name": "mast4", + "from": [7, 0, 10], + "to": [9, 16, 13], + "faces": { + "north": {"uv": [0, 0, 1, 8], "texture": "#0"}, + "east": {"uv": [0, 0, 0.5, 8], "texture": "#0"}, + "south": {"uv": [0, 0, 1, 8], "texture": "#0"}, + "west": {"uv": [0, 0, 0.5, 8], "texture": "#0"}, + "up": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "down": {"uv": [0, 0, 1, 0.5], "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "mast2", + "origin": [-8, 32, -27], + "color": 0, + "children": [0] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/opensignals/models/block/ks/ks_mast2.json b/src/main/resources/assets/opensignals/models/block/ks/ks_mast2.json index 048c02e53..1da12c2ba 100644 --- a/src/main/resources/assets/opensignals/models/block/ks/ks_mast2.json +++ b/src/main/resources/assets/opensignals/models/block/ks/ks_mast2.json @@ -1 +1,31 @@ -{"credit": "Made with Blockbench by Mc_Jeronimo", "texture_size": [32, 32], "textures": {"0": "opensignals:blocks/default/mast", "particle": "opensignals:blocks/default/mast"}, "elements": [{"name": "mast5", "from": [7, 0, 10], "to": [9, 16, 13], "faces": {"north": {"uv": [0, 0, 1, 8], "texture": "#0"}, "east": {"uv": [0, 0, 0.5, 8], "texture": "#0"}, "south": {"uv": [0, 0, 1, 8], "texture": "#0"}, "west": {"uv": [0, 0, 0.5, 8], "texture": "#0"}, "down": {"uv": [0, 0, 1, 0.5], "texture": "#0"}}}], "groups": [{"name": "mast3", "origin": [-8, 48, -27], "children": [0]}]} \ No newline at end of file +{ + "credit": "Made with Blockbench by Mc_Jeronimo", + "texture_size": [32, 32], + "textures": { + "0": "opensignals:blocks/default/mast", + "particle": "opensignals:blocks/default/mast" + }, + "elements": [ + { + "name": "mast5", + "from": [7, 0, 10], + "to": [9, 16, 13], + "faces": { + "north": {"uv": [0, 0, 1, 8], "texture": "#0"}, + "east": {"uv": [0, 0, 0.5, 8], "texture": "#0"}, + "south": {"uv": [0, 0, 1, 8], "texture": "#0"}, + "west": {"uv": [0, 0, 0.5, 8], "texture": "#0"}, + "up": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "down": {"uv": [0, 0, 1, 0.5], "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "mast3", + "origin": [-8, 48, -27], + "color": 0, + "children": [0] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/opensignals/models/block/ks/ks_mast3.json b/src/main/resources/assets/opensignals/models/block/ks/ks_mast3.json index c6b53ed98..23451eccb 100644 --- a/src/main/resources/assets/opensignals/models/block/ks/ks_mast3.json +++ b/src/main/resources/assets/opensignals/models/block/ks/ks_mast3.json @@ -1 +1,31 @@ -{"credit": "Made with Blockbench by Mc_Jeronimo", "texture_size": [32, 32], "textures": {"0": "opensignals:blocks/default/mast", "particle": "opensignals:blocks/default/mast"}, "elements": [{"name": "mast6", "from": [7, 0, 10], "to": [9, 16, 13], "faces": {"north": {"uv": [0, 0, 1, 8], "texture": "#0"}, "east": {"uv": [0, 0, 0.5, 8], "texture": "#0"}, "south": {"uv": [0, 0, 1, 8], "texture": "#0"}, "west": {"uv": [0, 0, 0.5, 8], "texture": "#0"}, "down": {"uv": [0, 0, 1, 0.5], "texture": "#0"}}}], "groups": [{"name": "mast4", "origin": [-8, 64, -27], "children": [0]}]} \ No newline at end of file +{ + "credit": "Made with Blockbench by Mc_Jeronimo", + "texture_size": [32, 32], + "textures": { + "0": "opensignals:blocks/default/mast", + "particle": "opensignals:blocks/default/mast" + }, + "elements": [ + { + "name": "mast6", + "from": [7, 0, 10], + "to": [9, 16, 13], + "faces": { + "north": {"uv": [0, 0, 1, 8], "texture": "#0"}, + "east": {"uv": [0, 0, 0.5, 8], "texture": "#0"}, + "south": {"uv": [0, 0, 1, 8], "texture": "#0"}, + "west": {"uv": [0, 0, 0.5, 8], "texture": "#0"}, + "up": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "down": {"uv": [0, 0, 1, 0.5], "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "mast4", + "origin": [-8, 64, -27], + "color": 0, + "children": [0] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/opensignals/models/block/ks/ks_mast4.json b/src/main/resources/assets/opensignals/models/block/ks/ks_mast4.json index 498000656..85a5f37d1 100644 --- a/src/main/resources/assets/opensignals/models/block/ks/ks_mast4.json +++ b/src/main/resources/assets/opensignals/models/block/ks/ks_mast4.json @@ -1 +1,32 @@ -{"credit": "Made with Blockbench by Mc_Jeronimo", "texture_size": [32, 32], "textures": {"0": "opensignals:blocks/default/mast", "particle": "opensignals:blocks/default/mast"}, "elements": [{"name": "mast7", "from": [7, 0, 10], "to": [9, 16, 13], "faces": {"north": {"uv": [0, 0, 1, 8], "texture": "#0"}, "east": {"uv": [0, 0, 0.5, 8], "texture": "#0"}, "south": {"uv": [0, 0, 1, 8], "texture": "#0"}, "west": {"uv": [0, 0, 0.5, 8], "texture": "#0"}, "down": {"uv": [0, 0, 1, 0.5], "texture": "#0"}}}], "groups": [{"name": "mast5", "origin": [-8, 80, -27], "children": [0]}]} \ No newline at end of file +{ + "format_version": "1.21.11", + "credit": "Made with Blockbench by Mc_Jeronimo", + "texture_size": [32, 32], + "textures": { + "0": "opensignals:blocks/default/mast", + "particle": "opensignals:blocks/default/mast" + }, + "elements": [ + { + "name": "mast7", + "from": [7, 0, 10], + "to": [9, 16, 13], + "faces": { + "north": {"uv": [0, 0, 1, 8], "texture": "#0"}, + "east": {"uv": [0, 0, 0.5, 8], "texture": "#0"}, + "south": {"uv": [0, 0, 1, 8], "texture": "#0"}, + "west": {"uv": [0, 0, 0.5, 8], "texture": "#0"}, + "up": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "down": {"uv": [0, 0, 1, 0.5], "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "mast5", + "origin": [-8, 80, -27], + "color": 0, + "children": [0] + } + ] +} \ No newline at end of file From 0b1eafc1d845b56c24f6483d8dc01a34b9b816a3 Mon Sep 17 00:00:00 2001 From: Philipp Date: Tue, 3 Mar 2026 11:23:20 +0100 Subject: [PATCH 60/61] chore: update version and changelog --- .github/workflows/gradle.yml | 2 +- changelog.md | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 1f662f350..87ecbf481 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -30,7 +30,7 @@ jobs: if: endswith(github.ref_name, 'master') && github.ref_protected && github.ref_type == 'branch' runs-on: ubuntu-latest env: - APPVEYOR_BUILD_VERSION: '3.8.1' + APPVEYOR_BUILD_VERSION: '3.8.2' CURSETOKEN: ${{ secrets.CURSETOKEN }} steps: - uses: actions/checkout@v3 diff --git a/changelog.md b/changelog.md index bd805eb0f..4782ed0a3 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,19 @@ # Changelog +## [1.12.2 - 3.8.2] +* feat: added config option to block shunting path with active redstone input +* feat/fix: pathway can't be set with active subsidiary +* fix: signal name not loaded in signalbox +* fix: semaphore signal animation +* fix: issue with wrong signal data in SignalController +* fix: client signal property (network) loading +* fix: mast_lamps glowing lamps and ks signal mast model +* fix: hl subsidiary config +* fix: minor fixes +* ref/fix: client-server signalsystem mismatch +* ref: new signalbox networking system +* ref: client animation update trigger + ## [1.12.2 - 3.8.1] * fix: issues with loading NBT data of signal box * fix: issues with setting pathway with a overlap nearby From 5221041bf4be050cb207dc3ad14542c4de7e9ac8 Mon Sep 17 00:00:00 2001 From: Cedric Date: Thu, 5 Mar 2026 08:55:42 +0100 Subject: [PATCH 61/61] ref: better test performance --- .../signals/test/SignalBoxNetworkTest.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/test/java/com/troblecodings/signals/test/SignalBoxNetworkTest.java b/src/test/java/com/troblecodings/signals/test/SignalBoxNetworkTest.java index e72cad0c7..78eef571f 100644 --- a/src/test/java/com/troblecodings/signals/test/SignalBoxNetworkTest.java +++ b/src/test/java/com/troblecodings/signals/test/SignalBoxNetworkTest.java @@ -43,6 +43,12 @@ public static void setUpFactory() { SignalBoxFactory.setUpFactoryForTests(); } + @BeforeEach + public void initializeNewGridAndNetwork() { + grid = new SignalBoxGrid(null); + handler = new DebugNetworkHandler(grid); + } + @Test public void testAddAndRemoveMode() { final Map modes = new HashMap<>(); @@ -152,12 +158,6 @@ public void testManuellOutput() { }); } - @BeforeEach - public void initializeNewGridAndNetwork() { - grid = new SignalBoxGrid(null); - handler = new DebugNetworkHandler(grid); - } - private Point getRandPoint() { return new Point(RANDOM.nextInt(101), RANDOM.nextInt(101)); }