@woosh/meep-engine 2.138.0 → 2.138.1
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/build/bundle-worker-image-decoder.js +1 -1
- package/build/bundle-worker-terrain.js +1 -1
- package/package.json +1 -1
- package/src/core/assert.d.ts +6 -0
- package/src/core/assert.d.ts.map +1 -1
- package/src/core/assert.js +16 -3
- package/src/core/binary/half_to_float_uint16.js +1 -1
- package/src/core/binary/to_half_float_uint16.d.ts.map +1 -1
- package/src/core/binary/to_half_float_uint16.js +9 -4
- package/src/core/collection/table/RowFirstTableSpec.js +1 -1
- package/src/core/events/signal/Signal.d.ts.map +1 -1
- package/src/core/events/signal/Signal.js +53 -0
- package/src/core/math/spline/spline3_hermite_intersection_spline3_hermite_2d.d.ts +3 -3
- package/src/core/math/spline/spline3_hermite_intersection_spline3_hermite_2d.js +3 -3
- package/src/engine/Clock.d.ts +2 -2
- package/src/engine/Clock.js +2 -2
- package/src/engine/graphics/ecs/highlight/system/RenderableHighlightSystem.d.ts.map +1 -1
- package/src/engine/graphics/ecs/highlight/system/RenderableHighlightSystem.js +17 -29
- package/src/engine/graphics/ecs/highlight/system/ShadedGeometryHighlightSystem.d.ts.map +1 -1
- package/src/engine/graphics/ecs/highlight/system/ShadedGeometryHighlightSystem.js +18 -31
- package/src/engine/network/NetworkSession.d.ts +386 -0
- package/src/engine/network/NetworkSession.d.ts.map +1 -0
- package/src/engine/network/NetworkSession.js +1841 -0
- package/src/engine/network/PriorityFetch.d.ts.map +1 -1
- package/src/engine/network/PriorityFetch.js +3 -2
- package/src/engine/network/adapters/QuaternionInterpolationAdapter.d.ts +14 -0
- package/src/engine/network/adapters/QuaternionInterpolationAdapter.d.ts.map +1 -0
- package/src/engine/network/adapters/QuaternionInterpolationAdapter.js +44 -0
- package/src/engine/network/adapters/TransformInterpolationAdapter.d.ts +18 -0
- package/src/engine/network/adapters/TransformInterpolationAdapter.d.ts.map +1 -0
- package/src/engine/network/adapters/TransformInterpolationAdapter.js +79 -0
- package/src/engine/network/adapters/TransformReplicationAdapter.d.ts +37 -0
- package/src/engine/network/adapters/TransformReplicationAdapter.d.ts.map +1 -0
- package/src/engine/network/adapters/TransformReplicationAdapter.js +87 -0
- package/src/engine/network/adapters/Vector3InterpolationAdapter.d.ts +18 -0
- package/src/engine/network/adapters/Vector3InterpolationAdapter.d.ts.map +1 -0
- package/src/engine/network/adapters/Vector3InterpolationAdapter.js +46 -0
- package/src/engine/network/convertPathToURL.js +107 -107
- package/src/engine/network/core/quantize/quantize_float.d.ts +54 -0
- package/src/engine/network/core/quantize/quantize_float.d.ts.map +1 -0
- package/src/engine/network/core/quantize/quantize_float.js +66 -0
- package/src/engine/network/core/quantize/quantize_position.d.ts +44 -0
- package/src/engine/network/core/quantize/quantize_position.d.ts.map +1 -0
- package/src/engine/network/core/quantize/quantize_position.js +54 -0
- package/src/engine/network/core/sequence/ack_bitfield.d.ts +47 -0
- package/src/engine/network/core/sequence/ack_bitfield.d.ts.map +1 -0
- package/src/engine/network/core/sequence/ack_bitfield.js +77 -0
- package/src/engine/network/core/sequence/seq16.d.ts +53 -0
- package/src/engine/network/core/sequence/seq16.d.ts.map +1 -0
- package/src/engine/network/core/sequence/seq16.js +69 -0
- package/src/engine/network/core/sequence/seq32.d.ts +55 -0
- package/src/engine/network/core/sequence/seq32.d.ts.map +1 -0
- package/src/engine/network/core/sequence/seq32.js +73 -0
- package/src/engine/network/diagnostics/BandwidthMeter.d.ts +76 -0
- package/src/engine/network/diagnostics/BandwidthMeter.d.ts.map +1 -0
- package/src/engine/network/diagnostics/BandwidthMeter.js +155 -0
- package/src/engine/network/diagnostics/ReplayLog.d.ts +74 -0
- package/src/engine/network/diagnostics/ReplayLog.d.ts.map +1 -0
- package/src/engine/network/diagnostics/ReplayLog.js +137 -0
- package/src/engine/network/diagnostics/SyncTest.d.ts +74 -0
- package/src/engine/network/diagnostics/SyncTest.d.ts.map +1 -0
- package/src/engine/network/diagnostics/SyncTest.js +151 -0
- package/src/engine/network/ecs/NetworkSystem.d.ts +57 -0
- package/src/engine/network/ecs/NetworkSystem.d.ts.map +1 -0
- package/src/engine/network/ecs/NetworkSystem.js +84 -0
- package/src/engine/network/ecs/components/NetworkIdentity.d.ts +58 -0
- package/src/engine/network/ecs/components/NetworkIdentity.d.ts.map +1 -0
- package/src/engine/network/ecs/components/NetworkIdentity.js +73 -0
- package/src/engine/network/ecs/serialization/NetworkIdentitySerializationAdapter.d.ts +40 -0
- package/src/engine/network/ecs/serialization/NetworkIdentitySerializationAdapter.d.ts.map +1 -0
- package/src/engine/network/ecs/serialization/NetworkIdentitySerializationAdapter.js +64 -0
- package/src/engine/network/orchestrator/NetworkPeer.d.ts +389 -0
- package/src/engine/network/orchestrator/NetworkPeer.d.ts.map +1 -0
- package/src/engine/network/orchestrator/NetworkPeer.js +1107 -0
- package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts +260 -0
- package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts.map +1 -0
- package/src/engine/network/orchestrator/ServerAuthoritativeClient.js +425 -0
- package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts +217 -0
- package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts.map +1 -0
- package/src/engine/network/orchestrator/ServerAuthoritativeServer.js +562 -0
- package/src/engine/network/replication/Replicator.d.ts +134 -0
- package/src/engine/network/replication/Replicator.d.ts.map +1 -0
- package/src/engine/network/replication/Replicator.js +334 -0
- package/src/engine/network/replication/ScopeFilter.d.ts +64 -0
- package/src/engine/network/replication/ScopeFilter.d.ts.map +1 -0
- package/src/engine/network/replication/ScopeFilter.js +71 -0
- package/src/engine/network/sim/ActionLog.d.ts +94 -0
- package/src/engine/network/sim/ActionLog.d.ts.map +1 -0
- package/src/engine/network/sim/ActionLog.js +189 -0
- package/src/engine/network/sim/BinaryInterpolationAdapter.d.ts +58 -0
- package/src/engine/network/sim/BinaryInterpolationAdapter.d.ts.map +1 -0
- package/src/engine/network/sim/BinaryInterpolationAdapter.js +56 -0
- package/src/engine/network/sim/InterpolationLog.d.ts +165 -0
- package/src/engine/network/sim/InterpolationLog.d.ts.map +1 -0
- package/src/engine/network/sim/InterpolationLog.js +583 -0
- package/src/engine/network/sim/ReplicatedComponentRegistry.d.ts +59 -0
- package/src/engine/network/sim/ReplicatedComponentRegistry.d.ts.map +1 -0
- package/src/engine/network/sim/ReplicatedComponentRegistry.js +140 -0
- package/src/engine/network/sim/RewindEngine.d.ts +66 -0
- package/src/engine/network/sim/RewindEngine.d.ts.map +1 -0
- package/src/engine/network/sim/RewindEngine.js +182 -0
- package/src/engine/network/sim/SimAction.d.ts +133 -0
- package/src/engine/network/sim/SimAction.d.ts.map +1 -0
- package/src/engine/network/sim/SimAction.js +273 -0
- package/src/engine/network/sim/SimActionExecutor.d.ts +109 -0
- package/src/engine/network/sim/SimActionExecutor.d.ts.map +1 -0
- package/src/engine/network/sim/SimActionExecutor.js +238 -0
- package/src/engine/network/sim/SimActionRegistry.d.ts +60 -0
- package/src/engine/network/sim/SimActionRegistry.d.ts.map +1 -0
- package/src/engine/network/sim/SimActionRegistry.js +128 -0
- package/src/engine/network/sim/SmoothingState.d.ts +87 -0
- package/src/engine/network/sim/SmoothingState.d.ts.map +1 -0
- package/src/engine/network/sim/SmoothingState.js +223 -0
- package/src/engine/network/sim/Snapshotter.d.ts +98 -0
- package/src/engine/network/sim/Snapshotter.d.ts.map +1 -0
- package/src/engine/network/sim/Snapshotter.js +206 -0
- package/src/engine/network/sim/SpeculationLog.d.ts +53 -0
- package/src/engine/network/sim/SpeculationLog.d.ts.map +1 -0
- package/src/engine/network/sim/SpeculationLog.js +84 -0
- package/src/engine/network/state/Baseline.d.ts +48 -0
- package/src/engine/network/state/Baseline.d.ts.map +1 -0
- package/src/engine/network/state/Baseline.js +83 -0
- package/src/engine/network/state/ChangedEntitySet.d.ts +94 -0
- package/src/engine/network/state/ChangedEntitySet.d.ts.map +1 -0
- package/src/engine/network/state/ChangedEntitySet.js +256 -0
- package/src/engine/network/state/InputRing.d.ts +90 -0
- package/src/engine/network/state/InputRing.d.ts.map +1 -0
- package/src/engine/network/state/InputRing.js +173 -0
- package/src/engine/network/state/MutationLedger.d.ts +82 -0
- package/src/engine/network/state/MutationLedger.d.ts.map +1 -0
- package/src/engine/network/state/MutationLedger.js +182 -0
- package/src/engine/network/state/PriorityAccumulator.d.ts +104 -0
- package/src/engine/network/state/PriorityAccumulator.d.ts.map +1 -0
- package/src/engine/network/state/PriorityAccumulator.js +180 -0
- package/src/engine/network/state/ReplicationSlotTable.d.ts +78 -0
- package/src/engine/network/state/ReplicationSlotTable.d.ts.map +1 -0
- package/src/engine/network/state/ReplicationSlotTable.js +211 -0
- package/src/engine/network/time/AdaptiveRenderDelay.d.ts +128 -0
- package/src/engine/network/time/AdaptiveRenderDelay.d.ts.map +1 -0
- package/src/engine/network/time/AdaptiveRenderDelay.js +258 -0
- package/src/engine/network/time/JitterBuffer.d.ts +58 -0
- package/src/engine/network/time/JitterBuffer.d.ts.map +1 -0
- package/src/engine/network/time/JitterBuffer.js +116 -0
- package/src/engine/network/time/TimeDilation.d.ts +49 -0
- package/src/engine/network/time/TimeDilation.d.ts.map +1 -0
- package/src/engine/network/time/TimeDilation.js +62 -0
- package/src/engine/network/time/TimeSync.d.ts +68 -0
- package/src/engine/network/time/TimeSync.d.ts.map +1 -0
- package/src/engine/network/time/TimeSync.js +153 -0
- package/src/engine/network/transport/Channel.d.ts +74 -0
- package/src/engine/network/transport/Channel.d.ts.map +1 -0
- package/src/engine/network/transport/Channel.js +272 -0
- package/src/engine/network/transport/LoopbackTransport.d.ts +59 -0
- package/src/engine/network/transport/LoopbackTransport.d.ts.map +1 -0
- package/src/engine/network/transport/LoopbackTransport.js +194 -0
- package/src/engine/network/transport/ReliableCommandPipeline.d.ts +139 -0
- package/src/engine/network/transport/ReliableCommandPipeline.d.ts.map +1 -0
- package/src/engine/network/transport/ReliableCommandPipeline.js +291 -0
- package/src/engine/network/transport/Transport.d.ts +109 -0
- package/src/engine/network/transport/Transport.d.ts.map +1 -0
- package/src/engine/network/transport/Transport.js +119 -0
- package/src/engine/network/transport/adapters/NodeUDPTransport.d.ts +60 -0
- package/src/engine/network/transport/adapters/NodeUDPTransport.d.ts.map +1 -0
- package/src/engine/network/transport/adapters/NodeUDPTransport.js +206 -0
- package/src/engine/network/transport/adapters/SimulatedTransport.d.ts +110 -0
- package/src/engine/network/transport/adapters/SimulatedTransport.d.ts.map +1 -0
- package/src/engine/network/transport/adapters/SimulatedTransport.js +252 -0
- package/src/engine/network/transport/adapters/WebRTCDataChannelTransport.d.ts +33 -0
- package/src/engine/network/transport/adapters/WebRTCDataChannelTransport.d.ts.map +1 -0
- package/src/engine/network/transport/adapters/WebRTCDataChannelTransport.js +131 -0
- package/src/engine/network/transport/adapters/WebSocketTransport.d.ts +49 -0
- package/src/engine/network/transport/adapters/WebSocketTransport.d.ts.map +1 -0
- package/src/engine/network/transport/adapters/WebSocketTransport.js +180 -0
- package/src/engine/network/transport/adapters/WebTransportTransport.d.ts +73 -0
- package/src/engine/network/transport/adapters/WebTransportTransport.d.ts.map +1 -0
- package/src/engine/network/transport/adapters/WebTransportTransport.js +210 -0
- package/src/engine/network/transport/fragments/FragmentAssembler.d.ts +104 -0
- package/src/engine/network/transport/fragments/FragmentAssembler.d.ts.map +1 -0
- package/src/engine/network/transport/fragments/FragmentAssembler.js +291 -0
- package/src/engine/network/transport/fragments/FragmentRetention.d.ts +103 -0
- package/src/engine/network/transport/fragments/FragmentRetention.d.ts.map +1 -0
- package/src/engine/network/transport/fragments/FragmentRetention.js +194 -0
- package/src/engine/network/transport/fragments/fragment_send.d.ts +53 -0
- package/src/engine/network/transport/fragments/fragment_send.d.ts.map +1 -0
- package/src/engine/network/transport/fragments/fragment_send.js +147 -0
- package/src/engine/network/transport/fragments/packet_size.d.ts +93 -0
- package/src/engine/network/transport/fragments/packet_size.d.ts.map +1 -0
- package/src/engine/network/transport/fragments/packet_size.js +101 -0
- package/src/engine/network/xhr.js +23 -23
- package/src/engine/simulation/Ticker.d.ts +7 -0
- package/src/engine/simulation/Ticker.d.ts.map +1 -1
- package/src/engine/simulation/Ticker.js +15 -4
- package/src/engine/network/DataChannel.js +0 -1210
- package/src/engine/network/RemoteController.d.ts +0 -23
- package/src/engine/network/RemoteController.d.ts.map +0 -1
- package/src/engine/network/RemoteController.js +0 -114
- package/src/engine/network/remoteEditor.d.ts +0 -2
- package/src/engine/network/remoteEditor.d.ts.map +0 -1
- package/src/engine/network/remoteEditor.js +0 -142
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { assert } from "../../../core/assert.js";
|
|
2
|
+
import { ResourceAccessKind } from "../../../core/model/ResourceAccessKind.js";
|
|
3
|
+
import { ResourceAccessSpecification } from "../../../core/model/ResourceAccessSpecification.js";
|
|
4
|
+
import { System } from "../../ecs/System.js";
|
|
5
|
+
import { NetworkIdentity } from "./components/NetworkIdentity.js";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* ECS system that owns the per-entity replication lifecycle.
|
|
9
|
+
*
|
|
10
|
+
* Responsibilities:
|
|
11
|
+
* - When an entity gains a {@link NetworkIdentity}, allocate a `network_id`
|
|
12
|
+
* in the peer's slot table (or honour an explicit pre-set one — used by
|
|
13
|
+
* `Snapshotter` and incoming-packet flows).
|
|
14
|
+
* - When an entity loses its `NetworkIdentity` (or is destroyed), free the
|
|
15
|
+
* slot.
|
|
16
|
+
*
|
|
17
|
+
* **Not** responsible for the per-tick `begin_tick` / `end_tick` cadence —
|
|
18
|
+
* the engine's `EntityManager` doesn't expose pre/post-simulate hooks, so the
|
|
19
|
+
* application code wraps its `engine.simulate(dt)` call:
|
|
20
|
+
*
|
|
21
|
+
* ```js
|
|
22
|
+
* peer.begin_tick(frame_number);
|
|
23
|
+
* engine.simulate(dt);
|
|
24
|
+
* peer.end_tick();
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* Add this system to the engine once per `NetworkPeer` instance:
|
|
28
|
+
*
|
|
29
|
+
* ```js
|
|
30
|
+
* const peer = new NetworkPeer({ ... });
|
|
31
|
+
* const network_system = new NetworkSystem(peer);
|
|
32
|
+
* engine.entityManager.addSystem(network_system);
|
|
33
|
+
* ```
|
|
34
|
+
*
|
|
35
|
+
* @author Alex Goldring
|
|
36
|
+
* @copyright Company Named Limited (c) 2025
|
|
37
|
+
*/
|
|
38
|
+
export class NetworkSystem extends System {
|
|
39
|
+
|
|
40
|
+
dependencies = [NetworkIdentity];
|
|
41
|
+
|
|
42
|
+
components_used = [
|
|
43
|
+
ResourceAccessSpecification.from(NetworkIdentity, ResourceAccessKind.Write),
|
|
44
|
+
];
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* @param {NetworkPeer} peer
|
|
48
|
+
*/
|
|
49
|
+
constructor(peer) {
|
|
50
|
+
super();
|
|
51
|
+
assert.ok(peer && peer.slot_table, 'NetworkSystem: peer must be a NetworkPeer instance with a slot_table');
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* @type {NetworkPeer}
|
|
55
|
+
*/
|
|
56
|
+
this.peer = peer;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* @param {NetworkIdentity} identity
|
|
61
|
+
* @param {number} entity
|
|
62
|
+
*/
|
|
63
|
+
link(identity, entity) {
|
|
64
|
+
if (identity.network_id < 0) {
|
|
65
|
+
// Local spawn: allocate a fresh network_id.
|
|
66
|
+
identity.network_id = this.peer.slot_table.allocate(entity);
|
|
67
|
+
} else {
|
|
68
|
+
// Pre-set (e.g. from a Snapshotter or a remote peer's spawn action).
|
|
69
|
+
// Honour the explicit ID so both sides share the same slot.
|
|
70
|
+
this.peer.slot_table.allocate_at(identity.network_id, entity);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* @param {NetworkIdentity} identity
|
|
76
|
+
* @param {number} entity
|
|
77
|
+
*/
|
|
78
|
+
unlink(identity, entity) {
|
|
79
|
+
if (identity.network_id >= 0) {
|
|
80
|
+
this.peer.slot_table.free(identity.network_id);
|
|
81
|
+
identity.network_id = -1;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Marks an entity as replicated and stores its peer-shared `network_id`.
|
|
3
|
+
*
|
|
4
|
+
* Replication is opt-in: only entities with this component are visible to
|
|
5
|
+
* the network layer. Add it before adding any other replicated component;
|
|
6
|
+
* remove it to stop replication (the entity stays alive locally).
|
|
7
|
+
*
|
|
8
|
+
* `network_id` is assigned automatically by {@link NetworkSystem.link} when
|
|
9
|
+
* the component is added to an entity. If the value is non-negative at link
|
|
10
|
+
* time, the system uses it as an explicit hint (typical when a packet from a
|
|
11
|
+
* remote peer carries a `network_id` that must map to a fresh local entity).
|
|
12
|
+
*
|
|
13
|
+
* `owner_peer_id` is the peer that has authority over this entity. Default
|
|
14
|
+
* value `-1` means "the local peer" (server-spawned entities on the server,
|
|
15
|
+
* or unowned). Game logic uses this to decide whether to trust incoming
|
|
16
|
+
* mutations or to predict locally.
|
|
17
|
+
*
|
|
18
|
+
* @author Alex Goldring
|
|
19
|
+
* @copyright Company Named Limited (c) 2025
|
|
20
|
+
*/
|
|
21
|
+
export class NetworkIdentity {
|
|
22
|
+
/**
|
|
23
|
+
* Peer-shared identifier. Negative until {@link NetworkSystem.link} runs.
|
|
24
|
+
* @type {number}
|
|
25
|
+
*/
|
|
26
|
+
network_id: number;
|
|
27
|
+
/**
|
|
28
|
+
* Peer that authoritatively owns this entity, or -1 for "local / server-owned".
|
|
29
|
+
* @type {number}
|
|
30
|
+
*/
|
|
31
|
+
owner_peer_id: number;
|
|
32
|
+
/**
|
|
33
|
+
* Reserved for game-defined replication policy bits (priority class,
|
|
34
|
+
* always-relevant flag, interpolation profile, etc.). Layout is up to the game.
|
|
35
|
+
* @type {number}
|
|
36
|
+
*/
|
|
37
|
+
replication_flags: number;
|
|
38
|
+
/**
|
|
39
|
+
*
|
|
40
|
+
* @param {NetworkIdentity} other
|
|
41
|
+
* @returns {boolean}
|
|
42
|
+
*/
|
|
43
|
+
equals(other: NetworkIdentity): boolean;
|
|
44
|
+
/**
|
|
45
|
+
*
|
|
46
|
+
* @returns {number}
|
|
47
|
+
*/
|
|
48
|
+
hash(): number;
|
|
49
|
+
/**
|
|
50
|
+
* @readonly
|
|
51
|
+
* @type {boolean}
|
|
52
|
+
*/
|
|
53
|
+
readonly isNetworkIdentity: boolean;
|
|
54
|
+
}
|
|
55
|
+
export namespace NetworkIdentity {
|
|
56
|
+
let typeName: string;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=NetworkIdentity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NetworkIdentity.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/network/ecs/components/NetworkIdentity.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH;IAEI;;;OAGG;IACH,YAFU,MAAM,CAEA;IAEhB;;;OAGG;IACH,eAFU,MAAM,CAEG;IAEnB;;;;OAIG;IACH,mBAFU,MAAM,CAEM;IAEtB;;;;OAIG;IACH,cAHW,eAAe,GACb,OAAO,CAOnB;IAED;;;OAGG;IACH,QAFa,MAAM,CAIlB;IASL;;;OAGG;IACH,4BAFU,OAAO,CAE0B;CAZ1C;;kBAIS,MAAM"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Marks an entity as replicated and stores its peer-shared `network_id`.
|
|
3
|
+
*
|
|
4
|
+
* Replication is opt-in: only entities with this component are visible to
|
|
5
|
+
* the network layer. Add it before adding any other replicated component;
|
|
6
|
+
* remove it to stop replication (the entity stays alive locally).
|
|
7
|
+
*
|
|
8
|
+
* `network_id` is assigned automatically by {@link NetworkSystem.link} when
|
|
9
|
+
* the component is added to an entity. If the value is non-negative at link
|
|
10
|
+
* time, the system uses it as an explicit hint (typical when a packet from a
|
|
11
|
+
* remote peer carries a `network_id` that must map to a fresh local entity).
|
|
12
|
+
*
|
|
13
|
+
* `owner_peer_id` is the peer that has authority over this entity. Default
|
|
14
|
+
* value `-1` means "the local peer" (server-spawned entities on the server,
|
|
15
|
+
* or unowned). Game logic uses this to decide whether to trust incoming
|
|
16
|
+
* mutations or to predict locally.
|
|
17
|
+
*
|
|
18
|
+
* @author Alex Goldring
|
|
19
|
+
* @copyright Company Named Limited (c) 2025
|
|
20
|
+
*/
|
|
21
|
+
export class NetworkIdentity {
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Peer-shared identifier. Negative until {@link NetworkSystem.link} runs.
|
|
25
|
+
* @type {number}
|
|
26
|
+
*/
|
|
27
|
+
network_id = -1;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Peer that authoritatively owns this entity, or -1 for "local / server-owned".
|
|
31
|
+
* @type {number}
|
|
32
|
+
*/
|
|
33
|
+
owner_peer_id = -1;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Reserved for game-defined replication policy bits (priority class,
|
|
37
|
+
* always-relevant flag, interpolation profile, etc.). Layout is up to the game.
|
|
38
|
+
* @type {number}
|
|
39
|
+
*/
|
|
40
|
+
replication_flags = 0;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
*
|
|
44
|
+
* @param {NetworkIdentity} other
|
|
45
|
+
* @returns {boolean}
|
|
46
|
+
*/
|
|
47
|
+
equals(other) {
|
|
48
|
+
return this.network_id === other.network_id
|
|
49
|
+
&& this.owner_peer_id === other.owner_peer_id
|
|
50
|
+
&& this.replication_flags === other.replication_flags
|
|
51
|
+
;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
*
|
|
56
|
+
* @returns {number}
|
|
57
|
+
*/
|
|
58
|
+
hash() {
|
|
59
|
+
return this.network_id ^ this.owner_peer_id ^ this.replication_flags;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* @readonly
|
|
65
|
+
* @type {string}
|
|
66
|
+
*/
|
|
67
|
+
NetworkIdentity.typeName = "NetworkIdentity";
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* @readonly
|
|
71
|
+
* @type {boolean}
|
|
72
|
+
*/
|
|
73
|
+
NetworkIdentity.prototype.isNetworkIdentity = true;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Highest `owner_peer_id` value the wire format can faithfully represent.
|
|
3
|
+
* Above this the +1 bias would alias into the "unowned" sentinel encoding.
|
|
4
|
+
* Documented here so callers can see the limit without spelunking the
|
|
5
|
+
* adapter internals.
|
|
6
|
+
*
|
|
7
|
+
* @type {number}
|
|
8
|
+
*/
|
|
9
|
+
export const MAX_OWNER_PEER_ID: number;
|
|
10
|
+
/**
|
|
11
|
+
* Save-game adapter for {@link NetworkIdentity}.
|
|
12
|
+
*
|
|
13
|
+
* Wire layout: `network_id_varint, owner_peer_id_uint16, replication_flags_uint8`.
|
|
14
|
+
*
|
|
15
|
+
* Note: this is for *save-game* persistence, not the per-tick replication
|
|
16
|
+
* stream. Network packets carry `network_id` inside individual `SimAction`
|
|
17
|
+
* payloads; the component itself doesn't go on the wire (the receiver creates
|
|
18
|
+
* a fresh NetworkIdentity locally).
|
|
19
|
+
*
|
|
20
|
+
* @author Alex Goldring
|
|
21
|
+
* @copyright Company Named Limited (c) 2025
|
|
22
|
+
*/
|
|
23
|
+
export class NetworkIdentitySerializationAdapter extends BinaryClassSerializationAdapter<any> {
|
|
24
|
+
constructor();
|
|
25
|
+
klass: typeof NetworkIdentity;
|
|
26
|
+
version: number;
|
|
27
|
+
/**
|
|
28
|
+
* @param {BinaryBuffer} buffer
|
|
29
|
+
* @param {NetworkIdentity} value
|
|
30
|
+
*/
|
|
31
|
+
serialize(buffer: BinaryBuffer, value: NetworkIdentity): void;
|
|
32
|
+
/**
|
|
33
|
+
* @param {BinaryBuffer} buffer
|
|
34
|
+
* @param {NetworkIdentity} value
|
|
35
|
+
*/
|
|
36
|
+
deserialize(buffer: BinaryBuffer, value: NetworkIdentity): void;
|
|
37
|
+
}
|
|
38
|
+
import { BinaryClassSerializationAdapter } from "../../../ecs/storage/binary/BinaryClassSerializationAdapter.js";
|
|
39
|
+
import { NetworkIdentity } from "../components/NetworkIdentity.js";
|
|
40
|
+
//# sourceMappingURL=NetworkIdentitySerializationAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NetworkIdentitySerializationAdapter.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/network/ecs/serialization/NetworkIdentitySerializationAdapter.js"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AACH,gCAFU,MAAM,CAEwB;AAExC;;;;;;;;;;;;GAYG;AACH;;IAEI,8BAAwB;IACxB,gBAAY;IAEZ;;;OAGG;IACH,uCAFW,eAAe,QAmBzB;IAED;;;OAGG;IACH,yCAFW,eAAe,QAMzB;CACJ;gDA/D+C,gEAAgE;gCAChF,kCAAkC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { BinaryClassSerializationAdapter } from "../../../ecs/storage/binary/BinaryClassSerializationAdapter.js";
|
|
2
|
+
import { NetworkIdentity } from "../components/NetworkIdentity.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Highest `owner_peer_id` value the wire format can faithfully represent.
|
|
6
|
+
* Above this the +1 bias would alias into the "unowned" sentinel encoding.
|
|
7
|
+
* Documented here so callers can see the limit without spelunking the
|
|
8
|
+
* adapter internals.
|
|
9
|
+
*
|
|
10
|
+
* @type {number}
|
|
11
|
+
*/
|
|
12
|
+
export const MAX_OWNER_PEER_ID = 0xFFFD;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Save-game adapter for {@link NetworkIdentity}.
|
|
16
|
+
*
|
|
17
|
+
* Wire layout: `network_id_varint, owner_peer_id_uint16, replication_flags_uint8`.
|
|
18
|
+
*
|
|
19
|
+
* Note: this is for *save-game* persistence, not the per-tick replication
|
|
20
|
+
* stream. Network packets carry `network_id` inside individual `SimAction`
|
|
21
|
+
* payloads; the component itself doesn't go on the wire (the receiver creates
|
|
22
|
+
* a fresh NetworkIdentity locally).
|
|
23
|
+
*
|
|
24
|
+
* @author Alex Goldring
|
|
25
|
+
* @copyright Company Named Limited (c) 2025
|
|
26
|
+
*/
|
|
27
|
+
export class NetworkIdentitySerializationAdapter extends BinaryClassSerializationAdapter {
|
|
28
|
+
|
|
29
|
+
klass = NetworkIdentity;
|
|
30
|
+
version = 1;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* @param {BinaryBuffer} buffer
|
|
34
|
+
* @param {NetworkIdentity} value
|
|
35
|
+
*/
|
|
36
|
+
serialize(buffer, value) {
|
|
37
|
+
// network_id can be -1 (unassigned). Bias by 1 so the varint stays small.
|
|
38
|
+
buffer.writeUintVar(value.network_id + 1);
|
|
39
|
+
// owner_peer_id can also be -1; bias by 1 into uint16 range. Mask
|
|
40
|
+
// would silently alias values >= 0xFFFE into the "unowned" sentinel.
|
|
41
|
+
// We throw instead so the truncation can't slip through in a
|
|
42
|
+
// production bundle (where assertions are stripped). Lift to a
|
|
43
|
+
// wider field on the wire if we ever expect more than ~65k
|
|
44
|
+
// concurrent peers.
|
|
45
|
+
if (value.owner_peer_id > MAX_OWNER_PEER_ID) {
|
|
46
|
+
throw new Error(
|
|
47
|
+
`NetworkIdentitySerializationAdapter: owner_peer_id ${value.owner_peer_id} exceeds the wire format limit (${MAX_OWNER_PEER_ID}); ` +
|
|
48
|
+
`widen the wire format if more peers are needed`
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
buffer.writeUint16((value.owner_peer_id + 1) & 0xFFFF);
|
|
52
|
+
buffer.writeUint8(value.replication_flags & 0xFF);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* @param {BinaryBuffer} buffer
|
|
57
|
+
* @param {NetworkIdentity} value
|
|
58
|
+
*/
|
|
59
|
+
deserialize(buffer, value) {
|
|
60
|
+
value.network_id = buffer.readUintVar() - 1;
|
|
61
|
+
value.owner_peer_id = buffer.readUint16() - 1;
|
|
62
|
+
value.replication_flags = buffer.readUint8();
|
|
63
|
+
}
|
|
64
|
+
}
|