From 0b43951ee1e439728ecccaa397bc0e31554300f6 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 20 Oct 2026 18:20:14 +0000 Subject: [PATCH 1/3] Fix empty scripting drives exposing a disk with ID -1 An empty drive added disk -1 to the network, which the scripting terminal then showed as an available disk. Replacing a disk in a drive by another one also kept the old disk in the network. Drives now only expose the disk they contain. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_018MRyTdV3fSV5Q5NPGep4q9 --- .../BlockEntityScriptingDrive.java | 6 +- .../network/ScriptingDriveNetworkElement.java | 9 ++- .../gametest/GameTestsScriptingDrive.java | 55 +++++++++++++++++++ 3 files changed, 66 insertions(+), 4 deletions(-) create mode 100644 src/main/java/org/cyclops/integratedscripting/gametest/GameTestsScriptingDrive.java diff --git a/src/main/java/org/cyclops/integratedscripting/blockentity/BlockEntityScriptingDrive.java b/src/main/java/org/cyclops/integratedscripting/blockentity/BlockEntityScriptingDrive.java index 7aec35dbb..c62b64881 100644 --- a/src/main/java/org/cyclops/integratedscripting/blockentity/BlockEntityScriptingDrive.java +++ b/src/main/java/org/cyclops/integratedscripting/blockentity/BlockEntityScriptingDrive.java @@ -102,9 +102,11 @@ public void setExposedDiskId(int exposedDiskId) { this.onDirty(); ScriptingNetworkHelpers.getScriptingNetwork(getNetwork()) .ifPresent(scriptingNetwork -> { - if (exposedDiskId == -1) { + // Also remove the old disk when it is directly replaced by another one + if (oldExposedDiskId >= 0) { scriptingNetwork.removeDisk(oldExposedDiskId); - } else { + } + if (exposedDiskId >= 0) { scriptingNetwork.addDisk(exposedDiskId); } }); diff --git a/src/main/java/org/cyclops/integratedscripting/core/network/ScriptingDriveNetworkElement.java b/src/main/java/org/cyclops/integratedscripting/core/network/ScriptingDriveNetworkElement.java index a08485951..0568b0496 100644 --- a/src/main/java/org/cyclops/integratedscripting/core/network/ScriptingDriveNetworkElement.java +++ b/src/main/java/org/cyclops/integratedscripting/core/network/ScriptingDriveNetworkElement.java @@ -42,7 +42,10 @@ public boolean onNetworkAddition(INetwork network) { if(super.onNetworkAddition(network)) { return ScriptingNetworkHelpers.getScriptingNetwork(network) .map(scriptingNetwork -> { - scriptingNetwork.addDisk(getId()); + // An empty drive has no disk to expose + if (getId() >= 0) { + scriptingNetwork.addDisk(getId()); + } return true; }) .orElse(false); @@ -55,7 +58,9 @@ public void onNetworkRemoval(INetwork network) { super.onNetworkRemoval(network); ScriptingNetworkHelpers.getScriptingNetwork(network) .ifPresent(scriptingNetwork -> { - scriptingNetwork.removeDisk(getId()); + if (getId() >= 0) { + scriptingNetwork.removeDisk(getId()); + } }); } diff --git a/src/main/java/org/cyclops/integratedscripting/gametest/GameTestsScriptingDrive.java b/src/main/java/org/cyclops/integratedscripting/gametest/GameTestsScriptingDrive.java new file mode 100644 index 000000000..b684c1d5c --- /dev/null +++ b/src/main/java/org/cyclops/integratedscripting/gametest/GameTestsScriptingDrive.java @@ -0,0 +1,55 @@ +package org.cyclops.integratedscripting.gametest; + +import net.minecraft.core.BlockPos; +import net.minecraft.gametest.framework.GameTest; +import net.minecraft.gametest.framework.GameTestHelper; +import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.gametest.GameTestHolder; +import net.neoforged.neoforge.gametest.PrefixGameTestTemplate; +import org.cyclops.integrateddynamics.RegistryEntries; +import org.cyclops.integratedscripting.Reference; +import org.cyclops.integratedscripting.blockentity.BlockEntityScriptingDrive; +import org.cyclops.integratedscripting.core.network.ScriptingNetworkHelpers; + +import java.util.Set; + +@GameTestHolder(Reference.MOD_ID) +@PrefixGameTestTemplate(false) +public class GameTestsScriptingDrive { + + public static final String TEMPLATE_EMPTY = "empty10"; + public static final BlockPos POS = BlockPos.ZERO.offset(2, 0, 2); + + @GameTest(template = TEMPLATE_EMPTY) + public void testScriptingDriveExposedDisks(GameTestHelper helper) { + // An empty drive in a network + helper.setBlock(POS, RegistryEntries.BLOCK_CABLE.value()); + helper.setBlock(POS.south(), org.cyclops.integratedscripting.RegistryEntries.BLOCK_SCRIPTING_DRIVE.value()); + BlockEntityScriptingDrive drive = helper.getBlockEntity(POS.south()); + assertDisks(helper, drive, Set.of()); + + // Insert a disk + ItemStack disk1 = new ItemStack(org.cyclops.integratedscripting.RegistryEntries.ITEM_SCRIPTING_DISK); + int id1 = org.cyclops.integratedscripting.RegistryEntries.ITEM_SCRIPTING_DISK.get().getOrCreateDiskId(disk1); + drive.getInventory().setItem(0, disk1); + assertDisks(helper, drive, Set.of(id1)); + + // Swap it for another disk + ItemStack disk2 = new ItemStack(org.cyclops.integratedscripting.RegistryEntries.ITEM_SCRIPTING_DISK); + int id2 = org.cyclops.integratedscripting.RegistryEntries.ITEM_SCRIPTING_DISK.get().getOrCreateDiskId(disk2); + drive.getInventory().setItem(0, disk2); + assertDisks(helper, drive, Set.of(id2)); + + // Remove it + drive.getInventory().setItem(0, ItemStack.EMPTY); + assertDisks(helper, drive, Set.of()); + + helper.succeed(); + } + + private static void assertDisks(GameTestHelper helper, BlockEntityScriptingDrive drive, Set expected) { + Set disks = ScriptingNetworkHelpers.getScriptingNetwork(drive.getNetwork()).orElseThrow().getDisks(); + helper.assertTrue(disks.equals(expected), "Expected disks " + expected + " but got " + disks); + } + +} From 8f8f4efe7da815b7946b7484fd9a00d6e1cf8c37 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 20 Oct 2026 18:20:14 +0000 Subject: [PATCH 2/3] Show a hint in the scripting terminal editor when no script is open The empty editor now tells the player what to do next: insert a Scripting Disk into a connected drive when there are no disks, click + to create a script when the disk is empty, or select a script from the list otherwise. The unusable editor and script list are also grayed out more clearly. The create and open-folder buttons are hidden while there are no disks, and the disk field no longer shows -1. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_018MRyTdV3fSV5Q5NPGep4q9 --- .../ContainerScreenTerminalScripting.java | 37 ++++++++++++++----- .../integratedscripting/lang/en_us.json | 3 ++ 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/cyclops/integratedscripting/client/gui/container/ContainerScreenTerminalScripting.java b/src/main/java/org/cyclops/integratedscripting/client/gui/container/ContainerScreenTerminalScripting.java index 2daa56804..71d89643d 100644 --- a/src/main/java/org/cyclops/integratedscripting/client/gui/container/ContainerScreenTerminalScripting.java +++ b/src/main/java/org/cyclops/integratedscripting/client/gui/container/ContainerScreenTerminalScripting.java @@ -3,7 +3,6 @@ import com.google.common.base.Strings; import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import com.mojang.blaze3d.systems.RenderSystem; import it.unimi.dsi.fastutil.ints.Int2ObjectAVLTreeMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import net.minecraft.client.KeyMapping; @@ -87,6 +86,8 @@ public class ContainerScreenTerminalScripting extends ContainerScreenExtended