Skip to content

Commit f527b30

Browse files
first commit
1 parent dcc3bae commit f527b30

8 files changed

+87
-5
lines changed

Extensions/3D/JsExtension.js

+15
Original file line numberDiff line numberDiff line change
@@ -814,6 +814,21 @@ module.exports = {
814814
.addParameter('object', _('3D model'), 'Model3DObject', false)
815815
.addParameter('number', _('Crossfade duration (in seconds)'), '', false)
816816
.setFunctionName('setCrossfadeDuration');
817+
818+
object
819+
.addScopedAction(
820+
'SyncAll',
821+
_('Set crossfade duration'),
822+
_('Set the crossfade duration when switching to a new animation.'),
823+
_('Syncall'),
824+
_('Animations and images'),
825+
'res/conditions/animation24.png',
826+
'res/conditions/animation.png'
827+
)
828+
.addCodeOnlyParameter('currentScene', '')
829+
830+
.setFunctionName('saveWholeGame');
831+
817832
}
818833

819834
const Cube3DObject = new gd.ObjectJsImplementation();

Extensions/3D/Model3DRuntimeObject.ts

+58
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,64 @@ namespace gdjs {
251251
this.onModelChanged(objectData);
252252
}
253253

254+
saveWholeGame(currentScene : RuntimeScene ): void {
255+
const sceneStack = currentScene.getGame()._sceneStack._stack;
256+
257+
const allSyncData: any[] = [];
258+
allSyncData.push(currentScene.getGame().getNetworkSyncData({syncEverythingForWholeGameSaveState: true}));
259+
260+
sceneStack.forEach(scene => {
261+
allSyncData.push(scene.getNetworkSyncData({syncEverythingForWholeGameSaveState:true}))
262+
}
263+
);
264+
sceneStack.forEach(scene => {
265+
const sceneObjects = scene.getAdhocListOfAllInstances();
266+
for (const key in sceneObjects) {
267+
if (sceneObjects.hasOwnProperty(key)) {
268+
const object = sceneObjects[key];
269+
if (object.getNetworkSyncData) {
270+
const syncData = object.getNetworkSyncData(true);
271+
allSyncData.push(syncData);
272+
}
273+
}
274+
}
275+
});
276+
const syncDataJson = JSON.stringify(allSyncData);
277+
this.LoadWholeGame(syncDataJson);
278+
}
279+
LoadWholeGame(syncDataJson: string): void {
280+
this._runtimeScene._destroy();
281+
const allSyncData = JSON.parse(syncDataJson);
282+
const sceneStack = allSyncData[0].ss;
283+
console.log(sceneStack);
284+
let sceneIndex = 1;
285+
sceneStack.forEach((sceneData: any) => {
286+
let scene = sceneStack[sceneIndex];
287+
288+
if (!scene) {
289+
const sceneAndExtensionData = allSyncData[sceneIndex];
290+
scene = new gdjs.RuntimeScene(this._runtimeScene.getGame());
291+
scene.loadFromScene(sceneAndExtensionData, {skipCreatingInstances: true});
292+
console.log(scene);
293+
}
294+
scene.updateFromNetworkSyncData();
295+
const sceneObjects = scene.getAdhocListOfAllInstances();
296+
for (const key in sceneObjects) {
297+
if (sceneObjects.hasOwnProperty(key)) {
298+
const object = sceneObjects[key];
299+
const objectSyncData = sceneData.objects[key];
300+
if (objectSyncData) {
301+
object.onCreated();
302+
object.updateFromNetworkSyncData(objectSyncData);
303+
}
304+
305+
}
306+
}
307+
308+
sceneIndex++;
309+
});
310+
}
311+
254312
_updateModel(objectData: Model3DObjectData) {
255313
const rotationX = objectData.content.rotationX || 0;
256314
const rotationY = objectData.content.rotationY || 0;

GDJS/Runtime/RuntimeInstanceContainer.ts

+3
Original file line numberDiff line numberDiff line change
@@ -547,6 +547,7 @@ namespace gdjs {
547547
return this._allInstancesList;
548548
}
549549

550+
550551
/**
551552
* Update the objects before launching the events.
552553
*/
@@ -621,6 +622,8 @@ namespace gdjs {
621622
return this._instances.get(name);
622623
}
623624

625+
626+
624627
/**
625628
* Create a new object from its name. The object is also added to the instances
626629
* living in the container (No need to call {@link gdjs.RuntimeScene.addObject})

GDJS/Runtime/runtimegame.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1360,7 +1360,7 @@ namespace gdjs {
13601360
const extensionVariablesSyncData =
13611361
variables.getNetworkSyncData(syncOptions);
13621362
// If there is no variables to sync, don't include the extension in the sync data.
1363-
if (extensionVariablesSyncData.length) {
1363+
if (extensionVariablesSyncData.length && !syncOptions.syncEverythingForWholeGameSaveState) {
13641364
extensionsVariablesSyncData[extensionName] =
13651365
extensionVariablesSyncData;
13661366
}

GDJS/Runtime/runtimeobject.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -454,10 +454,10 @@ namespace gdjs {
454454
* This can be redefined by objects to send more information.
455455
* @returns The full network sync data.
456456
*/
457-
getNetworkSyncData(): ObjectNetworkSyncData {
457+
getNetworkSyncData(saveWholeGame? : boolean): ObjectNetworkSyncData {
458458
const behaviorNetworkSyncData = {};
459459
this._behaviors.forEach((behavior) => {
460-
if (!behavior.isSyncedOverNetwork()) {
460+
if (!behavior.isSyncedOverNetwork() && !saveWholeGame) {
461461
return;
462462
}
463463

GDJS/Runtime/runtimescene.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ namespace gdjs {
124124
* @param sceneAndExtensionsData An object containing the scene data.
125125
* @see gdjs.RuntimeGame#getSceneAndExtensionsData
126126
*/
127-
loadFromScene(sceneAndExtensionsData: SceneAndExtensionsData | null) {
127+
loadFromScene(sceneAndExtensionsData: SceneAndExtensionsData | null, options?: {skipCreatingInstances?: boolean}) {
128128
if (!sceneAndExtensionsData) {
129129
logger.error('loadFromScene was called without a scene');
130130
return;
@@ -182,6 +182,7 @@ namespace gdjs {
182182
}
183183

184184
//Create initial instances of objects
185+
if(!options || !options.skipCreatingInstances)
185186
this.createObjectsFrom(
186187
sceneData.instances,
187188
0,
@@ -812,7 +813,7 @@ namespace gdjs {
812813
const extensionVariablesSyncData =
813814
variables.getNetworkSyncData(syncOptions);
814815
// If there is no variables to sync, don't include the extension in the sync data.
815-
if (extensionVariablesSyncData) {
816+
if (extensionVariablesSyncData && !syncOptions.syncEverythingForWholeGameSaveState) {
816817
extensionsVariablesSyncData[extensionName] =
817818
extensionVariablesSyncData;
818819
}
@@ -840,6 +841,7 @@ namespace gdjs {
840841
}
841842

842843
updateFromNetworkSyncData(syncData: LayoutNetworkSyncData) {
844+
843845
if (syncData.var) {
844846
this._variables.updateFromNetworkSyncData(syncData.var);
845847
}
@@ -859,6 +861,7 @@ namespace gdjs {
859861
}
860862
}
861863
}
864+
862865

863866
getOrCreateNetworkId(): string {
864867
if (!this.networkId) {

GDJS/Runtime/types/project-data.d.ts

+1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ declare type ObjectData = {
4242
declare type GetNetworkSyncDataOptions = {
4343
playerNumber?: number;
4444
isHost?: boolean;
45+
syncEverythingForWholeGameSaveState?: boolean;
4546
};
4647

4748
/** Object containing basic properties for all objects synchronizing over the network. */

GDJS/Runtime/variablescontainer.ts

+2
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,7 @@ namespace gdjs {
242242
const variable = this._variables.get(variableName);
243243
const variableOwner = variable.getPlayerOwnership();
244244
if (
245+
!syncOptions.syncEverythingForWholeGameSaveState &&
245246
// Variable undefined.
246247
variable.isUndefinedInContainer() ||
247248
// Variable marked as not to be synchronized.
@@ -253,6 +254,7 @@ namespace gdjs {
253254
!isHost) ||
254255
// Variable is owned by a player but not getting sync data for this player number.
255256
(variableOwner !== 0 && syncedPlayerNumber !== variableOwner)
257+
256258
) {
257259
// In those cases, the variable should not be synchronized.
258260
return;

0 commit comments

Comments
 (0)