gdcore-tools 2.0.0-beta5 → 2.0.0-beta7
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/Runtime/Cordova/config.xml +4 -0
- package/dist/Runtime/Cordova/package.json +12 -20
- package/dist/Runtime/CustomRuntimeObject.js +1 -1
- package/dist/Runtime/CustomRuntimeObject.js.map +2 -2
- package/dist/Runtime/CustomRuntimeObjectInstanceContainer.js +1 -1
- package/dist/Runtime/CustomRuntimeObjectInstanceContainer.js.map +2 -2
- package/dist/Runtime/Extensions/3D/A_RuntimeObject3D.js +1 -1
- package/dist/Runtime/Extensions/3D/A_RuntimeObject3D.js.map +2 -2
- package/dist/Runtime/Extensions/3D/AmbientLight.js +1 -1
- package/dist/Runtime/Extensions/3D/AmbientLight.js.map +2 -2
- package/dist/Runtime/Extensions/3D/CustomRuntimeObject3D.js +1 -1
- package/dist/Runtime/Extensions/3D/CustomRuntimeObject3D.js.map +2 -2
- package/dist/Runtime/Extensions/3D/DirectionalLight.js +1 -1
- package/dist/Runtime/Extensions/3D/DirectionalLight.js.map +2 -2
- package/dist/Runtime/Extensions/3D/ExponentialFog.js +1 -1
- package/dist/Runtime/Extensions/3D/ExponentialFog.js.map +2 -2
- package/dist/Runtime/Extensions/3D/HemisphereLight.js +1 -1
- package/dist/Runtime/Extensions/3D/HemisphereLight.js.map +2 -2
- package/dist/Runtime/Extensions/3D/JsExtension.js +419 -228
- package/dist/Runtime/Extensions/3D/LinearFog.js +1 -1
- package/dist/Runtime/Extensions/3D/LinearFog.js.map +2 -2
- package/dist/Runtime/Extensions/3D/Model3DRuntimeObject.js +1 -1
- package/dist/Runtime/Extensions/3D/Model3DRuntimeObject.js.map +2 -2
- package/dist/Runtime/Extensions/AdMob/admobtools.js +1 -1
- package/dist/Runtime/Extensions/AdMob/admobtools.js.map +2 -2
- package/dist/Runtime/Extensions/AdvancedWindow/electron-advancedwindowtools.js +1 -1
- package/dist/Runtime/Extensions/AdvancedWindow/electron-advancedwindowtools.js.map +2 -2
- package/dist/Runtime/Extensions/AnchorBehavior/anchorruntimebehavior.js +1 -1
- package/dist/Runtime/Extensions/AnchorBehavior/anchorruntimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/BBText/JsExtension.js +45 -42
- package/dist/Runtime/Extensions/BBText/bbtextruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/BBText/bbtextruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/BitmapText/JsExtension.js +40 -49
- package/dist/Runtime/Extensions/BitmapText/bitmaptextruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/BitmapText/bitmaptextruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/JsExtension.js +2 -2
- package/dist/Runtime/Extensions/Effects/bevel-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/bevel-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/color-replace-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/color-replace-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/drop-shadow-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/drop-shadow-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/glow-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/glow-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/outline-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/outline-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/ExampleJsExtension/JsExtension.js +18 -21
- package/dist/Runtime/Extensions/Firebase/B_firebasetools/C_firebasetools.js +1 -1
- package/dist/Runtime/Extensions/Firebase/B_firebasetools/C_firebasetools.js.map +2 -2
- package/dist/Runtime/Extensions/JsExtensionTypes.d.ts +8 -2
- package/dist/Runtime/Extensions/Leaderboards/leaderboardstools.js +1 -1
- package/dist/Runtime/Extensions/Leaderboards/leaderboardstools.js.map +2 -2
- package/dist/Runtime/Extensions/Lighting/JsExtension.js +50 -38
- package/dist/Runtime/Extensions/Lighting/lightruntimeobject-pixi-renderer.js +1 -1
- package/dist/Runtime/Extensions/Lighting/lightruntimeobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/Extensions/Multiplayer/JsExtension.js +112 -7
- package/dist/Runtime/Extensions/Multiplayer/messageManager.js +1 -1
- package/dist/Runtime/Extensions/Multiplayer/messageManager.js.map +2 -2
- package/dist/Runtime/Extensions/Multiplayer/multiplayercomponents.js +1 -1
- package/dist/Runtime/Extensions/Multiplayer/multiplayercomponents.js.map +2 -2
- package/dist/Runtime/Extensions/Multiplayer/multiplayerobjectruntimebehavior.js +1 -1
- package/dist/Runtime/Extensions/Multiplayer/multiplayerobjectruntimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/Multiplayer/multiplayertools.js +1 -1
- package/dist/Runtime/Extensions/Multiplayer/multiplayertools.js.map +2 -2
- package/dist/Runtime/Extensions/PanelSpriteObject/panelspriteruntimeobject-pixi-renderer.js +1 -1
- package/dist/Runtime/Extensions/PanelSpriteObject/panelspriteruntimeobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/Extensions/PanelSpriteObject/panelspriteruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/PanelSpriteObject/panelspriteruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/ParticleSystem/particleemitterobject-pixi-renderer.js +1 -1
- package/dist/Runtime/Extensions/ParticleSystem/particleemitterobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/Extensions/ParticleSystem/particleemitterobject.js +1 -1
- package/dist/Runtime/Extensions/ParticleSystem/particleemitterobject.js.map +2 -2
- package/dist/Runtime/Extensions/Physics2Behavior/JsExtension.js +127 -40
- package/dist/Runtime/Extensions/Physics2Behavior/physics2runtimebehavior.js +1 -1
- package/dist/Runtime/Extensions/Physics2Behavior/physics2runtimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/PlayerAuthentication/playerauthenticationtools.js +1 -1
- package/dist/Runtime/Extensions/PlayerAuthentication/playerauthenticationtools.js.map +2 -2
- package/dist/Runtime/Extensions/PrimitiveDrawing/shapepainterruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/PrimitiveDrawing/shapepainterruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/Spine/JsExtension.js +77 -36
- package/dist/Runtime/Extensions/Spine/spineruntimeobject-pixi-renderer.js +1 -1
- package/dist/Runtime/Extensions/Spine/spineruntimeobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/Extensions/Spine/spineruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/Spine/spineruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/TextInput/JsExtension.js +55 -56
- package/dist/Runtime/Extensions/TextInput/textinputruntimeobject-pixi-renderer.js +1 -1
- package/dist/Runtime/Extensions/TextInput/textinputruntimeobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/Extensions/TextInput/textinputruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/TextInput/textinputruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/TextObject/textruntimeobject-pixi-renderer.js +1 -1
- package/dist/Runtime/Extensions/TextObject/textruntimeobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/Extensions/TextObject/textruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/TextObject/textruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/TileMap/JsExtension.js +511 -287
- package/dist/Runtime/Extensions/TileMap/TileMapRuntimeManager.js +1 -1
- package/dist/Runtime/Extensions/TileMap/TileMapRuntimeManager.js.map +2 -2
- package/dist/Runtime/Extensions/TileMap/collision/TransformedTileMap.js +1 -1
- package/dist/Runtime/Extensions/TileMap/collision/TransformedTileMap.js.map +2 -2
- package/dist/Runtime/Extensions/TileMap/helper/TileMapHelper.js +1 -1
- package/dist/Runtime/Extensions/TileMap/helper/TileMapHelper.js.map +1 -1
- package/dist/Runtime/Extensions/TileMap/helper/dts/load/tiled/TiledTileMapLoader.d.ts.map +1 -1
- package/dist/Runtime/Extensions/TileMap/helper/dts/model/TileMapModel.d.ts +12 -1
- package/dist/Runtime/Extensions/TileMap/helper/dts/model/TileMapModel.d.ts.map +1 -1
- package/dist/Runtime/Extensions/TileMap/helper/dts/render/TileMapManager.d.ts.map +1 -1
- package/dist/Runtime/Extensions/TileMap/helper/dts/render/TileMapPixiHelper.d.ts +1 -0
- package/dist/Runtime/Extensions/TileMap/helper/dts/render/TileMapPixiHelper.d.ts.map +1 -1
- package/dist/Runtime/Extensions/TileMap/simpletilemapruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/TileMap/simpletilemapruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/TileMap/tilemapcollisionmaskruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/TileMap/tilemapcollisionmaskruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/TileMap/tilemapruntimeobject-pixi-renderer.js +1 -1
- package/dist/Runtime/Extensions/TileMap/tilemapruntimeobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/Extensions/TileMap/tilemapruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/TileMap/tilemapruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/TiledSpriteObject/tiledspriteruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/TiledSpriteObject/tiledspriteruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/TweenBehavior/JsExtension.js +1 -0
- package/dist/Runtime/Extensions/Video/JsExtension.js +35 -44
- package/dist/Runtime/Extensions/Video/videoruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/Video/videoruntimeobject.js.map +2 -2
- package/dist/Runtime/ResourceLoader.js +1 -1
- package/dist/Runtime/ResourceLoader.js.map +2 -2
- package/dist/Runtime/RuntimeInstanceContainer.js.map +2 -2
- package/dist/Runtime/SpriteAnimator.js +1 -1
- package/dist/Runtime/SpriteAnimator.js.map +2 -2
- package/dist/Runtime/debugger-client/InGameDebugger.js +1 -1
- package/dist/Runtime/debugger-client/InGameDebugger.js.map +2 -2
- package/dist/Runtime/debugger-client/abstract-debugger-client.js +1 -1
- package/dist/Runtime/debugger-client/abstract-debugger-client.js.map +2 -2
- package/dist/Runtime/debugger-client/hot-reloader.js +2 -1
- package/dist/Runtime/debugger-client/hot-reloader.js.map +2 -2
- package/dist/Runtime/debugger-client/minimal-debugger-client.js +2 -0
- package/dist/Runtime/debugger-client/minimal-debugger-client.js.map +7 -0
- package/dist/Runtime/debugger-client/websocket-debugger-client.js.map +2 -2
- package/dist/Runtime/debugger-client/window-message-debugger-client.js.map +2 -2
- package/dist/Runtime/events-tools/inputtools.js +1 -1
- package/dist/Runtime/events-tools/inputtools.js.map +2 -2
- package/dist/Runtime/events-tools/objecttools.js +1 -1
- package/dist/Runtime/events-tools/objecttools.js.map +2 -2
- package/dist/Runtime/gd.js +1 -1
- package/dist/Runtime/gd.js.map +2 -2
- package/dist/Runtime/howler-sound-manager/howler-sound-manager.js +1 -1
- package/dist/Runtime/howler-sound-manager/howler-sound-manager.js.map +2 -2
- package/dist/Runtime/inputmanager.js +1 -1
- package/dist/Runtime/inputmanager.js.map +2 -2
- package/dist/Runtime/pixi-renderers/CustomRuntimeObject2DPixiRenderer.js +1 -1
- package/dist/Runtime/pixi-renderers/CustomRuntimeObject2DPixiRenderer.js.map +2 -2
- package/dist/Runtime/pixi-renderers/pixi-filters-tools.js +1 -1
- package/dist/Runtime/pixi-renderers/pixi-filters-tools.js.map +2 -2
- package/dist/Runtime/pixi-renderers/runtimegame-pixi-renderer.js +1 -1
- package/dist/Runtime/pixi-renderers/runtimegame-pixi-renderer.js.map +2 -2
- package/dist/Runtime/pixi-renderers/spriteruntimeobject-pixi-renderer.js +1 -1
- package/dist/Runtime/pixi-renderers/spriteruntimeobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/runtimegame.js +1 -1
- package/dist/Runtime/runtimegame.js.map +2 -2
- package/dist/Runtime/runtimeobject.js +1 -1
- package/dist/Runtime/runtimeobject.js.map +2 -2
- package/dist/Runtime/runtimescene.js +1 -1
- package/dist/Runtime/runtimescene.js.map +2 -2
- package/dist/Runtime/scenestack.js +1 -1
- package/dist/Runtime/scenestack.js.map +2 -2
- package/dist/Runtime/spriteruntimeobject.js +1 -1
- package/dist/Runtime/spriteruntimeobject.js.map +2 -2
- package/dist/Runtime/types/project-data.d.ts +36 -8
- package/dist/Runtime/variablescontainer.js +1 -1
- package/dist/Runtime/variablescontainer.js.map +2 -2
- package/dist/lib/libGD.cjs +1 -1
- package/dist/lib/libGD.wasm +0 -0
- package/gd.d.ts +149 -75
- package/package.json +3 -3
|
@@ -369,6 +369,36 @@ module.exports = {
|
|
|
369
369
|
'gdjs.multiplayerMessageManager.hasCustomMessageBeenReceived'
|
|
370
370
|
);
|
|
371
371
|
|
|
372
|
+
extension
|
|
373
|
+
.addExpressionAndConditionAndAction(
|
|
374
|
+
'number',
|
|
375
|
+
'ObjectsSynchronizationRate',
|
|
376
|
+
_('Objects synchronization rate'),
|
|
377
|
+
_(
|
|
378
|
+
'objects synchronization rate (between 1 and 60, default is 30 times per second)'
|
|
379
|
+
),
|
|
380
|
+
_('objects synchronization rate'),
|
|
381
|
+
_('Advanced'),
|
|
382
|
+
'JsPlatform/Extensions/multiplayer.svg'
|
|
383
|
+
)
|
|
384
|
+
.useStandardParameters(
|
|
385
|
+
'number',
|
|
386
|
+
gd.ParameterOptions.makeNewOptions().setDescription(_('Sync rate'))
|
|
387
|
+
)
|
|
388
|
+
.setIncludeFile('Extensions/Multiplayer/peer.js')
|
|
389
|
+
.addIncludeFile('Extensions/Multiplayer/peerJsHelper.js')
|
|
390
|
+
.addIncludeFile(
|
|
391
|
+
'Extensions/PlayerAuthentication/playerauthenticationcomponents.js'
|
|
392
|
+
)
|
|
393
|
+
.addIncludeFile(
|
|
394
|
+
'Extensions/PlayerAuthentication/playerauthenticationtools.js'
|
|
395
|
+
)
|
|
396
|
+
.addIncludeFile('Extensions/Multiplayer/messageManager.js')
|
|
397
|
+
.addIncludeFile('Extensions/Multiplayer/multiplayerVariablesManager.js')
|
|
398
|
+
.addIncludeFile('Extensions/Multiplayer/multiplayertools.js')
|
|
399
|
+
.setFunctionName('gdjs.multiplayer.setObjectsSynchronizationRate')
|
|
400
|
+
.setGetter('gdjs.multiplayer.getObjectsSynchronizationRate');
|
|
401
|
+
|
|
372
402
|
extension
|
|
373
403
|
.addCondition(
|
|
374
404
|
'IsPlayerHost',
|
|
@@ -392,13 +422,13 @@ module.exports = {
|
|
|
392
422
|
.addIncludeFile('Extensions/Multiplayer/messageManager.js')
|
|
393
423
|
.addIncludeFile('Extensions/Multiplayer/multiplayerVariablesManager.js')
|
|
394
424
|
.addIncludeFile('Extensions/Multiplayer/multiplayertools.js')
|
|
395
|
-
.setFunctionName('gdjs.multiplayer.
|
|
425
|
+
.setFunctionName('gdjs.multiplayer.isCurrentPlayerHost');
|
|
396
426
|
|
|
397
427
|
extension
|
|
398
428
|
.addCondition(
|
|
399
429
|
'HasAnyPlayerLeft',
|
|
400
430
|
_('Any player has left'),
|
|
401
|
-
_('Check if any player has left the lobby.'),
|
|
431
|
+
_('Check if any player has left the lobby game.'),
|
|
402
432
|
_('Any player has left'),
|
|
403
433
|
_('Lobbies'),
|
|
404
434
|
'JsPlatform/Extensions/multiplayer.svg',
|
|
@@ -423,7 +453,7 @@ module.exports = {
|
|
|
423
453
|
.addCondition(
|
|
424
454
|
'HasPlayerLeft',
|
|
425
455
|
_('Player has left'),
|
|
426
|
-
_('Check if the player has left the lobby.'),
|
|
456
|
+
_('Check if the player has left the lobby game.'),
|
|
427
457
|
_('Player _PARAM0_ has left'),
|
|
428
458
|
_('Lobbies'),
|
|
429
459
|
'JsPlatform/Extensions/multiplayer.svg',
|
|
@@ -448,8 +478,10 @@ module.exports = {
|
|
|
448
478
|
extension
|
|
449
479
|
.addExpression(
|
|
450
480
|
'LastLeftPlayerNumber',
|
|
451
|
-
_('
|
|
452
|
-
_(
|
|
481
|
+
_('Player number that just left'),
|
|
482
|
+
_(
|
|
483
|
+
'Returns the player number of the player that has just left the lobby.'
|
|
484
|
+
),
|
|
453
485
|
_('Lobbies'),
|
|
454
486
|
'JsPlatform/Extensions/multiplayer.svg'
|
|
455
487
|
)
|
|
@@ -524,8 +556,10 @@ module.exports = {
|
|
|
524
556
|
extension
|
|
525
557
|
.addExpression(
|
|
526
558
|
'LastJoinedPlayerNumber',
|
|
527
|
-
_('
|
|
528
|
-
_(
|
|
559
|
+
_('Player number that just joined'),
|
|
560
|
+
_(
|
|
561
|
+
'Returns the player number of the player that has just joined the lobby.'
|
|
562
|
+
),
|
|
529
563
|
_('Lobbies'),
|
|
530
564
|
'JsPlatform/Extensions/multiplayer.svg'
|
|
531
565
|
)
|
|
@@ -546,6 +580,61 @@ module.exports = {
|
|
|
546
580
|
'gdjs.multiplayerMessageManager.getLatestPlayerWhoJustJoined'
|
|
547
581
|
);
|
|
548
582
|
|
|
583
|
+
extension
|
|
584
|
+
.addCondition(
|
|
585
|
+
'IsMigratingHost',
|
|
586
|
+
_('Host is migrating'),
|
|
587
|
+
_(
|
|
588
|
+
'Check if the host is migrating, in order to adapt the game state (like pausing the game).'
|
|
589
|
+
),
|
|
590
|
+
_('Host is migrating'),
|
|
591
|
+
_('Lobbies'),
|
|
592
|
+
'JsPlatform/Extensions/multiplayer.svg',
|
|
593
|
+
'JsPlatform/Extensions/multiplayer.svg'
|
|
594
|
+
)
|
|
595
|
+
.getCodeExtraInformation()
|
|
596
|
+
.setIncludeFile('Extensions/Multiplayer/peer.js')
|
|
597
|
+
.addIncludeFile('Extensions/Multiplayer/peerJsHelper.js')
|
|
598
|
+
.addIncludeFile(
|
|
599
|
+
'Extensions/PlayerAuthentication/playerauthenticationcomponents.js'
|
|
600
|
+
)
|
|
601
|
+
.addIncludeFile(
|
|
602
|
+
'Extensions/PlayerAuthentication/playerauthenticationtools.js'
|
|
603
|
+
)
|
|
604
|
+
.addIncludeFile('Extensions/Multiplayer/multiplayercomponents.js')
|
|
605
|
+
.addIncludeFile('Extensions/Multiplayer/messageManager.js')
|
|
606
|
+
.addIncludeFile('Extensions/Multiplayer/multiplayerVariablesManager.js')
|
|
607
|
+
.addIncludeFile('Extensions/Multiplayer/multiplayertools.js')
|
|
608
|
+
.setFunctionName('gdjs.multiplayer.isMigratingHost');
|
|
609
|
+
|
|
610
|
+
extension
|
|
611
|
+
.addAction(
|
|
612
|
+
'EndLobbyWhenHostLeaves',
|
|
613
|
+
_('Configure lobby game to end when host leaves'),
|
|
614
|
+
_(
|
|
615
|
+
'Configure the lobby game to end when the host leaves. This will trigger the "Lobby game has just ended" condition. (Default behavior is to migrate the host)'
|
|
616
|
+
),
|
|
617
|
+
_('Configure lobby game to end when host leaves'),
|
|
618
|
+
_('Advanced'),
|
|
619
|
+
'JsPlatform/Extensions/multiplayer.svg',
|
|
620
|
+
'JsPlatform/Extensions/multiplayer.svg'
|
|
621
|
+
)
|
|
622
|
+
.addParameter('yesorno', _('End lobby game when host leaves'), '', false)
|
|
623
|
+
.setHelpPath('/all-features/multiplayer')
|
|
624
|
+
.getCodeExtraInformation()
|
|
625
|
+
.setIncludeFile('Extensions/Multiplayer/peer.js')
|
|
626
|
+
.addIncludeFile('Extensions/Multiplayer/peerJsHelper.js')
|
|
627
|
+
.addIncludeFile(
|
|
628
|
+
'Extensions/PlayerAuthentication/playerauthenticationcomponents.js'
|
|
629
|
+
)
|
|
630
|
+
.addIncludeFile(
|
|
631
|
+
'Extensions/PlayerAuthentication/playerauthenticationtools.js'
|
|
632
|
+
)
|
|
633
|
+
.addIncludeFile('Extensions/Multiplayer/messageManager.js')
|
|
634
|
+
.addIncludeFile('Extensions/Multiplayer/multiplayerVariablesManager.js')
|
|
635
|
+
.addIncludeFile('Extensions/Multiplayer/multiplayertools.js')
|
|
636
|
+
.setFunctionName('gdjs.multiplayer.endLobbyWhenHostLeaves');
|
|
637
|
+
|
|
549
638
|
extension
|
|
550
639
|
.addStrExpression(
|
|
551
640
|
'MessageData',
|
|
@@ -793,6 +882,11 @@ module.exports = {
|
|
|
793
882
|
)
|
|
794
883
|
.addCodeOnlyParameter('currentScene', '')
|
|
795
884
|
.addParameter('variable', _('Variable'), '', false)
|
|
885
|
+
.setParameterLongDescription(
|
|
886
|
+
_(
|
|
887
|
+
'Only root variables can change ownership. Arrays and structures children are synchronized with their parent.'
|
|
888
|
+
)
|
|
889
|
+
)
|
|
796
890
|
.useStandardParameters(
|
|
797
891
|
'number',
|
|
798
892
|
gd.ParameterOptions.makeNewOptions().setDescription(_('Player number'))
|
|
@@ -827,6 +921,11 @@ module.exports = {
|
|
|
827
921
|
)
|
|
828
922
|
.addCodeOnlyParameter('currentScene', '')
|
|
829
923
|
.addParameter('variable', _('Variable'), '', false)
|
|
924
|
+
.setParameterLongDescription(
|
|
925
|
+
_(
|
|
926
|
+
'Only root variables can change ownership. Arrays and structures children are synchronized with their parent.'
|
|
927
|
+
)
|
|
928
|
+
)
|
|
830
929
|
.setHelpPath('/all-features/multiplayer')
|
|
831
930
|
.getCodeExtraInformation()
|
|
832
931
|
.setIncludeFile('Extensions/Multiplayer/peer.js')
|
|
@@ -858,6 +957,11 @@ module.exports = {
|
|
|
858
957
|
)
|
|
859
958
|
.addCodeOnlyParameter('currentScene', '')
|
|
860
959
|
.addParameter('variable', _('Variable'), '', false)
|
|
960
|
+
.setParameterLongDescription(
|
|
961
|
+
_(
|
|
962
|
+
'Only root variables can change ownership. Arrays and structures children are synchronized with their parent.'
|
|
963
|
+
)
|
|
964
|
+
)
|
|
861
965
|
.setHelpPath('/all-features/multiplayer')
|
|
862
966
|
.getCodeExtraInformation()
|
|
863
967
|
.setIncludeFile('Extensions/Multiplayer/peer.js')
|
|
@@ -997,6 +1101,7 @@ module.exports = {
|
|
|
997
1101
|
multiplayerObjectBehavior,
|
|
998
1102
|
sharedData
|
|
999
1103
|
)
|
|
1104
|
+
.setQuickCustomizationVisibility(gd.QuickCustomization.Hidden)
|
|
1000
1105
|
.setIncludeFile('Extensions/Multiplayer/peer.js')
|
|
1001
1106
|
.addIncludeFile('Extensions/Multiplayer/peerJsHelper.js')
|
|
1002
1107
|
.addIncludeFile(
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var gdjs;(function(a){const D=new a.Logger("Multiplayer"),g=new a.Logger("Multiplayer - Debug");a.Logger.getDefaultConsoleLoggerOutput().discardGroup("Multiplayer - Debug");class Ae{constructor(k){this.clear=()=>{this.cache.clear(),this.keys=[]};this.maxSize=k,this.cache=new Set,this.keys=[]}has(k){return this.cache.has(k)}add(k){if(this.cache.size>=this.maxSize){const S=this.keys.shift();S&&this.cache.delete(S)}this.cache.add(k),this.keys.push(k)}}class ue{constructor(){this._updates=[]}store(k){this._updates.push(k),this._updates.length>10&&this._updates.shift()}getUpdates(){return this._updates}remove(k){const S=this._updates.indexOf(k);S!==-1&&this._updates.splice(S,1)}clear(){this._updates=[]}}const Ce=({target:A,source:k})=>{for(const S in k)k.hasOwnProperty(S)&&!A.hasOwnProperty(S)&&(A[S]=k[S]);for(const S in A)A.hasOwnProperty(S)&&!k.hasOwnProperty(S)&&delete A[S]};a.makeMultiplayerMessageManager=()=>{const A=0,k=0,S=0,Te=0,v=window.performance&&typeof window.performance.now=="function"?window.performance.now.bind(window.performance):Date.now,_e=200,Je=4,U=new Ae(500);let N={},_={};const He=1;let de=0,Q=null,W=0,V=new ue;const xe=1;let me=0,J=null,F=0,B=new ue;const Le=1;let E=0,K={},pe={},O={},C=[],$=[],Y={};const L=({originalMessageName:e,originalData:t,expectedMessageName:n,otherPeerIds:r,shouldCancelMessageIfTimesOut:s,maxNumberOfRetries:o,messageRetryTime:i})=>{!a.multiplayer.isLobbyGameRunning()||(N[n]||(N[n]={}),g.info(`Adding expected message ${n} from ${r.join(", ")}.`),r.forEach(c=>{N[n][c]={acknowledged:!1,lastMessageSentAt:v(),originalMessageName:e,originalData:t,shouldCancelMessageIfTimesOut:s,numberOfRetries:0,maxNumberOfRetries:o||Je,messageRetryTime:i||_e}}))},fe=({sceneNetworkId:e,instanceNetworkId:t})=>(_[e]||(_[e]={}),_[e][t]||0),ye=({sceneNetworkId:e,instanceNetworkId:t,clock:n})=>{_[e]||(_[e]={}),_[e][t]=n},P=(e,t,n)=>{if(!(k>0&&Math.random()<k)){if(S>0&&Math.random()<S){setTimeout(()=>{a.multiplayerPeerJsHelper.sendDataTo(e,t,n)},Te);return}if(A>0){setTimeout(()=>{a.multiplayerPeerJsHelper.sendDataTo(e,t,n)},A);return}a.multiplayerPeerJsHelper.sendDataTo(e,t,n)}},Ge=(e,t,n)=>{if(!e.length)return null;let r=null,s=1/0;for(let o=0;o<e.length;++o){if(e[o].networkId)continue;const i=e[o],c=Math.pow(i.getX()-t,2)+Math.pow(i.getY()-n,2);c<s&&(r=i,s=c)}return r},Z=({runtimeScene:e,objectName:t,instanceNetworkId:n,instanceX:r,instanceY:s,shouldCreateIfNotFound:o})=>{const i=e.getInstancesOf(t);if(!i)return null;let c=i.find(l=>l.networkId===n)||null;if(!c&&r!==void 0&&s!==void 0){g.info(`instance ${t} ${n} not found with network ID, trying to find it with position ${r}/${s}.`);const l=Ge(i,r,s);l&&(g.info(`Found closest instance for object ${t} ${n} with no network ID.`),c=l,c.networkId=n)}if(!c&&o){g.info(`Instance ${n} still not found, Creating instance ${t}.`);const l=e.createObject(t);if(!l)return null;l.networkId=n,c=l}return c},q="#changeInstanceOwner",he=/#changeInstanceOwner#owner_(\d+)#object_(.+)#instance_(.+)/,Ee=({objectOwner:e,objectName:t,instanceNetworkId:n,newObjectOwner:r,instanceX:s,instanceY:o,sceneNetworkId:i})=>({messageName:`${q}#owner_${e}#object_${t}#instance_${n}`,messageData:{previousOwner:e,newOwner:r,instanceX:s,instanceY:o,sceneNetworkId:i}}),ee="#instanceOwnerChanged",Ue=/#instanceOwnerChanged#owner_(\d+)#object_(.+)#instance_(.+)/,be=e=>e.replace(q,ee),We=e=>{if(!a.multiplayer.isReadyToSendOrReceiveGameUpdateMessages())return;const t=a.multiplayerPeerJsHelper.getAllMessagesMap();Array.from(t.keys()).filter(s=>s.startsWith(q)).forEach(s=>{const o=t.get(s);if(!o)return;const i=o.getMessages();!i.length||i.forEach(c=>{const l=c.getData(),d=c.getSender(),p=he.exec(s);if(!p)return;const f=p[2],u=p[3],m=l.previousOwner,y=l.newOwner,M=l.sceneNetworkId;if(M!==e.networkId){g.info(`Object ${f} is in scene ${M}, but we are on ${e.networkId}. Skipping.`);return}const w=Z({runtimeScene:e,objectName:f,instanceNetworkId:u,instanceX:l.instanceX,instanceY:l.instanceY});if(!w){g.info(`Instance ${u} not found, it must have been destroyed.`);return}const h=w.getBehavior("MultiplayerObject");if(!h){g.info(`Object ${f} does not have the MultiplayerObjectBehavior, cannot change ownership.`);return}const b=h.getPlayerObjectOwnership(),I=b===m||b===y;if(a.multiplayer.isPlayerHost()&&!I){g.info(`Object ${f} with instance network ID ${u} does not have the expected owner. Wanted to change from ${m} to ${y}, but object has owner ${b}.`);return}g.info(`Changing ownership of object ${f} to ${y}.`),h.playerNumber=y;const H=be(s);if(g.info(`Sending acknowledgment of ownership change of object ${f} from ${m} to ${y} with instance network ID ${u} to ${d}.`),P([d],H,{}),a.multiplayer.isPlayerHost()){const j=a.multiplayerPeerJsHelper.getAllPeers().filter(R=>R!==d);if(!j.length)return;L({originalMessageName:s,originalData:l,expectedMessageName:H,otherPeerIds:j,shouldCancelMessageIfTimesOut:!1}),g.info(`Relaying ownership change of object ${f} with instance network ID ${u} to ${j.join(", ")}.`),P(j,s,l)}})})},Me="#updateInstance",Ve=/#updateInstance#owner_(\d+)#object_(.+)#instance_(.+)#scene_(.+)/,Fe=({objectOwner:e,objectName:t,instanceNetworkId:n,objectNetworkSyncData:r,sceneNetworkId:s})=>({messageName:`${Me}#owner_${e}#object_${t}#instance_${n}#scene_${s}`,messageData:r}),Be=e=>{if(!a.multiplayer.isReadyToSendOrReceiveGameUpdateMessages())return;const t=a.multiplayerPeerJsHelper.getAllMessagesMap();Array.from(t.keys()).filter(s=>s.startsWith(Me)).forEach(s=>{const o=t.get(s);if(!o)return;const i=o.getMessages();if(!i.length)return;i.slice().reverse().forEach(l=>{const d=l.getData(),p=l.getSender(),f=Ve.exec(s);if(!f)return;const u=parseInt(f[1],10);if(u===a.multiplayer.playerNumber)return;const m=f[2],y=f[3],M=f[4];if(M!==e.networkId){g.info(`Object ${m} is in scene ${M}, but we are on ${e.networkId}. Skipping.`);return}const w=d._clock,h=fe({sceneNetworkId:M,instanceNetworkId:y});if(w<=h)return;const b=Z({runtimeScene:e,objectName:m,instanceNetworkId:y,shouldCreateIfNotFound:!0,instanceX:d.x,instanceY:d.y});if(!b){D.error("Instance could not be found or created.");return}const I=b.getBehavior("MultiplayerObject");if(!I){D.error(`Object ${m} does not have the MultiplayerObjectBehavior, cannot update it.`);return}if(I.getPlayerObjectOwnership()===a.multiplayer.playerNumber){g.info(`Object ${m} with instance network ID ${y} is owned by us ${a.multiplayer.playerNumber}, ignoring update message from ${u}.`);return}if(I.getPlayerObjectOwnership()!==u&&(g.info(`Object ${m} with instance network ID ${y} is owned by ${I.getPlayerObjectOwnership()} on our game, changing ownership to ${u} as part of the update event.`),I.playerNumber=u),b.updateFromNetworkSyncData(d),ye({sceneNetworkId:M,instanceNetworkId:y,clock:w}),I._clock=w,a.multiplayer.isPlayerHost()){const T=a.multiplayerPeerJsHelper.getAllPeers().filter(j=>j!==p);if(!T.length)return;P(T,s,d)}})})},X="#changeVariableOwner",we=/#changeVariableOwner#owner_(\d+)#variable_(.+)/,Ke=({variableOwner:e,variableNetworkId:t,newVariableOwner:n})=>({messageName:`${X}#owner_${e}#variable_${t}`,messageData:{previousOwner:e,newOwner:n}}),te="#variableOwnerChanged",Ye=/#variableOwnerChanged#owner_(\d+)#variable_(.+)/,Ie=e=>e.replace(X,te),qe=e=>{if(!a.multiplayer.isReadyToSendOrReceiveGameUpdateMessages())return;const t=a.multiplayerPeerJsHelper.getAllMessagesMap();Array.from(t.keys()).filter(s=>s.startsWith(X)).forEach(s=>{const o=t.get(s);if(!o)return;const i=o.getMessages();!i.length||i.forEach(c=>{const l=c.getData(),d=c.getSender(),p=we.exec(s);if(!p)return;const f=p[2],u=l.previousOwner,m=l.newOwner,{type:y,name:M,containerId:w}=a.multiplayerVariablesManager.getVariableTypeAndNameFromNetworkId(f);if(y==="scene"&&w!==e.networkId){g.info(`Variable ${M} is in scene ${w}, but we are on ${e.networkId}. Skipping.`);return}const h=w==="game"?e.getGame().getVariables():e.getVariables();if(!h.has(M)){D.error(`Variable with ID ${f} not found whilst syncing. This should not happen.`);return}const b=h.get(M),I=b.getPlayerOwnership(),H=I===u||I===m;if(a.multiplayer.isPlayerHost()&&!H){g.info(`Variable with ID ${f} does not have the expected owner. Wanted to change from ${u} to ${m}, but variable has owner ${I}.`);return}g.info(`Changing ownership of variable ${M} to ${m}.`),b.setPlayerOwnership(m);const T=Ie(s);if(g.info(`Sending acknowledgment of ownership change of variable with ID ${f} from ${u} to ${m} to ${d}.`),P([d],T,{}),a.multiplayer.isPlayerHost()){const R=a.multiplayerPeerJsHelper.getAllPeers().filter(G=>G!==d);if(!R.length)return;L({originalMessageName:s,originalData:l,expectedMessageName:T,otherPeerIds:R,shouldCancelMessageIfTimesOut:!1});for(const G of R)g.info(`Relaying ownership change of variable with Id ${f} to ${G}.`),P(R,s,l)}})})},Xe=e=>e.startsWith(ne)?st:e.startsWith(ee)?Ue:e.startsWith(te)?Ye:e.startsWith(re)?ot:null,ze=e=>e.startsWith(ne)||e.startsWith(ee)||e.startsWith(te)||e.startsWith(re),Qe=()=>{if(!a.multiplayer.isReadyToSendOrReceiveGameUpdateMessages())return;const e=a.multiplayerPeerJsHelper.getAllMessagesMap();Array.from(e.keys()).filter(ze).forEach(r=>{const s=e.get(r);if(!s)return;const o=s.getMessages();!o.length||o.forEach(i=>{const c=i.getData(),l=i.getSender();g.info(`Received acknowledgment for message ${r}.`);const d=Xe(r);if(!d){D.error(`Invalid acknowledgment message ${r}.`);return}const p=d.exec(r);if(!p){D.error(`Invalid acknowledgment message ${r}.`);return}if(!N[r]||!N[r][l])return;const f=c._clock;if(f!==void 0){const u=p[3],m=p[4],y=fe({sceneNetworkId:m,instanceNetworkId:u});if(f<=y)return;ye({sceneNetworkId:m,instanceNetworkId:u,clock:f})}g.info(`Marking message ${r} as acknowledged from ${l}.`),N[r][l].acknowledged=!0})})},Ze=e=>{if(!a.multiplayer.isReadyToSendOrReceiveGameUpdateMessages())return;Object.keys(N).forEach(n=>{const r=N[n],s=Object.keys(r).filter(o=>!r[o].acknowledged);if(!s.length)g.info(`All peers have acknowledged message ${n}.`),delete N[n];else for(const o of s){const{lastMessageSentAt:i,originalMessageName:c,originalData:l,numberOfRetries:d,maxNumberOfRetries:p,messageRetryTime:f}=r[o];if(v()-i>f){if(d>=p){if(g.info(`Giving up on message ${n} for ${o}.`),r[o].shouldCancelMessageIfTimesOut){if(c.startsWith(q)){const u=he.exec(c);if(!u){delete N[n];return}const m=u[2],y=u[3],M=e.getInstancesOf(m);if(!M){delete N[n];return}let w=M.find(I=>I.networkId===y);if(!w){delete N[n];return}const h=w.getBehavior("MultiplayerObject");if(!h){D.error(`Object ${m} does not have the MultiplayerObjectBehavior, cannot revert ownership.`),delete N[n];return}const b=l.previousOwner;if(b===void 0){delete N[n];return}h.playerNumber=b||0}if(c.startsWith(X)){const u=we.exec(c);if(!u){delete N[n];return}const m=u[2],y=l.previousOwner,{type:M,name:w,containerId:h}=a.multiplayerVariablesManager.getVariableTypeAndNameFromNetworkId(m);if(M==="scene"&&h!==e.networkId){g.info(`Variable ${w} is in scene ${h}, but we are on ${e.networkId}. Skipping ownership revert.`),delete N[n];return}const b=h==="game"?e.getGame().getVariables():e.getVariables();if(!b.has(w)){D.error(`Variable with ID ${m} not found while reverting ownership. This should not happen.`),delete N[n];return}const I=b.get(w);if(y===void 0){delete N[n];return}I.setPlayerOwnership(y||0)}}delete N[n];continue}P([o],c,l),r[o].lastMessageSentAt=v(),r[o].numberOfRetries=d+1}}})},se="#destroyInstance",et=/#destroyInstance#owner_(\d+)#object_(.+)#instance_(.+)#scene_(.+)/,tt=({objectOwner:e,objectName:t,instanceNetworkId:n,sceneNetworkId:r})=>({messageName:`${se}#owner_${e}#object_${t}#instance_${n}#scene_${r}`,messageData:{}}),ne="#instanceDestroyed",st=/#instanceDestroyed#owner_(\d+)#object_(.+)#instance_(.+)/,Oe=e=>e.replace(se,ne),nt=e=>{if(!a.multiplayer.isReadyToSendOrReceiveGameUpdateMessages())return;const t=a.multiplayerPeerJsHelper.getAllMessagesMap();Array.from(t.keys()).filter(s=>s.startsWith(se)).forEach(s=>{const o=t.get(s);if(!o)return;const i=o.getMessages();!i.length||i.forEach(c=>{const l=c.getData(),d=c.getSender();g.info(`Received message ${s} with data ${JSON.stringify(l)}.`);const p=et.exec(s);if(!p||parseInt(p[1],10)===a.multiplayer.playerNumber)return;const u=p[2],m=p[3],y=p[4];if(y!==e.networkId){g.info(`Object ${u} is in scene ${y}, but we are on ${e.networkId}. Skipping.`);return}const M=Z({runtimeScene:e,objectName:u,instanceNetworkId:m}),w=Oe(s);if(!M){g.info("Instance was not found in the scene, sending acknowledgment anyway."),P([d],w,{});return}if(g.info(`Destroying object ${u} with instance network ID ${m}.`),M.deleteFromScene(e),g.info(`Sending acknowledgment of destruction of object ${u} with instance network ID ${m} to ${d}.`),P([d],w,{}),a.multiplayer.isPlayerHost()){const b=a.multiplayerPeerJsHelper.getAllPeers().filter(I=>I!==d);if(!b.length)return;L({originalMessageName:s,originalData:l,expectedMessageName:w,otherPeerIds:b,shouldCancelMessageIfTimesOut:!1}),P(b,s,l)}})})},ae="#customMessage",at=/#customMessage#(.+)/,z=e=>`${ae}#${e}`,rt=({userMessageName:e,userMessageData:t,senderPlayerNumber:n})=>{const r=a.makeUuid();return{messageName:z(e),messageData:{data:t,uniqueId:r,senderPlayerNumber:n}}},re="#ackCustomMessage",ot=/#ackCustomMessage#(.+)/,Pe=e=>e.replace(ae,re),Ne=(e,t)=>{const n=a.multiplayerPeerJsHelper.getAllPeers(),r=a.multiplayer.getCurrentPlayerNumber(),{messageName:s,messageData:o}=rt({userMessageName:e,userMessageData:t,senderPlayerNumber:r}),i=Pe(s);L({originalMessageName:s,originalData:o,expectedMessageName:i,otherPeerIds:n,shouldCancelMessageIfTimesOut:!1}),g.info(`Sending custom message ${e} with data ${JSON.stringify(t)}.`),P(n,s,o),a.multiplayer.isPlayerHost()&&a.multiplayerPeerJsHelper.getOrCreateMessagesList(s).pushMessage(o,a.multiplayerPeerJsHelper.getCurrentId())},it=(e,t)=>{const n=t.toJSObject();g.info(`Sending custom message ${e} with data ${JSON.stringify(n)}.`),Ne(e,n)},ct=e=>{const t=z(e),r=a.multiplayerPeerJsHelper.getAllMessagesMap().get(t);if(!r)return;const s=r.getMessages();if(!s.length)return;g.info(`custom message ${e} has been received.`);let o=!1;return s.forEach(i=>{const l=i.getData().uniqueId,d=`${t}#${l}`;U.has(d)||(U.add(d),o=!0)}),o},ke=e=>{const t=z(e),r=a.multiplayerPeerJsHelper.getAllMessagesMap().get(t);if(!r)return;const s=r.getMessages();return s.length?s[s.length-1].getData().data:void 0},lt=(e,t)=>{const n=ke(e);!n||(g.info(`Received custom message ${e} with data ${JSON.stringify(n)}.`),t.fromJSObject(n))},gt=e=>{const t=z(e),r=a.multiplayerPeerJsHelper.getAllMessagesMap().get(t);if(!r)return 0;const s=r.getMessages();return s.length?s[s.length-1].getData().senderPlayerNumber:0},ut=()=>{if(!a.multiplayer.isReadyToSendOrReceiveGameUpdateMessages())return;const e=a.multiplayerPeerJsHelper.getAllMessagesMap();Array.from(e.keys()).filter(r=>r.startsWith(ae)).forEach(r=>{const s=e.get(r);if(!s){D.error(`No messages list found for ${r}.`);return}const o=s.getMessages();!o.length||o.forEach(i=>{const c=i.getData(),l=i.getSender(),d=c.uniqueId;if(g.info(`Received custom message ${r} with data ${JSON.stringify(c)}.`),!at.exec(r)){D.error(`Invalid custom message ${r}.`);return}const f=`${r}#${d}`;if(U.has(f)){g.info(`Message ${r} has already been processed, skipping.`);return}const u=Pe(r);if(g.info(`Sending acknowledgment of custom message ${r} to ${l}.`),P([l],u,{}),a.multiplayer.isPlayerHost()){const m=a.multiplayerPeerJsHelper.getAllPeers();if(!m.length)return;L({originalMessageName:r,originalData:c,expectedMessageName:u,otherPeerIds:m,shouldCancelMessageIfTimesOut:!1}),P(m,r,c)}})})},Se="#updateScene",De=({sceneNetworkSyncData:e})=>({messageName:`${Se}`,messageData:e}),dt=e=>e.var?Q?JSON.stringify(e.var)!==JSON.stringify(Q.var):!0:!1,mt=()=>v()-de<1e3/He,pt=e=>{if(!a.multiplayer.isReadyToSendOrReceiveGameUpdateMessages())return;const t=e.getNetworkSyncData({playerNumber:a.multiplayer.getCurrentPlayerNumber()});if(!t)return;const n=dt(t),r=!mt()||n||W>0;if(n&&(W=3),!r)return;const s=a.multiplayerPeerJsHelper.getAllPeers(),{messageName:o,messageData:i}=De({sceneNetworkSyncData:t});P(s,o,i),de=v(),Q=t,W=Math.max(W-1,0)},ft=e=>{const t=a.multiplayerPeerJsHelper.getAllMessagesMap();Array.from(t.keys()).filter(s=>s.startsWith(Se)).forEach(s=>{const o=t.get(s);if(!o)return;const i=o.getMessages();!i.length||i.forEach(c=>{const l=c.getData(),d=c.getSender(),p=l.id;if(a.multiplayer.isReadyToSendOrReceiveGameUpdateMessages()){if(p!==e.networkId){g.info(`Received update of scene ${p}, but we are on ${e.networkId}. Skipping.`);return}e.updateFromNetworkSyncData(l)}else{g.info(`Saving scene ${p} update message for later use.`),V.store(l);return}if(a.multiplayer.isPlayerHost()){const u=a.multiplayerPeerJsHelper.getAllPeers().filter(m=>m!==d);P(u,s,l)}})})},ve="#updateGame",$e=({gameNetworkSyncData:e})=>({messageName:`${ve}`,messageData:e}),yt=e=>{const t=e.var,n=e.ss;if(!t&&!n)return!1;if(!J||!J.var||!J.ss||t&&JSON.stringify(t)!==JSON.stringify(J.var))return!0;if(n){if(n.length!==J.ss.length)return!0;for(let r=0;r<n.length;++r){const s=n[r],o=J.ss[r];if(s.name!==o.name||s.networkId!==o.networkId)return!0}}return!1},ht=()=>v()-me<1e3/xe,bt=e=>{if(!a.multiplayer.isReadyToSendOrReceiveGameUpdateMessages())return;const t=e.getGame().getNetworkSyncData({playerNumber:a.multiplayer.getCurrentPlayerNumber()});if(!t)return;const n=yt(t),r=!ht()||n||F>0;if(n&&(F=3),!r)return;const s=a.multiplayerPeerJsHelper.getAllPeers(),{messageName:o,messageData:i}=$e({gameNetworkSyncData:t});P(s,o,i),me=v(),J=t,F=Math.max(F-1,0)},Mt=e=>{const t=a.multiplayerPeerJsHelper.getAllMessagesMap();Array.from(t.keys()).filter(s=>s.startsWith(ve)).forEach(s=>{const o=t.get(s);if(!o)return;const i=o.getMessages();!i.length||i.forEach(c=>{const l=c.getData(),d=c.getSender();if(a.multiplayer.isReadyToSendOrReceiveGameUpdateMessages())e.getGame().updateFromNetworkSyncData(l);else{g.info("Saving game update message for later use."),B.store(l);return}if(a.multiplayer.isPlayerHost()){const f=a.multiplayerPeerJsHelper.getAllPeers().filter(u=>u!==d);P(f,s,l)}})})},wt=e=>{B.getUpdates().forEach(t=>{g.info("Reapplying saved update of game."),e.getGame().updateFromNetworkSyncData(t)}),B.clear(),V.getUpdates().forEach(t=>{const n=t.id;if(n!==e.networkId){g.info(`Trying to apply saved update of scene ${n}, but we are on ${e.networkId}. Skipping.`);return}g.info(`Reapplying saved update of scene ${n}.`),e.updateFromNetworkSyncData(t),V.remove(t)})},oe="#heartbeat",It=/#heartbeat#(.+)/,ie=()=>{O[1]={ping:0,playerId:a.playerAuthentication.getUserId(),username:a.playerAuthentication.getUsername()};for(const e in O)O[e]={...O[e],ping:ce(parseInt(e,10))};return{messageName:`${oe}#${a.multiplayer.getCurrentPlayerNumber()}`,messageData:{now:v(),playersInfo:O}}},Ot=({heartbeatSentAt:e})=>({messageName:`${oe}#${a.multiplayer.getCurrentPlayerNumber()}`,messageData:{sentAt:e,playerId:a.playerAuthentication.getUserId(),username:a.playerAuthentication.getUsername()}}),Pt=()=>!!E&&v()-E<1e3/Le,Nt=()=>{if(!a.multiplayer.isPlayerHost()||!!Pt())return;const t=a.multiplayerPeerJsHelper.getAllPeers(),{messageName:n,messageData:r}=ie();P(t,n,r),E=v()},kt=()=>{const e=a.multiplayerPeerJsHelper.getAllMessagesMap();Array.from(e.keys()).filter(r=>r.startsWith(oe)).forEach(r=>{const s=e.get(r);if(!s)return;const o=s.getMessages();!o.length||o.forEach(i=>{const c=i.getData(),l=i.getSender(),d=It.exec(r);if(!d)return;const p=parseInt(d[1],10);if(pe[l]=p,!a.multiplayer.isPlayerHost()){const h=a.multiplayer.getCurrentPlayerNumber(),b=Object.keys(O).map(R=>parseInt(R,10)),I=Object.keys(c.playersInfo).map(R=>parseInt(R,10)),H=O[h]&&O[h].ping;if(b.length){const R=I.filter(x=>!b.includes(x)&&x!==h);$.push(...R);const G=b.filter(x=>!I.includes(x));C.push(...G);for(const x of G)Y[x]=le(x)}Ce({source:c.playersInfo,target:O});const{messageName:T,messageData:j}=Ot({heartbeatSentAt:c.now});P([l],T,j),O[h]!==void 0&&O[h].ping!==void 0&&(a.multiplayer.markConnectionAsConnected(),H===void 0&&$.push(h));return}O[p]||$.push(p);const f=v(),u=c.sentAt,m=Math.round(f-u),y=K[p]||[];y.push(m),y.length>5&&y.shift(),K[p]=y;let M=0;for(const h of y)M+=h;const w=Math.round(M/y.length/2);if(O[p]={ping:w,playerId:c.playerId,username:c.username},$.length){const h=a.multiplayerPeerJsHelper.getAllPeers(),{messageName:b,messageData:I}=ie();P(h,b,I),E=v()}})})},ce=e=>{const t=O[e];return t&&t.ping||0},St=()=>{const e=a.multiplayer.getCurrentPlayerNumber();return ce(e)},Dt=e=>{if(D.info(`Marking player ${e} as disconnected.`),C.push(e),Y[e]=le(e),e===1){D.info("Host has disconnected, ending the game."),ge(),a.multiplayer.handleLobbyGameEnded();return}if(Bt(e),a.multiplayer.isPlayerHost()){const t=a.multiplayerPeerJsHelper.getAllPeers(),{messageName:n,messageData:r}=ie();P(t,n,r),E=v()}},le=e=>(O[e]||{}).username||Y[e]||`Player ${e}`,vt=e=>(O[e]||{}).playerId||"",$t=e=>{if(!a.multiplayer.isLobbyGameRunning())return;const t=[],n=a.multiplayerPeerJsHelper.getJustDisconnectedPeers();if(n.length)for(const r of n){const s=pe[r];if(!s)return;D.info(`Player ${s} has disconnected.`),t.push(s)}for(const r of t){if(a.multiplayer.isPlayerHost()){const s=e.getAdhocListOfAllInstances();for(const o of s){const i=o.getBehavior("MultiplayerObject");if(i&&i.getPlayerObjectOwnership()===r){const c=i.getActionOnPlayerDisconnect();c==="DestroyObject"?o.deleteFromScene(e):c==="GiveOwnershipToHost"&&i.removeObjectOwnership()}}}Dt(r)}},Rt=()=>C.length>0,At=e=>C.includes(e),Ct=()=>C,jt=()=>C[0]||0,Tt=()=>{const e=C[0];e!==void 0&&(C=C.slice(1),delete Y[e])},_t=()=>$.length>0,Jt=e=>$.includes(e),Ht=()=>$,xt=()=>$[0]||0,Lt=()=>{$[0]!==void 0&&($=$.slice(1))},Gt=()=>Object.keys(O).map(e=>({playerNumber:parseInt(e,10),playerId:O[e].playerId})),Et=()=>Object.keys(O).length,Ut=e=>O[e]!==void 0,Re="#endGame",Wt=()=>({messageName:Re,messageData:{}}),Vt=()=>{if(!a.multiplayer.isPlayerHost())return;g.info("Sending endgame message.");const e=a.multiplayerPeerJsHelper.getAllPeers(),{messageName:t,messageData:n}=Wt();P(e,t,n)},Ft=()=>{if(a.multiplayer.isPlayerHost())return;const t=a.multiplayerPeerJsHelper.getAllMessagesMap().get(Re);!t||!t.getMessages().length||(D.info("Received endgame message."),ge(),a.multiplayer.handleLobbyGameEnded())},ge=()=>{K={},O={},B.clear(),V.clear(),U.clear(),C=[],$=[],N={},_={}},Bt=e=>{delete K[e],delete O[e]};return{sendDataTo:P,addExpectedMessageAcknowledgement:L,handleAcknowledgeMessagesReceived:Qe,resendClearOrCancelAcknowledgedMessages:Ze,createChangeInstanceOwnerMessage:Ee,createInstanceOwnerChangedMessageNameFromChangeInstanceOwnerMessage:be,handleChangeInstanceOwnerMessagesReceived:We,createUpdateInstanceMessage:Fe,handleUpdateInstanceMessagesReceived:Be,createDestroyInstanceMessage:tt,createInstanceDestroyedMessageNameFromDestroyInstanceMessage:Oe,handleDestroyInstanceMessagesReceived:nt,createChangeVariableOwnerMessage:Ke,createVariableOwnerChangedMessageNameFromChangeVariableOwnerMessage:Ie,handleChangeVariableOwnerMessagesReceived:qe,sendCustomMessage:Ne,getCustomMessageData:ke,sendVariableCustomMessage:it,getVariableCustomMessageData:lt,hasCustomMessageBeenReceived:ct,handleCustomMessagesReceived:ut,getCustomMessageSender:gt,createUpdateSceneMessage:De,handleUpdateSceneMessagesToSend:pt,handleUpdateSceneMessagesReceived:ft,createUpdateGameMessage:$e,handleUpdateGameMessagesToSend:bt,handleUpdateGameMessagesReceived:Mt,handleSavedUpdateMessages:wt,handleHeartbeatsToSend:Nt,handleHeartbeatsReceived:kt,getPlayerPing:ce,getCurrentPlayerPing:St,getPlayerUsername:le,getPlayerId:vt,handleJustDisconnectedPeers:$t,getConnectedPlayers:Gt,getNumberOfConnectedPlayers:Et,isPlayerConnected:Ut,hasAnyPlayerJustLeft:Rt,hasPlayerJustLeft:At,getPlayersWhoJustLeft:Ct,getLatestPlayerWhoJustLeft:jt,removePlayerWhoJustLeft:Tt,hasAnyPlayerJustJoined:_t,hasPlayerJustJoined:Jt,getPlayersWhoJustJoined:Ht,getLatestPlayerWhoJustJoined:xt,removePlayerWhoJustJoined:Lt,sendEndGameMessage:Vt,handleEndGameMessages:Ft,clearAllMessagesTempData:ge}},a.multiplayerMessageManager=a.makeMultiplayerMessageManager()})(gdjs||(gdjs={}));
|
|
1
|
+
var gdjs;(function(s){const k=new s.Logger("Multiplayer"),g=new s.Logger("Multiplayer - Debug");s.Logger.getDefaultConsoleLoggerOutput().discardGroup("Multiplayer - Debug");class je{constructor(S){this.clear=()=>{this.cache.clear(),this.keys=[]};this.maxSize=S,this.cache=new Set,this.keys=[]}has(S){return this.cache.has(S)}add(S){if(this.cache.size>=this.maxSize){const D=this.keys.shift();D&&this.cache.delete(D)}this.cache.add(S),this.keys.push(S)}}class ue{constructor(){this._updates=[]}store(S){this._updates.push(S),this._updates.length>10&&this._updates.shift()}getUpdates(){return this._updates}remove(S){const D=this._updates.indexOf(S);D!==-1&&this._updates.splice(D,1)}clear(){this._updates=[]}}const Te=({target:C,source:S})=>{for(const D in S)S.hasOwnProperty(D)&&!C.hasOwnProperty(D)&&(C[D]=S[D]);for(const D in C)C.hasOwnProperty(D)&&!S.hasOwnProperty(D)&&delete C[D]};s.makeMultiplayerMessageManager=()=>{const C=0,S=0,D=0,Je=0,v=window.performance&&typeof window.performance.now=="function"?window.performance.now.bind(window.performance):Date.now,_e=200,Le=4,W=new je(500);let O={},H={};const xe=1;let me=0,Q=null,V=0,F=new ue;const Ge=1;let de=0,J=null,B=0,K=new ue;const Ee=1;let E=0,U={},pe={},M={},A=[],$=[],Y={};const x=({originalMessageName:e,originalData:t,expectedMessageName:n,otherPeerIds:r,shouldCancelMessageIfTimesOut:a,maxNumberOfRetries:o,messageRetryTime:l})=>{!s.multiplayer.isLobbyGameRunning()||(O[n]||(O[n]={}),g.info(`Adding expected message ${n} from ${r.join(", ")}.`),r.forEach(c=>{O[n][c]={acknowledged:!1,lastMessageSentAt:v(),originalMessageName:e,originalData:t,shouldCancelMessageIfTimesOut:a,numberOfRetries:0,maxNumberOfRetries:o||Le,messageRetryTime:l||_e}}))},fe=({sceneNetworkId:e,instanceNetworkId:t})=>(H[e]||(H[e]={}),H[e][t]||0),ye=({sceneNetworkId:e,instanceNetworkId:t,clock:n})=>{H[e]||(H[e]={}),H[e][t]=n},w=(e,t,n)=>{if(!(S>0&&Math.random()<S)){if(D>0&&Math.random()<D){setTimeout(()=>{s.multiplayerPeerJsHelper.sendDataTo(e,t,n)},Je);return}if(C>0){setTimeout(()=>{s.multiplayerPeerJsHelper.sendDataTo(e,t,n)},C);return}s.multiplayerPeerJsHelper.sendDataTo(e,t,n)}},Ue=(e,t,n)=>{if(!e.length)return null;let r=null,a=1/0;for(let o=0;o<e.length;++o){if(e[o].networkId)continue;const l=e[o],c=Math.pow(l.getX()-t,2)+Math.pow(l.getY()-n,2);c<a&&(r=l,a=c)}return r},Z=({runtimeScene:e,objectName:t,instanceNetworkId:n,instanceX:r,instanceY:a,shouldCreateIfNotFound:o})=>{const l=e.getInstancesOf(t);if(!l)return null;let c=l.find(i=>i.networkId===n)||null;if(!c&&r!==void 0&&a!==void 0){g.info(`instance ${t} ${n} not found with network ID, trying to find it with position ${r}/${a}.`);const i=Ue(l,r,a);i&&(g.info(`Found closest instance for object ${t} ${n} with no network ID.`),c=i,c.networkId=n)}if(!c&&o){g.info(`Instance ${n} still not found, Creating instance ${t}.`);const i=e.createObject(t);if(!i)return null;i.networkId=n,c=i}return c},q="#changeInstanceOwner",he=/#changeInstanceOwner#owner_(\d+)#object_(.+)#instance_(.+)/,We=({objectOwner:e,objectName:t,instanceNetworkId:n,newObjectOwner:r,instanceX:a,instanceY:o,sceneNetworkId:l})=>({messageName:`${q}#owner_${e}#object_${t}#instance_${n}`,messageData:{previousOwner:e,newOwner:r,instanceX:a,instanceY:o,sceneNetworkId:l}}),ee="#instanceOwnerChanged",Ve=/#instanceOwnerChanged#owner_(\d+)#object_(.+)#instance_(.+)/,be=e=>e.replace(q,ee),Fe=e=>{if(!s.multiplayer.isReadyToSendOrReceiveGameUpdateMessages())return;const t=s.multiplayerPeerJsHelper.getAllMessagesMap();Array.from(t.keys()).filter(a=>a.startsWith(q)).forEach(a=>{const o=t.get(a);if(!o)return;const l=o.getMessages();!l.length||l.forEach(c=>{const i=c.getData(),m=c.getSender(),p=he.exec(a);if(!p)return;const f=p[2],u=p[3],d=i.previousOwner,y=i.newOwner,I=i.sceneNetworkId;if(I!==e.networkId){g.info(`Object ${f} is in scene ${I}, but we are on ${e.networkId}. Skipping.`);return}const P=Z({runtimeScene:e,objectName:f,instanceNetworkId:u,instanceX:i.instanceX,instanceY:i.instanceY});if(!P){g.info(`Instance ${u} not found, it must have been destroyed.`);return}const h=P.getBehavior("MultiplayerObject");if(!h){g.info(`Object ${f} does not have the MultiplayerObjectBehavior, cannot change ownership.`);return}const b=h.getPlayerObjectOwnership(),N=b===d||b===y;if(s.multiplayer.isCurrentPlayerHost()&&!N){g.info(`Object ${f} with instance network ID ${u} does not have the expected owner. Wanted to change from ${d} to ${y}, but object has owner ${b}.`);return}g.info(`Changing ownership of object ${f} to ${y}.`),h.playerNumber=y;const _=be(a);if(g.info(`Sending acknowledgment of ownership change of object ${f} from ${d} to ${y} with instance network ID ${u} to ${m}.`),w([m],_,{}),s.multiplayer.isCurrentPlayerHost()){const j=s.multiplayerPeerJsHelper.getAllPeers().filter(R=>R!==m);if(!j.length)return;x({originalMessageName:a,originalData:i,expectedMessageName:_,otherPeerIds:j,shouldCancelMessageIfTimesOut:!1}),g.info(`Relaying ownership change of object ${f} with instance network ID ${u} to ${j.join(", ")}.`),w(j,a,i)}})})},Me="#updateInstance",Be=/#updateInstance#owner_(\d+)#object_(.+)#instance_(.+)#scene_(.+)/,Ke=({objectOwner:e,objectName:t,instanceNetworkId:n,objectNetworkSyncData:r,sceneNetworkId:a})=>({messageName:`${Me}#owner_${e}#object_${t}#instance_${n}#scene_${a}`,messageData:r}),Ye=e=>{if(!s.multiplayer.isReadyToSendOrReceiveGameUpdateMessages())return;const t=s.multiplayerPeerJsHelper.getAllMessagesMap();Array.from(t.keys()).filter(a=>a.startsWith(Me)).forEach(a=>{const o=t.get(a);if(!o)return;const l=o.getMessages();if(!l.length)return;l.slice().reverse().forEach(i=>{const m=i.getData(),p=i.getSender(),f=Be.exec(a);if(!f)return;const u=parseInt(f[1],10);if(u===s.multiplayer.playerNumber)return;const d=f[2],y=f[3],I=f[4];if(I!==e.networkId){g.info(`Object ${d} is in scene ${I}, but we are on ${e.networkId}. Skipping.`);return}const P=m._clock,h=fe({sceneNetworkId:I,instanceNetworkId:y});if(P<=h)return;const b=Z({runtimeScene:e,objectName:d,instanceNetworkId:y,shouldCreateIfNotFound:!0,instanceX:m.x,instanceY:m.y});if(!b){k.error("Instance could not be found or created.");return}const N=b.getBehavior("MultiplayerObject");if(!N){k.error(`Object ${d} does not have the MultiplayerObjectBehavior, cannot update it.`);return}if(N.getPlayerObjectOwnership()===s.multiplayer.playerNumber){g.info(`Object ${d} with instance network ID ${y} is owned by us ${s.multiplayer.playerNumber}, ignoring update message from ${u}.`);return}if(N.getPlayerObjectOwnership()!==u&&(g.info(`Object ${d} with instance network ID ${y} is owned by ${N.getPlayerObjectOwnership()} on our game, changing ownership to ${u} as part of the update event.`),N.playerNumber=u),b.updateFromNetworkSyncData(m),ye({sceneNetworkId:I,instanceNetworkId:y,clock:P}),N._clock=P,s.multiplayer.isCurrentPlayerHost()){const T=s.multiplayerPeerJsHelper.getAllPeers().filter(j=>j!==p);if(!T.length)return;w(T,a,m)}})})},X="#changeVariableOwner",we=/#changeVariableOwner#owner_(\d+)#variable_(.+)/,qe=({variableOwner:e,variableNetworkId:t,newVariableOwner:n})=>({messageName:`${X}#owner_${e}#variable_${t}`,messageData:{previousOwner:e,newOwner:n}}),te="#variableOwnerChanged",Xe=/#variableOwnerChanged#owner_(\d+)#variable_(.+)/,Ie=e=>e.replace(X,te),ze=e=>{if(!s.multiplayer.isReadyToSendOrReceiveGameUpdateMessages())return;const t=s.multiplayerPeerJsHelper.getAllMessagesMap();Array.from(t.keys()).filter(a=>a.startsWith(X)).forEach(a=>{const o=t.get(a);if(!o)return;const l=o.getMessages();!l.length||l.forEach(c=>{const i=c.getData(),m=c.getSender(),p=we.exec(a);if(!p)return;const f=p[2],u=i.previousOwner,d=i.newOwner,{type:y,name:I,containerId:P}=s.multiplayerVariablesManager.getVariableTypeAndNameFromNetworkId(f);if(y==="scene"&&P!==e.networkId){g.info(`Variable ${I} is in scene ${P}, but we are on ${e.networkId}. Skipping.`);return}const h=P==="game"?e.getGame().getVariables():e.getVariables();if(!h.has(I)){k.error(`Variable with ID ${f} not found whilst syncing. This should not happen.`);return}const b=h.get(I),N=b.getPlayerOwnership(),_=N===u||N===d;if(s.multiplayer.isCurrentPlayerHost()&&!_){g.info(`Variable with ID ${f} does not have the expected owner. Wanted to change from ${u} to ${d}, but variable has owner ${N}.`);return}g.info(`Changing ownership of variable ${I} to ${d}.`),b.setPlayerOwnership(d);const T=Ie(a);if(g.info(`Sending acknowledgment of ownership change of variable with ID ${f} from ${u} to ${d} to ${m}.`),w([m],T,{}),s.multiplayer.isCurrentPlayerHost()){const R=s.multiplayerPeerJsHelper.getAllPeers().filter(G=>G!==m);if(!R.length)return;x({originalMessageName:a,originalData:i,expectedMessageName:T,otherPeerIds:R,shouldCancelMessageIfTimesOut:!1});for(const G of R)g.info(`Relaying ownership change of variable with Id ${f} to ${G}.`),w(R,a,i)}})})},Qe=e=>e.startsWith(ne)?at:e.startsWith(ee)?Ve:e.startsWith(te)?Xe:e.startsWith(re)?ct:null,Ze=e=>e.startsWith(ne)||e.startsWith(ee)||e.startsWith(te)||e.startsWith(re),et=()=>{if(!s.multiplayer.isReadyToSendOrReceiveGameUpdateMessages())return;const e=s.multiplayerPeerJsHelper.getAllMessagesMap();Array.from(e.keys()).filter(Ze).forEach(r=>{const a=e.get(r);if(!a)return;const o=a.getMessages();!o.length||o.forEach(l=>{const c=l.getData(),i=l.getSender();g.info(`Received acknowledgment for message ${r}.`);const m=Qe(r);if(!m){k.error(`Invalid acknowledgment message ${r}.`);return}const p=m.exec(r);if(!p){k.error(`Invalid acknowledgment message ${r}.`);return}if(!O[r]||!O[r][i])return;const f=c._clock;if(f!==void 0){const u=p[3],d=p[4],y=fe({sceneNetworkId:d,instanceNetworkId:u});if(f<=y)return;ye({sceneNetworkId:d,instanceNetworkId:u,clock:f})}g.info(`Marking message ${r} as acknowledged from ${i}.`),O[r][i].acknowledged=!0})})},tt=e=>{if(!s.multiplayer.isReadyToSendOrReceiveGameUpdateMessages())return;Object.keys(O).forEach(n=>{const r=O[n],a=Object.keys(r).filter(o=>!r[o].acknowledged);if(!a.length)g.info(`All peers have acknowledged message ${n}.`),delete O[n];else for(const o of a){const{lastMessageSentAt:l,originalMessageName:c,originalData:i,numberOfRetries:m,maxNumberOfRetries:p,messageRetryTime:f}=r[o];if(v()-l>f){if(m>=p){if(g.info(`Giving up on message ${n} for ${o}.`),r[o].shouldCancelMessageIfTimesOut){if(c.startsWith(q)){const u=he.exec(c);if(!u){delete O[n];return}const d=u[2],y=u[3],I=e.getInstancesOf(d);if(!I){delete O[n];return}let P=I.find(N=>N.networkId===y);if(!P){delete O[n];return}const h=P.getBehavior("MultiplayerObject");if(!h){k.error(`Object ${d} does not have the MultiplayerObjectBehavior, cannot revert ownership.`),delete O[n];return}const b=i.previousOwner;if(b===void 0){delete O[n];return}h.playerNumber=b||0}if(c.startsWith(X)){const u=we.exec(c);if(!u){delete O[n];return}const d=u[2],y=i.previousOwner,{type:I,name:P,containerId:h}=s.multiplayerVariablesManager.getVariableTypeAndNameFromNetworkId(d);if(I==="scene"&&h!==e.networkId){g.info(`Variable ${P} is in scene ${h}, but we are on ${e.networkId}. Skipping ownership revert.`),delete O[n];return}const b=h==="game"?e.getGame().getVariables():e.getVariables();if(!b.has(P)){k.error(`Variable with ID ${d} not found while reverting ownership. This should not happen.`),delete O[n];return}const N=b.get(P);if(y===void 0){delete O[n];return}N.setPlayerOwnership(y||0)}}delete O[n];continue}w([o],c,i),r[o].lastMessageSentAt=v(),r[o].numberOfRetries=m+1}}})},se="#destroyInstance",st=/#destroyInstance#owner_(\d+)#object_(.+)#instance_(.+)#scene_(.+)/,nt=({objectOwner:e,objectName:t,instanceNetworkId:n,sceneNetworkId:r})=>({messageName:`${se}#owner_${e}#object_${t}#instance_${n}#scene_${r}`,messageData:{}}),ne="#instanceDestroyed",at=/#instanceDestroyed#owner_(\d+)#object_(.+)#instance_(.+)/,Pe=e=>e.replace(se,ne),rt=e=>{if(!s.multiplayer.isReadyToSendOrReceiveGameUpdateMessages())return;const t=s.multiplayerPeerJsHelper.getAllMessagesMap();Array.from(t.keys()).filter(a=>a.startsWith(se)).forEach(a=>{const o=t.get(a);if(!o)return;const l=o.getMessages();!l.length||l.forEach(c=>{const i=c.getData(),m=c.getSender();g.info(`Received message ${a} with data ${JSON.stringify(i)}.`);const p=st.exec(a);if(!p||parseInt(p[1],10)===s.multiplayer.playerNumber)return;const u=p[2],d=p[3],y=p[4];if(y!==e.networkId){g.info(`Object ${u} is in scene ${y}, but we are on ${e.networkId}. Skipping.`);return}const I=Z({runtimeScene:e,objectName:u,instanceNetworkId:d}),P=Pe(a);if(!I){g.info("Instance was not found in the scene, sending acknowledgment anyway."),w([m],P,{});return}if(g.info(`Destroying object ${u} with instance network ID ${d}.`),I.deleteFromScene(e),g.info(`Sending acknowledgment of destruction of object ${u} with instance network ID ${d} to ${m}.`),w([m],P,{}),s.multiplayer.isCurrentPlayerHost()){const b=s.multiplayerPeerJsHelper.getAllPeers().filter(N=>N!==m);if(!b.length)return;x({originalMessageName:a,originalData:i,expectedMessageName:P,otherPeerIds:b,shouldCancelMessageIfTimesOut:!1}),w(b,a,i)}})})},ae="#customMessage",ot=/#customMessage#(.+)/,z=e=>`${ae}#${e}`,it=({userMessageName:e,userMessageData:t,senderPlayerNumber:n})=>{const r=s.makeUuid();return{messageName:z(e),messageData:{data:t,uniqueId:r,senderPlayerNumber:n}}},re="#ackCustomMessage",ct=/#ackCustomMessage#(.+)/,Ne=e=>e.replace(ae,re),Oe=(e,t)=>{const n=s.multiplayerPeerJsHelper.getAllPeers(),r=s.multiplayer.getCurrentPlayerNumber(),{messageName:a,messageData:o}=it({userMessageName:e,userMessageData:t,senderPlayerNumber:r}),l=Ne(a);x({originalMessageName:a,originalData:o,expectedMessageName:l,otherPeerIds:n,shouldCancelMessageIfTimesOut:!1}),g.info(`Sending custom message ${e} with data ${JSON.stringify(t)}.`),w(n,a,o),s.multiplayer.isCurrentPlayerHost()&&s.multiplayerPeerJsHelper.getOrCreateMessagesList(a).pushMessage(o,s.multiplayerPeerJsHelper.getCurrentId())},lt=(e,t)=>{const n=t.toJSObject();g.info(`Sending custom message ${e} with data ${JSON.stringify(n)}.`),Oe(e,n)},gt=e=>{const t=z(e),r=s.multiplayerPeerJsHelper.getAllMessagesMap().get(t);if(!r)return;const a=r.getMessages();if(!a.length)return;g.info(`custom message ${e} has been received.`);let o=!1;return a.forEach(l=>{const i=l.getData().uniqueId,m=`${t}#${i}`;W.has(m)||(W.add(m),o=!0)}),o},Se=e=>{const t=z(e),r=s.multiplayerPeerJsHelper.getAllMessagesMap().get(t);if(!r)return;const a=r.getMessages();return a.length?a[a.length-1].getData().data:void 0},ut=(e,t)=>{const n=Se(e);!n||(g.info(`Received custom message ${e} with data ${JSON.stringify(n)}.`),t.fromJSObject(n))},mt=e=>{const t=z(e),r=s.multiplayerPeerJsHelper.getAllMessagesMap().get(t);if(!r)return 0;const a=r.getMessages();return a.length?a[a.length-1].getData().senderPlayerNumber:0},dt=()=>{if(!s.multiplayer.isReadyToSendOrReceiveGameUpdateMessages())return;const e=s.multiplayerPeerJsHelper.getAllMessagesMap();Array.from(e.keys()).filter(r=>r.startsWith(ae)).forEach(r=>{const a=e.get(r);if(!a){k.error(`No messages list found for ${r}.`);return}const o=a.getMessages();!o.length||o.forEach(l=>{const c=l.getData(),i=l.getSender(),m=c.uniqueId;if(g.info(`Received custom message ${r} with data ${JSON.stringify(c)}.`),!ot.exec(r)){k.error(`Invalid custom message ${r}.`);return}const f=`${r}#${m}`;if(W.has(f)){g.info(`Message ${r} has already been processed, skipping.`);return}const u=Ne(r);if(g.info(`Sending acknowledgment of custom message ${r} to ${i}.`),w([i],u,{}),s.multiplayer.isCurrentPlayerHost()){const d=s.multiplayerPeerJsHelper.getAllPeers();if(!d.length)return;x({originalMessageName:r,originalData:c,expectedMessageName:u,otherPeerIds:d,shouldCancelMessageIfTimesOut:!1}),w(d,r,c)}})})},De="#updateScene",ke=({sceneNetworkSyncData:e})=>({messageName:`${De}`,messageData:e}),pt=e=>e.var?Q?JSON.stringify(e.var)!==JSON.stringify(Q.var):!0:!1,ft=()=>v()-me<1e3/xe,yt=e=>{if(!s.multiplayer.isReadyToSendOrReceiveGameUpdateMessages())return;const t=e.getNetworkSyncData({playerNumber:s.multiplayer.getCurrentPlayerNumber(),isHost:s.multiplayer.isCurrentPlayerHost()});if(!t)return;const n=pt(t),r=!ft()||n||V>0;if(n&&(V=3),!r)return;const a=s.multiplayerPeerJsHelper.getAllPeers(),{messageName:o,messageData:l}=ke({sceneNetworkSyncData:t});w(a,o,l),me=v(),Q=t,V=Math.max(V-1,0)},ht=e=>{const t=s.multiplayerPeerJsHelper.getAllMessagesMap();Array.from(t.keys()).filter(a=>a.startsWith(De)).forEach(a=>{const o=t.get(a);if(!o)return;const l=o.getMessages();!l.length||l.forEach(c=>{const i=c.getData(),m=c.getSender(),p=i.id;if(s.multiplayer.isReadyToSendOrReceiveGameUpdateMessages()){if(p!==e.networkId){g.info(`Received update of scene ${p}, but we are on ${e.networkId}. Skipping.`);return}e.updateFromNetworkSyncData(i)}else{g.info(`Saving scene ${p} update message for later use.`),F.store(i);return}if(s.multiplayer.isCurrentPlayerHost()){const u=s.multiplayerPeerJsHelper.getAllPeers().filter(d=>d!==m);w(u,a,i)}})})},ve="#updateGame",$e=({gameNetworkSyncData:e})=>({messageName:`${ve}`,messageData:e}),bt=e=>{const t=e.var,n=e.ss;if(!t&&!n)return!1;if(!J||!J.var||!J.ss||t&&JSON.stringify(t)!==JSON.stringify(J.var))return!0;if(n){if(n.length!==J.ss.length)return!0;for(let r=0;r<n.length;++r){const a=n[r],o=J.ss[r];if(a.name!==o.name||a.networkId!==o.networkId)return!0}}return!1},Mt=()=>v()-de<1e3/Ge,wt=e=>{if(!s.multiplayer.isReadyToSendOrReceiveGameUpdateMessages())return;const t=e.getGame().getNetworkSyncData({playerNumber:s.multiplayer.getCurrentPlayerNumber(),isHost:s.multiplayer.isCurrentPlayerHost()});if(!t)return;const n=bt(t),r=!Mt()||n||B>0;if(n&&(B=3),!r)return;const a=s.multiplayerPeerJsHelper.getAllPeers(),{messageName:o,messageData:l}=$e({gameNetworkSyncData:t});w(a,o,l),de=v(),J=t,B=Math.max(B-1,0)},It=e=>{const t=s.multiplayerPeerJsHelper.getAllMessagesMap();Array.from(t.keys()).filter(a=>a.startsWith(ve)).forEach(a=>{const o=t.get(a);if(!o)return;const l=o.getMessages();!l.length||l.forEach(c=>{const i=c.getData(),m=c.getSender();if(s.multiplayer.isReadyToSendOrReceiveGameUpdateMessages())e.getGame().updateFromNetworkSyncData(i);else{g.info("Saving game update message for later use."),K.store(i);return}if(s.multiplayer.isCurrentPlayerHost()){const f=s.multiplayerPeerJsHelper.getAllPeers().filter(u=>u!==m);w(f,a,i)}})})},Pt=e=>{K.getUpdates().forEach(t=>{g.info("Reapplying saved update of game."),e.getGame().updateFromNetworkSyncData(t)}),K.clear(),F.getUpdates().forEach(t=>{const n=t.id;if(n!==e.networkId){g.info(`Trying to apply saved update of scene ${n}, but we are on ${e.networkId}. Skipping.`);return}g.info(`Reapplying saved update of scene ${n}.`),e.updateFromNetworkSyncData(t),F.remove(t)})},oe="#heartbeat",Nt=/#heartbeat#(.+)/,ie=()=>{M[s.multiplayer.getCurrentPlayerNumber()]={ping:0,playerId:s.playerAuthentication.getUserId(),username:s.playerAuthentication.getUsername()};for(const e in M)M[e]={...M[e],ping:ce(parseInt(e,10))};return{messageName:`${oe}#${s.multiplayer.getCurrentPlayerNumber()}`,messageData:{now:v(),playersInfo:M}}},Ot=({heartbeatSentAt:e})=>({messageName:`${oe}#${s.multiplayer.getCurrentPlayerNumber()}`,messageData:{sentAt:e,playerId:s.playerAuthentication.getUserId(),username:s.playerAuthentication.getUsername()}}),St=()=>!!E&&v()-E<1e3/Ee,Dt=()=>{if(!s.multiplayer.isCurrentPlayerHost()||!!St())return;const t=s.multiplayerPeerJsHelper.getAllPeers(),{messageName:n,messageData:r}=ie();w(t,n,r),E=v()},kt=()=>{const e=s.multiplayerPeerJsHelper.getAllMessagesMap();Array.from(e.keys()).filter(r=>r.startsWith(oe)).forEach(r=>{const a=e.get(r);if(!a)return;const o=a.getMessages();!o.length||o.forEach(l=>{const c=l.getData(),i=l.getSender(),m=Nt.exec(r);if(!m)return;const p=parseInt(m[1],10);if(pe[i]=p,!s.multiplayer.isCurrentPlayerHost()){const h=s.multiplayer.getCurrentPlayerNumber(),b=Object.keys(M).map(R=>parseInt(R,10)),N=Object.keys(c.playersInfo).map(R=>parseInt(R,10)),_=M[h]&&M[h].ping;if(b.length){const R=N.filter(L=>!b.includes(L)&&L!==h);$.push(...R);const G=b.filter(L=>!N.includes(L));A.push(...G);for(const L of G)Y[L]=le(L)}Te({source:c.playersInfo,target:M});const{messageName:T,messageData:j}=Ot({heartbeatSentAt:c.now});w([i],T,j),M[h]!==void 0&&M[h].ping!==void 0&&(s.multiplayer.markConnectionAsConnected(),_===void 0&&$.push(h));return}M[p]||$.push(p);const f=v(),u=c.sentAt,d=Math.round(f-u),y=U[p]||[];y.push(d),y.length>5&&y.shift(),U[p]=y;let I=0;for(const h of y)I+=h;const P=Math.round(I/y.length/2);if(M[p]={ping:P,playerId:c.playerId,username:c.username},$.length){const h=s.multiplayerPeerJsHelper.getAllPeers(),{messageName:b,messageData:N}=ie();w(h,b,N),E=v()}})})},vt=e=>(U[e]||[]).length>0,ce=e=>{const t=M[e];return t&&t.ping||0},$t=()=>{const e=s.multiplayer.getCurrentPlayerNumber();return ce(e)},Re=({runtimeScene:e,playerNumber:t,peerId:n})=>{if(k.info(`Marking player ${t} as disconnected.`),A.push(t),Y[t]=le(t),Qt(t),n&&n===s.multiplayer.hostPeerId)if(s.multiplayer.shouldEndLobbyWhenHostLeaves())k.info("Host has disconnected, ending the game."),ge(),s.multiplayer.handleLobbyGameEnded();else{k.info("Host has disconnected, switching host."),s.multiplayer.handleHostDisconnected({runtimeScene:e});return}if(s.multiplayer.isCurrentPlayerHost()){const r=s.multiplayerPeerJsHelper.getAllPeers(),{messageName:a,messageData:o}=ie();w(r,a,o),E=v()}},le=e=>(M[e]||{}).username||Y[e]||`Player ${e}`,Rt=e=>(M[e]||{}).playerId||"",Ct=e=>{if(!s.multiplayer.isLobbyGameRunning())return;const t=[],n=s.multiplayerPeerJsHelper.getJustDisconnectedPeers();if(n.length)for(const r of n){const a=pe[r];if(!a)return;k.info(`Player ${a} has disconnected.`),t.push({playerNumber:a,peerId:r})}for(const{playerNumber:r,peerId:a}of t){if(s.multiplayer.isCurrentPlayerHost()){const o=e.getAdhocListOfAllInstances();for(const l of o){const c=l.getBehavior("MultiplayerObject");if(c&&c.getPlayerObjectOwnership()===r){const i=c.getActionOnPlayerDisconnect();i==="DestroyObject"?l.deleteFromScene(e):i==="GiveOwnershipToHost"&&c.removeObjectOwnership()}}}Re({runtimeScene:e,playerNumber:r,peerId:a})}},At=()=>A.length>0,jt=e=>A.includes(e),Tt=()=>A,Ht=()=>A[0]||0,Jt=()=>{const e=A[0];e!==void 0&&(A=A.slice(1),delete Y[e])},_t=()=>$.length>0,Lt=e=>$.includes(e),xt=()=>$,Gt=()=>$[0]||0,Et=()=>{$[0]!==void 0&&($=$.slice(1))},Ut=()=>Object.keys(M).map(e=>({playerNumber:parseInt(e,10),playerId:M[e].playerId})),Wt=()=>Object.keys(M).length,Vt=e=>M[e]!==void 0,Ft=()=>M,Ce="#endGame",Bt=()=>({messageName:Ce,messageData:{}}),Kt=()=>{if(!s.multiplayer.isCurrentPlayerHost())return;g.info("Sending endgame message.");const e=s.multiplayerPeerJsHelper.getAllPeers(),{messageName:t,messageData:n}=Bt();w(e,t,n)},Yt=()=>{if(s.multiplayer.isCurrentPlayerHost())return;const t=s.multiplayerPeerJsHelper.getAllMessagesMap().get(Ce);!t||!t.getMessages().length||(k.info("Received endgame message."),ge(),s.multiplayer.handleLobbyGameEnded())},Ae="#resumeGame",qt=()=>({messageName:Ae,messageData:{}}),Xt=()=>{if(!s.multiplayer.isCurrentPlayerHost())return;g.info("Sending resumeGame message.");const e=s.multiplayerPeerJsHelper.getAllPeers(),{messageName:t,messageData:n}=qt();w(e,t,n)},zt=e=>{if(s.multiplayer.isCurrentPlayerHost())return;const n=s.multiplayerPeerJsHelper.getAllMessagesMap().get(Ae);!n||!n.getMessages().length||(k.info("Received resumeGame message."),s.multiplayer.resumeGame(e))},ge=()=>{U={},M={},K.clear(),F.clear(),W.clear(),A=[],$=[],O={},H={}},Qt=e=>{delete U[e],delete M[e]};return{sendDataTo:w,addExpectedMessageAcknowledgement:x,handleAcknowledgeMessagesReceived:et,resendClearOrCancelAcknowledgedMessages:tt,createChangeInstanceOwnerMessage:We,createInstanceOwnerChangedMessageNameFromChangeInstanceOwnerMessage:be,handleChangeInstanceOwnerMessagesReceived:Fe,createUpdateInstanceMessage:Ke,handleUpdateInstanceMessagesReceived:Ye,createDestroyInstanceMessage:nt,createInstanceDestroyedMessageNameFromDestroyInstanceMessage:Pe,handleDestroyInstanceMessagesReceived:rt,createChangeVariableOwnerMessage:qe,createVariableOwnerChangedMessageNameFromChangeVariableOwnerMessage:Ie,handleChangeVariableOwnerMessagesReceived:ze,sendCustomMessage:Oe,getCustomMessageData:Se,sendVariableCustomMessage:lt,getVariableCustomMessageData:ut,hasCustomMessageBeenReceived:gt,handleCustomMessagesReceived:dt,getCustomMessageSender:mt,createUpdateSceneMessage:ke,handleUpdateSceneMessagesToSend:yt,handleUpdateSceneMessagesReceived:ht,createUpdateGameMessage:$e,handleUpdateGameMessagesToSend:wt,handleUpdateGameMessagesReceived:It,handleSavedUpdateMessages:Pt,handleHeartbeatsToSend:Dt,handleHeartbeatsReceived:kt,hasReceivedHeartbeatFromPlayer:vt,getPlayerPing:ce,getCurrentPlayerPing:$t,getPlayerUsername:le,getPlayerId:Rt,handleJustDisconnectedPeers:Ct,getConnectedPlayers:Ut,getNumberOfConnectedPlayers:Wt,isPlayerConnected:Vt,getPlayersInfo:Ft,hasAnyPlayerJustLeft:At,hasPlayerJustLeft:jt,getPlayersWhoJustLeft:Tt,getLatestPlayerWhoJustLeft:Ht,removePlayerWhoJustLeft:Jt,markPlayerAsDisconnected:Re,hasAnyPlayerJustJoined:_t,hasPlayerJustJoined:Lt,getPlayersWhoJustJoined:xt,getLatestPlayerWhoJustJoined:Gt,removePlayerWhoJustJoined:Et,sendEndGameMessage:Kt,handleEndGameMessagesReceived:Yt,clearAllMessagesTempData:ge,sendResumeGameMessage:Xt,handleResumeGameMessagesReceived:zt}},s.multiplayerMessageManager=s.makeMultiplayerMessageManager()})(gdjs||(gdjs={}));
|
|
2
2
|
//# sourceMappingURL=messageManager.js.map
|