promotional bannermobile promotional banner

Ultimate Custom Gear

Ultimate Custom Gear lets server owners and modpack creators add fully custom content to Minecraft through simple JSON files. No coding required, hot-reloadable, and verified between server and clients automatically.
Back to Files

UltimateCustomGear-1.21.1-1.7.0-NeoForge.jar

File nameultimatecustomgear-1.21.1-1.7.0-NeoForge.jar
Uploaded
Aug 20, 2026
Downloads
15
Size
2.2 MB
Mod Loaders
NeoForge
File ID
8689731
Type
R
Release
Supported game versions
  • 1.21.1

Curse Maven Snippet

NeoForge

implementation "curse.maven:ultimate-custom-gear-1563239:8689731"

Learn more about Curse Maven

What's new

⚠️ Important Notes

Nothing breaks. Packs written for 1.6.0 load unchanged. The mode field inside texture is gone, but a pack that still declares it works exactly as before — the value is simply ignored now. Delete it whenever you feel like it.

  • Containers are new in this version, so none of their rules are a change to anything
  • container.slots is baked at registration: changing it needs a restart, not /customgear reload. Everything else about a container is hot-reloadable
  • curios_slots needs /reload as well as /customgear reload — Curios reads its slot assignment outside the reload this mod triggers. The log warns when the set changes
  • Texture changes still need F3+T to show, as always

✨ New Features

Containers

  • New content type container, with four subtypes chosen by container.type:
    • barrel — a full cube placed on any of six axes, with a real open state. No renderer, so it costs nothing to draw
    • chest — the vanilla chest shape with an animated lid, and it joins into a double with a neighbor
    • shulker — attaches to whatever surface it is placed against, its collision box grows as the lid rises, and it refuses to open when there is no room
    • backpack — not a block at all: an item you carry, open with right click or a keybind, and can equip in a Curios slot
  • container.type is required. The four differ in shape, in how they are placed, and in whether breaking one keeps its contents — a silent default would decide that last one behind your back
  • keeps_contents decides whether breaking one drops the contents or stores them in the item. Defaults per subtype: true for shulker and backpack, false for barrel and chest. A barrel that keeps its contents is perfectly legal
  • slots has no hard ceiling. Past 128 the parser warns: that is where vanilla's click packet gives up, and a single action changing more slots than that at once disconnects the player
  • Automatic column count. Omit columns and the width is worked out so the contents fit in nine rows, capped by max_columns (default 12). Declare columns and that exact width is used
  • A double chest keeps one inventory of twice the size. Breaking either half hands back that half's contents, exactly as vanilla does — and Ctrl+picking one copies only its half
  • Hoppers, comparators and mod overlays read a double chest correctly from either side
  • Containers refuse to nest: a shulker does not go inside another shulker, or inside a vanilla one. A container that spills when broken carries no NBT, so it nests freely

Backpacks and Curios

  • Open with right click, or with the new Open backpack keybind (B by default) from anywhere in the inventory
  • The keybind looks in this order: the selected hotbar slot, the offhand, equipped Curios slots, then the rest of the inventory. Equipped beats loose — someone wearing a storage ring is wearing it to have it at hand
  • New curios_slots field lists which Curios slot types accept this backpack ("back", "ring", "charm"…). The slot types are also assigned to the player, so they exist without needing another mod to provide them
  • Only the declared slots are assigned. Installing this mod for a sword does not fill your Curios inventory with empty slots
  • The slot the backpack occupies is frozen while its screen is open, and the screen closes by itself if the backpack leaves — dropped, taken, or lost on death
  • Curios is an optional dependency

Texture paths are read from the value

  • mode is gone. Whether a value is another mod's asset or a file of yours is deduced from the value itself: a : makes it a resource location, an extension makes it a file in your content folder
  • Values can now be mixed within one object. A barrel with its own top and vanilla sides was impossible while a single mode decided for the whole object
  • A value that is neither is rejected with an error naming both valid forms. item/bundle is ambiguous and is no longer guessed
  • Animated textures work. Drop a .mcmeta next to your PNG — my_fluid.png and my_fluid.png.mcmeta — and both travel into the pack, exactly as they would in an ordinary resource pack

Tooltips

  • The long sections — effects, set bonuses, the three resistance layers and mob drops — now hide behind Shift, with a line telling you they are there. Tool and weapon stats stay visible, because comparing two at a glance is the point of a tooltip
  • A container that can hold contents shows them as a grid of items while Shift is held, most numerous first, with "…and N more types" when there are too many

