1.1.6 Latest

April 19, 2026

New Features

Code Examples

Adding a custom block icon:

SpcNodeSchema schema = new SpcNodeSchema(
    typeId,
    SpcExecutionPhase.LOGIC_EVAL,
    inputPorts,
    outputPorts,
    parameters,
    /* requiresDisplay */ false,
    "Rotation Input",                 // displayName
    "RIN",                            // shortLabel
    "Reads Create rotation speed.",   // description
    "RI",                             // labelPrefix
    "createspc:textures/gui/nodes/rotation_input.png" // iconTexture (NEW in 1.1.6)
);

Backwards compatible: the existing 5-arg, 8-arg, and 9-arg SpcNodeSchema constructors continue to work unchanged (iconTexture defaults to null). Use schema.hasIcon() to check whether a custom texture was provided.

Registering a custom Python builtin:

// In your @Mod constructor or FMLCommonSetupEvent:
SpcPythonBuiltinRegistry.register("create_speed", args -> {
    if (args.isEmpty()) return SpcPythonValue.ofFloat(0.0);
    long shaftId = args.get(0).asLong();
    double rpm = MyCreateBridge.lookupSpeed(shaftId);
    return SpcPythonValue.ofFloat(rpm);
});

SpcPythonBuiltinRegistry.register("clamp01", args -> {
    double v = args.isEmpty() ? 0.0 : args.get(0).asDouble();
    return SpcPythonValue.ofFloat(Math.max(0.0, Math.min(1.0, v)));
});

Players can then call these from any Embedded Python block:

# Inside an Embedded Python block in the LOGO editor:
rpm = create_speed(101)
duty = clamp01(rpm / 256.0)
print("duty:", duty)

API Surface

Class / FieldPackagePurpose
SpcNodeSchema.iconTexture com.hypernova.spc.api.node Optional String ResourceLocation path for the block’s PNG icon.
SpcNodeSchema.hasIcon() com.hypernova.spc.api.node Helper returning true when iconTexture is non-null and non-empty.
SpcPythonBuiltinRegistry com.hypernova.spc.api.python Static, thread-safe, freezable registry for custom Python callables.
SpcPythonBuiltin com.hypernova.spc.api.python @FunctionalInterface taking List<SpcPythonValue> and returning SpcPythonValue.
SpcPythonValue com.hypernova.spc.api.python Boundary value type covering None, Bool, Int, Float, String. Factories: none(), ofBool, ofInt, ofFloat, ofString. Coercions: asBool, asLong, asDouble, asString.

Reserved Builtin Names

These names are reserved for the Embedded Python runtime and cannot be registered by addons (registration throws IllegalArgumentException):

input, print, bool, int, float, str, abs, min, max, len, set_signal_type.

Identifier validation also rejects names that aren’t valid Python identifiers, and registering the same name twice throws IllegalStateException. The registry freezes during FMLCommonSetupEvent — late registration also throws IllegalStateException.

Bug Fixes (runtime jar 0.3.0)

Upgrade Steps

  1. Replace storedprogramcontrols-1.1.5-api.jar with storedprogramcontrols-1.1.6-api.jar in your libs/ folder.
  2. Update build.gradle: compileOnly files('libs/storedprogramcontrols-1.1.6-api.jar')
  3. Update neoforge.mods.toml: versionRange="[1.1.6,)" (only if you actually use iconTexture or the Python builtin API — older addons keep working against the 1.1.6 runtime jar).
  4. Replace the runtime jar in run/mods/ with storedprogramcontrols-0.3.0.jar.

1.1.5

April 17, 2026

New Features

Code Example

// In your @Mod constructor:
SpcGuideBookRegistry.registerCategory(new SpcBookCategory(
    ResourceLocation.parse("createspc:rotation"),
    "Create Integration",
    "Rotation, stress, speed sensors and outputs.",
    "createspc:textures/gui/book/rotation_icon.png",
    100,
    null   // no parent
));

SpcGuideBookRegistry.registerEntry(new SpcBookEntry(
    ResourceLocation.parse("createspc:rotation_input"),
    "Rotation Input",
    "createspc:textures/gui/nodes/rotation_input.png",
    ResourceLocation.parse("createspc:rotation"),
    10,
    false,
    List.of(
        SpcBookPage.text("Reads RPM from a Create rotation shaft beneath the block."),
        SpcBookPage.spotlight("createspc:rotation_input_block", "Place this block on a shaft.")
    )
));

