NeroQuests 0.2.0-beta.1 - Fabric 26.3
Curse Maven Snippet
What's new
Minecraft 26.3 support, plus the changes previously listed under Unreleased.
Added
neroquests:custom_event, the seventh objective type — a quest can now wait on another mod reporting that one of its tracked quantities crossed a threshold: a region's pollution, a colony's life support, a boss changing phase. The publisher fires a crossing on Neroland Core'sThresholdEventsbus and NeroQuests listens, so neither mod imports the other and both depend only on Core. This closes the last gap in the objective set:gate_openalready covered your progress, and this covers the world's.- The objective matches on exactly what a crossing carries and nothing else —
channel,event_scope(the crossing's scope key, named so it can never be read as the quest's ownscope),direction(rising/falling/any),min_value/max_valueandcount. - Channels follow a
<modid>:<channel>convention, and that convention is load-bearing. The namespace is how the objective works out whether the publishing mod is installed at all: a channel nobody publishes can never fire, so it is treated as missing content and degrades undermissingModObjectivePolicy—skiporautocomplete— exactly like an unregistered item id or an unloaded dimension, instead of blocking the quest forever. A publisher that is installed but switched off (NeroColonies'thresholdEventsEnabled, Nerotech'spollutionEventThreshold) is deliberately not missing content: the objective waits, because an operator can turn it back on. audiencedecides who a broadcast is credited to, and the default is the safe one. A crossing names a place or a system and never a person — Core's contract, for POPIA/GDPR reasons — so nothing in the event says whose quest should move.audience: world(the default) moves the quest's shared counter exactly once per crossing, however many players were online;audience: everyoneis the explicit opt-in that credits every online player working on the quest. Without that split, one colony's good news would silently complete a personal quest for a player asleep on the other side of the world.- Shared counters move once per crossing even though the trigger fans out over every online player: each objective instance is claimed by the first pass that credits it, by identity.
- A
custom_eventleft onaudience: worldinside ascope: playerquest has no shared counter to write and could never advance, soQuestDefinitionsnow drops that quest at load time with the reason named in/neroquests reload-check, rather than shipping a counter that never ticks. The check runs through a newObjectiveSpec.unusableInScope(QuestScope)seam, so it is a general "this objective cannot work here" rule and not a special case for one type. CoreEvents.onThresholdis now subscribed fromQuestTriggers.init(), alongside the existing progression-gate subscription. Both of Core's buses are add-only — there is no way to remove a listener — so the only correct lifecycle is one subscription per JVM, which common init gives: nothing leaks across an integrated-server world switch and there is nothing to unsubscribe on server stop. Per-server state is dropped instead, by the existing server-instance check inserverTick, and the handler does nothing while there is no current server.- Three new quests in The Space Race, branching off First Colony and taking the chapter to 10
(27 across the whole spine): Breathing Room (
nerocolonies:oxygen,scope: server), Full Larder (nerocolonies:food_stock,scope: server) and Settled Ground (nerocolonies:structurespast its third building,scope: playerwithaudience: everyone). They are thealloy_ambitionspattern applied to events: an optional branch that fills in when a colony mod is present and degrades quietly when it is not, so the spine still plays through on a Core-only server. - Quest-book line for the new type (
gui.neroquests.objective.custom_event), showing the raw channel id — its meaning belongs to the publishing mod, and NeroQuests has no dependency on it to ask for a nicer name.
Documentation
wiki/Quest-Format.mdgains a fullcustom_eventsection: the field table, the<modid>:<channel>convention, the broadcast-versus-player-scoped semantics, the degradation behaviour, and a table of the six channels that actually exist today across Nerotech, NeroColonies and NeroCreatures — what each scope key and value means, and whatrisingmeans on each (it is not a synonym for "good": rising is recovery onnerocolonies:oxygenand a worsening onnerotech:pollution).wiki/Objectives.mddocuments the type in full alongside the other six;wiki/Story-Chapters.mdcovers the new branch;USING-CORE.mdmovesevent.ThresholdEventsout of Deferred and into the consumed-API table.
Notes
- No Core pin bump:
ThresholdEventsshipped in Core 1.7.0 and NeroQuests already pins 1.9.0. - Core exposes no
removeCrossingListener. That is fine for a once-per-JVM subscription, but it does mean a listener cannot be withdrawn — worth an upstream look if Core ever grows unloadable modules. - Runtime verification of the new objective needs a second mod to fire a crossing; it is not covered by the compile-verify pass.
Minecraft 26.3
- Minecraft 26.3 as a new Stonecutter node on every loader — NeoForge
26.3.0.7-beta, Forge26.3-66.0.2and Fabric (fabric-api0.161.0+26.3, NeoForm26.3-1) — built alongside 26.1.2 and 26.2, so every release now ships nine loader × version jars. - VS Code run/debug configurations (
.vscode/launch.json,.vscode/tasks.json) gain the three 26.3 cells; the "Build all" task now builds all nine. - CI (
multiloader.yml,publish.yml) builds, attaches and publishes the 26.3 jars. - Requires Neroland Core 1.13.0 (was
1.9.0) — the first Core release with a 26.3 build. The loader range still derives from the pin ([${nerolandcore_version},2.0)). - JEI pins moved to the newest published builds on each Minecraft version:
29.40.0.101(26.1.2),30.35.0.223(26.2) and31.3.0.18(26.3). Compile-time API only — JEI remains a soft dependency and the shipped jar gains no hard requirement.
26.3 port notes
- 26.3 API differences are handled with Stonecutter blocks:
PoseStack#rotate(wasmulPose), the newPredictionargument ondrop/placeItemBackInInventory,setPermanentlyInvulnerable, and similar renames. - Build: the shared
common/Java source is now preprocessed by Stonecutter for every non-active node (stonecutterProcessCommon), so common code can carry//? if >=26.3 {blocks, andcommon/src/main/resources-<mc>overlay folders are merged over the shared resources for matching nodes (mergeCommonResources). The active node still compiles the rawcommon/folder. - Build plugins aligned with Neroland Core: ModDevGradle
2.0.147(the older 2.0.141 cannot set up NeoForge 26.3), ForgeGradle7.0.40, Stonecutter0.9.8.
This mod has no additional files
