diff --git a/package-lock.json b/package-lock.json index 84e95fcf..d3825d92 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,9 +5,9 @@ "requires": true, "dependencies": { "@mcschema/core": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/@mcschema/core/-/core-0.11.2.tgz", - "integrity": "sha512-Y5jKXDesEkwwM/USwSQFoNaokAfZZDopb2bjIz77RppSFsa4f7zJuHPn+A+Wohn4ZZAmizkXx7P6slUj4rvc6Q==" + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/@mcschema/core/-/core-0.11.3.tgz", + "integrity": "sha512-15CTjCGeZPW123NYnjnG7jwtK9IVydFPSIas/QIKO9WGXlbLC+zRflOhcVVkHEprJuuFdGGmH9cfnUeFyZbDRQ==" }, "@mcschema/java-1.16": { "version": "0.5.14", @@ -18,11 +18,18 @@ } }, "@mcschema/java-1.17": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@mcschema/java-1.17/-/java-1.17-0.1.3.tgz", - "integrity": "sha512-YQ0zxBAS2MFk6YWOTYip2/eZo/WXHBWxh/CuZEyibYoRMqEwryj0IR71d5Q/mgFZlhm4S8MI05ucuwfRk+X27A==", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@mcschema/java-1.17/-/java-1.17-0.1.4.tgz", + "integrity": "sha512-N3Et4Uz+VlmdpM2dAUEKoOS2HJIid1DlFWJIFK9NDRXLRqEFz9uNO5Coise2AM+0p/fJqapxVQCRgAwlEtd02g==", "requires": { - "@mcschema/core": "^0.11.2" + "@mcschema/core": "^0.11.3" + }, + "dependencies": { + "@mcschema/core": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/@mcschema/core/-/core-0.11.3.tgz", + "integrity": "sha512-15CTjCGeZPW123NYnjnG7jwtK9IVydFPSIas/QIKO9WGXlbLC+zRflOhcVVkHEprJuuFdGGmH9cfnUeFyZbDRQ==" + } } }, "@mcschema/locales": { diff --git a/package.json b/package.json index 549bf551..01fe9921 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "dependencies": { "@mcschema/core": "^0.11.2", "@mcschema/java-1.16": "^0.5.14", - "@mcschema/java-1.17": "^0.1.3", + "@mcschema/java-1.17": "^0.1.4", "@mcschema/locales": "^0.1.11", "@types/google.analytics": "0.0.40", "@types/split.js": "^1.4.0", diff --git a/src/app/app.ts b/src/app/app.ts index e969588f..9aaf5cd1 100644 --- a/src/app/app.ts +++ b/src/app/app.ts @@ -12,6 +12,14 @@ import { BiomeNoiseVisualizer } from './visualization/BiomeNoiseVisualizer' import { Mounter } from './Mounter' import { getLanguage, hasLocale, locale, registerLocale, setLanguage } from './locales' +type ModelConfig = { + id: string + name: string + schema?: string + minVersion?: string + children?: ModelConfig[] +} + const versionSchemas: { [versionId: string]: { getCollections: () => CollectionRegistry, @@ -30,6 +38,8 @@ const publicPath = '/'; const modelFromPath = (p: string) => p.replace(publicPath, '').replace(/\/$/, '') +const modelConfig = (id: string): ModelConfig => config.models.find(m => m.id === id) ?? config.models.filter(m => m.children).reduce((acc: any, cur: any) => [...acc, ...cur.children], []).find(m => m.id === id) + const addChecked = (el: HTMLElement) => { el.classList.add('check') setTimeout(() => { @@ -174,7 +184,10 @@ Promise.all([ let models: { [key: string]: DataModel } = {} const buildModel = (model: any) => { if (model.schema) { - models[model.id] = new DataModel(SCHEMAS.get(model.schema)) + const schema = SCHEMAS.get(model.schema) + if (schema) { + models[model.id] = new DataModel(schema) + } } else if (model.children) { model.children.forEach(buildModel) } @@ -199,6 +212,21 @@ Promise.all([ document.querySelectorAll('[data-i18n]').forEach(el => { el.textContent = locale(el.attributes.getNamedItem('data-i18n')!.value) }) + + treeVersionMenu.innerHTML = '' + const m = modelConfig(selected) + const minVersion = config.versions.findIndex(v => v.id === (m?.minVersion ?? '1.16')) + config.versions.forEach((v, i) => { + if (i > minVersion) return + const entry = document.createElement('button') + entry.classList.add('btn') + entry.textContent = v.id + entry.addEventListener('click', () => { + updateVersion(v.id) + ga('send', 'event', 'Generator', 'set-version', version) + }) + treeVersionMenu.append(entry) + }) } const updateLanguage = (id: string, store = false) => { @@ -228,30 +256,38 @@ Promise.all([ } } - const updateVersion = (id: string) => { + const updateVersion = async (id: string) => { localStorage.setItem(LOCAL_STORAGE_VERSION, id) if (id === version) return const newCollections = versionSchemas[id].getCollections() - RegistryFetcher(newCollections, id).then(() => { + await RegistryFetcher(newCollections, id) + const newSchemas = versionSchemas[id].getSchemas(newCollections) - const newSchemas = versionSchemas[id].getSchemas(newCollections) - - const fixModel = (model: any) => { - if (model.schema) { - models[model.id].schema = newSchemas.get(model.schema) + const fixModel = (model: ModelConfig) => { + if (model.schema) { + const minVersion = config.versions.findIndex(v => v.id === (model.minVersion ?? '1.16')) + const targetVersion = config.versions.findIndex(v => v.id === id) + if (minVersion >= targetVersion) { + const schema = newSchemas.get(model.schema) + if (models[model.id] === undefined) { + models[model.id] = new DataModel(schema) + } else { + models[model.id].schema = schema + } models[model.id].validate() models[model.id].invalidate() - } else if (model.children) { - model.children.forEach(fixModel) + } else { + delete models[model.id] } + } else if (model.children) { + model.children.forEach(fixModel) } - config.models.forEach(fixModel) - - treeVersionLabel.textContent = id - version = id - ga('set', 'dimension3', version); - }) + } + config.models.forEach(fixModel) + treeVersionLabel.textContent = id + version = id + ga('set', 'dimension3', version); } homeLink.addEventListener('click', evt => { @@ -355,17 +391,6 @@ Promise.all([ }, { capture: true, once: true }) }) - config.versions.forEach(v => { - const entry = document.createElement('button') - entry.classList.add('btn') - entry.textContent = v.id - entry.addEventListener('click', () => { - updateVersion(v.id) - ga('send', 'event', 'Generator', 'set-version', version) - }) - treeVersionMenu.append(entry) - }) - treeControlsReset.addEventListener('click', evt => { models[selected].reset(models[selected].schema.default(), true) addChecked(treeControlsReset) @@ -427,7 +452,7 @@ Promise.all([ const params = new URLSearchParams(window.location.search); const panels = [treeViewEl, sourceViewEl, errorsViewEl] - if (models[selected] === undefined) { + if (['', 'worldgen'].includes(selected)) { homeViewEl.style.display = ''; (document.querySelector('.gutter') as HTMLElement).style.display = 'none'; (document.querySelector('.content') as HTMLElement).style.overflowY = 'initial' @@ -454,7 +479,16 @@ Promise.all([ homeViewEl.style.display = 'none'; (document.querySelector('.gutter') as HTMLElement).style.display = '' panels.forEach(v => v.style.display = '') - + if (models[selected] === undefined) { + const m = modelConfig(selected) + const loadedVersion = config.versions.findIndex(v => v.id === version) + const minVersion = config.versions.findIndex(v => v.id === m.minVersion) + if (minVersion < loadedVersion) { + updateVersion(m.minVersion!).then(() => { + updateModel() + }) + } + } if (params.has('q')) { const data = atob(params.get('q')!) models[selected].reset(JSON.parse(data)) diff --git a/src/config.json b/src/config.json index 228220f5..bcad777c 100644 --- a/src/config.json +++ b/src/config.json @@ -62,6 +62,12 @@ "name": "Predicate", "schema": "predicate" }, + { + "id": "item-modifier", + "name": "Item Modifier", + "schema": "item_modifier", + "minVersion": "1.17" + }, { "id": "advancement", "name": "Advancement", diff --git a/src/locales/en.json b/src/locales/en.json index ea5279cb..ac4d7fe7 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -4,6 +4,7 @@ "dimension-type": "Dimension Type", "dimension": "Dimension", "download": "Download", + "item-modifier": "Item Modifier", "language": "Language", "loot-table": "Loot Table", "predicate": "Predicate",