diff --git a/.github/workflows/sign-local-installer.yml b/.github/workflows/sign-local-installer.yml new file mode 100644 index 0000000..9abba53 --- /dev/null +++ b/.github/workflows/sign-local-installer.yml @@ -0,0 +1,72 @@ +name: sign-local-installer +on: + push: + branches: [release/20261108-manager] + workflow_dispatch: + inputs: + build_run_id: + description: Successful manager-local run in coa-server-build + required: true +permissions: + contents: read + actions: read +jobs: + sign: + if: github.event_name == 'workflow_dispatch' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + - uses: actions/setup-node@v4 + with: + node-version: 22 + - name: Verify local build provenance + env: + GH_TOKEN: ${{ github.token }} + BUILD_RUN: ${{ inputs.build_run_id }} + run: | + python3 - <<'PY' + import json, os, subprocess + run = os.environ['BUILD_RUN'] + if not run.isdigit(): + raise RuntimeError('Invalid build run') + data = json.loads(subprocess.check_output(['gh', 'api', f'repos/Corfirean/coa-server-build/actions/runs/{run}'])) + if data['conclusion'] != 'success' or data['path'] != '.github/workflows/manager-local.yml': + raise RuntimeError('Not a successful local Manager build') + subprocess.run(['gh', 'run', 'download', run, '-R', 'Corfirean/coa-server-build', '-n', 'unsigned-manager-windows', '-D', '_prepared-manager'], check=True) + from pathlib import Path + import hashlib + root = Path('_prepared-manager') + meta = json.loads((root / 'prepared-source.json').read_text()) + version = json.loads(Path('package.json').read_text())['version'] + name = meta['installer'] + if Path(name).name != name or meta['source'] != os.environ['GITHUB_SHA'] or meta['version'] != version or str(meta['run']) != run: + raise RuntimeError('Installer identity differs') + if hashlib.sha256((root / name).read_bytes()).hexdigest() != meta['sha256']: + raise RuntimeError('Installer hash differs') + PY + - run: npm ci + - name: Sign exact locally compiled bytes + env: + TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }} + TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }} + run: | + node --input-type=module <<'JS' + import { readFileSync, writeFileSync } from 'node:fs'; + import { execFileSync } from 'node:child_process'; + import { createHash } from 'node:crypto'; + const root = '_prepared-manager/'; + const meta = JSON.parse(readFileSync(root + 'prepared-source.json')); + execFileSync('node_modules/.bin/tauri', ['signer', 'sign', '--app-version', meta.version, root + meta.installer], {stdio: 'inherit'}); + if (createHash('sha256').update(readFileSync(root + meta.installer)).digest('hex') !== meta.sha256) throw new Error('Signed bytes changed'); + const signature = readFileSync(root + meta.installer + '.sig', 'utf8').trim(); + const url = `https://github.com/Corfirean/coa-server-manager/releases/download/v${meta.version}/${encodeURIComponent(meta.installer)}`; + writeFileSync(root + 'latest.json', JSON.stringify({version: meta.version, notes: 'See the release notes.', pub_date: new Date().toISOString(), platforms: {'windows-x86_64': {signature, url}}}, null, 2) + '\n'); + meta.signingRun = process.env.GITHUB_RUN_ID; + writeFileSync(root + 'prepared-source.json', JSON.stringify(meta, null, 2) + '\n'); + JS + - uses: actions/upload-artifact@v4 + with: + name: prepared-manager-windows + path: _prepared-manager/* + retention-days: 14 + if-no-files-found: error diff --git a/Cargo.lock b/Cargo.lock index f67aada..9d82548 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -586,7 +586,7 @@ dependencies = [ [[package]] name = "coa-core" -version = "0.9.9" +version = "0.9.10" dependencies = [ "base64 0.22.1", "chrono", @@ -634,7 +634,7 @@ dependencies = [ [[package]] name = "coa-release" -version = "0.9.9" +version = "0.9.10" dependencies = [ "chrono", "coa-core", @@ -643,7 +643,7 @@ dependencies = [ [[package]] name = "coa-server-manager" -version = "0.9.9" +version = "0.9.10" dependencies = [ "coa-control-proto", "coa-core", diff --git a/Cargo.toml b/Cargo.toml index 05daa91..be96eef 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ members = ["crates/coa-core", "crates/coa-release", "crates/coa-registry-proto", exclude = ["services/coa-registry", "services/coa-registry-e2e", "services/coa-coordinator", "services/coa-relay"] [workspace.package] -version = "0.9.9" +version = "0.9.10" edition = "2021" license = "AGPL-3.0-only" diff --git a/package-lock.json b/package-lock.json index 2f93a6d..c03e5ee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "coa-server-manager", - "version": "0.9.9", + "version": "0.9.10", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "coa-server-manager", - "version": "0.9.9", + "version": "0.9.10", "dependencies": { "@tauri-apps/api": "^2.12.0", "@tauri-apps/plugin-dialog": "^2.8.0", diff --git a/package.json b/package.json index 643484c..a0d6431 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "coa-server-manager", "private": true, - "version": "0.9.9", + "version": "0.9.10", "license": "AGPL-3.0-only", "type": "module", "scripts": { diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index e5a7c73..570a72e 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "CoA Server Manager", - "version": "0.9.9", + "version": "0.9.10", "identifier": "com.coa.servermanager", "build": { "beforeDevCommand": "npm run dev", diff --git a/src/data/README.md b/src/data/README.md index 143f6a2..c685bbd 100644 --- a/src/data/README.md +++ b/src/data/README.md @@ -36,3 +36,7 @@ Manager 0.9.8 preparation refreshes the bundled server history through 0.261030. The two reviewed upcoming records are in `tools/reviewed-manager-notes.json` and `tools/reviewed-server-notes.json`; every new note has all five translations. These files describe preparation and do not add unpublished releases to canonical history. + +Manager 0.9.10 refreshes the bundled server history through 0.261104.94 from +canonical build commit `a9c6b17c8c1a295680fda4ad4bcdde266357264d` on 2026-11-08. +The reviewed upcoming Manager and server records carry translations in all five languages. diff --git a/src/data/latest-note-translations.json b/src/data/latest-note-translations.json index c300bad..bf2614a 100644 --- a/src/data/latest-note-translations.json +++ b/src/data/latest-note-translations.json @@ -37,7 +37,8 @@ "Update validation keeps MySQL running between compatible checks": "При проверке обновления MySQL продолжает работать между совместимыми проверками", "Choose normal logs, errors only or no server logs in maintenance settings": "Выбирайте обычные логи, только ошибки или отключение логов в настройках обслуживания", "Diagnostic exports include launcher stages and lock owner records": "В архив диагностики входят этапы лаунчера и записи о владельцах блокировок", - "Update and recovery checks use the temporary login port even with a Windows override": "Проверка обновления и восстановления использует временный порт входа даже при переопределении в Windows" + "Update and recovery checks use the temporary login port even with a Windows override": "Проверка обновления и восстановления использует временный порт входа даже при переопределении в Windows", + "Custom Races patch installation recovers from interrupted downloads": "Установка патчей дополнительных рас восстанавливается после прерывания загрузки" }, "de": { "Choose Parallel or Global level scaling in module settings": "Parallele oder globale Levelskalierung in den Moduleinstellungen wählen", @@ -76,7 +77,8 @@ "Update validation keeps MySQL running between compatible checks": "Bei der Update-Validierung bleibt MySQL zwischen kompatiblen Prüfungen aktiv", "Choose normal logs, errors only or no server logs in maintenance settings": "In den Wartungseinstellungen normale Protokolle, nur Fehler oder keine Serverprotokolle wählen", "Diagnostic exports include launcher stages and lock owner records": "Diagnoseexporte enthalten Launcher-Schritte und aufgezeichnete Sperrbesitzer", - "Update and recovery checks use the temporary login port even with a Windows override": "Update- und Wiederherstellungsprüfungen verwenden den temporären Anmeldeport auch bei einer Windows-Vorgabe" + "Update and recovery checks use the temporary login port even with a Windows override": "Update- und Wiederherstellungsprüfungen verwenden den temporären Anmeldeport auch bei einer Windows-Vorgabe", + "Custom Races patch installation recovers from interrupted downloads": "Die Installation zusätzlicher Völker setzt unterbrochene Downloads fort" }, "fr": { "Choose Parallel or Global level scaling in module settings": "Choisissez une progression parallèle ou globale des niveaux dans les paramètres du module", @@ -115,7 +117,8 @@ "Update validation keeps MySQL running between compatible checks": "La validation des mises à jour garde MySQL actif entre les vérifications compatibles", "Choose normal logs, errors only or no server logs in maintenance settings": "Choisissez les journaux normaux, les erreurs uniquement ou aucun journal dans les paramètres de maintenance", "Diagnostic exports include launcher stages and lock owner records": "Les exports de diagnostic incluent les étapes de lancement et les propriétaires des verrous", - "Update and recovery checks use the temporary login port even with a Windows override": "Les contrôles de mise à jour et de restauration utilisent le port de connexion temporaire même si Windows en impose un autre" + "Update and recovery checks use the temporary login port even with a Windows override": "Les contrôles de mise à jour et de restauration utilisent le port de connexion temporaire même si Windows en impose un autre", + "Custom Races patch installation recovers from interrupted downloads": "L’installation des races supplémentaires reprend les téléchargements interrompus" }, "es": { "Choose Parallel or Global level scaling in module settings": "Elige escalado de nivel paralelo o global en los ajustes del módulo", @@ -154,7 +157,8 @@ "Update validation keeps MySQL running between compatible checks": "La validación de actualizaciones mantiene MySQL activo entre comprobaciones compatibles", "Choose normal logs, errors only or no server logs in maintenance settings": "Elige registros normales, solo errores o ningún registro en los ajustes de mantenimiento", "Diagnostic exports include launcher stages and lock owner records": "Los archivos de diagnóstico incluyen las etapas del lanzador y los propietarios de bloqueos", - "Update and recovery checks use the temporary login port even with a Windows override": "Las comprobaciones de actualización y recuperación usan el puerto temporal de acceso aunque Windows indique otro" + "Update and recovery checks use the temporary login port even with a Windows override": "Las comprobaciones de actualización y recuperación usan el puerto temporal de acceso aunque Windows indique otro", + "Custom Races patch installation recovers from interrupted downloads": "La instalación de razas adicionales se recupera de descargas interrumpidas" }, "zh": { "Choose Parallel or Global level scaling in module settings": "在模块设置中选择并行或全局等级缩放", @@ -193,7 +197,8 @@ "Update validation keeps MySQL running between compatible checks": "更新验证会在兼容的检查步骤之间保持 MySQL 运行", "Choose normal logs, errors only or no server logs in maintenance settings": "在维护设置中选择普通日志、仅错误或关闭服务器日志", "Diagnostic exports include launcher stages and lock owner records": "诊断导出包含启动器阶段和锁所属进程记录", - "Update and recovery checks use the temporary login port even with a Windows override": "即使 Windows 指定了其他端口,更新和恢复检查也会使用临时登录端口" + "Update and recovery checks use the temporary login port even with a Windows override": "即使 Windows 指定了其他端口,更新和恢复检查也会使用临时登录端口", + "Custom Races patch installation recovers from interrupted downloads": "自定义种族补丁安装可从中断的下载中恢复" } }, "server": { @@ -244,7 +249,16 @@ "Startup and shutdown keep bounded diagnostics of launcher stages": "При запуске и остановке сохраняется ограниченная по объёму диагностика этапов лаунчера", "Database shutdown succeeds when MySQL closes its connection before replying": "Остановка базы завершается успешно, если MySQL закрыл соединение до отправки ответа", "Server startup waits for ports that Windows is still releasing": "При запуске сервер ждёт, пока Windows освободит порт", - "Companions avoid repeating unreachable routes in the open world": "В открытом мире спутники перестают повторять непроходимые маршруты" + "Companions avoid repeating unreachable routes in the open world": "В открытом мире спутники перестают повторять непроходимые маршруты", + "Login server startup works when Windows does not list its listening port": "Сервер входа запускается, даже если Windows не показывает его прослушиваемый порт", + "Updated SQUID's Playerbots to 2.9.4 and refreshed Dungeon Clear": "Обновлены SQUID’s Playerbots до 2.9.4 и Dungeon Clear", + "Electrocutioner is used up by Electrocute and no longer makes it look ready too early": "Electrocute расходует Electrocutioner и больше не выглядит готовым раньше времени", + "The Dungeon Finder boss objective survives a relog": "Цель убийства босса в поиске подземелий сохраняется после повторного входа", + "Vanilla dungeon bosses no longer sleep or mind control tanks and healers": "Боссы классических подземелий больше не усыпляют и не подчиняют танков и лекарей", + "Classic dungeons scale only for Dungeon Finder groups": "Классические подземелья масштабируются только для групп поиска подземелий", + "Darkmaster Gandling raises Risen Students only at 52% health": "Тёмный магистр Гандлинг поднимает восставших студентов только при 52% здоровья", + "Sunken Temple's dragons appear only after the Avatar of Hakkar and Jammal'an": "Драконы Затонувшего храма появляются только после Аватары Хаккара и Джаммал’ана", + "Scaled loot previews survive a map change": "Предпросмотр масштабированной добычи сохраняется при смене карты" }, "de": { "Restrict new characters by custom race without changing existing characters": "Neue Charaktere nach zusätzlichem Volk beschränken, ohne bestehende Charaktere zu ändern", @@ -293,7 +307,16 @@ "Startup and shutdown keep bounded diagnostics of launcher stages": "Start und Herunterfahren speichern begrenzte Diagnosedaten der Launcher-Schritte", "Database shutdown succeeds when MySQL closes its connection before replying": "Das Herunterfahren der Datenbank gelingt auch, wenn MySQL die Verbindung vor der Antwort schließt", "Server startup waits for ports that Windows is still releasing": "Beim Start wartet der Server, bis Windows den Port freigibt", - "Companions avoid repeating unreachable routes in the open world": "Gefährten meiden in der offenen Welt wiederholte Versuche auf unpassierbaren Routen" + "Companions avoid repeating unreachable routes in the open world": "Gefährten meiden in der offenen Welt wiederholte Versuche auf unpassierbaren Routen", + "Login server startup works when Windows does not list its listening port": "Der Anmeldeserver startet auch ohne Eintrag seines lauschenden Ports in Windows", + "Updated SQUID's Playerbots to 2.9.4 and refreshed Dungeon Clear": "SQUID’s Playerbots auf 2.9.4 aktualisiert und Dungeon Clear erneuert", + "Electrocutioner is used up by Electrocute and no longer makes it look ready too early": "Electrocute verbraucht Electrocutioner und erscheint nicht mehr vorzeitig einsatzbereit", + "The Dungeon Finder boss objective survives a relog": "Das Bossziel der Dungeonsuche bleibt nach erneutem Einloggen erhalten", + "Vanilla dungeon bosses no longer sleep or mind control tanks and healers": "Bosse klassischer Dungeons versetzen Tanks und Heiler nicht mehr in Schlaf oder Gedankenkontrolle", + "Classic dungeons scale only for Dungeon Finder groups": "Klassische Dungeons skalieren nur für Gruppen der Dungeonsuche", + "Darkmaster Gandling raises Risen Students only at 52% health": "Dunkelmeister Gandling erweckt auferstandene Studenten erst bei 52 % Gesundheit", + "Sunken Temple's dragons appear only after the Avatar of Hakkar and Jammal'an": "Die Drachen im Versunkenen Tempel erscheinen erst nach dem Avatar von Hakkar und Jammal’an", + "Scaled loot previews survive a map change": "Die Vorschau skalierter Beute bleibt beim Kartenwechsel erhalten" }, "fr": { "Restrict new characters by custom race without changing existing characters": "Restreignez les races supplémentaires des nouveaux personnages sans modifier les personnages existants", @@ -342,7 +365,16 @@ "Startup and shutdown keep bounded diagnostics of launcher stages": "Le démarrage et l’arrêt conservent un diagnostic limité des étapes de lancement", "Database shutdown succeeds when MySQL closes its connection before replying": "L’arrêt de la base réussit même si MySQL ferme la connexion avant de répondre", "Server startup waits for ports that Windows is still releasing": "Au démarrage, le serveur attend que Windows libère le port", - "Companions avoid repeating unreachable routes in the open world": "Les compagnons évitent de reprendre les chemins impraticables en monde ouvert" + "Companions avoid repeating unreachable routes in the open world": "Les compagnons évitent de reprendre les chemins impraticables en monde ouvert", + "Login server startup works when Windows does not list its listening port": "Le serveur de connexion démarre même si Windows ne répertorie pas son port d’écoute", + "Updated SQUID's Playerbots to 2.9.4 and refreshed Dungeon Clear": "SQUID’s Playerbots passe en version 2.9.4 et Dungeon Clear est actualisé", + "Electrocutioner is used up by Electrocute and no longer makes it look ready too early": "Electrocute consomme Electrocutioner et ne paraît plus disponible trop tôt", + "The Dungeon Finder boss objective survives a relog": "L’objectif de boss de la recherche de donjons est conservé après reconnexion", + "Vanilla dungeon bosses no longer sleep or mind control tanks and healers": "Les boss des donjons classiques n’endorment plus les tanks et soigneurs et ne contrôlent plus leur esprit", + "Classic dungeons scale only for Dungeon Finder groups": "Les donjons classiques ne s’adaptent que pour les groupes de la recherche de donjons", + "Darkmaster Gandling raises Risen Students only at 52% health": "Le sombre maître Gandling ne relève les étudiants qu’à 52 % de ses points de vie", + "Sunken Temple's dragons appear only after the Avatar of Hakkar and Jammal'an": "Les dragons du Temple englouti n’apparaissent qu’après l’Avatar d’Hakkar et Jammal’an", + "Scaled loot previews survive a map change": "L’aperçu du butin adapté est conservé lors d’un changement de carte" }, "es": { "Restrict new characters by custom race without changing existing characters": "Restringe las razas adicionales de personajes nuevos sin modificar los existentes", @@ -391,7 +423,16 @@ "Startup and shutdown keep bounded diagnostics of launcher stages": "El inicio y la parada guardan diagnósticos limitados de las etapas del lanzador", "Database shutdown succeeds when MySQL closes its connection before replying": "La parada de la base de datos se completa aunque MySQL cierre la conexión antes de responder", "Server startup waits for ports that Windows is still releasing": "Al iniciarse, el servidor espera a que Windows libere el puerto", - "Companions avoid repeating unreachable routes in the open world": "Los compañeros evitan repetir rutas intransitables en el mundo abierto" + "Companions avoid repeating unreachable routes in the open world": "Los compañeros evitan repetir rutas intransitables en el mundo abierto", + "Login server startup works when Windows does not list its listening port": "El servidor de acceso arranca aunque Windows no muestre su puerto de escucha", + "Updated SQUID's Playerbots to 2.9.4 and refreshed Dungeon Clear": "SQUID’s Playerbots se actualiza a 2.9.4 y se renueva Dungeon Clear", + "Electrocutioner is used up by Electrocute and no longer makes it look ready too early": "Electrocute consume Electrocutioner y ya no parece disponible antes de tiempo", + "The Dungeon Finder boss objective survives a relog": "El objetivo de jefe del buscador de mazmorras se conserva al volver a entrar", + "Vanilla dungeon bosses no longer sleep or mind control tanks and healers": "Los jefes de mazmorras clásicas ya no duermen ni controlan mentalmente a tanques y sanadores", + "Classic dungeons scale only for Dungeon Finder groups": "Las mazmorras clásicas solo se ajustan para grupos del buscador de mazmorras", + "Darkmaster Gandling raises Risen Students only at 52% health": "El Maestro Oscuro Gandling solo alza a los estudiantes resucitados al 52 % de salud", + "Sunken Temple's dragons appear only after the Avatar of Hakkar and Jammal'an": "Los dragones del Templo Sumergido solo aparecen después del Avatar de Hakkar y Jammal’an", + "Scaled loot previews survive a map change": "La vista previa del botín ajustado se conserva al cambiar de mapa" }, "zh": { "Restrict new characters by custom race without changing existing characters": "限制新角色可选的自定义种族,不影响现有角色", @@ -440,7 +481,16 @@ "Startup and shutdown keep bounded diagnostics of launcher stages": "启动和关闭时会保留大小受限的启动器阶段诊断日志", "Database shutdown succeeds when MySQL closes its connection before replying": "即使 MySQL 在回复前关闭连接,数据库关闭操作也能正确完成", "Server startup waits for ports that Windows is still releasing": "服务器启动时会等待 Windows 释放端口", - "Companions avoid repeating unreachable routes in the open world": "伙伴在开放世界中会避免反复尝试无法通行的路线" + "Companions avoid repeating unreachable routes in the open world": "伙伴在开放世界中会避免反复尝试无法通行的路线", + "Login server startup works when Windows does not list its listening port": "即使 Windows 未列出监听端口,登录服务器也能启动", + "Updated SQUID's Playerbots to 2.9.4 and refreshed Dungeon Clear": "已将 SQUID’s Playerbots 更新至 2.9.4,并更新 Dungeon Clear", + "Electrocutioner is used up by Electrocute and no longer makes it look ready too early": "Electrocute 会消耗 Electrocutioner,且不再过早显示为可用", + "The Dungeon Finder boss objective survives a relog": "地下城查找器的首领目标在重新登录后仍会保留", + "Vanilla dungeon bosses no longer sleep or mind control tanks and healers": "经典地下城首领不再使坦克和治疗者沉睡或受到精神控制", + "Classic dungeons scale only for Dungeon Finder groups": "经典地下城仅对通过地下城查找器组成的队伍进行缩放", + "Darkmaster Gandling raises Risen Students only at 52% health": "黑暗院长加丁仅在生命值降至 52% 时唤起复活的学生", + "Sunken Temple's dragons appear only after the Avatar of Hakkar and Jammal'an": "沉没的神庙中的巨龙仅在哈卡的化身和迦玛兰之后出现", + "Scaled loot previews survive a map change": "缩放后的战利品预览在切换地图后仍会保留" } } } diff --git a/src/data/server-history.json b/src/data/server-history.json index 676d789..598e42f 100644 --- a/src/data/server-history.json +++ b/src/data/server-history.json @@ -1571,6 +1571,143 @@ }, "experimentalFeatures": [], "compare": "https://github.com/Corfirean/coa-server-build/compare/server-0.261030.90...server-0.261101.92" + }, + { + "tag": "server-0.261104.94", + "version": "0.261104.94", + "date": "2026-11-04", + "url": "https://github.com/Corfirean/coa-server-build/releases/tag/server-0.261104.94", + "notes": [ + "Companions avoid repeating unreachable routes in the open world", + "Server startup waits for ports that Windows is still releasing", + "Updated the reviewed CoA upstream snapshot" + ], + "snapshot": "f67a6d8545e4c6ece2f819f9dd2642fe5a81a69c959946a1031859c19b5c4d74", + "components": { + "upstream": { + "repository": "jealous-sound/azerothcore-wotlk-coa", + "ref": "a34c5ad7167b6b2087a678cb4344c6cbe6abb823", + "sha": "a34c5ad7167b6b2087a678cb4344c6cbe6abb823" + }, + "core": { + "repository": "Corfirean/azerothcore-wotlk-coa", + "ref": "14cf375f1e006770b330d3fb89201ace54bfca24", + "sha": "14cf375f1e006770b330d3fb89201ace54bfca24" + }, + "bots": { + "repository": "Corfirean/mod-coa-playerbots", + "ref": "447558bc27d6bb447aaf10eefcb2e85ac2b15c32", + "sha": "447558bc27d6bb447aaf10eefcb2e85ac2b15c32" + }, + "scaling": { + "repository": "Corfirean/mod-coa-content-scaling", + "ref": "3c2febf636bd09087bb278e381b975271a70fdf6", + "sha": "3c2febf636bd09087bb278e381b975271a70fdf6" + }, + "manager": { + "repository": "Corfirean/coa-server-manager", + "ref": "173248efbe24da9b4c1b5ca12fa7580fcd1e8ea7", + "sha": "173248efbe24da9b4c1b5ca12fa7580fcd1e8ea7" + }, + "races": { + "repository": "ilusixn/azerothcore-wotlk-coa", + "ref": "coa-custom-1.9.2", + "sha": "31bd63d309b8b0fb4f1a4d9b793a343b8ac36f1e", + "assets": [ + { + "name": "CoA-Custom-1.9.2-Client-1.zip", + "size": 1513021586, + "digest": "sha256:a9dd51ed2d90fb048d549602f40f5429d56e2df0df5606a38781b358fa369568", + "url": "https://github.com/ilusixn/azerothcore-wotlk-coa/releases/download/coa-custom-1.9.2/CoA-Custom-1.9.2-Client-1.zip" + }, + { + "name": "CoA-Custom-1.9.2-Client-2.zip", + "size": 1198283005, + "digest": "sha256:ab084a55509ccbcc2977a06dd0c01fa879973a1892baaacaeb3ff52f3dfc750e", + "url": "https://github.com/ilusixn/azerothcore-wotlk-coa/releases/download/coa-custom-1.9.2/CoA-Custom-1.9.2-Client-2.zip" + }, + { + "name": "CoA-Custom-1.9.2-Client-3.zip", + "size": 1678829573, + "digest": "sha256:907e267f0ee7038807e626c3c1eca5e12db6c88b747137a23c5fb52eaa1a358e", + "url": "https://github.com/ilusixn/azerothcore-wotlk-coa/releases/download/coa-custom-1.9.2/CoA-Custom-1.9.2-Client-3.zip" + }, + { + "name": "CoA-Custom-1.9.2-Client-4.zip", + "size": 502385128, + "digest": "sha256:e0bd87172af989fa50a8e2b08ba4321c72b6265047482f051a1db3b80d55bcaa", + "url": "https://github.com/ilusixn/azerothcore-wotlk-coa/releases/download/coa-custom-1.9.2/CoA-Custom-1.9.2-Client-4.zip" + }, + { + "name": "CoA-Custom-1.9.2-Client-5.zip", + "size": 168079711, + "digest": "sha256:73364ad1b58c6342641a848a3b20a835472834f600416606be1470386774ca78", + "url": "https://github.com/ilusixn/azerothcore-wotlk-coa/releases/download/coa-custom-1.9.2/CoA-Custom-1.9.2-Client-5.zip" + }, + { + "name": "CoA-Custom-1.9.2-Server.zip", + "size": 53004560, + "digest": "sha256:b893813573a4d3f6a0003c1f174582d3def997f37b402cbca44d53055d2fc1d2", + "url": "https://github.com/ilusixn/azerothcore-wotlk-coa/releases/download/coa-custom-1.9.2/CoA-Custom-1.9.2-Server.zip" + }, + { + "name": "INSTALL-GUIDE.txt", + "size": 3006, + "digest": "sha256:f17e97fafa3225901d1caf8c3b8141293f98fbfb8c9243c0c4717278c60146aa", + "url": "https://github.com/ilusixn/azerothcore-wotlk-coa/releases/download/coa-custom-1.9.2/INSTALL-GUIDE.txt" + }, + { + "name": "PATCH-NOTES-1.9.2.txt", + "size": 2822, + "digest": "sha256:f2fd4693ba181959a572d3fb10a0050e9ff6c4f735b3ab0019c7d16712db28cb", + "url": "https://github.com/ilusixn/azerothcore-wotlk-coa/releases/download/coa-custom-1.9.2/PATCH-NOTES-1.9.2.txt" + } + ] + }, + "squid": { + "repository": "Zyth45/mod-playerbots", + "ref": "v2.8.2", + "sha": "fa4cfd31997367b3e574a2b89b858c4669ff53fb", + "patch": "patches/squid-coa-validation.patch", + "patchSha256": "9b101db17369fb5a6af3f7e99323f7770eb8650ba3b5e9b3970bf09a0ef5d32f" + }, + "build": { + "repository": "Corfirean/coa-server-build", + "ref": "d9aaa5263154473b2fe1623172492f88e6e03d73", + "sha": "d9aaa5263154473b2fe1623172492f88e6e03d73" + }, + "dungeon-clear": { + "repository": "Zyth45/mod-dungeon-clear", + "sha": "9a9d09cf512e0a883af9cda6973445b81c123b13", + "patch": "patches/dungeon-clear-coa-validation.patch", + "patchSha256": "956f278865e22ee75c984ca22ff8238150b5886c9934ddfe64dd9c832c912dcc", + "ref": "9a9d09cf512e0a883af9cda6973445b81c123b13" + }, + "navigation": { + "repository": "Corfirean/azerothcore-wotlk-coa", + "ref": "8b44099f480af0b69c6dfc697e4d388e865e9ffc", + "sha": "8b44099f480af0b69c6dfc697e4d388e865e9ffc", + "sourceRelease": "navigation-20261012", + "manifestSha256": "7f28600735f115792e79a5e8d1c8d78a83a8f5ed14a090c6d87268e49c2bb683", + "archiveSha256": "aa1347a095f85af44b4f592270a0e9314954801fda4578f0147f847e32c24a60", + "assets": [ + { + "name": "navigation.zip.001", + "size": 1500000000, + "sha256": "e3a93903fc8155ee0d92db399ec426769c360bef87c44c07beb7e21cfd892c18", + "url": "https://github.com/Corfirean/coa-server-build/releases/download/navigation-20261012/navigation.zip.001" + }, + { + "name": "navigation.zip.002", + "size": 1377006470, + "sha256": "c1af26ba7f83676278613076c357c4da0a11cfa6ae1ff00003479057c4864471", + "url": "https://github.com/Corfirean/coa-server-build/releases/download/navigation-20261012/navigation.zip.002" + } + ] + } + }, + "experimentalFeatures": [], + "compare": "https://github.com/Corfirean/coa-server-build/compare/server-0.261101.92...server-0.261104.94" } ] } diff --git a/tools/reviewed-manager-notes.json b/tools/reviewed-manager-notes.json index dce9ee7..2a031b9 100644 --- a/tools/reviewed-manager-notes.json +++ b/tools/reviewed-manager-notes.json @@ -1,6 +1,6 @@ { - "version": "0.9.9", + "version": "0.9.10", "notes": [ - "Update and recovery checks use the temporary login port even with a Windows override" + "Custom Races patch installation recovers from interrupted downloads" ] } diff --git a/tools/reviewed-server-notes.json b/tools/reviewed-server-notes.json index 46c385e..61d3877 100644 --- a/tools/reviewed-server-notes.json +++ b/tools/reviewed-server-notes.json @@ -1,12 +1,17 @@ { - "core": "14cf375f1e006770b330d3fb89201ace54bfca24", - "bots": "447558bc27d6bb447aaf10eefcb2e85ac2b15c32", - "squid": "fa4cfd31997367b3e574a2b89b858c4669ff53fb", + "core": "bd4263d26f99ff051017373e3b4fc35518b8df90", + "bots": "0588a8e5cdfe54f81fe47bbb40fc9f75d29662e3", + "squid": "75d1784f66f3c731340a96f72bfbd301974b6ab4", + "dungeon-clear": "081a04f4208056dbb90717a5d10fe1e593943d5b", "notes": [ - "Server startup waits for ports that Windows is still releasing", - "Normal Classic dungeons retain their authored damage at full party size", - "Companions avoid repeating unreachable routes in the open world", - "Updated the reviewed CoA upstream snapshot" - ], - "dungeon-clear": "9a9d09cf512e0a883af9cda6973445b81c123b13" + "Login server startup works when Windows does not list its listening port", + "Updated SQUID's Playerbots to 2.9.4 and refreshed Dungeon Clear", + "Electrocutioner is used up by Electrocute and no longer makes it look ready too early", + "The Dungeon Finder boss objective survives a relog", + "Vanilla dungeon bosses no longer sleep or mind control tanks and healers", + "Classic dungeons scale only for Dungeon Finder groups", + "Darkmaster Gandling raises Risen Students only at 52% health", + "Sunken Temple's dragons appear only after the Avatar of Hakkar and Jammal'an", + "Scaled loot previews survive a map change" + ] }