API Surface

ClassPackagePurpose
SpcGuideBookRegistry com.hypernova.spc.api.book Thread-safe static registry for addon book categories and entries.
SpcBookCategory com.hypernova.spc.api.book Record: categoryId, name, description, icon, sortnum, optional parent.
SpcBookEntry com.hypernova.spc.api.book Record: entryId, name, icon, category, sortnum, priority, list of SpcBookPage.
SpcBookPage com.hypernova.spc.api.book Immutable page data with factories: text(), spotlight(), crafting(), image(), entity(), custom().

Upgrade Steps

  1. Replace storedprogramcontrols-1.1.4-api.jar with storedprogramcontrols-1.1.5-api.jar in your libs/ folder.
  2. Update build.gradle: compileOnly files('libs/storedprogramcontrols-1.1.5-api.jar')
  3. Update neoforge.mods.toml: versionRange="[1.1.5,)" (only if you use the Guide Book API).

1.1.4

April 11, 2026

New Features

Bug Fixes

API Changes

ClassChangeDetails
SpcNodeSchema New field labelPrefix — nullable, 1-3 char prefix for editor block labels

Upgrade Steps

  1. Replace storedprogramcontrols-1.1.3-api.jar with storedprogramcontrols-1.1.4-api.jar in your libs/ folder.
  2. Update build.gradle: compileOnly files('libs/storedprogramcontrols-1.1.4-api.jar')
  3. Update neoforge.mods.toml: versionRange="[1.1.4,)"
  4. Replace the runtime jar in run/mods/ with the latest storedprogramcontrols-0.2.0.jar.

1.1.3

April 11, 2026

New Features

New API Exports

ClassPackagePurpose
MultiblockPosition com.hypernova.spc.multiblock.model Enum of 10 grid positions + MB_POS property for connected textures

Upgrade Steps

  1. Replace storedprogramcontrols-1.1.2-api.jar with storedprogramcontrols-1.1.3-api.jar in your libs/ folder.
  2. Update build.gradle: compileOnly files('libs/storedprogramcontrols-1.1.3-api.jar')
  3. Update neoforge.mods.toml: versionRange="[1.1.3,)"
  4. Replace the runtime jar in run/mods/ with the latest storedprogramcontrols-0.2.0.jar.

1.1.2

April 11, 2026

New Features

New API Classes

ClassPackagePurpose
ISpcConnectedDisplay com.hypernova.spc.api.multiblock Declare addon blocks as connected texture neighbors
ISpcDiagnosticsProvider com.hypernova.spc.api.multiblock Contribute entries to the Live Diagnostics Panel
SpcDiagnosticEntry com.hypernova.spc.api.multiblock Data record for a single diagnostic label + value

Upgrade Steps

  1. Replace storedprogramcontrols-1.1.1-api.jar with storedprogramcontrols-1.1.2-api.jar in your libs/ folder.
  2. Update build.gradle: compileOnly files('libs/storedprogramcontrols-1.1.2-api.jar')
  3. Update neoforge.mods.toml: versionRange="[1.1.2,)"
  4. Replace the runtime jar in run/mods/ with the latest storedprogramcontrols-0.2.0.jar.

1.1.1

April 11, 2026

Bug Fixes

Details

Both isMachineBlock() and getModuleType() now have a fallback path: if a block is not a built-in LogoModuleProvider, the methods check for ISpcMultiblockModule, look up the registered SpcModuleType from SpcModuleTypeRegistry, and map the declared SpcMultiblockPosition to the corresponding internal LogoModuleType.

No addon-side code changes are required. Just update your dependency version range to [1.1.1,) and replace the API jar.

Upgrade Steps

  1. Replace storedprogramcontrols-1.1.0-api.jar with storedprogramcontrols-1.1.4-api.jar in your libs/ folder.
  2. Update build.gradle: compileOnly files('libs/storedprogramcontrols-1.1.4-api.jar')
  3. Update neoforge.mods.toml: versionRange="[1.1.1,)"
  4. Replace the runtime jar in run/mods/ with the latest storedprogramcontrols-0.2.0.jar.

1.1.0

April 11, 2026 — Initial public release

Features