@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 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.1";
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.1';
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';
@@ -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
- /** Dense voxel-type grid (4096 bytes, `x + y*16 + z*256`), null when unknown. */
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 | undefined | void;
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":"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"}
1
+ {"version":3,"file":"chunks.d.ts","sourceRoot":"","sources":["../../src/stores/chunks.ts"],"names":[],"mappings":"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"}
@@ -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) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crowdedkingdoms/crowdyjs",
3
- "version": "8.4.1",
3
+ "version": "8.4.3",
4
4
  "description": "Client SDK for Crowded Kingdoms GraphQL API with UDP proxy support",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",