Skip to content

Commit f51cb6b

Browse files
committed
update registry to use hash as block state id
1 parent 9f756d0 commit f51cb6b

File tree

2 files changed

+138
-4
lines changed

2 files changed

+138
-4
lines changed

lib/bedrock/index.js

Lines changed: 53 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,68 @@ module.exports = (data) => {
1212
data.itemsByName = buildIndexFromArray(data.itemsArray, 'name')
1313
}
1414
function loadHashedRuntimeIds (registry) {
15+
data.blocksArray = [...data.blocksArray]
16+
data.blockStates = [...data.blockStates]
17+
18+
const stateIndexToHash = {}
1519
data.blocksByRuntimeId = {}
1620
const Block = require('prismarine-block')(registry)
1721
for (let i = 0; i < data.blockStates.length; i++) {
1822
const { name, states } = data.blockStates[i]
1923
const hash = Block.getHash(name, states)
20-
data.blocksByRuntimeId[hash] = { stateId: i, ...data.blocksByStateId[i] }
24+
stateIndexToHash[i] = hash
25+
data.blocksByRuntimeId[hash] = { ...data.blocksByStateId[i], stateId: hash }
26+
}
27+
28+
for (let i = 0; i < data.blockStates.length; i++) {
29+
data.blockStates[i] = { ...data.blockStates[i], stateId: stateIndexToHash[i] }
30+
}
31+
32+
for (let i = 0; i < data.blocksArray.length; i++) {
33+
const item = data.blocksArray[i] = { ...data.blocksArray[i] }
34+
item.defaultState = stateIndexToHash[item.defaultState]
35+
item.states = []
36+
for (let stateId = item.minStateId; stateId <= item.maxStateId; stateId++) {
37+
item.states.push(stateIndexToHash[stateId])
38+
}
39+
item.maxStateId = undefined
40+
item.minStateId = undefined
41+
}
42+
43+
data.blocks = buildIndexFromArray(data.blocksArray, 'id')
44+
data.blocksByName = buildIndexFromArray(data.blocksArray, 'name')
45+
46+
data.blocksByStateId = {}
47+
for (const block of data.blocksArray) {
48+
for (const stateId of block.states) {
49+
data.blocksByStateId[stateId] = block
50+
}
2151
}
2252
}
2353
function loadRuntimeIds () {
24-
data.blocksByRuntimeId = {}
54+
data.blocksArray = [...data.blocksArray]
55+
data.blockStates = [...data.blockStates]
56+
2557
for (let i = 0; i < data.blockStates.length; i++) {
26-
data.blocksByRuntimeId[i] = { stateId: i, ...data.blocksByStateId[i] }
58+
data.blockStates[i] = { ...data.blockStates[i], stateId: i }
59+
}
60+
61+
for (let i = 0; i < data.blocksArray.length; i++) {
62+
const item = data.blocksArray[i] = { ...data.blocksArray[i] }
63+
item.states = []
64+
for (let stateId = item.minStateId; stateId <= item.maxStateId; stateId++) {
65+
item.states.push(stateId)
66+
}
67+
}
68+
69+
data.blocks = buildIndexFromArray(data.blocksArray, 'id')
70+
data.blocksByName = buildIndexFromArray(data.blocksArray, 'name')
71+
72+
data.blocksByStateId = {}
73+
for (const block of data.blocksArray) {
74+
for (const stateId of block.states) {
75+
data.blocksByStateId[stateId] = block
76+
}
2777
}
2878
}
2979

test/mcbedrock.test.js

Lines changed: 85 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,97 @@
22

33
const SUPPORTED_VERSIONS = ['1.17.10', '1.18.0', '1.18.11', '1.18.30', '1.19.1', '1.19.10', '1.21.70']
44
const test = require('./mcbedrock')
5+
const assert = require('assert')
56

