diff --git a/src/app/DataFetcher.ts b/src/app/DataFetcher.ts index 81468acc..fae6f599 100644 --- a/src/app/DataFetcher.ts +++ b/src/app/DataFetcher.ts @@ -170,7 +170,11 @@ export async function fetchPreset(version: VersionId, registry: string, id: stri if (registry === 'worldgen/noise_settings' && version === '1.18') { let text = await res.text() text = text.replaceAll('"max_threshold": Infinity', '"max_threshold": 100') - return JSON.parse(text) + const data = JSON.parse(text) + if (id !== 'overworld' && id !== 'large_biomes') { + data.noise.terrain_shaper = { offset: 0, factor: 0, jaggedness: 0 } + } + return data } return await res.json() } catch (e) { diff --git a/src/app/components/previews/BiomeSourcePreview.tsx b/src/app/components/previews/BiomeSourcePreview.tsx index 233f97e8..5be2ff49 100644 --- a/src/app/components/previews/BiomeSourcePreview.tsx +++ b/src/app/components/previews/BiomeSourcePreview.tsx @@ -106,7 +106,7 @@ function calculateState(data: any, octaves: NoiseOctaves, shaper: TerrainShaper) return JSON.stringify([data, octaves, shaper.toJson()]) } -function getOctaves(obj: any): NoiseOctaves { +export function getOctaves(obj: any): NoiseOctaves { if (typeof obj !== 'string') { const settings = NoiseGeneratorSettings.fromJson(DataModel.unwrapLists(obj)) obj = settings.noise.densityFactor === 0 && settings.noise.densityOffset === -0.030078125 @@ -145,7 +145,7 @@ function getOctaves(obj: any): NoiseOctaves { } } -function getShaper(obj: any): TerrainShaper { +export function getShaper(obj: any): TerrainShaper { if (typeof obj === 'string') { switch (obj.replace(/^minecraft:/, '')) { case 'overworld': diff --git a/src/app/components/previews/NoiseSettingsPreview.tsx b/src/app/components/previews/NoiseSettingsPreview.tsx index 8914e769..007a1bdc 100644 --- a/src/app/components/previews/NoiseSettingsPreview.tsx +++ b/src/app/components/previews/NoiseSettingsPreview.tsx @@ -10,18 +10,11 @@ import { randomSeed } from '../../Utils' export const NoiseSettingsPreview = ({ lang, data, shown, version }: PreviewProps) => { const loc = locale.bind(null, lang) const [seed, setSeed] = useState(randomSeed()) - const [biomeFactor, setBiomeFactor] = useState(0.2) - const [biomeOffset, setBiomeOffset] = useState(0.1) - const [biomePeaks, setBiomePeaks] = useState(0) + const [biomeScale, setBiomeScale] = useState(0.2) + const [biomeDepth, setBiomeDepth] = useState(0.1) const [focused, setFocused] = useState(undefined) const offset = useRef(0) - const state = JSON.stringify([data, biomeFactor, biomeOffset, biomePeaks]) - - const hasPeaks = checkVersion(version, '1.18') - useEffect(() => { - setBiomeFactor(hasPeaks ? 600 : 0.2) - setBiomeOffset(hasPeaks ? 0.05 : 0.1) - }, [hasPeaks]) + const state = JSON.stringify([data, biomeScale, biomeDepth]) const size = data?.noise?.height ?? 256 const { canvas, redraw } = useCanvas({ @@ -29,7 +22,7 @@ export const NoiseSettingsPreview = ({ lang, data, shown, version }: PreviewProp return [size, size] }, async draw(img) { - const options = { biomeOffset, biomeFactor, biomePeaks, offset: offset.current, width: img.width, seed, version } + const options = { biomeDepth, biomeScale, offset: offset.current, width: img.width, seed, version } noiseSettings(data, img, options) }, async onDrag(dx) { @@ -54,16 +47,12 @@ export const NoiseSettingsPreview = ({ lang, data, shown, version }: PreviewProp return <>
{focused && } - - {hasPeaks ? <> - setBiomeFactor(Number(v))} /> - setBiomeOffset(Number(v))} /> - setBiomePeaks(Number(v))} /> - : <> - setBiomeFactor(Number(v))} /> - setBiomeOffset(Number(v))} /> - } - + {checkVersion(version, undefined, '1.17') && + + setBiomeScale(Number(v))} /> + setBiomeDepth(Number(v))} /> + + } setSeed(randomSeed())} />
diff --git a/src/app/previews/NoiseSettings.ts b/src/app/previews/NoiseSettings.ts index 7890298e..1500ee29 100644 --- a/src/app/previews/NoiseSettings.ts +++ b/src/app/previews/NoiseSettings.ts @@ -1,15 +1,15 @@ import { DataModel } from '@mcschema/core' import type { BlockPos, BlockState } from 'deepslate' import { Chunk, ChunkPos, FixedBiome, NoiseChunkGenerator, NoiseGeneratorSettings } from 'deepslate' +import { getOctaves } from '../components' import type { VersionId } from '../Schemas' import { checkVersion } from '../Schemas' import { deepClone, deepEqual } from '../Utils' import { NoiseChunkGenerator as OldNoiseChunkGenerator } from './noise/NoiseChunkGenerator' export type NoiseSettingsOptions = { - biomeFactor: number, - biomeOffset: number, - biomePeaks: number, + biomeScale?: number, + biomeDepth?: number, offset: number, width: number, seed: bigint, @@ -54,7 +54,7 @@ export function noiseSettings(state: any, img: ImageData, options: NoiseSettings } const generator = new OldNoiseChunkGenerator(options.seed) - generator.reset(state.noise, options.biomeOffset, options.biomeFactor, options.offset, 200) + generator.reset(state.noise, options.biomeDepth ?? 0, options.biomeScale ?? 0, options.offset, options.width) const data = img.data const row = img.width * 4 for (let x = 0; x < options.width; x += 1) { @@ -72,12 +72,9 @@ export function noiseSettings(state: any, img: ImageData, options: NoiseSettings function getCached(state: unknown, options: NoiseSettingsOptions) { const settings = NoiseGeneratorSettings.fromJson(DataModel.unwrapLists(state)) - // Temporary fix for slides - settings.noise.bottomSlide.target *= 128 - settings.noise.topSlide.target *= 128 - const shape = { factor: options.biomeFactor, offset: options.biomeOffset, peaks: options.biomePeaks, nearWater: false } + settings.octaves = getOctaves(settings) - const newState = [state, shape, `${options.seed}`] + const newState = [state, `${options.seed}`] if (!deepEqual(newState, cacheState)) { cacheState = deepClone(newState) chunkCache = [] diff --git a/src/app/schema/renderHtml.tsx b/src/app/schema/renderHtml.tsx index c15ce509..fc3398dd 100644 --- a/src/app/schema/renderHtml.tsx +++ b/src/app/schema/renderHtml.tsx @@ -237,6 +237,8 @@ const renderHtml: RenderHook = { }, object({ node, config, getActiveFields, getChildModelPath }, path, value, lang, states, ctx) { + const { expand, isToggled } = useToggles() + if (path.getArray().length == 0 && isDecorated(config.context, value)) { const { wrapper, fields } = createDecoratorsWrapper(getActiveFields(path), path, value) value = wrapper.data @@ -263,6 +265,16 @@ const renderHtml: RenderHook = { .filter(([_, child]) => child.enabled(path)) .map(([key, child]) => { const cPath = getChildModelPath(path, key) + const canToggle = child.type(cPath) === 'object' + const toggle = isToggled(key) + if (canToggle && (toggle === false || (toggle === undefined && (ctx.depth ?? 0) > 5))) { + return
+ + + +
+ } + const context = cPath.getContext().join('.') if (hiddenFields.includes(context)) return null const [cPrefix, cSuffix, cBody] = child.hook(this, cPath, value[key], lang, states, newCtx) @@ -434,7 +446,7 @@ function TreeNode({ label, schema, path, value, lang, states, ctx, actions, chil setActive() } - const newCtx = {...ctx} + const newCtx: Record = { ...ctx, depth: (ctx.depth ?? 0) + 1 } delete newCtx.index const [prefix, suffix, body] = schema.hook(renderHtml, path, value, lang, states, newCtx) return