gdcore-tools 2.0.0-gd-v5.5.242-autobuild → 2.0.0-gd-v5.5.243-autobuild

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.
Files changed (126) hide show
  1. package/dist/Runtime/AsyncTasksManager.js +2 -2
  2. package/dist/Runtime/AsyncTasksManager.js.map +2 -2
  3. package/dist/Runtime/CustomRuntimeObject.js +1 -1
  4. package/dist/Runtime/CustomRuntimeObject.js.map +2 -2
  5. package/dist/Runtime/Extensions/3D/A_RuntimeObject3D.js +1 -1
  6. package/dist/Runtime/Extensions/3D/A_RuntimeObject3D.js.map +2 -2
  7. package/dist/Runtime/Extensions/3D/Cube3DRuntimeObject.js +1 -1
  8. package/dist/Runtime/Extensions/3D/Cube3DRuntimeObject.js.map +2 -2
  9. package/dist/Runtime/Extensions/3D/CustomRuntimeObject3D.js +1 -1
  10. package/dist/Runtime/Extensions/3D/CustomRuntimeObject3D.js.map +2 -2
  11. package/dist/Runtime/Extensions/3D/JsExtension.js +5 -0
  12. package/dist/Runtime/Extensions/3D/Model3DRuntimeObject.js +1 -1
  13. package/dist/Runtime/Extensions/3D/Model3DRuntimeObject.js.map +2 -2
  14. package/dist/Runtime/Extensions/3D/Model3DRuntimeObject3DRenderer.js +1 -1
  15. package/dist/Runtime/Extensions/3D/Model3DRuntimeObject3DRenderer.js.map +2 -2
  16. package/dist/Runtime/Extensions/BBText/bbtextruntimeobject.js +1 -1
  17. package/dist/Runtime/Extensions/BBText/bbtextruntimeobject.js.map +2 -2
  18. package/dist/Runtime/Extensions/BitmapText/bitmaptextruntimeobject.js +1 -1
  19. package/dist/Runtime/Extensions/BitmapText/bitmaptextruntimeobject.js.map +2 -2
  20. package/dist/Runtime/Extensions/DebuggerTools/JsExtension.js +3 -1
  21. package/dist/Runtime/Extensions/DestroyOutsideBehavior/destroyoutsideruntimebehavior.js +1 -1
  22. package/dist/Runtime/Extensions/DestroyOutsideBehavior/destroyoutsideruntimebehavior.js.map +2 -2
  23. package/dist/Runtime/Extensions/Lighting/lightruntimeobject.js +1 -1
  24. package/dist/Runtime/Extensions/Lighting/lightruntimeobject.js.map +2 -2
  25. package/dist/Runtime/Extensions/Multiplayer/messageManager.js +1 -1
  26. package/dist/Runtime/Extensions/Multiplayer/messageManager.js.map +2 -2
  27. package/dist/Runtime/Extensions/Multiplayer/multiplayerobjectruntimebehavior.js +1 -1
  28. package/dist/Runtime/Extensions/Multiplayer/multiplayerobjectruntimebehavior.js.map +2 -2
  29. package/dist/Runtime/Extensions/PanelSpriteObject/panelspriteruntimeobject.js +1 -1
  30. package/dist/Runtime/Extensions/PanelSpriteObject/panelspriteruntimeobject.js.map +2 -2
  31. package/dist/Runtime/Extensions/ParticleSystem/particleemitterobject.js +1 -1
  32. package/dist/Runtime/Extensions/ParticleSystem/particleemitterobject.js.map +2 -2
  33. package/dist/Runtime/Extensions/PathfindingBehavior/pathfindingruntimebehavior.js +1 -1
  34. package/dist/Runtime/Extensions/PathfindingBehavior/pathfindingruntimebehavior.js.map +2 -2
  35. package/dist/Runtime/Extensions/Physics2Behavior/physics2runtimebehavior.js +1 -1
  36. package/dist/Runtime/Extensions/Physics2Behavior/physics2runtimebehavior.js.map +2 -2
  37. package/dist/Runtime/Extensions/Physics3DBehavior/Physics3DRuntimeBehavior.js +1 -1
  38. package/dist/Runtime/Extensions/Physics3DBehavior/Physics3DRuntimeBehavior.js.map +2 -2
  39. package/dist/Runtime/Extensions/Physics3DBehavior/PhysicsCar3DRuntimeBehavior.js +1 -1
  40. package/dist/Runtime/Extensions/Physics3DBehavior/PhysicsCar3DRuntimeBehavior.js.map +2 -2
  41. package/dist/Runtime/Extensions/Physics3DBehavior/PhysicsCharacter3DRuntimeBehavior.js +1 -1
  42. package/dist/Runtime/Extensions/Physics3DBehavior/PhysicsCharacter3DRuntimeBehavior.js.map +2 -2
  43. package/dist/Runtime/Extensions/PlatformBehavior/platformerobjectruntimebehavior.js +1 -1
  44. package/dist/Runtime/Extensions/PlatformBehavior/platformerobjectruntimebehavior.js.map +2 -2
  45. package/dist/Runtime/Extensions/PlatformBehavior/platformruntimebehavior.js +1 -1
  46. package/dist/Runtime/Extensions/PlatformBehavior/platformruntimebehavior.js.map +2 -2
  47. package/dist/Runtime/Extensions/PrimitiveDrawing/shapepainterruntimeobject.js +1 -1
  48. package/dist/Runtime/Extensions/PrimitiveDrawing/shapepainterruntimeobject.js.map +2 -2
  49. package/dist/Runtime/Extensions/SaveState/JsExtension.js +488 -0
  50. package/dist/Runtime/Extensions/SaveState/SaveConfigurationRuntimeBehavior.js +2 -0
  51. package/dist/Runtime/Extensions/SaveState/SaveConfigurationRuntimeBehavior.js.map +7 -0
  52. package/dist/Runtime/Extensions/SaveState/SaveStateTools.js +2 -0
  53. package/dist/Runtime/Extensions/SaveState/SaveStateTools.js.map +7 -0
  54. package/dist/Runtime/Extensions/Spine/spineruntimeobject.js +1 -1
  55. package/dist/Runtime/Extensions/Spine/spineruntimeobject.js.map +2 -2
  56. package/dist/Runtime/Extensions/TextInput/textinputruntimeobject.js +1 -1
  57. package/dist/Runtime/Extensions/TextInput/textinputruntimeobject.js.map +2 -2
  58. package/dist/Runtime/Extensions/TextObject/textruntimeobject.js +1 -1
  59. package/dist/Runtime/Extensions/TextObject/textruntimeobject.js.map +2 -2
  60. package/dist/Runtime/Extensions/TileMap/helper/dts/model/TileMapModel.d.ts +4 -4
  61. package/dist/Runtime/Extensions/TileMap/simpletilemapruntimeobject.js +1 -1
  62. package/dist/Runtime/Extensions/TileMap/simpletilemapruntimeobject.js.map +2 -2
  63. package/dist/Runtime/Extensions/TileMap/tilemapcollisionmaskruntimeobject.js +1 -1
  64. package/dist/Runtime/Extensions/TileMap/tilemapcollisionmaskruntimeobject.js.map +2 -2
  65. package/dist/Runtime/Extensions/TileMap/tilemapruntimeobject-pixi-renderer.js +1 -1
  66. package/dist/Runtime/Extensions/TileMap/tilemapruntimeobject-pixi-renderer.js.map +2 -2
  67. package/dist/Runtime/Extensions/TileMap/tilemapruntimeobject.js +1 -1
  68. package/dist/Runtime/Extensions/TileMap/tilemapruntimeobject.js.map +2 -2
  69. package/dist/Runtime/Extensions/TiledSpriteObject/tiledspriteruntimeobject.js +1 -1
  70. package/dist/Runtime/Extensions/TiledSpriteObject/tiledspriteruntimeobject.js.map +2 -2
  71. package/dist/Runtime/Extensions/TopDownMovementBehavior/topdownmovementruntimebehavior.js +1 -1
  72. package/dist/Runtime/Extensions/TopDownMovementBehavior/topdownmovementruntimebehavior.js.map +2 -2
  73. package/dist/Runtime/Extensions/TweenBehavior/TweenManager.js +2 -2
  74. package/dist/Runtime/Extensions/TweenBehavior/TweenManager.js.map +2 -2
  75. package/dist/Runtime/Extensions/TweenBehavior/tweenruntimebehavior.js +1 -1
  76. package/dist/Runtime/Extensions/TweenBehavior/tweenruntimebehavior.js.map +2 -2
  77. package/dist/Runtime/Extensions/TweenBehavior/tweentools.js +1 -1
  78. package/dist/Runtime/Extensions/TweenBehavior/tweentools.js.map +2 -2
  79. package/dist/Runtime/Extensions/Video/videoruntimeobject.js +1 -1
  80. package/dist/Runtime/Extensions/Video/videoruntimeobject.js.map +2 -2
  81. package/dist/Runtime/RuntimeInstanceContainer.js +1 -1
  82. package/dist/Runtime/RuntimeInstanceContainer.js.map +2 -2
  83. package/dist/Runtime/RuntimeLayer.js +1 -1
  84. package/dist/Runtime/RuntimeLayer.js.map +2 -2
  85. package/dist/Runtime/debugger-client/hot-reloader.js +1 -1
  86. package/dist/Runtime/debugger-client/hot-reloader.js.map +2 -2
  87. package/dist/Runtime/events-tools/objecttools.js +1 -1
  88. package/dist/Runtime/events-tools/objecttools.js.map +2 -2
  89. package/dist/Runtime/events-tools/runtimescenetools.js +1 -1
  90. package/dist/Runtime/events-tools/runtimescenetools.js.map +2 -2
  91. package/dist/Runtime/gd.js +1 -1
  92. package/dist/Runtime/gd.js.map +2 -2
  93. package/dist/Runtime/howler-sound-manager/howler-sound-manager.js +1 -1
  94. package/dist/Runtime/howler-sound-manager/howler-sound-manager.js.map +2 -2
  95. package/dist/Runtime/indexeddb.js +2 -0
  96. package/dist/Runtime/indexeddb.js.map +7 -0
  97. package/dist/Runtime/oncetriggers.js +1 -1
  98. package/dist/Runtime/oncetriggers.js.map +2 -2
  99. package/dist/Runtime/runtimebehavior.js +1 -1
  100. package/dist/Runtime/runtimebehavior.js.map +2 -2
  101. package/dist/Runtime/runtimegame.js +1 -1
  102. package/dist/Runtime/runtimegame.js.map +2 -2
  103. package/dist/Runtime/runtimeobject.js +1 -1
  104. package/dist/Runtime/runtimeobject.js.map +2 -2
  105. package/dist/Runtime/runtimescene.js +1 -1
  106. package/dist/Runtime/runtimescene.js.map +2 -2
  107. package/dist/Runtime/scenestack.js +1 -1
  108. package/dist/Runtime/scenestack.js.map +2 -2
  109. package/dist/Runtime/spriteruntimeobject.js +1 -1
  110. package/dist/Runtime/spriteruntimeobject.js.map +2 -2
  111. package/dist/Runtime/timemanager.js +1 -1
  112. package/dist/Runtime/timemanager.js.map +2 -2
  113. package/dist/Runtime/timer.js +1 -1
  114. package/dist/Runtime/timer.js.map +2 -2
  115. package/dist/Runtime/types/global-types.d.ts +29 -0
  116. package/dist/Runtime/types/project-data.d.ts +144 -3
  117. package/dist/Runtime/types/save-state.d.ts +9 -0
  118. package/dist/Runtime/variable.js +1 -1
  119. package/dist/Runtime/variable.js.map +2 -2
  120. package/dist/Runtime/variablescontainer.js +1 -1
  121. package/dist/Runtime/variablescontainer.js.map +2 -2
  122. package/dist/lib/libGD.cjs +1 -1
  123. package/dist/lib/libGD.wasm +0 -0
  124. package/dist/loaders.cjs +1 -1
  125. package/gd.d.ts +1 -0
  126. package/package.json +1 -1
@@ -1,2 +1,2 @@
1
- var gdjs;(function(a){const d=new a.Logger("Multiplayer"),m=new a.Logger("Multiplayer - Debug"),f=window.performance&&typeof window.performance.now=="function"?window.performance.now.bind(window.performance):Date.now;class g extends a.RuntimeBehavior{constructor(t,n,e){super(t,n,e);this.playerNumber=0;this._lastObjectSyncTimestamp=0;this._lastBasicObjectSyncTimestamp=0;this._objectBasicInfoSyncRate=5;this._numberOfForcedBasicObjectUpdates=0;this._lastVariablesSyncTimestamp=0;this._variablesSyncRate=1;this._numberOfForcedVariablesUpdates=0;this._lastEffectsSyncTimestamp=0;this._effectsSyncRate=1;this._numberOfForcedEffectsUpdates=0;this._lastLogTimestamp=0;this._logSyncRate=1;this._clock=0;this._destroyInstanceTimeoutId=null;this._timeBeforeDestroyingObjectWithoutNetworkIdInMs=500;this._sendDataToPeersWithIncreasedClock=async(t,n)=>{this._clock++,n._clock=this._clock;const e=a.multiplayerPeerJsHelper.getAllPeers();await a.multiplayerMessageManager.sendDataTo(e,t,n)};this.playerNumber=n.playerNumber==="Host"?0:parseInt(n.playerNumber,10),this.actionOnPlayerDisconnect=n.actionOnPlayerDisconnect,this._destroyInstanceTimeoutId=setTimeout(()=>{const r=this.owner.getRuntimeScene().networkId;!e.networkId&&a.multiplayer.isLobbyGameRunning()&&r&&(m.info(`Lobby game is running on a synced scene and object ${e.getName()} has not been assigned a networkId after a short delay, destroying it.`),e.deleteFromScene())},this._timeBeforeDestroyingObjectWithoutNetworkIdInMs)}_isOwnerAsPlayerOrHost(){const t=a.multiplayer.getCurrentPlayerNumber(),n=a.multiplayer.isCurrentPlayerHost();return t===this.playerNumber||n&&this.playerNumber===0}_hasObjectBeenSyncedWithinMaxRate(){const t=a.multiplayer.getObjectsSynchronizationRate();return f()-this._lastObjectSyncTimestamp<1e3/t}_hasObjectBasicInfoBeenSyncedRecently(){return f()-this._lastBasicObjectSyncTimestamp<1e3/this._objectBasicInfoSyncRate}_haveVariablesBeenSyncedRecently(){return f()-this._lastVariablesSyncTimestamp<1e3/this._variablesSyncRate}_haveEffectsBeenSyncedRecently(){return f()-this._lastEffectsSyncTimestamp<1e3/this._effectsSyncRate}_getOrCreateInstanceNetworkId(){if(!this.owner.networkId){const t=a.makeUuid().substring(0,8);this.owner.networkId=t}return this.owner.networkId}_isBasicObjectNetworkSyncDataDifferentFromLastSync(t){return this._lastSentBasicObjectSyncData?JSON.stringify(t)!==JSON.stringify(this._lastSentBasicObjectSyncData):!0}_areVariablesDifferentFromLastSync(t){return this._lastSentVariableSyncData?JSON.stringify(t)!==JSON.stringify(this._lastSentVariableSyncData):!0}_areEffectsDifferentFromLastSync(t){if(!this._lastSentEffectSyncData)return!0;for(const n in t){if(!t.hasOwnProperty(n))continue;const e=t[n],r=e.ena,i=e.fc,c=this._lastSentEffectSyncData[n];if(!c||c.ena!==r)return!0;for(const s in i){if(!i.hasOwnProperty(s))continue;const o=i[s];if(c.fc[s]!==o)return!0}}return!1}doStepPostEvents(){if(!a.multiplayer.isLobbyGameRunning())return;if(this.actionOnPlayerDisconnect!=="DoNothing"&&this.playerNumber!==0&&!a.multiplayerMessageManager.isPlayerConnected(this.playerNumber)){m.info(`Player number ${this.playerNumber} does not exist in the lobby at the moment. Destroying the object.`),this.owner.deleteFromScene();return}if(!this._isOwnerAsPlayerOrHost()||this._hasObjectBeenSyncedWithinMaxRate())return;const t=this._getOrCreateInstanceNetworkId(),n=this.owner.getName(),e=this.owner.getNetworkSyncData(),r=this._isBasicObjectNetworkSyncDataDifferentFromLastSync({x:e.x,y:e.y,z:e.z,w:e.w,h:e.h,zo:e.zo,a:e.a,hid:e.hid,lay:e.lay,if:e.if,pfx:e.pfx,pfy:e.pfy}),i=!this._hasObjectBasicInfoBeenSyncedRecently()||r||this._numberOfForcedBasicObjectUpdates>0;if(r&&(this._numberOfForcedBasicObjectUpdates=3),!i)return;const c=e.var&&this._areVariablesDifferentFromLastSync(e.var),s=!this._haveVariablesBeenSyncedRecently()||c||this._numberOfForcedVariablesUpdates>0;c&&(this._numberOfForcedVariablesUpdates=3),s||delete e.var;const o=e.eff&&this._areEffectsDifferentFromLastSync(e.eff),l=!this._haveEffectsBeenSyncedRecently()||o||this._numberOfForcedEffectsUpdates>0;o&&(this._numberOfForcedEffectsUpdates=3),l||delete e.eff;const y=this.owner.getRuntimeScene().networkId;if(!y)return;const{messageName:h,messageData:b}=a.multiplayerMessageManager.createUpdateInstanceMessage({objectOwner:this.playerNumber,objectName:n,instanceNetworkId:t,objectNetworkSyncData:e,sceneNetworkId:y});this._sendDataToPeersWithIncreasedClock(h,b);const u=f();this._lastObjectSyncTimestamp=u,i&&(this._lastBasicObjectSyncTimestamp=u,this._lastSentBasicObjectSyncData={x:e.x,y:e.y,z:e.z,w:e.w,h:e.h,zo:e.zo,a:e.a,hid:e.hid,lay:e.lay,if:e.if,pfx:e.pfx,pfy:e.pfy},this._numberOfForcedBasicObjectUpdates=Math.max(this._numberOfForcedBasicObjectUpdates-1,0)),s&&(this._lastVariablesSyncTimestamp=u,this._lastSentVariableSyncData=e.var,this._numberOfForcedVariablesUpdates=Math.max(this._numberOfForcedVariablesUpdates-1,0)),l&&(this._lastEffectsSyncTimestamp=u,this._lastSentEffectSyncData=e.eff,this._numberOfForcedEffectsUpdates=Math.max(this._numberOfForcedEffectsUpdates-1,0))}onDestroy(){if(this._destroyInstanceTimeoutId&&(clearTimeout(this._destroyInstanceTimeoutId),this._destroyInstanceTimeoutId=null),!a.multiplayer.isLobbyGameRunning()||!this._isOwnerAsPlayerOrHost()&&!a.multiplayer.isCurrentPlayerHost())return;const t=this.owner.networkId,n=this.owner.getName();if(!t){m.info(`Destroying object ${n} without networkId, no need to send a message.`);return}const e=this.owner.getRuntimeScene().networkId;if(!e)return;const{messageName:r,messageData:i}=a.multiplayerMessageManager.createUpdateInstanceMessage({objectOwner:this.playerNumber,objectName:n,instanceNetworkId:t,objectNetworkSyncData:this.owner.getNetworkSyncData(),sceneNetworkId:e});this._sendDataToPeersWithIncreasedClock(r,i);const c=a.multiplayerPeerJsHelper.getAllPeers(),{messageName:s,messageData:o}=a.multiplayerMessageManager.createDestroyInstanceMessage({objectOwner:this.playerNumber,objectName:n,instanceNetworkId:t,sceneNetworkId:e}),l=a.multiplayerMessageManager.createInstanceDestroyedMessageNameFromDestroyInstanceMessage(s);a.multiplayerMessageManager.addExpectedMessageAcknowledgement({originalMessageName:s,originalData:{...o,_clock:this._clock+1},expectedMessageName:l,otherPeerIds:c,shouldCancelMessageIfTimesOut:!1}),this._sendDataToPeersWithIncreasedClock(s,o)}setPlayerObjectOwnership(t){if(m.info(`Setting ownership of object ${this.owner.getName()} (networkId: ${this.owner.networkId} to player ${t}.`),t<0){d.error("Invalid player number ("+t+") when setting ownership of an object.");return}const n=this.playerNumber;this.playerNumber=t;const e=a.multiplayer.getCurrentPlayerNumber();if(!a.multiplayer.isLobbyGameRunning())return;let r=this.owner.networkId;if(!r){if(m.info("Object has no networkId, we change the ownership locally, but it will not be synchronized yet if we are not the owner."),t!==e)return;m.info("We are the new owner, creating a networkId for the object."),r=this._getOrCreateInstanceNetworkId()}const i=this.owner.getRuntimeScene().networkId;if(!i)return;const c=this.owner.getName(),{messageName:s,messageData:o}=a.multiplayerMessageManager.createChangeInstanceOwnerMessage({objectOwner:n,objectName:c,instanceNetworkId:r,newObjectOwner:t,instanceX:this.owner.getX(),instanceY:this.owner.getY(),sceneNetworkId:i});if(t===e){const l=a.multiplayerPeerJsHelper.getAllPeers(),y=a.multiplayerMessageManager.createInstanceOwnerChangedMessageNameFromChangeInstanceOwnerMessage(s);a.multiplayerMessageManager.addExpectedMessageAcknowledgement({originalMessageName:s,originalData:{...o,_clock:this._clock+1},expectedMessageName:y,otherPeerIds:l,shouldCancelMessageIfTimesOut:!a.multiplayer.isCurrentPlayerHost()})}if(m.info("Sending change owner message",s),this._sendDataToPeersWithIncreasedClock(s,o),t===e){m.info("Sending update message to move the object immediately.");const l=this.owner.getNetworkSyncData(),{messageName:y,messageData:h}=a.multiplayerMessageManager.createUpdateInstanceMessage({objectOwner:this.playerNumber,objectName:c,instanceNetworkId:r,objectNetworkSyncData:l,sceneNetworkId:i});this._sendDataToPeersWithIncreasedClock(y,h)}}getPlayerObjectOwnership(){return this.playerNumber}isObjectOwnedByCurrentPlayer(){return this._isOwnerAsPlayerOrHost()}removeObjectOwnership(){this.setPlayerObjectOwnership(0)}takeObjectOwnership(){this.setPlayerObjectOwnership(a.multiplayer.getCurrentPlayerNumber())}getActionOnPlayerDisconnect(){return this.actionOnPlayerDisconnect}enableBehaviorSynchronization(t,n){const e=this.owner.getBehavior(t);if(!e){d.error(`Behavior ${t} does not exist on object ${this.owner.getName()}.`);return}e.enableSynchronization(n)}}a.MultiplayerObjectRuntimeBehavior=g,a.registerBehavior("Multiplayer::MultiplayerObjectBehavior",a.MultiplayerObjectRuntimeBehavior)})(gdjs||(gdjs={}));
1
+ var gdjs;(function(a){const d=new a.Logger("Multiplayer"),m=new a.Logger("Multiplayer - Debug"),f=window.performance&&typeof window.performance.now=="function"?window.performance.now.bind(window.performance):Date.now;class g extends a.RuntimeBehavior{constructor(t,n,e){super(t,n,e);this.playerNumber=0;this._lastObjectSyncTimestamp=0;this._lastBasicObjectSyncTimestamp=0;this._objectBasicInfoSyncRate=5;this._numberOfForcedBasicObjectUpdates=0;this._lastVariablesSyncTimestamp=0;this._variablesSyncRate=1;this._numberOfForcedVariablesUpdates=0;this._lastEffectsSyncTimestamp=0;this._effectsSyncRate=1;this._numberOfForcedEffectsUpdates=0;this._lastLogTimestamp=0;this._logSyncRate=1;this._clock=0;this._destroyInstanceTimeoutId=null;this._timeBeforeDestroyingObjectWithoutNetworkIdInMs=500;this._sendDataToPeersWithIncreasedClock=async(t,n)=>{this._clock++,n._clock=this._clock;const e=a.multiplayerPeerJsHelper.getAllPeers();await a.multiplayerMessageManager.sendDataTo(e,t,n)};this.playerNumber=n.playerNumber==="Host"?0:parseInt(n.playerNumber,10),this.actionOnPlayerDisconnect=n.actionOnPlayerDisconnect,this._destroyInstanceTimeoutId=setTimeout(()=>{const r=this.owner.getRuntimeScene().networkId;!e.networkId&&a.multiplayer.isLobbyGameRunning()&&r&&(m.info(`Lobby game is running on a synced scene and object ${e.getName()} has not been assigned a networkId after a short delay, destroying it.`),e.deleteFromScene())},this._timeBeforeDestroyingObjectWithoutNetworkIdInMs)}_isOwnerAsPlayerOrHost(){const t=a.multiplayer.getCurrentPlayerNumber(),n=a.multiplayer.isCurrentPlayerHost();return t===this.playerNumber||n&&this.playerNumber===0}_hasObjectBeenSyncedWithinMaxRate(){const t=a.multiplayer.getObjectsSynchronizationRate();return f()-this._lastObjectSyncTimestamp<1e3/t}_hasObjectBasicInfoBeenSyncedRecently(){return f()-this._lastBasicObjectSyncTimestamp<1e3/this._objectBasicInfoSyncRate}_haveVariablesBeenSyncedRecently(){return f()-this._lastVariablesSyncTimestamp<1e3/this._variablesSyncRate}_haveEffectsBeenSyncedRecently(){return f()-this._lastEffectsSyncTimestamp<1e3/this._effectsSyncRate}_getOrCreateInstanceNetworkId(){if(!this.owner.networkId){const t=a.makeUuid().substring(0,8);this.owner.networkId=t}return this.owner.networkId}_isBasicObjectNetworkSyncDataDifferentFromLastSync(t){return this._lastSentBasicObjectSyncData?JSON.stringify(t)!==JSON.stringify(this._lastSentBasicObjectSyncData):!0}_areVariablesDifferentFromLastSync(t){return this._lastSentVariableSyncData?JSON.stringify(t)!==JSON.stringify(this._lastSentVariableSyncData):!0}_areEffectsDifferentFromLastSync(t){if(!this._lastSentEffectSyncData)return!0;for(const n in t){if(!t.hasOwnProperty(n))continue;const e=t[n],r=e.ena,i=e.fc,c=this._lastSentEffectSyncData[n];if(!c||c.ena!==r)return!0;for(const s in i){if(!i.hasOwnProperty(s))continue;const o=i[s];if(c.fc[s]!==o)return!0}}return!1}doStepPostEvents(){if(!a.multiplayer.isLobbyGameRunning())return;if(this.actionOnPlayerDisconnect!=="DoNothing"&&this.playerNumber!==0&&!a.multiplayerMessageManager.isPlayerConnected(this.playerNumber)){m.info(`Player number ${this.playerNumber} does not exist in the lobby at the moment. Destroying the object.`),this.owner.deleteFromScene();return}if(!this._isOwnerAsPlayerOrHost()||this._hasObjectBeenSyncedWithinMaxRate())return;const t=this._getOrCreateInstanceNetworkId(),n=this.owner.getName(),e=this.owner.getNetworkSyncData({}),r=this._isBasicObjectNetworkSyncDataDifferentFromLastSync({x:e.x,y:e.y,z:e.z,w:e.w,h:e.h,zo:e.zo,a:e.a,hid:e.hid,lay:e.lay,if:e.if,pfx:e.pfx,pfy:e.pfy}),i=!this._hasObjectBasicInfoBeenSyncedRecently()||r||this._numberOfForcedBasicObjectUpdates>0;if(r&&(this._numberOfForcedBasicObjectUpdates=3),!i)return;const c=e.var&&this._areVariablesDifferentFromLastSync(e.var),s=!this._haveVariablesBeenSyncedRecently()||c||this._numberOfForcedVariablesUpdates>0;c&&(this._numberOfForcedVariablesUpdates=3),s||delete e.var;const o=e.eff&&this._areEffectsDifferentFromLastSync(e.eff),l=!this._haveEffectsBeenSyncedRecently()||o||this._numberOfForcedEffectsUpdates>0;o&&(this._numberOfForcedEffectsUpdates=3),l||delete e.eff;const y=this.owner.getRuntimeScene().networkId;if(!y)return;const{messageName:h,messageData:b}=a.multiplayerMessageManager.createUpdateInstanceMessage({objectOwner:this.playerNumber,objectName:n,instanceNetworkId:t,objectNetworkSyncData:e,sceneNetworkId:y});this._sendDataToPeersWithIncreasedClock(h,b);const u=f();this._lastObjectSyncTimestamp=u,i&&(this._lastBasicObjectSyncTimestamp=u,this._lastSentBasicObjectSyncData={x:e.x,y:e.y,z:e.z,w:e.w,h:e.h,zo:e.zo,a:e.a,hid:e.hid,lay:e.lay,if:e.if,pfx:e.pfx,pfy:e.pfy},this._numberOfForcedBasicObjectUpdates=Math.max(this._numberOfForcedBasicObjectUpdates-1,0)),s&&(this._lastVariablesSyncTimestamp=u,this._lastSentVariableSyncData=e.var,this._numberOfForcedVariablesUpdates=Math.max(this._numberOfForcedVariablesUpdates-1,0)),l&&(this._lastEffectsSyncTimestamp=u,this._lastSentEffectSyncData=e.eff,this._numberOfForcedEffectsUpdates=Math.max(this._numberOfForcedEffectsUpdates-1,0))}onDestroy(){if(this._destroyInstanceTimeoutId&&(clearTimeout(this._destroyInstanceTimeoutId),this._destroyInstanceTimeoutId=null),!a.multiplayer.isLobbyGameRunning()||!this._isOwnerAsPlayerOrHost()&&!a.multiplayer.isCurrentPlayerHost())return;const t=this.owner.networkId,n=this.owner.getName();if(!t){m.info(`Destroying object ${n} without networkId, no need to send a message.`);return}const e=this.owner.getRuntimeScene().networkId;if(!e)return;const{messageName:r,messageData:i}=a.multiplayerMessageManager.createUpdateInstanceMessage({objectOwner:this.playerNumber,objectName:n,instanceNetworkId:t,objectNetworkSyncData:this.owner.getNetworkSyncData({}),sceneNetworkId:e});this._sendDataToPeersWithIncreasedClock(r,i);const c=a.multiplayerPeerJsHelper.getAllPeers(),{messageName:s,messageData:o}=a.multiplayerMessageManager.createDestroyInstanceMessage({objectOwner:this.playerNumber,objectName:n,instanceNetworkId:t,sceneNetworkId:e}),l=a.multiplayerMessageManager.createInstanceDestroyedMessageNameFromDestroyInstanceMessage(s);a.multiplayerMessageManager.addExpectedMessageAcknowledgement({originalMessageName:s,originalData:{...o,_clock:this._clock+1},expectedMessageName:l,otherPeerIds:c,shouldCancelMessageIfTimesOut:!1}),this._sendDataToPeersWithIncreasedClock(s,o)}setPlayerObjectOwnership(t){if(m.info(`Setting ownership of object ${this.owner.getName()} (networkId: ${this.owner.networkId} to player ${t}.`),t<0){d.error("Invalid player number ("+t+") when setting ownership of an object.");return}const n=this.playerNumber;this.playerNumber=t;const e=a.multiplayer.getCurrentPlayerNumber();if(!a.multiplayer.isLobbyGameRunning())return;let r=this.owner.networkId;if(!r){if(m.info("Object has no networkId, we change the ownership locally, but it will not be synchronized yet if we are not the owner."),t!==e)return;m.info("We are the new owner, creating a networkId for the object."),r=this._getOrCreateInstanceNetworkId()}const i=this.owner.getRuntimeScene().networkId;if(!i)return;const c=this.owner.getName(),{messageName:s,messageData:o}=a.multiplayerMessageManager.createChangeInstanceOwnerMessage({objectOwner:n,objectName:c,instanceNetworkId:r,newObjectOwner:t,instanceX:this.owner.getX(),instanceY:this.owner.getY(),sceneNetworkId:i});if(t===e){const l=a.multiplayerPeerJsHelper.getAllPeers(),y=a.multiplayerMessageManager.createInstanceOwnerChangedMessageNameFromChangeInstanceOwnerMessage(s);a.multiplayerMessageManager.addExpectedMessageAcknowledgement({originalMessageName:s,originalData:{...o,_clock:this._clock+1},expectedMessageName:y,otherPeerIds:l,shouldCancelMessageIfTimesOut:!a.multiplayer.isCurrentPlayerHost()})}if(m.info("Sending change owner message",s),this._sendDataToPeersWithIncreasedClock(s,o),t===e){m.info("Sending update message to move the object immediately.");const l=this.owner.getNetworkSyncData({}),{messageName:y,messageData:h}=a.multiplayerMessageManager.createUpdateInstanceMessage({objectOwner:this.playerNumber,objectName:c,instanceNetworkId:r,objectNetworkSyncData:l,sceneNetworkId:i});this._sendDataToPeersWithIncreasedClock(y,h)}}getPlayerObjectOwnership(){return this.playerNumber}isObjectOwnedByCurrentPlayer(){return this._isOwnerAsPlayerOrHost()}removeObjectOwnership(){this.setPlayerObjectOwnership(0)}takeObjectOwnership(){this.setPlayerObjectOwnership(a.multiplayer.getCurrentPlayerNumber())}getActionOnPlayerDisconnect(){return this.actionOnPlayerDisconnect}enableBehaviorSynchronization(t,n){const e=this.owner.getBehavior(t);if(!e){d.error(`Behavior ${t} does not exist on object ${this.owner.getName()}.`);return}e.enableSynchronization(n)}}a.MultiplayerObjectRuntimeBehavior=g,a.registerBehavior("Multiplayer::MultiplayerObjectBehavior",a.MultiplayerObjectRuntimeBehavior)})(gdjs||(gdjs={}));
2
2
  //# sourceMappingURL=multiplayerobjectruntimebehavior.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../GDevelop/Extensions/Multiplayer/multiplayerobjectruntimebehavior.ts"],
