@crowdedkingdoms/crowdyjs 8.4.1 → 8.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/stores/chunks.d.ts +20 -3
- package/dist/stores/chunks.d.ts.map +1 -1
- package/dist/stores/chunks.js +10 -5
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
* or internal tooling, never an untrusted browser.
|
|
46
46
|
*/
|
|
47
47
|
/** The published package version. Mirrors `package.json`. */
|
|
48
|
-
export declare const VERSION = "8.4.
|
|
48
|
+
export declare const VERSION = "8.4.3";
|
|
49
49
|
export { LbCookieStore } from './lb-cookie-store.js';
|
|
50
50
|
export { CrowdyClient, createCrowdyClient, type CrowdyClientConfig, } from './crowdy-client.js';
|
|
51
51
|
export { BrowserLocalStorageTokenStore, SessionStore, type SessionListener, type TokenStore, } from './session.js';
|
package/dist/index.js
CHANGED
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
* or internal tooling, never an untrusted browser.
|
|
46
46
|
*/
|
|
47
47
|
/** The published package version. Mirrors `package.json`. */
|
|
48
|
-
export const VERSION = '8.4.
|
|
48
|
+
export const VERSION = '8.4.3';
|
|
49
49
|
export { LbCookieStore } from './lb-cookie-store.js';
|
|
50
50
|
export { CrowdyClient, createCrowdyClient, } from './crowdy-client.js';
|
|
51
51
|
export { BrowserLocalStorageTokenStore, SessionStore, } from './session.js';
|
package/dist/stores/chunks.d.ts
CHANGED
|
@@ -17,7 +17,10 @@ export type ChunkLoadState = 'loading' | 'loaded' | 'missing' | 'seeded' | 'fail
|
|
|
17
17
|
export interface CachedChunk<TVoxelState = string, TChunkState = string> {
|
|
18
18
|
readonly key: string;
|
|
19
19
|
readonly coord: ChunkCoord;
|
|
20
|
-
/**
|
|
20
|
+
/**
|
|
21
|
+
* Dense voxel-type grid (4096 bytes), null when unknown. Indexed
|
|
22
|
+
* `x + y*16 + z*256` by default; see {@link ChunkStoreConfig.voxelIndex}.
|
|
23
|
+
*/
|
|
21
24
|
voxels: Uint8Array | null;
|
|
22
25
|
/** Sparse typed per-voxel state by voxel index. */
|
|
23
26
|
voxelStates: Map<number, TVoxelState>;
|
|
@@ -50,9 +53,14 @@ export interface ChunkStoreConfig<TVoxelState = string, TChunkState = string> {
|
|
|
50
53
|
* Called for chunks the server has never stored. Return a 4096-byte dense
|
|
51
54
|
* grid to seed it locally (deterministic client-side worldgen) — seeded
|
|
52
55
|
* chunks are queued for write-back so the world persists and stays
|
|
53
|
-
* identical for everyone.
|
|
56
|
+
* identical for everyone. Return `{ voxels, writeBack: false }` to seed
|
|
57
|
+
* locally WITHOUT persisting (e.g. outside your world's write-back radius
|
|
58
|
+
* or budget).
|
|
54
59
|
*/
|
|
55
|
-
onMissing?: (coord: ChunkCoord) => Uint8Array |
|
|
60
|
+
onMissing?: (coord: ChunkCoord) => Uint8Array | {
|
|
61
|
+
voxels: Uint8Array;
|
|
62
|
+
writeBack?: boolean;
|
|
63
|
+
} | undefined | void;
|
|
56
64
|
/**
|
|
57
65
|
* Write-back cadence: one dirty chunk persists per tick (throttled, like
|
|
58
66
|
* the proven BWF pattern). Defaults to 700 ms; `false` disables the timer
|
|
@@ -68,6 +76,14 @@ export interface ChunkStoreConfig<TVoxelState = string, TChunkState = string> {
|
|
|
68
76
|
* session's local actor automatically; a random uuid otherwise.
|
|
69
77
|
*/
|
|
70
78
|
actorUuid?: string | (() => string | null);
|
|
79
|
+
/**
|
|
80
|
+
* Within-chunk (x,y,z in 0-15) → dense-grid byte offset. Defaults to the
|
|
81
|
+
* platform-documented layout `x + y*16 + z*256`. Override for worlds whose
|
|
82
|
+
* existing dense blobs were written with a different convention (e.g.
|
|
83
|
+
* Blocks with Friends uses `y*256 + z*16 + x`) — the layout is opaque to
|
|
84
|
+
* the platform, so all clients of a world just have to agree.
|
|
85
|
+
*/
|
|
86
|
+
voxelIndex?: (x: number, y: number, z: number) => number;
|
|
71
87
|
/** Clock override for tests. Defaults to `Date.now`. */
|
|
72
88
|
now?: () => number;
|
|
73
89
|
}
|
|
@@ -113,6 +129,7 @@ export declare class ChunkStore<TVoxelState = string, TChunkState = string> {
|
|
|
113
129
|
private readonly hydrateStates;
|
|
114
130
|
private readonly now;
|
|
115
131
|
private readonly fallbackUuid;
|
|
132
|
+
private readonly voxelIndex;
|
|
116
133
|
private revisionValue;
|
|
117
134
|
private sequence;
|
|
118
135
|
constructor(ctx: WorldSessionContext, config?: ChunkStoreConfig<TVoxelState, TChunkState>);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunks.d.ts","sourceRoot":"","sources":["../../src/stores/chunks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAQL,KAAK,UAAU,EAChB,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAExD,wCAAwC;AACxC,MAAM,MAAM,cAAc,GACtB,SAAS,GACT,QAAQ,GACR,SAAS,GACT,QAAQ,GACR,QAAQ,CAAC;AAEb;;;GAGG;AACH,MAAM,WAAW,WAAW,CAAC,WAAW,GAAG,MAAM,EAAE,WAAW,GAAG,MAAM;IACrE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B
|
|
1
|
+
{"version":3,"file":"chunks.d.ts","sourceRoot":"","sources":["../../src/stores/chunks.ts"],"names":[],"mappings":"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"}
|
package/dist/stores/chunks.js
CHANGED
|
@@ -42,6 +42,7 @@ export class ChunkStore {
|
|
|
42
42
|
config.chunkStateCodec ?? rawCodec;
|
|
43
43
|
this.hydrateStates = config.hydrateVoxelStates ?? config.voxelStateCodec !== undefined;
|
|
44
44
|
this.now = config.now ?? Date.now;
|
|
45
|
+
this.voxelIndex = config.voxelIndex ?? voxelIndex;
|
|
45
46
|
// Realtime merge: live edits land in the cache as they replicate.
|
|
46
47
|
ctx.onDispose(ctx.on('voxelUpdate', (notification) => {
|
|
47
48
|
const coord = {
|
|
@@ -76,11 +77,11 @@ export class ChunkStore {
|
|
|
76
77
|
/** The dense voxel type at a within-chunk coordinate (0 when unknown). */
|
|
77
78
|
voxelTypeAt(coord, x, y, z) {
|
|
78
79
|
const chunk = this.chunks.get(chunkKey(coord));
|
|
79
|
-
return chunk?.voxels?.[voxelIndex(x, y, z)] ?? 0;
|
|
80
|
+
return chunk?.voxels?.[this.voxelIndex(x, y, z)] ?? 0;
|
|
80
81
|
}
|
|
81
82
|
/** The typed per-voxel state at a within-chunk coordinate, if any. */
|
|
82
83
|
voxelStateAt(coord, x, y, z) {
|
|
83
|
-
return this.chunks.get(chunkKey(coord))?.voxelStates.get(voxelIndex(x, y, z));
|
|
84
|
+
return this.chunks.get(chunkKey(coord))?.voxelStates.get(this.voxelIndex(x, y, z));
|
|
84
85
|
}
|
|
85
86
|
/** Subscribe to per-chunk changes (loads, merges, edits). @returns off. */
|
|
86
87
|
onChunkChanged(listener) {
|
|
@@ -162,7 +163,7 @@ export class ChunkStore {
|
|
|
162
163
|
chunk.voxels = decodeBase64(full.voxels);
|
|
163
164
|
chunk.chunkState = this.decodeChunkState(full.chunkState ?? null);
|
|
164
165
|
for (const entry of full.voxelStates ?? []) {
|
|
165
|
-
const index = voxelIndex(entry.voxelCoord.x, entry.voxelCoord.y, entry.voxelCoord.z);
|
|
166
|
+
const index = this.voxelIndex(entry.voxelCoord.x, entry.voxelCoord.y, entry.voxelCoord.z);
|
|
166
167
|
if (chunk.voxels)
|
|
167
168
|
chunk.voxels[index] = entry.voxelType;
|
|
168
169
|
if (entry.state) {
|
|
@@ -296,13 +297,17 @@ export class ChunkStore {
|
|
|
296
297
|
chunk.loadState = 'missing';
|
|
297
298
|
this.touch(chunk);
|
|
298
299
|
const generated = this.config.onMissing?.(coord);
|
|
299
|
-
if (generated)
|
|
300
|
+
if (generated instanceof Uint8Array) {
|
|
300
301
|
this.seed(coord, generated);
|
|
302
|
+
}
|
|
303
|
+
else if (generated) {
|
|
304
|
+
this.seed(coord, generated.voxels, { writeBack: generated.writeBack ?? true });
|
|
305
|
+
}
|
|
301
306
|
}
|
|
302
307
|
applyVoxel(chunk, x, y, z, voxelType, encodedState, decodedState) {
|
|
303
308
|
if (!chunk.voxels)
|
|
304
309
|
chunk.voxels = new Uint8Array(CHUNK_VOLUME);
|
|
305
|
-
const index = voxelIndex(x, y, z);
|
|
310
|
+
const index = this.voxelIndex(x, y, z);
|
|
306
311
|
chunk.voxels[index] = voxelType;
|
|
307
312
|
let state = decodedState;
|
|
308
313
|
if (state === undefined && encodedState) {
|