Add resource pack generators: blockstates and model

This commit is contained in:
Misode
2021-11-05 01:22:23 +01:00
parent 6d8829ecde
commit fba80da273
11 changed files with 115 additions and 38 deletions

View File

@@ -8,7 +8,7 @@ import '../styles/nodes.css'
import { Analytics } from './Analytics'
import { Header } from './components'
import { loadLocale, locale, Locales } from './Locales'
import { Changelog, Generator, Home, Sounds, Worldgen } from './pages'
import { Category, Changelog, Generator, Home, Sounds } from './pages'
import type { VersionId } from './services'
import { Store } from './Store'
import { cleanUrl } from './Utils'
@@ -70,7 +70,8 @@ function Main() {
<Header {...{lang, title, version, theme, language: lang, changeLanguage, changeTheme}} />
<Router onChange={changeRoute}>
<Home path="/" {...{lang, changeTitle}} />
<Worldgen path="/worldgen" {...{lang, changeTitle}} />
<Category path="/worldgen" category="worldgen" {...{lang, changeTitle}} />
<Category path="/assets" category="assets" {...{lang, changeTitle}} />
<Sounds path="/sounds" {...{lang, version, changeTitle, changeVersion}} />
<Changelog path="/changelog" {...{lang, changeTitle}} />
<Generator default {...{lang, version, changeTitle, changeVersion}} />

View File

@@ -4,16 +4,17 @@ import { locale } from '../Locales'
import { cleanUrl } from '../Utils'
type WorldgenProps = {
category: string,
lang: string,
changeTitle: (title: string) => unknown,
path?: string,
}
export function Worldgen({ lang, changeTitle }: WorldgenProps) {
export function Category({ category, lang, changeTitle }: WorldgenProps) {
const loc = locale.bind(null, lang)
changeTitle(loc('title.generator_category', loc('worldgen')))
changeTitle(loc('title.generator_category', loc(category)))
return <main>
<div class="home">
{config.generators.filter(g => g.category === 'worldgen').map(g =>
{config.generators.filter(g => g.category === category).map(g =>
<ToolCard title={loc(g.id)} link={cleanUrl(g.url)} />
)}
</div>

View File

@@ -18,6 +18,8 @@ export function Home({ lang, changeTitle }: HomeProps) {
)}
<ToolCard title={loc('worldgen')} link="/worldgen/" />
<hr />
<ToolCard title={loc('assets')} link="/assets/" />
<hr />
<ToolCard title="Report Inspector" icon="report" link="https://misode.github.io/report/">
<p>Analyse your performance reports</p>
</ToolCard>

View File

@@ -1,5 +1,5 @@
export * from './Category'
export * from './Changelog'
export * from './Generator'
export * from './Home'
export * from './Sounds'
export * from './Worldgen'

View File

@@ -16,7 +16,7 @@ const hiddenFields = ['number_provider.type', 'score_provider.type', 'nbt_provid
const flattenedFields = ['feature.config', 'decorator.config', 'int_provider.value', 'float_provider.value', 'block_state_provider.simple_state_provider.state', 'block_state_provider.rotated_block_provider.state', 'block_state_provider.weighted_state_provider.entries.entry.data', 'rule_test.block_state', 'structure_feature.config', 'surface_builder.config', 'template_pool.elements.entry.element', 'decorator.block_survives_filter.state', 'material_rule.block.result_state']
const inlineFields = ['loot_entry.type', 'function.function', 'condition.condition', 'criterion.trigger', 'dimension.generator.type', 'dimension.generator.biome_source.type', 'feature.type', 'decorator.type', 'block_state_provider.type', 'feature.tree.minimum_size.type', 'trunk_placer.type', 'foliage_placer.type', 'tree_decorator.type', 'block_placer.type', 'rule_test.predicate_type', 'processor.processor_type', 'template_element.element_type', 'nbt_operation.op', 'number_provider.value', 'score_provider.name', 'score_provider.target', 'nbt_provider.source', 'nbt_provider.target', 'generator_biome.biome', 'block_predicate.type', 'material_rule.type', 'material_condition.type']
const nbtFields = ['function.set_nbt.tag', 'advancement.display.icon.nbt', 'text_component_object.nbt', 'entity.nbt', 'block.nbt', 'item.nbt']
const fixedLists = ['generator_biome.parameters.temperature', 'generator_biome.parameters.humidity', 'generator_biome.parameters.continentalness', 'generator_biome.parameters.erosion', 'generator_biome.parameters.depth', 'generator_biome.parameters.weirdness', 'feature.end_spike.crystal_beam_target', 'feature.end_gateway.exit', 'decorator.block_filter.offset', 'block_predicate.matching_blocks.offset', 'block_predicate.matching_fluids.offset']
const fixedLists = ['generator_biome.parameters.temperature', 'generator_biome.parameters.humidity', 'generator_biome.parameters.continentalness', 'generator_biome.parameters.erosion', 'generator_biome.parameters.depth', 'generator_biome.parameters.weirdness', 'feature.end_spike.crystal_beam_target', 'feature.end_gateway.exit', 'decorator.block_filter.offset', 'block_predicate.matching_blocks.offset', 'block_predicate.matching_fluids.offset', 'model_element.from', 'model_element.to', 'model_element.rotation.origin', 'model_element.faces.uv', 'item_transform.rotation', 'item_transform.translation', 'item_transform.scale']
/**
* Secondary model used to remember the keys of a map
@@ -59,6 +59,7 @@ const renderHtml: RenderHook = {
choice({ choices, config, switchNode }, path, value, lang, states, ctx) {
const choice = switchNode.activeCase(path, true) as typeof choices[number]
const contextPath = (config?.context) ? new ModelPath(path.getModel(), new Path(path.getArray(), [config.context])) : path
console.log('RENDER', path.toString(), choice.type, value)
const [prefix, suffix, body] = choice.node.hook(this, contextPath, value, lang, states, ctx)
if (choices.length === 1) {
return [prefix, suffix, body]
@@ -69,6 +70,7 @@ const renderHtml: RenderHook = {
const newValue = c.change
? c.change(DataModel.unwrapLists(value))
: config.choiceContext === 'feature' ? c.node.default()?.config?.feature : c.node.default()
console.warn('CHOICE', type, c, value, newValue)
path.model.set(path, DataModel.wrapLists(newValue))
}
const inject = <select value={choice.type} onChange={(e) => set((e.target as HTMLSelectElement).value)}>
@@ -258,6 +260,7 @@ const renderHtml: RenderHook = {
}
const newCtx = (typeof value === 'object' && value !== null && node.default()?.pools)
? { ...ctx, loot: value?.type } : ctx
// console.log('OBJECT', path.toString(), Object.keys(getActiveFields(path)))
const body = <>
{(typeof value === 'object' && value !== null && !(node.optional() && value === undefined)) &&
Object.entries(getActiveFields(path))

View File

@@ -9,7 +9,7 @@ import { checkVersion } from './Schemas'
const CACHE_NAME = 'misode-v1'
type VersionRef = 'mcdata_master' | 'vanilla_datapack_summary' | 'vanilla_datapack_data'
type VersionRef = 'mcdata_master' | 'mcassets' | 'vanilla_datapack_summary' | 'vanilla_datapack_data'
type Version = {
id: string,
@@ -21,6 +21,7 @@ declare var __MCDATA_MASTER_HASH__: string
declare var __VANILLA_DATAPACK_SUMMARY_HASH__: string
const mcdataUrl = 'https://raw.githubusercontent.com/Arcensoth/mcdata'
const mcassetsUrl = 'https://raw.githubusercontent.com/InventivetalentDev/minecraft-assets'
const vanillaDatapackUrl = 'https://raw.githubusercontent.com/SPGoding/vanilla-datapack'
const manifestUrl = 'https://launchermeta.mojang.com/mc/game/version_manifest.json'
const resourceUrl = 'https://resources.download.minecraft.net/'
@@ -67,13 +68,14 @@ export async function fetchData(versionId: string, collectionTarget: CollectionR
fetchRegistries(version, collectionTarget),
fetchBlockStateMap(version, blockStateTarget),
fetchDynamicRegistries(version, collectionTarget),
fetchAssetsRegistries(version, collectionTarget),
])
}
async function fetchRegistries(version: Version, target: CollectionRegistry) {
console.debug(`[fetchRegistries] ${version.id}`)
const registries = config.registries
.filter(r => !r.dynamic)
.filter(r => !r.dynamic && !r.asset)
.filter(r => checkVersion(version.id, r.minVersion, r.maxVersion))
if (checkVersion(version.id, undefined, '1.15')) {
@@ -142,7 +144,7 @@ async function fetchBlockStateMap(version: Version, target: BlockStateRegistry)
async function fetchDynamicRegistries(version: Version, target: CollectionRegistry) {
console.debug(`[fetchDynamicRegistries] ${version.id}`)
const registries = config.registries
.filter(r => r.dynamic)
.filter(r => r.dynamic && !r.asset)
.filter(r => checkVersion(version.id, r.minVersion, r.maxVersion))
if (checkVersion(version.id, '1.16')) {
@@ -161,11 +163,43 @@ async function fetchDynamicRegistries(version: Version, target: CollectionRegist
}
}
export async function fetchAssetsRegistries(version: Version, target: CollectionRegistry) {
console.debug(`[fetchAssetsRegistries] ${version.id}`)
const registries = config.registries
.filter(r => r.asset)
.filter(r => checkVersion(version.id, r.minVersion, r.maxVersion))
await Promise.all(registries.map(async r => {
try {
const fetchFolder = async (path: string): Promise<string[]> => {
const url = `${mcassetsUrl}/${version.refs.mcassets}/assets/minecraft/${path}/_list.json`
const data = await getData(url)
if (data.directories.length === 0) {
return data.files
}
const directories = await Promise.all(data.directories.map(async (d: string) => {
const files = await fetchFolder(`${path}/${d}`)
return files.map(v => `${d}/${v}`)
}))
return [...data.files, ...directories.flat()]
}
const ids = (await fetchFolder(r.path ?? r.id))
.filter((v: string) => v.endsWith('.json') || v.endsWith('.png'))
.map(v => `minecraft:${v.replace(/\.(json|png)$/, '')}`)
target.register(r.id, ids)
} catch (e) {
console.warn(`Error occurred while fetching assets registry ${r.id}:`, message(e))
}
}))
}
export async function fetchPreset(version: VersionId, registry: string, id: string) {
console.debug(`[fetchPreset] ${registry} ${id}`)
const versionData = config.versions.find(v => v.id === version)!
try {
const url = `${vanillaDatapackUrl}/${versionData.refs.vanilla_datapack_data}/data/minecraft/${registry}/${id}.json`
const url = ['blockstates', 'models'].includes(registry)
? `${mcassetsUrl}/${versionData.refs.mcassets}/assets/minecraft/${registry}/${id}.json`
: `${vanillaDatapackUrl}/${versionData.refs.vanilla_datapack_data}/data/minecraft/${registry}/${id}.json`
const res = await fetch(url)
if (registry === 'worldgen/noise_settings' && version === '1.18') {
let text = await res.text()