UltimateCustomGear-1.21.1-1.7.0-NeoForge.jar
Curse Maven Snippet
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.slotsis baked at registration: changing it needs a restart, not/customgear reload. Everything else about a container is hot-reloadablecurios_slotsneeds/reloadas 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 bycontainer.type:barrel— a full cube placed on any of six axes, with a real open state. No renderer, so it costs nothing to drawchest— the vanilla chest shape with an animated lid, and it joins into a double with a neighborshulker— 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 roombackpack— not a block at all: an item you carry, open with right click or a keybind, and can equip in a Curios slot
container.typeis 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 backkeeps_contentsdecides whether breaking one drops the contents or stores them in the item. Defaults per subtype:truefor shulker and backpack,falsefor barrel and chest. A barrel that keeps its contents is perfectly legalslotshas 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
columnsand the width is worked out so the contents fit in nine rows, capped bymax_columns(default 12). Declarecolumnsand 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_slotsfield 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
modeis 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
modedecided for the whole object - A value that is neither is rejected with an error naming both valid forms.
item/bundleis ambiguous and is no longer guessed - Animated textures work. Drop a
.mcmetanext to your PNG —my_fluid.pngandmy_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
IllegalAccessErrorin a real installation — which meant opening any container disconnected the player. This is the kind of failure no amount of testing inrunClientcan 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 fromblock/now, because the block atlas is built from a fixed list of directories and an arbitraryfluid/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_3dwas skipped in reference mode, so an armor could not have vanilla-referenced icons and its own GeckoLib model at the same time. A.geo.jsonhas 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.printlnfired on every container sort-mode change
🔧 Technical Changes
TextureRef.java— new inresources/: the single place that decides what a texture value points at. Both the parsers and the generators resolve through itTextureData.java— new indata/: the shared texture block.BlockData,GearDataandFluidDatahad three near-identical copies of itPackSink.addTextureWithMeta— copies a texture and its.mcmetatogetherContainerData.java/ContainerContentData.java/ContainerContents.java— new: container definitions and the component their contents live inContainerRegistry.java— new inloader/: containers register their own Block, Item and BlockEntityType. Kept out ofBlockRegistrybecause a backpack is not a blockCustomContainerBlockandCustomContainerBlockEntity— abstract bases;CustomBarrelBlock,CustomChestBlockandCustomShulkerBlockadd only what is theirsChestRenderer.java/ShulkerRenderer.java— new inclient/render/. The chest's three meshes are built by hand; the shulker reuses vanilla'sShulkerModelContainerOpenData.java— new innetwork/: 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 itBackpackAnchor.java— new: where a carried backpack lives, so its menu can notice it leaving. Three cases: an inventory slot, the offhand, a Curios slotCuriosCompat.java— new incompat/: the only class that touches the Curios API, so nothing else breaks when it is absentCuriosTagLoader.java— new inloader/: emits the item tags and the entity slot assignmentContainerTooltip.java/ContainerTooltipRenderer.java— new inclient/: the contents gridArrowDamageHandler.java— reduced to mobs; players resolve throughcreateProjectile, where the weapon is a parameterGearModelGenerator.java— theloadCustom/loadReferencesplit collapsed into one path per gear typebuild.gradle— the access transformer is now copied into the jar and declared inneoforge.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_slotsneeds/reloadas 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