4
- "sourcesContent": ["/*\n GDevelop - Multiplayer Object Behavior Extension\n Copyright (c) 2013-2016 Florian Rival (Florian.Rival@gmail.com)\n*/\n\nnamespace gdjs {\n const logger = new gdjs.Logger('Multiplayer');\n const debugLogger = new gdjs.Logger('Multiplayer - Debug');\n const getTimeNow =\n window.performance && typeof window.performance.now === 'function'\n ? window.performance.now.bind(window.performance)\n : Date.now;\n\n /**\n * The MultiplayerObjectRuntimeBehavior represents a behavior that can be added to objects\n * to make them synchronized over the network.\n */\n export class MultiplayerObjectRuntimeBehavior extends gdjs.RuntimeBehavior {\n // Which player is the owner of the object.\n // If 0, then the object is not owned by any player, so the host is the owner.\n playerNumber: number = 0;\n\n // The action to be executed when the player disconnects.\n actionOnPlayerDisconnect: string;\n\n // The last time the object has been synchronized.\n // This is to avoid synchronizing the object too often, see _objectMaxSyncRate.\n _lastObjectSyncTimestamp: number = 0;\n\n // The last time the basic object info has been synchronized.\n _lastBasicObjectSyncTimestamp: number = 0;\n // The number of times per second the object basic info should be synchronized when it doesn't change.\n _objectBasicInfoSyncRate: number = 5;\n // The last data sent to synchronize the basic info of the object.\n _lastSentBasicObjectSyncData: BasicObjectNetworkSyncData | undefined;\n // When we know that the basic info of the object has been updated, we can force sending them\n // on the max SyncRate for a number of times to ensure they are received, without the need of an acknowledgment.\n _numberOfForcedBasicObjectUpdates: number = 0;\n\n // The last time the variables have been synchronized.\n _lastVariablesSyncTimestamp: number = 0;\n // The number of times per second the variables should be synchronized.\n _variablesSyncRate: number = 1;\n // The last data sent to synchronize the variables.\n _lastSentVariableSyncData: VariableNetworkSyncData[] | undefined;\n // When we know that the variables have been updated, we can force sending them\n // on the same syncRate as the object update for a number of times\n // to ensure they are received, without the need of an acknowledgment.\n _numberOfForcedVariablesUpdates: number = 0;\n\n // The last time the effects have been synchronized.\n _lastEffectsSyncTimestamp: number = 0;\n // The number of times per second the effects should be synchronized.\n _effectsSyncRate: number = 1;\n // The last data sent to synchronize the effects.\n _lastSentEffectSyncData:\n | { [effectName: string]: EffectNetworkSyncData }\n | undefined;\n // When we know that the effects have been updated, we can force sending them\n // on the same syncRate as the object update for a number of times\n // to ensure they are received, without the need of an acknowledgment.\n _numberOfForcedEffectsUpdates: number = 0;\n\n // To avoid seeing too many logs.\n _lastLogTimestamp: number = 0;\n _logSyncRate: number = 1;\n // Clock to be incremented every time we send a message, to ensure they are ordered\n // and old messages are ignored.\n _clock: number = 0;\n _destroyInstanceTimeoutId: NodeJS.Timeout | null = null;\n _timeBeforeDestroyingObjectWithoutNetworkIdInMs = 500;\n\n constructor(\n instanceContainer: gdjs.RuntimeInstanceContainer,\n behaviorData,\n owner: RuntimeObject\n ) {\n super(instanceContainer, behaviorData, owner);\n this.playerNumber =\n behaviorData.playerNumber === 'Host'\n ? 0\n : parseInt(behaviorData.playerNumber, 10);\n this.actionOnPlayerDisconnect = behaviorData.actionOnPlayerDisconnect;\n\n // When a synchronized object is created, we assume it will be assigned a networkId quickly if:\n // - It is a new object created by the current player. -> will be assigned a networkId when sending the update message.\n // - It is an object created by another player. -> will be assigned a networkId when receiving the update message.\n // There is a small risk that the object is created by us after we receive an update message from the host,\n // ending up with 2 objects created, one with a networkId (from the host) and one without (from us).\n // To handle this case and avoid having an object not synchronized, we set a timeout to destroy the object\n // if it has not been assigned a networkId after a short delay.\n this._destroyInstanceTimeoutId = setTimeout(() => {\n const sceneNetworkId = this.owner.getRuntimeScene().networkId;\n if (\n !owner.networkId &&\n gdjs.multiplayer.isLobbyGameRunning() &&\n sceneNetworkId\n ) {\n debugLogger.info(\n `Lobby game is running on a synced scene and object ${owner.getName()} has not been assigned a networkId after a short delay, destroying it.`\n );\n owner.deleteFromScene();\n }\n }, this._timeBeforeDestroyingObjectWithoutNetworkIdInMs);\n }\n\n private _sendDataToPeersWithIncreasedClock = async (\n messageName: string,\n data: Object\n ) => {\n this._clock++;\n data['_clock'] = this._clock;\n const connectedPeerIds = gdjs.multiplayerPeerJsHelper.getAllPeers();\n await gdjs.multiplayerMessageManager.sendDataTo(\n connectedPeerIds,\n messageName,\n data\n );\n };\n\n private _isOwnerAsPlayerOrHost() {\n const currentPlayerNumber = gdjs.multiplayer.getCurrentPlayerNumber();\n const isHost = gdjs.multiplayer.isCurrentPlayerHost();\n\n const isOwnerOfObject =\n currentPlayerNumber === this.playerNumber || // Player as owner.\n (isHost && this.playerNumber === 0); // Host as owner.\n\n return isOwnerOfObject;\n }\n\n private _hasObjectBeenSyncedWithinMaxRate() {\n const objectMaxSyncRate =\n gdjs.multiplayer.getObjectsSynchronizationRate();\n return (\n getTimeNow() - this._lastObjectSyncTimestamp < 1000 / objectMaxSyncRate\n );\n }\n\n private _hasObjectBasicInfoBeenSyncedRecently() {\n return (\n getTimeNow() - this._lastBasicObjectSyncTimestamp <\n 1000 / this._objectBasicInfoSyncRate\n );\n }\n\n private _haveVariablesBeenSyncedRecently() {\n return (\n getTimeNow() - this._lastVariablesSyncTimestamp <\n 1000 / this._variablesSyncRate\n );\n }\n\n private _haveEffectsBeenSyncedRecently() {\n return (\n getTimeNow() - this._lastEffectsSyncTimestamp <\n 1000 / this._effectsSyncRate\n );\n }\n\n // private _logToConsoleWithThrottle(message: string) {\n // if (getTimeNow() - this._lastLogTimestamp > 1000 / this._logSyncRate) {\n // logger.info(message);\n // this._lastLogTimestamp = getTimeNow();\n // }\n // }\n\n private _getOrCreateInstanceNetworkId() {\n if (!this.owner.networkId) {\n // No ID for this object, let's generate one so it can be identified by other players.\n // Keep it short to avoid sending too much data.\n const newID = gdjs.makeUuid().substring(0, 8);\n this.owner.networkId = newID;\n }\n\n return this.owner.networkId;\n }\n\n private _isBasicObjectNetworkSyncDataDifferentFromLastSync(\n basicObjectNetworkSyncData: BasicObjectNetworkSyncData\n ) {\n if (!this._lastSentBasicObjectSyncData) {\n return true;\n }\n\n // Compare the json of the basicObjectNetworkSyncData to check if they are different.\n // This is not the most efficient way to do it, but it's simple and should work.\n const haveBasicObjectNetworkSyncDataChanged =\n JSON.stringify(basicObjectNetworkSyncData) !==\n JSON.stringify(this._lastSentBasicObjectSyncData);\n\n return haveBasicObjectNetworkSyncDataChanged;\n }\n\n private _areVariablesDifferentFromLastSync(\n variablesSyncData: VariableNetworkSyncData[]\n ) {\n if (!this._lastSentVariableSyncData) {\n return true;\n }\n\n // Compare the json of the variables to check if they are different.\n // This is not the most efficient way to do it, but it's simple and should work.\n const haveVariableSyncDataChanged =\n JSON.stringify(variablesSyncData) !==\n JSON.stringify(this._lastSentVariableSyncData);\n\n return haveVariableSyncDataChanged;\n }\n\n private _areEffectsDifferentFromLastSync(effectsSyncData: {\n [effectName: string]: EffectNetworkSyncData;\n }) {\n if (!this._lastSentEffectSyncData) {\n return true;\n }\n\n for (const effectName in effectsSyncData) {\n if (!effectsSyncData.hasOwnProperty(effectName)) {\n continue;\n }\n\n const effectSyncData = effectsSyncData[effectName];\n const effectEnabled = effectSyncData.ena;\n const effectFilterCreator = effectSyncData.fc;\n\n const effectInLastSync = this._lastSentEffectSyncData[effectName];\n\n if (!effectInLastSync || effectInLastSync.ena !== effectEnabled) {\n return true;\n }\n\n for (const parameterName in effectFilterCreator) {\n if (!effectFilterCreator.hasOwnProperty(parameterName)) {\n continue;\n }\n\n const parameterValue = effectFilterCreator[parameterName];\n const lastParameterValueSent = effectInLastSync.fc[parameterName];\n if (lastParameterValueSent !== parameterValue) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n doStepPostEvents() {\n // Before doing anything, check if the game is running, if not, return.\n if (!gdjs.multiplayer.isLobbyGameRunning()) {\n return;\n }\n\n // If game is running and the object belongs to a player who is not connected, destroy the object.\n // As the game may create objects before the lobby game starts, we don't want to destroy them if it's not running.\n if (\n this.actionOnPlayerDisconnect !== 'DoNothing' && // Should not delete if flagged as such.\n this.playerNumber !== 0 && // Host is always connected.\n !gdjs.multiplayerMessageManager.isPlayerConnected(this.playerNumber)\n ) {\n debugLogger.info(\n `Player number ${this.playerNumber} does not exist in the lobby at the moment. Destroying the object.`\n );\n this.owner.deleteFromScene();\n return;\n }\n\n if (!this._isOwnerAsPlayerOrHost()) {\n return;\n }\n\n // If the object has been synchronized recently at the max rate, then return.\n // This is to avoid sending data on every frame, which would be too much.\n if (this._hasObjectBeenSyncedWithinMaxRate()) {\n return;\n }\n\n const instanceNetworkId = this._getOrCreateInstanceNetworkId();\n const objectName = this.owner.getName();\n const objectNetworkSyncData = this.owner.getNetworkSyncData();\n\n // this._logToConsoleWithThrottle(\n // `Synchronizing object ${this.owner.getName()} (instance ${\n // this.owner.networkId\n // }) with player ${this.playerNumber} and data ${JSON.stringify(\n // objectNetworkSyncData\n // )}`\n // );\n\n const areBasicObjectNetworkSyncDataDifferent =\n this._isBasicObjectNetworkSyncDataDifferentFromLastSync({\n x: objectNetworkSyncData.x,\n y: objectNetworkSyncData.y,\n z: objectNetworkSyncData.z,\n w: objectNetworkSyncData.w,\n h: objectNetworkSyncData.h,\n zo: objectNetworkSyncData.zo,\n a: objectNetworkSyncData.a,\n hid: objectNetworkSyncData.hid,\n lay: objectNetworkSyncData.lay,\n if: objectNetworkSyncData.if,\n pfx: objectNetworkSyncData.pfx,\n pfy: objectNetworkSyncData.pfy,\n });\n const shouldSyncObjectBasicInfo =\n !this._hasObjectBasicInfoBeenSyncedRecently() ||\n areBasicObjectNetworkSyncDataDifferent ||\n this._numberOfForcedBasicObjectUpdates > 0;\n if (areBasicObjectNetworkSyncDataDifferent) {\n this._numberOfForcedBasicObjectUpdates = 3;\n }\n if (!shouldSyncObjectBasicInfo) {\n // If the basic info has not changed, assume we don't need to sync the whole object data at a high rate.\n // TODO: allow sending the variables, behaviors and effects still?\n return;\n }\n\n const areVariablesDifferent =\n objectNetworkSyncData.var &&\n this._areVariablesDifferentFromLastSync(objectNetworkSyncData.var);\n const shouldSyncVariables =\n !this._haveVariablesBeenSyncedRecently() ||\n areVariablesDifferent ||\n this._numberOfForcedVariablesUpdates > 0;\n if (areVariablesDifferent) {\n this._numberOfForcedVariablesUpdates = 3;\n }\n if (!shouldSyncVariables) {\n delete objectNetworkSyncData.var;\n }\n\n const areEffectsDifferent =\n objectNetworkSyncData.eff &&\n this._areEffectsDifferentFromLastSync(objectNetworkSyncData.eff);\n const shoundSyncEffects =\n !this._haveEffectsBeenSyncedRecently() ||\n areEffectsDifferent ||\n this._numberOfForcedEffectsUpdates > 0;\n if (areEffectsDifferent) {\n this._numberOfForcedEffectsUpdates = 3;\n }\n if (!shoundSyncEffects) {\n delete objectNetworkSyncData.eff;\n }\n\n const sceneNetworkId = this.owner.getRuntimeScene().networkId;\n if (!sceneNetworkId) {\n // No networkId for the scene yet, it will be set soon, let's not sync the object yet.\n return;\n }\n\n const { messageName: updateMessageName, messageData: updateMessageData } =\n gdjs.multiplayerMessageManager.createUpdateInstanceMessage({\n objectOwner: this.playerNumber,\n objectName,\n instanceNetworkId,\n objectNetworkSyncData,\n sceneNetworkId,\n });\n this._sendDataToPeersWithIncreasedClock(\n updateMessageName,\n updateMessageData\n );\n\n const now = getTimeNow();\n\n this._lastObjectSyncTimestamp = now;\n if (shouldSyncObjectBasicInfo) {\n this._lastBasicObjectSyncTimestamp = now;\n this._lastSentBasicObjectSyncData = {\n x: objectNetworkSyncData.x,\n y: objectNetworkSyncData.y,\n z: objectNetworkSyncData.z,\n w: objectNetworkSyncData.w,\n h: objectNetworkSyncData.h,\n zo: objectNetworkSyncData.zo,\n a: objectNetworkSyncData.a,\n hid: objectNetworkSyncData.hid,\n lay: objectNetworkSyncData.lay,\n if: objectNetworkSyncData.if,\n pfx: objectNetworkSyncData.pfx,\n pfy: objectNetworkSyncData.pfy,\n };\n this._numberOfForcedBasicObjectUpdates = Math.max(\n this._numberOfForcedBasicObjectUpdates - 1,\n 0\n );\n }\n if (shouldSyncVariables) {\n this._lastVariablesSyncTimestamp = now;\n this._lastSentVariableSyncData = objectNetworkSyncData.var;\n this._numberOfForcedVariablesUpdates = Math.max(\n this._numberOfForcedVariablesUpdates - 1,\n 0\n );\n }\n if (shoundSyncEffects) {\n this._lastEffectsSyncTimestamp = now;\n this._lastSentEffectSyncData = objectNetworkSyncData.eff;\n this._numberOfForcedEffectsUpdates = Math.max(\n this._numberOfForcedEffectsUpdates - 1,\n 0\n );\n }\n }\n\n onDestroy() {\n if (this._destroyInstanceTimeoutId) {\n clearTimeout(this._destroyInstanceTimeoutId);\n this._destroyInstanceTimeoutId = null;\n }\n\n // If the lobby game is not running, no need to send a message to destroy the object.\n if (!gdjs.multiplayer.isLobbyGameRunning()) {\n return;\n }\n\n // For destruction of objects, we allow the host to destroy the object even if it is not the owner.\n // This is particularly helpful when a player disconnects, so the host can destroy the object they were owning.\n if (\n !this._isOwnerAsPlayerOrHost() &&\n !gdjs.multiplayer.isCurrentPlayerHost()\n ) {\n return;\n }\n\n const instanceNetworkId = this.owner.networkId;\n const objectName = this.owner.getName();\n\n // If it had no networkId, then it was not synchronized and we don't need to send a message.\n if (!instanceNetworkId) {\n debugLogger.info(\n `Destroying object ${objectName} without networkId, no need to send a message.`\n );\n return;\n }\n\n const sceneNetworkId = this.owner.getRuntimeScene().networkId;\n if (!sceneNetworkId) {\n // No networkId for the scene yet, it will be set soon, let's not sync the object yet.\n return;\n }\n\n // Ensure we send a final update before the object is destroyed, if it had a networkId.\n const { messageName: updateMessageName, messageData: updateMessageData } =\n gdjs.multiplayerMessageManager.createUpdateInstanceMessage({\n objectOwner: this.playerNumber,\n objectName,\n instanceNetworkId,\n objectNetworkSyncData: this.owner.getNetworkSyncData(),\n sceneNetworkId,\n });\n this._sendDataToPeersWithIncreasedClock(\n updateMessageName,\n updateMessageData\n );\n\n // Before sending the destroy message, we set up the object representing the peers\n // that we need an acknowledgment from.\n // If we are the host, we are connected to everyone, so we expect an acknowledgment from everyone.\n // If we are another player, we are only connected to the host, so we expect an acknowledgment from the host.\n // In both cases, this represents the list of peers the current user is connected to.\n const otherPeerIds = gdjs.multiplayerPeerJsHelper.getAllPeers();\n const {\n messageName: destroyMessageName,\n messageData: destroyMessageData,\n } = gdjs.multiplayerMessageManager.createDestroyInstanceMessage({\n objectOwner: this.playerNumber,\n objectName,\n instanceNetworkId,\n sceneNetworkId,\n });\n const destroyedMessageName =\n gdjs.multiplayerMessageManager.createInstanceDestroyedMessageNameFromDestroyInstanceMessage(\n destroyMessageName\n );\n gdjs.multiplayerMessageManager.addExpectedMessageAcknowledgement({\n originalMessageName: destroyMessageName,\n originalData: {\n ...destroyMessageData,\n // As the method `sendDataToPeersWithIncreasedClock` will increment the clock,\n // we increment it here to ensure we can resend the same message if we don't receive an acknowledgment.\n _clock: this._clock + 1,\n },\n expectedMessageName: destroyedMessageName,\n otherPeerIds,\n // Destruction of objects are not reverted, as they will eventually be recreated by an update message.\n shouldCancelMessageIfTimesOut: false,\n });\n\n this._sendDataToPeersWithIncreasedClock(\n destroyMessageName,\n destroyMessageData\n );\n }\n\n setPlayerObjectOwnership(newObjectPlayerNumber: number) {\n debugLogger.info(\n `Setting ownership of object ${this.owner.getName()} (networkId: ${\n this.owner.networkId\n } to player ${newObjectPlayerNumber}.`\n );\n if (newObjectPlayerNumber < 0) {\n logger.error(\n 'Invalid player number (' +\n newObjectPlayerNumber +\n ') when setting ownership of an object.'\n );\n return;\n }\n\n // Update the ownership locally, so the object can be used immediately.\n // This is a prediction to allow snappy interactions.\n // If we are host, we will have the ownership immediately anyway.\n // If we are another player, we will have the ownership as soon as the host acknowledges the change.\n // If the host does not send an acknowledgment, we will revert the ownership.\n const previousObjectPlayerNumber = this.playerNumber;\n this.playerNumber = newObjectPlayerNumber;\n const currentPlayerNumber = gdjs.multiplayer.getCurrentPlayerNumber();\n\n // If the lobby game is not running, do not try to update the ownership over the network,\n // as the game may create & update objects before the lobby game starts.\n if (!gdjs.multiplayer.isLobbyGameRunning()) {\n return;\n }\n\n let instanceNetworkId = this.owner.networkId;\n if (!instanceNetworkId) {\n debugLogger.info(\n 'Object has no networkId, we change the ownership locally, but it will not be synchronized yet if we are not the owner.'\n );\n if (newObjectPlayerNumber !== currentPlayerNumber) {\n // If we are not the new owner, we should not send a message to the host to change the ownership.\n // Just return and wait to receive an update message to reconcile this object.\n return;\n }\n // If we don't have a networkId, we need to create one now that we are the owner.\n // We are probably in a case where we created the object and then changed the ownership.\n debugLogger.info(\n 'We are the new owner, creating a networkId for the object.'\n );\n instanceNetworkId = this._getOrCreateInstanceNetworkId();\n }\n\n const sceneNetworkId = this.owner.getRuntimeScene().networkId;\n if (!sceneNetworkId) {\n // No networkId for the scene yet, it will be set soon, let's not sync the object yet.\n return;\n }\n\n const objectName = this.owner.getName();\n\n // When changing the ownership of an object with a networkId, we send a message to the host to ensure it is aware of the change,\n // and can either accept it and broadcast it to other players, or reject it and do nothing with it.\n // We expect an acknowledgment from the host, if not, we will retry and eventually revert the ownership.\n const { messageName, messageData } =\n gdjs.multiplayerMessageManager.createChangeInstanceOwnerMessage({\n objectOwner: previousObjectPlayerNumber,\n objectName,\n instanceNetworkId,\n newObjectOwner: newObjectPlayerNumber,\n instanceX: this.owner.getX(),\n instanceY: this.owner.getY(),\n sceneNetworkId,\n });\n // Before sending the changeOwner message, if we are becoming the new owner,\n // we want to ensure this message is acknowledged, by everyone we're connected to.\n // If we are the host, we are connected to everyone, so we expect an acknowledgment from everyone.\n // If we are another player, we are only connected to the host, so we expect an acknowledgment from the host.\n // In both cases, this represents the list of peers the current user is connected to.\n if (newObjectPlayerNumber === currentPlayerNumber) {\n const otherPeerIds = gdjs.multiplayerPeerJsHelper.getAllPeers();\n const changeOwnerAcknowledgedMessageName =\n gdjs.multiplayerMessageManager.createInstanceOwnerChangedMessageNameFromChangeInstanceOwnerMessage(\n messageName\n );\n gdjs.multiplayerMessageManager.addExpectedMessageAcknowledgement({\n originalMessageName: messageName,\n originalData: {\n ...messageData,\n _clock: this._clock + 1, // Will be incremented by the time the message is sent.\n },\n expectedMessageName: changeOwnerAcknowledgedMessageName,\n otherPeerIds,\n // If we are not the host, we should revert the ownership if the host does not acknowledge the change.\n shouldCancelMessageIfTimesOut:\n !gdjs.multiplayer.isCurrentPlayerHost(),\n });\n }\n\n debugLogger.info('Sending change owner message', messageName);\n this._sendDataToPeersWithIncreasedClock(messageName, messageData);\n\n // If we are the new owner, also send directly an update of the position,\n // so that the object is immediately moved on the screen and we don't wait for the next tick.\n if (newObjectPlayerNumber === currentPlayerNumber) {\n debugLogger.info(\n 'Sending update message to move the object immediately.'\n );\n const objectNetworkSyncData = this.owner.getNetworkSyncData();\n const {\n messageName: updateMessageName,\n messageData: updateMessageData,\n } = gdjs.multiplayerMessageManager.createUpdateInstanceMessage({\n objectOwner: this.playerNumber,\n objectName,\n instanceNetworkId,\n objectNetworkSyncData,\n sceneNetworkId,\n });\n this._sendDataToPeersWithIncreasedClock(\n updateMessageName,\n updateMessageData\n );\n }\n }\n\n getPlayerObjectOwnership(): number {\n return this.playerNumber;\n }\n\n isObjectOwnedByCurrentPlayer(): boolean {\n return this._isOwnerAsPlayerOrHost();\n }\n\n removeObjectOwnership() {\n // 0 means the host is the owner.\n this.setPlayerObjectOwnership(0);\n }\n\n takeObjectOwnership() {\n this.setPlayerObjectOwnership(gdjs.multiplayer.getCurrentPlayerNumber());\n }\n\n getActionOnPlayerDisconnect() {\n return this.actionOnPlayerDisconnect;\n }\n\n enableBehaviorSynchronization(behaviorName: string, enable: boolean) {\n const behavior = this.owner.getBehavior(behaviorName);\n if (!behavior) {\n logger.error(\n `Behavior ${behaviorName} does not exist on object ${this.owner.getName()}.`\n );\n return;\n }\n\n behavior.enableSynchronization(enable);\n }\n }\n gdjs.registerBehavior(\n 'Multiplayer::MultiplayerObjectBehavior',\n gdjs.MultiplayerObjectRuntimeBehavior\n );\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/*\n GDevelop - Multiplayer Object Behavior Extension\n Copyright (c) 2013-2016 Florian Rival (Florian.Rival@gmail.com)\n*/\n\nnamespace gdjs {\n const logger = new gdjs.Logger('Multiplayer');\n const debugLogger = new gdjs.Logger('Multiplayer - Debug');\n const getTimeNow =\n window.performance && typeof window.performance.now === 'function'\n ? window.performance.now.bind(window.performance)\n : Date.now;\n\n /**\n * The MultiplayerObjectRuntimeBehavior represents a behavior that can be added to objects\n * to make them synchronized over the network.\n */\n export class MultiplayerObjectRuntimeBehavior extends gdjs.RuntimeBehavior {\n // Which player is the owner of the object.\n // If 0, then the object is not owned by any player, so the host is the owner.\n playerNumber: number = 0;\n\n // The action to be executed when the player disconnects.\n actionOnPlayerDisconnect: string;\n\n // The last time the object has been synchronized.\n // This is to avoid synchronizing the object too often, see _objectMaxSyncRate.\n _lastObjectSyncTimestamp: number = 0;\n\n // The last time the basic object info has been synchronized.\n _lastBasicObjectSyncTimestamp: number = 0;\n // The number of times per second the object basic info should be synchronized when it doesn't change.\n _objectBasicInfoSyncRate: number = 5;\n // The last data sent to synchronize the basic info of the object.\n _lastSentBasicObjectSyncData: BasicObjectNetworkSyncData | undefined;\n // When we know that the basic info of the object has been updated, we can force sending them\n // on the max SyncRate for a number of times to ensure they are received, without the need of an acknowledgment.\n _numberOfForcedBasicObjectUpdates: number = 0;\n\n // The last time the variables have been synchronized.\n _lastVariablesSyncTimestamp: number = 0;\n // The number of times per second the variables should be synchronized.\n _variablesSyncRate: number = 1;\n // The last data sent to synchronize the variables.\n _lastSentVariableSyncData: VariableNetworkSyncData[] | undefined;\n // When we know that the variables have been updated, we can force sending them\n // on the same syncRate as the object update for a number of times\n // to ensure they are received, without the need of an acknowledgment.\n _numberOfForcedVariablesUpdates: number = 0;\n\n // The last time the effects have been synchronized.\n _lastEffectsSyncTimestamp: number = 0;\n // The number of times per second the effects should be synchronized.\n _effectsSyncRate: number = 1;\n // The last data sent to synchronize the effects.\n _lastSentEffectSyncData:\n | { [effectName: string]: EffectNetworkSyncData }\n | undefined;\n // When we know that the effects have been updated, we can force sending them\n // on the same syncRate as the object update for a number of times\n // to ensure they are received, without the need of an acknowledgment.\n _numberOfForcedEffectsUpdates: number = 0;\n\n // To avoid seeing too many logs.\n _lastLogTimestamp: number = 0;\n _logSyncRate: number = 1;\n // Clock to be incremented every time we send a message, to ensure they are ordered\n // and old messages are ignored.\n _clock: number = 0;\n _destroyInstanceTimeoutId: NodeJS.Timeout | null = null;\n _timeBeforeDestroyingObjectWithoutNetworkIdInMs = 500;\n\n constructor(\n instanceContainer: gdjs.RuntimeInstanceContainer,\n behaviorData,\n owner: RuntimeObject\n ) {\n super(instanceContainer, behaviorData, owner);\n this.playerNumber =\n behaviorData.playerNumber === 'Host'\n ? 0\n : parseInt(behaviorData.playerNumber, 10);\n this.actionOnPlayerDisconnect = behaviorData.actionOnPlayerDisconnect;\n\n // When a synchronized object is created, we assume it will be assigned a networkId quickly if:\n // - It is a new object created by the current player. -> will be assigned a networkId when sending the update message.\n // - It is an object created by another player. -> will be assigned a networkId when receiving the update message.\n // There is a small risk that the object is created by us after we receive an update message from the host,\n // ending up with 2 objects created, one with a networkId (from the host) and one without (from us).\n // To handle this case and avoid having an object not synchronized, we set a timeout to destroy the object\n // if it has not been assigned a networkId after a short delay.\n this._destroyInstanceTimeoutId = setTimeout(() => {\n const sceneNetworkId = this.owner.getRuntimeScene().networkId;\n if (\n !owner.networkId &&\n gdjs.multiplayer.isLobbyGameRunning() &&\n sceneNetworkId\n ) {\n debugLogger.info(\n `Lobby game is running on a synced scene and object ${owner.getName()} has not been assigned a networkId after a short delay, destroying it.`\n );\n owner.deleteFromScene();\n }\n }, this._timeBeforeDestroyingObjectWithoutNetworkIdInMs);\n }\n\n private _sendDataToPeersWithIncreasedClock = async (\n messageName: string,\n data: Object\n ) => {\n this._clock++;\n data['_clock'] = this._clock;\n const connectedPeerIds = gdjs.multiplayerPeerJsHelper.getAllPeers();\n await gdjs.multiplayerMessageManager.sendDataTo(\n connectedPeerIds,\n messageName,\n data\n );\n };\n\n private _isOwnerAsPlayerOrHost() {\n const currentPlayerNumber = gdjs.multiplayer.getCurrentPlayerNumber();\n const isHost = gdjs.multiplayer.isCurrentPlayerHost();\n\n const isOwnerOfObject =\n currentPlayerNumber === this.playerNumber || // Player as owner.\n (isHost && this.playerNumber === 0); // Host as owner.\n\n return isOwnerOfObject;\n }\n\n private _hasObjectBeenSyncedWithinMaxRate() {\n const objectMaxSyncRate =\n gdjs.multiplayer.getObjectsSynchronizationRate();\n return (\n getTimeNow() - this._lastObjectSyncTimestamp < 1000 / objectMaxSyncRate\n );\n }\n\n private _hasObjectBasicInfoBeenSyncedRecently() {\n return (\n getTimeNow() - this._lastBasicObjectSyncTimestamp <\n 1000 / this._objectBasicInfoSyncRate\n );\n }\n\n private _haveVariablesBeenSyncedRecently() {\n return (\n getTimeNow() - this._lastVariablesSyncTimestamp <\n 1000 / this._variablesSyncRate\n );\n }\n\n private _haveEffectsBeenSyncedRecently() {\n return (\n getTimeNow() - this._lastEffectsSyncTimestamp <\n 1000 / this._effectsSyncRate\n );\n }\n\n // private _logToConsoleWithThrottle(message: string) {\n // if (getTimeNow() - this._lastLogTimestamp > 1000 / this._logSyncRate) {\n // logger.info(message);\n // this._lastLogTimestamp = getTimeNow();\n // }\n // }\n\n private _getOrCreateInstanceNetworkId() {\n if (!this.owner.networkId) {\n // No ID for this object, let's generate one so it can be identified by other players.\n // Keep it short to avoid sending too much data.\n const newID = gdjs.makeUuid().substring(0, 8);\n this.owner.networkId = newID;\n }\n\n return this.owner.networkId;\n }\n\n private _isBasicObjectNetworkSyncDataDifferentFromLastSync(\n basicObjectNetworkSyncData: BasicObjectNetworkSyncData\n ) {\n if (!this._lastSentBasicObjectSyncData) {\n return true;\n }\n\n // Compare the json of the basicObjectNetworkSyncData to check if they are different.\n // This is not the most efficient way to do it, but it's simple and should work.\n const haveBasicObjectNetworkSyncDataChanged =\n JSON.stringify(basicObjectNetworkSyncData) !==\n JSON.stringify(this._lastSentBasicObjectSyncData);\n\n return haveBasicObjectNetworkSyncDataChanged;\n }\n\n private _areVariablesDifferentFromLastSync(\n variablesSyncData: VariableNetworkSyncData[]\n ) {\n if (!this._lastSentVariableSyncData) {\n return true;\n }\n\n // Compare the json of the variables to check if they are different.\n // This is not the most efficient way to do it, but it's simple and should work.\n const haveVariableSyncDataChanged =\n JSON.stringify(variablesSyncData) !==\n JSON.stringify(this._lastSentVariableSyncData);\n\n return haveVariableSyncDataChanged;\n }\n\n private _areEffectsDifferentFromLastSync(effectsSyncData: {\n [effectName: string]: EffectNetworkSyncData;\n }) {\n if (!this._lastSentEffectSyncData) {\n return true;\n }\n\n for (const effectName in effectsSyncData) {\n if (!effectsSyncData.hasOwnProperty(effectName)) {\n continue;\n }\n\n const effectSyncData = effectsSyncData[effectName];\n const effectEnabled = effectSyncData.ena;\n const effectFilterCreator = effectSyncData.fc;\n\n const effectInLastSync = this._lastSentEffectSyncData[effectName];\n\n if (!effectInLastSync || effectInLastSync.ena !== effectEnabled) {\n return true;\n }\n\n for (const parameterName in effectFilterCreator) {\n if (!effectFilterCreator.hasOwnProperty(parameterName)) {\n continue;\n }\n\n const parameterValue = effectFilterCreator[parameterName];\n const lastParameterValueSent = effectInLastSync.fc[parameterName];\n if (lastParameterValueSent !== parameterValue) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n doStepPostEvents() {\n // Before doing anything, check if the game is running, if not, return.\n if (!gdjs.multiplayer.isLobbyGameRunning()) {\n return;\n }\n\n // If game is running and the object belongs to a player who is not connected, destroy the object.\n // As the game may create objects before the lobby game starts, we don't want to destroy them if it's not running.\n if (\n this.actionOnPlayerDisconnect !== 'DoNothing' && // Should not delete if flagged as such.\n this.playerNumber !== 0 && // Host is always connected.\n !gdjs.multiplayerMessageManager.isPlayerConnected(this.playerNumber)\n ) {\n debugLogger.info(\n `Player number ${this.playerNumber} does not exist in the lobby at the moment. Destroying the object.`\n );\n this.owner.deleteFromScene();\n return;\n }\n\n if (!this._isOwnerAsPlayerOrHost()) {\n return;\n }\n\n // If the object has been synchronized recently at the max rate, then return.\n // This is to avoid sending data on every frame, which would be too much.\n if (this._hasObjectBeenSyncedWithinMaxRate()) {\n return;\n }\n\n const instanceNetworkId = this._getOrCreateInstanceNetworkId();\n const objectName = this.owner.getName();\n const objectNetworkSyncData = this.owner.getNetworkSyncData({});\n\n // this._logToConsoleWithThrottle(\n // `Synchronizing object ${this.owner.getName()} (instance ${\n // this.owner.networkId\n // }) with player ${this.playerNumber} and data ${JSON.stringify(\n // objectNetworkSyncData\n // )}`\n // );\n\n const areBasicObjectNetworkSyncDataDifferent =\n this._isBasicObjectNetworkSyncDataDifferentFromLastSync({\n x: objectNetworkSyncData.x,\n y: objectNetworkSyncData.y,\n z: objectNetworkSyncData.z,\n w: objectNetworkSyncData.w,\n h: objectNetworkSyncData.h,\n zo: objectNetworkSyncData.zo,\n a: objectNetworkSyncData.a,\n hid: objectNetworkSyncData.hid,\n lay: objectNetworkSyncData.lay,\n if: objectNetworkSyncData.if,\n pfx: objectNetworkSyncData.pfx,\n pfy: objectNetworkSyncData.pfy,\n });\n const shouldSyncObjectBasicInfo =\n !this._hasObjectBasicInfoBeenSyncedRecently() ||\n areBasicObjectNetworkSyncDataDifferent ||\n this._numberOfForcedBasicObjectUpdates > 0;\n if (areBasicObjectNetworkSyncDataDifferent) {\n this._numberOfForcedBasicObjectUpdates = 3;\n }\n if (!shouldSyncObjectBasicInfo) {\n // If the basic info has not changed, assume we don't need to sync the whole object data at a high rate.\n // TODO: allow sending the variables, behaviors and effects still?\n return;\n }\n\n const areVariablesDifferent =\n objectNetworkSyncData.var &&\n this._areVariablesDifferentFromLastSync(objectNetworkSyncData.var);\n const shouldSyncVariables =\n !this._haveVariablesBeenSyncedRecently() ||\n areVariablesDifferent ||\n this._numberOfForcedVariablesUpdates > 0;\n if (areVariablesDifferent) {\n this._numberOfForcedVariablesUpdates = 3;\n }\n if (!shouldSyncVariables) {\n delete objectNetworkSyncData.var;\n }\n\n const areEffectsDifferent =\n objectNetworkSyncData.eff &&\n this._areEffectsDifferentFromLastSync(objectNetworkSyncData.eff);\n const shoundSyncEffects =\n !this._haveEffectsBeenSyncedRecently() ||\n areEffectsDifferent ||\n this._numberOfForcedEffectsUpdates > 0;\n if (areEffectsDifferent) {\n this._numberOfForcedEffectsUpdates = 3;\n }\n if (!shoundSyncEffects) {\n delete objectNetworkSyncData.eff;\n }\n\n const sceneNetworkId = this.owner.getRuntimeScene().networkId;\n if (!sceneNetworkId) {\n // No networkId for the scene yet, it will be set soon, let's not sync the object yet.\n return;\n }\n\n const { messageName: updateMessageName, messageData: updateMessageData } =\n gdjs.multiplayerMessageManager.createUpdateInstanceMessage({\n objectOwner: this.playerNumber,\n objectName,\n instanceNetworkId,\n objectNetworkSyncData,\n sceneNetworkId,\n });\n this._sendDataToPeersWithIncreasedClock(\n updateMessageName,\n updateMessageData\n );\n\n const now = getTimeNow();\n\n this._lastObjectSyncTimestamp = now;\n if (shouldSyncObjectBasicInfo) {\n this._lastBasicObjectSyncTimestamp = now;\n this._lastSentBasicObjectSyncData = {\n x: objectNetworkSyncData.x,\n y: objectNetworkSyncData.y,\n z: objectNetworkSyncData.z,\n w: objectNetworkSyncData.w,\n h: objectNetworkSyncData.h,\n zo: objectNetworkSyncData.zo,\n a: objectNetworkSyncData.a,\n hid: objectNetworkSyncData.hid,\n lay: objectNetworkSyncData.lay,\n if: objectNetworkSyncData.if,\n pfx: objectNetworkSyncData.pfx,\n pfy: objectNetworkSyncData.pfy,\n };\n this._numberOfForcedBasicObjectUpdates = Math.max(\n this._numberOfForcedBasicObjectUpdates - 1,\n 0\n );\n }\n if (shouldSyncVariables) {\n this._lastVariablesSyncTimestamp = now;\n this._lastSentVariableSyncData = objectNetworkSyncData.var;\n this._numberOfForcedVariablesUpdates = Math.max(\n this._numberOfForcedVariablesUpdates - 1,\n 0\n );\n }\n if (shoundSyncEffects) {\n this._lastEffectsSyncTimestamp = now;\n this._lastSentEffectSyncData = objectNetworkSyncData.eff;\n this._numberOfForcedEffectsUpdates = Math.max(\n this._numberOfForcedEffectsUpdates - 1,\n 0\n );\n }\n }\n\n onDestroy() {\n if (this._destroyInstanceTimeoutId) {\n clearTimeout(this._destroyInstanceTimeoutId);\n this._destroyInstanceTimeoutId = null;\n }\n\n // If the lobby game is not running, no need to send a message to destroy the object.\n if (!gdjs.multiplayer.isLobbyGameRunning()) {\n return;\n }\n\n // For destruction of objects, we allow the host to destroy the object even if it is not the owner.\n // This is particularly helpful when a player disconnects, so the host can destroy the object they were owning.\n if (\n !this._isOwnerAsPlayerOrHost() &&\n !gdjs.multiplayer.isCurrentPlayerHost()\n ) {\n return;\n }\n\n const instanceNetworkId = this.owner.networkId;\n const objectName = this.owner.getName();\n\n // If it had no networkId, then it was not synchronized and we don't need to send a message.\n if (!instanceNetworkId) {\n debugLogger.info(\n `Destroying object ${objectName} without networkId, no need to send a message.`\n );\n return;\n }\n\n const sceneNetworkId = this.owner.getRuntimeScene().networkId;\n if (!sceneNetworkId) {\n // No networkId for the scene yet, it will be set soon, let's not sync the object yet.\n return;\n }\n\n // Ensure we send a final update before the object is destroyed, if it had a networkId.\n const { messageName: updateMessageName, messageData: updateMessageData } =\n gdjs.multiplayerMessageManager.createUpdateInstanceMessage({\n objectOwner: this.playerNumber,\n objectName,\n instanceNetworkId,\n objectNetworkSyncData: this.owner.getNetworkSyncData({}),\n sceneNetworkId,\n });\n this._sendDataToPeersWithIncreasedClock(\n updateMessageName,\n updateMessageData\n );\n\n // Before sending the destroy message, we set up the object representing the peers\n // that we need an acknowledgment from.\n // If we are the host, we are connected to everyone, so we expect an acknowledgment from everyone.\n // If we are another player, we are only connected to the host, so we expect an acknowledgment from the host.\n // In both cases, this represents the list of peers the current user is connected to.\n const otherPeerIds = gdjs.multiplayerPeerJsHelper.getAllPeers();\n const {\n messageName: destroyMessageName,\n messageData: destroyMessageData,\n } = gdjs.multiplayerMessageManager.createDestroyInstanceMessage({\n objectOwner: this.playerNumber,\n objectName,\n instanceNetworkId,\n sceneNetworkId,\n });\n const destroyedMessageName =\n gdjs.multiplayerMessageManager.createInstanceDestroyedMessageNameFromDestroyInstanceMessage(\n destroyMessageName\n );\n gdjs.multiplayerMessageManager.addExpectedMessageAcknowledgement({\n originalMessageName: destroyMessageName,\n originalData: {\n ...destroyMessageData,\n // As the method `sendDataToPeersWithIncreasedClock` will increment the clock,\n // we increment it here to ensure we can resend the same message if we don't receive an acknowledgment.\n _clock: this._clock + 1,\n },\n expectedMessageName: destroyedMessageName,\n otherPeerIds,\n // Destruction of objects are not reverted, as they will eventually be recreated by an update message.\n shouldCancelMessageIfTimesOut: false,\n });\n\n this._sendDataToPeersWithIncreasedClock(\n destroyMessageName,\n destroyMessageData\n );\n }\n\n setPlayerObjectOwnership(newObjectPlayerNumber: number) {\n debugLogger.info(\n `Setting ownership of object ${this.owner.getName()} (networkId: ${\n this.owner.networkId\n } to player ${newObjectPlayerNumber}.`\n );\n if (newObjectPlayerNumber < 0) {\n logger.error(\n 'Invalid player number (' +\n newObjectPlayerNumber +\n ') when setting ownership of an object.'\n );\n return;\n }\n\n // Update the ownership locally, so the object can be used immediately.\n // This is a prediction to allow snappy interactions.\n // If we are host, we will have the ownership immediately anyway.\n // If we are another player, we will have the ownership as soon as the host acknowledges the change.\n // If the host does not send an acknowledgment, we will revert the ownership.\n const previousObjectPlayerNumber = this.playerNumber;\n this.playerNumber = newObjectPlayerNumber;\n const currentPlayerNumber = gdjs.multiplayer.getCurrentPlayerNumber();\n\n // If the lobby game is not running, do not try to update the ownership over the network,\n // as the game may create & update objects before the lobby game starts.\n if (!gdjs.multiplayer.isLobbyGameRunning()) {\n return;\n }\n\n let instanceNetworkId = this.owner.networkId;\n if (!instanceNetworkId) {\n debugLogger.info(\n 'Object has no networkId, we change the ownership locally, but it will not be synchronized yet if we are not the owner.'\n );\n if (newObjectPlayerNumber !== currentPlayerNumber) {\n // If we are not the new owner, we should not send a message to the host to change the ownership.\n // Just return and wait to receive an update message to reconcile this object.\n return;\n }\n // If we don't have a networkId, we need to create one now that we are the owner.\n // We are probably in a case where we created the object and then changed the ownership.\n debugLogger.info(\n 'We are the new owner, creating a networkId for the object.'\n );\n instanceNetworkId = this._getOrCreateInstanceNetworkId();\n }\n\n const sceneNetworkId = this.owner.getRuntimeScene().networkId;\n if (!sceneNetworkId) {\n // No networkId for the scene yet, it will be set soon, let's not sync the object yet.\n return;\n }\n\n const objectName = this.owner.getName();\n\n // When changing the ownership of an object with a networkId, we send a message to the host to ensure it is aware of the change,\n // and can either accept it and broadcast it to other players, or reject it and do nothing with it.\n // We expect an acknowledgment from the host, if not, we will retry and eventually revert the ownership.\n const { messageName, messageData } =\n gdjs.multiplayerMessageManager.createChangeInstanceOwnerMessage({\n objectOwner: previousObjectPlayerNumber,\n objectName,\n instanceNetworkId,\n newObjectOwner: newObjectPlayerNumber,\n instanceX: this.owner.getX(),\n instanceY: this.owner.getY(),\n sceneNetworkId,\n });\n // Before sending the changeOwner message, if we are becoming the new owner,\n // we want to ensure this message is acknowledged, by everyone we're connected to.\n // If we are the host, we are connected to everyone, so we expect an acknowledgment from everyone.\n // If we are another player, we are only connected to the host, so we expect an acknowledgment from the host.\n // In both cases, this represents the list of peers the current user is connected to.\n if (newObjectPlayerNumber === currentPlayerNumber) {\n const otherPeerIds = gdjs.multiplayerPeerJsHelper.getAllPeers();\n const changeOwnerAcknowledgedMessageName =\n gdjs.multiplayerMessageManager.createInstanceOwnerChangedMessageNameFromChangeInstanceOwnerMessage(\n messageName\n );\n gdjs.multiplayerMessageManager.addExpectedMessageAcknowledgement({\n originalMessageName: messageName,\n originalData: {\n ...messageData,\n _clock: this._clock + 1, // Will be incremented by the time the message is sent.\n },\n expectedMessageName: changeOwnerAcknowledgedMessageName,\n otherPeerIds,\n // If we are not the host, we should revert the ownership if the host does not acknowledge the change.\n shouldCancelMessageIfTimesOut:\n !gdjs.multiplayer.isCurrentPlayerHost(),\n });\n }\n\n debugLogger.info('Sending change owner message', messageName);\n this._sendDataToPeersWithIncreasedClock(messageName, messageData);\n\n // If we are the new owner, also send directly an update of the position,\n // so that the object is immediately moved on the screen and we don't wait for the next tick.\n if (newObjectPlayerNumber === currentPlayerNumber) {\n debugLogger.info(\n 'Sending update message to move the object immediately.'\n );\n const objectNetworkSyncData = this.owner.getNetworkSyncData({});\n const {\n messageName: updateMessageName,\n messageData: updateMessageData,\n } = gdjs.multiplayerMessageManager.createUpdateInstanceMessage({\n objectOwner: this.playerNumber,\n objectName,\n instanceNetworkId,\n objectNetworkSyncData,\n sceneNetworkId,\n });\n this._sendDataToPeersWithIncreasedClock(\n updateMessageName,\n updateMessageData\n );\n }\n }\n\n getPlayerObjectOwnership(): number {\n return this.playerNumber;\n }\n\n isObjectOwnedByCurrentPlayer(): boolean {\n return this._isOwnerAsPlayerOrHost();\n }\n\n removeObjectOwnership() {\n // 0 means the host is the owner.\n this.setPlayerObjectOwnership(0);\n }\n\n takeObjectOwnership() {\n this.setPlayerObjectOwnership(gdjs.multiplayer.getCurrentPlayerNumber());\n }\n\n getActionOnPlayerDisconnect() {\n return this.actionOnPlayerDisconnect;\n }\n\n enableBehaviorSynchronization(behaviorName: string, enable: boolean) {\n const behavior = this.owner.getBehavior(behaviorName);\n if (!behavior) {\n logger.error(\n `Behavior ${behaviorName} does not exist on object ${this.owner.getName()}.`\n );\n return;\n }\n\n behavior.enableSynchronization(enable);\n }\n }\n gdjs.registerBehavior(\n 'Multiplayer::MultiplayerObjectBehavior',\n gdjs.MultiplayerObjectRuntimeBehavior\n );\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,2 +1,2 @@
1
- var gdjs;(function(i){class s extends i.RuntimeObject{constructor(e,t){super(e,t);this.opacity=255;this._rBorder=t.rightMargin,this._lBorder=t.leftMargin,this._tBorder=t.topMargin,this._bBorder=t.bottomMargin,this._tiled=t.tiled,this._width=t.width,this._height=t.height,this._renderer=new i.PanelSpriteRuntimeObjectRenderer(this,e,t.texture,t.tiled),this.onCreated()}updateFromObjectData(e,t){e.width!==t.width&&this.setWidth(t.width),e.height!==t.height&&this.setHeight(t.height);let r=!1;return e.rightMargin!==t.rightMargin&&(this._rBorder=t.rightMargin,r=!0),e.leftMargin!==t.leftMargin&&(this._lBorder=t.leftMargin,r=!0),e.topMargin!==t.topMargin&&(this._tBorder=t.topMargin,r=!0),e.bottomMargin!==t.bottomMargin&&(this._bBorder=t.bottomMargin,r=!0),e.texture!==t.texture&&(r=!0),r&&this.setTexture(t.texture,this.getRuntimeScene()),e.tiled===t.tiled}getNetworkSyncData(){return{...super.getNetworkSyncData(),op:this.getOpacity(),color:this.getColor()}}updateFromNetworkSyncData(e){super.updateFromNetworkSyncData(e),e.op!==void 0&&this.setOpacity(e.op),e.color!==void 0&&this.setColor(e.color)}getRendererObject(){return this._renderer.getRendererObject()}onDestroyed(){super.onDestroyed(),this._renderer.destroy()}update(e){this._renderer.ensureUpToDate()}extraInitializationFromInitialInstance(e){e.customSize&&(this.setWidth(e.width),this.setHeight(e.height)),e.opacity!==void 0&&this.setOpacity(e.opacity)}setX(e){super.setX(e),this._renderer.updatePosition()}setY(e){super.setY(e),this._renderer.updatePosition()}setTexture(e,t){this._renderer.setTexture(e,t)}setAngle(e){super.setAngle(e),this._renderer.updateAngle()}getWidth(){return this._width}getHeight(){return this._height}setWidth(e){this._width!==e&&(this._width=e,this._renderer.updateWidth(),this.invalidateHitboxes())}setHeight(e){this._height!==e&&(this._height=e,this._renderer.updateHeight(),this.invalidateHitboxes())}setSize(e,t){this.setWidth(e),this.setHeight(t)}setOpacity(e){e<0&&(e=0),e>255&&(e=255),this.opacity=e,this._renderer.updateOpacity()}getOpacity(){return this.opacity}setColor(e){this._renderer.setColor(e)}getColor(){return this._renderer.getColor()}getScale(){const e=Math.abs(this.getScaleX()),t=Math.abs(this.getScaleY());return e===t?e:Math.sqrt(e*t)}getScaleX(){return this._width/this._renderer.getTextureWidth()}getScaleY(){return this._height/this._renderer.getTextureHeight()}setScale(e){this.setWidth(this._renderer.getTextureWidth()*e),this.setHeight(this._renderer.getTextureHeight()*e)}setScaleX(e){this.setWidth(this._renderer.getTextureWidth()*e)}setScaleY(e){this.setHeight(this._renderer.getTextureHeight()*e)}}i.PanelSpriteRuntimeObject=s,i.registerObject("PanelSpriteObject::PanelSprite",i.PanelSpriteRuntimeObject)})(gdjs||(gdjs={}));
1
+ var gdjs;(function(i){class s extends i.RuntimeObject{constructor(e,t){super(e,t);this.opacity=255;this._rBorder=t.rightMargin,this._lBorder=t.leftMargin,this._tBorder=t.topMargin,this._bBorder=t.bottomMargin,this._tiled=t.tiled,this._width=t.width,this._height=t.height,this._renderer=new i.PanelSpriteRuntimeObjectRenderer(this,e,t.texture,t.tiled),this.onCreated()}updateFromObjectData(e,t){e.width!==t.width&&this.setWidth(t.width),e.height!==t.height&&this.setHeight(t.height);let r=!1;return e.rightMargin!==t.rightMargin&&(this._rBorder=t.rightMargin,r=!0),e.leftMargin!==t.leftMargin&&(this._lBorder=t.leftMargin,r=!0),e.topMargin!==t.topMargin&&(this._tBorder=t.topMargin,r=!0),e.bottomMargin!==t.bottomMargin&&(this._bBorder=t.bottomMargin,r=!0),e.texture!==t.texture&&(r=!0),r&&this.setTexture(t.texture,this.getRuntimeScene()),e.tiled===t.tiled}getNetworkSyncData(e){return{...super.getNetworkSyncData(e),op:this.getOpacity(),color:this.getColor()}}updateFromNetworkSyncData(e,t){super.updateFromNetworkSyncData(e,t),e.op!==void 0&&this.setOpacity(e.op),e.color!==void 0&&this.setColor(e.color)}getRendererObject(){return this._renderer.getRendererObject()}onDestroyed(){super.onDestroyed(),this._renderer.destroy()}update(e){this._renderer.ensureUpToDate()}extraInitializationFromInitialInstance(e){e.customSize&&(this.setWidth(e.width),this.setHeight(e.height)),e.opacity!==void 0&&this.setOpacity(e.opacity)}setX(e){super.setX(e),this._renderer.updatePosition()}setY(e){super.setY(e),this._renderer.updatePosition()}setTexture(e,t){this._renderer.setTexture(e,t)}setAngle(e){super.setAngle(e),this._renderer.updateAngle()}getWidth(){return this._width}getHeight(){return this._height}setWidth(e){this._width!==e&&(this._width=e,this._renderer.updateWidth(),this.invalidateHitboxes())}setHeight(e){this._height!==e&&(this._height=e,this._renderer.updateHeight(),this.invalidateHitboxes())}setSize(e,t){this.setWidth(e),this.setHeight(t)}setOpacity(e){e<0&&(e=0),e>255&&(e=255),this.opacity=e,this._renderer.updateOpacity()}getOpacity(){return this.opacity}setColor(e){this._renderer.setColor(e)}getColor(){return this._renderer.getColor()}getScale(){const e=Math.abs(this.getScaleX()),t=Math.abs(this.getScaleY());return e===t?e:Math.sqrt(e*t)}getScaleX(){return this._width/this._renderer.getTextureWidth()}getScaleY(){return this._height/this._renderer.getTextureHeight()}setScale(e){this.setWidth(this._renderer.getTextureWidth()*e),this.setHeight(this._renderer.getTextureHeight()*e)}setScaleX(e){this.setWidth(this._renderer.getTextureWidth()*e)}setScaleY(e){this.setHeight(this._renderer.getTextureHeight()*e)}}i.PanelSpriteRuntimeObject=s,i.registerObject("PanelSpriteObject::PanelSprite",i.PanelSpriteRuntimeObject)})(gdjs||(gdjs={}));
2
2
  //# sourceMappingURL=panelspriteruntimeobject.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../GDevelop/Extensions/PanelSpriteObject/panelspriteruntimeobject.ts"],
4
- "sourcesContent": ["/*\n * GDevelop JS Platform\n * 2013 Florian Rival (Florian.Rival@gmail.com)\n */\nnamespace gdjs {\n export type PanelSpriteObjectDataType = {\n /** The right margin */\n rightMargin: number;\n /** The left margin */\n leftMargin: number;\n /** The top margin */\n topMargin: number;\n /** The bottom margin */\n bottomMargin: number;\n /** Are the central part and borders tiled? */\n tiled: boolean;\n /** The object width */\n width: number;\n /** The object height */\n height: number;\n /** The name of the resource containing the texture to use */\n texture: string;\n };\n\n export type PanelSpriteObjectData = ObjectData & PanelSpriteObjectDataType;\n\n export type PanelSpriteNetworkSyncDataType = {\n op: number;\n color: string;\n };\n\n export type PanelSpriteNetworkSyncData = ObjectNetworkSyncData &\n PanelSpriteNetworkSyncDataType;\n\n /**\n * The PanelSpriteRuntimeObject displays a tiled texture.\n */\n export class PanelSpriteRuntimeObject\n extends gdjs.RuntimeObject\n implements gdjs.Resizable, gdjs.OpacityHandler\n {\n _rBorder: integer;\n _lBorder: integer;\n _tBorder: integer;\n _bBorder: integer;\n _tiled: boolean;\n opacity: float = 255;\n\n // Width and height can be stored because they do not depend on the\n // size of the texture being used (contrary to most objects).\n _width: float;\n _height: float;\n\n _renderer: gdjs.PanelSpriteRuntimeObjectRenderer;\n\n /**\n * @param instanceContainer The container the object belongs to.\n * @param panelSpriteObjectData The initial properties of the object\n */\n constructor(\n instanceContainer: gdjs.RuntimeInstanceContainer,\n panelSpriteObjectData: PanelSpriteObjectData\n ) {\n super(instanceContainer, panelSpriteObjectData);\n this._rBorder = panelSpriteObjectData.rightMargin;\n this._lBorder = panelSpriteObjectData.leftMargin;\n this._tBorder = panelSpriteObjectData.topMargin;\n this._bBorder = panelSpriteObjectData.bottomMargin;\n this._tiled = panelSpriteObjectData.tiled;\n this._width = panelSpriteObjectData.width;\n this._height = panelSpriteObjectData.height;\n this._renderer = new gdjs.PanelSpriteRuntimeObjectRenderer(\n this,\n instanceContainer,\n panelSpriteObjectData.texture,\n panelSpriteObjectData.tiled\n );\n\n // *ALWAYS* call `this.onCreated()` at the very end of your object constructor.\n this.onCreated();\n }\n\n updateFromObjectData(\n oldObjectData: PanelSpriteObjectData,\n newObjectData: PanelSpriteObjectData\n ): boolean {\n if (oldObjectData.width !== newObjectData.width) {\n this.setWidth(newObjectData.width);\n }\n if (oldObjectData.height !== newObjectData.height) {\n this.setHeight(newObjectData.height);\n }\n let updateTexture = false;\n if (oldObjectData.rightMargin !== newObjectData.rightMargin) {\n this._rBorder = newObjectData.rightMargin;\n updateTexture = true;\n }\n if (oldObjectData.leftMargin !== newObjectData.leftMargin) {\n this._lBorder = newObjectData.leftMargin;\n updateTexture = true;\n }\n if (oldObjectData.topMargin !== newObjectData.topMargin) {\n this._tBorder = newObjectData.topMargin;\n updateTexture = true;\n }\n if (oldObjectData.bottomMargin !== newObjectData.bottomMargin) {\n this._bBorder = newObjectData.bottomMargin;\n updateTexture = true;\n }\n if (oldObjectData.texture !== newObjectData.texture) {\n updateTexture = true;\n }\n if (updateTexture) {\n this.setTexture(newObjectData.texture, this.getRuntimeScene());\n }\n if (oldObjectData.tiled !== newObjectData.tiled) {\n return false;\n }\n return true;\n }\n\n getNetworkSyncData(): PanelSpriteNetworkSyncData {\n return {\n ...super.getNetworkSyncData(),\n op: this.getOpacity(),\n color: this.getColor(),\n };\n }\n\n updateFromNetworkSyncData(\n networkSyncData: PanelSpriteNetworkSyncData\n ): void {\n super.updateFromNetworkSyncData(networkSyncData);\n\n // Texture is not synchronized, see if this is asked or not.\n\n if (networkSyncData.op !== undefined) {\n this.setOpacity(networkSyncData.op);\n }\n if (networkSyncData.color !== undefined) {\n this.setColor(networkSyncData.color);\n }\n }\n\n getRendererObject() {\n return this._renderer.getRendererObject();\n }\n\n onDestroyed(): void {\n super.onDestroyed();\n this._renderer.destroy();\n }\n\n update(instanceContainer: gdjs.RuntimeInstanceContainer): void {\n this._renderer.ensureUpToDate();\n }\n\n /**\n * Initialize the extra parameters that could be set for an instance.\n */\n extraInitializationFromInitialInstance(initialInstanceData: InstanceData) {\n if (initialInstanceData.customSize) {\n this.setWidth(initialInstanceData.width);\n this.setHeight(initialInstanceData.height);\n }\n if (initialInstanceData.opacity !== undefined) {\n this.setOpacity(initialInstanceData.opacity);\n }\n }\n\n /**\n * Set the x position of the panel sprite.\n * @param x The new x position in pixels.\n */\n setX(x: float): void {\n super.setX(x);\n this._renderer.updatePosition();\n }\n\n /**\n * Set the y position of the panel sprite.\n * @param y The new y position in pixels.\n */\n setY(y: float): void {\n super.setY(y);\n this._renderer.updatePosition();\n }\n\n /**\n * Set the texture of the panel sprite.\n * @param textureName The name of the texture.\n * @param instanceContainer The container the object lives in.\n */\n setTexture(\n textureName: string,\n instanceContainer: gdjs.RuntimeInstanceContainer\n ): void {\n this._renderer.setTexture(textureName, instanceContainer);\n }\n\n /**\n * Set the angle of the panel sprite.\n * @param angle The new angle in degrees.\n */\n setAngle(angle: float): void {\n super.setAngle(angle);\n this._renderer.updateAngle();\n }\n\n /**\n * Get the width of the panel sprite in pixels\n * @return The width in pixels\n */\n getWidth(): float {\n return this._width;\n }\n\n /**\n * Get the height of the panel sprite in pixels\n * @return The height in pixels\n */\n getHeight(): float {\n return this._height;\n }\n\n setWidth(width: float): void {\n if (this._width === width) return;\n\n this._width = width;\n this._renderer.updateWidth();\n this.invalidateHitboxes();\n }\n\n setHeight(height: float): void {\n if (this._height === height) return;\n\n this._height = height;\n this._renderer.updateHeight();\n this.invalidateHitboxes();\n }\n\n setSize(newWidth: float, newHeight: float): void {\n this.setWidth(newWidth);\n this.setHeight(newHeight);\n }\n\n setOpacity(opacity: float): void {\n if (opacity < 0) {\n opacity = 0;\n }\n if (opacity > 255) {\n opacity = 255;\n }\n this.opacity = opacity;\n this._renderer.updateOpacity();\n }\n\n getOpacity(): number {\n return this.opacity;\n }\n\n /**\n * Change the tint of the panel sprite object.\n *\n * @param rgbColor The color, in RGB format (\"128;200;255\").\n */\n setColor(rgbColor: string): void {\n this._renderer.setColor(rgbColor);\n }\n\n /**\n * Get the tint of the panel sprite object.\n *\n * @returns The color, in RGB format (\"128;200;255\").\n */\n getColor(): string {\n return this._renderer.getColor();\n }\n\n // Implement support for get/set scale:\n\n /**\n * Get the scale of the object (or the geometric mean of the X and Y scale in case they are different).\n *\n * @return the scale of the object (or the geometric mean of the X and Y scale in case they are different).\n */\n getScale(): float {\n const scaleX = Math.abs(this.getScaleX());\n const scaleY = Math.abs(this.getScaleY());\n return scaleX === scaleY ? scaleX : Math.sqrt(scaleX * scaleY);\n }\n\n /**\n * Get x-scale of the tiled sprite object.\n */\n getScaleX(): float {\n return this._width / this._renderer.getTextureWidth();\n }\n\n /**\n * Get y-scale of the tiled sprite object.\n */\n getScaleY(): float {\n return this._height / this._renderer.getTextureHeight();\n }\n\n /**\n * Set the tiled sprite object scale.\n * @param newScale The new scale for the tiled sprite object.\n */\n setScale(newScale: float): void {\n this.setWidth(this._renderer.getTextureWidth() * newScale);\n this.setHeight(this._renderer.getTextureHeight() * newScale);\n }\n\n /**\n * Set the tiled sprite object x-scale.\n * @param newScale The new x-scale for the tiled sprite object.\n */\n setScaleX(newScale: float): void {\n this.setWidth(this._renderer.getTextureWidth() * newScale);\n }\n\n /**\n * Set the tiled sprite object y-scale.\n * @param newScale The new y-scale for the tiled sprite object.\n */\n setScaleY(newScale: float): void {\n this.setHeight(this._renderer.getTextureHeight() * newScale);\n }\n }\n gdjs.registerObject(\n 'PanelSpriteObject::PanelSprite',\n gdjs.PanelSpriteRuntimeObject\n );\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/*\n * GDevelop JS Platform\n * 2013 Florian Rival (Florian.Rival@gmail.com)\n */\nnamespace gdjs {\n export type PanelSpriteObjectDataType = {\n /** The right margin */\n rightMargin: number;\n /** The left margin */\n leftMargin: number;\n /** The top margin */\n topMargin: number;\n /** The bottom margin */\n bottomMargin: number;\n /** Are the central part and borders tiled? */\n tiled: boolean;\n /** The object width */\n width: number;\n /** The object height */\n height: number;\n /** The name of the resource containing the texture to use */\n texture: string;\n };\n\n export type PanelSpriteObjectData = ObjectData & PanelSpriteObjectDataType;\n\n export type PanelSpriteNetworkSyncDataType = {\n op: number;\n color: string;\n };\n\n export type PanelSpriteNetworkSyncData = ObjectNetworkSyncData &\n PanelSpriteNetworkSyncDataType;\n\n /**\n * The PanelSpriteRuntimeObject displays a tiled texture.\n */\n export class PanelSpriteRuntimeObject\n extends gdjs.RuntimeObject\n implements gdjs.Resizable, gdjs.OpacityHandler\n {\n _rBorder: integer;\n _lBorder: integer;\n _tBorder: integer;\n _bBorder: integer;\n _tiled: boolean;\n opacity: float = 255;\n\n // Width and height can be stored because they do not depend on the\n // size of the texture being used (contrary to most objects).\n _width: float;\n _height: float;\n\n _renderer: gdjs.PanelSpriteRuntimeObjectRenderer;\n\n /**\n * @param instanceContainer The container the object belongs to.\n * @param panelSpriteObjectData The initial properties of the object\n */\n constructor(\n instanceContainer: gdjs.RuntimeInstanceContainer,\n panelSpriteObjectData: PanelSpriteObjectData\n ) {\n super(instanceContainer, panelSpriteObjectData);\n this._rBorder = panelSpriteObjectData.rightMargin;\n this._lBorder = panelSpriteObjectData.leftMargin;\n this._tBorder = panelSpriteObjectData.topMargin;\n this._bBorder = panelSpriteObjectData.bottomMargin;\n this._tiled = panelSpriteObjectData.tiled;\n this._width = panelSpriteObjectData.width;\n this._height = panelSpriteObjectData.height;\n this._renderer = new gdjs.PanelSpriteRuntimeObjectRenderer(\n this,\n instanceContainer,\n panelSpriteObjectData.texture,\n panelSpriteObjectData.tiled\n );\n\n // *ALWAYS* call `this.onCreated()` at the very end of your object constructor.\n this.onCreated();\n }\n\n updateFromObjectData(\n oldObjectData: PanelSpriteObjectData,\n newObjectData: PanelSpriteObjectData\n ): boolean {\n if (oldObjectData.width !== newObjectData.width) {\n this.setWidth(newObjectData.width);\n }\n if (oldObjectData.height !== newObjectData.height) {\n this.setHeight(newObjectData.height);\n }\n let updateTexture = false;\n if (oldObjectData.rightMargin !== newObjectData.rightMargin) {\n this._rBorder = newObjectData.rightMargin;\n updateTexture = true;\n }\n if (oldObjectData.leftMargin !== newObjectData.leftMargin) {\n this._lBorder = newObjectData.leftMargin;\n updateTexture = true;\n }\n if (oldObjectData.topMargin !== newObjectData.topMargin) {\n this._tBorder = newObjectData.topMargin;\n updateTexture = true;\n }\n if (oldObjectData.bottomMargin !== newObjectData.bottomMargin) {\n this._bBorder = newObjectData.bottomMargin;\n updateTexture = true;\n }\n if (oldObjectData.texture !== newObjectData.texture) {\n updateTexture = true;\n }\n if (updateTexture) {\n this.setTexture(newObjectData.texture, this.getRuntimeScene());\n }\n if (oldObjectData.tiled !== newObjectData.tiled) {\n return false;\n }\n return true;\n }\n\n getNetworkSyncData(\n syncOptions: GetNetworkSyncDataOptions\n ): PanelSpriteNetworkSyncData {\n return {\n ...super.getNetworkSyncData(syncOptions),\n op: this.getOpacity(),\n color: this.getColor(),\n };\n }\n\n updateFromNetworkSyncData(\n networkSyncData: PanelSpriteNetworkSyncData,\n options: UpdateFromNetworkSyncDataOptions\n ): void {\n super.updateFromNetworkSyncData(networkSyncData, options);\n\n // Texture is not synchronized, see if this is asked or not.\n\n if (networkSyncData.op !== undefined) {\n this.setOpacity(networkSyncData.op);\n }\n if (networkSyncData.color !== undefined) {\n this.setColor(networkSyncData.color);\n }\n }\n\n getRendererObject() {\n return this._renderer.getRendererObject();\n }\n\n onDestroyed(): void {\n super.onDestroyed();\n this._renderer.destroy();\n }\n\n update(instanceContainer: gdjs.RuntimeInstanceContainer): void {\n this._renderer.ensureUpToDate();\n }\n\n /**\n * Initialize the extra parameters that could be set for an instance.\n */\n extraInitializationFromInitialInstance(initialInstanceData: InstanceData) {\n if (initialInstanceData.customSize) {\n this.setWidth(initialInstanceData.width);\n this.setHeight(initialInstanceData.height);\n }\n if (initialInstanceData.opacity !== undefined) {\n this.setOpacity(initialInstanceData.opacity);\n }\n }\n\n /**\n * Set the x position of the panel sprite.\n * @param x The new x position in pixels.\n */\n setX(x: float): void {\n super.setX(x);\n this._renderer.updatePosition();\n }\n\n /**\n * Set the y position of the panel sprite.\n * @param y The new y position in pixels.\n */\n setY(y: float): void {\n super.setY(y);\n this._renderer.updatePosition();\n }\n\n /**\n * Set the texture of the panel sprite.\n * @param textureName The name of the texture.\n * @param instanceContainer The container the object lives in.\n */\n setTexture(\n textureName: string,\n instanceContainer: gdjs.RuntimeInstanceContainer\n ): void {\n this._renderer.setTexture(textureName, instanceContainer);\n }\n\n /**\n * Set the angle of the panel sprite.\n * @param angle The new angle in degrees.\n */\n setAngle(angle: float): void {\n super.setAngle(angle);\n this._renderer.updateAngle();\n }\n\n /**\n * Get the width of the panel sprite in pixels\n * @return The width in pixels\n */\n getWidth(): float {\n return this._width;\n }\n\n /**\n * Get the height of the panel sprite in pixels\n * @return The height in pixels\n */\n getHeight(): float {\n return this._height;\n }\n\n setWidth(width: float): void {\n if (this._width === width) return;\n\n this._width = width;\n this._renderer.updateWidth();\n this.invalidateHitboxes();\n }\n\n setHeight(height: float): void {\n if (this._height === height) return;\n\n this._height = height;\n this._renderer.updateHeight();\n this.invalidateHitboxes();\n }\n\n setSize(newWidth: float, newHeight: float): void {\n this.setWidth(newWidth);\n this.setHeight(newHeight);\n }\n\n setOpacity(opacity: float): void {\n if (opacity < 0) {\n opacity = 0;\n }\n if (opacity > 255) {\n opacity = 255;\n }\n this.opacity = opacity;\n this._renderer.updateOpacity();\n }\n\n getOpacity(): number {\n return this.opacity;\n }\n\n /**\n * Change the tint of the panel sprite object.\n *\n * @param rgbColor The color, in RGB format (\"128;200;255\").\n */\n setColor(rgbColor: string): void {\n this._renderer.setColor(rgbColor);\n }\n\n /**\n * Get the tint of the panel sprite object.\n *\n * @returns The color, in RGB format (\"128;200;255\").\n */\n getColor(): string {\n return this._renderer.getColor();\n }\n\n // Implement support for get/set scale:\n\n /**\n * Get the scale of the object (or the geometric mean of the X and Y scale in case they are different).\n *\n * @return the scale of the object (or the geometric mean of the X and Y scale in case they are different).\n */\n getScale(): float {\n const scaleX = Math.abs(this.getScaleX());\n const scaleY = Math.abs(this.getScaleY());\n return scaleX === scaleY ? scaleX : Math.sqrt(scaleX * scaleY);\n }\n\n /**\n * Get x-scale of the tiled sprite object.\n */\n getScaleX(): float {\n return this._width / this._renderer.getTextureWidth();\n }\n\n /**\n * Get y-scale of the tiled sprite object.\n */\n getScaleY(): float {\n return this._height / this._renderer.getTextureHeight();\n }\n\n /**\n * Set the tiled sprite object scale.\n * @param newScale The new scale for the tiled sprite object.\n */\n setScale(newScale: float): void {\n this.setWidth(this._renderer.getTextureWidth() * newScale);\n this.setHeight(this._renderer.getTextureHeight() * newScale);\n }\n\n /**\n * Set the tiled sprite object x-scale.\n * @param newScale The new x-scale for the tiled sprite object.\n */\n setScaleX(newScale: float): void {\n this.setWidth(this._renderer.getTextureWidth() * newScale);\n }\n\n /**\n * Set the tiled sprite object y-scale.\n * @param newScale The new y-scale for the tiled sprite object.\n */\n setScaleY(newScale: float): void {\n this.setHeight(this._renderer.getTextureHeight() * newScale);\n }\n }\n gdjs.registerObject(\n 'PanelSpriteObject::PanelSprite',\n gdjs.PanelSpriteRuntimeObject\n );\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,2 +1,2 @@
1
- var gdjs;(function(t){class s extends t.RuntimeObject{constructor(e,i){super(e,i);this._jumpForwardInTimeCompleted=!1;this._posDirty=!0;this._angleDirty=!0;this._forceDirty=!0;this._zoneRadiusDirty=!0;this._lifeTimeDirty=!0;this._gravityDirty=!0;this._colorDirty=!0;this._sizeDirty=!0;this._alphaDirty=!0;this._flowDirty=!0;this._tankDirty=!0;this._particleRotationSpeedDirty=!0;this._maxParticlesCountDirty=!0;this._additiveRenderingDirty=!0;this._isEmissionPaused=!1;this._renderer=new t.ParticleEmitterObjectRenderer(e,this,i),this.angleA=i.emitterAngleA,this.angleB=i.emitterAngleB,this.forceMin=i.emitterForceMin,this.forceMax=i.emitterForceMax,this.zoneRadius=i.zoneRadius,this.lifeTimeMin=i.particleLifeTimeMin,this.lifeTimeMax=i.particleLifeTimeMax,this.gravityX=i.particleGravityX,this.gravityY=i.particleGravityY,this.color1=t.rgbOrHexStringToNumber(i.particleColor1),this.color2=t.rgbOrHexStringToNumber(i.particleColor2),this.size1=i.particleSize1,this.size2=i.particleSize2,this.alpha1=i.particleAlpha1,this.alpha2=i.particleAlpha2,this.rendererType=i.rendererType,this.rendererParam1=i.rendererParam1,this.rendererParam2=i.rendererParam2,this.texture=i.textureParticleName,this.flow=i.flow,this.tank=i.tank,this.destroyWhenNoParticles=i.destroyWhenNoParticles,this.particleRotationMinSpeed=i.particleAngle1,this.particleRotationMaxSpeed=i.particleAngle2,this.maxParticlesCount=i.maxParticleNb,this.additiveRendering=i.additive,this.jumpForwardInTimeOnCreation=i.jumpForwardInTimeOnCreation,this._textureDirty=this.texture!=="",this.onCreated()}setX(e){this.x!==e&&(this._posDirty=!0),super.setX(e)}setY(e){this.y!==e&&(this._posDirty=!0),super.setY(e)}setAngle(e){this.angle!==e&&(this._angleDirty=!0),super.setAngle(e)}getRendererObject(){return this._renderer.getRendererObject()}updateFromObjectData(e,i){return e.emitterAngleA!==i.emitterAngleA&&this.setEmitterAngleA(i.emitterAngleA),e.emitterAngleB!==i.emitterAngleB&&this.setEmitterAngleB(i.emitterAngleB),e.emitterForceMin!==i.emitterForceMin&&this.setEmitterForceMin(i.emitterForceMin),e.particleAngle1!==i.particleAngle1&&this.setParticleRotationMinSpeed(i.particleAngle1),e.particleAngle2!==i.particleAngle2&&this.setParticleRotationMaxSpeed(i.particleAngle2),e.maxParticleNb!==i.maxParticleNb&&this.setMaxParticlesCount(i.maxParticleNb),e.additive!==i.additive&&this.setAdditiveRendering(i.additive),e.emitterForceMax!==i.emitterForceMax&&this.setEmitterForceMax(i.emitterForceMax),e.zoneRadius!==i.zoneRadius&&this.setZoneRadius(i.zoneRadius),e.particleLifeTimeMin!==i.particleLifeTimeMin&&this.setParticleLifeTimeMin(i.particleLifeTimeMin),e.particleLifeTimeMax!==i.particleLifeTimeMax&&this.setParticleLifeTimeMax(i.particleLifeTimeMax),e.particleGravityX!==i.particleGravityX&&this.setParticleGravityX(i.particleGravityX),e.particleGravityY!==i.particleGravityY&&this.setParticleGravityY(i.particleGravityY),e.particleColor1!==i.particleColor1&&this.setParticleColor1(i.particleColor1),e.particleColor2!==i.particleColor2&&this.setParticleColor2(i.particleColor2),e.particleSize1!==i.particleSize1&&this.setParticleSize1(i.particleSize1),e.particleSize2!==i.particleSize2&&this.setParticleSize2(i.particleSize2),e.particleAlpha1!==i.particleAlpha1&&this.setParticleAlpha1(i.particleAlpha1),e.particleAlpha2!==i.particleAlpha2&&this.setParticleAlpha2(i.particleAlpha2),e.textureParticleName!==i.textureParticleName&&this.setTexture(i.textureParticleName,this.getRuntimeScene()),e.flow!==i.flow&&this.setFlow(i.flow),e.tank!==i.tank&&this.setTank(i.tank),e.destroyWhenNoParticles!==i.destroyWhenNoParticles&&(this.destroyWhenNoParticles=i.destroyWhenNoParticles),(e.particleSizeRandomness1!==i.particleSizeRandomness1||e.particleSizeRandomness2!==i.particleSizeRandomness2||e.particleAngle1!==i.particleAngle1||e.particleAngle2!==i.particleAngle2||e.maxParticleNb!==i.maxParticleNb||e.additive!==i.additive||e.rendererType!==i.rendererType||e.rendererParam1!==i.rendererParam1||e.rendererParam2!==i.rendererParam2)&&(this.getInstanceContainer().getLayer(this.layer).getRenderer().removeRendererObject(this._renderer.getRendererObject()),this._renderer.destroy(),this._renderer=new t.ParticleEmitterObjectRenderer(this.getInstanceContainer(),this,i),this._posDirty=this._angleDirty=this._forceDirty=this._zoneRadiusDirty=!0,this._lifeTimeDirty=this._gravityDirty=this._colorDirty=this._sizeDirty=!0,this._alphaDirty=this._flowDirty=this._tankDirty=this._textureDirty=!0),!0}getNetworkSyncData(){return{...super.getNetworkSyncData(),prms:this.particleRotationMinSpeed,prmx:this.particleRotationMaxSpeed,mpc:this.maxParticlesCount,addr:this.additiveRendering,angb:this.angleB,formin:this.forceMin,formax:this.forceMax,zr:this.zoneRadius,ltmin:this.lifeTimeMin,ltmax:this.lifeTimeMax,gravx:this.gravityX,gravy:this.gravityY,color1:this.color1,color2:this.color2,size1:this.size1,size2:this.size2,alp1:this.alpha1,alp2:this.alpha2,flow:this.flow,tank:this.tank,text:this.texture,paused:this._isEmissionPaused}}updateFromNetworkSyncData(e){super.updateFromNetworkSyncData(e),e.x!==void 0&&this.setX(e.x),e.y!==void 0&&this.setY(e.y),e.a!==void 0&&this.setAngle(e.a),e.prms!==void 0&&this.setParticleRotationMinSpeed(e.prms),e.prmx!==void 0&&this.setParticleRotationMaxSpeed(e.prmx),e.mpc!==void 0&&this.setMaxParticlesCount(e.mpc),e.addr!==void 0&&this.setAdditiveRendering(e.addr),e.angb!==void 0&&this.setEmitterAngleB(e.angb),e.formin!==void 0&&this.setEmitterForceMin(e.formin),e.formax!==void 0&&this.setEmitterForceMax(e.formax),e.zr!==void 0&&this.setZoneRadius(e.zr),e.ltmin!==void 0&&this.setParticleLifeTimeMin(e.ltmin),e.ltmax!==void 0&&this.setParticleLifeTimeMax(e.ltmax),e.gravx!==void 0&&this.setParticleGravityX(e.gravx),e.gravy!==void 0&&this.setParticleGravityY(e.gravy),e.color1!==void 0&&this.setParticleColor1AsNumber(e.color1),e.color2!==void 0&&this.setParticleColor2AsNumber(e.color2),e.size1!==void 0&&this.setParticleSize1(e.size1),e.size2!==void 0&&this.setParticleSize2(e.size2),e.alp1!==void 0&&this.setParticleAlpha1(e.alp1),e.alp2!==void 0&&this.setParticleAlpha2(e.alp2),e.flow!==void 0&&this.setFlow(e.flow),e.tank!==void 0&&this.setTank(e.tank),e.text!==void 0&&this.setTexture(e.text,this.getRuntimeScene()),e.paused!==void 0&&(e.paused?this.stopEmission():this.startEmission())}update(e){if(this._posDirty&&this._renderer.setPosition(this.getX(),this.getY()),this._particleRotationSpeedDirty&&this._renderer.setParticleRotationSpeed(this.particleRotationMinSpeed,this.particleRotationMaxSpeed),this._maxParticlesCountDirty&&this._renderer.setMaxParticlesCount(this.maxParticlesCount),this._additiveRenderingDirty&&this._renderer.setAdditiveRendering(this.additiveRendering),this._angleDirty){const i=this.getAngle();this._renderer.setAngle(i-this.angleB/2,i+this.angleB/2)}this._forceDirty&&this._renderer.setForce(this.forceMin,this.forceMax),this._zoneRadiusDirty&&this._renderer.setZoneRadius(this.zoneRadius),this._lifeTimeDirty&&this._renderer.setLifeTime(this.lifeTimeMin,this.lifeTimeMax),this._gravityDirty&&this._renderer.setGravity(this.gravityX,this.gravityY),this._colorDirty&&this._renderer.setColor(this.color1,this.color2),this._sizeDirty&&this._renderer.setSize(this.size1,this.size2),this._alphaDirty&&this._renderer.setAlpha(this.alpha1,this.alpha2),(this._flowDirty||this._tankDirty)&&this._renderer.resetEmission(this.flow,this.tank),this._textureDirty&&this._renderer.setTextureName(this.texture,e),this._posDirty=this._angleDirty=this._forceDirty=this._zoneRadiusDirty=!1,this._lifeTimeDirty=this._gravityDirty=this._colorDirty=this._sizeDirty=!1,this._alphaDirty=this._flowDirty=this._textureDirty=this._tankDirty=!1,this._additiveRenderingDirty=this._maxParticlesCountDirty=this._particleRotationSpeedDirty=!1,this._renderer.update(this.getElapsedTime()/1e3),this.destroyWhenNoParticles&&this.getParticleCount()===0&&this._renderer.hasStarted()&&!this._isEmissionPaused&&this._renderer._mayHaveEndedEmission()&&this.deleteFromScene(),this.jumpForwardInTimeOnCreation>0&&this._jumpForwardInTimeCompleted===!1&&(this._renderer.update(this.jumpForwardInTimeOnCreation),this._jumpForwardInTimeCompleted=!0)}onDestroyed(){this._renderer.destroy(),super.onDestroyed()}getEmitterForceMin(){return this.forceMin}setEmitterForceMin(e){e<0&&(e=0),this.forceMin!==e&&(this._forceDirty=!0,this.forceMin=e)}getEmitterForceMax(){return this.forceMax}setEmitterForceMax(e){e<0&&(e=0),this.forceMax!==e&&(this._forceDirty=!0,this.forceMax=e)}setParticleRotationMinSpeed(e){this.particleRotationMinSpeed!==e&&(this._particleRotationSpeedDirty=!0,this.particleRotationMinSpeed=e)}getParticleRotationMinSpeed(){return this.particleRotationMinSpeed}setParticleRotationMaxSpeed(e){this.particleRotationMaxSpeed!==e&&(this._particleRotationSpeedDirty=!0,this.particleRotationMaxSpeed=e)}getParticleRotationMaxSpeed(){return this.particleRotationMaxSpeed}setMaxParticlesCount(e){this.maxParticlesCount!==e&&(this._maxParticlesCountDirty=!0,this.maxParticlesCount=e)}getMaxParticlesCount(){return this.maxParticlesCount}setAdditiveRendering(e){this.additiveRendering!==e&&(this._additiveRenderingDirty=!0,this.additiveRendering=e)}getAdditiveRendering(){return this.additiveRendering}getEmitterAngle(){return(this.angleA+this.angleB)/2}setEmitterAngle(e){const i=this.getEmitterAngle();e!==i&&(this._angleDirty=!0,this.angleA+=e-i,this.angleB+=e-i)}getEmitterAngleA(){return this.angleA}setEmitterAngleA(e){this.angleA!==e&&(this._angleDirty=!0,this.angleA=e)}getEmitterAngleB(){return this.angleB}setEmitterAngleB(e){this.angleB!==e&&(this._angleDirty=!0,this.angleB=e)}getConeSprayAngle(){return this.getEmitterAngleB()}setConeSprayAngle(e){this.setEmitterAngleB(e)}getZoneRadius(){return this.zoneRadius}setZoneRadius(e){e<0&&(e=0),this.zoneRadius!==e&&e>0&&(this._zoneRadiusDirty=!0,this.zoneRadius=e)}getParticleLifeTimeMin(){return this.lifeTimeMin}setParticleLifeTimeMin(e){e<0&&(e=0),this.lifeTimeMin!==e&&(this._lifeTimeDirty=!0,this.lifeTimeMin=e)}getParticleLifeTimeMax(){return this.lifeTimeMax}setParticleLifeTimeMax(e){e<0&&(e=0),this.lifeTimeMax!==e&&(this._lifeTimeDirty=!0,this.lifeTimeMax=e)}getParticleGravityX(){return this.gravityX}setParticleGravityX(e){this.gravityX!==e&&(this._gravityDirty=!0,this.gravityX=e)}getParticleGravityY(){return this.gravityY}setParticleGravityY(e){this.gravityY!==e&&(this._gravityDirty=!0,this.gravityY=e)}getParticleGravityAngle(){return Math.atan2(this.gravityY,this.gravityX)*180/Math.PI}setParticleGravityAngle(e){if(this.getParticleGravityAngle()!==e){this._gravityDirty=!0;const r=this.getParticleGravityLength();this.gravityX=r*Math.cos(e*Math.PI/180),this.gravityY=r*Math.sin(e*Math.PI/180)}}getParticleGravityLength(){return Math.sqrt(this.gravityX*this.gravityX+this.gravityY*this.gravityY)}setParticleGravityLength(e){e<0&&(e=0);const i=this.getParticleGravityLength();i!==e&&(this._gravityDirty=!0,this.gravityX*=e/i,this.gravityY*=e/i)}getParticleRed1(){return t.hexNumberToRGBArray(this.color1)[0]}setParticleRed1(e){e<0&&(e=0),e>255&&(e=255);const i=t.hexNumberToRGBArray(this.color1);this.setParticleColor1AsNumber(t.rgbToHexNumber(e,i[1],i[2]))}getParticleRed2(){return t.hexNumberToRGBArray(this.color2)[0]}setParticleRed2(e){e<0&&(e=0),e>255&&(e=255);const i=t.hexNumberToRGBArray(this.color2);this.setParticleColor2AsNumber(t.rgbToHexNumber(e,i[1],i[2]))}getParticleGreen1(){return t.hexNumberToRGBArray(this.color1)[1]}setParticleGreen1(e){e<0&&(e=0),e>255&&(e=255);const i=t.hexNumberToRGBArray(this.color1);this.setParticleColor1AsNumber(t.rgbToHexNumber(i[0],e,i[2]))}getParticleGreen2(){return t.hexNumberToRGBArray(this.color2)[1]}setParticleGreen2(e){e<0&&(e=0),e>255&&(e=255);const i=t.hexNumberToRGBArray(this.color2);this.setParticleColor2AsNumber(t.rgbToHexNumber(i[0],e,i[2]))}getParticleBlue1(){return t.hexNumberToRGBArray(this.color1)[2]}setParticleBlue1(e){e<0&&(e=0),e>255&&(e=255);const i=t.hexNumberToRGBArray(this.color1);this.setParticleColor1AsNumber(t.rgbToHexNumber(i[0],i[1],e))}getParticleBlue2(){return t.hexNumberToRGBArray(this.color2)[2]}setParticleBlue2(e){e<0&&(e=0),e>255&&(e=255);const i=t.hexNumberToRGBArray(this.color2);this.setParticleColor2AsNumber(t.rgbToHexNumber(i[0],i[1],e))}setParticleColor1AsNumber(e){this.color1=e,this._colorDirty=!0}setParticleColor1(e){this.setParticleColor1AsNumber(t.rgbOrHexStringToNumber(e))}setParticleColor2AsNumber(e){this.color2=e,this._colorDirty=!0}setParticleColor2(e){this.setParticleColor2AsNumber(t.rgbOrHexStringToNumber(e))}getParticleSize1(){return this.size1}setParticleSize1(e){e<0&&(e=0),this.size1!==e&&(this._sizeDirty=!0,this.size1=e)}getParticleSize2(){return this.size2}setParticleSize2(e){this.size2!==e&&(this._sizeDirty=!0,this.size2=e)}getParticleAlpha1(){return this.alpha1}setParticleAlpha1(e){this.alpha1!==e&&(this._alphaDirty=!0,this.alpha1=e)}getParticleAlpha2(){return this.alpha2}setParticleAlpha2(e){this.alpha2!==e&&(this._alphaDirty=!0,this.alpha2=e)}startEmission(){this._isEmissionPaused=!1,this._renderer.start()}stopEmission(){this._isEmissionPaused=!0,this._renderer.stop()}isEmitting(){return this._renderer.emitter.emit}noMoreParticles(){return!this.isEmitting()}recreateParticleSystem(){this._renderer.recreate()}getFlow(){return this.flow}setFlow(e){this.flow!==e&&(this.flow=e,this._flowDirty=!0)}getParticleCount(){return this._renderer.getParticleCount()}getTank(){return this.tank}setTank(e){this.tank=e,this._tankDirty=!0}getTexture(){return this.texture}setTexture(e,i){this.texture!==e&&this._renderer.isTextureNameValid(e,i)&&(this.texture=e,this._textureDirty=!0)}jumpEmitterForwardInTime(e){this._renderer.update(e)}}t.ParticleEmitterObject=s,t.registerObject("ParticleSystem::ParticleEmitter",t.ParticleEmitterObject)})(gdjs||(gdjs={}));
1
+ var gdjs;(function(t){class s extends t.RuntimeObject{constructor(e,i){super(e,i);this._jumpForwardInTimeCompleted=!1;this._posDirty=!0;this._angleDirty=!0;this._forceDirty=!0;this._zoneRadiusDirty=!0;this._lifeTimeDirty=!0;this._gravityDirty=!0;this._colorDirty=!0;this._sizeDirty=!0;this._alphaDirty=!0;this._flowDirty=!0;this._tankDirty=!0;this._particleRotationSpeedDirty=!0;this._maxParticlesCountDirty=!0;this._additiveRenderingDirty=!0;this._isEmissionPaused=!1;this._renderer=new t.ParticleEmitterObjectRenderer(e,this,i),this.angleA=i.emitterAngleA,this.angleB=i.emitterAngleB,this.forceMin=i.emitterForceMin,this.forceMax=i.emitterForceMax,this.zoneRadius=i.zoneRadius,this.lifeTimeMin=i.particleLifeTimeMin,this.lifeTimeMax=i.particleLifeTimeMax,this.gravityX=i.particleGravityX,this.gravityY=i.particleGravityY,this.color1=t.rgbOrHexStringToNumber(i.particleColor1),this.color2=t.rgbOrHexStringToNumber(i.particleColor2),this.size1=i.particleSize1,this.size2=i.particleSize2,this.alpha1=i.particleAlpha1,this.alpha2=i.particleAlpha2,this.rendererType=i.rendererType,this.rendererParam1=i.rendererParam1,this.rendererParam2=i.rendererParam2,this.texture=i.textureParticleName,this.flow=i.flow,this.tank=i.tank,this.destroyWhenNoParticles=i.destroyWhenNoParticles,this.particleRotationMinSpeed=i.particleAngle1,this.particleRotationMaxSpeed=i.particleAngle2,this.maxParticlesCount=i.maxParticleNb,this.additiveRendering=i.additive,this.jumpForwardInTimeOnCreation=i.jumpForwardInTimeOnCreation,this._textureDirty=this.texture!=="",this.onCreated()}setX(e){this.x!==e&&(this._posDirty=!0),super.setX(e)}setY(e){this.y!==e&&(this._posDirty=!0),super.setY(e)}setAngle(e){this.angle!==e&&(this._angleDirty=!0),super.setAngle(e)}getRendererObject(){return this._renderer.getRendererObject()}updateFromObjectData(e,i){return e.emitterAngleA!==i.emitterAngleA&&this.setEmitterAngleA(i.emitterAngleA),e.emitterAngleB!==i.emitterAngleB&&this.setEmitterAngleB(i.emitterAngleB),e.emitterForceMin!==i.emitterForceMin&&this.setEmitterForceMin(i.emitterForceMin),e.particleAngle1!==i.particleAngle1&&this.setParticleRotationMinSpeed(i.particleAngle1),e.particleAngle2!==i.particleAngle2&&this.setParticleRotationMaxSpeed(i.particleAngle2),e.maxParticleNb!==i.maxParticleNb&&this.setMaxParticlesCount(i.maxParticleNb),e.additive!==i.additive&&this.setAdditiveRendering(i.additive),e.emitterForceMax!==i.emitterForceMax&&this.setEmitterForceMax(i.emitterForceMax),e.zoneRadius!==i.zoneRadius&&this.setZoneRadius(i.zoneRadius),e.particleLifeTimeMin!==i.particleLifeTimeMin&&this.setParticleLifeTimeMin(i.particleLifeTimeMin),e.particleLifeTimeMax!==i.particleLifeTimeMax&&this.setParticleLifeTimeMax(i.particleLifeTimeMax),e.particleGravityX!==i.particleGravityX&&this.setParticleGravityX(i.particleGravityX),e.particleGravityY!==i.particleGravityY&&this.setParticleGravityY(i.particleGravityY),e.particleColor1!==i.particleColor1&&this.setParticleColor1(i.particleColor1),e.particleColor2!==i.particleColor2&&this.setParticleColor2(i.particleColor2),e.particleSize1!==i.particleSize1&&this.setParticleSize1(i.particleSize1),e.particleSize2!==i.particleSize2&&this.setParticleSize2(i.particleSize2),e.particleAlpha1!==i.particleAlpha1&&this.setParticleAlpha1(i.particleAlpha1),e.particleAlpha2!==i.particleAlpha2&&this.setParticleAlpha2(i.particleAlpha2),e.textureParticleName!==i.textureParticleName&&this.setTexture(i.textureParticleName,this.getRuntimeScene()),e.flow!==i.flow&&this.setFlow(i.flow),e.tank!==i.tank&&this.setTank(i.tank),e.destroyWhenNoParticles!==i.destroyWhenNoParticles&&(this.destroyWhenNoParticles=i.destroyWhenNoParticles),(e.particleSizeRandomness1!==i.particleSizeRandomness1||e.particleSizeRandomness2!==i.particleSizeRandomness2||e.particleAngle1!==i.particleAngle1||e.particleAngle2!==i.particleAngle2||e.maxParticleNb!==i.maxParticleNb||e.additive!==i.additive||e.rendererType!==i.rendererType||e.rendererParam1!==i.rendererParam1||e.rendererParam2!==i.rendererParam2)&&(this.getInstanceContainer().getLayer(this.layer).getRenderer().removeRendererObject(this._renderer.getRendererObject()),this._renderer.destroy(),this._renderer=new t.ParticleEmitterObjectRenderer(this.getInstanceContainer(),this,i),this._posDirty=this._angleDirty=this._forceDirty=this._zoneRadiusDirty=!0,this._lifeTimeDirty=this._gravityDirty=this._colorDirty=this._sizeDirty=!0,this._alphaDirty=this._flowDirty=this._tankDirty=this._textureDirty=!0),!0}getNetworkSyncData(e){return{...super.getNetworkSyncData(e),prms:this.particleRotationMinSpeed,prmx:this.particleRotationMaxSpeed,mpc:this.maxParticlesCount,addr:this.additiveRendering,angb:this.angleB,formin:this.forceMin,formax:this.forceMax,zr:this.zoneRadius,ltmin:this.lifeTimeMin,ltmax:this.lifeTimeMax,gravx:this.gravityX,gravy:this.gravityY,color1:this.color1,color2:this.color2,size1:this.size1,size2:this.size2,alp1:this.alpha1,alp2:this.alpha2,flow:this.flow,tank:this.tank,text:this.texture,paused:this._isEmissionPaused}}updateFromNetworkSyncData(e,i){super.updateFromNetworkSyncData(e,i),e.x!==void 0&&this.setX(e.x),e.y!==void 0&&this.setY(e.y),e.a!==void 0&&this.setAngle(e.a),e.prms!==void 0&&this.setParticleRotationMinSpeed(e.prms),e.prmx!==void 0&&this.setParticleRotationMaxSpeed(e.prmx),e.mpc!==void 0&&this.setMaxParticlesCount(e.mpc),e.addr!==void 0&&this.setAdditiveRendering(e.addr),e.angb!==void 0&&this.setEmitterAngleB(e.angb),e.formin!==void 0&&this.setEmitterForceMin(e.formin),e.formax!==void 0&&this.setEmitterForceMax(e.formax),e.zr!==void 0&&this.setZoneRadius(e.zr),e.ltmin!==void 0&&this.setParticleLifeTimeMin(e.ltmin),e.ltmax!==void 0&&this.setParticleLifeTimeMax(e.ltmax),e.gravx!==void 0&&this.setParticleGravityX(e.gravx),e.gravy!==void 0&&this.setParticleGravityY(e.gravy),e.color1!==void 0&&this.setParticleColor1AsNumber(e.color1),e.color2!==void 0&&this.setParticleColor2AsNumber(e.color2),e.size1!==void 0&&this.setParticleSize1(e.size1),e.size2!==void 0&&this.setParticleSize2(e.size2),e.alp1!==void 0&&this.setParticleAlpha1(e.alp1),e.alp2!==void 0&&this.setParticleAlpha2(e.alp2),e.flow!==void 0&&this.setFlow(e.flow),e.tank!==void 0&&this.setTank(e.tank),e.text!==void 0&&this.setTexture(e.text,this.getRuntimeScene()),e.paused!==void 0&&(e.paused?this.stopEmission():this.startEmission())}update(e){if(this._posDirty&&this._renderer.setPosition(this.getX(),this.getY()),this._particleRotationSpeedDirty&&this._renderer.setParticleRotationSpeed(this.particleRotationMinSpeed,this.particleRotationMaxSpeed),this._maxParticlesCountDirty&&this._renderer.setMaxParticlesCount(this.maxParticlesCount),this._additiveRenderingDirty&&this._renderer.setAdditiveRendering(this.additiveRendering),this._angleDirty){const i=this.getAngle();this._renderer.setAngle(i-this.angleB/2,i+this.angleB/2)}this._forceDirty&&this._renderer.setForce(this.forceMin,this.forceMax),this._zoneRadiusDirty&&this._renderer.setZoneRadius(this.zoneRadius),this._lifeTimeDirty&&this._renderer.setLifeTime(this.lifeTimeMin,this.lifeTimeMax),this._gravityDirty&&this._renderer.setGravity(this.gravityX,this.gravityY),this._colorDirty&&this._renderer.setColor(this.color1,this.color2),this._sizeDirty&&this._renderer.setSize(this.size1,this.size2),this._alphaDirty&&this._renderer.setAlpha(this.alpha1,this.alpha2),(this._flowDirty||this._tankDirty)&&this._renderer.resetEmission(this.flow,this.tank),this._textureDirty&&this._renderer.setTextureName(this.texture,e),this._posDirty=this._angleDirty=this._forceDirty=this._zoneRadiusDirty=!1,this._lifeTimeDirty=this._gravityDirty=this._colorDirty=this._sizeDirty=!1,this._alphaDirty=this._flowDirty=this._textureDirty=this._tankDirty=!1,this._additiveRenderingDirty=this._maxParticlesCountDirty=this._particleRotationSpeedDirty=!1,this._renderer.update(this.getElapsedTime()/1e3),this.destroyWhenNoParticles&&this.getParticleCount()===0&&this._renderer.hasStarted()&&!this._isEmissionPaused&&this._renderer._mayHaveEndedEmission()&&this.deleteFromScene(),this.jumpForwardInTimeOnCreation>0&&this._jumpForwardInTimeCompleted===!1&&(this._renderer.update(this.jumpForwardInTimeOnCreation),this._jumpForwardInTimeCompleted=!0)}onDestroyed(){this._renderer.destroy(),super.onDestroyed()}getEmitterForceMin(){return this.forceMin}setEmitterForceMin(e){e<0&&(e=0),this.forceMin!==e&&(this._forceDirty=!0,this.forceMin=e)}getEmitterForceMax(){return this.forceMax}setEmitterForceMax(e){e<0&&(e=0),this.forceMax!==e&&(this._forceDirty=!0,this.forceMax=e)}setParticleRotationMinSpeed(e){this.particleRotationMinSpeed!==e&&(this._particleRotationSpeedDirty=!0,this.particleRotationMinSpeed=e)}getParticleRotationMinSpeed(){return this.particleRotationMinSpeed}setParticleRotationMaxSpeed(e){this.particleRotationMaxSpeed!==e&&(this._particleRotationSpeedDirty=!0,this.particleRotationMaxSpeed=e)}getParticleRotationMaxSpeed(){return this.particleRotationMaxSpeed}setMaxParticlesCount(e){this.maxParticlesCount!==e&&(this._maxParticlesCountDirty=!0,this.maxParticlesCount=e)}getMaxParticlesCount(){return this.maxParticlesCount}setAdditiveRendering(e){this.additiveRendering!==e&&(this._additiveRenderingDirty=!0,this.additiveRendering=e)}getAdditiveRendering(){return this.additiveRendering}getEmitterAngle(){return(this.angleA+this.angleB)/2}setEmitterAngle(e){const i=this.getEmitterAngle();e!==i&&(this._angleDirty=!0,this.angleA+=e-i,this.angleB+=e-i)}getEmitterAngleA(){return this.angleA}setEmitterAngleA(e){this.angleA!==e&&(this._angleDirty=!0,this.angleA=e)}getEmitterAngleB(){return this.angleB}setEmitterAngleB(e){this.angleB!==e&&(this._angleDirty=!0,this.angleB=e)}getConeSprayAngle(){return this.getEmitterAngleB()}setConeSprayAngle(e){this.setEmitterAngleB(e)}getZoneRadius(){return this.zoneRadius}setZoneRadius(e){e<0&&(e=0),this.zoneRadius!==e&&e>0&&(this._zoneRadiusDirty=!0,this.zoneRadius=e)}getParticleLifeTimeMin(){return this.lifeTimeMin}setParticleLifeTimeMin(e){e<0&&(e=0),this.lifeTimeMin!==e&&(this._lifeTimeDirty=!0,this.lifeTimeMin=e)}getParticleLifeTimeMax(){return this.lifeTimeMax}setParticleLifeTimeMax(e){e<0&&(e=0),this.lifeTimeMax!==e&&(this._lifeTimeDirty=!0,this.lifeTimeMax=e)}getParticleGravityX(){return this.gravityX}setParticleGravityX(e){this.gravityX!==e&&(this._gravityDirty=!0,this.gravityX=e)}getParticleGravityY(){return this.gravityY}setParticleGravityY(e){this.gravityY!==e&&(this._gravityDirty=!0,this.gravityY=e)}getParticleGravityAngle(){return Math.atan2(this.gravityY,this.gravityX)*180/Math.PI}setParticleGravityAngle(e){if(this.getParticleGravityAngle()!==e){this._gravityDirty=!0;const r=this.getParticleGravityLength();this.gravityX=r*Math.cos(e*Math.PI/180),this.gravityY=r*Math.sin(e*Math.PI/180)}}getParticleGravityLength(){return Math.sqrt(this.gravityX*this.gravityX+this.gravityY*this.gravityY)}setParticleGravityLength(e){e<0&&(e=0);const i=this.getParticleGravityLength();i!==e&&(this._gravityDirty=!0,this.gravityX*=e/i,this.gravityY*=e/i)}getParticleRed1(){return t.hexNumberToRGBArray(this.color1)[0]}setParticleRed1(e){e<0&&(e=0),e>255&&(e=255);const i=t.hexNumberToRGBArray(this.color1);this.setParticleColor1AsNumber(t.rgbToHexNumber(e,i[1],i[2]))}getParticleRed2(){return t.hexNumberToRGBArray(this.color2)[0]}setParticleRed2(e){e<0&&(e=0),e>255&&(e=255);const i=t.hexNumberToRGBArray(this.color2);this.setParticleColor2AsNumber(t.rgbToHexNumber(e,i[1],i[2]))}getParticleGreen1(){return t.hexNumberToRGBArray(this.color1)[1]}setParticleGreen1(e){e<0&&(e=0),e>255&&(e=255);const i=t.hexNumberToRGBArray(this.color1);this.setParticleColor1AsNumber(t.rgbToHexNumber(i[0],e,i[2]))}getParticleGreen2(){return t.hexNumberToRGBArray(this.color2)[1]}setParticleGreen2(e){e<0&&(e=0),e>255&&(e=255);const i=t.hexNumberToRGBArray(this.color2);this.setParticleColor2AsNumber(t.rgbToHexNumber(i[0],e,i[2]))}getParticleBlue1(){return t.hexNumberToRGBArray(this.color1)[2]}setParticleBlue1(e){e<0&&(e=0),e>255&&(e=255);const i=t.hexNumberToRGBArray(this.color1);this.setParticleColor1AsNumber(t.rgbToHexNumber(i[0],i[1],e))}getParticleBlue2(){return t.hexNumberToRGBArray(this.color2)[2]}setParticleBlue2(e){e<0&&(e=0),e>255&&(e=255);const i=t.hexNumberToRGBArray(this.color2);this.setParticleColor2AsNumber(t.rgbToHexNumber(i[0],i[1],e))}setParticleColor1AsNumber(e){this.color1=e,this._colorDirty=!0}setParticleColor1(e){this.setParticleColor1AsNumber(t.rgbOrHexStringToNumber(e))}setParticleColor2AsNumber(e){this.color2=e,this._colorDirty=!0}setParticleColor2(e){this.setParticleColor2AsNumber(t.rgbOrHexStringToNumber(e))}getParticleSize1(){return this.size1}setParticleSize1(e){e<0&&(e=0),this.size1!==e&&(this._sizeDirty=!0,this.size1=e)}getParticleSize2(){return this.size2}setParticleSize2(e){this.size2!==e&&(this._sizeDirty=!0,this.size2=e)}getParticleAlpha1(){return this.alpha1}setParticleAlpha1(e){this.alpha1!==e&&(this._alphaDirty=!0,this.alpha1=e)}getParticleAlpha2(){return this.alpha2}setParticleAlpha2(e){this.alpha2!==e&&(this._alphaDirty=!0,this.alpha2=e)}startEmission(){this._isEmissionPaused=!1,this._renderer.start()}stopEmission(){this._isEmissionPaused=!0,this._renderer.stop()}isEmitting(){return this._renderer.emitter.emit}noMoreParticles(){return!this.isEmitting()}recreateParticleSystem(){this._renderer.recreate()}getFlow(){return this.flow}setFlow(e){this.flow!==e&&(this.flow=e,this._flowDirty=!0)}getParticleCount(){return this._renderer.getParticleCount()}getTank(){return this.tank}setTank(e){this.tank=e,this._tankDirty=!0}getTexture(){return this.texture}setTexture(e,i){this.texture!==e&&this._renderer.isTextureNameValid(e,i)&&(this.texture=e,this._textureDirty=!0)}jumpEmitterForwardInTime(e){this._renderer.update(e)}}t.ParticleEmitterObject=s,t.registerObject("ParticleSystem::ParticleEmitter",t.ParticleEmitterObject)})(gdjs||(gdjs={}));
2
2
  //# sourceMappingURL=particleemitterobject.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../GDevelop/Extensions/ParticleSystem/particleemitterobject.ts"],
4
- "sourcesContent": ["/*\n * GDevelop - Particle System Extension\n * Copyright (c) 2010-2016 Florian Rival (Florian.Rival@gmail.com)\n * This project is released under the MIT License.\n */\n\nnamespace gdjs {\n export type ParticleEmitterObjectDataType = {\n /**\n * @deprecated Data not used\n */\n emitterAngleA: number;\n emitterForceMin: number;\n /**\n * Cone spray angle (degrees)\n */\n emitterAngleB: number;\n zoneRadius: number;\n emitterForceMax: number;\n particleLifeTimeMax: number;\n particleLifeTimeMin: number;\n particleGravityY: number;\n particleGravityX: number;\n particleColor2: string;\n particleColor1: string;\n particleSize2: number;\n particleSize1: number;\n /**\n * Particle max rotation speed (degrees/second)\n */\n particleAngle2: number;\n /**\n * Particle min rotation speed (degrees/second)\n */\n particleAngle1: number;\n particleAlpha1: number;\n rendererType: string;\n particleAlpha2: number;\n rendererParam2: number;\n rendererParam1: number;\n particleSizeRandomness1: number;\n particleSizeRandomness2: number;\n maxParticleNb: number;\n additive: boolean;\n /** Resource name for image in particle */\n textureParticleName: string;\n tank: number;\n flow: number;\n /** Destroy the object when there is no particles? */\n destroyWhenNoParticles: boolean;\n jumpForwardInTimeOnCreation: number;\n };\n\n export type ParticleEmitterObjectData = ObjectData &\n ParticleEmitterObjectDataType;\n\n export type ParticleEmitterObjectNetworkSyncDataType = {\n // Technically, all attributes can change at runtime, so we sync as many as possible.\n // TODO: ensure we only send props that change to optimize the sync.\n // dirty attributes are not synced, they are defined by the update method if the value has changed.\n // Particle Rotation Speed\n prms: number;\n prmx: number;\n // Max Particles Count\n mpc: number;\n // Additive Rendering\n addr: boolean;\n // Angle\n angb: number;\n // Force\n formin: number;\n formax: number;\n // Zone Radius\n zr: number;\n // Life Time\n ltmin: number;\n ltmax: number;\n // Gravity\n gravx: number;\n gravy: number;\n // Color\n color1: number;\n color2: number;\n // Size\n size1: number;\n size2: number;\n // Alpha\n alp1: number;\n alp2: number;\n // Flow\n flow: number;\n // Tank\n tank: number;\n // Texture\n text: string;\n // Pause\n paused: boolean;\n };\n\n export type ParticleEmitterObjectNetworkSyncData = ObjectNetworkSyncData &\n ParticleEmitterObjectNetworkSyncDataType;\n\n /**\n * Displays particles.\n */\n export class ParticleEmitterObject extends gdjs.RuntimeObject {\n /**\n * @deprecated Data not used\n */\n angleA: number;\n angleB: number;\n forceMin: number;\n forceMax: float;\n zoneRadius: number;\n lifeTimeMin: number;\n lifeTimeMax: float;\n gravityX: number;\n gravityY: number;\n color1: number;\n color2: number;\n size1: number;\n size2: number;\n alpha1: number;\n alpha2: number;\n rendererType: string;\n rendererParam1: number;\n rendererParam2: number;\n texture: string;\n flow: number;\n tank: number;\n destroyWhenNoParticles: boolean;\n particleRotationMinSpeed: number;\n particleRotationMaxSpeed: number;\n maxParticlesCount: number;\n additiveRendering: boolean;\n jumpForwardInTimeOnCreation: number;\n _jumpForwardInTimeCompleted: boolean = false;\n _posDirty: boolean = true;\n _angleDirty: boolean = true;\n _forceDirty: boolean = true;\n _zoneRadiusDirty: boolean = true;\n _lifeTimeDirty: boolean = true;\n _gravityDirty: boolean = true;\n _colorDirty: boolean = true;\n _sizeDirty: boolean = true;\n _alphaDirty: boolean = true;\n _flowDirty: boolean = true;\n _tankDirty: boolean = true;\n _particleRotationSpeedDirty: boolean = true;\n _maxParticlesCountDirty: boolean = true;\n _additiveRenderingDirty: boolean = true;\n // Don't mark texture as dirty if not using one.\n _textureDirty: boolean;\n /**\n * `true` only when the emission is paused by events.\n * It allows to tell the end of emission apart from it.\n */\n _isEmissionPaused: boolean = false;\n\n // @ts-ignore\n _renderer: gdjs.ParticleEmitterObjectRenderer;\n\n /**\n * @param instanceContainer the container the object belongs to\n * @param particleObjectData The initial properties of the object\n */\n constructor(\n instanceContainer: gdjs.RuntimeInstanceContainer,\n particleObjectData: ParticleEmitterObjectData\n ) {\n super(instanceContainer, particleObjectData);\n this._renderer = new gdjs.ParticleEmitterObjectRenderer(\n instanceContainer,\n this,\n particleObjectData\n );\n this.angleA = particleObjectData.emitterAngleA;\n this.angleB = particleObjectData.emitterAngleB;\n this.forceMin = particleObjectData.emitterForceMin;\n this.forceMax = particleObjectData.emitterForceMax;\n this.zoneRadius = particleObjectData.zoneRadius;\n this.lifeTimeMin = particleObjectData.particleLifeTimeMin;\n this.lifeTimeMax = particleObjectData.particleLifeTimeMax;\n this.gravityX = particleObjectData.particleGravityX;\n this.gravityY = particleObjectData.particleGravityY;\n this.color1 = gdjs.rgbOrHexStringToNumber(\n particleObjectData.particleColor1\n );\n this.color2 = gdjs.rgbOrHexStringToNumber(\n particleObjectData.particleColor2\n );\n this.size1 = particleObjectData.particleSize1;\n this.size2 = particleObjectData.particleSize2;\n this.alpha1 = particleObjectData.particleAlpha1;\n this.alpha2 = particleObjectData.particleAlpha2;\n this.rendererType = particleObjectData.rendererType;\n this.rendererParam1 = particleObjectData.rendererParam1;\n this.rendererParam2 = particleObjectData.rendererParam2;\n this.texture = particleObjectData.textureParticleName;\n this.flow = particleObjectData.flow;\n this.tank = particleObjectData.tank;\n this.destroyWhenNoParticles = particleObjectData.destroyWhenNoParticles;\n this.particleRotationMinSpeed = particleObjectData.particleAngle1;\n this.particleRotationMaxSpeed = particleObjectData.particleAngle2;\n this.maxParticlesCount = particleObjectData.maxParticleNb;\n this.additiveRendering = particleObjectData.additive;\n this.jumpForwardInTimeOnCreation =\n particleObjectData.jumpForwardInTimeOnCreation;\n this._textureDirty = this.texture !== '';\n\n // *ALWAYS* call `this.onCreated()` at the very end of your object constructor.\n this.onCreated();\n }\n\n setX(x: number): void {\n if (this.x !== x) {\n this._posDirty = true;\n }\n super.setX(x);\n }\n\n setY(y: number): void {\n if (this.y !== y) {\n this._posDirty = true;\n }\n super.setY(y);\n }\n\n setAngle(angle): void {\n if (this.angle !== angle) {\n this._angleDirty = true;\n }\n super.setAngle(angle);\n }\n\n getRendererObject() {\n return this._renderer.getRendererObject();\n }\n\n updateFromObjectData(\n oldObjectData: ParticleEmitterObjectData,\n newObjectData: ParticleEmitterObjectData\n ): boolean {\n if (oldObjectData.emitterAngleA !== newObjectData.emitterAngleA) {\n this.setEmitterAngleA(newObjectData.emitterAngleA);\n }\n if (oldObjectData.emitterAngleB !== newObjectData.emitterAngleB) {\n this.setEmitterAngleB(newObjectData.emitterAngleB);\n }\n if (oldObjectData.emitterForceMin !== newObjectData.emitterForceMin) {\n this.setEmitterForceMin(newObjectData.emitterForceMin);\n }\n if (oldObjectData.particleAngle1 !== newObjectData.particleAngle1) {\n this.setParticleRotationMinSpeed(newObjectData.particleAngle1);\n }\n if (oldObjectData.particleAngle2 !== newObjectData.particleAngle2) {\n this.setParticleRotationMaxSpeed(newObjectData.particleAngle2);\n }\n if (oldObjectData.maxParticleNb !== newObjectData.maxParticleNb) {\n this.setMaxParticlesCount(newObjectData.maxParticleNb);\n }\n if (oldObjectData.additive !== newObjectData.additive) {\n this.setAdditiveRendering(newObjectData.additive);\n }\n if (oldObjectData.emitterForceMax !== newObjectData.emitterForceMax) {\n this.setEmitterForceMax(newObjectData.emitterForceMax);\n }\n if (oldObjectData.zoneRadius !== newObjectData.zoneRadius) {\n this.setZoneRadius(newObjectData.zoneRadius);\n }\n if (\n oldObjectData.particleLifeTimeMin !== newObjectData.particleLifeTimeMin\n ) {\n this.setParticleLifeTimeMin(newObjectData.particleLifeTimeMin);\n }\n if (\n oldObjectData.particleLifeTimeMax !== newObjectData.particleLifeTimeMax\n ) {\n this.setParticleLifeTimeMax(newObjectData.particleLifeTimeMax);\n }\n if (oldObjectData.particleGravityX !== newObjectData.particleGravityX) {\n this.setParticleGravityX(newObjectData.particleGravityX);\n }\n if (oldObjectData.particleGravityY !== newObjectData.particleGravityY) {\n this.setParticleGravityY(newObjectData.particleGravityY);\n }\n if (oldObjectData.particleColor1 !== newObjectData.particleColor1) {\n this.setParticleColor1(newObjectData.particleColor1);\n }\n if (oldObjectData.particleColor2 !== newObjectData.particleColor2) {\n this.setParticleColor2(newObjectData.particleColor2);\n }\n if (oldObjectData.particleSize1 !== newObjectData.particleSize1) {\n this.setParticleSize1(newObjectData.particleSize1);\n }\n if (oldObjectData.particleSize2 !== newObjectData.particleSize2) {\n this.setParticleSize2(newObjectData.particleSize2);\n }\n if (oldObjectData.particleAlpha1 !== newObjectData.particleAlpha1) {\n this.setParticleAlpha1(newObjectData.particleAlpha1);\n }\n if (oldObjectData.particleAlpha2 !== newObjectData.particleAlpha2) {\n this.setParticleAlpha2(newObjectData.particleAlpha2);\n }\n if (\n oldObjectData.textureParticleName !== newObjectData.textureParticleName\n ) {\n this.setTexture(\n newObjectData.textureParticleName,\n this.getRuntimeScene()\n );\n }\n if (oldObjectData.flow !== newObjectData.flow) {\n this.setFlow(newObjectData.flow);\n }\n if (oldObjectData.tank !== newObjectData.tank) {\n this.setTank(newObjectData.tank);\n }\n if (\n oldObjectData.destroyWhenNoParticles !==\n newObjectData.destroyWhenNoParticles\n ) {\n this.destroyWhenNoParticles = newObjectData.destroyWhenNoParticles;\n }\n if (\n oldObjectData.particleSizeRandomness1 !==\n newObjectData.particleSizeRandomness1 ||\n oldObjectData.particleSizeRandomness2 !==\n newObjectData.particleSizeRandomness2 ||\n oldObjectData.particleAngle1 !== newObjectData.particleAngle1 ||\n oldObjectData.particleAngle2 !== newObjectData.particleAngle2 ||\n oldObjectData.maxParticleNb !== newObjectData.maxParticleNb ||\n oldObjectData.additive !== newObjectData.additive ||\n oldObjectData.rendererType !== newObjectData.rendererType ||\n oldObjectData.rendererParam1 !== newObjectData.rendererParam1 ||\n oldObjectData.rendererParam2 !== newObjectData.rendererParam2\n ) {\n // Destroy the renderer, ensure it's removed from the layer.\n const layer = this.getInstanceContainer().getLayer(this.layer);\n layer\n .getRenderer()\n .removeRendererObject(this._renderer.getRendererObject());\n this._renderer.destroy();\n\n // and recreate the renderer, which will add itself to the layer.\n this._renderer = new gdjs.ParticleEmitterObjectRenderer(\n this.getInstanceContainer(),\n this,\n newObjectData\n );\n\n // Consider every state dirty as the renderer was just re-created, so it needs\n // to be repositioned, angle updated, etc...\n this._posDirty =\n this._angleDirty =\n this._forceDirty =\n this._zoneRadiusDirty =\n true;\n this._lifeTimeDirty =\n this._gravityDirty =\n this._colorDirty =\n this._sizeDirty =\n true;\n this._alphaDirty =\n this._flowDirty =\n this._tankDirty =\n this._textureDirty =\n true;\n }\n return true;\n }\n\n getNetworkSyncData(): ParticleEmitterObjectNetworkSyncData {\n return {\n ...super.getNetworkSyncData(),\n prms: this.particleRotationMinSpeed,\n prmx: this.particleRotationMaxSpeed,\n mpc: this.maxParticlesCount,\n addr: this.additiveRendering,\n angb: this.angleB,\n formin: this.forceMin,\n formax: this.forceMax,\n zr: this.zoneRadius,\n ltmin: this.lifeTimeMin,\n ltmax: this.lifeTimeMax,\n gravx: this.gravityX,\n gravy: this.gravityY,\n color1: this.color1,\n color2: this.color2,\n size1: this.size1,\n size2: this.size2,\n alp1: this.alpha1,\n alp2: this.alpha2,\n flow: this.flow,\n tank: this.tank,\n text: this.texture,\n paused: this._isEmissionPaused,\n };\n }\n\n updateFromNetworkSyncData(\n syncData: ParticleEmitterObjectNetworkSyncData\n ): void {\n super.updateFromNetworkSyncData(syncData);\n if (syncData.x !== undefined) {\n this.setX(syncData.x);\n }\n if (syncData.y !== undefined) {\n this.setY(syncData.y);\n }\n if (syncData.a !== undefined) {\n this.setAngle(syncData.a);\n }\n if (syncData.prms !== undefined) {\n this.setParticleRotationMinSpeed(syncData.prms);\n }\n if (syncData.prmx !== undefined) {\n this.setParticleRotationMaxSpeed(syncData.prmx);\n }\n if (syncData.mpc !== undefined) {\n this.setMaxParticlesCount(syncData.mpc);\n }\n if (syncData.addr !== undefined) {\n this.setAdditiveRendering(syncData.addr);\n }\n if (syncData.angb !== undefined) {\n this.setEmitterAngleB(syncData.angb);\n }\n if (syncData.formin !== undefined) {\n this.setEmitterForceMin(syncData.formin);\n }\n if (syncData.formax !== undefined) {\n this.setEmitterForceMax(syncData.formax);\n }\n if (syncData.zr !== undefined) {\n this.setZoneRadius(syncData.zr);\n }\n if (syncData.ltmin !== undefined) {\n this.setParticleLifeTimeMin(syncData.ltmin);\n }\n if (syncData.ltmax !== undefined) {\n this.setParticleLifeTimeMax(syncData.ltmax);\n }\n if (syncData.gravx !== undefined) {\n this.setParticleGravityX(syncData.gravx);\n }\n if (syncData.gravy !== undefined) {\n this.setParticleGravityY(syncData.gravy);\n }\n if (syncData.color1 !== undefined) {\n this.setParticleColor1AsNumber(syncData.color1);\n }\n if (syncData.color2 !== undefined) {\n this.setParticleColor2AsNumber(syncData.color2);\n }\n if (syncData.size1 !== undefined) {\n this.setParticleSize1(syncData.size1);\n }\n if (syncData.size2 !== undefined) {\n this.setParticleSize2(syncData.size2);\n }\n if (syncData.alp1 !== undefined) {\n this.setParticleAlpha1(syncData.alp1);\n }\n if (syncData.alp2 !== undefined) {\n this.setParticleAlpha2(syncData.alp2);\n }\n if (syncData.flow !== undefined) {\n this.setFlow(syncData.flow);\n }\n if (syncData.tank !== undefined) {\n this.setTank(syncData.tank);\n }\n if (syncData.text !== undefined) {\n this.setTexture(syncData.text, this.getRuntimeScene());\n }\n if (syncData.paused !== undefined) {\n if (syncData.paused) {\n this.stopEmission();\n } else {\n this.startEmission();\n }\n }\n }\n\n update(instanceContainer: gdjs.RuntimeInstanceContainer): void {\n if (this._posDirty) {\n this._renderer.setPosition(this.getX(), this.getY());\n }\n if (this._particleRotationSpeedDirty) {\n this._renderer.setParticleRotationSpeed(\n this.particleRotationMinSpeed,\n this.particleRotationMaxSpeed\n );\n }\n if (this._maxParticlesCountDirty) {\n this._renderer.setMaxParticlesCount(this.maxParticlesCount);\n }\n if (this._additiveRenderingDirty) {\n this._renderer.setAdditiveRendering(this.additiveRendering);\n }\n if (this._angleDirty) {\n const angle = this.getAngle();\n this._renderer.setAngle(\n angle - this.angleB / 2.0,\n angle + this.angleB / 2.0\n );\n }\n if (this._forceDirty) {\n this._renderer.setForce(this.forceMin, this.forceMax);\n }\n if (this._zoneRadiusDirty) {\n this._renderer.setZoneRadius(this.zoneRadius);\n }\n if (this._lifeTimeDirty) {\n this._renderer.setLifeTime(this.lifeTimeMin, this.lifeTimeMax);\n }\n if (this._gravityDirty) {\n this._renderer.setGravity(this.gravityX, this.gravityY);\n }\n if (this._colorDirty) {\n this._renderer.setColor(this.color1, this.color2);\n }\n if (this._sizeDirty) {\n this._renderer.setSize(this.size1, this.size2);\n }\n if (this._alphaDirty) {\n this._renderer.setAlpha(this.alpha1, this.alpha2);\n }\n if (this._flowDirty || this._tankDirty) {\n this._renderer.resetEmission(this.flow, this.tank);\n }\n if (this._textureDirty) {\n this._renderer.setTextureName(this.texture, instanceContainer);\n }\n this._posDirty =\n this._angleDirty =\n this._forceDirty =\n this._zoneRadiusDirty =\n false;\n this._lifeTimeDirty =\n this._gravityDirty =\n this._colorDirty =\n this._sizeDirty =\n false;\n this._alphaDirty =\n this._flowDirty =\n this._textureDirty =\n this._tankDirty =\n false;\n this._additiveRenderingDirty =\n this._maxParticlesCountDirty =\n this._particleRotationSpeedDirty =\n false;\n this._renderer.update(this.getElapsedTime() / 1000.0);\n if (\n this.destroyWhenNoParticles &&\n this.getParticleCount() === 0 &&\n this._renderer.hasStarted() &&\n !this._isEmissionPaused &&\n this._renderer._mayHaveEndedEmission()\n ) {\n this.deleteFromScene();\n }\n if (\n this.jumpForwardInTimeOnCreation > 0 &&\n this._jumpForwardInTimeCompleted === false\n ) {\n this._renderer.update(this.jumpForwardInTimeOnCreation);\n this._jumpForwardInTimeCompleted = true;\n }\n }\n\n onDestroyed(): void {\n this._renderer.destroy();\n super.onDestroyed();\n }\n\n getEmitterForceMin(): number {\n return this.forceMin;\n }\n\n setEmitterForceMin(force: float): void {\n if (force < 0) {\n force = 0;\n }\n if (this.forceMin !== force) {\n this._forceDirty = true;\n this.forceMin = force;\n }\n }\n\n getEmitterForceMax(): number {\n return this.forceMax;\n }\n\n setEmitterForceMax(force: float): void {\n if (force < 0) {\n force = 0;\n }\n if (this.forceMax !== force) {\n this._forceDirty = true;\n this.forceMax = force;\n }\n }\n\n setParticleRotationMinSpeed(speed: number): void {\n if (this.particleRotationMinSpeed !== speed) {\n this._particleRotationSpeedDirty = true;\n this.particleRotationMinSpeed = speed;\n }\n }\n\n getParticleRotationMinSpeed(): number {\n return this.particleRotationMinSpeed;\n }\n\n setParticleRotationMaxSpeed(speed: number): void {\n if (this.particleRotationMaxSpeed !== speed) {\n this._particleRotationSpeedDirty = true;\n this.particleRotationMaxSpeed = speed;\n }\n }\n\n getParticleRotationMaxSpeed(): number {\n return this.particleRotationMaxSpeed;\n }\n\n setMaxParticlesCount(count: number): void {\n if (this.maxParticlesCount !== count) {\n this._maxParticlesCountDirty = true;\n this.maxParticlesCount = count;\n }\n }\n\n getMaxParticlesCount(): number {\n return this.maxParticlesCount;\n }\n\n setAdditiveRendering(enabled: boolean) {\n if (this.additiveRendering !== enabled) {\n this._additiveRenderingDirty = true;\n this.additiveRendering = enabled;\n }\n }\n\n getAdditiveRendering(): boolean {\n return this.additiveRendering;\n }\n\n /**\n * @deprecated Prefer using getAngle\n */\n getEmitterAngle(): float {\n return (this.angleA + this.angleB) / 2.0;\n }\n\n /**\n * @deprecated Prefer using setAngle\n */\n setEmitterAngle(angle: float): void {\n const oldAngle = this.getEmitterAngle();\n if (angle !== oldAngle) {\n this._angleDirty = true;\n this.angleA += angle - oldAngle;\n this.angleB += angle - oldAngle;\n }\n }\n\n /**\n * @deprecated This function returns data that is not used.\n */\n getEmitterAngleA(): float {\n return this.angleA;\n }\n\n /**\n * @deprecated This function sets data that is not used.\n */\n setEmitterAngleA(angle: float): void {\n if (this.angleA !== angle) {\n this._angleDirty = true;\n this.angleA = angle;\n }\n }\n\n getEmitterAngleB(): float {\n return this.angleB;\n }\n\n setEmitterAngleB(angle: float): void {\n if (this.angleB !== angle) {\n this._angleDirty = true;\n this.angleB = angle;\n }\n }\n\n getConeSprayAngle(): float {\n return this.getEmitterAngleB();\n }\n\n setConeSprayAngle(angle: float): void {\n this.setEmitterAngleB(angle);\n }\n\n getZoneRadius(): float {\n return this.zoneRadius;\n }\n\n setZoneRadius(radius: float): void {\n if (radius < 0) {\n radius = 0;\n }\n if (this.zoneRadius !== radius && radius > 0) {\n this._zoneRadiusDirty = true;\n this.zoneRadius = radius;\n }\n }\n\n getParticleLifeTimeMin(): float {\n return this.lifeTimeMin;\n }\n\n setParticleLifeTimeMin(lifeTime: float): void {\n if (lifeTime < 0) {\n lifeTime = 0;\n }\n if (this.lifeTimeMin !== lifeTime) {\n this._lifeTimeDirty = true;\n this.lifeTimeMin = lifeTime;\n }\n }\n\n getParticleLifeTimeMax(): float {\n return this.lifeTimeMax;\n }\n\n setParticleLifeTimeMax(lifeTime: float): void {\n if (lifeTime < 0) {\n lifeTime = 0;\n }\n if (this.lifeTimeMax !== lifeTime) {\n this._lifeTimeDirty = true;\n this.lifeTimeMax = lifeTime;\n }\n }\n\n getParticleGravityX(): float {\n return this.gravityX;\n }\n\n setParticleGravityX(x: float): void {\n if (this.gravityX !== x) {\n this._gravityDirty = true;\n this.gravityX = x;\n }\n }\n\n getParticleGravityY(): float {\n return this.gravityY;\n }\n\n setParticleGravityY(y: float): void {\n if (this.gravityY !== y) {\n this._gravityDirty = true;\n this.gravityY = y;\n }\n }\n\n getParticleGravityAngle(): float {\n return (Math.atan2(this.gravityY, this.gravityX) * 180.0) / Math.PI;\n }\n\n setParticleGravityAngle(angle: float): void {\n const oldAngle = this.getParticleGravityAngle();\n if (oldAngle !== angle) {\n this._gravityDirty = true;\n const length = this.getParticleGravityLength();\n this.gravityX = length * Math.cos((angle * Math.PI) / 180.0);\n this.gravityY = length * Math.sin((angle * Math.PI) / 180.0);\n }\n }\n\n getParticleGravityLength(): float {\n return Math.sqrt(\n this.gravityX * this.gravityX + this.gravityY * this.gravityY\n );\n }\n\n setParticleGravityLength(length: float): void {\n if (length < 0) {\n length = 0;\n }\n const oldLength = this.getParticleGravityLength();\n if (oldLength !== length) {\n this._gravityDirty = true;\n this.gravityX *= length / oldLength;\n this.gravityY *= length / oldLength;\n }\n }\n\n getParticleRed1(): number {\n return gdjs.hexNumberToRGBArray(this.color1)[0];\n }\n\n setParticleRed1(red: number): void {\n if (red < 0) {\n red = 0;\n }\n if (red > 255) {\n red = 255;\n }\n const existingColor = gdjs.hexNumberToRGBArray(this.color1);\n this.setParticleColor1AsNumber(\n gdjs.rgbToHexNumber(red, existingColor[1], existingColor[2])\n );\n }\n\n getParticleRed2(): number {\n return gdjs.hexNumberToRGBArray(this.color2)[0];\n }\n\n setParticleRed2(red: number): void {\n if (red < 0) {\n red = 0;\n }\n if (red > 255) {\n red = 255;\n }\n const existingColor = gdjs.hexNumberToRGBArray(this.color2);\n this.setParticleColor2AsNumber(\n gdjs.rgbToHexNumber(red, existingColor[1], existingColor[2])\n );\n }\n\n getParticleGreen1(): number {\n return gdjs.hexNumberToRGBArray(this.color1)[1];\n }\n\n setParticleGreen1(green: number): void {\n if (green < 0) {\n green = 0;\n }\n if (green > 255) {\n green = 255;\n }\n const existingColor = gdjs.hexNumberToRGBArray(this.color1);\n this.setParticleColor1AsNumber(\n gdjs.rgbToHexNumber(existingColor[0], green, existingColor[2])\n );\n }\n\n getParticleGreen2(): number {\n return gdjs.hexNumberToRGBArray(this.color2)[1];\n }\n\n setParticleGreen2(green: number): void {\n if (green < 0) {\n green = 0;\n }\n if (green > 255) {\n green = 255;\n }\n const existingColor = gdjs.hexNumberToRGBArray(this.color2);\n this.setParticleColor2AsNumber(\n gdjs.rgbToHexNumber(existingColor[0], green, existingColor[2])\n );\n }\n\n getParticleBlue1(): number {\n return gdjs.hexNumberToRGBArray(this.color1)[2];\n }\n\n setParticleBlue1(blue: number): void {\n if (blue < 0) {\n blue = 0;\n }\n if (blue > 255) {\n blue = 255;\n }\n const existingColor = gdjs.hexNumberToRGBArray(this.color1);\n this.setParticleColor1AsNumber(\n gdjs.rgbToHexNumber(existingColor[0], existingColor[1], blue)\n );\n }\n\n getParticleBlue2(): number {\n return gdjs.hexNumberToRGBArray(this.color2)[2];\n }\n\n setParticleBlue2(blue: number): void {\n if (blue < 0) {\n blue = 0;\n }\n if (blue > 255) {\n blue = 255;\n }\n const existingColor = gdjs.hexNumberToRGBArray(this.color2);\n this.setParticleColor2AsNumber(\n gdjs.rgbToHexNumber(existingColor[0], existingColor[1], blue)\n );\n }\n\n setParticleColor1AsNumber(color: number): void {\n this.color1 = color;\n this._colorDirty = true;\n }\n\n setParticleColor1(rgbOrHexColor: string): void {\n this.setParticleColor1AsNumber(\n gdjs.rgbOrHexStringToNumber(rgbOrHexColor)\n );\n }\n\n setParticleColor2AsNumber(color: number): void {\n this.color2 = color;\n this._colorDirty = true;\n }\n\n setParticleColor2(rgbOrHexColor: string): void {\n this.setParticleColor2AsNumber(\n gdjs.rgbOrHexStringToNumber(rgbOrHexColor)\n );\n }\n\n getParticleSize1(): float {\n return this.size1;\n }\n\n setParticleSize1(size: float): void {\n if (size < 0) {\n size = 0;\n }\n if (this.size1 !== size) {\n this._sizeDirty = true;\n this.size1 = size;\n }\n }\n\n getParticleSize2(): float {\n return this.size2;\n }\n\n setParticleSize2(size: float): void {\n if (this.size2 !== size) {\n this._sizeDirty = true;\n this.size2 = size;\n }\n }\n\n getParticleAlpha1(): number {\n return this.alpha1;\n }\n\n setParticleAlpha1(alpha: number): void {\n if (this.alpha1 !== alpha) {\n this._alphaDirty = true;\n this.alpha1 = alpha;\n }\n }\n\n getParticleAlpha2(): number {\n return this.alpha2;\n }\n\n setParticleAlpha2(alpha: number): void {\n if (this.alpha2 !== alpha) {\n this._alphaDirty = true;\n this.alpha2 = alpha;\n }\n }\n\n startEmission(): void {\n this._isEmissionPaused = false;\n this._renderer.start();\n }\n\n stopEmission(): void {\n this._isEmissionPaused = true;\n this._renderer.stop();\n }\n\n isEmitting(): boolean {\n return this._renderer.emitter.emit;\n }\n\n noMoreParticles(): boolean {\n return !this.isEmitting();\n }\n\n recreateParticleSystem(): void {\n this._renderer.recreate();\n }\n\n getFlow(): number {\n return this.flow;\n }\n\n setFlow(flow: number): void {\n if (this.flow !== flow) {\n this.flow = flow;\n this._flowDirty = true;\n }\n }\n\n getParticleCount(): number {\n return this._renderer.getParticleCount();\n }\n\n getTank(): number {\n return this.tank;\n }\n\n setTank(tank: number): void {\n this.tank = tank;\n this._tankDirty = true;\n }\n\n getTexture(): string {\n return this.texture;\n }\n\n setTexture(\n texture: string,\n instanceContainer: gdjs.RuntimeInstanceContainer\n ): void {\n if (this.texture !== texture) {\n if (this._renderer.isTextureNameValid(texture, instanceContainer)) {\n this.texture = texture;\n this._textureDirty = true;\n }\n }\n }\n\n jumpEmitterForwardInTime(timeSkipped: number): void {\n this._renderer.update(timeSkipped);\n }\n }\n gdjs.registerObject(\n 'ParticleSystem::ParticleEmitter',\n gdjs.ParticleEmitterObject\n );\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/*\n * GDevelop - Particle System Extension\n * Copyright (c) 2010-2016 Florian Rival (Florian.Rival@gmail.com)\n * This project is released under the MIT License.\n */\n\nnamespace gdjs {\n export type ParticleEmitterObjectDataType = {\n /**\n * @deprecated Data not used\n */\n emitterAngleA: number;\n emitterForceMin: number;\n /**\n * Cone spray angle (degrees)\n */\n emitterAngleB: number;\n zoneRadius: number;\n emitterForceMax: number;\n particleLifeTimeMax: number;\n particleLifeTimeMin: number;\n particleGravityY: number;\n particleGravityX: number;\n particleColor2: string;\n particleColor1: string;\n particleSize2: number;\n particleSize1: number;\n /**\n * Particle max rotation speed (degrees/second)\n */\n particleAngle2: number;\n /**\n * Particle min rotation speed (degrees/second)\n */\n particleAngle1: number;\n particleAlpha1: number;\n rendererType: string;\n particleAlpha2: number;\n rendererParam2: number;\n rendererParam1: number;\n particleSizeRandomness1: number;\n particleSizeRandomness2: number;\n maxParticleNb: number;\n additive: boolean;\n /** Resource name for image in particle */\n textureParticleName: string;\n tank: number;\n flow: number;\n /** Destroy the object when there is no particles? */\n destroyWhenNoParticles: boolean;\n jumpForwardInTimeOnCreation: number;\n };\n\n export type ParticleEmitterObjectData = ObjectData &\n ParticleEmitterObjectDataType;\n\n export type ParticleEmitterObjectNetworkSyncDataType = {\n // Technically, all attributes can change at runtime, so we sync as many as possible.\n // TODO: ensure we only send props that change to optimize the sync.\n // dirty attributes are not synced, they are defined by the update method if the value has changed.\n // Particle Rotation Speed\n prms: number;\n prmx: number;\n // Max Particles Count\n mpc: number;\n // Additive Rendering\n addr: boolean;\n // Angle\n angb: number;\n // Force\n formin: number;\n formax: number;\n // Zone Radius\n zr: number;\n // Life Time\n ltmin: number;\n ltmax: number;\n // Gravity\n gravx: number;\n gravy: number;\n // Color\n color1: number;\n color2: number;\n // Size\n size1: number;\n size2: number;\n // Alpha\n alp1: number;\n alp2: number;\n // Flow\n flow: number;\n // Tank\n tank: number;\n // Texture\n text: string;\n // Pause\n paused: boolean;\n };\n\n export type ParticleEmitterObjectNetworkSyncData = ObjectNetworkSyncData &\n ParticleEmitterObjectNetworkSyncDataType;\n\n /**\n * Displays particles.\n */\n export class ParticleEmitterObject extends gdjs.RuntimeObject {\n /**\n * @deprecated Data not used\n */\n angleA: number;\n angleB: number;\n forceMin: number;\n forceMax: float;\n zoneRadius: number;\n lifeTimeMin: number;\n lifeTimeMax: float;\n gravityX: number;\n gravityY: number;\n color1: number;\n color2: number;\n size1: number;\n size2: number;\n alpha1: number;\n alpha2: number;\n rendererType: string;\n rendererParam1: number;\n rendererParam2: number;\n texture: string;\n flow: number;\n tank: number;\n destroyWhenNoParticles: boolean;\n particleRotationMinSpeed: number;\n particleRotationMaxSpeed: number;\n maxParticlesCount: number;\n additiveRendering: boolean;\n jumpForwardInTimeOnCreation: number;\n _jumpForwardInTimeCompleted: boolean = false;\n _posDirty: boolean = true;\n _angleDirty: boolean = true;\n _forceDirty: boolean = true;\n _zoneRadiusDirty: boolean = true;\n _lifeTimeDirty: boolean = true;\n _gravityDirty: boolean = true;\n _colorDirty: boolean = true;\n _sizeDirty: boolean = true;\n _alphaDirty: boolean = true;\n _flowDirty: boolean = true;\n _tankDirty: boolean = true;\n _particleRotationSpeedDirty: boolean = true;\n _maxParticlesCountDirty: boolean = true;\n _additiveRenderingDirty: boolean = true;\n // Don't mark texture as dirty if not using one.\n _textureDirty: boolean;\n /**\n * `true` only when the emission is paused by events.\n * It allows to tell the end of emission apart from it.\n */\n _isEmissionPaused: boolean = false;\n\n // @ts-ignore\n _renderer: gdjs.ParticleEmitterObjectRenderer;\n\n /**\n * @param instanceContainer the container the object belongs to\n * @param particleObjectData The initial properties of the object\n */\n constructor(\n instanceContainer: gdjs.RuntimeInstanceContainer,\n particleObjectData: ParticleEmitterObjectData\n ) {\n super(instanceContainer, particleObjectData);\n this._renderer = new gdjs.ParticleEmitterObjectRenderer(\n instanceContainer,\n this,\n particleObjectData\n );\n this.angleA = particleObjectData.emitterAngleA;\n this.angleB = particleObjectData.emitterAngleB;\n this.forceMin = particleObjectData.emitterForceMin;\n this.forceMax = particleObjectData.emitterForceMax;\n this.zoneRadius = particleObjectData.zoneRadius;\n this.lifeTimeMin = particleObjectData.particleLifeTimeMin;\n this.lifeTimeMax = particleObjectData.particleLifeTimeMax;\n this.gravityX = particleObjectData.particleGravityX;\n this.gravityY = particleObjectData.particleGravityY;\n this.color1 = gdjs.rgbOrHexStringToNumber(\n particleObjectData.particleColor1\n );\n this.color2 = gdjs.rgbOrHexStringToNumber(\n particleObjectData.particleColor2\n );\n this.size1 = particleObjectData.particleSize1;\n this.size2 = particleObjectData.particleSize2;\n this.alpha1 = particleObjectData.particleAlpha1;\n this.alpha2 = particleObjectData.particleAlpha2;\n this.rendererType = particleObjectData.rendererType;\n this.rendererParam1 = particleObjectData.rendererParam1;\n this.rendererParam2 = particleObjectData.rendererParam2;\n this.texture = particleObjectData.textureParticleName;\n this.flow = particleObjectData.flow;\n this.tank = particleObjectData.tank;\n this.destroyWhenNoParticles = particleObjectData.destroyWhenNoParticles;\n this.particleRotationMinSpeed = particleObjectData.particleAngle1;\n this.particleRotationMaxSpeed = particleObjectData.particleAngle2;\n this.maxParticlesCount = particleObjectData.maxParticleNb;\n this.additiveRendering = particleObjectData.additive;\n this.jumpForwardInTimeOnCreation =\n particleObjectData.jumpForwardInTimeOnCreation;\n this._textureDirty = this.texture !== '';\n\n // *ALWAYS* call `this.onCreated()` at the very end of your object constructor.\n this.onCreated();\n }\n\n setX(x: number): void {\n if (this.x !== x) {\n this._posDirty = true;\n }\n super.setX(x);\n }\n\n setY(y: number): void {\n if (this.y !== y) {\n this._posDirty = true;\n }\n super.setY(y);\n }\n\n setAngle(angle): void {\n if (this.angle !== angle) {\n this._angleDirty = true;\n }\n super.setAngle(angle);\n }\n\n getRendererObject() {\n return this._renderer.getRendererObject();\n }\n\n updateFromObjectData(\n oldObjectData: ParticleEmitterObjectData,\n newObjectData: ParticleEmitterObjectData\n ): boolean {\n if (oldObjectData.emitterAngleA !== newObjectData.emitterAngleA) {\n this.setEmitterAngleA(newObjectData.emitterAngleA);\n }\n if (oldObjectData.emitterAngleB !== newObjectData.emitterAngleB) {\n this.setEmitterAngleB(newObjectData.emitterAngleB);\n }\n if (oldObjectData.emitterForceMin !== newObjectData.emitterForceMin) {\n this.setEmitterForceMin(newObjectData.emitterForceMin);\n }\n if (oldObjectData.particleAngle1 !== newObjectData.particleAngle1) {\n this.setParticleRotationMinSpeed(newObjectData.particleAngle1);\n }\n if (oldObjectData.particleAngle2 !== newObjectData.particleAngle2) {\n this.setParticleRotationMaxSpeed(newObjectData.particleAngle2);\n }\n if (oldObjectData.maxParticleNb !== newObjectData.maxParticleNb) {\n this.setMaxParticlesCount(newObjectData.maxParticleNb);\n }\n if (oldObjectData.additive !== newObjectData.additive) {\n this.setAdditiveRendering(newObjectData.additive);\n }\n if (oldObjectData.emitterForceMax !== newObjectData.emitterForceMax) {\n this.setEmitterForceMax(newObjectData.emitterForceMax);\n }\n if (oldObjectData.zoneRadius !== newObjectData.zoneRadius) {\n this.setZoneRadius(newObjectData.zoneRadius);\n }\n if (\n oldObjectData.particleLifeTimeMin !== newObjectData.particleLifeTimeMin\n ) {\n this.setParticleLifeTimeMin(newObjectData.particleLifeTimeMin);\n }\n if (\n oldObjectData.particleLifeTimeMax !== newObjectData.particleLifeTimeMax\n ) {\n this.setParticleLifeTimeMax(newObjectData.particleLifeTimeMax);\n }\n if (oldObjectData.particleGravityX !== newObjectData.particleGravityX) {\n this.setParticleGravityX(newObjectData.particleGravityX);\n }\n if (oldObjectData.particleGravityY !== newObjectData.particleGravityY) {\n this.setParticleGravityY(newObjectData.particleGravityY);\n }\n if (oldObjectData.particleColor1 !== newObjectData.particleColor1) {\n this.setParticleColor1(newObjectData.particleColor1);\n }\n if (oldObjectData.particleColor2 !== newObjectData.particleColor2) {\n this.setParticleColor2(newObjectData.particleColor2);\n }\n if (oldObjectData.particleSize1 !== newObjectData.particleSize1) {\n this.setParticleSize1(newObjectData.particleSize1);\n }\n if (oldObjectData.particleSize2 !== newObjectData.particleSize2) {\n this.setParticleSize2(newObjectData.particleSize2);\n }\n if (oldObjectData.particleAlpha1 !== newObjectData.particleAlpha1) {\n this.setParticleAlpha1(newObjectData.particleAlpha1);\n }\n if (oldObjectData.particleAlpha2 !== newObjectData.particleAlpha2) {\n this.setParticleAlpha2(newObjectData.particleAlpha2);\n }\n if (\n oldObjectData.textureParticleName !== newObjectData.textureParticleName\n ) {\n this.setTexture(\n newObjectData.textureParticleName,\n this.getRuntimeScene()\n );\n }\n if (oldObjectData.flow !== newObjectData.flow) {\n this.setFlow(newObjectData.flow);\n }\n if (oldObjectData.tank !== newObjectData.tank) {\n this.setTank(newObjectData.tank);\n }\n if (\n oldObjectData.destroyWhenNoParticles !==\n newObjectData.destroyWhenNoParticles\n ) {\n this.destroyWhenNoParticles = newObjectData.destroyWhenNoParticles;\n }\n if (\n oldObjectData.particleSizeRandomness1 !==\n newObjectData.particleSizeRandomness1 ||\n oldObjectData.particleSizeRandomness2 !==\n newObjectData.particleSizeRandomness2 ||\n oldObjectData.particleAngle1 !== newObjectData.particleAngle1 ||\n oldObjectData.particleAngle2 !== newObjectData.particleAngle2 ||\n oldObjectData.maxParticleNb !== newObjectData.maxParticleNb ||\n oldObjectData.additive !== newObjectData.additive ||\n oldObjectData.rendererType !== newObjectData.rendererType ||\n oldObjectData.rendererParam1 !== newObjectData.rendererParam1 ||\n oldObjectData.rendererParam2 !== newObjectData.rendererParam2\n ) {\n // Destroy the renderer, ensure it's removed from the layer.\n const layer = this.getInstanceContainer().getLayer(this.layer);\n layer\n .getRenderer()\n .removeRendererObject(this._renderer.getRendererObject());\n this._renderer.destroy();\n\n // and recreate the renderer, which will add itself to the layer.\n this._renderer = new gdjs.ParticleEmitterObjectRenderer(\n this.getInstanceContainer(),\n this,\n newObjectData\n );\n\n // Consider every state dirty as the renderer was just re-created, so it needs\n // to be repositioned, angle updated, etc...\n this._posDirty =\n this._angleDirty =\n this._forceDirty =\n this._zoneRadiusDirty =\n true;\n this._lifeTimeDirty =\n this._gravityDirty =\n this._colorDirty =\n this._sizeDirty =\n true;\n this._alphaDirty =\n this._flowDirty =\n this._tankDirty =\n this._textureDirty =\n true;\n }\n return true;\n }\n\n getNetworkSyncData(\n syncOptions: GetNetworkSyncDataOptions\n ): ParticleEmitterObjectNetworkSyncData {\n return {\n ...super.getNetworkSyncData(syncOptions),\n prms: this.particleRotationMinSpeed,\n prmx: this.particleRotationMaxSpeed,\n mpc: this.maxParticlesCount,\n addr: this.additiveRendering,\n angb: this.angleB,\n formin: this.forceMin,\n formax: this.forceMax,\n zr: this.zoneRadius,\n ltmin: this.lifeTimeMin,\n ltmax: this.lifeTimeMax,\n gravx: this.gravityX,\n gravy: this.gravityY,\n color1: this.color1,\n color2: this.color2,\n size1: this.size1,\n size2: this.size2,\n alp1: this.alpha1,\n alp2: this.alpha2,\n flow: this.flow,\n tank: this.tank,\n text: this.texture,\n paused: this._isEmissionPaused,\n };\n }\n\n updateFromNetworkSyncData(\n syncData: ParticleEmitterObjectNetworkSyncData,\n options: UpdateFromNetworkSyncDataOptions\n ): void {\n super.updateFromNetworkSyncData(syncData, options);\n if (syncData.x !== undefined) {\n this.setX(syncData.x);\n }\n if (syncData.y !== undefined) {\n this.setY(syncData.y);\n }\n if (syncData.a !== undefined) {\n this.setAngle(syncData.a);\n }\n if (syncData.prms !== undefined) {\n this.setParticleRotationMinSpeed(syncData.prms);\n }\n if (syncData.prmx !== undefined) {\n this.setParticleRotationMaxSpeed(syncData.prmx);\n }\n if (syncData.mpc !== undefined) {\n this.setMaxParticlesCount(syncData.mpc);\n }\n if (syncData.addr !== undefined) {\n this.setAdditiveRendering(syncData.addr);\n }\n if (syncData.angb !== undefined) {\n this.setEmitterAngleB(syncData.angb);\n }\n if (syncData.formin !== undefined) {\n this.setEmitterForceMin(syncData.formin);\n }\n if (syncData.formax !== undefined) {\n this.setEmitterForceMax(syncData.formax);\n }\n if (syncData.zr !== undefined) {\n this.setZoneRadius(syncData.zr);\n }\n if (syncData.ltmin !== undefined) {\n this.setParticleLifeTimeMin(syncData.ltmin);\n }\n if (syncData.ltmax !== undefined) {\n this.setParticleLifeTimeMax(syncData.ltmax);\n }\n if (syncData.gravx !== undefined) {\n this.setParticleGravityX(syncData.gravx);\n }\n if (syncData.gravy !== undefined) {\n this.setParticleGravityY(syncData.gravy);\n }\n if (syncData.color1 !== undefined) {\n this.setParticleColor1AsNumber(syncData.color1);\n }\n if (syncData.color2 !== undefined) {\n this.setParticleColor2AsNumber(syncData.color2);\n }\n if (syncData.size1 !== undefined) {\n this.setParticleSize1(syncData.size1);\n }\n if (syncData.size2 !== undefined) {\n this.setParticleSize2(syncData.size2);\n }\n if (syncData.alp1 !== undefined) {\n this.setParticleAlpha1(syncData.alp1);\n }\n if (syncData.alp2 !== undefined) {\n this.setParticleAlpha2(syncData.alp2);\n }\n if (syncData.flow !== undefined) {\n this.setFlow(syncData.flow);\n }\n if (syncData.tank !== undefined) {\n this.setTank(syncData.tank);\n }\n if (syncData.text !== undefined) {\n this.setTexture(syncData.text, this.getRuntimeScene());\n }\n if (syncData.paused !== undefined) {\n if (syncData.paused) {\n this.stopEmission();\n } else {\n this.startEmission();\n }\n }\n }\n\n update(instanceContainer: gdjs.RuntimeInstanceContainer): void {\n if (this._posDirty) {\n this._renderer.setPosition(this.getX(), this.getY());\n }\n if (this._particleRotationSpeedDirty) {\n this._renderer.setParticleRotationSpeed(\n this.particleRotationMinSpeed,\n this.particleRotationMaxSpeed\n );\n }\n if (this._maxParticlesCountDirty) {\n this._renderer.setMaxParticlesCount(this.maxParticlesCount);\n }\n if (this._additiveRenderingDirty) {\n this._renderer.setAdditiveRendering(this.additiveRendering);\n }\n if (this._angleDirty) {\n const angle = this.getAngle();\n this._renderer.setAngle(\n angle - this.angleB / 2.0,\n angle + this.angleB / 2.0\n );\n }\n if (this._forceDirty) {\n this._renderer.setForce(this.forceMin, this.forceMax);\n }\n if (this._zoneRadiusDirty) {\n this._renderer.setZoneRadius(this.zoneRadius);\n }\n if (this._lifeTimeDirty) {\n this._renderer.setLifeTime(this.lifeTimeMin, this.lifeTimeMax);\n }\n if (this._gravityDirty) {\n this._renderer.setGravity(this.gravityX, this.gravityY);\n }\n if (this._colorDirty) {\n this._renderer.setColor(this.color1, this.color2);\n }\n if (this._sizeDirty) {\n this._renderer.setSize(this.size1, this.size2);\n }\n if (this._alphaDirty) {\n this._renderer.setAlpha(this.alpha1, this.alpha2);\n }\n if (this._flowDirty || this._tankDirty) {\n this._renderer.resetEmission(this.flow, this.tank);\n }\n if (this._textureDirty) {\n this._renderer.setTextureName(this.texture, instanceContainer);\n }\n this._posDirty =\n this._angleDirty =\n this._forceDirty =\n this._zoneRadiusDirty =\n false;\n this._lifeTimeDirty =\n this._gravityDirty =\n this._colorDirty =\n this._sizeDirty =\n false;\n this._alphaDirty =\n this._flowDirty =\n this._textureDirty =\n this._tankDirty =\n false;\n this._additiveRenderingDirty =\n this._maxParticlesCountDirty =\n this._particleRotationSpeedDirty =\n false;\n this._renderer.update(this.getElapsedTime() / 1000.0);\n if (\n this.destroyWhenNoParticles &&\n this.getParticleCount() === 0 &&\n this._renderer.hasStarted() &&\n !this._isEmissionPaused &&\n this._renderer._mayHaveEndedEmission()\n ) {\n this.deleteFromScene();\n }\n if (\n this.jumpForwardInTimeOnCreation > 0 &&\n this._jumpForwardInTimeCompleted === false\n ) {\n this._renderer.update(this.jumpForwardInTimeOnCreation);\n this._jumpForwardInTimeCompleted = true;\n }\n }\n\n onDestroyed(): void {\n this._renderer.destroy();\n super.onDestroyed();\n }\n\n getEmitterForceMin(): number {\n return this.forceMin;\n }\n\n setEmitterForceMin(force: float): void {\n if (force < 0) {\n force = 0;\n }\n if (this.forceMin !== force) {\n this._forceDirty = true;\n this.forceMin = force;\n }\n }\n\n getEmitterForceMax(): number {\n return this.forceMax;\n }\n\n setEmitterForceMax(force: float): void {\n if (force < 0) {\n force = 0;\n }\n if (this.forceMax !== force) {\n this._forceDirty = true;\n this.forceMax = force;\n }\n }\n\n setParticleRotationMinSpeed(speed: number): void {\n if (this.particleRotationMinSpeed !== speed) {\n this._particleRotationSpeedDirty = true;\n this.particleRotationMinSpeed = speed;\n }\n }\n\n getParticleRotationMinSpeed(): number {\n return this.particleRotationMinSpeed;\n }\n\n setParticleRotationMaxSpeed(speed: number): void {\n if (this.particleRotationMaxSpeed !== speed) {\n this._particleRotationSpeedDirty = true;\n this.particleRotationMaxSpeed = speed;\n }\n }\n\n getParticleRotationMaxSpeed(): number {\n return this.particleRotationMaxSpeed;\n }\n\n setMaxParticlesCount(count: number): void {\n if (this.maxParticlesCount !== count) {\n this._maxParticlesCountDirty = true;\n this.maxParticlesCount = count;\n }\n }\n\n getMaxParticlesCount(): number {\n return this.maxParticlesCount;\n }\n\n setAdditiveRendering(enabled: boolean) {\n if (this.additiveRendering !== enabled) {\n this._additiveRenderingDirty = true;\n this.additiveRendering = enabled;\n }\n }\n\n getAdditiveRendering(): boolean {\n return this.additiveRendering;\n }\n\n /**\n * @deprecated Prefer using getAngle\n */\n getEmitterAngle(): float {\n return (this.angleA + this.angleB) / 2.0;\n }\n\n /**\n * @deprecated Prefer using setAngle\n */\n setEmitterAngle(angle: float): void {\n const oldAngle = this.getEmitterAngle();\n if (angle !== oldAngle) {\n this._angleDirty = true;\n this.angleA += angle - oldAngle;\n this.angleB += angle - oldAngle;\n }\n }\n\n /**\n * @deprecated This function returns data that is not used.\n */\n getEmitterAngleA(): float {\n return this.angleA;\n }\n\n /**\n * @deprecated This function sets data that is not used.\n */\n setEmitterAngleA(angle: float): void {\n if (this.angleA !== angle) {\n this._angleDirty = true;\n this.angleA = angle;\n }\n }\n\n getEmitterAngleB(): float {\n return this.angleB;\n }\n\n setEmitterAngleB(angle: float): void {\n if (this.angleB !== angle) {\n this._angleDirty = true;\n this.angleB = angle;\n }\n }\n\n getConeSprayAngle(): float {\n return this.getEmitterAngleB();\n }\n\n setConeSprayAngle(angle: float): void {\n this.setEmitterAngleB(angle);\n }\n\n getZoneRadius(): float {\n return this.zoneRadius;\n }\n\n setZoneRadius(radius: float): void {\n if (radius < 0) {\n radius = 0;\n }\n if (this.zoneRadius !== radius && radius > 0) {\n this._zoneRadiusDirty = true;\n this.zoneRadius = radius;\n }\n }\n\n getParticleLifeTimeMin(): float {\n return this.lifeTimeMin;\n }\n\n setParticleLifeTimeMin(lifeTime: float): void {\n if (lifeTime < 0) {\n lifeTime = 0;\n }\n if (this.lifeTimeMin !== lifeTime) {\n this._lifeTimeDirty = true;\n this.lifeTimeMin = lifeTime;\n }\n }\n\n getParticleLifeTimeMax(): float {\n return this.lifeTimeMax;\n }\n\n setParticleLifeTimeMax(lifeTime: float): void {\n if (lifeTime < 0) {\n lifeTime = 0;\n }\n if (this.lifeTimeMax !== lifeTime) {\n this._lifeTimeDirty = true;\n this.lifeTimeMax = lifeTime;\n }\n }\n\n getParticleGravityX(): float {\n return this.gravityX;\n }\n\n setParticleGravityX(x: float): void {\n if (this.gravityX !== x) {\n this._gravityDirty = true;\n this.gravityX = x;\n }\n }\n\n getParticleGravityY(): float {\n return this.gravityY;\n }\n\n setParticleGravityY(y: float): void {\n if (this.gravityY !== y) {\n this._gravityDirty = true;\n this.gravityY = y;\n }\n }\n\n getParticleGravityAngle(): float {\n return (Math.atan2(this.gravityY, this.gravityX) * 180.0) / Math.PI;\n }\n\n setParticleGravityAngle(angle: float): void {\n const oldAngle = this.getParticleGravityAngle();\n if (oldAngle !== angle) {\n this._gravityDirty = true;\n const length = this.getParticleGravityLength();\n this.gravityX = length * Math.cos((angle * Math.PI) / 180.0);\n this.gravityY = length * Math.sin((angle * Math.PI) / 180.0);\n }\n }\n\n getParticleGravityLength(): float {\n return Math.sqrt(\n this.gravityX * this.gravityX + this.gravityY * this.gravityY\n );\n }\n\n setParticleGravityLength(length: float): void {\n if (length < 0) {\n length = 0;\n }\n const oldLength = this.getParticleGravityLength();\n if (oldLength !== length) {\n this._gravityDirty = true;\n this.gravityX *= length / oldLength;\n this.gravityY *= length / oldLength;\n }\n }\n\n getParticleRed1(): number {\n return gdjs.hexNumberToRGBArray(this.color1)[0];\n }\n\n setParticleRed1(red: number): void {\n if (red < 0) {\n red = 0;\n }\n if (red > 255) {\n red = 255;\n }\n const existingColor = gdjs.hexNumberToRGBArray(this.color1);\n this.setParticleColor1AsNumber(\n gdjs.rgbToHexNumber(red, existingColor[1], existingColor[2])\n );\n }\n\n getParticleRed2(): number {\n return gdjs.hexNumberToRGBArray(this.color2)[0];\n }\n\n setParticleRed2(red: number): void {\n if (red < 0) {\n red = 0;\n }\n if (red > 255) {\n red = 255;\n }\n const existingColor = gdjs.hexNumberToRGBArray(this.color2);\n this.setParticleColor2AsNumber(\n gdjs.rgbToHexNumber(red, existingColor[1], existingColor[2])\n );\n }\n\n getParticleGreen1(): number {\n return gdjs.hexNumberToRGBArray(this.color1)[1];\n }\n\n setParticleGreen1(green: number): void {\n if (green < 0) {\n green = 0;\n }\n if (green > 255) {\n green = 255;\n }\n const existingColor = gdjs.hexNumberToRGBArray(this.color1);\n this.setParticleColor1AsNumber(\n gdjs.rgbToHexNumber(existingColor[0], green, existingColor[2])\n );\n }\n\n getParticleGreen2(): number {\n return gdjs.hexNumberToRGBArray(this.color2)[1];\n }\n\n setParticleGreen2(green: number): void {\n if (green < 0) {\n green = 0;\n }\n if (green > 255) {\n green = 255;\n }\n const existingColor = gdjs.hexNumberToRGBArray(this.color2);\n this.setParticleColor2AsNumber(\n gdjs.rgbToHexNumber(existingColor[0], green, existingColor[2])\n );\n }\n\n getParticleBlue1(): number {\n return gdjs.hexNumberToRGBArray(this.color1)[2];\n }\n\n setParticleBlue1(blue: number): void {\n if (blue < 0) {\n blue = 0;\n }\n if (blue > 255) {\n blue = 255;\n }\n const existingColor = gdjs.hexNumberToRGBArray(this.color1);\n this.setParticleColor1AsNumber(\n gdjs.rgbToHexNumber(existingColor[0], existingColor[1], blue)\n );\n }\n\n getParticleBlue2(): number {\n return gdjs.hexNumberToRGBArray(this.color2)[2];\n }\n\n setParticleBlue2(blue: number): void {\n if (blue < 0) {\n blue = 0;\n }\n if (blue > 255) {\n blue = 255;\n }\n const existingColor = gdjs.hexNumberToRGBArray(this.color2);\n this.setParticleColor2AsNumber(\n gdjs.rgbToHexNumber(existingColor[0], existingColor[1], blue)\n );\n }\n\n setParticleColor1AsNumber(color: number): void {\n this.color1 = color;\n this._colorDirty = true;\n }\n\n setParticleColor1(rgbOrHexColor: string): void {\n this.setParticleColor1AsNumber(\n gdjs.rgbOrHexStringToNumber(rgbOrHexColor)\n );\n }\n\n setParticleColor2AsNumber(color: number): void {\n this.color2 = color;\n this._colorDirty = true;\n }\n\n setParticleColor2(rgbOrHexColor: string): void {\n this.setParticleColor2AsNumber(\n gdjs.rgbOrHexStringToNumber(rgbOrHexColor)\n );\n }\n\n getParticleSize1(): float {\n return this.size1;\n }\n\n setParticleSize1(size: float): void {\n if (size < 0) {\n size = 0;\n }\n if (this.size1 !== size) {\n this._sizeDirty = true;\n this.size1 = size;\n }\n }\n\n getParticleSize2(): float {\n return this.size2;\n }\n\n setParticleSize2(size: float): void {\n if (this.size2 !== size) {\n this._sizeDirty = true;\n this.size2 = size;\n }\n }\n\n getParticleAlpha1(): number {\n return this.alpha1;\n }\n\n setParticleAlpha1(alpha: number): void {\n if (this.alpha1 !== alpha) {\n this._alphaDirty = true;\n this.alpha1 = alpha;\n }\n }\n\n getParticleAlpha2(): number {\n return this.alpha2;\n }\n\n setParticleAlpha2(alpha: number): void {\n if (this.alpha2 !== alpha) {\n this._alphaDirty = true;\n this.alpha2 = alpha;\n }\n }\n\n startEmission(): void {\n this._isEmissionPaused = false;\n this._renderer.start();\n }\n\n stopEmission(): void {\n this._isEmissionPaused = true;\n this._renderer.stop();\n }\n\n isEmitting(): boolean {\n return this._renderer.emitter.emit;\n }\n\n noMoreParticles(): boolean {\n return !this.isEmitting();\n }\n\n recreateParticleSystem(): void {\n this._renderer.recreate();\n }\n\n getFlow(): number {\n return this.flow;\n }\n\n setFlow(flow: number): void {\n if (this.flow !== flow) {\n this.flow = flow;\n this._flowDirty = true;\n }\n }\n\n getParticleCount(): number {\n return this._renderer.getParticleCount();\n }\n\n getTank(): number {\n return this.tank;\n }\n\n setTank(tank: number): void {\n this.tank = tank;\n this._tankDirty = true;\n }\n\n getTexture(): string {\n return this.texture;\n }\n\n setTexture(\n texture: string,\n instanceContainer: gdjs.RuntimeInstanceContainer\n ): void {\n if (this.texture !== texture) {\n if (this._renderer.isTextureNameValid(texture, instanceContainer)) {\n this.texture = texture;\n this._textureDirty = true;\n }\n }\n }\n\n jumpEmitterForwardInTime(timeSkipped: number): void {\n this._renderer.update(timeSkipped);\n }\n }\n gdjs.registerObject(\n 'ParticleSystem::ParticleEmitter',\n gdjs.ParticleEmitterObject\n );\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }