promotional bannermobile promotional banner

Create & Sophisticated Storage Compat

A compatability mod for miniecraft 1.20.1 to make Create and Sophisticated Storage compatible

Create: Sophisticated Storage Compat

Sophisticated Storage containers work as real storage on Create contraptions — with Sophisticated Storage's own UI, working face displays, and Stack Upgrade capacities preserved while in motion.

Fabric 1.20.1 · Create 6.0.8 (Fabric port) · Sophisticated Storage 1.3.5 (Fabric port)
What it does

Create 6.0 stopped auto-detecting inventories on contraptions; a block only counts as contraption storage if it is registered in MountedItemStorageType.REGISTRY. Sophisticated Storage ships compat for Jade, JEI, REI, EMI, Quark, Chipped, Litematica and Sodium — but nothing for Create, so its barrels and chests rode along as inert scenery.

    Sophisticated Storage's own screens on contraptions — upgrade tabs, the settings screen, sort and transfer buttons, the search box, the scroll panel for tall inventories, slot memory and inaccessible-slot markers. Limited barrels get their 1–4 slot screen with fill bars.
    Working face displays. A mounted barrel's face items, counts and fill bars track its contents as the contraption runs, instead of freezing at whatever was inside at assembly.
    Stacks above 64. Stack-Upgraded barrels legitimately hold thousands per slot. Create's generic mounted menu clamps every interaction to 64 and rejects any slot count that isn't a multiple of 9 between 9 and 54, which excludes almost everything this mod produces.
    Contents survive saving. Serialization goes through Sophisticated Storage's own NBT rather than vanilla item NBT, where Count is a byte and an oversized stack would be mangled the moment the contraption saved.

Covers all 48 storage blocks — barrels, limited barrels, chests and shulker boxes in every tier — via a class-hierarchy check, so blocks added by future versions or by addons like sbslotupgrades are picked up automatically.
How it works

Two things make the port small enough to do without mixing into Sophisticated Storage at all:

    Its UI is driven by IStorageWrapper, not by the block entity. StorageContainerMenuBase<S extends IStorageWrapper>, SettingsContainerMenu<S extends IStorageWrapper> and StorageScreenBase<S extends StorageContainerMenuBase<?>> take the wrapper straight into the constructor and never look up a block. The block-position dependency lives entirely in the concrete subclasses (StorageContainerMenu and friends), which are bypassed.

    StorageWrapper is world-independent — a pure NBT-backed object whose four abstract methods are all answerable from the Block alone. A contraption keeps the blockstate of every block it captured, so a subclass of it can live on one.

So the whole port is: subclass the wrapper, subclass the base menus, subclass the base screens. ContraptionStorageScreen is eleven lines.

A mounted block has no world position, so screens are addressed by (contraption entity id, local BlockPos) and carry a copy of the wrapper NBT in the screen-opening payload. Item contents still come from the server over the menu's own slot sync.
Two things worth knowing before editing this

Face displays are not read from the inventory. The renderers read getRenderInfo().getItemDisplayRenderInfo(), a cached snapshot refreshed by ItemDisplaySettingsCategory. The listener Sophisticated Storage registers for that, itemChanged(int), begins with a getCurrentServer().isOnThread() check and so does nothing on a client — which is why writing stacks into the client block entity has no visible effect on its own. itemsChanged() carries no such guard, so afterSync calls it explicitly.

A synced mounted storage must never report dirty on a client. AbstractContraptionEntity.tick calls MountedStorageManager.tick on both sides with no guard, and that reacts to a dirty storage by calling sendToClientsTracking, which throws Only supported on server worlds! on a client. Create's own storages only go dirty from server-side mutation; this one hangs its flag on Sophisticated Storage's general-purpose save callback, which also fires during deserialization bookkeeping, so SophisticatedMountedStorage clears the flag after construction and latches a clientSide flag in afterSync. Symptom if that regresses: crash on placing a wrenched contraption item.
Why not an off-world block entity

