Skip to content

Commit 2a6037c

Browse files
authored
Merge pull request #2 from mdingena/add-embedded-entity-component-versions
Add embeddedEntity component versions to version string
2 parents 719b95a + 4ba9f58 commit 2a6037c

File tree

6 files changed

+70
-20
lines changed

6 files changed

+70
-20
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
"prebuild": "rimraf build/",
99
"build": "tsc",
1010
"compile": "tsc --noEmit",
11+
"pretest": "npm run build",
1112
"test": "jest"
1213
},
1314
"author": "Marc Dingena",

src/decoders/decodeEmbeddedEntities.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export type UnknownEmbeddedEntity = {
1111

1212
export type KnownEmbeddedEntity = Fire;
1313

14-
export type EmbeddedEntities = KnownEmbeddedEntity & {
14+
export type EmbeddedEntities = {
1515
Unknown?: UnknownEmbeddedEntity[];
1616
Fire?: Fire;
1717
};

src/getComponentVersions.ts

Lines changed: 45 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,68 @@
1-
import { Prefab } from './decoders';
2-
import { transcoders, ComponentName, UnknownComponent, ComponentVersion } from './components';
1+
import { Components, KnownEmbeddedEntity, Prefab, UnknownEmbeddedEntity } from './decoders';
2+
import { ComponentName, UnknownComponent, ComponentVersion } from './components';
3+
import { ComponentHash } from './ComponentHash';
34

45
type VersionPair = [number, number];
56

6-
const getComponentVersionPairs = (prefab: Prefab): VersionPair[] => {
7+
const getComponentVersionPairs = (components: Components = {}) => {
8+
const versionPairs: VersionPair[] = [];
9+
10+
for (const [key, value] of Object.entries(components)) {
11+
const componentName = key as ComponentName | 'Unknown';
12+
13+
if (componentName === 'Unknown') {
14+
const unknownComponents = value as UnknownComponent[];
15+
versionPairs.push(
16+
...unknownComponents.map(
17+
component => [component.hash, ComponentVersion.get(component.hash)] as [number, number]
18+
)
19+
);
20+
} else {
21+
const componentHash = ComponentHash[componentName];
22+
const componentVersion = ComponentVersion.get(componentHash);
23+
versionPairs.push([componentHash, componentVersion ?? 1]);
24+
}
25+
}
26+
27+
return versionPairs;
28+
};
29+
30+
const getPrefabVersionPairs = (prefab: Prefab): VersionPair[] => {
731
const versionPairs: VersionPair[] = [];
832

933
if (prefab.components) {
10-
for (const [key, value] of Object.entries(prefab.components)) {
11-
const componentName = key as ComponentName | 'Unknown';
12-
13-
if (componentName === 'Unknown') {
14-
const unknownComponents = value as UnknownComponent[];
15-
versionPairs.push(
16-
...unknownComponents.map(
17-
component => [component.hash, ComponentVersion.get(component.hash)] as [number, number]
18-
)
19-
);
34+
versionPairs.push(...getComponentVersionPairs(prefab.components));
35+
}
36+
37+
if (prefab.embeddedEntities) {
38+
for (const [key, value] of Object.entries(prefab.embeddedEntities)) {
39+
const embeddedEntityName = key as keyof KnownEmbeddedEntity | 'Unknown';
40+
41+
if (embeddedEntityName === 'Unknown') {
42+
const unknownEmbeddedEntities = value as UnknownEmbeddedEntity[];
43+
44+
for (const embeddedEntity of unknownEmbeddedEntities) {
45+
versionPairs.push(...getComponentVersionPairs(embeddedEntity.components));
46+
}
2047
} else {
21-
const componentInfo = transcoders[componentName];
22-
versionPairs.push([componentInfo.HASH, componentInfo.VERSION]);
48+
const knownEmbeddedEntity = value as KnownEmbeddedEntity;
49+
50+
versionPairs.push(...getComponentVersionPairs(knownEmbeddedEntity.components));
2351
}
2452
}
2553
}
2654

2755
if (prefab.childPrefabs?.length) {
2856
for (const childPrefab of prefab.childPrefabs) {
29-
versionPairs.push(...getComponentVersionPairs(childPrefab.prefab));
57+
versionPairs.push(...getPrefabVersionPairs(childPrefab.prefab));
3058
}
3159
}
3260

3361
return versionPairs;
3462
};
3563

3664
export const getComponentVersions = (prefab: Prefab): string => {
37-
const versionPairs = getComponentVersionPairs(prefab);
65+
const versionPairs = getPrefabVersionPairs(prefab);
3866
const uniquePairs = versionPairs.filter(
3967
([hash], index) => versionPairs.findIndex(pair => pair[0] === hash) === index
4068
);

tests/createString.test.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
import { createString } from '../build';
2-
import { handle } from './data/unencodedPrefabObjects';
3-
import { shortHandleWithLargeGuardAndLargeBlade } from './data/encodedPrefabObjects';
2+
import { handle, litGrassClump } from './data/unencodedPrefabObjects';
3+
import { grassClumpOnFire, shortHandleWithLargeGuardAndLargeBlade } from './data/encodedPrefabObjects';
44

55
describe('createString', () => {
66
it('should encode a prefab object', () => {
77
const encodedPrefab = createString(handle);
88

99
expect(encodedPrefab).toStrictEqual(shortHandleWithLargeGuardAndLargeBlade);
1010
});
11+
12+
it('should create a version string', () => {
13+
const encodedPrefab = createString(litGrassClump);
14+
15+
expect(encodedPrefab).toStrictEqual(grassClumpOnFire);
16+
});
1117
});

tests/data/encodedPrefabObjects.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
export const shortHandleWithLargeGuardAndLargeBlade =
22
'42230,252,42230,3291430912,1124086579,1120403456,0,0,0,1065353216,1065353216,2290978823,418,3291430912,1124086579,1120403456,0,0,0,1065353216,0,0,0,0,0,0,0,0,536871679,1163,0,0,0,0,0,0,133169152,133169152,34023564,2684354564,2523,1307670851,3758096388,126122721,1073741824,0,268438699,2147487155,3221225472,0,0,0,0,0,66584576,66584576,17011782,1342177282,1968,3875060897,4026531842,63061360,2684354560,0,0,|3,2290978823,1,272188517,1,1871432223,1,';
3+
export const grassClumpOnFire =
4+
'57872,80,57872,0,0,0,0,0,0,1065353216,1065353216,0,30100,194,4202164032,48,3221225472,343781376,1836894,0,0,0,|1,4109360768,2,';

tests/data/unencodedPrefabObjects.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,3 +57,16 @@ export const handle: Prefab = {
5757
}
5858
]
5959
};
60+
61+
export const litGrassClump: Prefab = {
62+
prefabObject: {
63+
hash: PrefabHash.Grass_Clump
64+
},
65+
embeddedEntities: {
66+
Fire: {
67+
components: {
68+
HeatSourceBase: {}
69+
}
70+
}
71+
}
72+
};

0 commit comments

Comments
 (0)