promotional bannermobile promotional banner

Patchly

The Perfect Pure Patch Plugin. A modern in-place Zima, Patchwork, and Hytalor Alternative
Back to Files

Patchly 3.6.1

File namePatchly-3.6.1.jar
Uploader
ItsRiprodItsRiprod
Uploaded
Sep 3, 2026
Downloads
654
Size
147.1 KB
File ID
8797824
Type
R
Release
Supported game versions
  • Early Access

What's new

v3.6.1

  • $Requires accepts feature flags. Any entry without a colon is an expression over your .vars variables and passes when it evaluates greater than zero, so "$Requires": ["$HeavyArmor", "-$Legacy", "Riprod:Hexcode,$Fallback"] mixes flags and packs under the existing AND/OR/NOT rules. A leading - is boolean NOT (-$Zero is true). An unknown variable evaluates false and the reason is recorded.

  • .vars values may be true or false, stored as 1 and 0. A global may be referenced qualified by its file, $Globals.Name, as well as bare $Name.

  • Variables are now resolved before gating, in three layers: Globals.vars may only be gated by packs, a named .vars by packs and globals, and .patch/.put/.batch by every scope. Nested array-element $Requires sees flags as well.

  • New Java API com.riprod.patchly.api.PatchlyVars: getFlag, getNumber, get, whenReady, onChange. Works from any copy of Patchly in the JVM, including one that lost the election, because the active copy publishes through shared JDK objects. Values are empty until the first rebuild after LoadAssetEvent; change listeners fire only when the resolved map differs.

  • /patchly vars prints every resolved scope and value. /patchly explain <target> now lists unresolved expressions for that target, including a $Requires expression that failed, and when a missing scope was gated out it names the .vars file and the condition that gated it.

v3.5.4

Updated patchly to correctly be MIT

Updated patchly to support Update 6 Note: it will continue to error until update 6 fully releases due to semver issues

v3.5.3

  • $Import now works inside an array element, as the guide always said it did. Every array path stripped all $-prefixed keys off an element before merging it, so the marker was gone before it could fire. Element payloads now keep registered object markers, the import scopes to the array it sits in, and the matching element is selected from the imported asset using the same $Match you already wrote. It applies on an append too, so $Import with + pulls a template for a brand-new entry. If the imported asset has no matching element, nothing is imported and your own keys still apply.

  • Source hot-reload no longer dies permanently when the asset monitor is not ready. The installer reported failure the same way as success, and the caller latched its one-shot flag regardless, so a single early miss disabled source watching for the rest of the process. It now retries on the next rebuild.

v3.5.2

  • Patches now bind to assets the way the engine does. Sources are grouped by asset identity (the store plus the filename stem) instead of by their literal folder path, so a .patch or .put may sit in any subfolder under its store root and still land on the asset it names. Previously the compiler treated Armor/X.patch and Armor/Test/X.patch as two unrelated targets even though the engine sees one asset.

  • One asset now produces exactly one override file, written at the upstream asset's own path. Before this, sources in different folders each emitted their own file, both claiming the same asset in the same pack, and whichever the engine scanned last silently won. Existing override output relocates to the upstream mirror path on first boot. The override directory is rebuilt from scratch at startup, so nothing stale is left behind.

  • A .put now satisfies a sibling .patch no matter which the filesystem walk reached first. Only .batch could read a .put seed before, so a .patch walked ahead of the .put creating its base was dropped with a misleading "no base asset" warning.

  • Merge order among sources that tie on $Priority is deterministic instead of filesystem directory order. Ties break on kind, then path depth, then path. A .put merges first because it creates the asset, then .batch bodies as folder defaults, then .patch files, with deeper paths applied last. This matters most for $Import, which is a patch payload rather than a base lookup. A .put importing a whole upstream asset overwrites every field written before it, so an equal-priority sibling patch could win on one machine and lose on another.

  • /patchly explain <target> now lists every source that built an asset under a single entry, including sources from other folders, and no longer reports a false ambiguity when two folders name the same asset.

v3.5.1

Dropped Java version from 26 to 25 for compatibility

v3.5.0

Added .batch, a folder-scoped patch whose reserved keys gate every source at or below its directory and whose body merges once into every target those sources produce.

Added /patchly explain <target>, which lists every source that built one asset in merge order.

Gated-source log lines moved from INFO to FINE.

This mod has no additional files