Compare commits

...

10 Commits

Author SHA1 Message Date
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
Matt a29c0e3cab Merge pull request 'Add Spark profiler 1.10.124' (#5) from feature/add-spark into main 2026-05-22 20:46:13 +00:00
Matt 3bcf8bc4f8 pack: add Spark profiler 1.10.124 + bump to 0.13.0
Best-in-class MC profiler. Server side: /spark sampler start, /spark
heap, /spark tps. Optional client side too. ~3.5MB, both sides optional
per Modrinth -- tagged "both" so launcher syncs it too.
2026-05-22 20:46:12 +00:00
Matt 2e40732e69 Merge pull request 'Add Almost Unified 1.4.2' (#4) from feature/add-almost-unified into main 2026-05-22 20:34:32 +00:00
Matt 987fedd7e4 pack: add Almost Unified 1.4.2 + bump to 0.12.0
Preemptive insurance against duplicate-item proliferation when more
metals-producing mods are added (e.g. when Power Grid lands, or any
future Mekanism/Thermal/etc. addition). Today's pack only has TFMG as
the metals provider so AU is largely a no-op now, but ships with sane
default tag preferences that activate automatically as duplicates appear.

Tiny mod (~290 KB jar), client-optional/server-required per Modrinth.
2026-05-22 20:34:32 +00:00
Matt 8d0c05bd8a Merge pull request 'Add Simple Voice Chat 2.6.17' (#3) from feature/add-simple-voice-chat into main 2026-05-22 20:23:14 +00:00
Matt 95966d2d14 pack: add Simple Voice Chat 2.6.17 + bump to 0.11.0
Adds proximity voice chat to the modpack. Server uses UDP/24454 by default
(firewall rule added separately).

Modrinth lists both sides as "optional" -- players without it can still
join, just no voice. Tagged "both" in the lockfile so server + launcher
both install it.
2026-05-22 20:23:07 +00:00
Matt 839d93f242 Add explicit client/server side field to manifest (#2) 2026-05-22 15:15:03 +00:00
Matt db4534e427 Add local deploy mode to Deploy-Brass.ps1 (#1) 2026-05-22 15:14:44 +00:00
Matt 4ee4a2bb43 scripts: make Build-Pack and Deploy-Brass cross-platform
Two small fixes that surface when running the deploy pipeline on a
non-Windows host (we now do this on glados via the Telegram bridge):

- Build-Pack.ps1: fall back to launcher/ModpackLauncher.csproj <Version>
  when Get-Item.VersionInfo.FileVersion returns empty. Linux PowerShell
  can't parse PE FileVersion from a Windows .exe, so the previous code
  threw "set <Version> in ModpackLauncher.csproj and republish" -- but
  the csproj <Version> *was* set, just not readable from a foreign PE.
  Appends ".0" so the embedded value still matches the 4-part form the
  Windows compile bakes in.

- Deploy-Brass.ps1: prefer rsync where available, fall back to robocopy
  otherwise. robocopy is Windows-only and bails on Linux/macOS hosts.
2026-05-22 14:23:09 +00:00
3 changed files with 96 additions and 9 deletions
+57 -2
View File
@@ -1,7 +1,7 @@
{ {
"$schema": "Brass-and-Sigil pack.lock.json - generated, do not edit by hand unless you know what you are doing", "$schema": "Brass-and-Sigil pack.lock.json - generated, do not edit by hand unless you know what you are doing",
"name": "Brass and Sigil", "name": "Brass and Sigil",
"version": "0.10.0", "version": "0.14.0",
"minecraft": "1.21.1", "minecraft": "1.21.1",
"loader": { "loader": {
"type": "neoforge", "type": "neoforge",
@@ -371,6 +371,61 @@
"sha1": "b560f646a124d5204b1fb7321fec373b9c346fa5", "sha1": "b560f646a124d5204b1fb7321fec373b9c346fa5",
"size": 522970, "size": 522970,
"side": "client" "side": "client"
},
{
"source": "modrinth",
"slug": "simple-voice-chat",
"versionId": "6rT2RWh6",
"version": "neoforge-1.21.1-2.6.17",
"path": "mods/voicechat-neoforge-1.21.1-2.6.17.jar",
"url": "https://cdn.modrinth.com/data/9eGKb6K1/versions/6rT2RWh6/voicechat-neoforge-1.21.1-2.6.17.jar",
"sha1": "55fc0d529318620bd2ce7a635657014c5c98e189",
"size": 4902096,
"side": "both"
},
{
"source": "modrinth",
"slug": "almostunified",
"versionId": "e8iYxxI3",
"version": "1.21.1-1.4.2+neoforge",
"path": "mods/almostunified-neoforge-1.21.1-1.4.2.jar",
"url": "https://cdn.modrinth.com/data/sdaSaQEz/versions/e8iYxxI3/almostunified-neoforge-1.21.1-1.4.2.jar",
"sha1": "f9a58fa95780f4b045d30559c1fdaedaa7f0fba3",
"size": 295093,
"side": "both"
},
{
"source": "modrinth",
"slug": "spark",
"versionId": "v5qtqRQi",
"version": "1.10.124-neoforge-1.21.1",
"path": "mods/spark-1.10.124-neoforge.jar",
"url": "https://cdn.modrinth.com/data/l6YH9Als/versions/v5qtqRQi/spark-1.10.124-neoforge.jar",
"sha1": "9430cc2ab64ff89d698be593769fb9f9ee4efae6",
"size": 3642581,
"side": "both"
},
{
"source": "modrinth",
"slug": "appleskin",
"versionId": "uAKA6Laj",
"version": "3.0.9+mc1.21",
"path": "mods/appleskin-neoforge-mc1.21-3.0.9.jar",
"url": "https://cdn.modrinth.com/data/EsAfCjCV/versions/uAKA6Laj/appleskin-neoforge-mc1.21-3.0.9.jar",
"sha1": "81cf0e668f991f83ac8820c386fbd6c9c3602246",
"size": 75804,
"side": "both"
},
{
"source": "modrinth",
"slug": "mouse-tweaks",
"versionId": "9I21YYxf",
"version": "1.21-2.26.1-neoforge",
"path": "mods/MouseTweaks-neoforge-mc1.21-2.26.1.jar",
"url": "https://cdn.modrinth.com/data/aC3cM3Vq/versions/9I21YYxf/MouseTweaks-neoforge-mc1.21-2.26.1.jar",
"sha1": "6dae57f4f50f7808d2ed9a18f6cd1c0d4640c6bc",
"size": 73938,
"side": "client"
} }
], ],
"defaultServer": { "defaultServer": {
@@ -379,4 +434,4 @@
}, },
"defaultShader": "ComplementaryReimagined_r5.7.1.zip", "defaultShader": "ComplementaryReimagined_r5.7.1.zip",
"panelUrl": "https://bns-admin.sijbers.uk" "panelUrl": "https://bns-admin.sijbers.uk"
} }
+19 -2
View File
@@ -163,8 +163,25 @@ if ($LauncherExePath) {
} }
$launcherFile = Get-Item $LauncherExePath $launcherFile = Get-Item $LauncherExePath
$launcherVersion = $launcherFile.VersionInfo.FileVersion $launcherVersion = $launcherFile.VersionInfo.FileVersion
$versionSource = 'PE FileVersion'
# Linux PowerShell can't read PE FileVersion from a Windows .exe. When that
# happens, fall back to launcher/ModpackLauncher.csproj's <Version> (the
# source of truth that the Windows compile bakes into FileVersion anyway).
# Append ".0" so callers get the same 4-part form as the PE metadata.
if ([string]::IsNullOrWhiteSpace($launcherVersion)) { if ([string]::IsNullOrWhiteSpace($launcherVersion)) {
throw "Launcher exe has no FileVersion -- set <Version> in ModpackLauncher.csproj and republish." $csprojPath = Join-Path $here '..\launcher\ModpackLauncher.csproj'
if (Test-Path $csprojPath) {
[xml]$csproj = Get-Content $csprojPath
$csprojVersion = ($csproj.Project.PropertyGroup.Version | Where-Object { $_ }) | Select-Object -First 1
if ($csprojVersion) {
$launcherVersion = if ($csprojVersion -match '^\d+\.\d+\.\d+$') { "$csprojVersion.0" } else { $csprojVersion }
$versionSource = "csproj <Version> (fallback)"
}
}
}
if ([string]::IsNullOrWhiteSpace($launcherVersion)) {
throw "Launcher exe has no FileVersion and csproj <Version> couldn't be read either -- set <Version> in ModpackLauncher.csproj and republish."
} }
# FileVersion is the four-component form (e.g. "0.1.0.0" for csproj <Version>0.1.0</Version>). # FileVersion is the four-component form (e.g. "0.1.0.0" for csproj <Version>0.1.0</Version>).
# Embed as-is -- the launcher's Version.Parse handles it directly and avoids ambiguous # Embed as-is -- the launcher's Version.Parse handles it directly and avoids ambiguous
@@ -174,7 +191,7 @@ if ($LauncherExePath) {
Write-Host "" Write-Host ""
Write-Host ("Launcher metadata embedded:") Write-Host ("Launcher metadata embedded:")
Write-Host (" Version: {0}" -f $launcherVersion) Write-Host (" Version: {0} ({1})" -f $launcherVersion, $versionSource)
Write-Host (" Url: {0}" -f $LauncherPublicUrl) Write-Host (" Url: {0}" -f $LauncherPublicUrl)
Write-Host (" Source: {0}" -f $launcherFile.FullName) Write-Host (" Source: {0}" -f $launcherFile.FullName)
} }
+20 -5
View File
@@ -214,11 +214,26 @@ $overridesLocal = Join-Path $repoRoot 'pack\overrides'
$shareFiles = Join-Path $DeployShare 'files' $shareFiles = Join-Path $DeployShare 'files'
if ($shouldRunPack -and (Test-Path $overridesLocal)) { if ($shouldRunPack -and (Test-Path $overridesLocal)) {
Step "Mirror pack/overrides/ -> $shareFiles" { Step "Mirror pack/overrides/ -> $shareFiles" {
# /MIR makes destination match source (deletes orphan files in $shareFiles). # Prefer rsync where available (Linux/macOS); fall back to Windows robocopy.
# /XJ skips junctions, /R:1 /W:1 keeps retry behaviour sane on flaky shares. # Both perform a mirror: orphan files in the destination are removed so
robocopy $overridesLocal $shareFiles /MIR /XJ /R:1 /W:1 /NFL /NDL /NJH /NJS /NP | Out-Host # the share matches the local overrides exactly.
# Robocopy returns 0-7 for success-with-info; 8+ is real failure. if (Get-Command rsync -ErrorAction SilentlyContinue) {
if ($LASTEXITCODE -ge 8) { throw "robocopy failed with exit $LASTEXITCODE" } $src = ($overridesLocal -replace '\\','/').TrimEnd('/') + '/'
$dst = ($shareFiles -replace '\\','/').TrimEnd('/') + '/'
if (-not (Test-Path $shareFiles)) { New-Item -ItemType Directory -Path $shareFiles -Force | Out-Null }
& rsync -a --delete $src $dst
if ($LASTEXITCODE -ne 0) { throw "rsync failed with exit $LASTEXITCODE" }
}
elseif (Get-Command robocopy -ErrorAction SilentlyContinue) {
# /MIR makes destination match source (deletes orphan files in $shareFiles).
# /XJ skips junctions, /R:1 /W:1 keeps retry behaviour sane on flaky shares.
robocopy $overridesLocal $shareFiles /MIR /XJ /R:1 /W:1 /NFL /NDL /NJH /NJS /NP | Out-Host
# Robocopy returns 0-7 for success-with-info; 8+ is real failure.
if ($LASTEXITCODE -ge 8) { throw "robocopy failed with exit $LASTEXITCODE" }
}
else {
throw "Neither rsync nor robocopy is available -- can't mirror pack overrides."
}
} }
} }