Release Healer Man 0.1.29

This commit is contained in:
phenom committed 2026-09-11 14:26:15 -04:00
1 parent 8c9809d3e0
commit 544c1bee91
120 files changed
+4363 -1036

No files matched your search

@@ -8,9 +8,9 @@
"valid": true
}
],
"gridCells": 2074478,
"gridHeight": 994,
"gridWidth": 2087,
"gridCells": 4046196,
"gridHeight": 1812,
"gridWidth": 2233,
"ignoredEmptyTilePackingFailures": 0,
"intermediateRetention": null,
"mode": "solo",
@@ -21,55 +21,55 @@
"tileRows": 1,
"tileSize": null
},
"dungeonId": "black-rook-hold-arena",
"dungeonId": "arena-runtime-black-rook",
"generator": "@recast-navigation/three@0.43.1",
"geometry": {
"bounds": [
[
-92.08255767822266,
-16.14961814880371,
-279.4311218261719
-102.83599853515625,
-49.58357238769531,
-373.1059875488281
],
[
321.9174499511719,
37.25038528442383,
-82.83113098144531
340.9640197753906,
410.1164245605469,
-28.105987548828125
]
],
"boundsTolerance": 0.4,
"rejectedOutOfBoundsTriangles": 0,
"sourceTriangles": 7170,
"sourceVertices": 21510,
"triangles": 7170,
"vertices": 21510
"sourceTriangles": 26724,
"sourceVertices": 80172,
"triangles": 26724,
"vertices": 80172
},
"input": {
"bounds": [
[
-93.08255767822266,
-39.549617767333984,
-280.0311279296875
-103.83599853515625,
-98.98357391357422,
-375.3059997558594
],
[
324.1624450683594,
69.1881103515625,
-81.26593780517578
342.7250061035156,
410.1130065917969,
-13.022000312805176
]
],
"degenerateTriangleCount": 0,
"degenerateTriangleCount": 33,
"invalidIndexCount": 0,
"meshCount": 1,
"nonFiniteCoordinateCount": 0,
"triangleCount": 49821,
"vertexCount": 149463
"triangleCount": 192419,
"vertexCount": 577257
},
"inputChunkChecksums": {
"public/assets/game/arenas/black-rook-hold-arena/navigation-collision.glb": "285bdce7d5b5085eef7d25f82a5b6a5b380605a310c539e8e94984182c835749"
"playtest-artifacts/black-rook-combined.glb": "aa4f39620e2562cea0bf39ec54ff377b19eef799eaa08f0e9ea81896f8a31aba"
},
"inputChunks": [
"public/assets/game/arenas/black-rook-hold-arena/navigation-collision.glb"
"playtest-artifacts/black-rook-combined.glb"
],
"output": "public/assets/game/arenas/black-rook-hold-arena/navigation-raw.glb",
"output": "playtest-artifacts/black-rook-navigation.glb",
"schemaVersion": 1,
"settings": {
"agentHeight": 1.8,
@@ -80,35 +80,6 @@
"cellSize": 0.2
},
"source": {
"adtFiles": [
"blackrookholdarena_28_28.adt",
"blackrookholdarena_28_29.adt",
"blackrookholdarena_28_30.adt",
"blackrookholdarena_29_28.adt",
"blackrookholdarena_29_29.adt",
"blackrookholdarena_29_30.adt",
"blackrookholdarena_30_28.adt",
"blackrookholdarena_30_29.adt",
"blackrookholdarena_30_30.adt"
],
"gameplayBounds": {
"max": [
312,
30,
-110
],
"min": [
-82,
-10,
-242
]
},
"kind": "adt-placed-wmo-repair",
"legacyCollision": "public/assets/game/manastorm/1784-blackrookholdarena/collision.glb",
"placedWmos": [
"../LadiksMPQEditor/patch-WC1/WORLD/WMO/BROKENISLES/VALSHARAH/7VS_BLACKROOKHOLD_MICRO01.WMO",
"../LadiksMPQEditor/patch-WC1/WORLD/WMO/PVP/BUILDINGS/BLACKROOKHOLD/7VS_BLACKROOKHOLD_ARENA.WMO",
"../LadiksMPQEditor/patch-WC1/WORLD/WMO/PVP/BUILDINGS/BLACKROOKHOLD/BLACKROOKHOLD_ARENA_PLATFORMTEST.WMO"
]
"kind": "runtime-collision-repair"
}
}
@@ -56,15 +56,16 @@
"collisionChunks": 4
},
"navigation": {
"triangles": 4948,
"vertices": 14844,
"sourceComponents": 805,
"triangles": 783,
"vertices": 2349,
"sourceComponents": 1078,
"spawnDistances": [
0.009180110009213026,
0.01568599673120942
2.095,
1.026
],
"rawTriangles": 7170,
"report": "recast-report.json"
"rawTriangles": 26724,
"report": "recast-report.json",
"repair": "Rebaked against restored collision. Both teams spawn on the connected interior floor, not the terrain above the arena."
},
"assets": [
{
@@ -94,8 +95,8 @@
},
{
"file": "navigation.glb",
"bytes": 238420,
"sha256": "e463a0220842a4793b2150e95f4fd704f575def288813c781792b021afe8d3f0"
"bytes": 38500,
"sha256": "ee2df9f0c2dbd14d53e84fd66efcc4b48a93ac99c57c27a7d1ea876d29899910"
}
]
}
+55 -1
View File
@@ -1,10 +1,51 @@
const CONTENT_CACHE_NAME = "healer-man-content-v1";
const OBJECT_HEADER = "x-healer-man-content-object";
const ENCODING_HEADER = "x-healer-man-content-encoding";
let bundledManifest;
function mimeType(path) {
const extension = path.split(".").pop();
return ({ glb: "model/gltf-binary", json: "application/json", js: "text/javascript", wasm: "application/wasm",
ktx2: "image/ktx2", png: "image/png", webp: "image/webp", avif: "image/avif", svg: "image/svg+xml",
mp3: "audio/mpeg", ogg: "audio/ogg", wav: "audio/wav", webm: "video/webm" })[extension] ?? "application/octet-stream";
}
async function decodedResponse(response, path, encoding) {
if (encoding !== "gzip") return response;
const headers = new Headers(response.headers);
headers.set("content-type", mimeType(path));
headers.delete("content-length");
headers.delete("content-encoding");
headers.delete(ENCODING_HEADER);
return new Response(response.body.pipeThrough(new DecompressionStream("gzip")), { status: 200, headers });
}
async function bundledAsset(path) {
if (!bundledManifest) {
bundledManifest = fetch("/content/bootstrap-manifest.json", { cache: "no-cache" })
.then((response) => response.ok ? response.json() : null)
.catch(() => null);
}
const manifest = await bundledManifest;
if (!manifest) { bundledManifest = null; return null; }
const entry = manifest.files?.[path];
if (!entry) return null;
const object = entry.download ?? entry;
// Older bootstrap catalogs served their original logical paths directly.
if (!object.url.startsWith("/content/bundled/")) return fetch(path);
const response = await fetch(object.url);
if (!response.ok) return response;
if (entry.download) return decodedResponse(response, path, entry.download.encoding);
return new Response(response.body, { headers: { "content-type": mimeType(path) } });
}
const MANAGED_ASSET_PREFIXES = [
"/assets/characters/",
"/assets/creatures/",
"/assets/equipment/",
"/assets/game/",
"/assets/ui/",
"/basis/",
"/data/",
];
const BUNDLED_ASSET_PREFIXES = [
"/assets/ui/",
@@ -36,6 +77,10 @@ self.addEventListener("install", (event) => {
event.waitUntil(self.skipWaiting());
});
self.addEventListener("message", (event) => {
if (event.data?.type === "refresh-content-bootstrap") bundledManifest = null;
});
self.addEventListener("activate", (event) => {
event.waitUntil((async () => {
const names = await caches.keys();
@@ -56,7 +101,16 @@ self.addEventListener("fetch", (event) => {
event.respondWith((async () => {
const cache = await caches.open(CONTENT_CACHE_NAME);
const cached = await cache.match(request, { ignoreSearch: true });
if (cached) return cached;
if (cached) {
const objectPath = cached.headers.get(OBJECT_HEADER);
if (!objectPath) return cached;
if (objectPath.startsWith("/content/cache-objects/")) {
const object = await cache.match(new URL(objectPath, self.location.origin).toString());
if (object) return decodedResponse(object, url.pathname, object.headers.get(ENCODING_HEADER));
}
}
const bundled = await bundledAsset(url.pathname);
if (bundled) return bundled;
if (BUNDLED_ASSET_PATHS.has(url.pathname)
|| BUNDLED_ASSET_PREFIXES.some((prefix) => url.pathname.startsWith(prefix))) {
return fetch(request);