
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.
Список изменений
💥 BREAKING CHANGES
Two fields changed meaning. Existing content packs need editing.
cooking_time is now in SECONDS, not ticks
Every other time field in this mod is in seconds (eat_duration, effect duration), and cooking_time was the odd one out. Divide your existing values by 20: a recipe written as "cooking_time": 200 meant 10 seconds and now means 200 seconds.
Nothing errors — the recipe still works, just 20x slower — so this will not show up as a crash. Check every smelting, blasting, smoking and campfire_cooking recipe you have.
requires_player_kill now defaults to false
It used to default to true. Vanilla drops do not care who landed the blow, and the old default made every custom drop behave unlike everything else in the game.
If you run an item economy, declare "requires_player_kill": true explicitly — otherwise a fall damage farm can print currency. The parser warns on every item that leaves the field undeclared, so the log will tell you exactly which files to check.
Note it asks for recent player damage, not the killing blow: a mob you hit and a creeper finished still counts as yours.
⚠️ Important Notes
- Tags need
/reloadafter/customgear reload— the tag manager only rebinds on a datapack reload. Everything else stays hot-reloadable passthroughrecipes are copied verbatim and are only protected against the target mod being missing, not against it being a different version. A mod that changes its recipe schema can break datapack loading entirelycharge_speedno longer appears in tooltips: it never affected the real charge time. See Known Limitations
✨ New Features
Tag Patches
- New content type
tag_patch— declares that foreign content belongs to a tag, the inverse of thetagsfield. Needed for anything that is not an item you registered: damage types from other mods could not be referenced at all before - Identified by
registry+tag, noid. Two patches naming the same pair merge - Entries are always emitted with
required: false, so an uninstalled mod is ignored instead of dropping the whole tag. A typo is warned about when the namespace belongs to a mod that IS loaded removetakes content out of a tag, even when another pack puts it there. That is the only way out of an inherited tag- Removals from
minecraft:orc:tags are warned about — they affect every mod that reads them
Gear Tags
- Armor, tools, and weapons now receive the vanilla tags they always should have had. Gear never went through the tag system at all, which is why a custom sword was offered nothing at the enchanting table while a diamond sword was offered everything
- Slot tags (
#minecraft:chest_armor…), behavior tags (#minecraft:swords,breaks_decorated_pots) and, whenenchantable: true, the matching#minecraft:enchantable/*tags - Convention tags too (
c:armors,c:tools,c:tools/melee_weapon…) so other mods recognize this mod's gear generically - New
trimmablefield onarmor_set(defaultfalse). Off by default because trims draw over the armor layers: witharmor_layers: transparentor a GeckoLib 3D model the trim applies but never shows
Recipes
- Three vanilla types that were missing:
smoking,campfire_cookingandstonecutting stonecuttinghonoursresult_count— cutting one block into several is the normal case- New
passthroughtype: hands a raw recipe body to the game untouched, so another mod's recipe type (create:mixing,create:pressing…) can produce this mod's content without this mod knowing that schema. Aneoforge:mod_loadedcondition is derived from the inner type's namespace automatically; extra mods go inrequires - Declaring a field the recipe type ignores now logs a warning naming it
Mob Drops
- New
looting_modereplacesaffected_by_looting, mirroring vanilla's two separate mechanisms:"count"(default) — adds 0..levels to the rolled amount, like common drops (rotten flesh, string)"chance"— raises the drop probability instead and leaves the amount alone, like rare drops (wither skeleton skulls)"none"— Looting does nothing
- Vanilla never applies both to the same drop, and neither does this
looting_chance_bonus(default0.01) sets how much probability each Looting level adds inchancemode. Not a universal constant in vanilla either — loot tables declare their own- In
countmode the bonus applies before the empty check and is not clamped tomax, matching vanilla
Dynamic Pack Icon
- The dynamic pack now shows the mod's logo in the resource pack screen
- Override it by dropping your own
dynamic_pack_icon.pngin theultimatecustomgear/folder — square, power of two (64×64 or 128×128) - The icon is deliberately excluded from the content hash, so branding your pack never desyncs clients
🐛 Bug Fixes
- Two tag loaders could silently overwrite each other. A block declaring
"tags": ["minecraft:mineable/pickaxe"]landed on the exact pathrequired_toolgenerates, and the last one written won — entries vanished with no warning. All tag sources now feed one accumulator that merges and emits once - Individual bows and crossbows never worked in
customtexture mode. They fell through to the generic tool branch: no pulling frames, no display transforms, rendering at a tool scale. Crossbows had no custom-mode support at all, not even inside aweapon_set - The bow's pull animation was desynced from the shot. It scaled with
charge_speed, which does not affect the real draw — atcharge_speed: 0.25the animation ran 16x too fast and skippedbow_pulling_0entirely - The crossbow could be fired before its animation finished. The pull predicate divided by the use duration instead of the charge duration, so the crossbow loaded while the animation was still on the first frame
- A missing frame texture dropped every pulling override instead of just that one, freezing the animation with no visible cause
🔧 Technical Changes
TagFileBuilder.java— new inloader/: shared accumulator for every tag file.addfillsvalues,removeemits NeoForge'sremovearray. When the same id is both added and removed, the removal wins, with a warning naming itTagPatchData.java/TagPatchLoader.java— new: thetag_patchcontent typeGearTagLoader.java— new inloader/: derives vanilla and convention tags from registered gearItemTagLoader.java/BlockTagLoader.java— no longer write to the pack; they feed the shared builderRecipeLoader.java—buildStonecuttingandbuildPassthroughadded;buildCookingnow resolves seconds to ticks;warnUnusedFieldschecks declared fields against the typeRecipeData.java—jsonandrequiresfor passthrough;experienceandresultCountboxed so an undeclared value is distinguishable from a declared defaultMobDropHandler.java— Looting resolved once per death through the dynamic enchantment registry; player involvement now asks for recent damage rather than the killing blowGearModelGenerator.java—loadCustomWeapon,loadCustomCrossbowTexturesandcustomFrameadded; individual weapons routed correctly incustommodeClientSetup.java— bowpulldivides by a fixed 20 ticks, crossbowpullbygetChargeDurationDynamicResourcePack.java—addRootFileand a workinggetRootResource, which previously returnednullunconditionallyTextureLoader.java—loadPackIcon
⚙️ Known Limitations
charge_speeddoes not change the real charge time.BowItem.getPowerForTimeandCrossbowItem.getChargeDurationare static and cannot be overridden, so a bow always draws in 1.0s and a crossbow in 1.25s. The field only stretches how long the click can be held, which is already minutes either way. The tooltip line was removed rather than keep promising something that never happened- Smithing trims cannot be removed from other mods' armor, only from this mod's. Vanilla's
trimmable_armoris the union of the four slot tags, so armor inherits it just by being armor - Tag changes need
/reloadafter/customgear reload
📦 Dependencies
No new dependencies added.