Materialising a real StorageBlockEntity per mounted block would satisfy every Sophisticated Storage assumption, but its constructor registers listeners on the global ServerChunkEvents.CHUNK_UNLOAD and ServerBlockEntityEvents.BLOCK_ENTITY_UNLOAD events, and Fabric events cannot be unregistered. One throwaway block entity per mounted barrel leaks a listener for the lifetime of the game.
Building

Put the compile-time jars in libs/ first — see libs/README.md.

./gradlew build

Output lands in build/libs/. Requires Java 17+ to compile (Java 21 to run Gradle against a 1.20.1 toolchain) and Gradle 8.x — Loom 1.7.4 rejects Gradle 9, so use the bundled wrapper.

The project compiles against yarn mappings. To confirm a build actually remapped, disassemble the output: Minecraft references should be intermediary (class_2338, class_1657) while Create and Sophisticated Storage references keep their real names.
Testing changes

Contraptions must be disassembled and re-assembled after any change to this mod. Mounting happens only at assembly time — MountedStorageManager.read() deserializes what was saved and never re-consults the registry.

Contraptions assembled by an older build deserialize as empty storages rather than throwing, because Create abandons the entire read pass for a contraption if any one storage throws.
Known limitations

    Upgrades don't tick while mounted. Upgrade items are preserved and shown in the UI, and anything acting through the inventory handler (slot limits, filters, IO filters) still applies — but magnets, pumps, feeding, smelting, crafting and the rest are paused.
    Display-side selection is hidden for mounted chests. That tab decides whether to offer the control by reading the world blockstate at a position a mounted block doesn't have.
    Controller-network blocks are excluded (controller, storage IO/input/output, storage link) — they resolve their contents through a network a moving contraption isn't part of.

License

MIT — see LICENSE. Create and Sophisticated Storage are the property of their respective authors; no part of either is redistributed here.

Create & Sophisticated Storage Compat Team

profile avatar
  • 1
    Followers
  • 6
    Projects
  • 12.8K
    Downloads

More from birdsprimeView all

  • Ore Lizards project image

    Ore Lizards

    Ore Lizards: a rare cave mob hidden invisibly in stone/deepslate. It erupts and flees when you approach, then burrows away for good after 13s. Kill it with a pickaxe first for its secret ore drop (coal to diamond/emerald).

    • 603
    • September 5, 2026
  • Zombies Hate Doors project image

    Zombies Hate Doors

    Zombies Hate Doors is a mod that is written to make zombies more of a threat and incentivise smarter base building to avoid zombies! zombies now break down both wood and iron doors on all difficulties, making redstone doors useful and zombies a threat

    • 217
    • September 2, 2026
  • Breaching Creepers project image

    Breaching Creepers

    Creepers will now jump at you and blow up when faced with obstacles! Configurable!

    • 6.5K
    • September 2, 2026
  • Aggressive Mobs project image

    Aggressive Mobs

    Birdsprime's Aggressive Mobs makes the night unforgiving with tweaks to mob AI, spawnrates, and attributes!

    • 4.3K
    • September 2, 2026
  • Ore Lizards project image

    Ore Lizards

    Ore Lizards: a rare cave mob hidden invisibly in stone/deepslate. It erupts and flees when you approach, then burrows away for good after 13s. Kill it with a pickaxe first for its secret ore drop (coal to diamond/emerald).

    • 603
    • September 5, 2026
  • Zombies Hate Doors project image

    Zombies Hate Doors

    Zombies Hate Doors is a mod that is written to make zombies more of a threat and incentivise smarter base building to avoid zombies! zombies now break down both wood and iron doors on all difficulties, making redstone doors useful and zombies a threat

    • 217
    • September 2, 2026
  • Breaching Creepers project image

    Breaching Creepers

    Creepers will now jump at you and blow up when faced with obstacles! Configurable!

    • 6.5K
    • September 2, 2026
  • Aggressive Mobs project image

    Aggressive Mobs

    Birdsprime's Aggressive Mobs makes the night unforgiving with tweaks to mob AI, spawnrates, and attributes!

    • 4.3K
    • September 2, 2026