🐛 Bug Fixes

  • The access transformer never made it into the built jar. Everything depending on it worked in the development environment and threw IllegalAccessError in a real installation — which meant opening any container disconnected the player. This is the kind of failure no amount of testing in runClient can find
  • The content cache skipped validation entirely. A cached file was accepted without being checked again, so rules that changed between versions never applied to files nobody had edited, and validation warnings were shown once and never again. Validation now runs on every load; the cache still saves the disk read and the JSON parse
  • Custom fluid textures never worked. The registry pointed a custom fluid at customgear:fluid/<id>_still, but nothing ever copied a file there. Fluid textures are also stitched from block/ now, because the block atlas is built from a fixed list of directories and an arbitrary fluid/ is not on it
  • Arrow damage came from what the shooter was holding, not from what fired. Firing a vanilla bow with a custom one in the other hand handed the custom damage to the wrong arrow. The damage is now applied where the weapon is known for certain. Mobs still resolve by held weapon — they build their arrows without consulting the item
  • armor_3d was skipped in reference mode, so an armor could not have vanilla-referenced icons and its own GeckoLib model at the same time. A .geo.json has no reference form, so it is now copied whenever it is declared — and referencing another mod's model works too, which avoids redistributing assets that are not yours
  • The bow's pull animation still ignored charge_speed. The fix shipped in 1.6.0 described the right behavior in a comment but the code kept dividing by a fixed 20 ticks
  • A debug System.out.println fired on every container sort-mode change

🔧 Technical Changes

  • TextureRef.java — new in resources/: the single place that decides what a texture value points at. Both the parsers and the generators resolve through it
  • TextureData.java — new in data/: the shared texture block. BlockData, GearData and FluidData had three near-identical copies of it
  • PackSink.addTextureWithMeta — copies a texture and its .mcmeta together
  • ContainerData.java / ContainerContentData.java / ContainerContents.java — new: container definitions and the component their contents live in
  • ContainerRegistry.java — new in loader/: containers register their own Block, Item and BlockEntityType. Kept out of BlockRegistry because a backpack is not a block
  • CustomContainerBlock and CustomContainerBlockEntity — abstract bases; CustomBarrelBlock, CustomChestBlock and CustomShulkerBlock add only what is theirs
  • ChestRenderer.java / ShulkerRenderer.java — new in client/render/. The chest's three meshes are built by hand; the shulker reuses vanilla's ShulkerModel
  • ContainerOpenData.java — new in network/: the container-open packet, now versioned. Its fields used to be written and read inline in two files with no check, so adding one silently shifted every value after it
  • BackpackAnchor.java — new: where a carried backpack lives, so its menu can notice it leaving. Three cases: an inventory slot, the offhand, a Curios slot
  • CuriosCompat.java — new in compat/: the only class that touches the Curios API, so nothing else breaks when it is absent
  • CuriosTagLoader.java — new in loader/: emits the item tags and the entity slot assignment
  • ContainerTooltip.java / ContainerTooltipRenderer.java — new in client/: the contents grid
  • ArrowDamageHandler.java — reduced to mobs; players resolve through createProjectile, where the weapon is a parameter
  • GearModelGenerator.java — the loadCustom / loadReference split collapsed into one path per gear type
  • build.gradle — the access transformer is now copied into the jar and declared in neoforge.mods.toml

⚙️ Known Limitations

  • A container past 128 slots can disconnect the player. A single action changing more slots than that at once — a long drag, a mass shift-click — exceeds what vanilla's click packet can carry. Hard to reach in survival, trivial in creative
  • A backpack's contents travel inside its ItemStack, and that stack is re-sent every time anything moves in the player's inventory. A large backpack full of items with heavy NBT is the case where slot count costs the most
  • A shield still cannot have its own texture. It renders through vanilla's atlas materials, and pointing at a PNG directly means losing banner patterns — a trade worth making deliberately, not by accident
  • Changing curios_slots needs /reload as well. Curios reads its slot assignment outside the reload this mod triggers
  • Trying to nest a container flickers for a frame before the server refuses it: the client's stand-in inventory knows the rule, but the prediction runs first

📦 Dependencies

  • Curios API — optional, only required for curios_slots

This mod has no additional files