67
describe('mcbedrock', function () {
78
this.timeout(18000 * 10)
89

910
for (const version of SUPPORTED_VERSIONS) {
10-
it('works on ' + version, async () => {
11+
const registry = require('prismarine-registry')(`bedrock_${version}`)
12+
require('prismarine-block')(registry)
13+
14+
it(`should not modify minecraft-data indexes on ${version}`, async () => {
15+
// arrange
16+
const minecraftData = require('minecraft-data')(`bedrock_${version}`)
17+
const keysToVerify = ['blocksArray', 'blocks', 'blocksByName', 'blocksByStateId', 'blockblockStates']
18+
19+
const expectedData = {}
20+
for (const key of keysToVerify) {
21+
expectedData[key] = JSON.stringify(minecraftData[key])
22+
}
23+
24+
registry.handleStartGame({ itemstates: [], block_network_ids_are_hashes: true })
25+
26+
for (const key of keysToVerify) {
27+
const actualData = JSON.stringify(minecraftData[key])
28+
assert.deepEqual(actualData, expectedData[key], `minecraft-data.${key} was modified`)
29+
}
30+
31+
registry.handleStartGame({ itemstates: [], block_network_ids_are_hashes: false })
32+
33+
for (const key of keysToVerify) {
34+
const actualData = JSON.stringify(minecraftData[key])
35+
assert.deepEqual(actualData, expectedData[key], `minecraft-data.${key} was modified`)
36+
}
37+
})
38+
39+
it(`works on ${version}, block block_network_ids_are_hashes = false`, async () => {
1140
await test(version)
1241
})
42+
43+
if (registry.version['>=']('1.18')) {
44+
it.skip(`works on ${version}, block block_network_ids_are_hashes = true`, async () => {
45+
await test(version)
46+
})
47+
}
1348
}
49+
50+
it('should use use hash on id 1.21.70', async () => {
51+
// arrange
52+
const registry = require('prismarine-registry')('bedrock_1.21.70')
53+
registry.handleStartGame({ itemstates: [], block_network_ids_are_hashes: true })
54+
const block = registry.blocksByName.diamond_block
55+
56+
// blocksArray, blocks, blocksByName, blocksByStateId should have same object references
57+
assert.equal(registry.blocksArray.find(x => x.id === block.id), block)
58+
assert.equal(registry.blocks[192], block)
59+
assert.equal(registry.blocksByName.diamond_block, block)
60+
assert.equal(registry.blocksByStateId['1460042000'], block)
61+
62+
assert.equal(block.id, 192)
63+
assert.equal(block.minStateId, undefined)
64+
assert.equal(block.maxStateId, undefined)
65+
assert.deepEqual(block.states, [1460042000])
66+
assert.equal(block.defaultState, 1460042000)
67+
68+
const blockState = registry.blockStates.find(bs => bs.stateId === block.defaultState)
69+
assert.equal(blockState.stateId, 1460042000)
70+
assert.equal(blockState.name, 'diamond_block')
71+
})
72+
73+
it('should use use index on id 1.21.70', async () => {
74+
// arrange
75+
let registry = require('prismarine-registry')('bedrock_1.21.70')
76+
registry.handleStartGame({ itemstates: [], block_network_ids_are_hashes: true })
77+
78+
registry = require('prismarine-registry')('bedrock_1.21.70')
79+
registry.handleStartGame({ itemstates: [], block_network_ids_are_hashes: false })
80+
const block = registry.blocksByName.diamond_block
81+
82+
// blocksArray, blocks, blocksByName, blocksByStateId should have same object references
83+
assert.equal(registry.blocksArray.find(x => x.id === block.id), block)
84+
assert.equal(registry.blocks[192], block)
85+
assert.equal(registry.blocksByName.diamond_block, block)
86+
assert.equal(registry.blocksByStateId[1276], block)
87+
88+
assert.equal(block.id, 192)
89+
assert.equal(block.minStateId, 1276)
90+
assert.equal(block.maxStateId, 1276)
91+
assert.deepEqual(block.states, [1276])
92+
assert.equal(block.defaultState, 1276)
93+
94+
const blockState = registry.blockStates.find(bs => bs.stateId === block.defaultState)
95+
assert.equal(blockState.stateId, 1276)
96+
assert.equal(blockState.name, 'diamond_block')
97+
})
1498
})

0 commit comments

Comments
 (0)