@antha/multiplayer-p2p-lock-step 0.14.1 → 0.15.0
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.
|
@@ -11,7 +11,7 @@ export type AnthaMultiplayerP2pLockStepState<MultiplayerPacket extends JsonCompa
|
|
|
11
11
|
debugMultiplayer?: boolean | undefined;
|
|
12
12
|
/** P2p-lock-step controller state. */
|
|
13
13
|
multiplayerP2pLockStep: {
|
|
14
|
-
/**
|
|
14
|
+
/** Multiplayer controller used to drive singleplayer or multiplayer frame sync. */
|
|
15
15
|
multiplayerController: P2pLockStepMultiplayerController<MultiplayerPacket>;
|
|
16
16
|
/** Current backend API and room connection state. */
|
|
17
17
|
connectionState: ApiAndRoomConnectionState;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineAnthaMod } from '@antha/engine';
|
|
2
|
-
import {
|
|
2
|
+
import { emptyApiAndRoomConnectionState, MultiplayerControllerConnectionEvent, } from '@antha/multiplayer-core';
|
|
3
3
|
import { log, } from '@augment-vir/common';
|
|
4
4
|
import { P2pLockStepMultiplayerController, } from './p2p-lock-step-multiplayer-controller.js';
|
|
5
5
|
/**
|
|
@@ -25,7 +25,7 @@ export function createAnthaMultiplayerP2pLockStepMod(options = {}) {
|
|
|
25
25
|
}),
|
|
26
26
|
connectionState: emptyApiAndRoomConnectionState,
|
|
27
27
|
};
|
|
28
|
-
state.multiplayerP2pLockStep.multiplayerController.listen(
|
|
28
|
+
state.multiplayerP2pLockStep.multiplayerController.listen(MultiplayerControllerConnectionEvent, ({ detail: newConnectionState }) => {
|
|
29
29
|
if (!state.multiplayerP2pLockStep) {
|
|
30
30
|
return;
|
|
31
31
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type ApiAndRoomConnectionState, type ClientId,
|
|
1
|
+
import { type ApiAndRoomConnectionState, type ClientId, MultiplayerControllerClientEvent, MultiplayerControllerConnectionEvent, MultiplayerControllerRoomListEvent, type MultiplayerControllerRoomListListener, type MultiplayerInitParams, type MultiplayerRoomConnection, MultiplayerRoomController, type RoomInput, RoomRejectionError } from '@antha/multiplayer-core';
|
|
2
2
|
import { type JsonCompatibleValue, type MaybePromise, type PartialWithUndefined } from '@augment-vir/common';
|
|
3
3
|
import { type AnyDuration } from 'date-vir';
|
|
4
4
|
import { ListenTarget, type RemoveListenerCallback, type TypedCustomEventInit } from 'typed-event-target';
|
|
@@ -12,7 +12,7 @@ export declare enum P2pLockStepMessageType {
|
|
|
12
12
|
Frame = "frame"
|
|
13
13
|
}
|
|
14
14
|
/**
|
|
15
|
-
* Data received from {@link
|
|
15
|
+
* Data received from {@link MultiplayerControllerFrameEvent}.
|
|
16
16
|
*
|
|
17
17
|
* @category Internal
|
|
18
18
|
*/
|
|
@@ -56,7 +56,7 @@ export type P2pLockStepMultiplayerControllerParams<Action extends JsonCompatible
|
|
|
56
56
|
*
|
|
57
57
|
* @default accept all connections
|
|
58
58
|
*/
|
|
59
|
-
acceptConnection?: ((connectingClientId: ClientId,
|
|
59
|
+
acceptConnection?: ((connectingClientId: ClientId, multiplayerController: P2pLockStepMultiplayerController<Action>) => MaybePromise<boolean>) | undefined;
|
|
60
60
|
/** Enables verbose multiplayer debug logs. */
|
|
61
61
|
debugMultiplayer?: boolean | undefined;
|
|
62
62
|
/**
|
|
@@ -67,25 +67,25 @@ export type P2pLockStepMultiplayerControllerParams<Action extends JsonCompatible
|
|
|
67
67
|
*/
|
|
68
68
|
frameDuration?: AnyDuration | undefined;
|
|
69
69
|
}>;
|
|
70
|
-
declare const
|
|
70
|
+
declare const MultiplayerControllerFrameEvent_base: (new (eventInitDict: {
|
|
71
71
|
bubbles?: boolean;
|
|
72
72
|
cancelable?: boolean;
|
|
73
73
|
composed?: boolean;
|
|
74
74
|
detail: any;
|
|
75
|
-
}) => import("typed-event-target").TypedCustomEvent<any, "controller-frame">) & Pick<{
|
|
75
|
+
}) => import("typed-event-target").TypedCustomEvent<any, "multiplayer-controller-frame">) & Pick<{
|
|
76
76
|
new (type: string, eventInitDict?: EventInit): Event;
|
|
77
77
|
prototype: Event;
|
|
78
78
|
readonly NONE: 0;
|
|
79
79
|
readonly CAPTURING_PHASE: 1;
|
|
80
80
|
readonly AT_TARGET: 2;
|
|
81
81
|
readonly BUBBLING_PHASE: 3;
|
|
82
|
-
}, "prototype" | "NONE" | "CAPTURING_PHASE" | "AT_TARGET" | "BUBBLING_PHASE"> & Pick<import("typed-event-target").TypedCustomEvent<any, "controller-frame">, "type">;
|
|
82
|
+
}, "prototype" | "NONE" | "CAPTURING_PHASE" | "AT_TARGET" | "BUBBLING_PHASE"> & Pick<import("typed-event-target").TypedCustomEvent<any, "multiplayer-controller-frame">, "type">;
|
|
83
83
|
/**
|
|
84
84
|
* This is fired whenever a new p2p-lock-step frame is received from the host client.
|
|
85
85
|
*
|
|
86
86
|
* @category Events
|
|
87
87
|
*/
|
|
88
|
-
export declare class
|
|
88
|
+
export declare class MultiplayerControllerFrameEvent<MultiplayerPacket extends JsonCompatibleValue> extends MultiplayerControllerFrameEvent_base {
|
|
89
89
|
detail: ReadonlyArray<FrameEventDetail<MultiplayerPacket>>;
|
|
90
90
|
constructor(eventInitDict: TypedCustomEventInit<ReadonlyArray<FrameEventDetail<MultiplayerPacket>>>);
|
|
91
91
|
}
|
|
@@ -94,13 +94,13 @@ export declare class ControllerFrameEvent<MultiplayerPacket extends JsonCompatib
|
|
|
94
94
|
*
|
|
95
95
|
* @category Internal
|
|
96
96
|
*/
|
|
97
|
-
export type AllP2pLockStepMultiplayerControllerEvents<MultiplayerPacket extends JsonCompatibleValue> =
|
|
97
|
+
export type AllP2pLockStepMultiplayerControllerEvents<MultiplayerPacket extends JsonCompatibleValue> = MultiplayerControllerFrameEvent<MultiplayerPacket> | MultiplayerControllerRoomListEvent | MultiplayerControllerClientEvent | MultiplayerControllerConnectionEvent;
|
|
98
98
|
/**
|
|
99
99
|
* Listener callback for p2p-lock-step frame events.
|
|
100
100
|
*
|
|
101
101
|
* @category Internal
|
|
102
102
|
*/
|
|
103
|
-
export type
|
|
103
|
+
export type MultiplayerControllerFrameListener<MultiplayerPacket extends JsonCompatibleValue> = (event: Readonly<MultiplayerControllerFrameEvent<MultiplayerPacket>>) => MaybePromise<void>;
|
|
104
104
|
/**
|
|
105
105
|
* An all-in-one controller for singleplayer or p2p-lock-step multiplayer game state.
|
|
106
106
|
*
|
|
@@ -112,11 +112,11 @@ export declare class P2pLockStepMultiplayerController<MultiplayerPacket extends
|
|
|
112
112
|
readonly currentFps: number;
|
|
113
113
|
/** All events emitted by this controller. */
|
|
114
114
|
static readonly events: {
|
|
115
|
-
|
|
115
|
+
MultiplayerControllerFrameEvent: typeof MultiplayerControllerFrameEvent;
|
|
116
116
|
};
|
|
117
117
|
/** All events emitted by this controller. */
|
|
118
118
|
readonly events: {
|
|
119
|
-
|
|
119
|
+
MultiplayerControllerFrameEvent: typeof MultiplayerControllerFrameEvent;
|
|
120
120
|
};
|
|
121
121
|
static readonly knownErrors: {
|
|
122
122
|
RoomRejectionError: typeof RoomRejectionError;
|
|
@@ -149,9 +149,9 @@ export declare class P2pLockStepMultiplayerController<MultiplayerPacket extends
|
|
|
149
149
|
*
|
|
150
150
|
* If a callback is provided, it is called each time the room list is updated.
|
|
151
151
|
*/
|
|
152
|
-
startRoomUpdates(callback:
|
|
152
|
+
startRoomUpdates(callback: MultiplayerControllerRoomListListener): RemoveListenerCallback;
|
|
153
153
|
startRoomUpdates(callback?: undefined): undefined;
|
|
154
|
-
startRoomUpdates(callback?:
|
|
154
|
+
startRoomUpdates(callback?: MultiplayerControllerRoomListListener | undefined): RemoveListenerCallback | undefined;
|
|
155
155
|
/** Turn off room list updates and remove callbacks added via `startRoomUpdates`. */
|
|
156
156
|
stopRoomUpdates(): void;
|
|
157
157
|
/** Currently joined room id. If a room has not been joined yet, this will be empty. */
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createMultiplayerId, emptyApiAndRoomConnectionState, MultiplayerConnectionState, MultiplayerControllerClientEvent, MultiplayerControllerConnectionEvent, MultiplayerControllerMessageEvent, MultiplayerControllerRoomListEvent, MultiplayerRoomController, RoomRejectionError, } from '@antha/multiplayer-core';
|
|
2
2
|
import { ensureArray, log, makeWritable, } from '@augment-vir/common';
|
|
3
3
|
import { convertDuration } from 'date-vir';
|
|
4
4
|
import { defineTypedCustomEvent, ListenTarget, } from 'typed-event-target';
|
|
@@ -17,7 +17,7 @@ export var P2pLockStepMessageType;
|
|
|
17
17
|
*
|
|
18
18
|
* @category Events
|
|
19
19
|
*/
|
|
20
|
-
export class
|
|
20
|
+
export class MultiplayerControllerFrameEvent extends defineTypedCustomEvent()('multiplayer-controller-frame') {
|
|
21
21
|
constructor(eventInitDict) {
|
|
22
22
|
super(eventInitDict);
|
|
23
23
|
}
|
|
@@ -36,7 +36,7 @@ export class P2pLockStepMultiplayerController extends ListenTarget {
|
|
|
36
36
|
currentFps = 0;
|
|
37
37
|
/** All events emitted by this controller. */
|
|
38
38
|
static events = {
|
|
39
|
-
|
|
39
|
+
MultiplayerControllerFrameEvent,
|
|
40
40
|
};
|
|
41
41
|
/** All events emitted by this controller. */
|
|
42
42
|
events = P2pLockStepMultiplayerController.events;
|
|
@@ -159,7 +159,7 @@ export class P2pLockStepMultiplayerController extends ListenTarget {
|
|
|
159
159
|
this.debugLog('starting singleplayer connection');
|
|
160
160
|
this.singleplayer = true;
|
|
161
161
|
this.finishFrame();
|
|
162
|
-
this.dispatch(new
|
|
162
|
+
this.dispatch(new MultiplayerControllerConnectionEvent({
|
|
163
163
|
detail: {
|
|
164
164
|
...emptyApiAndRoomConnectionState,
|
|
165
165
|
api: MultiplayerConnectionState.Connected,
|
|
@@ -282,14 +282,14 @@ export class P2pLockStepMultiplayerController extends ListenTarget {
|
|
|
282
282
|
}
|
|
283
283
|
/** Forward core room-controller events into this frame-sync controller. */
|
|
284
284
|
listenToRoomController() {
|
|
285
|
-
this.roomController.listen(
|
|
285
|
+
this.roomController.listen(MultiplayerControllerRoomListEvent, (event) => {
|
|
286
286
|
this.dispatch(event);
|
|
287
287
|
});
|
|
288
|
-
this.roomController.listen(
|
|
288
|
+
this.roomController.listen(MultiplayerControllerConnectionEvent, (event) => {
|
|
289
289
|
this.debugLog(`connection event received: api=${String(event.detail.api)} room=${String(event.detail.room)}`);
|
|
290
290
|
this.dispatch(event);
|
|
291
291
|
});
|
|
292
|
-
this.roomController.listen(
|
|
292
|
+
this.roomController.listen(MultiplayerControllerClientEvent, (event) => {
|
|
293
293
|
this.debugLog(`client event received: ${JSON.stringify(event.detail)}`);
|
|
294
294
|
if ('newMember' in event.detail) {
|
|
295
295
|
this.syncNewMember(event.detail.newMember);
|
|
@@ -299,7 +299,7 @@ export class P2pLockStepMultiplayerController extends ListenTarget {
|
|
|
299
299
|
}
|
|
300
300
|
this.dispatch(event);
|
|
301
301
|
});
|
|
302
|
-
this.roomController.listen((
|
|
302
|
+
this.roomController.listen((MultiplayerControllerMessageEvent), (event) => {
|
|
303
303
|
this.debugLog(`message event received from ${event.sourceClientId}: type=${event.detail.type}`);
|
|
304
304
|
this.handleReceivedMessage(event.sourceClientId, event.detail);
|
|
305
305
|
});
|
|
@@ -379,7 +379,7 @@ export class P2pLockStepMultiplayerController extends ListenTarget {
|
|
|
379
379
|
sourceClientId: this.clientId,
|
|
380
380
|
type: P2pLockStepMessageType.Actions,
|
|
381
381
|
});
|
|
382
|
-
this.dispatch(new
|
|
382
|
+
this.dispatch(new MultiplayerControllerFrameEvent({
|
|
383
383
|
detail: message.actions,
|
|
384
384
|
}));
|
|
385
385
|
}
|
|
@@ -410,7 +410,7 @@ export class P2pLockStepMultiplayerController extends ListenTarget {
|
|
|
410
410
|
type: P2pLockStepMessageType.Frame,
|
|
411
411
|
actions: currentFrameActions,
|
|
412
412
|
});
|
|
413
|
-
this.dispatch(new
|
|
413
|
+
this.dispatch(new MultiplayerControllerFrameEvent({
|
|
414
414
|
detail: currentFrameActions,
|
|
415
415
|
}));
|
|
416
416
|
this.frameTickReady = false;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@antha/multiplayer-p2p-lock-step",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.15.0",
|
|
4
4
|
"description": "Multiplayer mod for the Antha engine.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"vir",
|
|
@@ -36,20 +36,20 @@
|
|
|
36
36
|
"test:docs": "virmator docs check"
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@augment-vir/assert": "^32.
|
|
40
|
-
"@augment-vir/common": "^32.
|
|
39
|
+
"@augment-vir/assert": "^32.3.0",
|
|
40
|
+
"@augment-vir/common": "^32.3.0",
|
|
41
41
|
"date-vir": "^9.1.1",
|
|
42
42
|
"typed-event-target": "^4.3.3"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
|
-
"@augment-vir/test": "^32.
|
|
45
|
+
"@augment-vir/test": "^32.3.0",
|
|
46
46
|
"@web/dev-server-esbuild": "^2.0.0",
|
|
47
47
|
"@web/test-runner": "^1.0.0",
|
|
48
48
|
"@web/test-runner-playwright": "^1.0.0",
|
|
49
49
|
"istanbul-smart-text-reporter": "^1.1.5"
|
|
50
50
|
},
|
|
51
51
|
"peerDependencies": {
|
|
52
|
-
"@antha/multiplayer-core": "^0.
|
|
52
|
+
"@antha/multiplayer-core": "^0.15.0"
|
|
53
53
|
},
|
|
54
54
|
"engines": {
|
|
55
55
|
"node": ">=22"
|