Skip to content

Releases: kgbcupcake/MariesLib

v0.1.2-beta.1

v0.1.2-beta.1 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 23 Oct 01:40
c8ed8f0

A ready-made in-game Item Editor with recipe previews, per-item diminishing returns, reusable Hub home pages, and the foundation for a unified config registry.

Highlights

  • Item Editor: a ready-made window any MariesLib mod can open for players. It shows why an item resolved the values it did, lets you edit and save a per-item override on the spot, and applies it immediately with no reload.
  • Recipe preview: the editor shows what crafts the targeted item, as a JEI/EMI-style recipe grid, with a slowly turning 3D model of the crafting station below it.
  • Per-item diminishing returns: mods can give a single food its own diminishing-returns curve, or exempt it entirely, instead of only switching the whole system on or off.

Added

Item Editor

  • Drag an item straight in from JEI or EMI to target it. The window can be dragged and resized, remembers its position, and has a gear button for Style options (background, border, Glow, Pulse) like every other box.
  • It can open on top of whatever screen is already up, such as the inventory, so JEI's or EMI's list stays available to drag from.
  • A small File/Info menu bar: Info shows the classification readout, and File switches between pages ? Values, plus any pages a mod adds.
  • Save and Revert sit in the top-right corner, light up on hover, and flash a green "Saved ?" / "Reverted ?" when clicked.
  • The recipe preview covers the crafting table, furnace, smoker, blast furnace, campfire and stonecutter, plus Farmer's Delight's cooking pot and cutting board and Dungeon's Delight's monster pot when installed. Hover an ingredient to see which mod it's from; slots that accept several items cycle through all of them. Items with no recipe show "No known recipe".

