Skip to content

Commit e844477

Browse files
committed
Fix #626 update item displays to 1.21.4
1 parent c81bafd commit e844477

File tree

12 files changed

+89
-83
lines changed

12 files changed

+89
-83
lines changed

package-lock.json

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
"@zip.js/zip.js": "^2.4.5",
2727
"brace": "^0.11.1",
2828
"buffer": "^6.0.3",
29-
"deepslate": "^0.22.3",
29+
"deepslate": "^0.23.2",
3030
"deepslate-1.18": "npm:[email protected]",
3131
"deepslate-1.18.2": "npm:[email protected]",
3232
"deepslate-1.20.4": "npm:[email protected]",

src/app/components/ItemDisplay.tsx

Lines changed: 11 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import type { ItemStack } from 'deepslate/core'
2-
import { Identifier } from 'deepslate/core'
32
import { useCallback, useEffect, useMemo, useRef, useState } from 'preact/hooks'
43
import { useVersion } from '../contexts/Version.jsx'
54
import { useAsync } from '../hooks/useAsync.js'
6-
import { fetchItemComponents, fetchRegistries } from '../services/index.js'
5+
import { fetchItemComponents } from '../services/index.js'
76
import { ResolvedItem } from '../services/ResolvedItem.js'
87
import { renderItem } from '../services/Resources.js'
98
import { jsonToNbt } from '../Utils.js'
@@ -42,13 +41,13 @@ export function ItemDisplay({ item, slotDecoration, tooltip, advancedTooltip }:
4241
}, [baseComponents])
4342
const resolvedItem = useMemo(() => {
4443
return itemResolver(item)
45-
}, [item, baseComponents])
44+
}, [item, itemResolver])
4645

4746
const maxDamage = resolvedItem.getMaxDamage()
4847
const damage = resolvedItem.getDamage()
4948

