Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
5dd13cd
Preserve AutoDrive helper continuity
SimGamerJen Aug 11, 2026
9217927
Merge pull request #30 from SimGamerJen/main
SimGamerJen Aug 12, 2026
d5bd0a5
Add event-driven AutoDrive continuity bridge
SimGamerJen Aug 12, 2026
9ef6fd7
Load AutoDrive continuity bridge after HelperProfiles
SimGamerJen Aug 12, 2026
e291312
Use event-driven AutoDrive continuity only
SimGamerJen Aug 12, 2026
5d54647
Fix AutoDrive continuity runtime manager hooks
SimGamerJen Aug 12, 2026
b219409
Fix AutoDrive continuity manager lookup
SimGamerJen Aug 12, 2026
0731514
Bind AutoDrive helper for session continuity
SimGamerJen Aug 12, 2026
9def747
Use AutoDrive event context for helper continuity
SimGamerJen Aug 12, 2026
f188c25
Use worker appearance assignments for AutoDrive continuity
SimGamerJen Aug 12, 2026
d1591a5
Bridge AutoDrive continuity sessions to HelperPayroll
SimGamerJen Aug 14, 2026
6896fb5
Load optional AutoDrive payroll bridge
SimGamerJen Aug 14, 2026
0aca261
Add FS25 pedestrian runtime probe
SimGamerJen Sep 3, 2026
18010b7
Load pedestrian runtime research probe
SimGamerJen Sep 3, 2026
2086037
Prototype spline-guided world-worker movement
SimGamerJen Sep 3, 2026
9997f01
Load spline-guided movement prototype
SimGamerJen Sep 3, 2026
9eb6b15
Updated icon image
SimGamerJen Sep 7, 2026
2814e8a
Expand ModHub descriptions and remove changelog for first submission
SimGamerJen Sep 7, 2026
348fe46
Update modDesc.xml
SimGamerJen Sep 8, 2026
80043d1
Add versioned changelog inside localized descriptions for TestRunner
SimGamerJen Sep 8, 2026
72ba1fd
Merge branch 'main' of https://github.com/SimGamerJen/FS25_HelperProf…
SimGamerJen Sep 8, 2026
3f3e148
Delete helperprofiles.dds
SimGamerJen Sep 8, 2026
60f1f94
Merge ModHub submission updates into Alpha 6
SimGamerJen Sep 8, 2026
22c865a
Deepen native pedestrian runtime probe
SimGamerJen Sep 12, 2026
6d3e9e3
Load deep pedestrian runtime probe
SimGamerJen Sep 12, 2026
e9ca020
Merge latest main history into Alpha 6
SimGamerJen Sep 12, 2026
5673c29
Align Alpha 6 modDesc with current main
SimGamerJen Sep 12, 2026
be6ecd9
Merge current 2.1.1/API v7 baseline into AutoDrive continuity branch
SimGamerJen Sep 15, 2026
c894ded
Load AutoDrive continuity and payroll bridge on 2.1.1 baseline
SimGamerJen Sep 15, 2026
d68eb16
Reconcile API v7 scoped hires with AutoDrive continuity
SimGamerJen Sep 15, 2026
c21814d
Load reconciled helper acquisition router
SimGamerJen Sep 15, 2026
c99fc71
Merge reconciled AutoDrive continuity into world-workers Alpha 6
SimGamerJen Sep 15, 2026
3d55382
Merge AutoDrive helper continuity
SimGamerJen Sep 15, 2026
10c645d
Sync merged AutoDrive baseline into world-workers Alpha 6
SimGamerJen Sep 15, 2026
d4ad934
Document AutoDrive continuity fix in 2.1.1.0 changelog
SimGamerJen Sep 15, 2026
3b0dc2c
Update 2.1.1.0 release notes for AutoDrive continuity
SimGamerJen Sep 15, 2026
50a1ef5
Refresh 2.1.1.0 packaging workflow for AutoDrive fix
SimGamerJen Sep 15, 2026
6eae6a9
Update modDesc.xml version from 111 to 113
SimGamerJen Sep 15, 2026
b1a3995
Update modDesc.xml to version 111
SimGamerJen Sep 15, 2026
e9aee02
Update modDesc.xml version from 111 to 113
SimGamerJen Sep 15, 2026
d538101
Add logged protected-call wrapper for ModHub compliance
SimGamerJen Sep 15, 2026
6880aee
Add one-shot PublicLua compliance refactor workflow
SimGamerJen Sep 15, 2026
04630eb
Route protected calls through logged wrapper
github-actions[bot] Sep 15, 2026
33ff6b6
Add one-shot ModHub Lua compliance scan
SimGamerJen Sep 15, 2026
c490164
Add one-shot ModHub long-line cleanup workflow
SimGamerJen Sep 15, 2026
4b0d4e3
Retry ModHub long-line cleanup with robust matching
SimGamerJen Sep 15, 2026
906e0ef
Refine final long-line match for unbound status
SimGamerJen Sep 15, 2026
988a8cf
Clean up ModHub Lua long-line warnings
github-actions[bot] Sep 15, 2026
8ed9cb5
Add one-shot ModHub compliance candidate build
SimGamerJen Sep 15, 2026
61dc10f
Avoid direct pcall invocation in protected-call wrapper
SimGamerJen Sep 15, 2026
3362ad5
Tighten PublicLua compliance candidate validation
SimGamerJen Sep 15, 2026
8bb653f
Remove temporary ModHub compliance workflow
SimGamerJen Sep 15, 2026
5c617c1
Remove temporary ModHub long-line workflow
SimGamerJen Sep 15, 2026
2024e94
Remove temporary ModHub long-line workflow v2
SimGamerJen Sep 15, 2026
af67fae
Remove temporary ModHub Lua scan workflow
SimGamerJen Sep 15, 2026
56d5e65
Remove temporary ModHub PublicLua refactor workflow
SimGamerJen Sep 15, 2026
c17ef56
Merge ModHub TestRunner 0.9.21 Lua compliance
SimGamerJen Sep 15, 2026
fd04635
Sync ModHub-compliant main into world-workers Alpha 6
SimGamerJen Sep 15, 2026
c1ac844
Label world-workers Alpha 6 development build
SimGamerJen Sep 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
140 changes: 60 additions & 80 deletions .github/workflows/release-2.1.1.0.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Release HelperProfiles 2.1.1.0
name: Build HelperProfiles 2.1.1.0