For addon developers

  • Mods can add their own rows to the Item Editor, or whole pages of their own in its File menu (like Nourished's Options page), with the editor's shared Save/Revert.
  • Pages can claim items dropped onto the editor (for multi-item lists like Nourished's Bulk Edit) and jump the editor to another item and page.
  • Per-item diminishing returns: source-aware trackingMemoryConfigProvider and clientMemoryConfigProvider overloads on MarieContext.Builder, so the tooltip preview matches what eating actually does.
  • enableDiminishingReturns feature flag: a master switch that turns diminishing returns off for every source at once.
  • MarieContext.Builder#sourceExclusionFilter: your mod's own exclusion check is now consulted before a generic Item Editor override can grant values on eating.
  • Reusable Hub home page (HubInfoPage, EntityPreviewBox, HubInfoSection): a 3D entity preview beside a scrollable summary.
  • Option panels gain decimal sliders (e.g. "293.15 K" or "0.050") and buttons whose label shows a live value.
  • New marie-config module: the foundation for a unified config registry with generic JSON export/import. Nothing uses it yet ? a Dynamic Config Editor builds on it later.

Changed

  • The Item Editor matches the Hub Home page's look: a small item preview card on the left, with the value sliders in their own scrollable list on the right.
  • The Info tab is readable: plain-English step names, color-coded by outcome, with a clear summary at the bottom.
  • Opening an item with no saved override starts the sliders from the values it actually resolves to, instead of a blank 0%.
  • Overrides are saved under config//item_editor/, with a folder per value category. Existing overrides are moved there automatically, and only values you actually changed are written.

Fixed

  • MariesLib's EMI support never turned on at all on NeoForge. It's now registered correctly, so EMI drag-and-drop works.
  • JEI's and EMI's item lists now show up beside the standalone Item Editor, and dropping an item from EMI no longer adds it to EMI's favorites instead.
  • JEI and EMI lists no longer vanish after the overlay editor closes.
  • With several MariesLib mods installed, a mod that never declares which items it cares about no longer lets every item through other mods' scans.
  • Per-item diminishing returns kept working only for the last-loaded mod; it now works regardless of load order.
  • The Item Editor can no longer save its position off-screen, and tall pages scroll inside the window instead of spilling past its border.
  • The File dropdown no longer draws under the item icon, and the rows can no longer overflow the window at small sizes.
  • The Style popup opens centered above the inventory instead of hidden behind JEI's or EMI's list.
  • No more empty placeholder override files created on launch.

Full notes on the wiki: https://marieswiki.kgbcupcake.workers.dev/mods/marieslib/changelog/0.1.2-beta.1/

v0.1.2-beta

v0.1.2-beta Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 02 Oct 16:01
2af824a

This is a big beta. Module boxes get a full look-and-feel overhaul, mods that run side by side get a lot of fixes, and several datapack and API features that never worked now do.

⚠️ Beta. If your mod builds on MariesLib, read For addon developers below. Some UI classes moved into the new marie-editor module.

✨ Highlights

  • New Glow and Pulse tabs on every box: text, border and bar glow with color and strength, plus a "breathing" border pulse (Smooth, Heartbeat or Flash) that stays in sync across boxes.
  • More box styling: background and border opacity and shade, border shadow, header size, and a one-click Reset This Module button.
  • More Hide options: Hide Window, Hide Text, Hide Bars and Hide Header, next to Hide Icons.
  • Size snapping: resizing a box can snap it to the size of the boxes next to it.
  • New Hub window: a resizable popup with a sidebar, used by editors such as Nourished's Diet Screen editor.
  • Redesigned color picker: a round hue/saturation wheel, a brightness slider, saved favorites and hex entry.

🐛 Fixes

Gameplay and multiple mods

  • If two or more mods use MarieLib, each mod now uses its own settings for decay, effects, tooltips, thresholds and tracking. Before, the most recently loaded mod's settings applied to all of them.
  • Eating or using a source no longer counts its value gains more than once when several mods are installed.
  • A mod using the default settings no longer makes other mods' tooltips and value guesses appear on every item.
  • Respawning no longer wipes recent-source history for a mod set to keep values on death, and each mod resets to its own starting level.
  • Profiles, milestones and synergies added by mods no longer disappear after a second /reload.
  • Daily, weekly and monthly trackers now reset when you sleep through the night or use /time. Periods cut short by moving time backwards record when they actually ended.
  • Item tooltips in single-player no longer show value info left over from the last multiplayer server you joined.
  • Diminishing returns now count "free bites" correctly.
  • Fixed full-screen black flashing on the HUD while eating.

Boxes and editor

  • Icon size no longer follows text size where it shouldn't (Calories, Balance, Recent Meals, Eat More Of).
  • Bar rows and legends now respect their own text, icon and bar size sliders and Hide Window.
  • Moving boxes no longer feels sticky: they snap only when they're close to another box.
  • Glow no longer squares off a box's rounded corners.
  • Hub color pickers now work, and a custom title color applies to the sidebar.
  • The move outline now covers a box's header, and icon boxes follow their icon.
  • Only one size-settings window can be open at a time across all boxes.
  • The toolbox scrollbar no longer covers hex values and slider percentages.

Datapacks and scripts

  • tracking_profiles/*.json files now load. Before, they were always skipped.
  • Compat entries with bulk item-to-value mappings now apply those mappings.
  • A runtime tooltip message override now replaces only the message it names, not the whole item's tooltip.
  • Mod scans: two scanners with similar names no longer overwrite each other's cached results.
  • Removed the unused mod_compat.json loader that logged a missing-resource warning on every launch.

🧩 For addon developers

  • New module: marie-editor. The layout editor, module settings, scale-config and toolbox systems moved out of marie-ui. Add the dependency if you use them.
  • API stability: every dev.marie.framework package is now marked @Stable, @Experimental or @Internal. Value tracking, events and definitions, compat, tag audit and resource sync are Stable. UI, datapack, scanner, command and config systems are Experimental.
  • New in the API:
    • MarieAPI.registerTrackerMilestone: use this instead of TrackerMilestoneRegistry directly.
    • MarieRequestChannel
    • MarieModScan
    • MarieWidgets, MarieToolbox, MarieModuleSettings
    • MariePulse, AnimatedFloat
    • HubPanel
    • BarRowComponent, TitleBarComponent, LegendComponent
    • RenderContext#drawRoundedRect, #drawGlow, #drawEffectIcon
    • ValueDefinition.icon and .tags
  • Deprecated: the single-argument registerExportResolver(ExportResolver) is now forRemoval and will be removed in the next major version. Use the overload that takes a registry key.
  • Documented in API.md:
    • The marie_schema_version contract: one shared version, and a mismatch only warns.
    • Which registrations survive /reload: profiles, milestones, tracker milestones and synergies do. Trackers and colors must be registered again.

v0.1.1-beta.5

v0.1.1-beta.5 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 31 Aug 17:35
be4e9c3

MariesLib 0.1.1-beta.5

Large release: reworks the recipe/keyword classification merge to actually let recipe data contest a keyword match, and adds a batch of new generic (domain-agnostic) UI, tracking, sync, and color subsystems that consumer mods like Nourished build on.

Classification / Scanner

  • RuntimeResolutionMerge and the scanner's RecipeInheritanceStage no longer let a keyword match permanently lock its category recipe data can now dilute or (for opt-in contestable_values categories) outright override it.
  • Confidence is computed once over the combined keyword + recipe signal instead of being copied verbatim from the keyword winner, so items with disagreeing names/recipes can now be flagged UNCERTAIN.
  • scannerConfidenceSpreadThreshold default raised from 0f → 0.15f (was previously dead: UNCERTAIN flagging never fired at 0).
  • CommunityTagResolutionStage's tag directory (c:foods/...) is now per-mod configurable via scanner_spec.json instead of hardcoded.
  • compositeRatioThreshold default raised from 0f → 0.5f — a stray secondary tag no longer silently attaches a second category to an item.
  • SourceClassificationRegistry overrides now actually reach SourceRegistry (they were silently ignored before), and an active override now fully locks out competing tag/API registrations for that item instead of letting them leak through.
  • Added a new calories field to source_classifications.json, with corrected precedence so classifying an item no longer zeroes or miscalculates its calorie total.
  • Added RecipeInheritanceResolver.collectContributions: walks the entire recipe tree instead of short-circuiting at the first confident match. Fixes the "calzone" bug class where a weak match on an intermediate ingredient hid a stronger match one level down.

New UI Subsystems (marie-ui)

  • Command Center: pluggable sidebar + card dashboard screen for consumer mods to register content into. Now supports dragging/resizing, clipping/scrolling, and corrected chrome rendering (blur order, sizing, translation key).
  • Notifications: generic client-side toast/notification stack above the XP bar, with merge-by-key support.
  • Scale Config Panel: replaces the old ContentScaleConfigScreen. Provides generic per-component text/padding scale adjustment and can be embedded as an overlay instead of requiring a full Screen.
  • Edit Mode / Snap Registry — generalized double-click edit mode and cross-mod magnetic-edge snapping for draggable HUD components.
  • Color System: ColorKey / ColorDefinition / MarieColors layer connecting ColorRegistry overrides to a real defaults/resolve API, plus withOpacity / shade helpers and a generic Cloth Config color-row widget.
  • Added the new dev.marie.framework.ui.api facade package, consolidating the public entry points for all of the above.

Tracking & Sync

  • Added a generic tracker/period-history framework (MarieTracking) supporting daily, weekly, monthly, and custom periods.

  • Added a parallel tracker-milestone system, both with datapack support.

  • Added two-tier client sync for trackers:

    • Throttled dirty-flag sweep
    • Full login snapshot
  • This fixes previously stale client-side tracker reads.

  • Added MarieResourcesAPI for generic config/registry synchronization, so mods no longer need to hand-roll their own sync payload/channel.

  • Client caches now clear on disconnect (previously they never did).

Breaking Changes

  • dev.marie.framework.notification.MarieNotifications, ui.commandcenter.MarieCommandCenter, and ui.edit.EditModeCoordinator moved to dev.marie.framework.ui.api.

    • Old import paths no longer exist.
  • Removed MarieAPI.registerTracker, incrementTracker, getCurrentTrackerValue, and getTrackerHistory.

    • Use MarieTracking instead.
  • Deleted ContentScaleConfigScreen and ScaleSliderButton.

    • Use ScaleConfigPanel instead.
  • Nourished and any other direct consumer will not compile against this version without call-site updates to the above APIs.

Notable Fixes

  • Reload/registration gap: TrackerRegistry and ColorDefinitionRegistry registrations made at mod-init were being silently wiped on every world boot with no re-registration path. They are now correctly hooked into both /reload and server startup.
  • Tracker milestone datapack entries were silently dropped due to a missing callback override.
  • Login snapshots no longer miss tracker values in the CUSTOM-period, no-history-yet edge case.
  • Swim-tick triggers no longer keep firing briefly after leaving water.
  • Oversized-packet checks now happen pre-decode instead of after a full NBT round-trip, improving DoS hardening.
  • Fixed several NPEs around item-agnostic triggers (block break, entity kill, and tick) passing null instead of ItemStack.EMPTY.

Full Changelog: v0.1.1-beta.4...v0.1.1-beta.5

MariesLib_v0.1.1-beta.4

Pre-release

Choose a tag to compare

@kgbcupcake kgbcupcake released this 25 Jul 02:53

Scanner signal stages extracted into the ResolutionStageHandler cascade shape, ComponentClassifier wired into recipe-inheritance fallback, DeathNutritionBehavior renamed for domain-agnosticism, a marie-core/marie-ui/marie-commands audit for leftover food/nutrition-specific naming, tooltip message/color customization, excluded-item tooltip handling, a bundled-resource lookup fix, an excluded-items registry, and recipe-inheritance score merging for tagged items.

Added

  • CommunityTagResolutionStage / SuffixResolutionStage / KeywordResolutionStage
  • RespawnValueBehavior (renamed from DeathNutritionBehavior)
  • TooltipMessageRegistry / TooltipColorRegistry
  • ExcludedItemsRegistry, wired into MarieBootstrap
  • DoubleClickRecognizer, ComponentState.contentScale, new DraggableResizable constructor overload

Changed

  • Several internal file splits (MarieAPI, RuntimeResolver, ItemClassifier, ClassificationTraceFormatter) — no public API changes
  • MarieTooltipHelper moved packages (compat → tooltips)
  • SourceClassificationRegistry override folder layout changed
  • @ApiStatus tier corrections for several previously-mislabeled classes

Fixed

  • SourceClassificationRegistry.parseEntry() no longer crashes on malformed entries
  • Removed unreachable bundled README resources
  • Removed dead-code ExportResolverRegistry
  • MarieAPI.registerExportResolver single-arg overload no longer silently no-ops

Full changelog: see CHANGELOG.md

MariesLib_v0.1.1-beta.3

Pre-release

Choose a tag to compare

@kgbcupcake kgbcupcake released this 01 Jul 18:33

[ MariesLib 0.1.1-beta.3 ] 2026-6-30

Source-pair synergy value buffs, source classification unification, tag-audit and export
command wiring, and player-logout state cleanup for the new synergy tracking.

Added

  • MarieAPI.registerConfigValidator(validator): now validates that the validator's
    modId() is non-empty and matches a registered mod; throws IllegalArgumentException if not
  • SourcePairSynergy.getValueModifier() / getModifierDurationTicks() (@ApiStatus.Stable),
    with matching Builder.valueModifier(float) / Builder.modifierDurationTicks(int): an optional
    temporary value-gain multiplier applied when the pair synergy fires, lasting the given number
    of game ticks
  • SynergyBuffTracker (tracking): per-player, per-value-key temporary modifier store keyed
    off player.level().getGameTime(); activate(playerId, valueKey, modifier, expiryTick) sets a
    buff, getActiveModifier(playerId, valueKey, currentTick) reads it back and evicts it in place
    once expired; clearPlayer(playerId) drops all buffs for a player
  • SynergyAbsorptionModifier (tracking, implements AbsorptionModifier): stateless bridge
    that applies SynergyBuffTracker's active modifier during value absorption; registered in
    MariesLibBootstrap via MarieAPI.registerAbsorptionModifier
  • SourceApplicationPipeline.clearPlayer(playerId): clears the per-player synergy last-fired
    and value-synergy active-state maps; wired into the existing PlayerLoggedOutEvent handler
    (MarieCommandSupport.onPlayerLoggedOut) alongside the new SynergyBuffTracker.clearPlayer
    call, so synergy state no longer persists in memory after a player disconnects
  • Datapack schema keys value_modifier / modifier_duration_ticks
    (DatapackSchema.KEY_VALUE_MODIFIER / KEY_MODIFIER_DURATION_TICKS) for
    data/<namespace>/<modid>/source_synergies/<id>.json, both optional (default 1.0 / 0)
  • MarieDataLoader.parseSynergy / parseSourcePairSynergy: datapack loading for
    synergies/ and source_synergies/ is now implemented (previously threw
    UnsupportedOperationException and skipped the file)
  • CommandCapability / CommandCapabilityRegistry (@ApiStatus.Experimental):
    consuming-mod-registered command handlers keyed by (modId, capability) resource locations,
    via MarieAPI.registerCommandCapability
  • ExportWriter.writeExport(resolverId) and RegistryExporter: runs a registered
    ExportResolver over its target registry and writes
    config/<modid>/<resolverId>_export.json; wired into /marieslib dump <resolverId> /
    /marie dump <resolverId>
  • TagAuditReportWriter: writes a full TagReport (from TagScanner.scan) to disk; wired
    into a new /marieslib audit_tags <modid> command via MariesLibCommand.runAuditTags
  • MariesLibCommand.runDump / runAuditTags: command handlers backing the dump and
    audit_tags subcommands
  • SourceClassificationRegistry rewritten as a full config-backed registry (was previously a
    thin read-only view over SourceRegistry): load() / reload() / loadFromDatapack() read
    config/<modid>/source_classifications.json, auto-migrating existing
    source_overrides.json + source_values.json on first run; adds get(sourceId),
    getOverride(sourceId), getScore(itemId, valueKey), and setOverride(itemId, values, enabled)
  • RuntimeResolver classification trace: when a live external/scanner override exists for an
    item, a new EXTERNAL_CLASSIFICATION trace step is recorded explaining that gameplay uses the
    cached override rather than the live inference result shown below it

Changed

  • SourceOverrideRegistry and SourceValueRegistry removed, merged into the rewritten
    SourceClassificationRegistry; MarieKubeBindings.registerClassification and
    MarieLibContext scanner-score lookups now call SourceClassificationRegistry directly
  • MarieAPI: registration methods reordered/regrouped (export resolvers, config validators,
    tag audit, and the new command-capability registration now live together near the end of the
    class); no functional change to existing methods
  • MariesLib constructor: no longer auto-bootstraps MariesLibBootstrap when
    MarieLibContext is unregistered — this call was already removed from MarieAPI's
    fireSourceTrigger path in 0.1.1-beta.1's changelog notes but the constructor still had it;
    consuming mods must call MariesLibBootstrap.attach / bootstrap explicitly
  • RecipeInheritanceResolver.buildIndex(RecipeManager): now actually builds the ingredient
    index (this.recipeIndex = buildIndex()) instead of only storing the RecipeManager reference
  • PresetRegistry.PresetValues: replaced the fixed-field record (decayRate,
    criticalThreshold, lowThreshold, excessThreshold, defaultEffectDurationTicks,
    enableDecay, enableEffects) with a single opaque JsonObject values passthrough, so
    consuming mods can store arbitrary preset schemas instead of MariesLib-defined fields
  • MarieValueColors.resolvedDefaultArgb(key): no longer an alias for baseColorArgb; now
    resolves ValueDefinition.getColorOverride() first, then falls back to the palette-only color,
    bypassing transient UI overrides and ColorRegistry as intended for "is this actually
    customized" checks
  • ModCompat classpath resource loading (loadTier1BuiltIn, tier-2 mod loop): reads
    compat_registry.json / marie_compat.json via the current thread's context class loader
    first, falling back to ModCompat.class.getResourceAsStream, matching the same fix already
    applied to ScannerSpecRegistry in 0.1.1-beta.1
  • ScannerSpecRegistry.parseBundled(): also routes through the context class loader

Fixed

  • ColorRegistry.parseArgbString 0x/0X branch: parses the hex portion via
    Long.parseLong(hex, 16) with 0xFF_FF_FF_FF masking instead of Integer.decode, avoiding
    the same signed-decode inconsistency already fixed for other branches in 0.1.0-beta.5
  • MarieDebugCommand trace dump filename: analyze <item> writes to
    trace_dump_<item>_<timestamp>.txt instead of a single shared trace_dump.txt, so repeated or
    concurrent analyses no longer overwrite each other's output

Notes

  • Published artifact version is 0.1.1-beta.3 (gradle.properties)

MariesLib_v0.1.0-beta.2

Pre-release

Choose a tag to compare

@kgbcupcake kgbcupcake released this 28 Jun 00:06
5228bb5

[ MariesLib 0.1.1-beta.2 ] 2026-6-27

Config validation framework, tag-audit system, curve grid math, command extensions, and scanner spec graceful-skip.

Added

  • ConfigValidator (@ApiStatus.Stable): consuming-mod hook that validates its own configuration and
    returns a structured ValidationResult; registered via MarieAPI.registerConfigValidator
  • ConfigValidatorRegistry (@ApiStatus.Internal): keyed store of ConfigValidator instances;
    supports getAllRaw() for internal runner iteration
  • Finding (@ApiStatus.Stable): record carrying severity, file, key, and message for a
    single validation issue within a ValidationResult
  • ValidationResult (@ApiStatus.Stable): structured outcome of a config validator run; status is
    one of PASS, WARN, or FAIL, plus a list of Finding items
  • ValidationRunner.runForMod(modId) (@ApiStatus.Stable): filters and runs only the validators
    belonging to the given mod id; complements runAll() for per-consumer diagnostics
  • TagAuditContext (@ApiStatus.Stable): context interface passed to tag-audit rules; exposes
    knownCategories(), itemsInCategory(category), categoriesForItem(itemId),
    liveInferenceLookup(), and namespacesPresent()
  • TagRule (@ApiStatus.Stable): interface for pluggable tag-audit rules; implements
    findIssues(context) and suggestFixes(context, issues)
  • TagIssue (@ApiStatus.Stable): record describing a single tag problem with severity, category,
    itemId, and message
  • TagFixSuggestion (@ApiStatus.Stable): record carrying a corrective suggestion (category,
    itemId, action, reason) produced by a TagRule
  • TagAuditSeverity (@ApiStatus.Stable): severity enum (ERROR, WARN, INFO) for TagIssue
  • TagReport (@ApiStatus.Stable): result of a full TagScanner.scan run; includes timestamp,
    rulesRun, issues, and suggestions
  • TagScanner.scan(context) (@ApiStatus.Stable): iterates all registered TagRule instances,
    collects issues and fix suggestions, and returns a timestamped TagReport
  • TagRuleRegistry (@ApiStatus.Internal): ordered store of registered TagRule instances
  • TagAuditContextRegistry (@ApiStatus.Internal): per-modId store of TagAuditContext instances
  • CurveGrid (@ApiStatus.Stable): 2-D grid of float multipliers evaluated via bilinear
    interpolation; axes are (intensity, confidence) both normalised to [0, 1]; flat(xCells, yCells, value) constructs a uniform grid, evaluate(x, y) samples with clamping
  • CurveGridJson (@ApiStatus.Internal): JSON serialisation / deserialisation for CurveGrid
  • SourceClassificationRegistry (@ApiStatus.Stable): public read-only view of external source
    classifications registered via SourceRegistry; getAll() returns an unmodifiable map of
    ResourceLocation → SourceClassification(sourceId, values)
  • MarieAPI.registerConfigValidator(validator) (@ApiStatus.Stable): public registration entry
    point for ConfigValidator instances
  • MarieAPI.registerExportResolver(resolver) and registerExportResolver(key, registryKey, resolver)
    (@ApiStatus.Stable): two overloads for wiring ExportResolver instances into ExportResolverRegistry
  • MarieAPI.registerTagRule(rule) and MarieAPI.registerTagAuditContext(modId, context)
    (@ApiStatus.Stable): public registration entry points for the tag-audit system
  • /<modid> set_all <value> <player> (MarieConsumerCommandTree, permission 2): sets all
    registered value keys for the target player to the given normalised level in a single command via
    SourceApplicationPipeline.writeDirectValue
  • /<modid> validate (MarieConsumerCommandTree): runs all ConfigValidator instances
    registered for the consumer mod and prints PASS / WARN / FAIL results with per-finding detail in
    colour-coded chat; backed by MarieValidationCommands
  • /<modid> analyze <item> (MarieConsumerCommandTree, permission 0): resolves a
    ClassificationTrace for any food item via RuntimeResolver and writes a full inspector dump to
    config/<modid>/debug/analyze_<item>_<timestamp>.txt; suggests only food-bearing items via
    DataComponents.FOOD filter
  • MarieValidationCommands (@ApiStatus.Internal): internal command handler for the validate
    subcommand; formats ValidationResult output with ChatFormatting colour coding
  • SourceRegistry.getAllExternalClassifications(): returns a snapshot of all API- and KubeJS-
    registered classifications for external inspection

Changed

  • MariesLibCommand: removed duplicate registerLibraryTree call under MariesLib.MOD_ID; the
    library command tree is now registered only under the /marie alias
  • RecipeInheritanceResolver.getIngredients(): promoted to public visibility; added buildIndex(RecipeManager)
    to set the active recipe manager for ingredient index construction
  • MarieValueColors: additional accessor method(s) to support tag-audit and export tooling

Fixed

  • ScannerSpecRegistry.writeBundledTo(): now returns boolean instead of void; the caller
    (ensureLoaded) only logs a success message when true is returned and silently skips at
    DEBUG level when no bundled scanner_spec.json exists for the active modId, eliminating
    spurious warnings for mods that do not ship a bundled spec

Notes

  • Published artifact version is 0.1.1-beta.2 (gradle.properties)

MairiesHub v0.1.1-beta.1

Pre-release

Choose a tag to compare

@kgbcupcake kgbcupcake released this 22 Jun 12:42

[ MariesLib 0.1.1-beta.1 ] 2026-6-20

Generic registry-export framework, scanner spec loading fix, explicit bootstrap requirement, and registry frozen-state exposure.

Added

  • ExportResolver<T> (@ApiStatus.Stable): consuming-mod hook that resolves per-entry export
    data for an entire registry; registered via MarieAPI.registerExportResolver
  • ExportResolverRegistry (@ApiStatus.Internal): keyed store of export resolvers and their
    target ResourceKey<? extends Registry<T>>; never frozen so resolvers can register throughout mod init
  • RegistryExporter.run(resolverId) (@ApiStatus.Internal): iterates the resolver's target
    registry via BuiltInRegistries.REGISTRY, calls ExportResolver.resolve per entry, and returns
    non-empty results keyed by entry id
  • ExportWriter.writeExport(resolverId) (@ApiStatus.Internal): runs RegistryExporter and
    writes config/<modid>/<resolverId>_export.json as a sorted JSON array of
    {"id": "<resource location>", "data": {...}} objects; nested Map values serialize as JSON objects
  • /marieslib dump <resolverId> and /marie dump <resolverId> (MariesLibCommand): runs
    ExportWriter.writeExport and reports the output path or a failure message
  • MarieAPI.registerExportResolver(resolverId, registryKey, resolver) (@ApiStatus.Stable):
    public registration entry point with MarieAPIState phase guard and blank-resolverId validation
  • ValueRegistry.isFrozen() (@ApiStatus.Internal): exposes the underlying
    AbstractRegistry frozen state via INSTANCE.isFrozen(), matching the existing
    freezeInternal() / resetInternal() internal lifecycle surface

Changed

  • MariesLib constructor: no longer auto-calls MariesLibBootstrap.bootstrap() when
    MarieLibContext is unregistered; consuming mods must bootstrap explicitly via
    MariesLibBootstrap.attach / bootstrap

Fixed

  • ScannerSpecRegistry bundled spec loading (parseBundled, writeBundledTo): reads
    scanner_spec.json via Thread.currentThread().getContextClassLoader() (with the leading
    / stripped from the resource path) instead of ScannerSpecRegistry.class.getResourceAsStream,
    so specs packaged in the consuming mod's jar (e.g. Nourished) resolve correctly instead of
    failing with Bundled scanner_spec.json missing

Notes

  • Published artifact version is 0.1.1-beta.1 (gradle.properties)

v0.1.0-beta.5

v0.1.0-beta.5 Pre-release
Pre-release

Choose a tag to compare

@kgbcupcake kgbcupcake released this 19 Jun 02:31

[ MariesLib 0.1.0-beta.5 ] 2026-6-16

Color resolution and ARGB parsing fixes for value customization detection.

Added

  • MarieValueColors.resolvedDefaultArgb(String key): returns a value key's true default ARGB,
    checking ValueDefinition.colorOverride then the built-in palette, while bypassing transient
    OVERRIDES and ColorRegistry; use this (not paletteOnlyArgb) when deciding whether an
    edited color is an actual customization
  • IMarieLibConfig.decayRateFor(String valueKey) and MarieLibContext.Builder.decayRateFor(Function<String, Float>):
    per-value decay rate resolver wired through config context; defaults to
    ValueDefinition.getDefaultDecayRate() with 0.001f fallback when the key is unknown

Fixed

  • ColorRegistry.parseArgbString 0x/0X branch: parses hex via Long.parseLong with
    0xFF_FF_FF_FF masking instead of Integer.decode, matching the #RRGGBB and bare 8-digit
    branches and avoiding signed-decode inconsistencies on full ARGB literals
  • ValueDecayListener decay tick rate: uses IMarieLibConfig.get().decayRateFor(key) instead
    of always reading ValueDefinition.getDefaultDecayRate(), so consuming-mod overrides take effect
  • MarieCommandSource / MariePlayerCommands decay display: report and value-detail commands
    route decay rates through IMarieLibConfig.decayRateFor(key) instead of hard-coded definition
    defaults
  • SourceRegistry.clearExternalClassifications(): API/KubeJS registerClassification()
    entries are tracked in API_REGISTERED_CLASSIFICATIONS and re-applied after each clear, so
    classifications registered at mod construction survive TagsUpdatedEvent reload passes
    (datapack-sourced entries are still cleared and reloaded normally)
  • CriticalValueToast value name: falls back to the raw valueKey when the tracking-bar
    translation key is missing, instead of showing the untranslated key path in the toast
    title/subtitle

Notes

  • Published artifact version is 0.1.0-beta.5 (gradle.properties)

v0.1.0-beta.4

v0.1.0-beta.4 Pre-release
Pre-release

Choose a tag to compare

@kgbcupcake kgbcupcake released this 16 Jun 21:21

Fixed

  • SourceRegistry registration logs dropped from INFO to DEBUG, no more per-item classification spam on every reload
  • External classification cap warnings now log once per item per server session instead of repeating on every reload

Requires Minecraft 1.21.1, NeoForge 21.1.x, Java 21.

MariesLib_v0.1.0-beta.3

Pre-release

Choose a tag to compare

@kgbcupcake kgbcupcake released this 16 Jun 02:50

Milestone tracking release. Cumulative intake milestones are now tracked at runtime,
fired as events, loadable from datapacks, and exposed to KubeJS.

Added

  • MilestoneTriggeredEvent in MarieEvents, fired after a player completes a cumulative
    intake milestone and configured rewards are applied
  • MilestoneProgressData, per-player cumulative intake totals and one-shot completion
    bookkeeping, serialized separately from TrackingData
  • MilestoneProgressAttachment, NeoForge data attachment (milestone_progress) with
    copyOnDeath(), gated by FeatureFlagCache.enableMilestones()
  • MilestoneTracker, accumulates positive value intake, detects first-time completions,
    grants mob-effect and advancement rewards, then posts MilestoneTriggeredEvent
  • MarieDatapackCallbacks, default MarieDataLoader.Callbacks implementation that delegates
    datapack registrations to MarieAPI (values, effects, synergies, milestones, profiles, compat,
    source families, module locks)
  • Datapack milestone parsing in MarieDataLoader for
    data/<namespace>/<modid>/milestones/<id>.json (valueKey, cumulativeGoal, optional
    rewardEffectId, amplifier, rewardDuration, advancementId)
  • Bootstrap wiring in MariesLibBootstrap: registers MilestoneProgressAttachment and sets
    MarieDataManager.setCallbacks(MarieDatapackCallbacks.INSTANCE) on standalone bootstrap
  • advancementId on MarieKubeBindings.registerMilestone, optional KubeJS spec key mapped to
    MilestoneDefinition.Builder.advancement()

Architecture

  • Pipeline hook: SourceApplicationPipeline calls MilestoneTracker.onValueApplied(player, key, finalDelta) after each positive per-valueKey delta is applied and SourceAppliedEvent is
    posted
  • Reward flow: MilestoneTracker applies optional mob effects via BuiltInRegistries.MOB_EFFECT,
    awards advancements through the server advancement manager, and logs warnings for unknown
    effect/advancement IDs
  • Feature gating: milestone progress reads and writes are no-ops when
    FeatureFlagCache.enableMilestones() is false

API

  • MarieEvents.MilestoneTriggeredEvent: getPlayer(), getMilestone(), getValueKey(),
    getCumulativeIntake()

Integrations

  • KubeJS milestoneTriggered event: MarieKubeEvents.MILESTONE_TRIGGERED /
    MarieMilestoneTriggeredEvent exposes playerId, milestoneId, valueKey, cumulativeIntake,
    and cumulativeGoal; bridged through KubeEventBridge with KubeGuard listener short-circuit

Notes

  • Published artifact version is 0.1.0-beta.3 (gradle.properties)
  • Milestones datapack loader from 1.0.0 is now fully wired (previously threw
    UnsupportedOperationException at parse time)