5049
return <div class="item-display" ref={el}>
51-
<ItemItself item={resolvedItem} />
50+
<RenderedItem item={resolvedItem} baseComponents={baseComponents} />
5251
{item.count !== 1 && <>
5352
<svg class="item-count" width="100%" height="100%" viewBox="0 0 100 100" preserveAspectRatio="xMinYMid meet">
5453
<text x="95" y="93" font-size="50" textAnchor="end" fontFamily="MinecraftSeven" fill="#373737">{item.count}</text>
@@ -74,34 +73,16 @@ export function ItemDisplay({ item, slotDecoration, tooltip, advancedTooltip }:
7473

7574
interface ResolvedProps extends Props {
7675
item: ResolvedItem
76+
baseComponents: Map<string, Map<string, unknown>> | undefined
7777
}
78-
function ItemItself({ item }: ResolvedProps) {
78+
function RenderedItem({ item, baseComponents }: ResolvedProps) {
7979
const { version } = useVersion()
80-
81-
if (item.id.namespace !== Identifier.DEFAULT_NAMESPACE) {
82-
return Octicon.package
83-
}
84-
85-
const { value: allModels, loading: loadingModels } = useAsync(async () => {
86-
const registries = await fetchRegistries(version)
87-
return registries.get('model')
88-
}, [version])
89-
90-
if (loadingModels || allModels === undefined) {
91-
return null
92-
}
93-
94-
const modelPath = `item/${item.id.path}`
95-
if (allModels && allModels.includes('minecraft:' + modelPath)) {
96-
return <RenderedItem item={item} />
97-
}
98-
99-
return Octicon.package
100-
}
101-
102-
function RenderedItem({ item }: ResolvedProps) {
103-
const { version } = useVersion()
104-
const { value: src } = useAsync(() => renderItem(version, item.flatten()), [version, item])
80+
const { value: src } = useAsync(async () => {
81+
if (!baseComponents) {
82+
return undefined
83+
}
84+
return renderItem(version, item, baseComponents)
85+
}, [version, item, baseComponents])
10586

10687
if (src) {
10788
return <>

src/app/components/previews/BlockStatePreview.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export const BlockStatePreview = ({ docAndNode, shown }: PreviewProps) => {
1818

1919
const { value: resources } = useAsync(async () => {
2020
if (!shown) return AsyncCancel
21-
const resources = await getResources(version)
21+
const resources = await getResources(version, new Map())
2222
const definition = BlockDefinition.fromJson(safeJsonParse(text) ?? {})
2323
const wrapper = new ResourceWrapper(resources, {
2424
getBlockDefinition(id) {

src/app/components/previews/Deepslate.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -315,11 +315,12 @@ export class Deepslate {
315315
finalDensity: this.d.DensityFunction.fromJson(state),
316316
}),
317317
})
318+
const levelHeight: deepslate19.LevelHeight = { minY: 0, height: 256 }
318319
const unknownBiome = this.d.Identifier.create('unknown')
319320
const randomState = new this.d.RandomState(settings, seed)
320321
const biomeSource = new this.d.FixedBiomeSource(unknownBiome)
321322
const chunkGenerator = new this.d.NoiseChunkGenerator(biomeSource, settings)
322-
this.structureContextCache = { seed, settings, randomState, biomeSource, chunkGenerator }
323+
this.structureContextCache = { seed, settings, randomState, biomeSource, chunkGenerator, levelHeight }
323324

324325
class SimpleStructure extends this.d.WorldgenStructure {
325326
constructor(settings: deepslate19.WorldgenStructure.StructureSettings) {

src/app/components/previews/LootTable.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { ItemComponentsProvider } from 'deepslate'
12
import { NbtByte, NbtDouble, NbtLong } from 'deepslate'
23
import type { Random } from 'deepslate/core'
34
import { Identifier, ItemStack, LegacyRandom } from 'deepslate/core'
@@ -20,7 +21,7 @@ const StackMixers = {
2021

2122
type StackMixer = keyof typeof StackMixers
2223

23-
interface LootOptions {
24+
interface LootOptions extends ItemComponentsProvider {
2425
version: VersionId,
2526
seed: bigint,
2627
luck: number,
@@ -32,7 +33,6 @@ interface LootOptions {
3233
getPredicate(id: string): any,
3334
getEnchantments(): Map<string, any>,
3435
getEnchantmentTag(id: string): string[],
35-
getBaseComponents(id: string): Map<string, NbtTag>,
3636
}
3737

3838
interface LootContext extends LootOptions {
@@ -235,12 +235,12 @@ function createItem(entry: any, consumer: ItemConsumer, ctx: LootContext) {
235235
switch (type) {
236236
case 'item':
237237
const id = Identifier.parse(entry.name)
238-
entryConsumer(new ResolvedItem(new ItemStack(id, 1), ctx.getBaseComponents(id.toString())))
238+
entryConsumer(new ResolvedItem(new ItemStack(id, 1), ctx.getItemComponents(id)))
239239
break
240240
case 'tag':
241241
ctx.getItemTag(entry.name).forEach(tagEntry => {
242242
const id = Identifier.parse(tagEntry)
243-
entryConsumer(new ResolvedItem(new ItemStack(id, 1), ctx.getBaseComponents(id.toString())))
243+
entryConsumer(new ResolvedItem(new ItemStack(id, 1), ctx.getItemComponents(id)))
244244
})
245245
break
246246
case 'loot_table':
@@ -303,7 +303,7 @@ const LootFunctions: Record<string, (params: any) => LootFunction> = {
303303
const level = ctx.random.nextInt(maxLevel - 1) + 1
304304
if (item.is('book')) {
305305
item.id = Identifier.create('enchanted_book')
306-
item.base = ctx.getBaseComponents(item.id.toString())
306+
item.base = ctx.getItemComponents(item.id)
307307
}
308308
updateEnchantments(item, levels => {
309309
return levels.set(Identifier.parse(pick).toString(), level)
@@ -314,7 +314,7 @@ const LootFunctions: Record<string, (params: any) => LootFunction> = {
314314
const selected = selectEnchantments(item, computeInt(levels, ctx), allowed, ctx)
315315
if (item.is('book')) {
316316
item.id = Identifier.create('enchanted_book')
317-
item.base = ctx.getBaseComponents(item.id.toString())
317+
item.base = ctx.getItemComponents(item.id)
318318
}
319319
updateEnchantments(item, levelsMap => {
320320
for (const { id, lvl } of selected) {
@@ -437,7 +437,7 @@ const LootFunctions: Record<string, (params: any) => LootFunction> = {
437437
}
438438
if (item.is('book')) {
439439
item.id = Identifier.create('enchanted_book')
440-
item.base = ctx.getBaseComponents(item.id.toString())
440+
item.base = ctx.getItemComponents(item.id)
441441
}
442442
updateEnchantments(item, levels => {
443443
Object.entries(enchantments).forEach(([id, level]) => {
@@ -463,7 +463,7 @@ const LootFunctions: Record<string, (params: any) => LootFunction> = {
463463
set_item: ({ item: newId }) => (item, ctx) => {
464464
if (typeof newId !== 'string') return
465465
item.id = Identifier.parse(newId)
466-
item.base = ctx.getBaseComponents(item.id.toString())
466+
item.base = ctx.getItemComponents(item.id)
467467
},
468468
set_loot_table: ({ name, seed }) => (item) => {
469469
item.set('container_loot', new NbtCompound()

src/app/components/previews/LootTablePreview.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { Identifier } from 'deepslate'
21
import { useMemo, useRef, useState } from 'preact/hooks'
32
import { useLocale, useVersion } from '../../contexts/index.js'
43
import { useAsync } from '../../hooks/useAsync.js'
@@ -58,7 +57,7 @@ export const LootTablePreview = ({ docAndNode }: PreviewProps) => {
5857
getPredicate: () => undefined,
5958
getEnchantments: () => enchantments ?? new Map(),
6059
getEnchantmentTag: (id) => (enchantmentTags?.get(id.replace(/^minecraft:/, '')) as any)?.values ?? [],
61-
getBaseComponents: (id) => new Map([...(itemComponents?.get(Identifier.parse(id).toString()) ?? new Map()).entries()].map(([k, v]) => [k, jsonToNbt(v)])),
60+
getItemComponents: (id) => new Map([...(itemComponents?.get(id.toString()) ?? new Map()).entries()].map(([k, v]) => [k, jsonToNbt(v)])),
6261
})
6362
}, [version, seed, luck, daytime, weather, mixItems, text, dependencies, loading])
6463

src/app/components/previews/ModelPreview.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export const ModelPreview = ({ docAndNode, shown }: PreviewProps) => {
1919

2020
const { value: resources } = useAsync(async () => {
2121
if (!shown) return AsyncCancel
22-
const resources = await getResources(version)
22+
const resources = await getResources(version, new Map())
2323
const blockModel = BlockModel.fromJson(safeJsonParse(text) ?? {})
2424
blockModel.flatten(resources)
2525
const wrapper = new ResourceWrapper(resources, {

src/app/components/previews/StructureSetPreview.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ export const StructureSetPreview = ({ docAndNode, shown }: PreviewProps) => {
5252

5353
iterateWorld2D(imageData.current, transform, (x, y) => {
5454
const pos = ChunkPos.create(x, y)
55-
const structure = computeIfAbsent(chunkStructures, `${pos[0]} ${pos[1]}`, () => structureSet?.getStructureInChunk(pos[0], pos[1], context))
55+
const structure = computeIfAbsent(chunkStructures, `${pos[0]} ${pos[1]}`, () => structureSet?.getStructureInChunk(pos[0], pos[1], context)?.id)
5656
return { structure, pos }
5757
}, ({ structure, pos }) => {
5858
if (structure !== undefined) {

src/app/services/DataFetcher.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,15 +209,19 @@ export function getAssetUrl(versionId: VersionId, type: string, path: string): s
209209

210210
export async function fetchResources(versionId: VersionId) {
211211
const version = config.versions.find(v => v.id === versionId)!
212+
const needsItemModels = checkVersion(versionId, '1.20.5')
213+
const hasItemModels = checkVersion(versionId, '1.21.4')
212214
await validateCache(version)
213215
try {
214-
const [blockDefinitions, models, uvMapping, atlas] = await Promise.all([
216+
const [blockDefinitions, models, uvMapping, atlas, itemDefinitions] = await Promise.all([
215217
fetchAllPresets(versionId, 'block_definition'),
216218
fetchAllPresets(versionId, 'model'),
217219
fetch(`${mcmeta(version, 'atlas')}/all/data.min.json`).then(r => r.json()),
218220
loadImage(`${mcmeta(version, 'atlas')}/all/atlas.png`),
221+
// Always download the 1.21.4 item models for the version range 1.20.5 - 1.21.3
222+
needsItemModels ? fetchAllPresets(hasItemModels ? versionId : '1.21.4', 'item_definition') : new Map<string, unknown>(),
219223
])
220-
return { blockDefinitions, models, uvMapping, atlas }
224+
return { blockDefinitions, models, uvMapping, atlas, itemDefinitions }
221225
} catch (e) {
222226
throw new Error(`Error occured while fetching resources: ${message(e)}`)
223227
}

0 commit comments

Comments
 (0)