NerolandCore 1.15.0 - NeoForge 26.2
Curse Maven Snippet
What's new
Integration seams requested by NeroEconomy, plus hardening. Additive only: no existing public signature, record component, tag, id, capability or config key changes.
Added
- Attributed currency calls.
CurrencyApi.deposit/withdraw(UUID, Currency, long, String sourceModId, String reason)andCurrencyApi.transfer(UUID, UUID, Currency, long, String, String).sourceModIdmust match[a-z0-9_.-]{1,64}andreasonmust match[a-z0-9_]{1,32}; an invalid value returnsfalsewithout reaching the provider.CurrencyProvidergains matching default overloads that delegate to the 3-argument methods, so existing providers are unaffected. CurrencyEvents.onAttributedChangeand the newCurrencyEvents.AttributedChange(change, sourceModId, reason)record. This is a side-channel:BalanceChangeandonChangeare unchanged.event.SourceIdsholds the sharedSOURCE_MOD_ID/REASONpatterns andisValidSourceModId/isValidReason.- Threshold publisher identity.
ThresholdEvents.fire(String sourceModId, ThresholdCrossing),ThresholdEvents.onSourcedCrossing(Consumer<SourcedCrossing>)and theThresholdEvents.SourcedCrossing(sourceModId, crossing)record. The existingfire(crossing)still works and reports anullsource. - Offline progression gates.
ProgressionGates.isOpen/open/close(MinecraftServer, UUID, Identifier)work for online and offline players. ATEAMgate resolves through the player's scoreboard team (looked up by their cached profile name) and falls back to the player's own row. These overloads fire the sameGateEventsand re-sync online players. - Item lookup seam. The
item.ItemSourceinterface (count(server, player, itemId)andextract(server, player, itemId, n, simulate)) and theitem.ItemSourcesregistry, keyed by mod id. The registry providesregister,unregister,get,modIds,count,countBySourceandextract; it aggregates in registration order and isolates failing sources. SavedDataRecovery.backupNow(ServerLevel, SavedDataType, T, String, HolderLookup.Provider)encodes with an explicit registry provider.- NeroLink alert caps in new config keys
linkAlertsMaxPerPlayer(default 50) andlinkAlertsMaxPerModule(default 25). Over a cap, the oldest acknowledged alert is evicted first, then the oldest. Each eviction publishes analertsevent with"event": "evicted".
Changed
- Listener isolation on every Core bus.
CurrencyEvents,ReputationEvents,GateEvents,MaterialMilestoneEvents,ThresholdEvents,LinkEventBusandItemSourcesnow catch a listener'sRuntimeException, log it once per listener class (bus, class, exception type and top frame only, never the payload or message) and continue with the next listener. LinkAlertspublishes itsalertsevents under the alert's own module id, falling back tocorewhen the id is blank. Previously every alert event was published ascore.SavedDataRecoverybackups are now encoded and decoded with the level's registry-aware ops, so stores holding registry-backed data (item stacks with components) back up correctly on 26.x.- Each loader manifest now caps the Minecraft range per cell, so a jar only loads on its own minor line.
This avoids cross-line
NoSuchMethodErrorcrashes. registry.BlockCodecsnow looks up codecs withMethodHandlesinstead of broad reflection.
Fixed
- Silent saved-data decode failures on 26.x. On 26.x vanilla does not throw for an unreadable file or
a codec error: it returns a fresh or partial store, which the first backup pass then wrote over the good
backup.
SavedDataRecovery.getnow re-checks each store's primary file on its first load per world. If the codec rejects the file, it restores the last-known-good backup and reports the failure through the log and the scrubbed handled-error telemetry. With no usable backup, it keeps vanilla's store without overwriting the unreadable file. - Datapack-driven loaders (meteor materials, gates, material milestones) also catch
LinkageErrorand fall back to their built-in defaults.
All Relations
- All Relations
- Embedded Library
- Optional Dependency
- Required Dependency
- Tool
- Incompatible
- Include
This mod has no related projects