on:
workflow_dispatch:
Expand All @@ -7,110 +7,68 @@ on:
- main
paths:
- .github/workflows/release-2.1.1.0.yml
- modDesc.xml
- docs/releases/2.1.1.0.md
- scripts/HP_AutoDriveContinuity.lua
- scripts/HP_AutoDrivePayrollBridge.lua
- scripts/HP_HelperAcquisitionRouter.lua
- scripts/HP_IntegrationAPI.lua

permissions:
contents: write

jobs:
release:
package:
runs-on: ubuntu-latest
steps:
- name: Check out repository
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Repair stable release metadata
- name: Validate ModHub package inputs
shell: bash
run: |
set -euo pipefail
python - <<'PY'
from pathlib import Path
import re
import xml.etree.ElementTree as ET

path = Path('modDesc.xml')
text = path.read_text(encoding='utf-8')
before, marker, changelog = text.partition(' <changelog>')
if not marker:
raise SystemExit('Missing changelog section')

german_lines = [
'Version 2.1.1.0:',
'- Textur-Atlas-Artefakte und Layout-Darstellungsfehler in den Ansichten Erscheinungsbilder und Helferliste wurden behoben.',
'- Integration API v7 wurde hinzugefügt; der bestehende Helferlisten- und Identitätsvertrag bleibt erhalten.',
'- Kompatible Mods wie Remote Dispatcher können einen Helfer vorübergehend und gezielt für einen einzelnen Einstellvorgang anfordern.',
'- Gezielte Anforderungen schlagen kontrolliert fehl, wenn ein Helfer fehlt, nicht im Kader ist oder bereits aktiv ist; es wird kein anderer Helfer stillschweigend eingesetzt.',
'- Gezielte Anforderungen ändern weder den normal ausgewählten Helfer noch den Einstellungsmodus von HelperProfiles.',
''
xml_files = [
'modDesc.xml',
'gui/HP_AppearanceBindingsScreen.xml',
'gui/HP_RosterManagerScreen.xml',
'gui/guiProfiles.xml',
'l10n/l10n_en.xml',
'l10n/l10n_de.xml',
'l10n/l10n_fr.xml',
]
german_block = '\n'.join(german_lines)

# Remove the accidentally inserted German 2.1.1.0 block from EN.
changelog = changelog.replace(german_block, '', 1)

# Add it to the German changelog if it is not already present there.
de_match = re.search(r'<de><!\[CDATA\[(.*?)\]\]></de>', changelog, flags=re.S)
if de_match is None:
raise SystemExit('Missing German changelog')
de_body = de_match.group(1)
if 'Textur-Atlas-Artefakte' not in de_body:
replacement = '<de><![CDATA[\n' + german_block + de_body.lstrip('\n') + ']]></de>'
changelog = changelog[:de_match.start()] + replacement + changelog[de_match.end():]

text = before + marker + changelog
path.write_text(text, encoding='utf-8')

compat = Path('scripts/HP_Compatibility.lua')
ctext = compat.read_text(encoding='utf-8')
ctext = ctext.replace(
'caused the 2.1.1.0 alpha to scan every loaded mod on every frame.',
'caused the 2.1.0.0 alpha to scan every loaded mod on every frame.'
)
compat.write_text(ctext, encoding='utf-8')
for path in xml_files:
ET.parse(path)

root = ET.parse('modDesc.xml').getroot()
if root.findtext('version') != '2.1.1.0':
raise SystemExit('Unexpected modDesc version')

repaired = path.read_text(encoding='utf-8')
_, _, repaired_changelog = repaired.partition(' <changelog>')
en = re.search(r'<en><!\[CDATA\[(.*?)\]\]></en>', repaired_changelog, flags=re.S).group(1)
de = re.search(r'<de><!\[CDATA\[(.*?)\]\]></de>', repaired_changelog, flags=re.S).group(1)
if 'Textur-Atlas-Artefakte' in en:
raise SystemExit('German release notes still present in English changelog')
if not de.lstrip().startswith('Version 2.1.1.0:'):
raise SystemExit('German changelog does not start with 2.1.1.0')
mod_desc = Path('modDesc.xml').read_text(encoding='utf-8')
if 'Fixed helper continuity with AutoDrive' not in mod_desc:
raise SystemExit('Missing AutoDrive continuity changelog entry')

required_files = [
'icon_helperProfiles.dds',
'scripts/HP_AutoDriveContinuity.lua',
'scripts/HP_AutoDrivePayrollBridge.lua',
'scripts/HP_HelperAcquisitionRouter.lua',
'scripts/HP_IntegrationAPI.lua',
]
for path in required_files:
if not Path(path).is_file():
raise SystemExit('Missing required package file: ' + path)

api = Path('scripts/HP_IntegrationAPI.lua').read_text(encoding='utf-8')
for wanted in ['apiVersion = 7', 'modVersion = "2.1.1.0"', 'supportsScopedPreferredHire = true']:
if wanted not in api:
raise SystemExit('Missing API v7 marker: ' + wanted)
PY

- name: Commit metadata corrections
shell: bash
run: |
set -euo pipefail
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git add modDesc.xml scripts/HP_Compatibility.lua
if ! git diff --cached --quiet; then
git commit -m "Correct HelperProfiles 2.1.1.0 release metadata"
git push origin HEAD:main
fi

- name: Validate package inputs
shell: bash
run: |
set -euo pipefail
test -f docs/releases/2.1.1.0.md
python - <<'PY'
import xml.etree.ElementTree as ET
for path in ['modDesc.xml', 'gui/HP_AppearanceBindingsScreen.xml', 'gui/HP_RosterManagerScreen.xml', 'gui/guiProfiles.xml']:
ET.parse(path)
PY

- name: Build Farming Simulator mod package
shell: bash
run: |
Expand All @@ -120,24 +78,46 @@ jobs:
python - <<'PY'
import zipfile
import xml.etree.ElementTree as ET

with zipfile.ZipFile('FS25_HelperProfiles.zip', 'r') as archive:
names = set(archive.namelist())
required = {
'modDesc.xml', 'icon_helperProfiles.dds',
'gui/HP_AppearanceBindingsScreen.xml', 'gui/HP_RosterManagerScreen.xml',
'scripts/HelperProfiles.lua', 'scripts/HP_RosterState.lua',
'scripts/HP_RosterFilter.lua', 'scripts/HP_RosterManagerScreen.lua',
'scripts/HP_TabbedManagement.lua', 'scripts/HP_IntegrationAPI.lua'
'modDesc.xml',
'icon_helperProfiles.dds',
'gui/HP_AppearanceBindingsScreen.xml',
'gui/HP_RosterManagerScreen.xml',
'scripts/HelperProfiles.lua',
'scripts/HP_RosterState.lua',
'scripts/HP_RosterFilter.lua',
'scripts/HP_RosterManagerScreen.lua',
'scripts/HP_TabbedManagement.lua',
'scripts/HP_IntegrationAPI.lua',
'scripts/HP_AutoDriveContinuity.lua',
'scripts/HP_AutoDrivePayrollBridge.lua',
'scripts/HP_HelperAcquisitionRouter.lua',
}
missing = sorted(required - names)
if missing:
raise SystemExit('Missing required package files: ' + ', '.join(missing))

if any(name.startswith('FS25_HelperProfiles/') for name in names):
raise SystemExit('Package contains an unexpected wrapper directory')

root = ET.fromstring(archive.read('modDesc.xml'))
if root.findtext('version') != '2.1.1.0':
raise SystemExit('Unexpected packaged version')
PY

- name: Upload ModHub-ready package artifact
uses: actions/upload-artifact@v4
with:
name: FS25_HelperProfiles-2.1.1.0-ModHub
path: FS25_HelperProfiles.zip
if-no-files-found: error
retention-days: 7

- name: Publish or refresh GitHub release
if: github.event_name == 'workflow_dispatch'
shell: bash
env:
GH_TOKEN: ${{ github.token }}
Expand Down
9 changes: 9 additions & 0 deletions docs/releases/2.1.1.0.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,27 @@ HelperProfiles 2.1.1.0 is a stable maintenance and integration update for the va
- Added temporary **scoped preferred-worker hiring** for compatible companion mods such as Remote Dispatcher.
- Scoped worker requests are fail-closed: a missing, OFF-roster or already-active worker is rejected rather than silently replaced by another worker.
- Scoped requests do not change the worker selected in the normal HelperProfiles overlay and do not change the user's HelperProfiles hiring mode.
- Fixed **AutoDrive helper continuity** so an assigned worker is retained when AutoDrive temporarily releases and reacquires a helper during the same logical task.
- Reconciled scoped companion-mod hiring with AutoDrive continuity so an explicitly requested worker is used for the initial hire and remains the AutoDrive worker through subsequent internal reacquisition cycles.

## Remote Dispatcher integration

Remote Dispatcher can use API v7 to bind a prepared vehicle to a specific HelperProfiles worker. The preference exists only for the synchronous helper-hire call and is then released immediately. HelperProfiles remains the owner of the roster and normal worker-selection behaviour outside that scope.

Remote Dispatcher remains optional; HelperProfiles does not require it.

## AutoDrive compatibility

HelperProfiles now preserves the worker already assigned to an AutoDrive vehicle when AutoDrive performs a temporary helper release/reacquire cycle. A genuine AutoDrive stop still releases that worker normally, allowing them to return to the available roster.

AutoDrive remains optional; HelperProfiles continues to work normally without it.

## Compatibility

- Single-player only.
- AvatarSwitcher remains optional.
- HelperPayroll remains optional.
- AutoDrive remains optional.
- Hired Helper Tool remains incompatible because it also owns the helper roster.
- Existing HelperProfiles 2.1.0.0 save data and per-save roster/appearance files remain compatible.

Expand Down
Binary file removed helperprofiles.dds
Binary file not shown.
Binary file modified icon_helperProfiles.dds
Binary file not shown.
Loading