Commit Graph

73 Commits

Author SHA1 Message Date
Matt a139196f77 Merge pull request 'launcher: EnableWindowsTargeting for Linux builds' (#30) from feature/cross-compile-launcher-from-linux into main 2026-05-23 16:40:24 +00:00
Matt 4315696136 launcher: add EnableWindowsTargeting for cross-compile from Linux
Microsoft.NET.Sdk.WindowsDesktop emits NETSDK1100 when a Windows-
targeting project is built from a non-Windows host. Setting
EnableWindowsTargeting=true opts in to the cross-compile path, which
works on Linux as long as the WindowsDesktop SDK files are present.

On glados they were copied from a Windows .NET 8 SDK archive into
/usr/lib/dotnet/sdk/8.0.126/Sdks/Microsoft.NET.Sdk.WindowsDesktop/
and /usr/lib/dotnet/packs/Microsoft.WindowsDesktop.App.Ref/. This is
a one-time setup per Linux host -- see the bridge-claude memory note.

No-op on Windows hosts (the flag has no effect when the SDK is native).
Both PC builds and glados builds now produce the same output.
2026-05-23 16:40:23 +00:00
Matt af45997a8b Merge pull request 'launcher: version 0.4.9' (#29) from chore/launcher-version-bump into main 2026-05-23 16:35:13 +00:00
Matt 444cadd921 launcher: bump version 0.4.8 -> 0.4.9 for session-refresh fix
So existing 0.4.8 installs see the upgrade banner in their current
launcher after the next deploy. The actual session-refresh code change
landed in the previous commit (DoLaunchAsync pre-launch refresh).
2026-05-23 16:35:13 +00:00
Matt 36acbafea5 Merge pull request 'launcher: refresh Microsoft session before launch' (#28) from feature/launcher-pre-launch-refresh into main 2026-05-23 16:31:17 +00:00
Matt 8e00526d27 launcher: refresh Microsoft session right before launch
Microsoft access tokens have a ~1 hour TTL. The launcher cached the
MSession once at sign-in and re-used it on every Play click, so leaving
the launcher open for >1 hour and then hitting Play sent stale
credentials to MC -- Mojang's session check on the server then rejected
the join with "Invalid session".

Fix: in DoLaunchAsync, before assembling the MC launch command, call
_auth.TryAuthenticateSilentlyAsync(). XboxAuthNet's silent flow uses
the cached refresh token (~14 day TTL) to mint a fresh access token
transparently. On success ApplySession swaps in the new MSession and
we launch with valid credentials. On failure (refresh token also
stale) the launcher prompts the player to sign in again -- they keep
the launcher open, hit Sign In, no MC restart needed.

No new dependencies, no UI change beyond the brief "Refreshing
session..." status line, no perf cost beyond the ~500ms HTTP roundtrip
to Microsoft each launch.

Bump the launcher version in launcher/ModpackLauncher.csproj before
publishing so old launcher installs see the upgrade banner.
2026-05-23 16:31:17 +00:00
Matt 67870f0648 Merge pull request 'Drop jei_hides.js (wrong JEI API binding)' (#27) from fix/drop-jei-hides into main 2026-05-23 16:22:01 +00:00
Matt d24f7f03a3 kubejs: drop jei_hides.js (wrong API binding), 0.21.1 -> 0.21.2
Two consecutive client_scripts errors traced to jei_hides.js:
1. Array-spread syntax not supported by Rhino (fixed in 0.21.1)
2. JEIEvents global is not defined in KubeJS 2101.7 -- the actual JEI
   event API uses classes like JEIRemoveEntriesKubeEvent but the binding
   name is something different we haven't identified yet.

Rather than ship more guesses, drop the script entirely. Functional
impact is minimal: recipes for waystones + coins are still removed
server-side (recipes_waystones.js, recipes_numismatics.js), so players
cannot craft these items even if they appear in JEI search. The only
loss is some JEI clutter.

When we identify the correct JEI hide API in KubeJS 2101.x, can add
back as kubejs/client_scripts/jei_hides.js with the right binding.
2026-05-23 16:22:01 +00:00
Matt 28a02d0ced Merge pull request 'jei_hides: Rhino-compatible (no array spread)' (#26) from fix/jei-hides-rhino-spread into main 2026-05-23 16:18:51 +00:00
Matt d5fd2c97e9 jei_hides: use .concat instead of array-spread (Rhino compat). 0.21.0 -> 0.21.1.
KubeJS uses Rhino as its JS engine, which doesn't support array-spread
syntax (`[...a, ...b]`). The line `[...WAYSTONE_ITEMS, ...COIN_ITEMS]
.forEach(...)` threw EvaluatorException: syntax error at jei_hides.js:46
on client launch, surfacing the KubeJS client script errors dialog.

Fix: use Array.prototype.concat() which is universal JS. Also extracted
the hide-quietly helper into a named function for readability.
2026-05-23 16:18:50 +00:00
Matt ae061a5035 Merge pull request 'v0.21.0: Plot system V1' (#25) from feature/plots-v1 into main 2026-05-23 16:02:05 +00:00
Matt 6264785f2c plots: v1 spawn-commercial-plots system, bump to 0.21.0
/bns plot list|info|buy|release|reload. Single ~316-line file with
clear sections. Hardcoded PLOT_DEFS Map (3 example plots), ownership
state in server.persistentData.bnsPlots, best-effort Numismatics +
FTB Chunks integration (will be verified in playtest). See file
header for full design notes.
2026-05-23 16:01:47 +00:00
Matt 998ec21bb5 Merge pull request 'Fix bns_admin command registration' (#24) from fix/bns-admin-int-range into main 2026-05-23 15:41:34 +00:00
Matt aa881bfc65 bns_admin: drop INTEGER range args (KubeJS wrapper doesn't expose them), validate in handler instead. 0.20.0 -> 0.20.1. 2026-05-23 15:41:34 +00:00
Matt 3cec2cb69b Merge pull request 'v0.20.0: KubeJS tidying + admin commands' (#23) from feature/v0.20.0-tidying into main 2026-05-23 15:40:00 +00:00
Matt c699dcc77b pack: KubeJS tidying + admin commands, bump to 0.20.0
Tidying pass on the KubeJS suite before plot system V1 lands. Sets up
the file structure + conventions + diagnostics so the larger plot
system has a clean foundation.

Changes:

1. NEW kubejs/README.md
   File layout doc + conventions: logging prefix [bns/<module>],
   persistent-data key naming (bns* prefix), one concern per file,
   performance discipline (O(1) lookups, no polling).

2. Split economy_policy.js -> recipes_waystones.js + recipes_numismatics.js
   Single-concern files. recipes_waystones removes ALL waystones
   crafting (welcome.js distributes the only allowed waystone instead).
   recipes_numismatics removes the 5 coin-denomination crafts.

3. NEW kubejs/server_scripts/bns_admin.js
   /bns admin subcommands for OP diagnostics:
     - info                       calling player's flags+counts
     - waystone-count <player>    read stored count
     - waystone-set <player> <n>  override stored count
     - reset-welcome <player>     clear bnsWelcomeGranted -- replays
                                  the welcome grant on next login
   Registered via ServerEvents.commandRegistry with Brigadier tree,
   permission level 2 (OP). No performance cost (operator-triggered only).

4. Logging added to waystones_policy.js + welcome.js
   Every action prints `[bns/<module>] ...` so server logs can be
   filtered with `journalctl ... | grep '\[bns/'`.

Performance discipline applied:
- All event-handler lookups use Set.has (O(1)), not Array.includes
- No periodic tick polling anywhere
- No network calls in event handlers
- console.info is cheap (no string format unless logged)

Bumps to 0.20.0. Plot system V1 follows in v0.21.x as a separate
multi-file submodule under server_scripts/plots/.
2026-05-23 15:39:59 +00:00
Matt f39205404a Merge pull request 'RPO: default-enable CC Recreated pack' (#22) from feature/rpo-default-config into main 2026-05-23 15:32:49 +00:00
Matt b3d46931b2 rpo: ship default-enable config for ComputerCraft Recreated, bump 0.19.5
Resource Pack Overrides config field names extracted directly from the
mod's class files (default_packs + default_overrides confirmed via grep
on the .class strings). Config ships through defaultconfigs/ so it
seeds the player's local config on first run and respects later edits.

The 'default_position: TOP' override puts the ReCreated pack at the top
of the enabled-packs list so it takes precedence over the vanilla
ComputerCraft textures.

If the filename or schema turns out to be off when tested, it's a
one-line follow-up to fix.
2026-05-23 15:32:49 +00:00
Matt 5d0011d4e2 Merge pull request 'Add Resource Pack Overrides + revert server-push' (#21) from feature/resource-pack-overrides into main 2026-05-23 15:27:11 +00:00
Matt c6fb859db8 pack: add Resource Pack Overrides, revert server-push enforcement
Two changes per user direction:
- server.properties is reverted (resource-pack lines cleared, require=
  false). No more server-pushed pack -- no prompt on join, no kick if
  declined, no redundant re-download of a file the launcher already
  shipped.
- Adds resource-pack-overrides (Modrinth's gold-standard "auto-enable
  bundled resource packs" mod, 8.2M dl, client-only). The Computer
  Craft Recreated v1.2.zip already ships in the modpack manifest
  (side=client) so it's already in players' resourcepacks/ folder via
  the launcher -- RPO will be configured to default-enable it.

The RPO config (`pack/overrides/config/resourcepackoverrides-client.toml`
or similar) lands in a follow-up once we've seen the generated format.
For now this commit just gets the mod into the pack. Bumps to 0.19.4.
2026-05-23 15:27:10 +00:00
Matt 86d8f3e80d Merge pull request 'CC recipes: plastic-everywhere + advanced-contains-basic' (#20) from feature/cc-recipes-progression into main 2026-05-23 15:20:21 +00:00
Matt 3e1f5c01ed cc: plastic-everywhere + advanced-contains-basic upgrade chains
Two design changes:

1) Every electronic CC item now requires tfmg:plastic_sheet. Plastic is
   the electrical insulator and gates ALL CC tech behind TFMG's full
   oil chain (crude oil -> naphtha -> distillation -> molten plastic
   -> sheet). Even cable -- you can't lay wires without insulation.

2) Advanced items now embed their Basic counterpart in the recipe:
   - computer_advanced  contains  computer_normal
   - monitor_advanced   contains  monitor_normal
   - wireless_modem_advanced  contains  wireless_modem_normal
   - pocket_computer_advanced contains pocket_computer_normal
   - turtle_advanced    contains  computer_advanced  (which contains
                                  computer_normal -- chained upgrade)

   This makes the progression literal -- you can't skip Basic to make
   Advanced. You upgrade through, paying both costs.

Other tweaks:
- Replaced create:railway_casing with create:industrial_iron_block in
  the Advanced Computer recipe. Railway casing is thematically tied to
  trains, not computing -- creates a weird "build trains to make a
  computer" dependency. industrial_iron_block fits the server-rack
  aesthetic and is a more general Create tier-3 material.
- Added plastic to disk_drive, wired_modem, printer, redstone_relay,
  speaker (recipes that previously skipped it).

Bumps to 0.19.3.
2026-05-23 15:20:20 +00:00
Matt 34e24df0b3 Merge pull request 'Drop orphan pocket_computer_colour recipe' (#19) from fix/cc-pocket-colour into main 2026-05-23 15:12:13 +00:00
Matt ce8304d6cb cc: drop orphan pocket_computer_colour recipe (not a real item, just a state variant of _advanced). Removes startup warning. 0.19.1 -> 0.19.2. 2026-05-23 15:12:12 +00:00
Matt 7eb70bfa78 Merge pull request 'Full CC recipe overhaul (19 items, 5 tiers)' (#18) from feature/cc-recipes-full into main 2026-05-23 15:11:11 +00:00
Matt add5803191 pack: full CC recipe overhaul — 19 items across 5 progression tiers
Expands the v0.19.0 recipe set from 10 to 19 items and builds a deliberate
5-tier progression using richer Create + TFMG materials.

Newly overhauled items:
  T1 - cable (8-output, copper_wire-heavy so bulk-laying is viable)
  T3 - redstone_relay
  T3 - turtle_normal
  T4 - turtle_advanced
  T5 - pocket_computer_normal, _advanced, _colour
  Misc - wired_modem_full (block form, derived from wired_modem)

Existing items reworked with better thematic materials:
  computer_normal/advanced  -> now uses create:brass_casing / railway_casing
                                as the chassis instead of bare plastic
  monitor_normal/advanced   -> nixie_tube for the retro CRT, display_link
                                for the advanced data-binding monitor
  wireless_modem_normal     -> tfmg:electromagnetic_coil is the antenna,
                                copper_wire + aluminum_wire signal lines
  wireless_modem_advanced   -> constantan_spool + large_coil for high-Q
                                tuning -- properly end-game wireless
  disk_drive                -> create:cogwheel for the spinning read head
  speaker / printer         -> copper_sheet / cogwheel for thematic flair

Wire usage is the through-line: copper_wire in T1-T2 (cheap, used in
quantity), aluminum_wire in T3 mid-tier signal lines, constantan_wire
+ constantan_spool in T4 for high-frequency wireless. TFMG's electrical
production now genuinely gates CC progression.

Bumps pack to 0.19.1 (point release — same mod set, expanded scripts).
2026-05-23 15:11:11 +00:00
Matt e74f123896 Merge pull request 'v0.19.0: Easy NPC + CC: Tweaked + recipe overhaul' (#17) from feature/v0.19.0-npc-cc-plots into main 2026-05-23 14:59:55 +00:00
Matt fe5b7ce1ea pack: add Easy NPC + CC: Tweaked + recipe overhaul, bump to 0.19.0
Mods (5 additions):
- Easy NPC 6.16.1 (3 jars: bundle + core + config_ui). Lightweight,
  config-UI-driven NPC mod -- 817k downloads, NOT the heavyweight
  Custom NPCs by Noppes which has no 1.21.1 NeoForge port. Players
  will interact with NPCs at spawn (Plot Office land clerk + future
  shop NPCs) via right-click -> dialogue.
- CC: Tweaked 1.119.0. ComputerCraft tier added for technical displays,
  server stats, and player-built automation. Future plot-system V2
  could use CC monitors as the central kiosk with touch buttons; V1
  uses NPC + signs.
- Computer Craft: ReCreated v1.2 (resource pack, client-only). Styles
  CC's computers + monitors with a brass/wooden Create aesthetic so
  they don't look out of place in the pack.

KubeJS scripts:
- cc_recipes.js: Overhauls 10 CC crafting recipes to require Create
  (electron_tube, precision_mechanism, rose_quartz) + TFMG (plastic
  sheet, steel ingot, silicon ingot). Gates the tech tier behind
  Create+industrial progression. Recipes for cables, peripheral
  blocks, turtles, etc. left at default -- can iterate later.

Plot system V1 deferred to v0.20.0 -- needs its own focused effort
because of the FTB Chunks claim-transfer integration + Numismatics
inventory coin handling. Memory plan already covers the design.
2026-05-23 14:59:55 +00:00
Matt d3a9d4e12a Merge pull request 'Fix Numismatics coin IDs (5 denominations)' (#16) from fix/numismatics-coin-ids into main 2026-05-23 14:18:12 +00:00
Matt 01e1e4a502 pack: correct Numismatics coin IDs (5 denominations, not 4)
The 0.18.0 economy_policy.js named 'numismatics:sundial' which doesn't
exist -- the real registry IDs are spur, bevel, cog, crown, sun. The
KubeJS warning surfaced this at startup:

  Failed to read ingredient from numismatics:sundial:
  Item with ID numismatics:sundial does not exist!

Updates both economy_policy.js (recipe removal) and jei_hides.js (JEI
hide) to use the correct 5-denomination list. Bumps to 0.18.1.
2026-05-23 14:18:11 +00:00
Matt e53b4cc868 Merge pull request 'Economy MVP: Numismatics+Patchouli+welcome flow' (#15) from feature/economy-mvp into main 2026-05-23 14:16:45 +00:00
Matt 2ac4b2f2cd pack: economy MVP -- Numismatics + Patchouli + welcome flow, bump to 0.18.0
Adds the currency layer and the first-join experience.

Mods:
- Create: Numismatics 1.0.20  (currency, vendor blocks, piggy banks)
- Patchouli 1.21.1-93         (kept in pack for future rich manual book)

KubeJS scripts (server_scripts/):
- economy_policy.js  remove ALL Waystones recipes; remove coin recipes
                     only (piggy banks etc. stay craftable for now)
- welcome.js         first-login grant: 1 waystone + vanilla written-book
                     "Brass & Sigil Manual v1" (5 pages: welcome,
                     waystones, money, spawn plots, rules). Per-player
                     flag bnsWelcomeGranted in persistentData gates it.

KubeJS scripts (client_scripts/):
- jei_hides.js       hide all Waystones items + 4 coin denominations from
                     the JEI ingredient list. Combined with the recipe
                     removal players never encounter these items via
                     normal play -- only via the welcome grant or the
                     bank exchange.

The written-book manual is the MVP placeholder. When more content lands
(plot system, dynamic exchange, etc.) it'll be replaced by a proper
Patchouli book authored as a tweak jar -- Patchouli's already in the
lockfile so no mod-add will be needed at that point.
2026-05-23 14:16:45 +00:00
Matt d60c0176dd Merge pull request 'Waystones policy KubeJS (1/player + ban share/portstones)' (#14) from feature/waystones-policy-kubejs into main 2026-05-23 13:40:30 +00:00
Matt b064a9f515 pack: KubeJS Waystones policy (1-per-player + ban share/portstones)
Adds pack/overrides/kubejs/server_scripts/waystones_policy.js which:

- Caps regular waystones at 1 per player. Per-player count is stored in
  player.persistentData and decremented on break (works correctly because
  restrictedWaystones = ["PLAYER"] means only owners can break).
- Bans all 16 sharestone variants. They defeat the "build transport"
  intent (solo pair-teleport) and can be placed just outside a claim
  for stealth proximity access.
- Bans all 16 portstone variants pending separate design review.
- Leaves warp plates and warp scrolls untouched.

Bumps to 0.17.0 so launcher re-syncs.
2026-05-23 13:40:29 +00:00
Matt c29dd2d690 Merge pull request 'Fix gitignore + track Waystones override' (#13) from fix/gitignore-overrides into main 2026-05-23 12:57:42 +00:00
Matt 0bdc48c86f gitignore: scope overrides ignore to mods/, track defaultconfigs/
The previous rule 'pack/overrides/' ignored the whole directory, which
made it impossible to re-include subpaths via ! exception (git's rule).

Narrow the ignore to 'pack/overrides/mods/' -- the only path that
Build-Tweaks.ps1 actually writes -- and drop the broken whitelist
block. Other subdirs under pack/overrides/ (defaultconfigs/, etc.) now
live in git like normal source.

Adds the Waystones override that 0.16.1 attempted (spawnInVillages =
DISABLED). Bumps to 0.16.3 so launcher caches re-sync.
2026-05-23 12:57:41 +00:00
Matt 02e50f2fe5 Merge pull request 'Track pack/overrides/defaultconfigs/ + Waystones override' (#12) from feature/track-defaultconfigs into main 2026-05-23 12:56:13 +00:00
Matt 50007e1109 pack: track pack/overrides/defaultconfigs/ + ship Waystones override
.gitignore previously ignored all of pack/overrides/ because that dir is
the build output of Build-Tweaks.ps1. But defaultconfigs/ inside it holds
hand-written source-of-truth configs that should be in git (otherwise
they don't survive cross-machine deploys). Whitelisting that subdir.

Adds pack/overrides/defaultconfigs/waystones-common.toml -- the same
file the empty 0.16.1 commit was supposed to ship but couldn't because
of the .gitignore rule. Bumps to 0.16.2.

The override changes just one key:
- spawnInVillages: REGULAR -> DISABLED

All other Waystones settings stay at mod default (ACTIVATION visibility,
PLAYER restriction, empty allowedVisibilities) which already provides
the base-intrusion protections we discussed.
2026-05-23 12:56:13 +00:00
Matt d4dfcb1e11 Merge pull request 'Tune Waystones config + ship via defaultconfigs' (#11) from feature/waystones-config into main 2026-05-23 12:55:19 +00:00
Matt 3dc0767a24 pack: tune Waystones config + bump to 0.16.1
Ships an override of waystones-common.toml under pack/overrides/
defaultconfigs/ so first-run installs (clients + fresh servers) get the
intended defaults. NeoForge auto-copies defaultconfigs/<file> into
config/<file> on first run only -- player-tweaked configs after that
are preserved across pack updates.

The only override vs mod-default in this commit:
- spawnInVillages: REGULAR -> DISABLED

Everything else stays at mod default, which already gives the security
posture we want:
- defaultVisibility = ACTIVATION  -> each player must physically visit
  a waystone before they can teleport TO it. Solves the "player B
  teleports into player A's base" concern without a hard per-player
  placement cap (which v21.x dropped).
- restrictedWaystones = [PLAYER]  -> only owners can edit their own
  waystones.
- allowedVisibilities = []        -> no player UI can create global
  waystones; OPs use the /waystone command for server-public ones.

Wild waystones (in the open world, not villages) stay on -- they're
public-good fast travel, not tied to bases.
2026-05-23 12:55:18 +00:00
Matt c996d4edff Merge pull request 'Add Waystones + Balm' (#10) from feature/add-waystones into main 2026-05-23 12:53:27 +00:00
Matt b080dfe325 pack: add Waystones + Balm, bump to 0.16.0
Waystones 21.1.33: fast-travel teleport network.
Balm 21.0.58: required common lib for Waystones (and other BlayTheNinth mods).

Config will be tweaked in a follow-up after the server generates its
default config files. Intended config:
- worldgen village waystones DISABLED
- maxWaystonesPerPlayer = 1
- defaultPrivacy = Private (player-placed)
- OP-placed global waystones via /waystone command
2026-05-23 12:53:26 +00:00
Matt ce28a44e89 Merge pull request 'Add Check-Deps pre-flight (mods.toml ground truth)' (#9) from feature/check-deps-preflight into main 2026-05-23 11:55:38 +00:00
Matt 40dd06b8cf scripts: add Check-Deps pre-flight (mods.toml ground truth)
Adds scripts/Check-Deps.ps1 and wires it into Deploy-Brass.ps1 as a
pre-flight gate when Stage includes Pack. The script parses each lockfile
jar's META-INF/neoforge.mods.toml directly -- the same source the loader
reads at startup -- and refuses to deploy if any [[dependencies]] block
with type=required (default) names a modId that nobody in the pack
provides.

Handles three real edge cases discovered during initial run:

1. Jar-in-jar bundled deps: Create ships Ponder, Registrate, Flywheel
   embedded under META-INF/jarjar/. The script recurses into those and
   counts their modIds as present, since the loader auto-loads them.

2. Language-provider jars (Kotlin for Forge) have no standard mods.toml
   -- they declare via a different mechanism. Tiny slugToImplicitModId
   override map (currently 1 entry) covers them.

3. Non-mod lockfile entries (shaderpacks under shaderpacks/, configs
   under config/, etc.) are skipped explicitly by path prefix check.

Vanilla deps (minecraft, neoforge, forge, fabric, java, javafml, etc.)
are pre-seeded as present.

Jars cached at /tmp/bns-check-deps-cache/<sha1>.jar; second-run cost is
~1.5s. First run downloads ~150MB.

The script would have caught the v0.15.0 -> v0.15.1 incident: Slice &
Dice's jar declares kotlinforforge required in mods.toml even though
Modrinth's dep field only lists Create. The Modrinth-only check (earlier
draft) wouldn't have helped; the mods.toml-based check does.
2026-05-23 11:55:38 +00:00
Matt 06d6a5ef45 Merge pull request 'Hotfix: add Kotlin for Forge (Slice & Dice dep)' (#8) from fix/kotlin-for-forge-dep into main 2026-05-22 21:00:38 +00:00
Matt 4ea919432e pack: add Kotlin for Forge 5.11.0, bump to 0.15.1
Hotfix for 0.15.0: Slice & Dice declares 'kotlinforforge >= 5.8' as a
hard dependency and the server crashed on load without it. Adding KFF
satisfies the dep. 6.9 MB, both sides.
2026-05-22 21:00:37 +00:00
Matt 6ccd83da5f Merge pull request 'Add Farmer's Delight + Slice & Dice' (#7) from feature/add-farmers-delight into main 2026-05-22 20:58:38 +00:00
Matt 89c41dfe4d pack: add Farmer's Delight + Slice & Dice, bump to 0.15.0
- Farmer's Delight 1.3.2 (3.2 MB): cooking expansion -- new crops
  (tomato, onion, rice, cabbage), cooking pot, stove, cutting board,
  knife, ~50+ food recipes. Both sides required.
- Create Slice & Dice 4.2.4 (407 KB): FD<->Create automation bridge.
  Adds a Slicer machine (Mechanical Press/Mixer-style) that automates
  the knife/cutting-board step so Create kinetic networks can feed FD
  prep. Loader-shared jar (forge+neoforge from one file).

Both tagged "both". Brings live mod count to 41.
2026-05-22 20:58:37 +00:00
Matt 8b599a7da7 Merge pull request 'Add AppleSkin + Mouse Tweaks' (#6) from feature/add-appleskin-mousetweaks into main 2026-05-22 20:49:14 +00:00
Matt 6143ddc111 pack: add AppleSkin + Mouse Tweaks, bump to 0.14.0
Two client-leaning QoL mods.

- AppleSkin 3.0.9: food + saturation tooltips. Modrinth side=optional both;
  tagged "both" so server still installs (harmless, ~75KB).
- Mouse Tweaks 2.26.1: shift-drag, scroll-transfer, auto-refill, click-and-
  drag stacking in inventory UI. Modrinth lists server=unsupported, so
  explicitly tagged side=client -- this is the first new mod that exercises
  the server-side filter from the 0.10.0 schema migration: server's sync
  should skip downloading it.
2026-05-22 20:49:14 +00:00