Skip to content

Commit 365b1f3

Browse files
committed
Update toSaveString and clone options
1 parent b04f126 commit 365b1f3

File tree

3 files changed

+47
-16
lines changed

3 files changed

+47
-16
lines changed

docs/Prefab.md

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
- [`addComponent(component)`](#addcomponentcomponent)
2121
- [`addEntity(entity)`](#addentityentity)
2222
- [`addGift(giftPrefab)`](#addgiftgiftprefab)
23-
- [`clone()`](#clone)
23+
- [`clone(options?)`](#cloneoptions)
2424
- [`getAngularVelocity()`](#getangularvelocity)
2525
- [`getChildPrefab(prefabName, parentHash?)`](#getchildprefabprefabname-parenthash)
2626
- [`getComponentVersions()`](#getcomponentversions)
@@ -61,7 +61,7 @@
6161
- [`setSpawnArea(populationDefinitionArg, props?)`](#setspawnareapopulationarg-props)
6262
- [`setVelocity(velocity)`](#setvelocityvelocity)
6363
- [`toBinary(componentVersions)`](#tobinarycomponentversions)
64-
- [`toSaveString(force?)`](#tosavestringforce)
64+
- [`toSaveString(options?)`](#tosavestringoptions)
6565

6666
## Types
6767

@@ -472,10 +472,11 @@ box.addGift(gift);
472472

473473
---
474474

475-
### `clone()`
475+
### `clone(options?)`
476476

477477
Returns a deep clone of the prefab.
478478

479+
- `options` (optional, default `{}`) See [`toSaveString(options?)`](#tosavestringoptions).
479480
- Returns: `<Prefab>`
480481

481482
```ts
@@ -1192,11 +1193,13 @@ const binaryString = prefab.toBinary(componentVersions);
11921193

11931194
---
11941195

1195-
### `toSaveString(excludeComponentVersions?)`
1196+
### `toSaveString(options?)`
11961197

1197-
Returns the `SaveString` to spawn this prefab in the game. You may pass a boolean to force returning a save string for prefabs that contain indeterminate component versions.
1198+
Returns the `SaveString` to spawn this prefab in the game. You may pass additional options to change the output behaviour.
11981199

1199-
- `excludeComponentVersions` (optional, default `false`) `<boolean>` Set to true to force a save string without component versions.
1200+
- `options` (optional, default `{}`) `<ToSaveStringOptions>`
1201+
- `options.excludeComponentVersions` (optional, default `false`) Set to true to force a save string without component versions.
1202+
- `options.ignoreIndeterminateComponentVersions` (optional, default `false`) Same as `excludeComponentVersions` but only when encountering indeterminate component versions.
12001203
- Returns: [`<SaveString>`](./SaveString.md)
12011204

12021205
```ts

src/Prefab.test.ts

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2175,10 +2175,11 @@ describe('Prefab.toSaveString()', () => {
21752175
});
21762176
});
21772177

2178-
describe('when excluding component versions', () => {
2178+
describe('when ignoring indeterminate component versions', () => {
21792179
it('returns a save string without component versions', () => {
21802180
const prefab = new Prefab('Torch', {
21812181
components: {
2182+
NetworkRigidbody: new NetworkRigidbodyComponent({ version: 1 }),
21822183
Unknown: [
21832184
new UnsupportedComponent({
21842185
hash: 1337,
@@ -2190,9 +2191,31 @@ describe('Prefab.toSaveString()', () => {
21902191
}
21912192
});
21922193

2193-
const saveString = prefab.toSaveString(true);
2194+
const saveString = prefab.toSaveString({
2195+
ignoreIndeterminateComponentVersions: true
2196+
});
2197+
2198+
expect(saveString).toStrictEqual(
2199+
'56698,116,56698,0,0,0,0,0,0,1065353216,1065353216,2290978823,418,0,0,0,0,0,0,1065353216,0,0,0,0,0,0,334,1073741829,1036795904,0,0,'
2200+
);
2201+
});
2202+
});
2203+
2204+
describe('when excluding component versions', () => {
2205+
it('returns a save string without component versions', () => {
2206+
const prefab = new Prefab('Torch', {
2207+
components: {
2208+
NetworkRigidbody: new NetworkRigidbodyComponent({ version: 1 })
2209+
}
2210+
});
2211+
2212+
const saveString = prefab.toSaveString({
2213+
excludeComponentVersions: true
2214+
});
21942215

2195-
expect(saveString).toStrictEqual('56698,56,56698,0,0,0,0,0,0,1065353216,1065353216,1337,20,4147183616,0,0,');
2216+
expect(saveString).toStrictEqual(
2217+
'56698,108,56698,0,0,0,0,0,0,1065353216,1065353216,2290978823,418,0,0,0,0,0,0,1065353216,0,0,0,0,0,0,0,0,0,'
2218+
);
21962219
});
21972220
});
21982221
});

src/Prefab.ts

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ type PrefabHash<TPrefabName extends ATTPrefabName> = (typeof ATTPrefabs)[TPrefab
4545

4646
type PrefabName<TPrefabName extends ATTPrefabName> = (typeof ATTPrefabs)[TPrefabName]['name'];
4747

48+
type ToSaveStringOptions = {
49+
excludeComponentVersions?: boolean | undefined;
50+
ignoreIndeterminateComponentVersions?: boolean | undefined;
51+
};
52+
4853
export type PrefabProps<TPrefabName extends ATTPrefabName> = {
4954
position?: Position | undefined;
5055
rotation?: Rotation | undefined;
@@ -548,8 +553,8 @@ export class Prefab<TPrefabName extends ATTPrefabName = ATTPrefabName> {
548553
* const cloneMaterial = clone.getMaterial();
549554
* // `cloneMaterial` is `56394` (Gold)
550555
*/
551-
clone(): Prefab<PrefabName<TPrefabName>> {
552-
return Prefab.fromSaveString<PrefabName<TPrefabName>>(this.toSaveString());
556+
clone(options: ToSaveStringOptions = {}): Prefab<PrefabName<TPrefabName>> {
557+
return Prefab.fromSaveString<PrefabName<TPrefabName>>(this.toSaveString(options));
553558
}
554559

555560
/**
@@ -1714,8 +1719,8 @@ export class Prefab<TPrefabName extends ATTPrefabName = ATTPrefabName> {
17141719
}
17151720

17161721
/**
1717-
* Returns the `SaveString` to spawn this prefab in the game. You may pass a boolean to force
1718-
* returning a save string for prefabs that contain indeterminate component versions.
1722+
* Returns the `SaveString` to spawn this prefab in the game. You may pass additional options to
1723+
* change the output behaviour.
17191724
*
17201725
* @example
17211726
* import { Prefab } from 'att-string-transcoder';
@@ -1724,13 +1729,13 @@ export class Prefab<TPrefabName extends ATTPrefabName = ATTPrefabName> {
17241729
*
17251730
* const saveString = prefab.toSaveString();
17261731
*/
1727-
toSaveString(excludeComponentVersions = false): SaveString {
1732+
toSaveString(options: ToSaveStringOptions = {}): SaveString {
17281733
const componentVersions = this.getComponentVersions();
17291734
const data = this.toBinary(componentVersions);
17301735

17311736
const hasIndeterminateVersions = [...componentVersions.values()].includes(0);
17321737

1733-
if (hasIndeterminateVersions && !excludeComponentVersions) {
1738+
if (hasIndeterminateVersions && !options.ignoreIndeterminateComponentVersions) {
17341739
throw new Error(
17351740
'Prefab contains components with version `0`. Current in-game versions for those components are not available. The produced save string will not contain component versions and may not be spawnable in-game.\n\nYou may call `.toSaveString(true)` to force producing a save string with this limitation.\n'
17361741
);
@@ -1759,7 +1764,7 @@ export class Prefab<TPrefabName extends ATTPrefabName = ATTPrefabName> {
17591764
}
17601765

17611766
/* Return SaveString. */
1762-
const strings = [binaryDataString, componentVersionsString].filter(Boolean);
1767+
const strings = [binaryDataString, !options.excludeComponentVersions && componentVersionsString].filter(Boolean);
17631768
return `${strings.join(',|')},` as SaveString;
17641769
}
17651770
}

0 commit comments

Comments
 (0)