diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..64b14c85 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,29 @@ +name: Build and Test + +on: + pull_request: + branches: [main] + +jobs: + publish: + runs-on: ubuntu-latest + + permissions: + contents: read + + steps: + - uses: actions/checkout@v5 + - uses: oven-sh/setup-bun@v2 + - uses: actions/setup-node@v4 + with: + node-version: 24 + registry-url: https://registry.npmjs.org/ + + - name: Install dependencies + run: bun install --frozen-lockfile + + - name: Build + run: bun run build + + - name: Run tests + run: bun test diff --git a/tools/cleanupDist.cjs b/.scripts/cleanupDist.cjs similarity index 100% rename from tools/cleanupDist.cjs rename to .scripts/cleanupDist.cjs diff --git a/tools/esbuild.ts b/.scripts/esbuild.ts similarity index 81% rename from tools/esbuild.ts rename to .scripts/esbuild.ts index 1ba515f8..fb4cda2a 100644 --- a/tools/esbuild.ts +++ b/.scripts/esbuild.ts @@ -7,21 +7,24 @@ if (process.argv.includes('--mode=dev')) { process.env.FLAVOR ??= `local` import * as esbuild from 'esbuild' +import importFolderPlugin from 'esbuild-plugin-import-folder' import ImportGlobPlugin from 'esbuild-plugin-import-glob' import inlineImage from 'esbuild-plugin-inline-image' import * as fs from 'fs' import { load } from 'js-yaml' import vscodeProblemsPatch from 'node-modules-vscode-problems-patch' -import * as path from 'path' -import { isAbsolute, join } from 'path' +import * as path from 'node:path' +import { isAbsolute, join } from 'node:path' +import { + createBlockbenchSvelteConfig, + esbuildPluginSvelte, +} from 'svelte-patching-tools/esbuildPlugin' import { TextDecoder } from 'util' -import svelteConfig from '../svelte.config.js' import assetOverridePlugin from './plugins/assetOverridePlugin' import bufferPatchPlugin from './plugins/bufferPatchFunction.js' -import importFolderPlugin from './plugins/importFolder' +import langPlugin from './plugins/lang' import mcbCompressionPlugin from './plugins/mcbCompressionPlugin' import packagerPlugin from './plugins/packagerPlugin' -import sveltePlugin from './plugins/sveltePlugin' const PACKAGE = JSON.parse(fs.readFileSync('./package.json', 'utf-8')) const INFO_PLUGIN: esbuild.Plugin = { @@ -134,34 +137,7 @@ function createBanner() { return '│ ' + ' '.repeat(l) + v + ' '.repeat(r) + ' │' }) - const message = ` -# Animated Java does not work in Blockbench 5 - -You will need to install and use Blockbench v4.12.6 to use Animated Java until it is updated to support 5. - -## How to install Blockbench v4.12.6 - -1. Download the portable version of Blockbench 4.12.6 [here](https://github.com/JannisX11/blockbench/releases/download/v4.12.6/Blockbench_4.12.6_portable.exe). -2. Once it's finished downloading, double click the .exe file to run it. - -If you're familiar with command line interfaces, you can use [Envbench](https://www.npmjs.com/package/envbench) to install and manage multiple Blockbench versions side by side. -` - - const startupCode = `(() => { - if (!compareVersions('5.0.0', Blockbench.version)) { - const message = \`${message}\`; - Blockbench.showMessageBox({title: 'Animated Java - Incompatible Blockbench Version',message,width:600}); - requestAnimationFrame(() => Plugins.registered['animated_java'].uninstall()); - throw new Error(message); - } -})()`.trim() - - const banner = - '\n' + - [header, ...lines, footer].map(v => `//?? ${v}`).join('\n') + - '\n\n' + - startupCode + - '\n' + const banner = '\n' + [header, ...lines, footer].map(v => `//?? ${v}`).join('\n') return { js: banner, @@ -205,17 +181,27 @@ const yamlPlugin: (opts: { }, }) +import VSCODE_SETTINGS from '../.vscode/settings.json' +const IGNORED_SVELTE_WARNINGS = Object.keys( + VSCODE_SETTINGS['svelte.plugin.svelte.compilerWarnings'] +) + const COMMON_CONFIG: esbuild.BuildOptions = { banner: createBanner(), entryPoints: ['./src/index.ts'], outfile: `./dist/${PACKAGE.name}.js`, bundle: true, - platform: 'node', + platform: 'browser', + external: ['node:*'], loader: { '.svg': 'dataurl', '.ttf': 'binary', '.css': 'text' }, plugins: [ + langPlugin({ + languageFolder: 'src/lang', + }), // @ts-expect-error broken default import vscodeProblemsPatch.default(), - importFolderPlugin, + // @ts-expect-error broken default import + importFolderPlugin.default(), // @ts-expect-error broken default import ImportGlobPlugin.default(), bufferPatchPlugin(), @@ -224,15 +210,36 @@ const COMMON_CONFIG: esbuild.BuildOptions = { }), INFO_PLUGIN, yamlPlugin({}), - sveltePlugin(svelteConfig), + esbuildPluginSvelte( + createBlockbenchSvelteConfig(PACKAGE.name, { + compilerOptions: { + warningFilter(warning: any) { + return !IGNORED_SVELTE_WARNINGS.includes(warning.code) + }, + compatibility: { + componentApi: 4, + }, + // @ts-expect-error - not typed correctly + generate: 'client', + }, + }) + ), packagerPlugin(), assetOverridePlugin(), mcbCompressionPlugin(), DEPENDENCY_QUARKS, ], - alias: { svelte: 'svelte' }, + alias: { + svelte: 'svelte', + module: './.scripts/fakeModule.js', + 'node:module': './.scripts/fakeModule.js', + }, format: 'iife', define: DEFINES, + inject: [ + // Blockbench does not provide access to the global process, but some of our dependencies expect it to exist. + `./.scripts/fakeProcess.js`, + ], treeShaking: true, } diff --git a/.scripts/fakeModule.js b/.scripts/fakeModule.js new file mode 100644 index 00000000..b60ab86b --- /dev/null +++ b/.scripts/fakeModule.js @@ -0,0 +1,8 @@ +const Module = { + createRequire() { + return {} + }, +} + +export { Module as module } +export default Module diff --git a/.scripts/fakeProcess.js b/.scripts/fakeProcess.js new file mode 100644 index 00000000..0c490494 --- /dev/null +++ b/.scripts/fakeProcess.js @@ -0,0 +1,9 @@ +const process = { + __NOTE: 'This is a fake process object added by Animated Java. It is not the actual Node.js process object.', + cwd: () => '', + env: {}, + version: 'v24.14.0', + argv: '', +} + +export { process } diff --git a/tools/plugins/assetOverridePlugin.ts b/.scripts/plugins/assetOverridePlugin.ts similarity index 97% rename from tools/plugins/assetOverridePlugin.ts rename to .scripts/plugins/assetOverridePlugin.ts index c254c614..a0e9916d 100644 --- a/tools/plugins/assetOverridePlugin.ts +++ b/.scripts/plugins/assetOverridePlugin.ts @@ -1,6 +1,6 @@ import type { Plugin } from 'esbuild' import * as fs from 'fs/promises' -import * as pathjs from 'path' +import * as pathjs from 'node:path' const ASSET_OVERRIDES_PATH = 'src/assets/vanillaAssetOverrides/' diff --git a/tools/plugins/bufferPatchFunction.ts b/.scripts/plugins/bufferPatchFunction.ts similarity index 100% rename from tools/plugins/bufferPatchFunction.ts rename to .scripts/plugins/bufferPatchFunction.ts diff --git a/.scripts/plugins/lang.d.ts b/.scripts/plugins/lang.d.ts new file mode 100644 index 00000000..f0dfc964 --- /dev/null +++ b/.scripts/plugins/lang.d.ts @@ -0,0 +1,20 @@ +interface LangPluginOptions { + languageFolder: string +} + +interface StructuredLanguageFile { + [key: string]: string | StructuredLanguageFile +} + +interface LanguageDefinition { + name: string + structured: StructuredLanguageFile + flattened: Record +} + +declare module 'LANGUAGES' { + export const LANGUAGES: Record + export function flattenStructuredLanguageFile( + file: StructuredLanguageFile + ): Record +} diff --git a/.scripts/plugins/lang.ts b/.scripts/plugins/lang.ts new file mode 100644 index 00000000..7fb39817 --- /dev/null +++ b/.scripts/plugins/lang.ts @@ -0,0 +1,79 @@ +/// + +import ESBuild from 'esbuild' +import { existsSync } from 'fs' +import { readdir, readFile } from 'fs/promises' +import { load } from 'js-yaml' +import { join } from 'path' + +const filterYamlFiles = (file: string) => { + return file.endsWith('.yml') || file.endsWith('.yaml') +} + +const flattenStructuredLanguageFile = (file: StructuredLanguageFile): Record => { + const result: Record = {} + for (const key in file) { + if (typeof file[key] === 'string') { + result[key] = file[key] + continue + } + + for (const [subKey, value] of Object.entries(flattenStructuredLanguageFile(file[key]))) { + result[`${key}.${subKey}`] = value + } + } + return result +} + +const langPlugin = ({ languageFolder }: LangPluginOptions) => + ({ + name: 'lang', + setup(build) { + if (!existsSync(languageFolder)) { + throw new Error(`Language folder "${languageFolder}" does not exist.`) + } + + build.onResolve({ filter: /LANGUAGES/ }, () => { + return { + path: languageFolder, + namespace: 'language-file', + } + }) + + build.onLoad({ filter: /.*/, namespace: 'language-file' }, async () => { + const translations: Record = {} + + const files = (await readdir(languageFolder)).filter(filterYamlFiles) + if (files.length === 0) { + console.warn(`No language files found in "${languageFolder}"`) + } + + const watchFiles: string[] = [] + + for (const file of files) { + const path = join(languageFolder, file) + watchFiles.push(path) + + const name = file.replace(/\.(yml|yaml)$/, '') + const structured: StructuredLanguageFile = await readFile(path, { + encoding: 'utf-8', + }).then(data => load(data, { filename: path }) as StructuredLanguageFile) + const flattened = flattenStructuredLanguageFile(structured) + + translations[name] = { name, structured, flattened } + } + + const contents = + `export const LANGUAGES = ${JSON.stringify(translations)};` + + `export const flattenStructuredLanguageFile = ${flattenStructuredLanguageFile.toString()};` + + return { + contents, + loader: 'js', + watchFiles, + } + }) + }, + }) satisfies ESBuild.Plugin + +export default langPlugin diff --git a/tools/plugins/mcbCompressionPlugin.ts b/.scripts/plugins/mcbCompressionPlugin.ts similarity index 93% rename from tools/plugins/mcbCompressionPlugin.ts rename to .scripts/plugins/mcbCompressionPlugin.ts index a5e36583..10ff872d 100644 --- a/tools/plugins/mcbCompressionPlugin.ts +++ b/.scripts/plugins/mcbCompressionPlugin.ts @@ -1,8 +1,8 @@ import type { Plugin } from 'esbuild' -import * as fflate from 'fflate' +import * as fflate from 'fflate/browser' import { existsSync } from 'fs' import * as fs from 'fs/promises' -import * as pathjs from 'path' +import * as pathjs from 'node:path' function zip(data: fflate.AsyncZippable): Promise { return new Promise((resolve, reject) => { @@ -59,7 +59,7 @@ export default getZipFile('${localPath}') const data = Buffer.from(zipped).toString('base64') return { contents: ` -import * as fflate from 'fflate' +import * as fflate from 'fflate/browser' const unzipped = fflate.unzipSync(Uint8Array.from(atob('${data}'), c => c.charCodeAt(0))) export default function getFile(path) { return Buffer.from(unzipped[path]).toString('utf-8') diff --git a/tools/plugins/packagerPlugin.ts b/.scripts/plugins/packagerPlugin.ts similarity index 59% rename from tools/plugins/packagerPlugin.ts rename to .scripts/plugins/packagerPlugin.ts index f1b63df1..73fd8bed 100644 --- a/tools/plugins/packagerPlugin.ts +++ b/.scripts/plugins/packagerPlugin.ts @@ -1,12 +1,17 @@ import type { Plugin } from 'esbuild' import * as fs from 'fs' import { readFileSync, writeFileSync } from 'fs' +import { basename, join } from 'node:path' import { Octokit } from 'octokit' -import * as pathjs from 'path' -// @ts-expect-error No types import * as prettier from 'prettier' -import * as c from 'svelte/compiler' -import * as svelteInternal from 'svelte/internal' +import { sveltePreprocess } from 'svelte-preprocess' +// @ts-expect-error - Types are broken in nodenext for this package, but it works fine. +import { typescript } from 'svelte-preprocess-esbuild' +import type { CompileOptions, CompileResult } from 'svelte/compiler' +import { compile, preprocess } from 'svelte/compiler' +import { render } from 'svelte/server' +// @ts-expect-error - Svelte's internal server-side rendering API is not typed, but we need it to render the about.svelte file at build time. +import * as svelteInternalServer from 'svelte/internal/server' const OCTO_KIT = new Octokit({}) @@ -19,7 +24,7 @@ const DIST_PACKAGE_PATH = './dist/pluginPackage/' const PLUGIN_REPO_PATH = 'D:/github-repos/snavesutit/blockbench-plugins/plugins/animated_java' const PLUGIN_MANIFEST_PATH = 'D:/github-repos/snavesutit/blockbench-plugins/plugins.json' const CHANGELOG_PATH = './src/pluginPackage/changelog.json' -const RELEASE_NOTES_TEMPLATES = './tools/plugins/releaseNoteTemplates/' +const RELEASE_NOTES_TEMPLATES = './.scripts/plugins/releaseNoteTemplates/' const URL_REGEX = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9]{1,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/gm @@ -39,6 +44,84 @@ function getVersionNumbers(version: string) { return { major, minor, patch, preRelease } } +/** + * Convert a warning or error emitted from the svelte compiler for esbuild. + */ +function convertWarning(source: any, { message, filename, start, end }: any) { + if (!start || !end) { + return { text: message } + } + const lines = source.split(/\r\n|\r|\n/) + const lineText = lines[start.line - 1] + const location = { + file: filename, + line: start.line, + column: start.column, + length: (start.line === end.line ? end.column : lineText.length) - start.column, + lineText, + } + return { text: message, location } +} + +async function renderSvelteFileToStaticHTML(path: string) { + const filename = basename(path) + const source = readFileSync(path, 'utf-8') + const processed = await preprocess( + source, + [ + typescript({ + target: 'es2022', + define: { + 'process.browser': 'true', + }, + }), + sveltePreprocess({ + typescript: false, + sourceMap: process.env.NODE_ENV === 'development', + }), + ], + { filename } + ) + const compilerOptions: CompileOptions = { + filename, + sourcemap: processed.map, + css: 'external', + // @ts-expect-error - Svelte multiselect is breaking svelte types... + generate: 'server', + cssHash() { + return `animated-java-plugin-about-page` + }, + } + let res: CompileResult + try { + res = compile(processed.code, compilerOptions) + } catch (err: any) { + return { errors: [convertWarning(processed.code, err)] } + } + const component = new Function( + 'svelteInternalServer', + res.js.code + .replace('export default ', 'return ') + .replace( + `import * as $ from 'svelte/internal/server';`, + 'const $ = svelteInternalServer;' + ) + )(svelteInternalServer) + + let contents = render(component, {}).body + // Remove all comments + contents = contents.replaceAll(//gs, '') + // Emit CSS, otherwise it will be included in the JS and injected at runtime. + if (res.css?.code) { + contents = `${contents}\n` + } + + return { + contents, + warnings: res.warnings.map(warning => convertWarning(source, warning)), + } +} + function plugin(): Plugin { return { name: 'packagerPlugin', @@ -47,28 +130,34 @@ function plugin(): Plugin { console.log('📦 Packaging...') fs.rmSync(DIST_PACKAGE_PATH, { recursive: true, force: true }) fs.cpSync(PLUGIN_PACKAGE_PATH, DIST_PACKAGE_PATH, { recursive: true }) - fs.copyFileSync( - `./dist/${PACKAGE.name}.js`, - pathjs.join(DIST_PACKAGE_PATH, PACKAGE.name + '.js') - ) - const svelteResult = c.compile(readFileSync(SVELTE_FILE, 'utf-8'), { - generate: 'ssr', - cssHash({ hash, css }) { - return `animated-java-plugin-page-${hash(css)}` - }, - }) - const component = new Function( - 'svelteInternal', - svelteResult.js.code - .replace(/from "svelte\/internal"/g, ' = svelteInternal') - .replace('export default', 'return') - .replace('import', 'const') - ) - const result = component(svelteInternal).render() - const html = `${result.html}\n` + try { + fs.copyFileSync( + `./dist/${PACKAGE.name}.js`, + join(DIST_PACKAGE_PATH, PACKAGE.name + '.js') + ) + // eslint-disable-next-line @typescript-eslint/no-unused-vars + } catch (e) { + console.log('⚠️ Packaging failed, main plugin file not found in dist!') + return + } + + const svelteResult = await renderSvelteFileToStaticHTML(SVELTE_FILE) + + if ( + svelteResult.contents == undefined || + svelteResult.warnings.length > 0 || + svelteResult.errors != undefined + ) { + return { + errors: svelteResult.errors, + warnings: svelteResult.warnings, + } + } + + const html = svelteResult.contents writeFileSync(README_DIST_PATH, html) - if (fs.existsSync(pathjs.join(DIST_PACKAGE_PATH, 'about.svelte'))) - fs.unlinkSync(pathjs.join(DIST_PACKAGE_PATH, 'about.svelte')) + if (fs.existsSync(join(DIST_PACKAGE_PATH, 'about.svelte'))) + fs.unlinkSync(join(DIST_PACKAGE_PATH, 'about.svelte')) if (process.env.NODE_ENV === 'production') { try { @@ -77,7 +166,7 @@ function plugin(): Plugin { const changelog = JSON.parse(rawChangelog) for (const file of fs.readdirSync(RELEASE_NOTES_TEMPLATES)) { let content = fs.readFileSync( - pathjs.join(RELEASE_NOTES_TEMPLATES, file), + join(RELEASE_NOTES_TEMPLATES, file), 'utf-8' ) let pings = '' @@ -148,7 +237,7 @@ function plugin(): Plugin { .replaceAll(URL_REGEX, (match: string) => '<' + match + '>') } - fs.writeFileSync(pathjs.join(DIST_PATH, file), content) + fs.writeFileSync(join(DIST_PATH, file), content) } } catch (e) { console.error('Error creating changelogs:', e) @@ -172,7 +261,7 @@ function plugin(): Plugin { fs.writeFileSync( PLUGIN_MANIFEST_PATH, - prettier.format(JSON.stringify(manifest, null, '\t'), { + await prettier.format(JSON.stringify(manifest, null, '\t'), { useTabs: true, parser: 'json', }) diff --git a/tools/plugins/releaseNoteTemplates/discord_release_notes_template b/.scripts/plugins/releaseNoteTemplates/discord_release_notes_template similarity index 100% rename from tools/plugins/releaseNoteTemplates/discord_release_notes_template rename to .scripts/plugins/releaseNoteTemplates/discord_release_notes_template diff --git a/tools/plugins/releaseNoteTemplates/github_release_notes_template b/.scripts/plugins/releaseNoteTemplates/github_release_notes_template similarity index 100% rename from tools/plugins/releaseNoteTemplates/github_release_notes_template rename to .scripts/plugins/releaseNoteTemplates/github_release_notes_template diff --git a/tools/tslintNamingConventionRule.d.ts b/.scripts/tslintNamingConventionRule.d.ts similarity index 100% rename from tools/tslintNamingConventionRule.d.ts rename to .scripts/tslintNamingConventionRule.d.ts diff --git a/bun.lock b/bun.lock new file mode 100644 index 00000000..8e0bdae3 --- /dev/null +++ b/bun.lock @@ -0,0 +1,1650 @@ +{ + "lockfileVersion": 1, + "configVersion": 0, + "workspaces": { + "": { + "name": "animated_java", + "dependencies": { + "deepslate": "^0.19.2", + "fflate": "^0.8.2", + "generic-stream": "^3.0.1", + "ky": "^2.0.1", + "marked": "^4.3.0", + "marked-gfm-heading-id": "^3.0.0", + "request-progress": "^3.0.0", + "svelte-ace": "^1.0.21", + "svelte-dnd-action": "^0.9.38", + }, + "devDependencies": { + "@novacbn/svelte-codejar": "^0.1.2", + "@types/download": "^8.0.5", + "@types/eslint": "^8.21.1", + "@types/js-yaml": "^4.0.5", + "@types/node": "^17.0.21", + "@types/websocket": "^1.0.10", + "@typescript-eslint/eslint-plugin": "^5.54.0", + "@typescript-eslint/parser": "^5.54.0", + "blockbench-patch-manager": "^1.0.2", + "book-and-quill": "^1.0.8", + "esbuild": "^0.17.10", + "esbuild-plugin-import-folder": "^1.0.1", + "esbuild-plugin-import-glob": "^0.1.1", + "esbuild-plugin-inline-image": "^0.0.9", + "esbuild-plugin-inline-worker": "^0.1.1", + "esbuild-plugin-svelte": "^0.1.1", + "eslint": "^9.37.0", + "eslint-plugin-svelte": "^3.12.4", + "firebase": "^9.19.0", + "jiti": "^2.6.1", + "js-yaml": "^4.1.0", + "mc-build": "^4.0.4", + "node-modules-vscode-problems-patch": "^1.0.9", + "octokit": "^5.0.3", + "prettier": "^3.8.2", + "simple-subpub": "^1.2.0", + "svelte": "^5.55.3", + "svelte-awesome-color-picker": "^3.0.0-beta.7", + "svelte-eslint-parser": "^1.3.3", + "svelte-multiselect": "^11.0.0-rc.1", + "svelte-observable-store": "^1.0.1", + "svelte-patching-tools": "^1.0.14", + "svelte-preprocess": "^6.0.3", + "svelte-preprocess-esbuild": "^3.0.1", + "typescript": "^6.0.2", + "typescript-eslint": "^8.45.0", + "vitest": "^3.2.4", + }, + }, + }, + "packages": { + "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], + + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.24.1", "", {}, "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.24.5", "", {}, "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA=="], + + "@babel/parser": ["@babel/parser@7.29.2", "", { "dependencies": { "@babel/types": "^7.29.0" }, "bin": "./bin/babel-parser.js" }, "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA=="], + + "@babel/types": ["@babel/types@7.24.5", "", { "dependencies": { "@babel/helper-string-parser": "^7.24.1", "@babel/helper-validator-identifier": "^7.24.5", "to-fast-properties": "^2.0.0" } }, "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ=="], + + "@electron/get": ["@electron/get@2.0.3", "", { "dependencies": { "debug": "^4.1.1", "env-paths": "^2.2.0", "fs-extra": "^8.1.0", "got": "^11.8.5", "progress": "^2.0.3", "semver": "^6.2.0", "sumchecker": "^3.0.1" }, "optionalDependencies": { "global-agent": "^3.0.0" } }, "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-yTgnwQpFVYfvvo4SvRFB0SwrW8YjOxEoT7wfMT7Ol5v7v5LDNvSGo67aExmxOb87nQNeWPVvaGBNfQ7BXcrZ9w=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.17.19", "", { "os": "android", "cpu": "arm" }, "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.17.19", "", { "os": "android", "cpu": "arm64" }, "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.17.19", "", { "os": "android", "cpu": "x64" }, "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.17.19", "", { "os": "darwin", "cpu": "arm64" }, "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.17.19", "", { "os": "darwin", "cpu": "x64" }, "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.17.19", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.17.19", "", { "os": "freebsd", "cpu": "x64" }, "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.17.19", "", { "os": "linux", "cpu": "arm" }, "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.17.19", "", { "os": "linux", "cpu": "arm64" }, "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.17.19", "", { "os": "linux", "cpu": "ia32" }, "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.17.19", "", { "os": "linux", "cpu": "none" }, "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.17.19", "", { "os": "linux", "cpu": "none" }, "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.17.19", "", { "os": "linux", "cpu": "ppc64" }, "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.17.19", "", { "os": "linux", "cpu": "none" }, "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.17.19", "", { "os": "linux", "cpu": "s390x" }, "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.17.19", "", { "os": "linux", "cpu": "x64" }, "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw=="], + + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.10", "", { "os": "none", "cpu": "arm64" }, "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.17.19", "", { "os": "none", "cpu": "x64" }, "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q=="], + + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.10", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.17.19", "", { "os": "openbsd", "cpu": "x64" }, "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g=="], + + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.10", "", { "os": "none", "cpu": "arm64" }, "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.17.19", "", { "os": "sunos", "cpu": "x64" }, "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.17.19", "", { "os": "win32", "cpu": "arm64" }, "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.17.19", "", { "os": "win32", "cpu": "ia32" }, "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.17.19", "", { "os": "win32", "cpu": "x64" }, "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA=="], + + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" } }, "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g=="], + + "@eslint-community/regexpp": ["@eslint-community/regexpp@4.10.0", "", {}, "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA=="], + + "@eslint/config-array": ["@eslint/config-array@0.21.0", "", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ=="], + + "@eslint/config-helpers": ["@eslint/config-helpers@0.4.0", "", { "dependencies": { "@eslint/core": "^0.16.0" } }, "sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog=="], + + "@eslint/core": ["@eslint/core@0.16.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q=="], + + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="], + + "@eslint/js": ["@eslint/js@9.37.0", "", {}, "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg=="], + + "@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.0", "", { "dependencies": { "@eslint/core": "^0.16.0", "levn": "^0.4.1" } }, "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A=="], + + "@firebase/analytics": ["@firebase/analytics@0.10.0", "", { "dependencies": { "@firebase/component": "0.6.4", "@firebase/installations": "0.6.4", "@firebase/logger": "0.4.0", "@firebase/util": "1.9.3", "tslib": "^2.1.0" } }, "sha512-Locv8gAqx0e+GX/0SI3dzmBY5e9kjVDtD+3zCFLJ0tH2hJwuCAiL+5WkHuxKj92rqQj/rvkBUCfA1ewlX2hehg=="], + + "@firebase/analytics-compat": ["@firebase/analytics-compat@0.2.6", "", { "dependencies": { "@firebase/analytics": "0.10.0", "@firebase/analytics-types": "0.8.0", "@firebase/component": "0.6.4", "@firebase/util": "1.9.3", "tslib": "^2.1.0" } }, "sha512-4MqpVLFkGK7NJf/5wPEEP7ePBJatwYpyjgJ+wQHQGHfzaCDgntOnl9rL2vbVGGKCnRqWtZDIWhctB86UWXaX2Q=="], + + "@firebase/analytics-types": ["@firebase/analytics-types@0.8.0", "", {}, "sha512-iRP+QKI2+oz3UAh4nPEq14CsEjrjD6a5+fuypjScisAh9kXKFvdJOZJDwk7kikLvWVLGEs9+kIUS4LPQV7VZVw=="], + + "@firebase/app": ["@firebase/app@0.9.13", "", { "dependencies": { "@firebase/component": "0.6.4", "@firebase/logger": "0.4.0", "@firebase/util": "1.9.3", "idb": "7.1.1", "tslib": "^2.1.0" } }, "sha512-GfiI1JxJ7ecluEmDjPzseRXk/PX31hS7+tjgBopL7XjB2hLUdR+0FTMXy2Q3/hXezypDvU6or7gVFizDESrkXw=="], + + "@firebase/app-check": ["@firebase/app-check@0.8.0", "", { "dependencies": { "@firebase/component": "0.6.4", "@firebase/logger": "0.4.0", "@firebase/util": "1.9.3", "tslib": "^2.1.0" } }, "sha512-dRDnhkcaC2FspMiRK/Vbp+PfsOAEP6ZElGm9iGFJ9fDqHoPs0HOPn7dwpJ51lCFi1+2/7n5pRPGhqF/F03I97g=="], + + "@firebase/app-check-compat": ["@firebase/app-check-compat@0.3.7", "", { "dependencies": { "@firebase/app-check": "0.8.0", "@firebase/app-check-types": "0.5.0", "@firebase/component": "0.6.4", "@firebase/logger": "0.4.0", "@firebase/util": "1.9.3", "tslib": "^2.1.0" } }, "sha512-cW682AxsyP1G+Z0/P7pO/WT2CzYlNxoNe5QejVarW2o5ZxeWSSPAiVEwpEpQR/bUlUmdeWThYTMvBWaopdBsqw=="], + + "@firebase/app-check-interop-types": ["@firebase/app-check-interop-types@0.3.0", "", {}, "sha512-xAxHPZPIgFXnI+vb4sbBjZcde7ZluzPPaSK7Lx3/nmuVk4TjZvnL8ONnkd4ERQKL8WePQySU+pRcWkh8rDf5Sg=="], + + "@firebase/app-check-types": ["@firebase/app-check-types@0.5.0", "", {}, "sha512-uwSUj32Mlubybw7tedRzR24RP8M8JUVR3NPiMk3/Z4bCmgEKTlQBwMXrehDAZ2wF+TsBq0SN1c6ema71U/JPyQ=="], + + "@firebase/app-compat": ["@firebase/app-compat@0.2.13", "", { "dependencies": { "@firebase/app": "0.9.13", "@firebase/component": "0.6.4", "@firebase/logger": "0.4.0", "@firebase/util": "1.9.3", "tslib": "^2.1.0" } }, "sha512-j6ANZaWjeVy5zg6X7uiqh6lM6o3n3LD1+/SJFNs9V781xyryyZWXe+tmnWNWPkP086QfJoNkWN9pMQRqSG4vMg=="], + + "@firebase/app-types": ["@firebase/app-types@0.9.0", "", {}, "sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q=="], + + "@firebase/auth": ["@firebase/auth@0.23.2", "", { "dependencies": { "@firebase/component": "0.6.4", "@firebase/logger": "0.4.0", "@firebase/util": "1.9.3", "node-fetch": "2.6.7", "tslib": "^2.1.0" } }, "sha512-dM9iJ0R6tI1JczuGSxXmQbXAgtYie0K4WvKcuyuSTCu9V8eEDiz4tfa1sO3txsfvwg7nOY3AjoCyMYEdqZ8hdg=="], + + "@firebase/auth-compat": ["@firebase/auth-compat@0.4.2", "", { "dependencies": { "@firebase/auth": "0.23.2", "@firebase/auth-types": "0.12.0", "@firebase/component": "0.6.4", "@firebase/util": "1.9.3", "node-fetch": "2.6.7", "tslib": "^2.1.0" } }, "sha512-Q30e77DWXFmXEt5dg5JbqEDpjw9y3/PcP9LslDPR7fARmAOTIY9MM6HXzm9KC+dlrKH/+p6l8g9ifJiam9mc4A=="], + + "@firebase/auth-interop-types": ["@firebase/auth-interop-types@0.2.1", "", {}, "sha512-VOaGzKp65MY6P5FI84TfYKBXEPi6LmOCSMMzys6o2BN2LOsqy7pCuZCup7NYnfbk5OkkQKzvIfHOzTm0UDpkyg=="], + + "@firebase/auth-types": ["@firebase/auth-types@0.12.0", "", {}, "sha512-pPwaZt+SPOshK8xNoiQlK5XIrS97kFYc3Rc7xmy373QsOJ9MmqXxLaYssP5Kcds4wd2qK//amx/c+A8O2fVeZA=="], + + "@firebase/component": ["@firebase/component@0.6.4", "", { "dependencies": { "@firebase/util": "1.9.3", "tslib": "^2.1.0" } }, "sha512-rLMyrXuO9jcAUCaQXCMjCMUsWrba5fzHlNK24xz5j2W6A/SRmK8mZJ/hn7V0fViLbxC0lPMtrK1eYzk6Fg03jA=="], + + "@firebase/database": ["@firebase/database@0.14.4", "", { "dependencies": { "@firebase/auth-interop-types": "0.2.1", "@firebase/component": "0.6.4", "@firebase/logger": "0.4.0", "@firebase/util": "1.9.3", "faye-websocket": "0.11.4", "tslib": "^2.1.0" } }, "sha512-+Ea/IKGwh42jwdjCyzTmeZeLM3oy1h0mFPsTy6OqCWzcu/KFqRAr5Tt1HRCOBlNOdbh84JPZC47WLU18n2VbxQ=="], + + "@firebase/database-compat": ["@firebase/database-compat@0.3.4", "", { "dependencies": { "@firebase/component": "0.6.4", "@firebase/database": "0.14.4", "@firebase/database-types": "0.10.4", "@firebase/logger": "0.4.0", "@firebase/util": "1.9.3", "tslib": "^2.1.0" } }, "sha512-kuAW+l+sLMUKBThnvxvUZ+Q1ZrF/vFJ58iUY9kAcbX48U03nVzIF6Tmkf0p3WVQwMqiXguSgtOPIB6ZCeF+5Gg=="], + + "@firebase/database-types": ["@firebase/database-types@0.10.4", "", { "dependencies": { "@firebase/app-types": "0.9.0", "@firebase/util": "1.9.3" } }, "sha512-dPySn0vJ/89ZeBac70T+2tWWPiJXWbmRygYv0smT5TfE3hDrQ09eKMF3Y+vMlTdrMWq7mUdYW5REWPSGH4kAZQ=="], + + "@firebase/firestore": ["@firebase/firestore@3.13.0", "", { "dependencies": { "@firebase/component": "0.6.4", "@firebase/logger": "0.4.0", "@firebase/util": "1.9.3", "@firebase/webchannel-wrapper": "0.10.1", "@grpc/grpc-js": "~1.7.0", "@grpc/proto-loader": "^0.6.13", "node-fetch": "2.6.7", "tslib": "^2.1.0" } }, "sha512-NwcnU+madJXQ4fbLkGx1bWvL612IJN/qO6bZ6dlPmyf7QRyu5azUosijdAN675r+bOOJxMtP1Bv981bHBXAbUg=="], + + "@firebase/firestore-compat": ["@firebase/firestore-compat@0.3.12", "", { "dependencies": { "@firebase/component": "0.6.4", "@firebase/firestore": "3.13.0", "@firebase/firestore-types": "2.5.1", "@firebase/util": "1.9.3", "tslib": "^2.1.0" } }, "sha512-mazuNGAx5Kt9Nph0pm6ULJFp/+j7GSsx+Ncw1GrnKl+ft1CQ4q2LcUssXnjqkX2Ry0fNGqUzC1mfIUrk9bYtjQ=="], + + "@firebase/firestore-types": ["@firebase/firestore-types@2.5.1", "", {}, "sha512-xG0CA6EMfYo8YeUxC8FeDzf6W3FX1cLlcAGBYV6Cku12sZRI81oWcu61RSKM66K6kUENP+78Qm8mvroBcm1whw=="], + + "@firebase/functions": ["@firebase/functions@0.10.0", "", { "dependencies": { "@firebase/app-check-interop-types": "0.3.0", "@firebase/auth-interop-types": "0.2.1", "@firebase/component": "0.6.4", "@firebase/messaging-interop-types": "0.2.0", "@firebase/util": "1.9.3", "node-fetch": "2.6.7", "tslib": "^2.1.0" } }, "sha512-2U+fMNxTYhtwSpkkR6WbBcuNMOVaI7MaH3cZ6UAeNfj7AgEwHwMIFLPpC13YNZhno219F0lfxzTAA0N62ndWzA=="], + + "@firebase/functions-compat": ["@firebase/functions-compat@0.3.5", "", { "dependencies": { "@firebase/component": "0.6.4", "@firebase/functions": "0.10.0", "@firebase/functions-types": "0.6.0", "@firebase/util": "1.9.3", "tslib": "^2.1.0" } }, "sha512-uD4jwgwVqdWf6uc3NRKF8cSZ0JwGqSlyhPgackyUPe+GAtnERpS4+Vr66g0b3Gge0ezG4iyHo/EXW/Hjx7QhHw=="], + + "@firebase/functions-types": ["@firebase/functions-types@0.6.0", "", {}, "sha512-hfEw5VJtgWXIRf92ImLkgENqpL6IWpYaXVYiRkFY1jJ9+6tIhWM7IzzwbevwIIud/jaxKVdRzD7QBWfPmkwCYw=="], + + "@firebase/installations": ["@firebase/installations@0.6.4", "", { "dependencies": { "@firebase/component": "0.6.4", "@firebase/util": "1.9.3", "idb": "7.0.1", "tslib": "^2.1.0" } }, "sha512-u5y88rtsp7NYkCHC3ElbFBrPtieUybZluXyzl7+4BsIz4sqb4vSAuwHEUgCgCeaQhvsnxDEU6icly8U9zsJigA=="], + + "@firebase/installations-compat": ["@firebase/installations-compat@0.2.4", "", { "dependencies": { "@firebase/component": "0.6.4", "@firebase/installations": "0.6.4", "@firebase/installations-types": "0.5.0", "@firebase/util": "1.9.3", "tslib": "^2.1.0" } }, "sha512-LI9dYjp0aT9Njkn9U4JRrDqQ6KXeAmFbRC0E7jI7+hxl5YmRWysq5qgQl22hcWpTk+cm3es66d/apoDU/A9n6Q=="], + + "@firebase/installations-types": ["@firebase/installations-types@0.5.0", "", {}, "sha512-9DP+RGfzoI2jH7gY4SlzqvZ+hr7gYzPODrbzVD82Y12kScZ6ZpRg/i3j6rleto8vTFC8n6Len4560FnV1w2IRg=="], + + "@firebase/logger": ["@firebase/logger@0.4.0", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-eRKSeykumZ5+cJPdxxJRgAC3G5NknY2GwEbKfymdnXtnT0Ucm4pspfR6GT4MUQEDuJwRVbVcSx85kgJulMoFFA=="], + + "@firebase/messaging": ["@firebase/messaging@0.12.4", "", { "dependencies": { "@firebase/component": "0.6.4", "@firebase/installations": "0.6.4", "@firebase/messaging-interop-types": "0.2.0", "@firebase/util": "1.9.3", "idb": "7.0.1", "tslib": "^2.1.0" } }, "sha512-6JLZct6zUaex4g7HI3QbzeUrg9xcnmDAPTWpkoMpd/GoSVWH98zDoWXMGrcvHeCAIsLpFMe4MPoZkJbrPhaASw=="], + + "@firebase/messaging-compat": ["@firebase/messaging-compat@0.2.4", "", { "dependencies": { "@firebase/component": "0.6.4", "@firebase/messaging": "0.12.4", "@firebase/util": "1.9.3", "tslib": "^2.1.0" } }, "sha512-lyFjeUhIsPRYDPNIkYX1LcZMpoVbBWXX4rPl7c/rqc7G+EUea7IEtSt4MxTvh6fDfPuzLn7+FZADfscC+tNMfg=="], + + "@firebase/messaging-interop-types": ["@firebase/messaging-interop-types@0.2.0", "", {}, "sha512-ujA8dcRuVeBixGR9CtegfpU4YmZf3Lt7QYkcj693FFannwNuZgfAYaTmbJ40dtjB81SAu6tbFPL9YLNT15KmOQ=="], + + "@firebase/performance": ["@firebase/performance@0.6.4", "", { "dependencies": { "@firebase/component": "0.6.4", "@firebase/installations": "0.6.4", "@firebase/logger": "0.4.0", "@firebase/util": "1.9.3", "tslib": "^2.1.0" } }, "sha512-HfTn/bd8mfy/61vEqaBelNiNnvAbUtME2S25A67Nb34zVuCSCRIX4SseXY6zBnOFj3oLisaEqhVcJmVPAej67g=="], + + "@firebase/performance-compat": ["@firebase/performance-compat@0.2.4", "", { "dependencies": { "@firebase/component": "0.6.4", "@firebase/logger": "0.4.0", "@firebase/performance": "0.6.4", "@firebase/performance-types": "0.2.0", "@firebase/util": "1.9.3", "tslib": "^2.1.0" } }, "sha512-nnHUb8uP9G8islzcld/k6Bg5RhX62VpbAb/Anj7IXs/hp32Eb2LqFPZK4sy3pKkBUO5wcrlRWQa6wKOxqlUqsg=="], + + "@firebase/performance-types": ["@firebase/performance-types@0.2.0", "", {}, "sha512-kYrbr8e/CYr1KLrLYZZt2noNnf+pRwDq2KK9Au9jHrBMnb0/C9X9yWSXmZkFt4UIdsQknBq8uBB7fsybZdOBTA=="], + + "@firebase/remote-config": ["@firebase/remote-config@0.4.4", "", { "dependencies": { "@firebase/component": "0.6.4", "@firebase/installations": "0.6.4", "@firebase/logger": "0.4.0", "@firebase/util": "1.9.3", "tslib": "^2.1.0" } }, "sha512-x1ioTHGX8ZwDSTOVp8PBLv2/wfwKzb4pxi0gFezS5GCJwbLlloUH4YYZHHS83IPxnua8b6l0IXUaWd0RgbWwzQ=="], + + "@firebase/remote-config-compat": ["@firebase/remote-config-compat@0.2.4", "", { "dependencies": { "@firebase/component": "0.6.4", "@firebase/logger": "0.4.0", "@firebase/remote-config": "0.4.4", "@firebase/remote-config-types": "0.3.0", "@firebase/util": "1.9.3", "tslib": "^2.1.0" } }, "sha512-FKiki53jZirrDFkBHglB3C07j5wBpitAaj8kLME6g8Mx+aq7u9P7qfmuSRytiOItADhWUj7O1JIv7n9q87SuwA=="], + + "@firebase/remote-config-types": ["@firebase/remote-config-types@0.3.0", "", {}, "sha512-RtEH4vdcbXZuZWRZbIRmQVBNsE7VDQpet2qFvq6vwKLBIQRQR5Kh58M4ok3A3US8Sr3rubYnaGqZSurCwI8uMA=="], + + "@firebase/storage": ["@firebase/storage@0.11.2", "", { "dependencies": { "@firebase/component": "0.6.4", "@firebase/util": "1.9.3", "node-fetch": "2.6.7", "tslib": "^2.1.0" } }, "sha512-CtvoFaBI4hGXlXbaCHf8humajkbXhs39Nbh6MbNxtwJiCqxPy9iH3D3CCfXAvP0QvAAwmJUTK3+z9a++Kc4nkA=="], + + "@firebase/storage-compat": ["@firebase/storage-compat@0.3.2", "", { "dependencies": { "@firebase/component": "0.6.4", "@firebase/storage": "0.11.2", "@firebase/storage-types": "0.8.0", "@firebase/util": "1.9.3", "tslib": "^2.1.0" } }, "sha512-wvsXlLa9DVOMQJckbDNhXKKxRNNewyUhhbXev3t8kSgoCotd1v3MmqhKKz93ePhDnhHnDs7bYHy+Qa8dRY6BXw=="], + + "@firebase/storage-types": ["@firebase/storage-types@0.8.0", "", {}, "sha512-isRHcGrTs9kITJC0AVehHfpraWFui39MPaU7Eo8QfWlqW7YPymBmRgjDrlOgFdURh6Cdeg07zmkLP5tzTKRSpg=="], + + "@firebase/util": ["@firebase/util@1.9.3", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-DY02CRhOZwpzO36fHpuVysz6JZrscPiBXD0fXp6qSrL9oNOx5KWICKdR95C0lSITzxp0TZosVyHqzatE8JbcjA=="], + + "@firebase/webchannel-wrapper": ["@firebase/webchannel-wrapper@0.10.1", "", {}, "sha512-Dq5rYfEpdeel0bLVN+nfD1VWmzCkK+pJbSjIawGE+RY4+NIJqhbUDDQjvV0NUK84fMfwxvtFoCtEe70HfZjFcw=="], + + "@grpc/grpc-js": ["@grpc/grpc-js@1.7.3", "", { "dependencies": { "@grpc/proto-loader": "^0.7.0", "@types/node": ">=12.12.47" } }, "sha512-H9l79u4kJ2PVSxUNA08HMYAnUBLj9v6KjYQ7SQ71hOZcEXhShE/y5iQCesP8+6/Ik/7i2O0a10bPquIcYfufog=="], + + "@grpc/proto-loader": ["@grpc/proto-loader@0.6.13", "", { "dependencies": { "@types/long": "^4.0.1", "lodash.camelcase": "^4.3.0", "long": "^4.0.0", "protobufjs": "^6.11.3", "yargs": "^16.2.0" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-FjxPYDRTn6Ec3V0arm1FtSpmP6V50wuph2yILpyvTKzjc76oDdoihXqM1DzOW5ubvCC8GivfCnNtfaRE8myJ7g=="], + + "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], + + "@humanfs/node": ["@humanfs/node@0.16.7", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ=="], + + "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], + + "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], + + "@isaacs/balanced-match": ["@isaacs/balanced-match@4.0.1", "", {}, "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ=="], + + "@isaacs/brace-expansion": ["@isaacs/brace-expansion@5.0.0", "", { "dependencies": { "@isaacs/balanced-match": "^4.0.1" } }, "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA=="], + + "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="], + + "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/set-array": ["@jridgewell/set-array@1.2.1", "", {}, "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], + + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + + "@novacbn/svelte-codejar": ["@novacbn/svelte-codejar@0.1.2", "", { "dependencies": { "codejar": "^3.5.0", "svelte": "^3.42.3" } }, "sha512-lZd6r+dbdU+zN8d4QW005QEmTT6WDKjpTXvbPIcqIWGSnbWBVoEMFPOwJ0C3PYM4hHAjb2GHF4DBywlWQogNLw=="], + + "@octokit/app": ["@octokit/app@16.1.0", "", { "dependencies": { "@octokit/auth-app": "^8.1.0", "@octokit/auth-unauthenticated": "^7.0.1", "@octokit/core": "^7.0.2", "@octokit/oauth-app": "^8.0.1", "@octokit/plugin-paginate-rest": "^13.0.0", "@octokit/types": "^14.0.0", "@octokit/webhooks": "^14.0.0" } }, "sha512-OdKHnm0CYLk8Setr47CATT4YnRTvWkpTYvE+B/l2B0mjszlfOIit3wqPHVslD2jfc1bD4UbO7Mzh6gjCuMZKsA=="], + + "@octokit/auth-app": ["@octokit/auth-app@8.1.0", "", { "dependencies": { "@octokit/auth-oauth-app": "^9.0.1", "@octokit/auth-oauth-user": "^6.0.0", "@octokit/request": "^10.0.2", "@octokit/request-error": "^7.0.0", "@octokit/types": "^14.0.0", "toad-cache": "^3.7.0", "universal-github-app-jwt": "^2.2.0", "universal-user-agent": "^7.0.0" } }, "sha512-6bWhyvLXqCSfHiqlwzn9pScLZ+Qnvh/681GR/UEEPCMIVwfpRDBw0cCzy3/t2Dq8B7W2X/8pBgmw6MOiyE0DXQ=="], + + "@octokit/auth-oauth-app": ["@octokit/auth-oauth-app@9.0.1", "", { "dependencies": { "@octokit/auth-oauth-device": "^8.0.1", "@octokit/auth-oauth-user": "^6.0.0", "@octokit/request": "^10.0.2", "@octokit/types": "^14.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-TthWzYxuHKLAbmxdFZwFlmwVyvynpyPmjwc+2/cI3cvbT7mHtsAW9b1LvQaNnAuWL+pFnqtxdmrU8QpF633i1g=="], + + "@octokit/auth-oauth-device": ["@octokit/auth-oauth-device@8.0.1", "", { "dependencies": { "@octokit/oauth-methods": "^6.0.0", "@octokit/request": "^10.0.2", "@octokit/types": "^14.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-TOqId/+am5yk9zor0RGibmlqn4V0h8vzjxlw/wYr3qzkQxl8aBPur384D1EyHtqvfz0syeXji4OUvKkHvxk/Gw=="], + + "@octokit/auth-oauth-user": ["@octokit/auth-oauth-user@6.0.0", "", { "dependencies": { "@octokit/auth-oauth-device": "^8.0.1", "@octokit/oauth-methods": "^6.0.0", "@octokit/request": "^10.0.2", "@octokit/types": "^14.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-GV9IW134PHsLhtUad21WIeP9mlJ+QNpFd6V9vuPWmaiN25HEJeEQUcS4y5oRuqCm9iWDLtfIs+9K8uczBXKr6A=="], + + "@octokit/auth-token": ["@octokit/auth-token@6.0.0", "", {}, "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w=="], + + "@octokit/auth-unauthenticated": ["@octokit/auth-unauthenticated@7.0.1", "", { "dependencies": { "@octokit/request-error": "^7.0.0", "@octokit/types": "^14.0.0" } }, "sha512-qVq1vdjLLZdE8kH2vDycNNjuJRCD1q2oet1nA/GXWaYlpDxlR7rdVhX/K/oszXslXiQIiqrQf+rdhDlA99JdTQ=="], + + "@octokit/core": ["@octokit/core@7.0.4", "", { "dependencies": { "@octokit/auth-token": "^6.0.0", "@octokit/graphql": "^9.0.1", "@octokit/request": "^10.0.2", "@octokit/request-error": "^7.0.0", "@octokit/types": "^15.0.0", "before-after-hook": "^4.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-jOT8V1Ba5BdC79sKrRWDdMT5l1R+XNHTPR6CPWzUP2EcfAcvIHZWF0eAbmRcpOOP5gVIwnqNg0C4nvh6Abc3OA=="], + + "@octokit/endpoint": ["@octokit/endpoint@11.0.0", "", { "dependencies": { "@octokit/types": "^14.0.0", "universal-user-agent": "^7.0.2" } }, "sha512-hoYicJZaqISMAI3JfaDr1qMNi48OctWuOih1m80bkYow/ayPw6Jj52tqWJ6GEoFTk1gBqfanSoI1iY99Z5+ekQ=="], + + "@octokit/graphql": ["@octokit/graphql@9.0.1", "", { "dependencies": { "@octokit/request": "^10.0.2", "@octokit/types": "^14.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-j1nQNU1ZxNFx2ZtKmL4sMrs4egy5h65OMDmSbVyuCzjOcwsHq6EaYjOTGXPQxgfiN8dJ4CriYHk6zF050WEULg=="], + + "@octokit/oauth-app": ["@octokit/oauth-app@8.0.1", "", { "dependencies": { "@octokit/auth-oauth-app": "^9.0.1", "@octokit/auth-oauth-user": "^6.0.0", "@octokit/auth-unauthenticated": "^7.0.1", "@octokit/core": "^7.0.2", "@octokit/oauth-authorization-url": "^8.0.0", "@octokit/oauth-methods": "^6.0.0", "@types/aws-lambda": "^8.10.83", "universal-user-agent": "^7.0.0" } }, "sha512-QnhMYEQpnYbEPn9cae+wXL2LuPMFglmfeuDJXXsyxIXdoORwkLK8y0cHhd/5du9MbO/zdG/BXixzB7EEwU63eQ=="], + + "@octokit/oauth-authorization-url": ["@octokit/oauth-authorization-url@8.0.0", "", {}, "sha512-7QoLPRh/ssEA/HuHBHdVdSgF8xNLz/Bc5m9fZkArJE5bb6NmVkDm3anKxXPmN1zh6b5WKZPRr3697xKT/yM3qQ=="], + + "@octokit/oauth-methods": ["@octokit/oauth-methods@6.0.0", "", { "dependencies": { "@octokit/oauth-authorization-url": "^8.0.0", "@octokit/request": "^10.0.2", "@octokit/request-error": "^7.0.0", "@octokit/types": "^14.0.0" } }, "sha512-Q8nFIagNLIZgM2odAraelMcDssapc+lF+y3OlcIPxyAU+knefO8KmozGqfnma1xegRDP4z5M73ABsamn72bOcA=="], + + "@octokit/openapi-types": ["@octokit/openapi-types@25.1.0", "", {}, "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA=="], + + "@octokit/openapi-webhooks-types": ["@octokit/openapi-webhooks-types@12.0.3", "", {}, "sha512-90MF5LVHjBedwoHyJsgmaFhEN1uzXyBDRLEBe7jlTYx/fEhPAk3P3DAJsfZwC54m8hAIryosJOL+UuZHB3K3yA=="], + + "@octokit/plugin-paginate-graphql": ["@octokit/plugin-paginate-graphql@6.0.0", "", {}, "sha512-crfpnIoFiBtRkvPqOyLOsw12XsveYuY2ieP6uYDosoUegBJpSVxGwut9sxUgFFcll3VTOTqpUf8yGd8x1OmAkQ=="], + + "@octokit/plugin-paginate-rest": ["@octokit/plugin-paginate-rest@13.1.1", "", { "dependencies": { "@octokit/types": "^14.1.0" } }, "sha512-q9iQGlZlxAVNRN2jDNskJW/Cafy7/XE52wjZ5TTvyhyOD904Cvx//DNyoO3J/MXJ0ve3rPoNWKEg5iZrisQSuw=="], + + "@octokit/plugin-rest-endpoint-methods": ["@octokit/plugin-rest-endpoint-methods@16.1.0", "", { "dependencies": { "@octokit/types": "^15.0.0" } }, "sha512-nCsyiKoGRnhH5LkH8hJEZb9swpqOcsW+VXv1QoyUNQXJeVODG4+xM6UICEqyqe9XFr6LkL8BIiFCPev8zMDXPw=="], + + "@octokit/plugin-retry": ["@octokit/plugin-retry@8.0.1", "", { "dependencies": { "@octokit/request-error": "^7.0.0", "@octokit/types": "^14.0.0", "bottleneck": "^2.15.3" } }, "sha512-KUoYR77BjF5O3zcwDQHRRZsUvJwepobeqiSSdCJ8lWt27FZExzb0GgVxrhhfuyF6z2B2zpO0hN5pteni1sqWiw=="], + + "@octokit/plugin-throttling": ["@octokit/plugin-throttling@11.0.1", "", { "dependencies": { "@octokit/types": "^14.0.0", "bottleneck": "^2.15.3" } }, "sha512-S+EVhy52D/272L7up58dr3FNSMXWuNZolkL4zMJBNIfIxyZuUcczsQAU4b5w6dewJXnKYVgSHSV5wxitMSW1kw=="], + + "@octokit/request": ["@octokit/request@10.0.3", "", { "dependencies": { "@octokit/endpoint": "^11.0.0", "@octokit/request-error": "^7.0.0", "@octokit/types": "^14.0.0", "fast-content-type-parse": "^3.0.0", "universal-user-agent": "^7.0.2" } }, "sha512-V6jhKokg35vk098iBqp2FBKunk3kMTXlmq+PtbV9Gl3TfskWlebSofU9uunVKhUN7xl+0+i5vt0TGTG8/p/7HA=="], + + "@octokit/request-error": ["@octokit/request-error@7.0.0", "", { "dependencies": { "@octokit/types": "^14.0.0" } }, "sha512-KRA7VTGdVyJlh0cP5Tf94hTiYVVqmt2f3I6mnimmaVz4UG3gQV/k4mDJlJv3X67iX6rmN7gSHCF8ssqeMnmhZg=="], + + "@octokit/types": ["@octokit/types@14.1.0", "", { "dependencies": { "@octokit/openapi-types": "^25.1.0" } }, "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g=="], + + "@octokit/webhooks": ["@octokit/webhooks@14.1.3", "", { "dependencies": { "@octokit/openapi-webhooks-types": "12.0.3", "@octokit/request-error": "^7.0.0", "@octokit/webhooks-methods": "^6.0.0" } }, "sha512-gcK4FNaROM9NjA0mvyfXl0KPusk7a1BeA8ITlYEZVQCXF5gcETTd4yhAU0Kjzd8mXwYHppzJBWgdBVpIR9wUcQ=="], + + "@octokit/webhooks-methods": ["@octokit/webhooks-methods@6.0.0", "", {}, "sha512-MFlzzoDJVw/GcbfzVC1RLR36QqkTLUf79vLVO3D+xn7r0QgxnFoLZgtrzxiQErAjFUOdH6fas2KeQJ1yr/qaXQ=="], + + "@polka/url": ["@polka/url@1.0.0-next.25", "", {}, "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ=="], + + "@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="], + + "@protobufjs/base64": ["@protobufjs/base64@1.1.2", "", {}, "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="], + + "@protobufjs/codegen": ["@protobufjs/codegen@2.0.4", "", {}, "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="], + + "@protobufjs/eventemitter": ["@protobufjs/eventemitter@1.1.0", "", {}, "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="], + + "@protobufjs/fetch": ["@protobufjs/fetch@1.1.0", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" } }, "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ=="], + + "@protobufjs/float": ["@protobufjs/float@1.0.2", "", {}, "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="], + + "@protobufjs/inquire": ["@protobufjs/inquire@1.1.0", "", {}, "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="], + + "@protobufjs/path": ["@protobufjs/path@1.1.2", "", {}, "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="], + + "@protobufjs/pool": ["@protobufjs/pool@1.1.0", "", {}, "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="], + + "@protobufjs/utf8": ["@protobufjs/utf8@1.1.0", "", {}, "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="], + + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.52.4", "", { "os": "android", "cpu": "arm" }, "sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.52.4", "", { "os": "android", "cpu": "arm64" }, "sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w=="], + + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.52.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg=="], + + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.52.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw=="], + + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.52.4", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ=="], + + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.52.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw=="], + + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.52.4", "", { "os": "linux", "cpu": "arm" }, "sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ=="], + + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.52.4", "", { "os": "linux", "cpu": "arm" }, "sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q=="], + + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.52.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg=="], + + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.52.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g=="], + + "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.52.4", "", { "os": "linux", "cpu": "none" }, "sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ=="], + + "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.52.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g=="], + + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.52.4", "", { "os": "linux", "cpu": "none" }, "sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg=="], + + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.52.4", "", { "os": "linux", "cpu": "none" }, "sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA=="], + + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.52.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA=="], + + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.52.4", "", { "os": "linux", "cpu": "x64" }, "sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg=="], + + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.52.4", "", { "os": "linux", "cpu": "x64" }, "sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw=="], + + "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.52.4", "", { "os": "none", "cpu": "arm64" }, "sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA=="], + + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.52.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ=="], + + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.52.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw=="], + + "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.52.4", "", { "os": "win32", "cpu": "x64" }, "sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.52.4", "", { "os": "win32", "cpu": "x64" }, "sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w=="], + + "@sindresorhus/is": ["@sindresorhus/is@4.6.0", "", {}, "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw=="], + + "@sveltejs/acorn-typescript": ["@sveltejs/acorn-typescript@1.0.9", "", {}, "sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA=="], + + "@szmarczak/http-timer": ["@szmarczak/http-timer@4.0.6", "", { "dependencies": { "defer-to-connect": "^2.0.0" } }, "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w=="], + + "@types/aws-lambda": ["@types/aws-lambda@8.10.152", "", {}, "sha512-soT/c2gYBnT5ygwiHPmd9a1bftj462NWVk2tKCc1PYHSIacB2UwbTS2zYG4jzag1mRDuzg/OjtxQjQ2NKRB6Rw=="], + + "@types/cacheable-request": ["@types/cacheable-request@6.0.3", "", { "dependencies": { "@types/http-cache-semantics": "*", "@types/keyv": "^3.1.4", "@types/node": "*", "@types/responselike": "^1.0.0" } }, "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw=="], + + "@types/chai": ["@types/chai@5.2.2", "", { "dependencies": { "@types/deep-eql": "*" } }, "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg=="], + + "@types/decompress": ["@types/decompress@4.2.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-9z+8yjKr5Wn73Pt17/ldnmQToaFHZxK0N1GHysuk/JIPT8RIdQeoInM01wWPgypRcvb6VH1drjuFpQ4zmY437g=="], + + "@types/deep-eql": ["@types/deep-eql@4.0.2", "", {}, "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw=="], + + "@types/dompurify": ["@types/dompurify@3.0.5", "", { "dependencies": { "@types/trusted-types": "*" } }, "sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg=="], + + "@types/download": ["@types/download@8.0.5", "", { "dependencies": { "@types/decompress": "*", "@types/got": "^9", "@types/node": "*" } }, "sha512-Ad68goc/BsL3atP3OP/lWKAKhiC6FduN1mC5yg9lZuGYmUY7vyoWBcXgt8GE9OzVWRq5IBXwm4o/QiE+gipZAg=="], + + "@types/eslint": ["@types/eslint@8.56.10", "", { "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ=="], + + "@types/estree": ["@types/estree@1.0.5", "", {}, "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw=="], + + "@types/got": ["@types/got@9.6.12", "", { "dependencies": { "@types/node": "*", "@types/tough-cookie": "*", "form-data": "^2.5.0" } }, "sha512-X4pj/HGHbXVLqTpKjA2ahI4rV/nNBc9mGO2I/0CgAra+F2dKgMXnENv2SRpemScBzBAI4vMelIVYViQxlSE6xA=="], + + "@types/http-cache-semantics": ["@types/http-cache-semantics@4.0.4", "", {}, "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA=="], + + "@types/jquery": ["@types/jquery@3.5.34", "", { "dependencies": { "@types/sizzle": "*" } }, "sha512-3m3939S3erqmTLJANS/uy0B6V7BorKx7RorcGZVjZ62dF5PAGbKEDZK1CuLtKombJkFA2T1jl8LAIIs7IV6gBQ=="], + + "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], + + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + + "@types/keyv": ["@types/keyv@3.1.4", "", { "dependencies": { "@types/node": "*" } }, "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg=="], + + "@types/long": ["@types/long@4.0.2", "", {}, "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA=="], + + "@types/node": ["@types/node@17.0.45", "", {}, "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw=="], + + "@types/prismjs": ["@types/prismjs@1.26.4", "", {}, "sha512-rlAnzkW2sZOjbqZ743IHUhFcvzaGbqijwOu8QZnZCjfQzBqFE3s4lOTJEsxikImav9uzz/42I+O7YUs1mWgMlg=="], + + "@types/responselike": ["@types/responselike@1.0.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw=="], + + "@types/semver": ["@types/semver@7.5.8", "", {}, "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ=="], + + "@types/sizzle": ["@types/sizzle@2.3.8", "", {}, "sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg=="], + + "@types/three": ["@types/three@0.129.2", "", {}, "sha512-fZDNRtUFnq3baNjDiAzi4QoHYcczWtEdsduH/tpiwk91fbVk8COJiT/iLoN3tIOjLKMySoYsjUfP0VTmUfZKLw=="], + + "@types/tinycolor2": ["@types/tinycolor2@1.4.6", "", {}, "sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw=="], + + "@types/tough-cookie": ["@types/tough-cookie@4.0.5", "", {}, "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA=="], + + "@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="], + + "@types/websocket": ["@types/websocket@1.0.10", "", { "dependencies": { "@types/node": "*" } }, "sha512-svjGZvPB7EzuYS94cI7a+qhwgGU1y89wUgjT6E2wVUfmAGIvRfT7obBvRtnhXCSsoMdlG4gBFGE7MfkIXZLoww=="], + + "@types/yauzl": ["@types/yauzl@2.10.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q=="], + + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@5.62.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.4.0", "@typescript-eslint/scope-manager": "5.62.0", "@typescript-eslint/type-utils": "5.62.0", "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", "semver": "^7.3.7", "tsutils": "^3.21.0" } }, "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag=="], + + "@typescript-eslint/parser": ["@typescript-eslint/parser@5.62.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "5.62.0", "@typescript-eslint/types": "5.62.0", "@typescript-eslint/typescript-estree": "5.62.0", "debug": "^4.3.4" } }, "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA=="], + + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.45.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.45.0", "@typescript-eslint/types": "^8.45.0", "debug": "^4.3.4" } }, "sha512-3pcVHwMG/iA8afdGLMuTibGR7pDsn9RjDev6CCB+naRsSYs2pns5QbinF4Xqw6YC/Sj3lMrm/Im0eMfaa61WUg=="], + + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@5.62.0", "", { "dependencies": { "@typescript-eslint/types": "5.62.0", "@typescript-eslint/visitor-keys": "5.62.0" } }, "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w=="], + + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.45.0", "", {}, "sha512-aFdr+c37sc+jqNMGhH+ajxPXwjv9UtFZk79k8pLoJ6p4y0snmYpPA52GuWHgt2ZF4gRRW6odsEj41uZLojDt5w=="], + + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@5.62.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "5.62.0", "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew=="], + + "@typescript-eslint/types": ["@typescript-eslint/types@5.62.0", "", {}, "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ=="], + + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@5.62.0", "", { "dependencies": { "@typescript-eslint/types": "5.62.0", "@typescript-eslint/visitor-keys": "5.62.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "semver": "^7.3.7", "tsutils": "^3.21.0" } }, "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA=="], + + "@typescript-eslint/utils": ["@typescript-eslint/utils@5.62.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", "@typescript-eslint/scope-manager": "5.62.0", "@typescript-eslint/types": "5.62.0", "@typescript-eslint/typescript-estree": "5.62.0", "eslint-scope": "^5.1.1", "semver": "^7.3.7" } }, "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ=="], + + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@5.62.0", "", { "dependencies": { "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" } }, "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw=="], + + "@vitest/expect": ["@vitest/expect@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" } }, "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig=="], + + "@vitest/mocker": ["@vitest/mocker@3.2.4", "", { "dependencies": { "@vitest/spy": "3.2.4", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" } }, "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ=="], + + "@vitest/pretty-format": ["@vitest/pretty-format@3.2.4", "", { "dependencies": { "tinyrainbow": "^2.0.0" } }, "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA=="], + + "@vitest/runner": ["@vitest/runner@3.2.4", "", { "dependencies": { "@vitest/utils": "3.2.4", "pathe": "^2.0.3", "strip-literal": "^3.0.0" } }, "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ=="], + + "@vitest/snapshot": ["@vitest/snapshot@3.2.4", "", { "dependencies": { "@vitest/pretty-format": "3.2.4", "magic-string": "^0.30.17", "pathe": "^2.0.3" } }, "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ=="], + + "@vitest/spy": ["@vitest/spy@3.2.4", "", { "dependencies": { "tinyspy": "^4.0.3" } }, "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw=="], + + "@vitest/utils": ["@vitest/utils@3.2.4", "", { "dependencies": { "@vitest/pretty-format": "3.2.4", "loupe": "^3.1.4", "tinyrainbow": "^2.0.0" } }, "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA=="], + + "@vue/compiler-sfc": ["@vue/compiler-sfc@2.7.14", "", { "dependencies": { "@babel/parser": "^7.18.4", "postcss": "^8.4.14", "source-map": "^0.6.1" } }, "sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA=="], + + "acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="], + + "acorn-jsx": ["acorn-jsx@5.3.2", "", {}, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + + "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + + "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "aria-query": ["aria-query@5.3.1", "", {}, "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g=="], + + "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="], + + "assertion-error": ["assertion-error@2.0.1", "", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="], + + "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], + + "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "before-after-hook": ["before-after-hook@4.0.0", "", {}, "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ=="], + + "blockbench-patch-manager": ["blockbench-patch-manager@1.0.2", "", { "dependencies": { "blockbench-types": "^5.0.6", "simple-subpub": "^1.2.0", "svelte": "^5.46.3", "svelte-observable-store": "^1.0.1", "svelte-preprocess": "^6.0.3", "svelte-preprocess-esbuild": "^3.0.1" }, "peerDependencies": { "typescript": "^5" } }, "sha512-u72CF1AyqWaIMHYqnhhYQjf1SbAtJAhJLKkPu9j+n2dGBLZYNmMTZRqHGCRPZl7ZEHWwuX0mUuP1Gq2B8rmUfg=="], + + "blockbench-types": ["blockbench-types@5.1.0", "", { "dependencies": { "@babel/types": "^7.20.7", "@types/dompurify": "^3.0.5", "@types/jquery": "^3.5.32", "@types/prismjs": "^1.26.0", "@types/three": "^0.129.2", "@types/tinycolor2": "^1.4.6", "dompurify": "^3.0.1", "electron": "^40.8.0", "prismjs": "^1.29.0", "tinycolor2": "^1.6.0", "typescript": "^5.8.3", "vue": "2.7.14", "wintersky": "^1.3.0" } }, "sha512-JLMHJZ+2J7aFQwSacfW4N/rvd56JRqvaBsHNH2R6sjyxkwKPuNPKYIeav/WtRXnq3dmlsEoH3rtg09s7yhe3sg=="], + + "book-and-quill": ["book-and-quill@1.0.8", "", { "dependencies": { "@types/node": "^25.3.3", "tinycolor2": "^1.6.0" }, "peerDependencies": { "typescript": "^5" } }, "sha512-lN6I+l/1fJ1OB4LM8wkm9jxOxBD+sgwoSRQjdfcsekwFcPRBC8TJckbgnp+mgvGGz/c14z7fkj6yhJh+opsy4Q=="], + + "boolean": ["boolean@3.2.0", "", {}, "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw=="], + + "bottleneck": ["bottleneck@2.19.5", "", {}, "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw=="], + + "brace": ["brace@0.11.1", "", {}, "sha512-Fc8Ne62jJlKHiG/ajlonC4Sd66Pq68fFwK4ihJGNZpGqboc324SQk+lRvMzpPRuJOmfrJefdG8/7JdWX4bzJ2Q=="], + + "brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], + + "braces": ["braces@3.0.2", "", { "dependencies": { "fill-range": "^7.0.1" } }, "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A=="], + + "buffer-crc32": ["buffer-crc32@0.2.13", "", {}, "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ=="], + + "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], + + "cacheable-lookup": ["cacheable-lookup@5.0.4", "", {}, "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA=="], + + "cacheable-request": ["cacheable-request@7.0.4", "", { "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", "http-cache-semantics": "^4.0.0", "keyv": "^4.0.0", "lowercase-keys": "^2.0.0", "normalize-url": "^6.0.1", "responselike": "^2.0.0" } }, "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg=="], + + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + + "chai": ["chai@5.3.3", "", { "dependencies": { "assertion-error": "^2.0.1", "check-error": "^2.1.1", "deep-eql": "^5.0.1", "loupe": "^3.1.0", "pathval": "^2.0.0" } }, "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw=="], + + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "charenc": ["charenc@0.0.2", "", {}, "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA=="], + + "check-error": ["check-error@2.1.1", "", {}, "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw=="], + + "cliui": ["cliui@7.0.4", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" } }, "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ=="], + + "clone-response": ["clone-response@1.0.3", "", { "dependencies": { "mimic-response": "^1.0.0" } }, "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA=="], + + "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], + + "code-red": ["code-red@1.0.4", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15", "@types/estree": "^1.0.1", "acorn": "^8.10.0", "estree-walker": "^3.0.3", "periscopic": "^3.1.0" } }, "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw=="], + + "codejar": ["codejar@3.7.0", "", {}, "sha512-rqyDu2zNwfu1EhXI++LEMQDzhykS+V0BV52RemtCj5lczgTgWSufyEa+tS7RP7qCXH/WXOkU0eIthmFUzvG78Q=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "colord": ["colord@2.9.3", "", {}, "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw=="], + + "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], + + "commondir": ["commondir@1.0.1", "", {}, "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "console-clear": ["console-clear@1.1.1", "", {}, "sha512-pMD+MVR538ipqkG5JXeOEbKWS5um1H4LUUccUQG68qpeqBYbzYy79Gh55jkd2TtPdRfUaLWdv6LPP//5Zt0aPQ=="], + + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "crypt": ["crypt@0.0.2", "", {}, "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow=="], + + "css-tree": ["css-tree@2.3.1", "", { "dependencies": { "mdn-data": "2.0.30", "source-map-js": "^1.0.1" } }, "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw=="], + + "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], + + "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], + + "debug": ["debug@4.3.4", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ=="], + + "decompress-response": ["decompress-response@6.0.0", "", { "dependencies": { "mimic-response": "^3.1.0" } }, "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="], + + "deep-eql": ["deep-eql@5.0.2", "", {}, "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q=="], + + "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], + + "deepslate": ["deepslate@0.19.2", "", { "dependencies": { "gl-matrix": "^3.3.0", "md5": "^2.3.0", "pako": "^2.0.3" } }, "sha512-sDOjpBXv5WBMmtsquJGNhOoZJKm4ra7pzzQP7FjNJHbZwoL+qlzrsfId4OU3C9WtfC6e0+2mcH+kd3KL5mjrSg=="], + + "defer-to-connect": ["defer-to-connect@2.0.1", "", {}, "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg=="], + + "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], + + "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], + + "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], + + "detect-node": ["detect-node@2.1.0", "", {}, "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g=="], + + "devalue": ["devalue@5.7.1", "", {}, "sha512-MUbZ586EgQqdRnC4yDrlod3BEdyvE4TapGYHMW2CiaW+KkkFmWEFqBUaLltEZCGi0iFXCEjRF0OjF0DV2QHjOA=="], + + "dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="], + + "dompurify": ["dompurify@3.1.3", "", {}, "sha512-5sOWYSNPaxz6o2MUPvtyxTTqR4D3L77pr5rUQoWgD5ROQtVIZQgJkXbo1DLlK3vj11YGw5+LnF4SYti4gZmwng=="], + + "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], + + "electron": ["electron@40.8.5", "", { "dependencies": { "@electron/get": "^2.0.0", "@types/node": "^24.9.0", "extract-zip": "^2.0.1" }, "bin": { "electron": "cli.js" } }, "sha512-pgTY/VPQKaiU4sTjfU96iyxCXrFm4htVPCMRT4b7q9ijNTRgtLmLvcmzp2G4e7xDrq9p7OLHSmu1rBKFf6Y1/A=="], + + "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "end-of-stream": ["end-of-stream@1.4.4", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q=="], + + "env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], + + "es-define-property": ["es-define-property@1.0.0", "", { "dependencies": { "get-intrinsic": "^1.2.4" } }, "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="], + + "es6-error": ["es6-error@4.1.1", "", {}, "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg=="], + + "esbuild": ["esbuild@0.17.19", "", { "optionalDependencies": { "@esbuild/android-arm": "0.17.19", "@esbuild/android-arm64": "0.17.19", "@esbuild/android-x64": "0.17.19", "@esbuild/darwin-arm64": "0.17.19", "@esbuild/darwin-x64": "0.17.19", "@esbuild/freebsd-arm64": "0.17.19", "@esbuild/freebsd-x64": "0.17.19", "@esbuild/linux-arm": "0.17.19", "@esbuild/linux-arm64": "0.17.19", "@esbuild/linux-ia32": "0.17.19", "@esbuild/linux-loong64": "0.17.19", "@esbuild/linux-mips64el": "0.17.19", "@esbuild/linux-ppc64": "0.17.19", "@esbuild/linux-riscv64": "0.17.19", "@esbuild/linux-s390x": "0.17.19", "@esbuild/linux-x64": "0.17.19", "@esbuild/netbsd-x64": "0.17.19", "@esbuild/openbsd-x64": "0.17.19", "@esbuild/sunos-x64": "0.17.19", "@esbuild/win32-arm64": "0.17.19", "@esbuild/win32-ia32": "0.17.19", "@esbuild/win32-x64": "0.17.19" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw=="], + + "esbuild-plugin-import-folder": ["esbuild-plugin-import-folder@1.0.1", "", { "dependencies": { "eslint": "^9.38.0" } }, "sha512-vT3o+n7erSczdhTXpoL1Kuh0LCpysiEnLTMJYTgEI5MF72Rm22bJeM5AmltADBE8BM3ebG0l4+1CsDdwXoUh/A=="], + + "esbuild-plugin-import-glob": ["esbuild-plugin-import-glob@0.1.1", "", { "dependencies": { "fast-glob": "^3.2.5" } }, "sha512-yAFH+9AoIcsQkODSx0KUPRv1FeJUN6Tef8vkPQMcuVkc2vXYneYKsHhOiFS/yIsg5bQ70HHtAlXVA1uTjgoJXg=="], + + "esbuild-plugin-inline-image": ["esbuild-plugin-inline-image@0.0.9", "", {}, "sha512-pw3ZgN2phh32Z7BpKrhRDtmI+iVCl+Gc0BLOT9croXg1MnMjRuN7aXhIQirhLeK39erkIwfFlhy6xieroBGc1Q=="], + + "esbuild-plugin-inline-worker": ["esbuild-plugin-inline-worker@0.1.1", "", { "dependencies": { "esbuild": "latest", "find-cache-dir": "^3.3.1" } }, "sha512-VmFqsQKxUlbM51C1y5bRiMeyc1x2yTdMXhKB6S//++g9aCBg8TfGsbKxl5ZDkCGquqLY+RmEk93TBNd0i35dPA=="], + + "esbuild-plugin-svelte": ["esbuild-plugin-svelte@0.1.1", "", {}, "sha512-/52fCH5sbztdFI7lsp+jyiiI7HuXlOW+ebXmiwAlwYYCXJ4gbBtVOHP2c2bG0cgb65fGCa2HL0I0gInQy19jtw=="], + + "escalade": ["escalade@3.1.2", "", {}, "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA=="], + + "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + + "eslint": ["eslint@9.37.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", "@eslint/config-helpers": "^0.4.0", "@eslint/core": "^0.16.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.37.0", "@eslint/plugin-kit": "^0.4.0", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" } }, "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig=="], + + "eslint-plugin-svelte": ["eslint-plugin-svelte@3.12.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.6.1", "@jridgewell/sourcemap-codec": "^1.5.0", "esutils": "^2.0.3", "globals": "^16.0.0", "known-css-properties": "^0.37.0", "postcss": "^8.4.49", "postcss-load-config": "^3.1.4", "postcss-safe-parser": "^7.0.0", "semver": "^7.6.3", "svelte-eslint-parser": "^1.3.0" } }, "sha512-hD7wPe+vrPgx3U2X2b/wyTMtWobm660PygMGKrWWYTc9lvtY8DpNFDaU2CJQn1szLjGbn/aJ3g8WiXuKakrEkw=="], + + "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], + + "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + + "esm-env": ["esm-env@1.2.2", "", {}, "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA=="], + + "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + + "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], + + "esrap": ["esrap@2.2.5", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } }, "sha512-/yLB1538mag+dn0wsePTe8C0rDIjUOaJpMs2McodSzmM2msWcZsBSdRtg6HOBt0A/r82BN+Md3pgwSc/uWt2Ig=="], + + "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], + + "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + + "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + + "expect-type": ["expect-type@1.2.2", "", {}, "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA=="], + + "extract-zip": ["extract-zip@2.0.1", "", { "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", "yauzl": "^2.10.0" }, "optionalDependencies": { "@types/yauzl": "^2.9.1" }, "bin": { "extract-zip": "cli.js" } }, "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg=="], + + "fast-content-type-parse": ["fast-content-type-parse@3.0.0", "", {}, "sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-glob": ["fast-glob@3.3.2", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" } }, "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow=="], + + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], + + "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], + + "fastq": ["fastq@1.17.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w=="], + + "faye-websocket": ["faye-websocket@0.11.4", "", { "dependencies": { "websocket-driver": ">=0.5.1" } }, "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g=="], + + "fd-slicer": ["fd-slicer@1.1.0", "", { "dependencies": { "pend": "~1.2.0" } }, "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g=="], + + "fdir": ["fdir@6.5.0", "", {}, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], + + "fflate": ["fflate@0.8.2", "", {}, "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A=="], + + "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], + + "fill-range": ["fill-range@7.0.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ=="], + + "find-cache-dir": ["find-cache-dir@3.3.2", "", { "dependencies": { "commondir": "^1.0.1", "make-dir": "^3.0.2", "pkg-dir": "^4.1.0" } }, "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig=="], + + "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], + + "firebase": ["firebase@9.23.0", "", { "dependencies": { "@firebase/analytics": "0.10.0", "@firebase/analytics-compat": "0.2.6", "@firebase/app": "0.9.13", "@firebase/app-check": "0.8.0", "@firebase/app-check-compat": "0.3.7", "@firebase/app-compat": "0.2.13", "@firebase/app-types": "0.9.0", "@firebase/auth": "0.23.2", "@firebase/auth-compat": "0.4.2", "@firebase/database": "0.14.4", "@firebase/database-compat": "0.3.4", "@firebase/firestore": "3.13.0", "@firebase/firestore-compat": "0.3.12", "@firebase/functions": "0.10.0", "@firebase/functions-compat": "0.3.5", "@firebase/installations": "0.6.4", "@firebase/installations-compat": "0.2.4", "@firebase/messaging": "0.12.4", "@firebase/messaging-compat": "0.2.4", "@firebase/performance": "0.6.4", "@firebase/performance-compat": "0.2.4", "@firebase/remote-config": "0.4.4", "@firebase/remote-config-compat": "0.2.4", "@firebase/storage": "0.11.2", "@firebase/storage-compat": "0.3.2", "@firebase/util": "1.9.3" } }, "sha512-/4lUVY0lUvBDIaeY1q6dUYhS8Sd18Qb9CgWkPZICUo9IXpJNCEagfNZXBBFCkMTTN5L5gx2Hjr27y21a9NzUcA=="], + + "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], + + "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], + + "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], + + "form-data": ["form-data@2.5.2", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", "mime-types": "^2.1.12", "safe-buffer": "^5.2.1" } }, "sha512-GgwY0PS7DbXqajuGf4OYlsrIu3zgxD6Vvql43IBhm6MahqA5SK/7mwhtNj2AdH2z35YR34ujJ7BN+3fFC3jP5Q=="], + + "fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "generic-stream": ["generic-stream@3.0.1", "", {}, "sha512-hO6I0xmqm1FlIu51S5DCZPliLRACckiKlvjx654tC3YB10y43I8szT5ZkLOsmnL+N/hVzbGhXzopnRl9prhNtg=="], + + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + + "get-intrinsic": ["get-intrinsic@1.2.4", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" } }, "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ=="], + + "get-port": ["get-port@3.2.0", "", {}, "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg=="], + + "get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="], + + "github-slugger": ["github-slugger@2.0.0", "", {}, "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="], + + "gl-matrix": ["gl-matrix@3.4.3", "", {}, "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA=="], + + "glob": ["glob@11.0.3", "", { "dependencies": { "foreground-child": "^3.3.1", "jackspeak": "^4.1.1", "minimatch": "^10.0.3", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^2.0.0" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA=="], + + "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + + "global-agent": ["global-agent@3.0.0", "", { "dependencies": { "boolean": "^3.0.1", "es6-error": "^4.1.1", "matcher": "^3.0.0", "roarr": "^2.15.3", "semver": "^7.3.2", "serialize-error": "^7.0.1" } }, "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q=="], + + "globals": ["globals@16.4.0", "", {}, "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw=="], + + "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], + + "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], + + "gopd": ["gopd@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.1.3" } }, "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA=="], + + "got": ["got@11.8.6", "", { "dependencies": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", "@types/cacheable-request": "^6.0.1", "@types/responselike": "^1.0.0", "cacheable-lookup": "^5.0.3", "cacheable-request": "^7.0.2", "decompress-response": "^6.0.0", "http2-wrapper": "^1.0.0-beta.5.2", "lowercase-keys": "^2.0.0", "p-cancelable": "^2.0.0", "responselike": "^2.0.0" } }, "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], + + "has-proto": ["has-proto@1.0.3", "", {}, "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q=="], + + "has-symbols": ["has-symbols@1.0.3", "", {}, "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "http-cache-semantics": ["http-cache-semantics@4.1.1", "", {}, "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ=="], + + "http-parser-js": ["http-parser-js@0.5.8", "", {}, "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q=="], + + "http2-wrapper": ["http2-wrapper@1.0.3", "", { "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.0.0" } }, "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg=="], + + "idb": ["idb@7.1.1", "", {}, "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ=="], + + "ignore": ["ignore@5.3.1", "", {}, "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw=="], + + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + + "is-buffer": ["is-buffer@1.1.6", "", {}, "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-reference": ["is-reference@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.6" } }, "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "jackspeak": ["jackspeak@4.1.1", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" } }, "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ=="], + + "jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="], + + "js-tokens": ["js-tokens@9.0.1", "", {}, "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ=="], + + "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], + + "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], + + "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], + + "json-stringify-safe": ["json-stringify-safe@5.0.1", "", {}, "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="], + + "jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], + + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], + + "kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="], + + "known-css-properties": ["known-css-properties@0.37.0", "", {}, "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ=="], + + "ky": ["ky@2.0.1", "", {}, "sha512-HJPEjEpQPZQ5M3G5eu90/LWZDwysCnvqcfbLvq9FUvfizBZRi58WEixswyyI32LOLcFQd43w7kcfgkCPFxDt/Q=="], + + "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], + + "lilconfig": ["lilconfig@2.1.0", "", {}, "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ=="], + + "local-access": ["local-access@1.1.0", "", {}, "sha512-XfegD5pyTAfb+GY6chk283Ox5z8WexG56OvM06RWLpAc/UHozO8X6xAxEkIitZOtsSMM1Yr3DkHgW5W+onLhCw=="], + + "locate-character": ["locate-character@3.0.0", "", {}, "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA=="], + + "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], + + "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="], + + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + + "long": ["long@4.0.0", "", {}, "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="], + + "loupe": ["loupe@3.2.1", "", {}, "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ=="], + + "lowercase-keys": ["lowercase-keys@2.0.0", "", {}, "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="], + + "lru-cache": ["lru-cache@11.2.2", "", {}, "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg=="], + + "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], + + "make-dir": ["make-dir@3.1.0", "", { "dependencies": { "semver": "^6.0.0" } }, "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw=="], + + "marked": ["marked@4.3.0", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A=="], + + "marked-gfm-heading-id": ["marked-gfm-heading-id@3.1.3", "", { "dependencies": { "github-slugger": "^2.0.0" } }, "sha512-A0cRU4PCueX/5m8VE4mT8uTQ36l3xMYRojz3Eqnk4BmUFZ0T+9Xhn2KvHcANP4qbhfOeuMrWJCTQbASIBR5xeg=="], + + "matcher": ["matcher@3.0.0", "", { "dependencies": { "escape-string-regexp": "^4.0.0" } }, "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng=="], + + "mc-build": ["mc-build@4.0.4", "", { "bin": { "mcb3": "dist/mcb.js", "mc-build": "dist/mcb.js", "mcb": "dist/mcb.js" } }, "sha512-3f+tAQLann/dYBBlHD6itL7A3OZrPOAqayMtqOvVTikBnzKtemdhTY2w4Nkv1CDrVqLwHZ8GVnbVawYV6ATIWQ=="], + + "md5": ["md5@2.3.0", "", { "dependencies": { "charenc": "0.0.2", "crypt": "0.0.2", "is-buffer": "~1.1.6" } }, "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g=="], + + "mdn-data": ["mdn-data@2.0.30", "", {}, "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA=="], + + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "micromatch": ["micromatch@4.0.5", "", { "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" } }, "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA=="], + + "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "mimic-response": ["mimic-response@3.1.0", "", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="], + + "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "molangjs": ["molangjs@1.6.4", "", {}, "sha512-Evi2MbMcfDFwcG4HVjsX4MAj+jc7itlp1Ncd+sQ+4jel7N1pADUJpiWEdg3d9IIK+0RQwJw7EE3GrM+ERWbcQA=="], + + "mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="], + + "mrmime": ["mrmime@1.0.1", "", {}, "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw=="], + + "ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="], + + "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + + "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], + + "natural-compare-lite": ["natural-compare-lite@1.4.0", "", {}, "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g=="], + + "node-fetch": ["node-fetch@2.6.7", "", { "dependencies": { "whatwg-url": "^5.0.0" } }, "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ=="], + + "node-modules-vscode-problems-patch": ["node-modules-vscode-problems-patch@1.0.9", "", { "dependencies": { "esbuild": "^0.25.0", "glob": "^11.0.1" }, "bin": { "node-modules-vscode-problems-patch": "dist/index.js" } }, "sha512-PYS8ozhWFbPvksJBIKbWrdrKOD2e+MZaxl75amn/oaVAzObgmGQeYnk4VT5tT/d5KHhWiuUwzWWSgbQ57GVMfA=="], + + "normalize-url": ["normalize-url@6.1.0", "", {}, "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A=="], + + "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], + + "octokit": ["octokit@5.0.3", "", { "dependencies": { "@octokit/app": "^16.0.1", "@octokit/core": "^7.0.2", "@octokit/oauth-app": "^8.0.1", "@octokit/plugin-paginate-graphql": "^6.0.0", "@octokit/plugin-paginate-rest": "^13.0.0", "@octokit/plugin-rest-endpoint-methods": "^16.0.0", "@octokit/plugin-retry": "^8.0.1", "@octokit/plugin-throttling": "^11.0.1", "@octokit/request-error": "^7.0.0", "@octokit/types": "^14.0.0", "@octokit/webhooks": "^14.0.0" } }, "sha512-+bwYsAIRmYv30NTmBysPIlgH23ekVDriB07oRxlPIAH5PI0yTMSxg5i5Xy0OetcnZw+nk/caD4szD7a9YZ3QyQ=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], + + "p-cancelable": ["p-cancelable@2.1.1", "", {}, "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg=="], + + "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + + "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], + + "p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="], + + "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], + + "pako": ["pako@2.1.0", "", {}, "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug=="], + + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-scurry": ["path-scurry@2.0.0", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg=="], + + "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], + + "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + + "pathval": ["pathval@2.0.0", "", {}, "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA=="], + + "pend": ["pend@1.2.0", "", {}, "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="], + + "periscopic": ["periscopic@3.1.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^3.0.0", "is-reference": "^3.0.0" } }, "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + + "pkg-dir": ["pkg-dir@4.2.0", "", { "dependencies": { "find-up": "^4.0.0" } }, "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ=="], + + "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], + + "postcss-load-config": ["postcss-load-config@3.1.4", "", { "dependencies": { "lilconfig": "^2.0.5", "yaml": "^1.10.2" } }, "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg=="], + + "postcss-safe-parser": ["postcss-safe-parser@7.0.1", "", {}, "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A=="], + + "postcss-scss": ["postcss-scss@4.0.9", "", {}, "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A=="], + + "postcss-selector-parser": ["postcss-selector-parser@7.1.0", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA=="], + + "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], + + "prettier": ["prettier@3.8.2", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-8c3mgTe0ASwWAJK+78dpviD+A8EqhndQPUBpNUIPt6+xWlIigCwfN01lWr9MAede4uqXGTEKeQWTvzb3vjia0Q=="], + + "prismjs": ["prismjs@1.29.0", "", {}, "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q=="], + + "progress": ["progress@2.0.3", "", {}, "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="], + + "protobufjs": ["protobufjs@6.11.4", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.4", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.0", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", "@types/long": "^4.0.1", "@types/node": ">=13.7.0", "long": "^4.0.0" }, "bin": { "pbjs": "bin/pbjs", "pbts": "bin/pbts" } }, "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw=="], + + "pump": ["pump@3.0.0", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww=="], + + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "quick-lru": ["quick-lru@5.1.1", "", {}, "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="], + + "request-progress": ["request-progress@3.0.0", "", { "dependencies": { "throttleit": "^1.0.0" } }, "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg=="], + + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + + "resolve-alpn": ["resolve-alpn@1.2.1", "", {}, "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="], + + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + + "responselike": ["responselike@2.0.1", "", { "dependencies": { "lowercase-keys": "^2.0.0" } }, "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw=="], + + "reusify": ["reusify@1.0.4", "", {}, "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="], + + "roarr": ["roarr@2.15.4", "", { "dependencies": { "boolean": "^3.0.1", "detect-node": "^2.0.4", "globalthis": "^1.0.1", "json-stringify-safe": "^5.0.1", "semver-compare": "^1.0.0", "sprintf-js": "^1.1.2" } }, "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A=="], + + "rollup": ["rollup@4.52.4", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.52.4", "@rollup/rollup-android-arm64": "4.52.4", "@rollup/rollup-darwin-arm64": "4.52.4", "@rollup/rollup-darwin-x64": "4.52.4", "@rollup/rollup-freebsd-arm64": "4.52.4", "@rollup/rollup-freebsd-x64": "4.52.4", "@rollup/rollup-linux-arm-gnueabihf": "4.52.4", "@rollup/rollup-linux-arm-musleabihf": "4.52.4", "@rollup/rollup-linux-arm64-gnu": "4.52.4", "@rollup/rollup-linux-arm64-musl": "4.52.4", "@rollup/rollup-linux-loong64-gnu": "4.52.4", "@rollup/rollup-linux-ppc64-gnu": "4.52.4", "@rollup/rollup-linux-riscv64-gnu": "4.52.4", "@rollup/rollup-linux-riscv64-musl": "4.52.4", "@rollup/rollup-linux-s390x-gnu": "4.52.4", "@rollup/rollup-linux-x64-gnu": "4.52.4", "@rollup/rollup-linux-x64-musl": "4.52.4", "@rollup/rollup-openharmony-arm64": "4.52.4", "@rollup/rollup-win32-arm64-msvc": "4.52.4", "@rollup/rollup-win32-ia32-msvc": "4.52.4", "@rollup/rollup-win32-x64-gnu": "4.52.4", "@rollup/rollup-win32-x64-msvc": "4.52.4", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ=="], + + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "sade": ["sade@1.8.1", "", { "dependencies": { "mri": "^1.1.0" } }, "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="], + + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "semiver": ["semiver@1.1.0", "", {}, "sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg=="], + + "semver": ["semver@7.6.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w=="], + + "semver-compare": ["semver-compare@1.0.0", "", {}, "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow=="], + + "serialize-error": ["serialize-error@7.0.1", "", { "dependencies": { "type-fest": "^0.13.1" } }, "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "siginfo": ["siginfo@2.0.0", "", {}, "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g=="], + + "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "simple-subpub": ["simple-subpub@1.2.0", "", {}, "sha512-cN0RBYgIydi0X+3oDYaEMY7/IfdopJjJZriLxXIiHDdsKW3eSVxDpyojAyBY5wWw0P8Z0NLOP93h0kCaeT/TuA=="], + + "sirv": ["sirv@1.0.19", "", { "dependencies": { "@polka/url": "^1.0.0-next.20", "mrmime": "^1.0.0", "totalist": "^1.0.0" } }, "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ=="], + + "sirv-cli": ["sirv-cli@1.0.14", "", { "dependencies": { "console-clear": "^1.1.0", "get-port": "^3.2.0", "kleur": "^3.0.0", "local-access": "^1.0.1", "sade": "^1.6.0", "semiver": "^1.0.0", "sirv": "^1.0.13", "tinydate": "^1.0.0" }, "bin": { "sirv": "bin.js" } }, "sha512-yyUTNr984ANKDloqepkYbBSqvx3buwYg2sQKPWjSU+IBia5loaoka2If8N9CMwt8AfP179cdEl7kYJ//iWJHjQ=="], + + "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], + + "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "sprintf-js": ["sprintf-js@1.1.3", "", {}, "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="], + + "stackback": ["stackback@0.0.2", "", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="], + + "std-env": ["std-env@3.9.0", "", {}, "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw=="], + + "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + + "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + + "strip-literal": ["strip-literal@3.1.0", "", { "dependencies": { "js-tokens": "^9.0.1" } }, "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg=="], + + "sumchecker": ["sumchecker@3.0.1", "", { "dependencies": { "debug": "^4.1.0" } }, "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg=="], + + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "svelte": ["svelte@5.55.3", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "@types/trusted-types": "^2.0.7", "acorn": "^8.12.1", "aria-query": "5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.6.4", "esm-env": "^1.2.1", "esrap": "^2.2.4", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-dS1N+i3bA1v+c4UDb750MlN5vCO82G6vxh8HeTsPsTdJ1BLsN1zxSyDlIdBBqUjqZ/BxEwM8UrFf98aaoVnZFQ=="], + + "svelte-ace": ["svelte-ace@1.0.21", "", { "dependencies": { "brace": "^0.11.1", "sirv-cli": "^1.0.0" } }, "sha512-Ek86AiCNcBYH84P90NmQh4GLW9TB5jZP0zBhqPJ/dGRdOP+LOQ+gQIQ1JyTzYpMGQVlDUb9Ug4yo0hCGWNnjaw=="], + + "svelte-awesome-color-picker": ["svelte-awesome-color-picker@3.1.0", "", { "dependencies": { "colord": "^2.9.3", "svelte-awesome-slider": "^1.1.0" } }, "sha512-na9B9qLaV8XQ6W6eyP6vFyDV2TBF4qvGad6799D4GzbazkiFtoO+lbaFFViAWanz/eECwe/WUAUdg6Jy7LIKFw=="], + + "svelte-awesome-slider": ["svelte-awesome-slider@1.1.0", "", {}, "sha512-MgY6ZdBON42HVZqNWNjq2HOgyDlC35q0TNbV/YO1l1/bcb5yhM8EE97h1AJ/7F6t6sLzXhQ3qPf5nGyCdDSnCg=="], + + "svelte-dnd-action": ["svelte-dnd-action@0.9.47", "", {}, "sha512-Z343HCJfrGHgK98LCrp0ziGUwwWOd8UrpXk7b7A61OQErrB8nUS2tLVRZlaGzhMfE1UCivuqTGFLqxJ14KehfQ=="], + + "svelte-eslint-parser": ["svelte-eslint-parser@1.3.3", "", { "dependencies": { "eslint-scope": "^8.2.0", "eslint-visitor-keys": "^4.0.0", "espree": "^10.0.0", "postcss": "^8.4.49", "postcss-scss": "^4.0.9", "postcss-selector-parser": "^7.0.0" } }, "sha512-oTrDR8Z7Wnguut7QH3YKh7JR19xv1seB/bz4dxU5J/86eJtZOU4eh0/jZq4dy6tAlz/KROxnkRQspv5ZEt7t+Q=="], + + "svelte-multiselect": ["svelte-multiselect@11.0.0-rc.1", "", { "dependencies": { "svelte": "4.2.12" } }, "sha512-dyUzja9AJfDejfafDj6PKNk3F51HavArevkJxZ0upJKUlPnPx5pDKY24BQYQvUpitTqVtsEoHevKr93WebBtwA=="], + + "svelte-observable-store": ["svelte-observable-store@1.0.1", "", { "dependencies": { "svelte": "^5.46.3" } }, "sha512-eAE37gx97M3DuPDbWd9V2twCXFnOJNeBL/BpT3NkswHBZnp8VP47ep5Sl6mj2VO9Y7s/vb12/vAQk+9+hT9Aag=="], + + "svelte-patching-tools": ["svelte-patching-tools@1.0.14", "", { "dependencies": { "blockbench-types": "^5.1.0", "svelte": "^5.55.4", "svelte-observable-store": "^1.0.1", "svelte-preprocess": "^6.0.3", "svelte-preprocess-esbuild": "^3.0.1" } }, "sha512-dqmoNpupIsQlTuP0xvO194ZZ25reIsiO/nSsbrEZ6rh7DIDKV9WMeSe3D6qH/kjeK8ImpK//9Q2c6OIOSuWFjg=="], + + "svelte-preprocess": ["svelte-preprocess@6.0.3", "", {}, "sha512-PLG2k05qHdhmRG7zR/dyo5qKvakhm8IJ+hD2eFRQmMLHp7X3eJnjeupUtvuRpbNiF31RjVw45W+abDwHEmP5OA=="], + + "svelte-preprocess-esbuild": ["svelte-preprocess-esbuild@3.0.1", "", {}, "sha512-OV4P/onki7hfuzIpYOd92TT0JSm4y67PvkAAM7RigLd869VEvNh2f6J+ewrEqAgTnZzVQcOWzuaU4hPISNPFpA=="], + + "three": ["three@0.134.0", "", {}, "sha512-LbBerg7GaSPjYtTOnu41AMp7tV6efUNR3p4Wk5NzkSsNTBuA5mDGOfwwZL1jhhVMLx9V20HolIUo0+U3AXehbg=="], + + "throttleit": ["throttleit@1.0.1", "", {}, "sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ=="], + + "tinybench": ["tinybench@2.9.0", "", {}, "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg=="], + + "tinycolor2": ["tinycolor2@1.6.0", "", {}, "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw=="], + + "tinydate": ["tinydate@1.3.0", "", {}, "sha512-7cR8rLy2QhYHpsBDBVYnnWXm8uRTr38RoZakFSW7Bs7PzfMPNZthuMLkwqZv7MTu8lhQ91cOFYS5a7iFj2oR3w=="], + + "tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], + + "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], + + "tinypool": ["tinypool@1.1.1", "", {}, "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg=="], + + "tinyrainbow": ["tinyrainbow@2.0.0", "", {}, "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw=="], + + "tinyspy": ["tinyspy@4.0.4", "", {}, "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q=="], + + "to-fast-properties": ["to-fast-properties@2.0.0", "", {}, "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "toad-cache": ["toad-cache@3.7.0", "", {}, "sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw=="], + + "totalist": ["totalist@1.1.0", "", {}, "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g=="], + + "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], + + "ts-api-utils": ["ts-api-utils@2.1.0", "", {}, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="], + + "tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], + + "tsutils": ["tsutils@3.21.0", "", { "dependencies": { "tslib": "^1.8.1" } }, "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA=="], + + "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], + + "type-fest": ["type-fest@0.13.1", "", {}, "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg=="], + + "typescript": ["typescript@6.0.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ=="], + + "typescript-eslint": ["typescript-eslint@8.45.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.45.0", "@typescript-eslint/parser": "8.45.0", "@typescript-eslint/typescript-estree": "8.45.0", "@typescript-eslint/utils": "8.45.0" } }, "sha512-qzDmZw/Z5beNLUrXfd0HIW6MzIaAV5WNDxmMs9/3ojGOpYavofgNAAD/nC6tGV2PczIi0iw8vot2eAe/sBn7zg=="], + + "undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], + + "universal-github-app-jwt": ["universal-github-app-jwt@2.2.2", "", {}, "sha512-dcmbeSrOdTnsjGjUfAlqNDJrhxXizjAz94ija9Qw8YkZ1uu0d+GoZzyH+Jb9tIIqvGsadUfwg+22k5aDqqwzbw=="], + + "universal-user-agent": ["universal-user-agent@7.0.3", "", {}, "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A=="], + + "universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], + + "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "vite": ["vite@7.1.9", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "vite": "bin/vite.js" } }, "sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg=="], + + "vite-node": ["vite-node@3.2.4", "", { "dependencies": { "cac": "^6.7.14", "debug": "^4.4.1", "es-module-lexer": "^1.7.0", "pathe": "^2.0.3", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "bin": { "vite-node": "vite-node.mjs" } }, "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg=="], + + "vitest": ["vitest@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.4", "@vitest/mocker": "3.2.4", "@vitest/pretty-format": "^3.2.4", "@vitest/runner": "3.2.4", "@vitest/snapshot": "3.2.4", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "debug": "^4.4.1", "expect-type": "^1.2.1", "magic-string": "^0.30.17", "pathe": "^2.0.3", "picomatch": "^4.0.2", "std-env": "^3.9.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.14", "tinypool": "^1.1.1", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", "vite-node": "3.2.4", "why-is-node-running": "^2.3.0" }, "bin": { "vitest": "vitest.mjs" } }, "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A=="], + + "vue": ["vue@2.7.14", "", { "dependencies": { "@vue/compiler-sfc": "2.7.14", "csstype": "^3.1.0" } }, "sha512-b2qkFyOM0kwqWFuQmgd4o+uHGU7T+2z3T+WQp8UBjADfEv2n4FEMffzBmCKNP0IGzOEEfYjvtcC62xaSKeQDrQ=="], + + "webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], + + "websocket-driver": ["websocket-driver@0.7.4", "", { "dependencies": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", "websocket-extensions": ">=0.1.1" } }, "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg=="], + + "websocket-extensions": ["websocket-extensions@0.1.4", "", {}, "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg=="], + + "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="], + + "wintersky": ["wintersky@1.3.0", "", { "dependencies": { "molangjs": "^1.6.3", "three": "^0.134.0", "tinycolor2": "^1.4.2" } }, "sha512-ibeUF+sgoIrFAfgqcNsPlr8+4l0KOfhGw+JgjxKcgtbckSy3gAxqAeNX5LjuQK9y7jcBZDwUIXg9sZDGQ1W+hQ=="], + + "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], + + "wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + + "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + + "yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="], + + "yargs": ["yargs@16.2.0", "", { "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.0", "y18n": "^5.0.5", "yargs-parser": "^20.2.2" } }, "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw=="], + + "yargs-parser": ["yargs-parser@20.2.9", "", {}, "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="], + + "yauzl": ["yauzl@2.10.0", "", { "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } }, "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g=="], + + "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + + "zimmerframe": ["zimmerframe@1.1.4", "", {}, "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ=="], + + "@babel/parser/@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="], + + "@electron/get/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "@eslint/config-array/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "@eslint/eslintrc/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + + "@firebase/analytics/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "@firebase/analytics-compat/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "@firebase/app/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "@firebase/app-check/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "@firebase/app-check-compat/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "@firebase/app-compat/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "@firebase/auth/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "@firebase/auth-compat/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "@firebase/component/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "@firebase/database/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "@firebase/database-compat/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "@firebase/firestore/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "@firebase/firestore-compat/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "@firebase/functions/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "@firebase/functions-compat/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "@firebase/installations/idb": ["idb@7.0.1", "", {}, "sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg=="], + + "@firebase/installations/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "@firebase/installations-compat/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "@firebase/logger/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "@firebase/messaging/idb": ["idb@7.0.1", "", {}, "sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg=="], + + "@firebase/messaging/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "@firebase/messaging-compat/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "@firebase/performance/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "@firebase/performance-compat/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "@firebase/remote-config/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "@firebase/remote-config-compat/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "@firebase/storage/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "@firebase/storage-compat/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "@firebase/util/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "@grpc/grpc-js/@grpc/proto-loader": ["@grpc/proto-loader@0.7.13", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.2.5", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw=="], + + "@grpc/grpc-js/@types/node": ["@types/node@20.12.12", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw=="], + + "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + + "@jridgewell/trace-mapping/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.4.15", "", {}, "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="], + + "@novacbn/svelte-codejar/svelte": ["svelte@3.59.2", "", {}, "sha512-vzSyuGr3eEoAtT/A6bmajosJZIUWySzY2CzB3w2pgPvnkUjGqlDnsNnA0PMO+mMAhuyMul6C2uuZzY6ELSkzyA=="], + + "@octokit/core/@octokit/types": ["@octokit/types@15.0.0", "", { "dependencies": { "@octokit/openapi-types": "^26.0.0" } }, "sha512-8o6yDfmoGJUIeR9OfYU0/TUJTnMPG2r68+1yEdUeG2Fdqpj8Qetg0ziKIgcBm0RW/j29H41WP37CYCEhp6GoHQ=="], + + "@octokit/plugin-rest-endpoint-methods/@octokit/types": ["@octokit/types@15.0.0", "", { "dependencies": { "@octokit/openapi-types": "^26.0.0" } }, "sha512-8o6yDfmoGJUIeR9OfYU0/TUJTnMPG2r68+1yEdUeG2Fdqpj8Qetg0ziKIgcBm0RW/j29H41WP37CYCEhp6GoHQ=="], + + "@types/cacheable-request/@types/node": ["@types/node@20.12.12", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw=="], + + "@types/decompress/@types/node": ["@types/node@20.12.12", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw=="], + + "@types/download/@types/node": ["@types/node@20.12.12", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw=="], + + "@types/got/@types/node": ["@types/node@20.12.12", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw=="], + + "@types/keyv/@types/node": ["@types/node@20.12.12", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw=="], + + "@types/responselike/@types/node": ["@types/node@20.12.12", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw=="], + + "@types/websocket/@types/node": ["@types/node@20.12.12", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw=="], + + "@types/yauzl/@types/node": ["@types/node@20.12.12", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw=="], + + "@typescript-eslint/project-service/@typescript-eslint/types": ["@typescript-eslint/types@8.45.0", "", {}, "sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA=="], + + "@typescript-eslint/utils/@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.4.0", "", { "dependencies": { "eslint-visitor-keys": "^3.3.0" } }, "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA=="], + + "@typescript-eslint/utils/eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="], + + "@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "@vitest/mocker/magic-string": ["magic-string@0.30.19", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw=="], + + "@vitest/snapshot/magic-string": ["magic-string@0.30.19", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw=="], + + "@vue/compiler-sfc/postcss": ["postcss@8.5.9", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw=="], + + "blockbench-patch-manager/svelte": ["svelte@5.55.4", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "@types/trusted-types": "^2.0.7", "acorn": "^8.12.1", "aria-query": "5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.6.4", "esm-env": "^1.2.1", "esrap": "^2.2.4", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-q8DFohk6vUswSng95IZb9nzWJnbINZsK7OiM1snAa3qCjJBL0ZQpvMyAaVXjUukdM75J/m8UE8xwqat8Ors/zQ=="], + + "blockbench-types/typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + + "book-and-quill/@types/node": ["@types/node@25.6.0", "", { "dependencies": { "undici-types": "~7.19.0" } }, "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ=="], + + "chai/loupe": ["loupe@3.1.2", "", {}, "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg=="], + + "cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "clone-response/mimic-response": ["mimic-response@1.0.1", "", {}, "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="], + + "code-red/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.4.15", "", {}, "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="], + + "code-red/@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], + + "code-red/acorn": ["acorn@8.14.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg=="], + + "electron/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="], + + "esbuild-plugin-import-folder/eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], + + "esbuild-plugin-inline-worker/esbuild": ["esbuild@0.21.3", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.21.3", "@esbuild/android-arm": "0.21.3", "@esbuild/android-arm64": "0.21.3", "@esbuild/android-x64": "0.21.3", "@esbuild/darwin-arm64": "0.21.3", "@esbuild/darwin-x64": "0.21.3", "@esbuild/freebsd-arm64": "0.21.3", "@esbuild/freebsd-x64": "0.21.3", "@esbuild/linux-arm": "0.21.3", "@esbuild/linux-arm64": "0.21.3", "@esbuild/linux-ia32": "0.21.3", "@esbuild/linux-loong64": "0.21.3", "@esbuild/linux-mips64el": "0.21.3", "@esbuild/linux-ppc64": "0.21.3", "@esbuild/linux-riscv64": "0.21.3", "@esbuild/linux-s390x": "0.21.3", "@esbuild/linux-x64": "0.21.3", "@esbuild/netbsd-x64": "0.21.3", "@esbuild/openbsd-x64": "0.21.3", "@esbuild/sunos-x64": "0.21.3", "@esbuild/win32-arm64": "0.21.3", "@esbuild/win32-ia32": "0.21.3", "@esbuild/win32-x64": "0.21.3" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-Kgq0/ZsAPzKrbOjCQcjoSmPoWhlcVnGAUo7jvaLHoxW1Drto0KGkR1xBNg2Cp43b9ImvxmPEJZ9xkfcnqPsfBw=="], + + "eslint/@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], + + "eslint/@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], + + "eslint/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "eslint-plugin-svelte/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + + "espree/acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], + + "esrap/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.4.15", "", {}, "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="], + + "estree-walker/@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], + + "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "glob/minimatch": ["minimatch@10.0.3", "", { "dependencies": { "@isaacs/brace-expansion": "^5.0.0" } }, "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw=="], + + "is-reference/@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], + + "magic-string/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "make-dir/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "node-modules-vscode-problems-patch/esbuild": ["esbuild@0.25.10", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.10", "@esbuild/android-arm": "0.25.10", "@esbuild/android-arm64": "0.25.10", "@esbuild/android-x64": "0.25.10", "@esbuild/darwin-arm64": "0.25.10", "@esbuild/darwin-x64": "0.25.10", "@esbuild/freebsd-arm64": "0.25.10", "@esbuild/freebsd-x64": "0.25.10", "@esbuild/linux-arm": "0.25.10", "@esbuild/linux-arm64": "0.25.10", "@esbuild/linux-ia32": "0.25.10", "@esbuild/linux-loong64": "0.25.10", "@esbuild/linux-mips64el": "0.25.10", "@esbuild/linux-ppc64": "0.25.10", "@esbuild/linux-riscv64": "0.25.10", "@esbuild/linux-s390x": "0.25.10", "@esbuild/linux-x64": "0.25.10", "@esbuild/netbsd-arm64": "0.25.10", "@esbuild/netbsd-x64": "0.25.10", "@esbuild/openbsd-arm64": "0.25.10", "@esbuild/openbsd-x64": "0.25.10", "@esbuild/openharmony-arm64": "0.25.10", "@esbuild/sunos-x64": "0.25.10", "@esbuild/win32-arm64": "0.25.10", "@esbuild/win32-ia32": "0.25.10", "@esbuild/win32-x64": "0.25.10" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ=="], + + "periscopic/@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], + + "pkg-dir/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], + + "protobufjs/@types/node": ["@types/node@20.12.12", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw=="], + + "rollup/@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "string-width-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-ansi-cjs/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "svelte/@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "svelte-multiselect/svelte": ["svelte@4.2.12", "", { "dependencies": { "@ampproject/remapping": "^2.2.1", "@jridgewell/sourcemap-codec": "^1.4.15", "@jridgewell/trace-mapping": "^0.3.18", "@types/estree": "^1.0.1", "acorn": "^8.9.0", "aria-query": "^5.3.0", "axobject-query": "^4.0.0", "code-red": "^1.0.3", "css-tree": "^2.3.1", "estree-walker": "^3.0.3", "is-reference": "^3.0.1", "locate-character": "^3.0.0", "magic-string": "^0.30.4", "periscopic": "^3.1.0" } }, "sha512-d8+wsh5TfPwqVzbm4/HCXC783/KPHV60NvwitJnyTA5lWn1elhXMNWhXGCJ7PwPa8qFUnyJNIyuIRt2mT0WMug=="], + + "svelte-patching-tools/svelte": ["svelte@5.55.4", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "@types/trusted-types": "^2.0.7", "acorn": "^8.12.1", "aria-query": "5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.6.4", "esm-env": "^1.2.1", "esrap": "^2.2.4", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-q8DFohk6vUswSng95IZb9nzWJnbINZsK7OiM1snAa3qCjJBL0ZQpvMyAaVXjUukdM75J/m8UE8xwqat8Ors/zQ=="], + + "typescript-eslint/@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.45.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.45.0", "@typescript-eslint/type-utils": "8.45.0", "@typescript-eslint/utils": "8.45.0", "@typescript-eslint/visitor-keys": "8.45.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" } }, "sha512-HC3y9CVuevvWCl/oyZuI47dOeDF9ztdMEfMH8/DW/Mhwa9cCLnK1oD7JoTVGW/u7kFzNZUKUoyJEqkaJh5y3Wg=="], + + "typescript-eslint/@typescript-eslint/parser": ["@typescript-eslint/parser@8.45.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.45.0", "@typescript-eslint/types": "8.45.0", "@typescript-eslint/typescript-estree": "8.45.0", "@typescript-eslint/visitor-keys": "8.45.0", "debug": "^4.3.4" } }, "sha512-TGf22kon8KW+DeKaUmOibKWktRY8b2NSAZNdtWh798COm1NWx8+xJ6iFBtk3IvLdv6+LGLJLRlyhrhEDZWargQ=="], + + "typescript-eslint/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.45.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.45.0", "@typescript-eslint/tsconfig-utils": "8.45.0", "@typescript-eslint/types": "8.45.0", "@typescript-eslint/visitor-keys": "8.45.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" } }, "sha512-GfE1NfVbLam6XQ0LcERKwdTTPlLvHvXXhOeUGC1OXi4eQBoyy1iVsW+uzJ/J9jtCz6/7GCQ9MtrQ0fml/jWCnA=="], + + "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@8.45.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.45.0", "@typescript-eslint/types": "8.45.0", "@typescript-eslint/typescript-estree": "8.45.0" } }, "sha512-bxi1ht+tLYg4+XV2knz/F7RVhU0k6VrSMc9sb8DQ6fyCTrGQLHfo7lDtN0QJjZjKkLA2ThrKuCdHEvLReqtIGg=="], + + "vite/esbuild": ["esbuild@0.25.10", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.10", "@esbuild/android-arm": "0.25.10", "@esbuild/android-arm64": "0.25.10", "@esbuild/android-x64": "0.25.10", "@esbuild/darwin-arm64": "0.25.10", "@esbuild/darwin-x64": "0.25.10", "@esbuild/freebsd-arm64": "0.25.10", "@esbuild/freebsd-x64": "0.25.10", "@esbuild/linux-arm": "0.25.10", "@esbuild/linux-arm64": "0.25.10", "@esbuild/linux-ia32": "0.25.10", "@esbuild/linux-loong64": "0.25.10", "@esbuild/linux-mips64el": "0.25.10", "@esbuild/linux-ppc64": "0.25.10", "@esbuild/linux-riscv64": "0.25.10", "@esbuild/linux-s390x": "0.25.10", "@esbuild/linux-x64": "0.25.10", "@esbuild/netbsd-arm64": "0.25.10", "@esbuild/netbsd-x64": "0.25.10", "@esbuild/openbsd-arm64": "0.25.10", "@esbuild/openbsd-x64": "0.25.10", "@esbuild/openharmony-arm64": "0.25.10", "@esbuild/sunos-x64": "0.25.10", "@esbuild/win32-arm64": "0.25.10", "@esbuild/win32-ia32": "0.25.10", "@esbuild/win32-x64": "0.25.10" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ=="], + + "vite-node/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "vitest/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "vitest/magic-string": ["magic-string@0.30.19", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw=="], + + "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "wrap-ansi/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + + "wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "@babel/parser/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], + + "@babel/parser/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], + + "@eslint/config-array/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "@eslint/eslintrc/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "@grpc/grpc-js/@grpc/proto-loader/long": ["long@5.2.3", "", {}, "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q=="], + + "@grpc/grpc-js/@grpc/proto-loader/protobufjs": ["protobufjs@7.3.0", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.4", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.0", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", "@types/node": ">=13.7.0", "long": "^5.0.0" } }, "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g=="], + + "@grpc/grpc-js/@grpc/proto-loader/yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + + "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + + "@octokit/core/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@26.0.0", "", {}, "sha512-7AtcfKtpo77j7Ts73b4OWhOZHTKo/gGY8bB3bNBQz4H+GRSWqx2yvj8TXRsbdTE0eRmYmXOEY66jM7mJ7LzfsA=="], + + "@octokit/plugin-rest-endpoint-methods/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@26.0.0", "", {}, "sha512-7AtcfKtpo77j7Ts73b4OWhOZHTKo/gGY8bB3bNBQz4H+GRSWqx2yvj8TXRsbdTE0eRmYmXOEY66jM7mJ7LzfsA=="], + + "@typescript-eslint/utils/@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "@typescript-eslint/utils/eslint-scope/estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="], + + "@vitest/mocker/magic-string/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "@vitest/snapshot/magic-string/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "blockbench-patch-manager/svelte/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "blockbench-patch-manager/svelte/@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "book-and-quill/@types/node/undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], + + "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "electron/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], + + "esbuild-plugin-import-folder/eslint/@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], + + "esbuild-plugin-import-folder/eslint/@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], + + "esbuild-plugin-import-folder/eslint/@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], + + "esbuild-plugin-import-folder/eslint/@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], + + "esbuild-plugin-import-folder/eslint/@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], + + "esbuild-plugin-import-folder/eslint/@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], + + "esbuild-plugin-import-folder/eslint/@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], + + "esbuild-plugin-import-folder/eslint/@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "esbuild-plugin-import-folder/eslint/ajv": ["ajv@6.14.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw=="], + + "esbuild-plugin-import-folder/eslint/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "esbuild-plugin-import-folder/eslint/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], + + "esbuild-plugin-inline-worker/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.21.3", "", { "os": "android", "cpu": "arm" }, "sha512-bviJOLMgurLJtF1/mAoJLxDZDL6oU5/ztMHnJQRejbJrSc9FFu0QoUoFhvi6qSKJEw9y5oGyvr9fuDtzJ30rNQ=="], + + "esbuild-plugin-inline-worker/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.21.3", "", { "os": "android", "cpu": "arm64" }, "sha512-c+ty9necz3zB1Y+d/N+mC6KVVkGUUOcm4ZmT5i/Fk5arOaY3i6CA3P5wo/7+XzV8cb4GrI/Zjp8NuOQ9Lfsosw=="], + + "esbuild-plugin-inline-worker/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.21.3", "", { "os": "android", "cpu": "x64" }, "sha512-JReHfYCRK3FVX4Ra+y5EBH1b9e16TV2OxrPAvzMsGeES0X2Ndm9ImQRI4Ket757vhc5XBOuGperw63upesclRw=="], + + "esbuild-plugin-inline-worker/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.21.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-U3fuQ0xNiAkXOmQ6w5dKpEvXQRSpHOnbw7gEfHCRXPeTKW9sBzVck6C5Yneb8LfJm0l6le4NQfkNPnWMSlTFUQ=="], + + "esbuild-plugin-inline-worker/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.21.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-3m1CEB7F07s19wmaMNI2KANLcnaqryJxO1fXHUV5j1rWn+wMxdUYoPyO2TnAbfRZdi7ADRwJClmOwgT13qlP3Q=="], + + "esbuild-plugin-inline-worker/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.21.3", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-fsNAAl5pU6wmKHq91cHWQT0Fz0vtyE1JauMzKotrwqIKAswwP5cpHUCxZNSTuA/JlqtScq20/5KZ+TxQdovU/g=="], + + "esbuild-plugin-inline-worker/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.21.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-tci+UJ4zP5EGF4rp8XlZIdq1q1a/1h9XuronfxTMCNBslpCtmk97Q/5qqy1Mu4zIc0yswN/yP/BLX+NTUC1bXA=="], + + "esbuild-plugin-inline-worker/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.21.3", "", { "os": "linux", "cpu": "arm" }, "sha512-f6kz2QpSuyHHg01cDawj0vkyMwuIvN62UAguQfnNVzbge2uWLhA7TCXOn83DT0ZvyJmBI943MItgTovUob36SQ=="], + + "esbuild-plugin-inline-worker/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.21.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-vvG6R5g5ieB4eCJBQevyDMb31LMHthLpXTc2IGkFnPWS/GzIFDnaYFp558O+XybTmYrVjxnryru7QRleJvmZ6Q=="], + + "esbuild-plugin-inline-worker/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.21.3", "", { "os": "linux", "cpu": "ia32" }, "sha512-HjCWhH7K96Na+66TacDLJmOI9R8iDWDDiqe17C7znGvvE4sW1ECt9ly0AJ3dJH62jHyVqW9xpxZEU1jKdt+29A=="], + + "esbuild-plugin-inline-worker/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.21.3", "", { "os": "linux", "cpu": "none" }, "sha512-BGpimEccmHBZRcAhdlRIxMp7x9PyJxUtj7apL2IuoG9VxvU/l/v1z015nFs7Si7tXUwEsvjc1rOJdZCn4QTU+Q=="], + + "esbuild-plugin-inline-worker/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.21.3", "", { "os": "linux", "cpu": "none" }, "sha512-5rMOWkp7FQGtAH3QJddP4w3s47iT20hwftqdm7b+loe95o8JU8ro3qZbhgMRy0VuFU0DizymF1pBKkn3YHWtsw=="], + + "esbuild-plugin-inline-worker/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.21.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-h0zj1ldel89V5sjPLo5H1SyMzp4VrgN1tPkN29TmjvO1/r0MuMRwJxL8QY05SmfsZRs6TF0c/IDH3u7XYYmbAg=="], + + "esbuild-plugin-inline-worker/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.21.3", "", { "os": "linux", "cpu": "none" }, "sha512-dkAKcTsTJ+CRX6bnO17qDJbLoW37npd5gSNtSzjYQr0svghLJYGYB0NF1SNcU1vDcjXLYS5pO4qOW4YbFama4A=="], + + "esbuild-plugin-inline-worker/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.21.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-vnD1YUkovEdnZWEuMmy2X2JmzsHQqPpZElXx6dxENcIwTu+Cu5ERax6+Ke1QsE814Zf3c6rxCfwQdCTQ7tPuXA=="], + + "esbuild-plugin-inline-worker/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.21.3", "", { "os": "linux", "cpu": "x64" }, "sha512-IOXOIm9WaK7plL2gMhsWJd+l2bfrhfilv0uPTptoRoSb2p09RghhQQp9YY6ZJhk/kqmeRt6siRdMSLLwzuT0KQ=="], + + "esbuild-plugin-inline-worker/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.21.3", "", { "os": "none", "cpu": "x64" }, "sha512-uTgCwsvQ5+vCQnqM//EfDSuomo2LhdWhFPS8VL8xKf+PKTCrcT/2kPPoWMTs22aB63MLdGMJiE3f1PHvCDmUOw=="], + + "esbuild-plugin-inline-worker/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.21.3", "", { "os": "openbsd", "cpu": "x64" }, "sha512-vNAkR17Ub2MgEud2Wag/OE4HTSI6zlb291UYzHez/psiKarp0J8PKGDnAhMBcHFoOHMXHfExzmjMojJNbAStrQ=="], + + "esbuild-plugin-inline-worker/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.21.3", "", { "os": "sunos", "cpu": "x64" }, "sha512-W8H9jlGiSBomkgmouaRoTXo49j4w4Kfbl6I1bIdO/vT0+0u4f20ko3ELzV3hPI6XV6JNBVX+8BC+ajHkvffIJA=="], + + "esbuild-plugin-inline-worker/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.21.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-EjEomwyLSCg8Ag3LDILIqYCZAq/y3diJ04PnqGRgq8/4O3VNlXyMd54j/saShaN4h5o5mivOjAzmU6C3X4v0xw=="], + + "esbuild-plugin-inline-worker/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.21.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-WGiE/GgbsEwR33++5rzjiYsKyHywE8QSZPF7Rfx9EBfK3Qn3xyR6IjyCr5Uk38Kg8fG4/2phN7sXp4NPWd3fcw=="], + + "esbuild-plugin-inline-worker/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.21.3", "", { "os": "win32", "cpu": "x64" }, "sha512-xRxC0jaJWDLYvcUvjQmHCJSfMrgmUuvsoXgDeU/wTorQ1ngDdUBuFtgY3W1Pc5sprGAvZBtWdJX7RPg/iZZUqA=="], + + "eslint/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "node-modules-vscode-problems-patch/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.10", "", { "os": "aix", "cpu": "ppc64" }, "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw=="], + + "node-modules-vscode-problems-patch/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.10", "", { "os": "android", "cpu": "arm" }, "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w=="], + + "node-modules-vscode-problems-patch/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.10", "", { "os": "android", "cpu": "arm64" }, "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg=="], + + "node-modules-vscode-problems-patch/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.25.10", "", { "os": "android", "cpu": "x64" }, "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg=="], + + "node-modules-vscode-problems-patch/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.10", "", { "os": "darwin", "cpu": "arm64" }, "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA=="], + + "node-modules-vscode-problems-patch/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.10", "", { "os": "darwin", "cpu": "x64" }, "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg=="], + + "node-modules-vscode-problems-patch/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.10", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg=="], + + "node-modules-vscode-problems-patch/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.10", "", { "os": "freebsd", "cpu": "x64" }, "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA=="], + + "node-modules-vscode-problems-patch/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.10", "", { "os": "linux", "cpu": "arm" }, "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg=="], + + "node-modules-vscode-problems-patch/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ=="], + + "node-modules-vscode-problems-patch/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.10", "", { "os": "linux", "cpu": "ia32" }, "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ=="], + + "node-modules-vscode-problems-patch/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.10", "", { "os": "linux", "cpu": "none" }, "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg=="], + + "node-modules-vscode-problems-patch/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.10", "", { "os": "linux", "cpu": "none" }, "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA=="], + + "node-modules-vscode-problems-patch/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.10", "", { "os": "linux", "cpu": "ppc64" }, "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA=="], + + "node-modules-vscode-problems-patch/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.10", "", { "os": "linux", "cpu": "none" }, "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA=="], + + "node-modules-vscode-problems-patch/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.10", "", { "os": "linux", "cpu": "s390x" }, "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew=="], + + "node-modules-vscode-problems-patch/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.10", "", { "os": "linux", "cpu": "x64" }, "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA=="], + + "node-modules-vscode-problems-patch/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.10", "", { "os": "none", "cpu": "x64" }, "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig=="], + + "node-modules-vscode-problems-patch/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.10", "", { "os": "openbsd", "cpu": "x64" }, "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw=="], + + "node-modules-vscode-problems-patch/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.10", "", { "os": "sunos", "cpu": "x64" }, "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ=="], + + "node-modules-vscode-problems-patch/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.10", "", { "os": "win32", "cpu": "arm64" }, "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw=="], + + "node-modules-vscode-problems-patch/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.10", "", { "os": "win32", "cpu": "ia32" }, "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw=="], + + "node-modules-vscode-problems-patch/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.10", "", { "os": "win32", "cpu": "x64" }, "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw=="], + + "pkg-dir/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], + + "string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "svelte-multiselect/svelte/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.4.15", "", {}, "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="], + + "svelte-multiselect/svelte/@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], + + "svelte-multiselect/svelte/acorn": ["acorn@8.11.3", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg=="], + + "svelte-multiselect/svelte/aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="], + + "svelte-multiselect/svelte/magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="], + + "svelte-patching-tools/svelte/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "svelte-patching-tools/svelte/@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "typescript-eslint/@typescript-eslint/eslint-plugin/@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], + + "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.45.0", "", { "dependencies": { "@typescript-eslint/types": "8.45.0", "@typescript-eslint/visitor-keys": "8.45.0" } }, "sha512-clmm8XSNj/1dGvJeO6VGH7EUSeA0FMs+5au/u3lrA3KfG8iJ4u8ym9/j2tTEoacAffdW1TVUzXO30W1JTJS7dA=="], + + "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.45.0", "", { "dependencies": { "@typescript-eslint/types": "8.45.0", "@typescript-eslint/typescript-estree": "8.45.0", "@typescript-eslint/utils": "8.45.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" } }, "sha512-bpjepLlHceKgyMEPglAeULX1vixJDgaKocp0RVJ5u4wLJIMNuKtUXIczpJCPcn2waII0yuvks/5m5/h3ZQKs0A=="], + + "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.45.0", "", { "dependencies": { "@typescript-eslint/types": "8.45.0", "eslint-visitor-keys": "^4.2.1" } }, "sha512-qsaFBA3e09MIDAGFUrTk+dzqtfv1XPVz8t8d1f0ybTzrCY7BKiMC5cjrl1O/P7UmHsNyW90EYSkU/ZWpmXelag=="], + + "typescript-eslint/@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], + + "typescript-eslint/@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.45.0", "", { "dependencies": { "@typescript-eslint/types": "8.45.0", "@typescript-eslint/visitor-keys": "8.45.0" } }, "sha512-clmm8XSNj/1dGvJeO6VGH7EUSeA0FMs+5au/u3lrA3KfG8iJ4u8ym9/j2tTEoacAffdW1TVUzXO30W1JTJS7dA=="], + + "typescript-eslint/@typescript-eslint/parser/@typescript-eslint/types": ["@typescript-eslint/types@8.45.0", "", {}, "sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA=="], + + "typescript-eslint/@typescript-eslint/parser/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.45.0", "", { "dependencies": { "@typescript-eslint/types": "8.45.0", "eslint-visitor-keys": "^4.2.1" } }, "sha512-qsaFBA3e09MIDAGFUrTk+dzqtfv1XPVz8t8d1f0ybTzrCY7BKiMC5cjrl1O/P7UmHsNyW90EYSkU/ZWpmXelag=="], + + "typescript-eslint/@typescript-eslint/typescript-estree/@typescript-eslint/types": ["@typescript-eslint/types@8.45.0", "", {}, "sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA=="], + + "typescript-eslint/@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.45.0", "", { "dependencies": { "@typescript-eslint/types": "8.45.0", "eslint-visitor-keys": "^4.2.1" } }, "sha512-qsaFBA3e09MIDAGFUrTk+dzqtfv1XPVz8t8d1f0ybTzrCY7BKiMC5cjrl1O/P7UmHsNyW90EYSkU/ZWpmXelag=="], + + "typescript-eslint/@typescript-eslint/typescript-estree/fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + + "typescript-eslint/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "typescript-eslint/@typescript-eslint/typescript-estree/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + + "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.45.0", "", { "dependencies": { "@typescript-eslint/types": "8.45.0", "@typescript-eslint/visitor-keys": "8.45.0" } }, "sha512-clmm8XSNj/1dGvJeO6VGH7EUSeA0FMs+5au/u3lrA3KfG8iJ4u8ym9/j2tTEoacAffdW1TVUzXO30W1JTJS7dA=="], + + "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@8.45.0", "", {}, "sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA=="], + + "vite-node/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.10", "", { "os": "aix", "cpu": "ppc64" }, "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw=="], + + "vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.10", "", { "os": "android", "cpu": "arm" }, "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w=="], + + "vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.10", "", { "os": "android", "cpu": "arm64" }, "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg=="], + + "vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.25.10", "", { "os": "android", "cpu": "x64" }, "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg=="], + + "vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.10", "", { "os": "darwin", "cpu": "arm64" }, "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA=="], + + "vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.10", "", { "os": "darwin", "cpu": "x64" }, "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg=="], + + "vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.10", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg=="], + + "vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.10", "", { "os": "freebsd", "cpu": "x64" }, "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA=="], + + "vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.10", "", { "os": "linux", "cpu": "arm" }, "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg=="], + + "vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ=="], + + "vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.10", "", { "os": "linux", "cpu": "ia32" }, "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ=="], + + "vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.10", "", { "os": "linux", "cpu": "none" }, "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg=="], + + "vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.10", "", { "os": "linux", "cpu": "none" }, "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA=="], + + "vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.10", "", { "os": "linux", "cpu": "ppc64" }, "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA=="], + + "vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.10", "", { "os": "linux", "cpu": "none" }, "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA=="], + + "vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.10", "", { "os": "linux", "cpu": "s390x" }, "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew=="], + + "vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.10", "", { "os": "linux", "cpu": "x64" }, "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA=="], + + "vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.10", "", { "os": "none", "cpu": "x64" }, "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig=="], + + "vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.10", "", { "os": "openbsd", "cpu": "x64" }, "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw=="], + + "vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.10", "", { "os": "sunos", "cpu": "x64" }, "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ=="], + + "vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.10", "", { "os": "win32", "cpu": "arm64" }, "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw=="], + + "vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.10", "", { "os": "win32", "cpu": "ia32" }, "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw=="], + + "vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.10", "", { "os": "win32", "cpu": "x64" }, "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw=="], + + "vitest/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "vitest/magic-string/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "wrap-ansi-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "wrap-ansi/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + + "@grpc/grpc-js/@grpc/proto-loader/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "@grpc/grpc-js/@grpc/proto-loader/yargs/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "esbuild-plugin-import-folder/eslint/@eslint/config-array/@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], + + "esbuild-plugin-import-folder/eslint/@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + + "esbuild-plugin-import-folder/eslint/@eslint/eslintrc/js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], + + "esbuild-plugin-import-folder/eslint/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "pkg-dir/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], + + "svelte-multiselect/svelte/magic-string/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], + + "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@8.45.0", "", {}, "sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA=="], + + "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/types": ["@typescript-eslint/types@8.45.0", "", {}, "sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA=="], + + "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys/@typescript-eslint/types": ["@typescript-eslint/types@8.45.0", "", {}, "sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA=="], + + "typescript-eslint/@typescript-eslint/typescript-estree/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "typescript-eslint/@typescript-eslint/typescript-estree/fast-glob/micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "typescript-eslint/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/scope-manager/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.45.0", "", { "dependencies": { "@typescript-eslint/types": "8.45.0", "eslint-visitor-keys": "^4.2.1" } }, "sha512-qsaFBA3e09MIDAGFUrTk+dzqtfv1XPVz8t8d1f0ybTzrCY7BKiMC5cjrl1O/P7UmHsNyW90EYSkU/ZWpmXelag=="], + + "@grpc/grpc-js/@grpc/proto-loader/yargs/cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "@grpc/grpc-js/@grpc/proto-loader/yargs/cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "pkg-dir/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], + + "typescript-eslint/@typescript-eslint/typescript-estree/fast-glob/micromatch/braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "typescript-eslint/@typescript-eslint/typescript-estree/fast-glob/micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "@grpc/grpc-js/@grpc/proto-loader/yargs/cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "typescript-eslint/@typescript-eslint/typescript-estree/fast-glob/micromatch/braces/fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + } +} diff --git a/eslint.config.ts b/eslint.config.ts index 1df67d02..bef3f6f7 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -1,9 +1,9 @@ import svelteEslint from 'eslint-plugin-svelte' import svelteParser from 'svelte-eslint-parser' import tsESLint, { type ConfigWithExtends } from 'typescript-eslint' -import type { NamingConventionRule } from './tools/tslintNamingConventionRule' +import type { NamingConventionRule } from './.scripts/tslintNamingConventionRule.d.ts' -console.log(`⚙️ Loading ESLint config...`) +console.log('⚙️ Loading ESLint config...') const IGNORE_PATTERNS = [ '.DS_Store', @@ -53,21 +53,12 @@ const CUSTOM_RULES: ConfigWithExtends['rules'] = { '@typescript-eslint/restrict-template-expressions': 'off', '@typescript-eslint/no-unsafe-member-access': 'off', '@typescript-eslint/no-unsafe-assignment': 'off', - '@typescript-eslint/ban-ts-comment': [ - 'warn', - { - minimumDescriptionLength: 3, - 'ts-check': false, - 'ts-expect-error': 'allow-with-description', - 'ts-ignore': true, - 'ts-nocheck': true, - }, - ], + '@typescript-eslint/ban-ts-comment': 'off', '@typescript-eslint/require-await': 'warn', '@typescript-eslint/no-unsafe-call': 'off', '@typescript-eslint/unbound-method': 'off', '@typescript-eslint/no-non-null-assertion': 'off', - '@typescript-eslint/explicit-member-accessibility': ['error', { accessibility: 'no-public' }], + '@typescript-eslint/triple-slash-reference': 'off', // Naming conventions '@typescript-eslint/naming-convention': [ 'warn', @@ -76,12 +67,12 @@ const CUSTOM_RULES: ConfigWithExtends['rules'] = { selector: ['import'], modifiers: ['default'], filter: { - regex: 'v\\d+_\\d+_\\d+$', + regex: '(old_)?v[\\d_]+(_pre\\d+|_beta_\\d+)?$', match: true, }, custom: { match: true, - regex: 'v\\d+_\\d+_\\d+$', + regex: '(old_)?v[\\d_]+(_pre\\d+|_beta_\\d+)?$', }, format: null, }, @@ -196,7 +187,6 @@ export default tsESLint.config( languageOptions: { parser: tsESLint.parser, parserOptions: { - project: './tsconfig.json', extraFileExtensions: ['.svelte'], }, globals: { @@ -222,7 +212,7 @@ export default tsESLint.config( { selector: 'variable', modifiers: ['const', 'global'], - format: ['UPPER_CASE'], + format: ['camelCase', 'UPPER_CASE'], }, { selector: 'variable', diff --git a/package.json b/package.json index 2f5e3a93..8dc2b5e7 100644 --- a/package.json +++ b/package.json @@ -4,9 +4,9 @@ "title": "Animated Java", "icon": "icon.svg", "description": "Effortlessly craft complex animations for Minecraft: Java Edition", - "version": "1.9.0-beta.3", - "min_blockbench_version": "4.12.6", - "max_blockbench_version": "4.12.6", + "version": "1.10.0-beta.5", + "min_blockbench_version": "5.1.4", + "max_blockbench_version": "5.1.4", "variant": "desktop", "tags": [ "Minecraft: Java Edition", @@ -75,9 +75,9 @@ "types": "./dist/src/index.d.ts", "private": true, "scripts": { - "build:scripts": "esbuild --bundle --platform=node --outfile=dist/build.cjs --packages=external ./tools/esbuild.ts", + "build:scripts": "esbuild --bundle --platform=node --outfile=dist/build.cjs --packages=external ./.scripts/esbuild.ts", "dev": "yarn build:scripts && node ./dist/build.cjs --mode=dev", - "prod": "node ./tools/cleanupDist.cjs && yarn build:scripts && node ./dist/build.cjs", + "prod": "node ./.scripts/cleanupDist.cjs && yarn build:scripts && node ./dist/build.cjs", "format": "prettier --write .", "test": "yarn build:scripts && vitest run", "coverage": "yarn build:scripts && vitest run --coverage", @@ -93,8 +93,10 @@ "@types/websocket": "^1.0.10", "@typescript-eslint/eslint-plugin": "^5.54.0", "@typescript-eslint/parser": "^5.54.0", - "blockbench-types": "https://github.com/SnaveSutit/blockbench-types.git", + "blockbench-patch-manager": "^1.0.2", + "book-and-quill": "^1.0.8", "esbuild": "^0.17.10", + "esbuild-plugin-import-folder": "^1.0.1", "esbuild-plugin-import-glob": "^0.1.1", "esbuild-plugin-inline-image": "^0.0.9", "esbuild-plugin-inline-worker": "^0.1.1", @@ -104,25 +106,28 @@ "firebase": "^9.19.0", "jiti": "^2.6.1", "js-yaml": "^4.1.0", - "mc-build": "^3.6.7", + "mc-build": "^4.0.4", "node-modules-vscode-problems-patch": "^1.0.9", "octokit": "^5.0.3", - "prettier": "^2.5.1", - "svelte": "^3.55.1", + "prettier": "^3.8.2", + "simple-subpub": "^1.2.0", + "svelte": "^5.55.3", "svelte-awesome-color-picker": "^3.0.0-beta.7", "svelte-eslint-parser": "^1.3.3", "svelte-multiselect": "^11.0.0-rc.1", - "svelte-preprocess": "^5.0.1", + "svelte-observable-store": "^1.0.1", + "svelte-patching-tools": "^1.0.14", + "svelte-preprocess": "^6.0.3", "svelte-preprocess-esbuild": "^3.0.1", - "typescript": "^4.5.5", + "typescript": "^6.0.2", "typescript-eslint": "^8.45.0", "vitest": "^3.2.4" }, "dependencies": { "deepslate": "^0.19.2", - "download": "^8.0.0", "fflate": "^0.8.2", - "generic-stream": "^1.2.6", + "generic-stream": "^3.0.1", + "ky": "^2.0.1", "marked": "^4.3.0", "marked-gfm-heading-id": "^3.0.0", "request-progress": "^3.0.0", diff --git a/schemas/example-plugin-blueprint.json b/schemas/example-plugin-blueprint.json index 49d70209..d3e084d2 100644 --- a/schemas/example-plugin-blueprint.json +++ b/schemas/example-plugin-blueprint.json @@ -96,6 +96,96 @@ } }, "display_rotation": [90.0, 20.0, 0.0] + }, + { + "from": [0.0, 0.0, 0.0], + "to": [1.0, 1.0, 1.0], + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "origin": [0, 0, 0], + "rescale": false + }, + "faces": { + "north": { + "uv": [0, 0, 16, 16], + "texture_provider": { "type": "texture", "texture": "custom_texture" } + }, + "east": { + "uv": [0, 0, 16, 16], + "texture_provider": { + "type": "texture", + "texture": "reference_texture" + } + }, + "south": { + "uv": [0, 0, 16, 16], + "texture_provider": { "type": "texture", "texture": "custom_texture" }, + "rotation": 90 + }, + "west": { + "uv": [0, 0, 16, 16], + "texture_provider": { + "type": "texture", + "texture": "reference_texture" + } + }, + "up": { + "uv": [0, 0, 16, 16], + "texture_provider": { "type": "texture", "texture": "custom_texture" } + }, + "down": { + "uv": [0, 0, 16, 16], + "texture_provider": { + "type": "texture_palette", + "texture_palette": "default_palette" + } + } + }, + "display_rotation": [90.0, 20.0, 0.0] + }, + { + "from": [0.0, 0.0, 0.0], + "to": [1.0, 1.0, 1.0], + "rotation": [0, 0, 0], + "faces": { + "north": { + "uv": [0, 0, 16, 16], + "texture_provider": { "type": "texture", "texture": "custom_texture" } + }, + "east": { + "uv": [0, 0, 16, 16], + "texture_provider": { + "type": "texture", + "texture": "reference_texture" + } + }, + "south": { + "uv": [0, 0, 16, 16], + "texture_provider": { "type": "texture", "texture": "custom_texture" }, + "rotation": 90 + }, + "west": { + "uv": [0, 0, 16, 16], + "texture_provider": { + "type": "texture", + "texture": "reference_texture" + } + }, + "up": { + "uv": [0, 0, 16, 16], + "texture_provider": { "type": "texture", "texture": "custom_texture" } + }, + "down": { + "uv": [0, 0, 16, 16], + "texture_provider": { + "type": "texture_palette", + "texture_palette": "default_palette" + } + } + }, + "display_rotation": [90.0, 20.0, 0.0] } ] }, diff --git a/schemas/plugin-blueprint.schema.json b/schemas/plugin-blueprint.schema.json index f6d4dc2d..9d0f98e0 100644 --- a/schemas/plugin-blueprint.schema.json +++ b/schemas/plugin-blueprint.schema.json @@ -319,20 +319,49 @@ "$ref": "#/definitions/vector3" }, "rotation": { - "type": "object", - "required": ["angle", "axis", "origin"], - "properties": { - "angle": { - "type": "number" + "oneOf": [ + { + "type": "object", + "required": ["angle", "axis", "origin"], + "properties": { + "angle": { + "type": "number" + }, + "axis": { + "type": "string", + "enum": ["x", "y", "z"] + }, + "origin": { + "$ref": "#/definitions/vector3" + } + } }, - "axis": { - "type": "string", - "enum": ["x", "y", "z"] + { + "type": "object", + "required": ["x", "y", "z", "origin"], + "properties": { + "x": { + "type": "number" + }, + "y": { + "type": "number" + }, + "z": { + "type": "number" + }, + "origin": { + "$ref": "#/definitions/vector3" + }, + "rescale": { + "type": "boolean", + "default": false + } + } }, - "origin": { + { "$ref": "#/definitions/vector3" } - } + ] }, "shade": { "type": "boolean", diff --git a/src/assets/icons/impulse_command_block.png b/src/assets/icons/impulse_command_block.png new file mode 100644 index 00000000..6553b9c7 Binary files /dev/null and b/src/assets/icons/impulse_command_block.png differ diff --git a/src/assets/icons/papermc.svg b/src/assets/icons/papermc.svg new file mode 100644 index 00000000..6b44eda9 --- /dev/null +++ b/src/assets/icons/papermc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/blockbenchTypeMods.d.ts b/src/blockbenchTypeMods.d.ts index a7b8df22..47416cf5 100644 --- a/src/blockbenchTypeMods.d.ts +++ b/src/blockbenchTypeMods.d.ts @@ -1,7 +1,3 @@ -declare global { - const fs: typeof import('fs') -} - declare module 'three' { interface Object3D { isVanillaItemModel?: boolean diff --git a/src/components/animatedJavaLoadingPopup.svelte b/src/components/animatedJavaLoadingPopup.svelte deleted file mode 100644 index 0a9e9f45..00000000 --- a/src/components/animatedJavaLoadingPopup.svelte +++ /dev/null @@ -1,65 +0,0 @@ - - - - -
- {#if $offline} -
- {@html translate('popup.loading.offline') - .split('\n') - .map(v => '

' + v + '

') - .join('')} -
- {:else if $loaded} -
{translate('popup.loading.success')}
- {:else} -
-
{translate('popup.loading.loading')}
- Running Armor Stand -
- {#if $progressLabel !== '' || $progress !== 0} -
{$progressLabel}
- - {/if} - {/if} -
- - diff --git a/src/components/dialogItems/checkbox.svelte b/src/components/dialogItems/checkbox.svelte deleted file mode 100644 index be459128..00000000 --- a/src/components/dialogItems/checkbox.svelte +++ /dev/null @@ -1,43 +0,0 @@ - - - -
- -
-
- -
-
- - - diff --git a/src/components/dialogItems/codeInput.svelte b/src/components/dialogItems/codeInput.svelte deleted file mode 100644 index f86adfca..00000000 --- a/src/components/dialogItems/codeInput.svelte +++ /dev/null @@ -1,112 +0,0 @@ - - - -
- - -
- - {#if errorText || warningText} - - {/if} -
-
-
- - diff --git a/src/components/dialogItems/colorPicker.svelte b/src/components/dialogItems/colorPicker.svelte deleted file mode 100644 index 9df01944..00000000 --- a/src/components/dialogItems/colorPicker.svelte +++ /dev/null @@ -1,43 +0,0 @@ - - - -
- -
-
- diff --git a/src/components/dialogItems/fileSelect.svelte b/src/components/dialogItems/fileSelect.svelte deleted file mode 100644 index 1c5dcf37..00000000 --- a/src/components/dialogItems/fileSelect.svelte +++ /dev/null @@ -1,91 +0,0 @@ - - - -
- - - -
selectFile()}> - insert_drive_file -
-
-
- - diff --git a/src/components/dialogItems/folderSelect.svelte b/src/components/dialogItems/folderSelect.svelte deleted file mode 100644 index 527fec7e..00000000 --- a/src/components/dialogItems/folderSelect.svelte +++ /dev/null @@ -1,91 +0,0 @@ - - - -
- - - -
selectFile()}> - insert_drive_file -
-
-
- - diff --git a/src/components/dialogItems/lineInput.svelte b/src/components/dialogItems/lineInput.svelte deleted file mode 100644 index bea5337b..00000000 --- a/src/components/dialogItems/lineInput.svelte +++ /dev/null @@ -1,55 +0,0 @@ - - - -
- - -
-
- - diff --git a/src/components/dialogItems/numberSlider.svelte b/src/components/dialogItems/numberSlider.svelte deleted file mode 100644 index 5e321309..00000000 --- a/src/components/dialogItems/numberSlider.svelte +++ /dev/null @@ -1,94 +0,0 @@ - - - -
- -
- -
- code -
-
-
-
- - diff --git a/src/components/dialogItems/select.svelte b/src/components/dialogItems/select.svelte deleted file mode 100644 index 7e91bc73..00000000 --- a/src/components/dialogItems/select.svelte +++ /dev/null @@ -1,52 +0,0 @@ - - - -
- -
-
diff --git a/src/components/dialogItems/vector2d.svelte b/src/components/dialogItems/vector2d.svelte deleted file mode 100644 index 2947cd85..00000000 --- a/src/components/dialogItems/vector2d.svelte +++ /dev/null @@ -1,121 +0,0 @@ - - - -
- -
-
- -
- code -
-
-
- -
- code -
-
-
-
-
diff --git a/src/components/dialogItems/vector3d.svelte b/src/components/dialogItems/vector3d.svelte deleted file mode 100644 index ba5e985d..00000000 --- a/src/components/dialogItems/vector3d.svelte +++ /dev/null @@ -1,144 +0,0 @@ - - - -
- -
-
- -
- code -
-
-
- -
- code -
-
-
- -
- code -
-
-
-
-
diff --git a/src/components/displayEntityConfigDialog.svelte b/src/components/displayEntityConfigDialog.svelte deleted file mode 100644 index 238ea047..00000000 --- a/src/components/displayEntityConfigDialog.svelte +++ /dev/null @@ -1,238 +0,0 @@ - - - - - - - - - - -
- -
- - - - -
- {/if} - {:else} -
- {translate('panel.keyframe.nonlinear_interpolation')} -
- {/if} -{/if} - - diff --git a/src/constants.ts b/src/constants.ts index 472c888b..c3f6fe47 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,2 +1,12 @@ import PACKAGEJSON from '../package.json' +import { localize as translate } from './util/lang' export const PACKAGE: typeof PACKAGEJSON = PACKAGEJSON + +let cachedFsModule: ScopedFS | null = null +export function getFsModule() { + cachedFsModule ??= requireNativeModule('fs', { + message: translate('require.fs'), + optional: false, + })! + return cachedFsModule +} diff --git a/src/components/about.svelte b/src/dialogs/about/about.svelte similarity index 86% rename from src/components/about.svelte rename to src/dialogs/about/about.svelte index 4e76f816..4ff9c349 100644 --- a/src/components/about.svelte +++ b/src/dialogs/about/about.svelte @@ -1,12 +1,12 @@ -
- +

Animated Java

@@ -16,24 +16,24 @@ @@ -92,6 +92,9 @@
diff --git a/src/dialogs/blueprintSettings/pages/datapack.svelte b/src/dialogs/blueprintSettings/pages/datapack.svelte new file mode 100644 index 00000000..27f294ff --- /dev/null +++ b/src/dialogs/blueprintSettings/pages/datapack.svelte @@ -0,0 +1,125 @@ + + +
+ + + {#if dataPackExportFormat === 'folder'} + + {:else if dataPackExportFormat === 'zip'} + + {/if} + + {#if dataPackExportFormat !== 'none'} + + + + + + + + {/if} +
+ + diff --git a/src/dialogs/blueprintSettings/pages/eventFunctions.svelte b/src/dialogs/blueprintSettings/pages/eventFunctions.svelte new file mode 100644 index 00000000..aa174556 --- /dev/null +++ b/src/dialogs/blueprintSettings/pages/eventFunctions.svelte @@ -0,0 +1,58 @@ + + +
+ + + + + + + +
+ + diff --git a/src/dialogs/blueprintSettings/pages/general.svelte b/src/dialogs/blueprintSettings/pages/general.svelte new file mode 100644 index 00000000..d8187293 --- /dev/null +++ b/src/dialogs/blueprintSettings/pages/general.svelte @@ -0,0 +1,101 @@ + + +
+ + + + + + + + + +
+ + diff --git a/src/dialogs/blueprintSettings/pages/misc.svelte b/src/dialogs/blueprintSettings/pages/misc.svelte new file mode 100644 index 00000000..b49efcf9 --- /dev/null +++ b/src/dialogs/blueprintSettings/pages/misc.svelte @@ -0,0 +1,51 @@ + + +
+ + + + + {#if !autoRenderBox} + + {/if} +
+ + diff --git a/src/dialogs/blueprintSettings/pages/plugin.svelte b/src/dialogs/blueprintSettings/pages/plugin.svelte new file mode 100644 index 00000000..37dbc0d9 --- /dev/null +++ b/src/dialogs/blueprintSettings/pages/plugin.svelte @@ -0,0 +1,41 @@ + + +
+ + + +
+ + diff --git a/src/dialogs/blueprintSettings/pages/resourcepack.svelte b/src/dialogs/blueprintSettings/pages/resourcepack.svelte new file mode 100644 index 00000000..809f23d2 --- /dev/null +++ b/src/dialogs/blueprintSettings/pages/resourcepack.svelte @@ -0,0 +1,87 @@ + + +
+ + + {#if resourcePackExportFormat === 'folder'} + + {:else if resourcePackExportFormat === 'zip'} + + {/if} + + {#if resourcePackExportFormat !== 'none'} + {#if Project.animated_java.enable_plugin_mode || VersionUtil.compare('1.21.2', '>', Project.animated_java.target_minecraft_version)} + + {/if} + {/if} +
+ + diff --git a/src/components/changelogDialog.svelte b/src/dialogs/changelog/changelog.svelte similarity index 88% rename from src/components/changelogDialog.svelte rename to src/dialogs/changelog/changelog.svelte index 98003c9c..eece6b53 100644 --- a/src/components/changelogDialog.svelte +++ b/src/dialogs/changelog/changelog.svelte @@ -1,6 +1,6 @@ - + + + +
+ + + + + + +
+ +
+ + + + +
+
+ {/snippet} + + + diff --git a/src/svelteComponents/dialogItems/codeInput.svelte b/src/svelteComponents/dialogItems/codeInput.svelte new file mode 100644 index 00000000..c0093980 --- /dev/null +++ b/src/svelteComponents/dialogItems/codeInput.svelte @@ -0,0 +1,131 @@ + + + + {#snippet children({ id })} +
+ + +
+ + {#if errorText || warningText} + + {/if} +
+
+ {/snippet} +
+ + diff --git a/src/components/dialogItems/collection.svelte b/src/svelteComponents/dialogItems/collection.svelte similarity index 71% rename from src/components/dialogItems/collection.svelte rename to src/svelteComponents/dialogItems/collection.svelte index fcbdf2f4..30781fb7 100644 --- a/src/components/dialogItems/collection.svelte +++ b/src/svelteComponents/dialogItems/collection.svelte @@ -1,35 +1,53 @@ - + + + {#snippet children({ id })} +
+ +
+
+ {/snippet} +
diff --git a/src/components/dialogItems/dialogItemUtil.d.ts b/src/svelteComponents/dialogItems/dialogItemUtil.d.ts similarity index 52% rename from src/components/dialogItems/dialogItemUtil.d.ts rename to src/svelteComponents/dialogItems/dialogItemUtil.d.ts index d04230b1..414f5c29 100644 --- a/src/components/dialogItems/dialogItemUtil.d.ts +++ b/src/svelteComponents/dialogItems/dialogItemUtil.d.ts @@ -1,5 +1,7 @@ type DialogItemValueChecker = - | ((value: Value) => { type: string; message: string }) + | (( + value: Value + ) => { type: string; message: string } | Promise<{ type: string; message: string }>) | undefined interface CollectionItem { diff --git a/src/svelteComponents/dialogItems/fileSelect.svelte b/src/svelteComponents/dialogItems/fileSelect.svelte new file mode 100644 index 00000000..3bc59393 --- /dev/null +++ b/src/svelteComponents/dialogItems/fileSelect.svelte @@ -0,0 +1,100 @@ + + + + {#snippet children({ id })} +
+ + + +
selectFile()}> + insert_drive_file +
+
+ {/snippet} +
+ + diff --git a/src/svelteComponents/dialogItems/folderSelect.svelte b/src/svelteComponents/dialogItems/folderSelect.svelte new file mode 100644 index 00000000..0fc7a853 --- /dev/null +++ b/src/svelteComponents/dialogItems/folderSelect.svelte @@ -0,0 +1,93 @@ + + + + {#snippet children({ id })} +
+ + + +
selectFile()}> + insert_drive_file +
+
+ {/snippet} +
+ + diff --git a/src/svelteComponents/dialogItems/lineInput.svelte b/src/svelteComponents/dialogItems/lineInput.svelte new file mode 100644 index 00000000..58bf1476 --- /dev/null +++ b/src/svelteComponents/dialogItems/lineInput.svelte @@ -0,0 +1,64 @@ + + + + {#snippet children({ id })} +
+ + +
+ {/snippet} +
+ + diff --git a/src/components/dialogItems/multiSelect.svelte b/src/svelteComponents/dialogItems/multiSelect.svelte similarity index 97% rename from src/components/dialogItems/multiSelect.svelte rename to src/svelteComponents/dialogItems/multiSelect.svelte index 0799f76e..7c8b8d7a 100644 --- a/src/components/dialogItems/multiSelect.svelte +++ b/src/svelteComponents/dialogItems/multiSelect.svelte @@ -1,6 +1,6 @@ + + + {#snippet children({ id })} +
+ +
+ +
+ code +
+
+
+ {/snippet} +
+ + diff --git a/src/components/dialogItems/sectionHeader.svelte b/src/svelteComponents/dialogItems/sectionHeader.svelte similarity index 86% rename from src/components/dialogItems/sectionHeader.svelte rename to src/svelteComponents/dialogItems/sectionHeader.svelte index 5050ea22..1793fbe1 100644 --- a/src/components/dialogItems/sectionHeader.svelte +++ b/src/svelteComponents/dialogItems/sectionHeader.svelte @@ -1,5 +1,9 @@
diff --git a/src/svelteComponents/dialogItems/select.svelte b/src/svelteComponents/dialogItems/select.svelte new file mode 100644 index 00000000..1867f7ec --- /dev/null +++ b/src/svelteComponents/dialogItems/select.svelte @@ -0,0 +1,61 @@ + + + + {#snippet children({ id })} +
+ +
+ {/snippet} +
diff --git a/src/svelteComponents/dialogItems/vector2d.svelte b/src/svelteComponents/dialogItems/vector2d.svelte new file mode 100644 index 00000000..2cc042d9 --- /dev/null +++ b/src/svelteComponents/dialogItems/vector2d.svelte @@ -0,0 +1,141 @@ + + + + {#snippet children({ id })} +
+ +
+
+ +
+ code +
+
+
+ +
+ code +
+
+
+
+ {/snippet} +
diff --git a/src/svelteComponents/dialogItems/vector3d.svelte b/src/svelteComponents/dialogItems/vector3d.svelte new file mode 100644 index 00000000..90032659 --- /dev/null +++ b/src/svelteComponents/dialogItems/vector3d.svelte @@ -0,0 +1,167 @@ + + + + {#snippet children({ id })} +
+ +
+
+ +
+ code +
+
+
+ +
+ code +
+
+
+ +
+ code +
+
+
+
+ {/snippet} +
diff --git a/src/components/icon.svelte b/src/svelteComponents/icon.svelte similarity index 88% rename from src/components/icon.svelte rename to src/svelteComponents/icon.svelte index 1ba31025..ea2d0559 100644 --- a/src/components/icon.svelte +++ b/src/svelteComponents/icon.svelte @@ -1,4 +1,4 @@ - diff --git a/src/components/incompatiblePluginNotice.svelte b/src/svelteComponents/incompatiblePluginNotice.svelte similarity index 84% rename from src/components/incompatiblePluginNotice.svelte rename to src/svelteComponents/incompatiblePluginNotice.svelte index ea9e6231..34190394 100644 --- a/src/components/incompatiblePluginNotice.svelte +++ b/src/svelteComponents/incompatiblePluginNotice.svelte @@ -1,8 +1,8 @@ - + + + +{#if selectedKeyframe?.interpolation === 'linear'} +
+ + {#key easingType} +
+ {#each EASING_TYPES as ease} + + {/each} +
+ {/key} +
+ {#if selectedKeyframe.easing !== 'linear'} +
+ + {#key easingFunction} +
+ {#each EASING_MODES as mode} + + {/each} +
+ {/key} +
+ {/if} + {#if hasArgs(easingFunction)} +
+ + +
+ {/if} +{:else} +
+ {translate('panel.keyframe.nonlinear_interpolation')} +
+{/if} + + diff --git a/src/components/projectTitle.svelte b/src/svelteComponents/projectTitle.svelte similarity index 71% rename from src/components/projectTitle.svelte rename to src/svelteComponents/projectTitle.svelte index 55d6c814..d475c2e8 100644 --- a/src/components/projectTitle.svelte +++ b/src/svelteComponents/projectTitle.svelte @@ -1,11 +1,15 @@ - {#if $pluginMode} diff --git a/src/svelteComponents/sidebarDialogItems/baseSidebarDialogItem.svelte b/src/svelteComponents/sidebarDialogItems/baseSidebarDialogItem.svelte new file mode 100644 index 00000000..198cdf0b --- /dev/null +++ b/src/svelteComponents/sidebarDialogItems/baseSidebarDialogItem.svelte @@ -0,0 +1,129 @@ + + + + +
+
+
+ {#if label} + + {/if} +
+
+ {@render inlineChildren?.(ID)} +
+
+ {#if description} +

{@html description}

+ {/if} +
+ {@render children?.(ID)} +
+ {#if error} + + {:else if warning} + + {/if} +
+ + diff --git a/src/svelteComponents/sidebarDialogItems/boxSelect.svelte b/src/svelteComponents/sidebarDialogItems/boxSelect.svelte new file mode 100644 index 00000000..3a20c892 --- /dev/null +++ b/src/svelteComponents/sidebarDialogItems/boxSelect.svelte @@ -0,0 +1,99 @@ + + + + + + {#snippet children()} +
+ {#each Object.entries(options) as [key, option]} +
onItemClick(key)} + > + {#if option.type === 'image'} + {option.label} +
{option.label}
+ {:else if option.type === 'text'} +
{option.label}
+
{@html option.description}
+ {/if} +
+ {/each} +
+ {/snippet} +
+ + diff --git a/src/svelteComponents/sidebarDialogItems/checkbox.svelte b/src/svelteComponents/sidebarDialogItems/checkbox.svelte new file mode 100644 index 00000000..6b54bca3 --- /dev/null +++ b/src/svelteComponents/sidebarDialogItems/checkbox.svelte @@ -0,0 +1,30 @@ + + + + + + {#snippet inlineChildren(id)} +
+ + {/snippet} +
+ + diff --git a/src/svelteComponents/sidebarDialogItems/codeEdit.svelte b/src/svelteComponents/sidebarDialogItems/codeEdit.svelte new file mode 100644 index 00000000..931bf72f --- /dev/null +++ b/src/svelteComponents/sidebarDialogItems/codeEdit.svelte @@ -0,0 +1,43 @@ + + + + + + {#snippet children(id)} +
+ +
+ {/snippet} +
+ + diff --git a/src/svelteComponents/sidebarDialogItems/lineEdit.svelte b/src/svelteComponents/sidebarDialogItems/lineEdit.svelte new file mode 100644 index 00000000..05d3825f --- /dev/null +++ b/src/svelteComponents/sidebarDialogItems/lineEdit.svelte @@ -0,0 +1,110 @@ + + + + + + {#snippet children(id)} + + {#if defaultValue !== undefined} + + {/if} + {/snippet} + + + diff --git a/src/svelteComponents/sidebarDialogItems/numberSlider.svelte b/src/svelteComponents/sidebarDialogItems/numberSlider.svelte new file mode 100644 index 00000000..3ac1bd81 --- /dev/null +++ b/src/svelteComponents/sidebarDialogItems/numberSlider.svelte @@ -0,0 +1,146 @@ + + + + + + {#snippet children(id)} +
+
+ onFocusOut(input!, min, max)} + /> +
onMousedown(input!, e)} + ontouchstart={e => onMousedown(input!, e)} + > + code +
+
+
+ {/snippet} +
+ + diff --git a/src/svelteComponents/sidebarDialogItems/selectFile.svelte b/src/svelteComponents/sidebarDialogItems/selectFile.svelte new file mode 100644 index 00000000..5d96ada9 --- /dev/null +++ b/src/svelteComponents/sidebarDialogItems/selectFile.svelte @@ -0,0 +1,123 @@ + + + + + + {#snippet children(id)} + + selectFile(id)}> + {/snippet} + + + diff --git a/src/svelteComponents/sidebarDialogItems/selectFolder.svelte b/src/svelteComponents/sidebarDialogItems/selectFolder.svelte new file mode 100644 index 00000000..a4a2862b --- /dev/null +++ b/src/svelteComponents/sidebarDialogItems/selectFolder.svelte @@ -0,0 +1,107 @@ + + + + + + {#snippet children(id)} + + selectFolder(id)}> + {/snippet} + + + diff --git a/src/svelteComponents/sidebarDialogItems/sidebarDialogTypes.d.ts b/src/svelteComponents/sidebarDialogItems/sidebarDialogTypes.d.ts new file mode 100644 index 00000000..0ccd853b --- /dev/null +++ b/src/svelteComponents/sidebarDialogItems/sidebarDialogTypes.d.ts @@ -0,0 +1,6 @@ +export type ValueCheckResult = + | { + type: 'error' | 'warning' + message: string + } + | undefined diff --git a/src/svelteComponents/sidebarDialogItems/vector2.svelte b/src/svelteComponents/sidebarDialogItems/vector2.svelte new file mode 100644 index 00000000..0b6fb6de --- /dev/null +++ b/src/svelteComponents/sidebarDialogItems/vector2.svelte @@ -0,0 +1,177 @@ + + + + + + {#snippet children(id)} +
+
+ onFocusOut(inputX!, minX, maxX)} + /> +
onMousedown(inputX!, e)} + ontouchstart={e => onMousedown(inputX!, e)} + > + code +
+
+ +
+ onFocusOut(inputY!, minY, maxY)} + /> +
onMousedown(inputY!, e)} + ontouchstart={e => onMousedown(inputY!, e)} + > + code +
+
+
+ {/snippet} +
+ + diff --git a/src/systems/animationRenderer.ts b/src/systems/animationRenderer.ts index fd3a5450..67ea1cb8 100644 --- a/src/systems/animationRenderer.ts +++ b/src/systems/animationRenderer.ts @@ -1,6 +1,10 @@ -import * as crypto from 'crypto' -import { BONE_INTERPOLATION_ENABLED } from 'src/mods/boneAnimatorMod' -import { MAX_PROGRESS, PROGRESS, PROGRESS_DESCRIPTION } from '../interface/dialog/exportProgress' +import * as crypto from 'node:crypto' +import { + MAX_PROGRESS, + PROGRESS, + PROGRESS_DESCRIPTION, +} from '../dialogs/exportProgress/exportProgress' +import { BONE_INTERPOLATION_ENABLED } from '../mods/boneAnimatorMod' import { TextDisplay } from '../outliner/textDisplay' import { VanillaBlockDisplay } from '../outliner/vanillaBlockDisplay' import { VanillaItemDisplay } from '../outliner/vanillaItemDisplay' @@ -293,15 +297,16 @@ export function updatePreview(animation: _Animation, time: number) { ...VanillaItemDisplay.all, ] if (OutlinerElement.types.camera) { + // @ts-expect-error - Broken BB types nodes.push(...OutlinerElement.types.camera.all) } for (const node of nodes) { if (!(node.constructor as any).animator) continue Animator.resetLastValues() - animation.getBoneAnimator(node).displayFrame() + animation.getBoneAnimator(node)!.displayFrame() } Animator.resetLastValues() - scene.updateMatrixWorld() + Canvas.scene.updateMatrixWorld() if (animation.effects) animation.effects.displayFrame() // Blockbench.dispatchEvent('display_animation_frame') } @@ -375,6 +380,7 @@ export function getAnimatableNodes(): OutlinerElement[] { ...TextDisplay.all, ...VanillaBlockDisplay.all, ...VanillaItemDisplay.all, + // @ts-expect-error - Broken BB types ...(OutlinerElement.types.camera ? OutlinerElement.types.camera.all : []), ] } diff --git a/src/systems/cleaner.ts b/src/systems/cleaner.ts index 7bcbb271..ca1aed0c 100644 --- a/src/systems/cleaner.ts +++ b/src/systems/cleaner.ts @@ -1,3 +1,4 @@ +import { getFsModule } from '../constants' import { isFunctionTagPath } from '../util/fileUtil' import { type FunctionTagJSON, parseDataPackPath } from '../util/minecraftUtil' import { getExportPaths } from './exporter' @@ -13,13 +14,15 @@ export async function cleanupExportedFiles() { // modelExportFolder, // displayItemPath, } = getExportPaths() + const { existsSync, promises } = getFsModule() + const { unlink, mkdir, copyFile, readFile, writeFile, readdir, rm } = promises if (aj.resource_pack_export_mode === 'folder') { const assetsMetaPath = PathModule.join(resourcePackFolder, 'assets.ajmeta') const assetsMeta = new AJMeta( assetsMetaPath, - aj.export_namespace, - Project!.last_used_export_namespace, + aj.blueprint_id, + Project!.last_used_blueprint_id, resourcePackFolder ) assetsMeta.read() @@ -30,32 +33,32 @@ export async function cleanupExportedFiles() { const removedFolders = new Set() for (const file of assetsMeta.previousVersionedFiles) { if (!isFunctionTagPath(file)) { - if (fs.existsSync(file)) await fs.promises.unlink(file) - } else if (aj.export_namespace !== Project!.last_used_export_namespace) { + if (existsSync(file)) await unlink(file) + } else if (aj.blueprint_id !== Project!.last_used_blueprint_id) { const resourceLocation = parseDataPackPath(file)!.resourceLocation if ( resourceLocation.startsWith( - `animated_java:${Project!.last_used_export_namespace}/` + `animated_java:${Project!.last_used_blueprint_id}/` ) && - fs.existsSync(file) + existsSync(file) ) { const newPath = replacePathPart( file, - Project!.last_used_export_namespace, - aj.export_namespace + Project!.last_used_blueprint_id, + aj.blueprint_id ) - await fs.promises.mkdir(PathModule.dirname(newPath), { recursive: true }) - await fs.promises.copyFile(file, newPath) - await fs.promises.unlink(file) + await mkdir(PathModule.dirname(newPath), { recursive: true }) + await copyFile(file, newPath) + await unlink(file) } } let folder = PathModule.dirname(file) while ( !removedFolders.has(folder) && - fs.existsSync(folder) && - (await fs.promises.readdir(folder)).length === 0 + existsSync(folder) && + (await readdir(folder)).length === 0 ) { - await fs.promises.rm(folder, { recursive: true }) + await rm(folder, { recursive: true }) removedFolders.add(folder) folder = PathModule.dirname(folder) if (PathModule.basename(folder) === 'assets') break @@ -70,8 +73,8 @@ export async function cleanupExportedFiles() { const dataMetaPath = PathModule.join(dataPackFolder, 'data.ajmeta') const dataMeta = new AJMeta( dataMetaPath, - aj.export_namespace, - Project!.last_used_export_namespace, + aj.blueprint_id, + Project!.last_used_blueprint_id, dataPackFolder ) dataMeta.read() @@ -81,46 +84,44 @@ export async function cleanupExportedFiles() { // MAX_PROGRESS.set(dataMeta.oldFiles.size) const removedFolders = new Set() for (const file of [...dataMeta.previousCoreFiles, ...dataMeta.previousVersionedFiles]) { - if (isFunctionTagPath(file) && fs.existsSync(file)) { - if (aj.export_namespace !== Project!.last_used_export_namespace) { + if (isFunctionTagPath(file) && existsSync(file)) { + if (aj.blueprint_id !== Project!.last_used_blueprint_id) { const resourceLocation = parseDataPackPath(file)!.resourceLocation if ( resourceLocation.startsWith( - `animated_java:${Project!.last_used_export_namespace}/` + `animated_java:${Project!.last_used_blueprint_id}/` ) ) { const newPath = replacePathPart( file, - Project!.last_used_export_namespace, - aj.export_namespace + Project!.last_used_blueprint_id, + aj.blueprint_id ) - await fs.promises.mkdir(PathModule.dirname(newPath), { recursive: true }) - await fs.promises.copyFile(file, newPath) - await fs.promises.unlink(file) + await mkdir(PathModule.dirname(newPath), { recursive: true }) + await copyFile(file, newPath) + await unlink(file) } } // Remove mentions of the export namespace from the file - const content: FunctionTagJSON = JSON.parse( - (await fs.promises.readFile(file)).toString() - ) + const content: FunctionTagJSON = JSON.parse((await readFile(file)).toString()) content.values = content.values.filter( v => typeof v === 'string' && - (!v.startsWith(`animated_java:${aj.export_namespace}/`) || - !v.startsWith(`animated_java:${Project!.last_used_export_namespace}/`)) + (!v.startsWith(`animated_java:${aj.blueprint_id}/`) || + !v.startsWith(`animated_java:${Project!.last_used_blueprint_id}/`)) ) - await fs.promises.writeFile(file, autoStringify(content)) + await writeFile(file, autoStringify(content)) } else { // Delete the file - if (fs.existsSync(file)) await fs.promises.unlink(file) + if (existsSync(file)) await unlink(file) } let folder = PathModule.dirname(file) while ( !removedFolders.has(folder) && - fs.existsSync(folder) && - (await fs.promises.readdir(folder)).length === 0 + existsSync(folder) && + (await readdir(folder)).length === 0 ) { - await fs.promises.rm(folder, { recursive: true }) + await rm(folder, { recursive: true }) removedFolders.add(folder) folder = PathModule.dirname(folder) if (PathModule.basename(folder) === 'data') break diff --git a/src/systems/datapackCompiler/1.20.4/animation.mcb b/src/systems/datapackCompiler/1.20.4/animation.mcb index 0d89a76b..2885f197 100644 --- a/src/systems/datapackCompiler/1.20.4/animation.mcb +++ b/src/systems/datapackCompiler/1.20.4/animation.mcb @@ -1,5 +1,4 @@ # TODO - Move all internal functions into an internal namespace, and only have user-facing functions in the main `animated_java:<%export_namespace%>` namespace. -import ../global.mcbt function on_load { data modify storage <%project_storage%> rig_hash set value <%"'" + rig_hash + "'"%> @@ -26,14 +25,8 @@ function remove_animation_objectives { tellraw @a <%TELLRAW.UNINSTALL()%> } -function invalid_version_warning { - # This function will contain a tellraw if the datapack is loaded in the wrong version. -} - dir root { function on_tick { - execute unless entity @s[tag=<%TAGS.PROJECT_ROOT(export_namespace)%>] run return 0 - # Custom pre-tick function IF (on_pre_tick_function) { <%% @@ -41,38 +34,35 @@ dir root { %%> } + # animated_java:global/root/on_tick already runs this right before calling this function. + # data_manager prep read + # Once we have more than 8 animations, calling a function only if at least one animation is playing is more efficient. IF (animations.length > 8) { # If no animations are playing, we can skip all animation logic. # This helps reduce ticking commands for rigs that are idle. execute \ - unless entity @s[<%animations.map(anim => 'tag=!' + TAGS.ANIMATION_PLAYING(export_namespace, anim.storage_name)).join(',')%>] \ + unless entity @s[<%animations.map(anim => 'tag=!' + TAGS.ANIMATION_PLAYING(blueprint_id, anim.storage_name)).join(',')%>] \ run block tick_animations { REPEAT (animations) as animation { - execute if entity @s[tag=<%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%>] run \ - function *<%export_namespace%>/animations/<%animation.storage_name%>/zzz/on_tick + execute if entity @s[tag=<%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%>] run \ + function <%blueprint_id%>/animations/<%animation.storage_name%>/zzz/on_tick } } } ELSE { REPEAT (animations) as animation { - execute if entity @s[tag=<%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%>] run \ - function *<%export_namespace%>/animations/<%animation.storage_name%>/zzz/on_tick + execute if entity @s[tag=<%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%>] run \ + function <%blueprint_id%>/animations/<%animation.storage_name%>/zzz/on_tick } } IF (auto_update_rig_orientation) { IF (has_locators || has_cameras) { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run function ./on_tick/transform_floating_entities + function <%blueprint_id%>/root/on_tick/transform_floating_entities } execute on passengers run tp @s ~ ~ ~ ~ ~ } ELSE IF (has_ticking_locators) { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run function ./on_tick/transform_locators + function <%blueprint_id%>/root/on_tick/transform_locators } # Custom post-tick function @@ -87,7 +77,7 @@ dir root { dir on_tick { function transform_locators { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - block select_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> + block select_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> IF (locator.config?.use_entity) { $execute \ as $(uuid) \ @@ -124,7 +114,7 @@ dir root { function ./transform_locators REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - block select_camera_<%camera.storage_name%> { with entity @s data.cameras.<%camera.storage_name%> + block select_camera_<%camera.storage_name%> { with storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> $execute \ as $(uuid) \ positioned ^$(px) ^$(py) ^$(pz) \ @@ -139,15 +129,13 @@ dir root { IF (!auto_update_rig_orientation) { function move { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> tp @s ~ ~ ~ ~ ~ IF (has_locators || has_cameras) { - execute \ - at @s on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run function ./on_tick/transform_floating_entities + data_manager prep read + function <%blueprint_id%>/root/on_tick/transform_floating_entities } execute at @s on passengers run tp @s ~ ~ ~ ~ ~ } @@ -161,11 +149,11 @@ dir animations { REPEAT (animations) as animation { dir <%animation.storage_name%> { function play { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> - function *<%export_namespace%>/animations/pause_all + function <%blueprint_id%>/animations/pause_all - tag @s add <%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%> + tag @s add <%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%> scoreboard players set @s <%OBJECTIVES.FRAME(animation.storage_name)%> 0 tag @s add <%TAGS.TRANSFORMS_ONLY()%> execute at @s run function ./zzz/set_frame {frame: 0} @@ -173,9 +161,9 @@ dir animations { } function stop { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> - function *<%export_namespace%>/animations/pause_all + function <%blueprint_id%>/animations/pause_all scoreboard players set @s <%OBJECTIVES.FRAME(animation.storage_name)%> 0 tag @s add <%TAGS.TRANSFORMS_ONLY()%> @@ -184,19 +172,19 @@ dir animations { } function pause { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> - tag @s remove <%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%> + tag @s remove <%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%> } function resume { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> - tag @s add <%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%> + tag @s add <%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%> } function next_frame { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> execute if score @s <%OBJECTIVES.FRAME(animation.storage_name)%> matches <%animation.duration%>.. run scoreboard players set @s <%OBJECTIVES.FRAME(animation.storage_name)%> 1 data remove storage <%temp_storage%> args @@ -208,7 +196,9 @@ dir animations { function set_frame { # Sets the frame without interpolation #ARGS: {frame: int} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + data_manager prep read data remove storage <%temp_storage%> args $execute store result storage <%temp_storage%> args.frame int 1 run scoreboard players set @s <%OBJECTIVES.FRAME(animation.storage_name)%> $(frame) @@ -217,7 +207,9 @@ dir animations { function apply_frame { #ARGS: {frame: int} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + data_manager prep read data remove storage <%temp_storage%> args $execute store result storage <%temp_storage%> args.frame int 1 run scoreboard players set @s <%OBJECTIVES.FRAME(animation.storage_name)%> $(frame) @@ -227,11 +219,11 @@ dir animations { function tween { # Attempts to smoothly transition from the currently playing animation into this one. #ARGS: {duration: int, to_frame: int} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> - function *<%export_namespace%>/animations/pause_all + function <%blueprint_id%>/animations/pause_all - tag @s add <%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%> + tag @s add <%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%> $scoreboard players set @s <%OBJECTIVES.TWEEN_DURATION()%> $(duration) $scoreboard players set @s <%OBJECTIVES.FRAME(animation.storage_name)%> $(to_frame) @@ -255,7 +247,7 @@ dir animations { # Makes sure function keyframes in the last frame of the animation are activated. execute if score @s <%OBJECTIVES.FRAME(animation.storage_name)%> matches -1 run \ block function_keyframe_loop_patch { - function ./apply_frame {frame: <%animation.duration-1%>} + function ./frames/last_frame_effects with storage <%temp_storage%> entry.data.uuids_by_name scoreboard players add @s <%OBJECTIVES.FRAME(animation.storage_name)%> 1 } } @@ -288,7 +280,7 @@ dir animations { tag @s add <%TAGS.TRANSFORMS_ONLY()%> execute at @s run function ./zzz/set_frame {frame: 0} tag @s remove <%TAGS.TRANSFORMS_ONLY()%> - tag @s remove <%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%> + tag @s remove <%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%> } } scoreboard players add @s <%OBJECTIVES.FRAME(animation.storage_name)%> 1 @@ -298,7 +290,7 @@ dir animations { function set_frame { #ARGS: {frame: int} $function ./apply_frame {frame: $(frame)} - execute on passengers run data modify entity @s[tag=!<%TAGS.GLOBAL_DATA()%>] start_interpolation set value -1 + execute on passengers run data modify entity @s start_interpolation set value -1 return 1 } @@ -306,12 +298,11 @@ dir animations { #ARGS: {frame: int} REPEAT (Object.values(animation.modified_nodes).sort(nodeSorter)) as node { IF (BONE_TYPES.includes(node.type)) { - $execute on passengers if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] run \ + $execute on passengers if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] run \ data modify entity @s {} merge from \ storage <%project_storage%>/animations <%animation.storage_name%>.$(frame).<%node.storage_name%> } ELSE IF (node.type === 'locator' || node.type === 'camera') { - $execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run \ - $data modify entity @s data.uuids_by_name.<%node.storage_name%> merge from \ + $data modify storage <%temp_storage%> entry.data.uuids_by_name.<%node.storage_name%> merge from \ storage <%project_storage%>/animations <%animation.storage_name%>.$(frame).<%node.storage_name%> } } @@ -322,7 +313,7 @@ dir animations { unless entity @s[tag=<%TAGS.TRANSFORMS_ONLY()%>] \ run { with storage <%project_storage%>/animations <%animation.storage_name%>.$(frame).variant #ARGS: {name: string, condition: string} - $execute $(condition)run function *<%export_namespace%>/variants/$(name)/apply + $execute $(condition)run function <%blueprint_id%>/variants/$(name)/apply } } @@ -332,10 +323,10 @@ dir animations { function set_frame { # Sets the frame without interpolation #ARGS: {frame: int} - $execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run \ - function ./frames/$(frame) with entity @s data.uuids_by_name - execute on passengers if entity @s[tag=!<%TAGS.GLOBAL_DATA()%>] run \ + $function ./frames/$(frame) with storage <%temp_storage%> entry.data.uuids_by_name + + execute on passengers run \ data modify entity @s start_interpolation set value -1 return 1 @@ -343,14 +334,67 @@ dir animations { function apply_frame { #ARGS: {frame: int} - $execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run \ - function ./frames/$(frame) with entity @s data.uuids_by_name + + $function ./frames/$(frame) with storage <%temp_storage%> entry.data.uuids_by_name return 1 } # FIXME - %NEWLINE_PATCH% is a temporary solution to temporarily fix an MCB bug where extra newlines are being added to the output. dir frames { + <%% + global.frame = animation.frames.at(-1) + global.modified_effect_nodes = Object.values(animation.modified_nodes).filter( + node => node.type === 'locator' && global.frame.node_transforms[node.uuid] + ) + console.log(global.modified_effect_nodes) + %%> + IF(Object.keys(global.modified_effect_nodes).length > 0) { + function last_frame_effects { + REPEAT(global.modified_effect_nodes) as node { + <%% + global.transform = global.frame.node_transforms[node.uuid] + %%> + IF (node.config?.use_entity) { + $execute \ + as $(<%node.storage_name%>) \ + positioned \ + ^<%roundTo(global.transform.pos[0], 10)%> \ + ^<%roundTo(global.transform.pos[1], 10)%> \ + ^<%roundTo(global.transform.pos[2], 10)%> \ + rotated \ + ~<%roundTo(global.transform.head_rot[1], 10)%> \ + ~<%roundTo(global.transform.head_rot[0], 10)%> \ + <%global.transform.function_execute_condition ? global.transform.function_execute_condition + ' ' : ''%>run \ + function ./<%animation.duration%>_locator_<%node.storage_name%> + } ELSE { + execute \ + positioned \ + ^<%roundTo(global.transform.pos[0], 10)%> \ + ^<%roundTo(global.transform.pos[1], 10)%> \ + ^<%roundTo(global.transform.pos[2], 10)%> \ + rotated \ + ~<%roundTo(global.transform.head_rot[1], 10)%> \ + ~<%roundTo(global.transform.head_rot[0], 10)%> \ + <%global.transform.function_execute_condition ? global.transform.function_execute_condition + ' ' : ''%>run \ + function ./<%animation.duration%>_locator_<%node.storage_name%> + } + } + + IF (global.frame.variants?.length > 0) { + execute <%global.frame.variants_execute_condition ? global.frame.variants_execute_condition + ' ' : ''%>run \ + function <%blueprint_id%>/variants/<%global.frame.variants[0].name%>/apply + } + + IF (global.frame.function) { + execute <%global.frame.function_execute_condition ? global.frame.function_execute_condition + ' ' : ''%>run \ + block <%animation.duration%>_function_keyframe { + <%global.frame.function%> + } + } + } + } + <%% // A record of node uuid to INodeTransform. // Keeps track of the last time a bone was updated. @@ -409,7 +453,7 @@ dir animations { if (transform.function) { if (node.config?.use_entity) { frameFunc += - `\n$execute on vehicle unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] as $(${node.storage_name}) ` + `\n$execute unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] as $(${node.storage_name}) ` + `positioned ^${roundTo(transform.pos[0], 10)} ^${roundTo(transform.pos[1], 10)} ^${roundTo(transform.pos[2], 10)} ` + `rotated ~${roundTo(transform.head_rot[1], 10)} ~${roundTo(transform.head_rot[0], 10)} ` + `${transform.function_execute_condition ? transform.function_execute_condition + ' ' : ''}run ` @@ -419,7 +463,7 @@ dir animations { + `\n}` } else { frameFunc += - `\nexecute on vehicle unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] ` + `\nexecute unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] ` + `positioned ^${roundTo(transform.pos[0], 10)} ^${roundTo(transform.pos[1], 10)} ^${roundTo(transform.pos[2], 10)} ` + `rotated ~${roundTo(transform.head_rot[1], 10)} ~${roundTo(transform.head_rot[0], 10)} ` + `${transform.function_execute_condition ? transform.function_execute_condition + ' ' : ''}run ` @@ -448,9 +492,10 @@ dir animations { } if (Object.keys(to_merge.locators).length > 0 || Object.keys(to_merge.cameras).length > 0) { - frameFunc += `\ndata modify entity @s data merge value ${JSON.stringify(to_merge)}` + frameFunc += `\ndata modify storage <%temp_storage%> entry.data merge value ${JSON.stringify(to_merge)}` + frameFunc += `\ndata_manager write` if (!auto_update_rig_orientation) { - frameFunc += `\nfunction ./on_tick/transform_floating_entities` + frameFunc += `\nfunction ${blueprint_id}/root/on_tick/transform_floating_entities` } hasFunction = true } @@ -461,14 +506,14 @@ dir animations { throw new Error(`Could not find Variant with uuid "${frame.variants[0]}" while generating frame "${frameIndex}" of animation "${animation.name}".`) } const execute_condition = frame.variants_execute_condition ? frame.variants_execute_condition + ' ' : '' - frameFunc += `\nexecute on vehicle unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] ${execute_condition}run function *${export_namespace}/variants/${variant.name}/apply` + frameFunc += `\nexecute unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] ${execute_condition}run function ${blueprint_id}/variants/${variant.name}/apply` ;hasFunction = true } // Root function keyframes. if (frame.function) { const execute_condition = frame.function_execute_condition ? frame.function_execute_condition + ' ' : '' - frameFunc += `\nexecute on vehicle unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] at @s ${execute_condition}run block ${frameIndex}_root_function%NEWLINE_PATCH%{\n${frame.function}\n}` + frameFunc += `\nexecute unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] at @s ${execute_condition}run block ${frameIndex}_root_function%NEWLINE_PATCH%{\n${frame.function}\n}` ;hasFunction = true } ;if (frameFunc.length > 0) { @@ -484,10 +529,10 @@ dir animations { } function pause_all { # Pauses all animations - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> REPEAT (animations) as animation { - tag @s remove <%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%> + tag @s remove <%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%> } } } @@ -504,97 +549,112 @@ function summon { '<%TAGS.NEW()%>', \ '<%TAGS.GLOBAL_ENTITY()%>', \ '<%TAGS.GLOBAL_ROOT()%>', \ - '<%TAGS.PROJECT_ENTITY(export_namespace)%>', \ - '<%TAGS.PROJECT_ROOT(export_namespace)%>' \ + '<%TAGS.PROJECT_ENTITY(blueprint_id)%>', \ + '<%TAGS.PROJECT_ROOT(blueprint_id)%>' \ ], \ teleport_duration: 0, \ interpolation_duration: <%interpolation_duration%>, \ Passengers:<%root_entity_passengers%>, \ + CustomName: '<%ENTITY_NAMES.ROOT(blueprint_id)%>', \ } execute as @e[ \ type=minecraft:item_display, \ - tag=<%TAGS.PROJECT_ROOT(export_namespace)%>, \ + tag=<%TAGS.PROJECT_ROOT(blueprint_id)%>, \ tag=<%TAGS.NEW()%>, \ limit=1, distance=..0.01 \ ] run block zzz/summon/as_root_entity { execute store result score @s <%OBJECTIVES.ID()%> run scoreboard players add aj.last_id <%OBJECTIVES.ID()%> 1 + + data_manager init prep read + # Data manager init runs gu:get_entity_uuid_string. So we don't need to call it again here. + # function animated_java:global/gu/get_entity_uuid_string + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.root_uuid set from storage <%gu_storage%> out + + data modify storage <%temp_storage%> entry.data.blueprint_id set value "<%blueprint_id%>" + data modify storage <%temp_storage%> entry.data.rig_hash set value "<%rig_hash%>" + # Align the position and rotation of the root with the command context. tp @s ~ ~ ~ ~ ~ - function *global/gu/get_entity_uuid_string - execute at @s on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block as_data_entity { - # Rig Root UUID - data modify storage <%temp_storage%> root_uuid set from storage <%gu_storage%> out - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.root_uuid set from storage <%gu_storage%> out - # Data Entity UUID - function *global/gu/get_entity_uuid_string - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.data_data set from storage <%gu_storage%> out + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { + summon <%locator.config.entity_type%> \ + ^<%roundTo(locator.default_transform.pos[0], 10)%> \ + ^<%roundTo(locator.default_transform.pos[1], 10)%> \ + ^<%roundTo(locator.default_transform.pos[2], 10)%> \ + {Tags:<%getNodeTags(locator, rig)%>} + execute \ + as @e[ \ + type=<%locator.config.entity_type%>, \ + tag=<%TAGS.PROJECT_LOCATOR_NAMED(blueprint_id, locator.storage_name)%>, \ + tag=<%TAGS.NEW()%>, \ + limit=1, distance=..<%Math.ceil(locator.max_distance)%> \ + ] \ + run block as_locator/<%locator.storage_name%> { + # run block ../as_locator/<%locator.storage_name%> { + tag @s remove <%TAGS.NEW()%> + data modify entity @s CustomName set value '<%ENTITY_NAMES.NODE(blueprint_id, locator.type, locator.storage_name)%>' + function animated_java:global/gu/get_entity_uuid_string + scoreboard players operation @s <%OBJECTIVES.ID()%> = aj.last_id <%OBJECTIVES.ID()%> + } + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids_by_name.<%locator.storage_name%> set from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.locators.<%locator.storage_name%>.uuid set from storage <%gu_storage%> out + } - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - summon <%locator.config.entity_type%> \ - ^<%roundTo(locator.default_transform.pos[0], 10)%> \ - ^<%roundTo(locator.default_transform.pos[1], 10)%> \ - ^<%roundTo(locator.default_transform.pos[2], 10)%> \ - {Tags:<%getNodeTags(locator, rig)%>} - execute \ - as @e[ \ - type=<%locator.config.entity_type%>, \ - tag=<%TAGS.PROJECT_LOCATOR_NAMED(export_namespace, locator.storage_name)%>, \ - tag=<%TAGS.NEW()%>, \ - limit=1, distance=..<%Math.ceil(locator.max_distance)%> \ - ] \ - run block as_locator/<%locator.storage_name%> { - # run block ../as_locator/<%locator.storage_name%> { - tag @s remove <%TAGS.NEW()%> - function *global/gu/get_entity_uuid_string - data modify entity @s data.root_uuid set from storage <%temp_storage%> root_uuid - } - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.<%locator.storage_name%> set from storage <%gu_storage%> out - data modify entity @s data.locators.<%locator.storage_name%>.uuid set from storage <%gu_storage%> out + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { + summon minecraft:item_display \ + ^<%roundTo(camera.default_transform.pos[0], 10)%> \ + ^<%roundTo(camera.default_transform.pos[1], 10)%> \ + ^<%roundTo(camera.default_transform.pos[2], 10)%> \ + {Tags:<%getNodeTags(camera, rig)%>, teleport_duration: 2} + execute \ + as @e[ \ + type=minecraft:item_display, \ + tag=<%TAGS.PROJECT_CAMERA_NAMED(blueprint_id, camera.storage_name)%>, \ + tag=<%TAGS.NEW()%>, \ + limit=1, distance=..<%Math.ceil(camera.max_distance)%> \ + ] \ + run block as_camera/<%camera.storage_name%> { + # run block ../as_camera/<%camera.storage_name%> { + tag @s remove <%TAGS.NEW()%> + data modify entity @s CustomName set value '<%ENTITY_NAMES.NODE(blueprint_id, camera.type, camera.storage_name)%>' + function animated_java:global/gu/get_entity_uuid_string + scoreboard players operation @s <%OBJECTIVES.ID()%> = aj.last_id <%OBJECTIVES.ID()%> } + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids_by_name.<%camera.storage_name%> set from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%>.uuid set from storage <%gu_storage%> out + } - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - summon minecraft:item_display \ - ^<%roundTo(camera.default_transform.pos[0], 10)%> \ - ^<%roundTo(camera.default_transform.pos[1], 10)%> \ - ^<%roundTo(camera.default_transform.pos[2], 10)%> \ - {Tags:<%getNodeTags(camera, rig)%>, teleport_duration: 2} - execute \ - as @e[ \ - type=minecraft:item_display, \ - tag=<%TAGS.PROJECT_CAMERA_NAMED(export_namespace, camera.storage_name)%>, \ - tag=<%TAGS.NEW()%>, \ - limit=1, distance=..<%Math.ceil(camera.max_distance)%> \ - ] \ - run block as_camera/<%camera.storage_name%> { - # run block ../as_camera/<%camera.storage_name%> { - tag @s remove <%TAGS.NEW()%> - function *global/gu/get_entity_uuid_string - data modify entity @s data.root_uuid set from storage <%temp_storage%> root_uuid - } - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.<%camera.storage_name%> set from storage <%gu_storage%> out - data modify entity @s data.cameras.<%camera.storage_name%>.uuid set from storage <%gu_storage%> out + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + execute \ + on passengers \ + if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ + run block as_node/<%node.storage_name%> { + data modify entity @s CustomName set value '<%ENTITY_NAMES.NODE(blueprint_id, node.type, node.storage_name)%>' + function animated_java:global/gu/get_entity_uuid_string + scoreboard players operation @s <%OBJECTIVES.ID()%> = aj.last_id <%OBJECTIVES.ID()%> } - REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { - execute \ - on vehicle \ - on passengers \ - if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ - run block as_node/<%node.storage_name%> { - function *global/gu/get_entity_uuid_string - data modify entity @s data.root_uuid set from storage <%temp_storage%> root_uuid - } + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids_by_name.<%node.storage_name%> set from storage <%gu_storage%> out + } - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.<%node.storage_name%> set from storage <%gu_storage%> out + IF (has_entity_locators) { + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { + block { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + # Track any custom entities on the locator. + $execute at @s as $(uuid) at @s run function animated_java:global/util/get_entity_stack_uuids + } + data modify storage <%temp_storage%> entry.data.uuids append from storage <%temp_storage%> uuids } } + function <%blueprint_id%>/zzz/set_default_pose + + data_manager write + # Variant Arguement IF (Object.keys(rig.variants).length > 1) { execute if data storage <%temp_storage%> args.variant run block variant_arg/process { with storage <%temp_storage%> args @@ -603,12 +663,12 @@ function summon { execute if data storage <%temp_storage%> {args:{variant:''}} run return run block if_empty { # Tell the user that the variant cannot be empty. tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('variant')%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function } # Attempt to apply the requested variant. # We get the success of the `try_apply` function in just in case the user's arguments are *very* wrong. execute store success score #success <%OBJECTIVES.I()%> run block try_apply { with storage <%temp_storage%> args - $execute if function animated_java:<%export_namespace%>/variants/$(variant)/apply run return 1 + $execute if function <%blueprint_id%>/variants/$(variant)/apply run return 1 # If the apply function fails, the variant doesn't exist, so we return an error. return fail } @@ -616,21 +676,19 @@ function summon { execute unless score #success <%OBJECTIVES.I()%> matches 1 run return run block invalid_variant { # Tell the user that the provided variant doesn't exist, remove the rig, and list all available variants for this rig. tellraw @a <%TELLRAW.INVALID_VARIANT(rig.variants)%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function } scoreboard players set #success <%OBJECTIVES.I()%> 1 } } ELSE { execute if data storage <%temp_storage%> args.variant run block zzz/variant_arg/no_variants_warning { tellraw @a <%TELLRAW.NO_VARIANTS()%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function scoreboard players set #success <%OBJECTIVES.I()%> 0 } } execute if score #success <%OBJECTIVES.I()%> matches 0 run return fail - function *<%export_namespace%>/set_default_pose - # Animation Argument # If the animation argument is provided, attempt to apply the animation. execute if data storage <%temp_storage%> args.animation run block animation_arg/process { with storage <%temp_storage%> args @@ -638,7 +696,7 @@ function summon { # If the animation argument is *explicitly* set to an empty string, return an error. execute if data storage <%temp_storage%> {args:{animation:''}} run return run block if_empty { tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('animation')%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function } # Automatically set the frame argument to 0 if the frame argument is not provided. # Takes advantage of `store result score` setting the score to 0 if the command fails. @@ -651,13 +709,13 @@ function summon { execute if score #frame <%OBJECTIVES.I()%> matches ..-1 run return run block no_negative { # Tell the user that the frame argument cannot be negative. tellraw @a <%TELLRAW.FRAME_CANNOT_BE_NEGATIVE()%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function } # Attempt to apply the animation frame. execute store success score #success <%OBJECTIVES.I()%> run block try_set_frame { with storage <%temp_storage%> args # Make sure we're only applying transforms when setting the summon pose. tag @s add <%TAGS.TRANSFORMS_ONLY()%> - $execute store success score #success <%OBJECTIVES.I()%> run function *<%export_namespace%>/animations/$(animation)/zzz/set_frame with storage <%temp_storage%> args + $execute store success score #success <%OBJECTIVES.I()%> run function <%blueprint_id%>/animations/$(animation)/zzz/set_frame with storage <%temp_storage%> args tag @s remove <%TAGS.TRANSFORMS_ONLY()%> execute if score #success <%OBJECTIVES.I()%> matches 1 run return 1 # If the set_frame function fails, the animation doesn't exist, so we return an error. @@ -667,22 +725,19 @@ function summon { execute unless score #success <%OBJECTIVES.I()%> matches 1 run return run block invalid_animation { # Tell the user that the provided animation doesn't exist, remove the rig, and list all available animations for this rig. tellraw @a <%TELLRAW.INVALID_ANIMATION(animations)%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function } # If the animation is successfully applied, and the start_animation argument is set to true, start the animation. execute if data storage <%temp_storage%> {args:{start_animation: true}} run block start_animation { with storage <%temp_storage%> args - $function *<%export_namespace%>/animations/$(animation)/resume + $function <%blueprint_id%>/animations/$(animation)/resume } scoreboard players set #success <%OBJECTIVES.I()%> 1 } execute if score #success <%OBJECTIVES.I()%> matches 0 run return fail IF (has_locators || has_cameras) { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run function ./on_tick/transform_floating_entities + function <%blueprint_id%>/root/on_tick/transform_floating_entities } execute on passengers run tp @s ~ ~ ~ ~ ~ @@ -691,26 +746,21 @@ function summon { execute on passengers run data modify entity @s teleport_duration set value <%teleportation_duration%> IF (has_entity_locators) { - execute at @s on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block locators_on_summon { - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity && node.config.on_summon_function)) as locator { - block { with entity @s data.locators.<%locator.storage_name%> - $execute as $(uuid) at @s run block <%locator.storage_name%> { - <%% - emit.mcb(locator.config.on_summon_function) - %%> - # Track any custom entities on the locator. - function *global/util/get_entity_stack_uuids - } + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity && node.config.on_summon_function)) as locator { + block { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + $execute at @s as $(uuid) at @s run block on_summon/custom_<%locator.type + '_' + locator.storage_name%> { + <%% + emit.mcb(locator.config.on_summon_function) + %%> } - data modify entity @s data.uuids append from storage <%temp_storage%> uuids } } } REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type) && node.on_summon_function?.trim())) as node { execute \ - on passengers if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ - run block node_on_summon_<%node.storage_name%> { + on passengers if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ + run block on_summon/<%node.type + '_' + node.storage_name%> { <%% emit.mcb(node.on_summon_function.trim()) %%> @@ -718,7 +768,7 @@ function summon { } IF (on_summon_function) { - execute at @s run block rig_on_summon { + execute at @s run block on_summon/rig { <%% emit.mcb(on_summon_function) %%> @@ -733,7 +783,7 @@ function summon { function as_node { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -742,8 +792,10 @@ function as_node { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block zzz/as_node/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.uuids_by_name.$(name) + data_manager prep read + + block zzz/as_node/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.uuids_by_name.$(name) IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -767,7 +819,7 @@ function as_node { IF (has_entity_locators) { function as_locator { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -777,11 +829,10 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/as_locator/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.$(name).uuid + data_manager prep read + + block zzz/as_locator/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.$(name).uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -804,7 +855,7 @@ IF (has_entity_locators) { function as_at_locator { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -814,11 +865,10 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/as_locator/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.$(name).uuid + data_manager prep read + + block zzz/as_locator/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.$(name).uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -841,7 +891,7 @@ IF (has_entity_locators) { function as_all_locators { #ARGS: {command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {command:'$(command)'} @@ -850,9 +900,11 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block zzz/as_all_locators/as_data { + data_manager prep read + + block zzz/as_all_locators/as_data { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.<%locator.storage_name%>.uuid + data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.<%locator.storage_name%>.uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -876,7 +928,7 @@ IF (has_entity_locators) { function as_at_all_locators { #ARGS: {command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {command:'$(command)'} @@ -885,9 +937,11 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block zzz/as_all_locators/as_data { + data_manager prep read + + block zzz/as_all_locators/as_data { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.<%locator.storage_name%>.uuid + data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.<%locator.storage_name%>.uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -913,7 +967,7 @@ IF (has_entity_locators) { IF (has_locators) { function at_locator { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)'} @@ -923,15 +977,13 @@ IF (has_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute \ - at @s \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/at_locator/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args merge from entity @s data.locators.$(name) + data_manager prep read + + execute at @s run block zzz/at_locator/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args merge from storage <%temp_storage%> entry.data.locators.$(name) IF (debug_mode) { - execute unless data storage <%temp_storage%> args.uuid run return run tellraw @a <%TELLRAW.LOCATOR_NOT_FOUND()%> + execute unless data storage <%temp_storage%> args.px run return run tellraw @a <%TELLRAW.LOCATOR_NOT_FOUND()%> scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -955,7 +1007,7 @@ IF (has_locators) { function at_all_locators { #ARGS: {command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {command:'$(command)'} @@ -964,9 +1016,11 @@ IF (has_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute at @s on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block zzz/at_all_locators/as_data { + data_manager prep read + + block zzz/at_all_locators/as_data { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - data modify storage <%temp_storage%> args merge from entity @s data.locators.<%locator.storage_name%> + data modify storage <%temp_storage%> args merge from storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -995,7 +1049,7 @@ IF (has_locators) { IF (has_cameras) { function as_camera { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -1005,11 +1059,10 @@ IF (has_cameras) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/as_camera/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.cameras.$(name).uuid + data_manager prep read + + block zzz/as_camera/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.cameras.$(name).uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -1038,10 +1091,13 @@ IF (has_cameras) { function as_root { #ARGS: {command: string} - debug assert executed_as_entity_with_root_uuid_data + execute unless score @s <%OBJECTIVES.ID()%> matches <%-(2**31)%>..<%(2**31)-1%> run return run \ + tellraw @a <%TELLRAW.FUNCTION_NOT_EXECUTED_AS_ENTITY_WITH_ID_SCORE(context.functions.at(-1))%> + + data_manager prep read $data modify storage <%temp_storage%> args.command set value '$(command)' - data modify storage <%temp_storage%> args.root_uuid set from entity @s data.root_uuid + data modify storage <%temp_storage%> args.root_uuid set from storage <%temp_storage%> entry.data.root_uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -1062,44 +1118,43 @@ function as_root { dir remove { function all { # Removes all instances of this rig from the world. - execute as @e[type=minecraft:item_display,tag=<%TAGS.PROJECT_ROOT(export_namespace)%>] run function *<%export_namespace%>/remove/this + execute as @e[type=minecraft:item_display,tag=<%TAGS.PROJECT_ROOT(blueprint_id)%>] run function <%blueprint_id%>/remove/this } function entities { # Removes all entities related to this rig from the world. - kill @e[tag=<%TAGS.PROJECT_ENTITY(export_namespace)%>] + kill @e[tag=<%TAGS.PROJECT_ENTITY(blueprint_id)%>] } function this { # Removes the rig this function is executed as. - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> <%% if (on_remove_function) emit.mcb(on_remove_function) %%> IF (has_entity_locators) { - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block as_data { - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - IF (locator.config?.on_remove_function) { - IF (locator.config.use_entity) { - block as_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> - $execute as $(uuid) at @s run block locator_<%locator.storage_name%>_on_remove { - <%% - emit.mcb(locator.config.on_remove_function) - %%> - } + data_manager prep read + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { + IF (locator.config?.on_remove_function) { + IF (locator.config.use_entity) { + block as_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + $execute as $(uuid) at @s run block locator_<%locator.storage_name%>_on_remove { + <%% + emit.mcb(locator.config.on_remove_function) + %%> } - } ELSE { - block at_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> - $execute \ - positioned ^$(px) ^$(py) ^$(pz) \ - rotated ~$(ry) ~$(rx) \ - run block locator_<%locator.storage_name%>_on_remove { - <%% - emit.mcb(locator.config.on_remove_function) - %%> - } + } + } ELSE { + block at_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + $execute \ + positioned ^$(px) ^$(py) ^$(pz) \ + rotated ~$(ry) ~$(rx) \ + run block locator_<%locator.storage_name%>_on_remove { + <%% + emit.mcb(locator.config.on_remove_function) + %%> } } } @@ -1112,27 +1167,30 @@ dir remove { dir this { function without_on_remove_function { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + data_manager prep read IF (has_entity_locators || has_cameras) { - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block as_data { - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - function animated_java:global/remove/entity_stack_by_uuid with entity @s data.locators.<%locator.storage_name%> - } - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - function animated_java:global/remove/entity_stack_by_uuid with entity @s data.cameras.<%camera.storage_name%> - } + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { + function animated_java:global/remove/entity_stack_by_uuid with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + } + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { + function animated_java:global/remove/entity_stack_by_uuid with storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> } } # Remove the rig using the more expensive & thorough method if the rig_hash doesn't match. execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - unless data entity @s {data:{rig_hash: '<%rig_hash%>'}} \ - on vehicle \ + unless data storage <%temp_storage%> {entry:{data:{rig_hash: '<%rig_hash%>'}}} \ run function animated_java:global/remove/outdated_rig + block { with storage <%temp_storage%> entry.data.uuids_by_name + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + $kill $(<%node.storage_name%>) + } + } + function animated_java:global/remove/entity_stack } } @@ -1143,7 +1201,7 @@ IF (Object.keys(rig.variants).length > 1) { REPEAT (Object.values(rig.variants)) as variant { dir <%variant.name%> { function apply { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> <%% global.filteredNodes = Object.values(rig.nodes).filter( @@ -1166,7 +1224,7 @@ IF (Object.keys(rig.variants).length > 1) { REPEAT (global.filteredNodes) as node { execute \ on passengers \ - if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ + if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ at @s \ run \ block zzz/apply_to_node_<%node.storage_name%> { @@ -1206,21 +1264,25 @@ IF (has_locators || has_cameras) { function reset_floating_entities { IF (has_locators) { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - execute \ - at @s \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/set_default_pose/as_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> - IF (locator.config?.use_entity) { + IF (locator.config?.use_entity) { + execute at @s run block set_default_pose/as_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> $tp $(uuid) \ ^<%roundTo(locator.default_transform.pos[0], 10)%> \ ^<%roundTo(locator.default_transform.pos[1], 10)%> \ ^<%roundTo(locator.default_transform.pos[2], 10)%> \ ~<%roundTo(locator.default_transform.head_rot[1], 10)%> \ ~<%roundTo(locator.default_transform.head_rot[0], 10)%> - } - data modify entity @s data.locators.<%locator.storage_name%> merge value { \ + data modify storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> merge value { \ + px: <%roundTo(locator.default_transform.pos[0], 10)%>, \ + py: <%roundTo(locator.default_transform.pos[1], 10)%>, \ + pz: <%roundTo(locator.default_transform.pos[2], 10)%>, \ + ry: <%roundTo(locator.default_transform.head_rot[1], 10)%>, \ + rx: <%roundTo(locator.default_transform.head_rot[0], 10)%> \ + } + } + } ELSE { + data modify storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> merge value { \ px: <%roundTo(locator.default_transform.pos[0], 10)%>, \ py: <%roundTo(locator.default_transform.pos[1], 10)%>, \ pz: <%roundTo(locator.default_transform.pos[2], 10)%>, \ @@ -1233,11 +1295,7 @@ IF (has_locators || has_cameras) { IF (has_cameras) { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - execute \ - at @s \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/set_default_pose/as_camera_<%camera.storage_name%> { with entity @s data.cameras.<%camera.storage_name%> + execute at @s run block set_default_pose/as_camera_<%camera.storage_name%> { with storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> $tp $(uuid) \ ^<%roundTo(camera.default_transform.pos[0], 10)%> \ ^<%roundTo(camera.default_transform.pos[1], 10)%> \ @@ -1245,7 +1303,7 @@ IF (has_locators || has_cameras) { ~<%roundTo(camera.default_transform.head_rot[1], 10)%> \ ~<%roundTo(camera.default_transform.head_rot[0], 10)%> - data modify entity @s data.cameras.<%camera.storage_name%> merge value { \ + data modify storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> merge value { \ px: <%roundTo(camera.default_transform.pos[0], 10)%>, \ py: <%roundTo(camera.default_transform.pos[1], 10)%>, \ pz: <%roundTo(camera.default_transform.pos[2], 10)%>, \ @@ -1259,42 +1317,58 @@ IF (has_locators || has_cameras) { } } +dir zzz { + function apply_default_pose { + IF (has_locators || has_cameras) { + function ../zzz/reset_floating_entities + } + + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + execute \ + on passengers \ + if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ + run \ + data merge entity @s { \ + transformation: <%matrixToNbtFloatArray(node.default_transform.matrix).toString()%>, \ + start_interpolation: 0 \ + } + } + } + + function set_default_pose { + IF (has_locators || has_cameras) { + function ../zzz/reset_floating_entities + } + + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + execute \ + on passengers \ + if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ + run \ + data merge entity @s { \ + transformation: <%matrixToNbtFloatArray(node.default_transform.matrix).toString()%>, \ + start_interpolation: -1 \ + } + } + } +} + function apply_default_pose { # Changes the pose of the rig to the the default pose with interpolation - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> IF (has_locators || has_cameras) { - function ./zzz/reset_floating_entities - } - - REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ - run \ - data merge entity @s { \ - transformation: <%matrixToNbtFloatArray(node.default_transform.matrix).toString()%>, \ - start_interpolation: 0 \ - } + data_manager prep read } + function ./zzz/apply_default_pose } function set_default_pose { # Changes the pose of the rig to the the default pose without interpolation - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> IF (has_locators || has_cameras) { - function ./zzz/reset_floating_entities + data_manager prep read } - - REPEAT (Object.values(rig.nodes).filter(node => node.type !== 'locator' && node.type !== 'camera')) as node { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ - run \ - data merge entity @s { \ - transformation: <%matrixToNbtFloatArray(node.default_transform.matrix).toString()%>, \ - start_interpolation: -1 \ - } - } -} + function ./zzz/set_default_pose +} \ No newline at end of file diff --git a/src/systems/datapackCompiler/1.20.4/global.mcb b/src/systems/datapackCompiler/1.20.4/global.mcb index 3196d732..32b59084 100644 --- a/src/systems/datapackCompiler/1.20.4/global.mcb +++ b/src/systems/datapackCompiler/1.20.4/global.mcb @@ -10,40 +10,39 @@ dir global { scoreboard players add aj.last_id <%OBJECTIVES.ID()%> 0 - # Purposefully load gu first, as other functions depend on it. + # Enforce loading order. function *global/gu/on_load + function *global/data_manager/on_load function #*global/on_load + IF (debug_mode) { scoreboard players reset * <%OBJECTIVES.IS_RIG_LOADED()%> execute as @e[type=item_display,tag=<%TAGS.GLOBAL_ROOT()%>] at @s run function *global/root/on_load } } - IF (debug_mode) { - function on_tick minecraft:tick { - execute as @e[type=item_display,tag=<%TAGS.GLOBAL_ROOT()%>] at @s run function *global/root/on_tick - } - } ELSE { - function on_tick minecraft:tick { - execute as @e[type=item_display,tag=<%TAGS.GLOBAL_ROOT()%>] at @s run function #*global/root/on_tick - } + function on_tick minecraft:tick { + execute as @e[type=item_display,tag=<%TAGS.GLOBAL_ROOT()%>] at @s run function *global/root/on_tick } tag functions on_load { - *<%export_namespace%>/on_load + <%blueprint_id%>/on_load } dir root { - tag functions on_tick { - *<%export_namespace%>/root/on_tick - } - - IF (debug_mode) { - function on_tick { + function on_tick { + IF (debug_mode) { execute unless score @s <%OBJECTIVES.IS_RIG_LOADED()%> matches 1 run function *global/root/on_load - function #*global/root/on_tick } + data_manager prep read + function *global/root/run_project_tick with storage <%temp_storage%> entry.data + } + function run_project_tick { + $function $(blueprint_id)/root/on_tick + } + + IF (debug_mode) { function on_load { # Check if the rig is outdated by comparing the function's rig_hash of the rig to the rig_hash stored in the entity data. execute if function animated_java:global/util/is_rig_outdated run block outdated_warning/modify_rig { @@ -54,12 +53,16 @@ dir global { execute store result storage <%temp_storage%> args.x double 1 run data get entity @s Pos[0] 1 execute store result storage <%temp_storage%> args.y double 1 run data get entity @s Pos[1] 1 execute store result storage <%temp_storage%> args.z double 1 run data get entity @s Pos[2] 1 - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run { - # Get export namespace - data modify storage <%temp_storage%> args.export_namespace set from entity @s data.export_namespace - # Overwrite the rig hash so the warning doesn't show again. - data modify entity @s data.rig_hash set value '<%rig_hash%>' - } + + # No need to read here, since is_rig_outdated already reads the data. + # data_manager prep read + + # Get export namespace + data modify storage <%temp_storage%> args.blueprint_id set from storage <%temp_storage%> entry.data.blueprint_id + # Overwrite the rig hash so the warning doesn't show again. + data modify storage <%temp_storage%> entry.data.rig_hash set value '<%rig_hash%>' + data_manager write + block print { with storage <%temp_storage%> args $tellraw @a <%TELLRAW.RIG_OUTDATED()%> } @@ -117,20 +120,20 @@ dir global { # Removes locators and cameras owned by the rig, even if they're not included in the currently loaded export. function outdated_rig { - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block as_data { - data remove storage <%temp_storage%> args - data remove storage <%temp_storage%> uuids - data modify storage <%temp_storage%> uuids set from entity @s data.uuids - execute store result score #aj.length <%OBJECTIVES.I()%> run data get storage <%temp_storage%> uuids - - execute if score #aj.length <%OBJECTIVES.I()%> matches 1.. run block loop_over_uuids { - data modify storage <%temp_storage%> args.current_uuid set from storage <%temp_storage%> uuids[-1].uuid - data remove storage <%temp_storage%> uuids[-1] - function ./entity_stack_by_uuid with storage <%temp_storage%> args - - scoreboard players remove #aj.length <%OBJECTIVES.I()%> 1 - execute if score #aj.length <%OBJECTIVES.I()%> matches 1.. run function ^0 - } + data_manager prep read + + data remove storage <%temp_storage%> args + data remove storage <%temp_storage%> uuids + data modify storage <%temp_storage%> uuids set from entity @s data.uuids + execute store result score #aj.length <%OBJECTIVES.I()%> run data get storage <%temp_storage%> uuids + + execute if score #aj.length <%OBJECTIVES.I()%> matches 1.. run block loop_over_uuids { + data modify storage <%temp_storage%> args.current_uuid set from storage <%temp_storage%> uuids[-1].uuid + data remove storage <%temp_storage%> uuids[-1] + function ./entity_stack_by_uuid with storage <%temp_storage%> args + + scoreboard players remove #aj.length <%OBJECTIVES.I()%> 1 + execute if score #aj.length <%OBJECTIVES.I()%> matches 1.. run function ^0 } function ./entity_stack @@ -149,11 +152,12 @@ dir global { } # Returns 1 if the rig is outdated, else returns 0. function is_rig_outdated { - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run return run { with entity @s data + data_manager prep read + block { with storage <%temp_storage%> entry.data # REVIEW - The replace here is a bit hacky. # Because this is a core function, I need to create a generic version of - # project_storage that uses a macro to get the export namespace instead of hardcoding it. - $execute if data storage <%project_storage.replace(export_namespace, '$(export_namespace)')%> {rig_hash:'$(rig_hash)'} run return 0 + # project_storage that uses a macro to get the blueprint ID instead of hardcoding it. + $execute if data storage <%project_storage.replace(blueprint_id, '$(blueprint_id)')%> {rig_hash:'$(rig_hash)'} run return 0 return 1 } } @@ -214,14 +218,40 @@ dir global { } } } -} -dir <%export_namespace%> { - function on_load { - function *<%export_namespace%>/invalid_version_warning - } + # Storage-based per-entity NBT storage. Thanks Xanbelor for the concept! + dir data_manager { + function on_load { + scoreboard players add #aj.data_manager.index <%OBJECTIVES.I()%> 0 + } - function invalid_version_warning { - tellraw @a <%TELLRAW.INVALID_VERSION()%> + function on_tick minecraft:tick { + execute store result storage <%temp_storage%> args.id int 1 run scoreboard players get #aj.data_manager.index <%OBJECTIVES.I()%> + block { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%data_storage%> "$(id)".uuid + scoreboard players set #success <%OBJECTIVES.I()%> 0 + block { with storage <%temp_storage%> args + $execute store success score #success <%OBJECTIVES.I()%> if score $(uuid) matches 1.. + $execute if score #success <%OBJECTIVES.I()%> matches 0 run data remove storage <%data_storage%> "$(id)" + } + } + scoreboard players add #aj.data_manager.index <%OBJECTIVES.I()%> 1 + execute \ + if score #aj.data_manager.index <%OBJECTIVES.I()%> > aj.last_id <%OBJECTIVES.ID()%> \ + run scoreboard players set #aj.data_manager.index <%OBJECTIVES.I()%> 0 + } + + function create_entry { + $data modify storage <%data_storage%> "$(id)" set value {uuid: "$(uuid)", data: {}} + } + + function read { + data remove storage <%temp_storage%> entry + $data modify storage <%temp_storage%> entry set from storage <%data_storage%> "$(id)" + } + + function write { + $data modify storage <%data_storage%> "$(id)" set from storage <%temp_storage%> entry + } } } diff --git a/src/systems/datapackCompiler/1.20.4/global.mcbt b/src/systems/datapackCompiler/1.20.4/global.mcbt index d0999d70..27667765 100644 --- a/src/systems/datapackCompiler/1.20.4/global.mcbt +++ b/src/systems/datapackCompiler/1.20.4/global.mcbt @@ -5,10 +5,63 @@ template debug { tellraw @a <%TELLRAW.FUNCTION_NOT_EXECUTED_AS_ROOT_ERROR(context.functions.at(-1), root_tag)%> } } - with assert:literal executed_as_entity_with_root_uuid_data:literal { - IF (debug_mode) { - execute unless data entity @s data.root_uuid run return run \ - tellraw @a <%TELLRAW.FUNCTION_NOT_EXECUTED_AS_ENTITY_WITH_ROOT_UUID_ERROR(context.functions.at(-1))%> - } - } } + +template data_manager { + with rest:raw { + <%% + const commands = rest.split(' ') + const result = [] + for (const command of commands) { + switch (command) { + case 'init': + result.push(` + <%'# Data Manager: Initalize per-entity storage'%> + function animated_java:global/gu/get_entity_uuid_string + data modify storage <%temp_storage%> args.uuid set from storage <%gu_storage%> out + execute store result storage <%temp_storage%> args.id int 1 run scoreboard players get @s <%OBJECTIVES.ID()%> + function animated_java:global/data_manager/create_entry with storage <%temp_storage%> args + `) + break + + case 'prep': + result.push(` + <%'# Data Manager: Prepare for Read / Write'%> + execute store result storage <%temp_storage%> args.id int 1 run scoreboard players get @s <%OBJECTIVES.ID()%> + `) + break + + case 'read': + result.push(` + <%'# Data Manager: Read'%> + function animated_java:global/data_manager/read with storage <%temp_storage%> args + `) + break + + case 'write': + result.push(` + <%'# Data Manager: Write'%> + function animated_java:global/data_manager/write with storage <%temp_storage%> args + `) + break + + default: + throw new Error(`Unknown data_manager command: ${command}`) + } + } + emit.mcb(result.join('\n')) + %%> + } + + # with rw:literal block:block { + # template data_manager read + + # <%% + # console.log(arguments) + # console.log(context) + # console.log(block) + # %%> + + # template data_manager write + # } +} \ No newline at end of file diff --git a/src/systems/datapackCompiler/1.20.4/static.mcb b/src/systems/datapackCompiler/1.20.4/static.mcb index 2d6c6ca3..55e9d740 100644 --- a/src/systems/datapackCompiler/1.20.4/static.mcb +++ b/src/systems/datapackCompiler/1.20.4/static.mcb @@ -1,17 +1,11 @@ # TODO - Move all internal functions into an internal namespace, and only have user-facing functions in the main `animated_java:<%export_namespace%>` namespace. -import ../global.mcbt + function on_load { data modify storage <%project_storage%> rig_hash set value <%"'" + rig_hash + "'"%> } -function invalid_version_warning { - # This function will contain a tellraw if the datapack is loaded in the wrong version. -} - dir root { function on_tick { - execute unless entity @s[tag=<%TAGS.PROJECT_ROOT(export_namespace)%>] run return 0 - # Custom pre-tick function IF (on_pre_tick_function) { <%% @@ -21,17 +15,11 @@ dir root { IF (auto_update_rig_orientation) { IF (has_locators || has_cameras) { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run function ./on_tick/transform_floating_entities + function <%blueprint_id%>/root/on_tick/transform_floating_entities } execute on passengers run tp @s ~ ~ ~ ~ ~ } ELSE IF (has_ticking_locators) { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run function ./on_tick/transform_locators + function <%blueprint_id%>/root/on_tick/transform_locators } # Custom post-tick function @@ -46,7 +34,7 @@ dir root { dir on_tick { function transform_locators { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - block select_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> + block select_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> IF (locator.config?.use_entity) { $execute \ as $(uuid) \ @@ -83,7 +71,7 @@ dir root { function ./transform_locators REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - block select_camera_<%camera.storage_name%> { with entity @s data.cameras.<%camera.storage_name%> + block select_camera_<%camera.storage_name%> { with storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> $execute \ as $(uuid) \ positioned ^$(px) ^$(py) ^$(pz) \ @@ -98,15 +86,13 @@ dir root { IF (!auto_update_rig_orientation) { function move { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> tp @s ~ ~ ~ ~ ~ IF (has_locators || has_cameras) { - execute \ - at @s on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run function ./on_tick/transform_floating_entities + data_manager prep read + function <%blueprint_id%>/root/on_tick/transform_floating_entities } execute at @s on passengers run tp @s ~ ~ ~ ~ ~ } @@ -127,90 +113,111 @@ function summon { '<%TAGS.NEW()%>', \ '<%TAGS.GLOBAL_ENTITY()%>', \ '<%TAGS.GLOBAL_ROOT()%>', \ - '<%TAGS.PROJECT_ENTITY(export_namespace)%>', \ - '<%TAGS.PROJECT_ROOT(export_namespace)%>' \ + '<%TAGS.PROJECT_ENTITY(blueprint_id)%>', \ + '<%TAGS.PROJECT_ROOT(blueprint_id)%>' \ ], \ teleport_duration: 0, \ interpolation_duration: <%interpolation_duration%>, \ Passengers:<%root_entity_passengers%>, \ + CustomName: '<%ENTITY_NAMES.ROOT(blueprint_id)%>', \ } execute as @e[ \ type=minecraft:item_display, \ - tag=<%TAGS.PROJECT_ROOT(export_namespace)%>, \ + tag=<%TAGS.PROJECT_ROOT(blueprint_id)%>, \ tag=<%TAGS.NEW()%>, \ limit=1, distance=..0.01 \ ] run block zzz/summon/as_root_entity { execute store result score @s <%OBJECTIVES.ID()%> run scoreboard players add aj.last_id <%OBJECTIVES.ID()%> 1 + + data_manager init prep read + # Data manager init runs gu:get_entity_uuid_string. So we don't need to call it again here. + # function animated_java:global/gu/get_entity_uuid_string + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.root_uuid set from storage <%gu_storage%> out + + data modify storage <%temp_storage%> entry.data.blueprint_id set value "<%blueprint_id%>" + data modify storage <%temp_storage%> entry.data.rig_hash set value "<%rig_hash%>" + # Align the position and rotation of the root with the command context. tp @s ~ ~ ~ ~ ~ - function *global/gu/get_entity_uuid_string - execute at @s on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block as_data_entity { - # Rig Root UUID - data modify entity @s data.uuids append from storage <%gu_storage%> out - # Data Entity UUID - function *global/gu/get_entity_uuid_string - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.data_data set from storage <%gu_storage%> out + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { + summon <%locator.config.entity_type%> \ + ^<%roundTo(locator.default_transform.pos[0], 10)%> \ + ^<%roundTo(locator.default_transform.pos[1], 10)%> \ + ^<%roundTo(locator.default_transform.pos[2], 10)%> \ + {Tags:<%getNodeTags(locator, rig)%>} + execute \ + as @e[ \ + type=<%locator.config.entity_type%>, \ + tag=<%TAGS.PROJECT_LOCATOR_NAMED(blueprint_id, locator.storage_name)%>, \ + tag=<%TAGS.NEW()%>, \ + limit=1, distance=..<%Math.ceil(locator.max_distance)%> \ + ] \ + run block as_locator/<%locator.storage_name%> { + # run block ../as_locator/<%locator.storage_name%> { + tag @s remove <%TAGS.NEW()%> + data modify entity @s CustomName set value '<%ENTITY_NAMES.NODE(blueprint_id, locator.type, locator.storage_name)%>' + function animated_java:global/gu/get_entity_uuid_string + scoreboard players operation @s <%OBJECTIVES.ID()%> = aj.last_id <%OBJECTIVES.ID()%> + } + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids_by_name.<%locator.storage_name%> set from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.locators.<%locator.storage_name%>.uuid set from storage <%gu_storage%> out + } + + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { + summon minecraft:item_display \ + ^<%roundTo(camera.default_transform.pos[0], 10)%> \ + ^<%roundTo(camera.default_transform.pos[1], 10)%> \ + ^<%roundTo(camera.default_transform.pos[2], 10)%> \ + {Tags:<%getNodeTags(camera, rig)%>, teleport_duration: 2} + execute \ + as @e[ \ + type=minecraft:item_display, \ + tag=<%TAGS.PROJECT_CAMERA_NAMED(blueprint_id, camera.storage_name)%>, \ + tag=<%TAGS.NEW()%>, \ + limit=1, distance=..<%Math.ceil(camera.max_distance)%> \ + ] \ + run block as_camera/<%camera.storage_name%> { + # run block ../as_camera/<%camera.storage_name%> { + tag @s remove <%TAGS.NEW()%> + data modify entity @s CustomName set value '<%ENTITY_NAMES.NODE(blueprint_id, camera.type, camera.storage_name)%>' + function animated_java:global/gu/get_entity_uuid_string + scoreboard players operation @s <%OBJECTIVES.ID()%> = aj.last_id <%OBJECTIVES.ID()%> + } + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids_by_name.<%camera.storage_name%> set from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%>.uuid set from storage <%gu_storage%> out + } + + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + execute \ + on passengers \ + if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ + run block as_node/<%node.storage_name%> { + data modify entity @s CustomName set value '<%ENTITY_NAMES.NODE(blueprint_id, node.type, node.storage_name)%>' + function animated_java:global/gu/get_entity_uuid_string + scoreboard players operation @s <%OBJECTIVES.ID()%> = aj.last_id <%OBJECTIVES.ID()%> + } + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids_by_name.<%node.storage_name%> set from storage <%gu_storage%> out + } + + IF (has_entity_locators) { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - summon <%locator.config.entity_type%> \ - ^<%roundTo(locator.default_transform.pos[0], 10)%> \ - ^<%roundTo(locator.default_transform.pos[1], 10)%> \ - ^<%roundTo(locator.default_transform.pos[2], 10)%> \ - {Tags:<%getNodeTags(locator, rig)%>} - execute \ - as @e[ \ - type=<%locator.config.entity_type%>, \ - tag=<%TAGS.PROJECT_LOCATOR_NAMED(export_namespace, locator.storage_name)%>, \ - tag=<%TAGS.NEW()%>, \ - limit=1, distance=..<%Math.ceil(locator.max_distance)%> \ - ] \ - run block as_locator/<%locator.storage_name%> { - # run block ../as_locator/<%locator.storage_name%> { - tag @s remove <%TAGS.NEW()%> - function *global/gu/get_entity_uuid_string + block { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + # Track any custom entities on the locator. + $execute at @s as $(uuid) at @s run function animated_java:global/util/get_entity_stack_uuids } - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.<%locator.storage_name%> set from storage <%gu_storage%> out - data modify entity @s data.locators.<%locator.storage_name%>.uuid set from storage <%gu_storage%> out - } - - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - summon minecraft:item_display \ - ^<%roundTo(camera.default_transform.pos[0], 10)%> \ - ^<%roundTo(camera.default_transform.pos[1], 10)%> \ - ^<%roundTo(camera.default_transform.pos[2], 10)%> \ - {Tags:<%getNodeTags(camera, rig)%>, teleport_duration: 2} - execute \ - as @e[ \ - type=minecraft:item_display, \ - tag=<%TAGS.PROJECT_CAMERA_NAMED(export_namespace, camera.storage_name)%>, \ - tag=<%TAGS.NEW()%>, \ - limit=1, distance=..<%Math.ceil(camera.max_distance)%> \ - ] \ - run block as_camera/<%camera.storage_name%> { - # run block ../as_camera/<%camera.storage_name%> { - tag @s remove <%TAGS.NEW()%> - function *global/gu/get_entity_uuid_string - } - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.<%camera.storage_name%> set from storage <%gu_storage%> out - data modify entity @s data.cameras.<%camera.storage_name%>.uuid set from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids append from storage <%temp_storage%> uuids } + } - REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { - execute \ - on vehicle \ - on passengers \ - if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ - run \ - function *global/gu/get_entity_uuid_string + function <%blueprint_id%>/zzz/set_default_pose - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.<%node.storage_name%> set from storage <%gu_storage%> out - } - } + data_manager write # Variant Arguement IF (Object.keys(rig.variants).length > 1) { @@ -220,12 +227,12 @@ function summon { execute if data storage <%temp_storage%> {args:{variant:''}} run return run block if_empty { # Tell the user that the variant cannot be empty. tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('variant')%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function } # Attempt to apply the requested variant. # We get the success of the `try_apply` function in just in case the user's arguments are *very* wrong. execute store success score #success <%OBJECTIVES.I()%> run block try_apply { with storage <%temp_storage%> args - $execute if function animated_java:<%export_namespace%>/variants/$(variant)/apply run return 1 + $execute if function <%blueprint_id%>/variants/$(variant)/apply run return 1 # If the apply function fails, the variant doesn't exist, so we return an error. return fail } @@ -233,25 +240,21 @@ function summon { execute unless score #success <%OBJECTIVES.I()%> matches 1 run return run block invalid_variant { # Tell the user that the provided variant doesn't exist, remove the rig, and list all available variants for this rig. tellraw @a <%TELLRAW.INVALID_VARIANT(rig.variants)%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function } scoreboard players set #success <%OBJECTIVES.I()%> 1 } } ELSE { execute if data storage <%temp_storage%> args.variant run block zzz/variant_arg/no_variants_warning { tellraw @a <%TELLRAW.NO_VARIANTS()%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function scoreboard players set #success <%OBJECTIVES.I()%> 0 } } execute if score #success <%OBJECTIVES.I()%> matches 0 run return fail - function *<%export_namespace%>/set_default_pose IF (has_locators || has_cameras) { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run function ./on_tick/transform_floating_entities + function <%blueprint_id%>/root/on_tick/transform_floating_entities } execute on passengers run tp @s ~ ~ ~ ~ ~ @@ -260,26 +263,21 @@ function summon { execute on passengers run data modify entity @s teleport_duration set value <%teleportation_duration%> IF (has_entity_locators) { - execute at @s on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block locators_on_summon { - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity && node.config.on_summon_function)) as locator { - block { with entity @s data.locators.<%locator.storage_name%> - $execute as $(uuid) at @s run block <%locator.storage_name%> { - <%% - emit.mcb(locator.config.on_summon_function) - %%> - # Track any custom entities on the locator. - function *global/util/get_entity_stack_uuids - } + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity && node.config.on_summon_function)) as locator { + block { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + $execute at @s as $(uuid) at @s run block on_summon/custom_<%locator.type + '_' + locator.storage_name%> { + <%% + emit.mcb(locator.config.on_summon_function) + %%> } - data modify entity @s data.uuids append from storage <%temp_storage%> uuids } } } REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type) && node.on_summon_function?.trim())) as node { execute \ - on passengers if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ - run block node_on_summon_<%node.storage_name%> { + on passengers if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ + run block on_summon/<%node.type + '_' + node.storage_name%> { <%% emit.mcb(node.on_summon_function.trim()) %%> @@ -287,7 +285,7 @@ function summon { } IF (on_summon_function) { - execute at @s run block rig_on_summon { + execute at @s run block on_summon/rig { <%% emit.mcb(on_summon_function) %%> @@ -302,7 +300,7 @@ function summon { function as_node { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -311,8 +309,10 @@ function as_node { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block zzz/as_node/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.uuids_by_name.$(name) + data_manager prep read + + block zzz/as_node/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.uuids_by_name.$(name) IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -336,7 +336,7 @@ function as_node { IF (has_entity_locators) { function as_locator { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -346,11 +346,10 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/as_locator/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.$(name).uuid + data_manager prep read + + block zzz/as_locator/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.$(name).uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -373,7 +372,7 @@ IF (has_entity_locators) { function as_at_locator { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -383,11 +382,10 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/as_locator/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.$(name).uuid + data_manager prep read + + block zzz/as_locator/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.$(name).uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -410,7 +408,7 @@ IF (has_entity_locators) { function as_all_locators { #ARGS: {command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {command:'$(command)'} @@ -419,9 +417,11 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block zzz/as_all_locators/as_data { + data_manager prep read + + block zzz/as_all_locators/as_data { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.<%locator.storage_name%>.uuid + data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.<%locator.storage_name%>.uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -445,7 +445,7 @@ IF (has_entity_locators) { function as_at_all_locators { #ARGS: {command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {command:'$(command)'} @@ -454,9 +454,11 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block zzz/as_all_locators/as_data { + data_manager prep read + + block zzz/as_all_locators/as_data { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.<%locator.storage_name%>.uuid + data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.<%locator.storage_name%>.uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -482,7 +484,7 @@ IF (has_entity_locators) { IF (has_locators) { function at_locator { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)'} @@ -492,15 +494,13 @@ IF (has_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute \ - at @s \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/at_locator/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args merge from entity @s data.locators.$(name) + data_manager prep read + + execute at @s run block zzz/at_locator/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args merge from storage <%temp_storage%> entry.data.locators.$(name) IF (debug_mode) { - execute unless data storage <%temp_storage%> args.uuid run return run tellraw @a <%TELLRAW.LOCATOR_NOT_FOUND()%> + execute unless data storage <%temp_storage%> args.px run return run tellraw @a <%TELLRAW.LOCATOR_NOT_FOUND()%> scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -524,7 +524,7 @@ IF (has_locators) { function at_all_locators { #ARGS: {command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {command:'$(command)'} @@ -533,9 +533,11 @@ IF (has_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute at @s on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block zzz/at_all_locators/as_data { + data_manager prep read + + block zzz/at_all_locators/as_data { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - data modify storage <%temp_storage%> args merge from entity @s data.locators.<%locator.storage_name%> + data modify storage <%temp_storage%> args merge from storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -564,7 +566,7 @@ IF (has_locators) { IF (has_cameras) { function as_camera { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -574,11 +576,10 @@ IF (has_cameras) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/as_camera/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.cameras.$(name).uuid + data_manager prep read + + block zzz/as_camera/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.cameras.$(name).uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -607,10 +608,13 @@ IF (has_cameras) { function as_root { #ARGS: {command: string} - debug assert executed_as_entity_with_root_uuid_data + execute unless score @s <%OBJECTIVES.ID()%> matches <%-(2**31)%>..<%(2**31)-1%> run return run \ + tellraw @a <%TELLRAW.FUNCTION_NOT_EXECUTED_AS_ENTITY_WITH_ID_SCORE(context.functions.at(-1))%> + + data_manager prep read $data modify storage <%temp_storage%> args.command set value '$(command)' - data modify storage <%temp_storage%> args.root_uuid set from entity @s data.root_uuid + data modify storage <%temp_storage%> args.root_uuid set from storage <%temp_storage%> entry.data.root_uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -631,44 +635,43 @@ function as_root { dir remove { function all { # Removes all instances of this rig from the world. - execute as @e[type=minecraft:item_display,tag=<%TAGS.PROJECT_ROOT(export_namespace)%>] run function *<%export_namespace%>/remove/this + execute as @e[type=minecraft:item_display,tag=<%TAGS.PROJECT_ROOT(blueprint_id)%>] run function <%blueprint_id%>/remove/this } function entities { # Removes all entities related to this rig from the world. - kill @e[tag=<%TAGS.PROJECT_ENTITY(export_namespace)%>] + kill @e[tag=<%TAGS.PROJECT_ENTITY(blueprint_id)%>] } function this { # Removes the rig this function is executed as. - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> <%% if (on_remove_function) emit.mcb(on_remove_function) %%> IF (has_entity_locators) { - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block as_data { - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - IF (locator.config?.on_remove_function) { - IF (locator.config.use_entity) { - block as_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> - $execute as $(uuid) at @s run block locator_<%locator.storage_name%>_on_remove { - <%% - emit.mcb(locator.config.on_remove_function) - %%> - } + data_manager prep read + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { + IF (locator.config?.on_remove_function) { + IF (locator.config.use_entity) { + block as_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + $execute as $(uuid) at @s run block locator_<%locator.storage_name%>_on_remove { + <%% + emit.mcb(locator.config.on_remove_function) + %%> } - } ELSE { - block at_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> - $execute \ - positioned ^$(px) ^$(py) ^$(pz) \ - rotated ~$(ry) ~$(rx) \ - run block locator_<%locator.storage_name%>_on_remove { - <%% - emit.mcb(locator.config.on_remove_function) - %%> - } + } + } ELSE { + block at_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + $execute \ + positioned ^$(px) ^$(py) ^$(pz) \ + rotated ~$(ry) ~$(rx) \ + run block locator_<%locator.storage_name%>_on_remove { + <%% + emit.mcb(locator.config.on_remove_function) + %%> } } } @@ -681,27 +684,30 @@ dir remove { dir this { function without_on_remove_function { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + data_manager prep read IF (has_entity_locators || has_cameras) { - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block as_data { - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - function animated_java:global/remove/entity_stack_by_uuid with entity @s data.locators.<%locator.storage_name%> - } - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - function animated_java:global/remove/entity_stack_by_uuid with entity @s data.cameras.<%camera.storage_name%> - } + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { + function animated_java:global/remove/entity_stack_by_uuid with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + } + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { + function animated_java:global/remove/entity_stack_by_uuid with storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> } } # Remove the rig using the more expensive & thorough method if the rig_hash doesn't match. execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - unless data entity @s {data:{rig_hash: '<%rig_hash%>'}} \ - on vehicle \ + unless data storage <%temp_storage%> {entry:{data:{rig_hash: '<%rig_hash%>'}}} \ run function animated_java:global/remove/outdated_rig + block { with storage <%temp_storage%> entry.data.uuids_by_name + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + $kill $(<%node.storage_name%>) + } + } + function animated_java:global/remove/entity_stack } } @@ -712,7 +718,7 @@ IF (Object.keys(rig.variants).length > 1) { REPEAT (Object.values(rig.variants)) as variant { dir <%variant.name%> { function apply { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> <%% global.filteredNodes = Object.values(rig.nodes).filter( @@ -735,7 +741,7 @@ IF (Object.keys(rig.variants).length > 1) { REPEAT (global.filteredNodes) as node { execute \ on passengers \ - if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ + if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ at @s \ run \ block zzz/apply_to_node_<%node.storage_name%> { @@ -775,21 +781,25 @@ IF (has_locators || has_cameras) { function reset_floating_entities { IF (has_locators) { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - execute \ - at @s \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/set_default_pose/as_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> - IF (locator.config?.use_entity) { + IF (locator.config?.use_entity) { + execute at @s run block set_default_pose/as_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> $tp $(uuid) \ ^<%roundTo(locator.default_transform.pos[0], 10)%> \ ^<%roundTo(locator.default_transform.pos[1], 10)%> \ ^<%roundTo(locator.default_transform.pos[2], 10)%> \ ~<%roundTo(locator.default_transform.head_rot[1], 10)%> \ ~<%roundTo(locator.default_transform.head_rot[0], 10)%> - } - data modify entity @s data.locators.<%locator.storage_name%> merge value { \ + data modify storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> merge value { \ + px: <%roundTo(locator.default_transform.pos[0], 10)%>, \ + py: <%roundTo(locator.default_transform.pos[1], 10)%>, \ + pz: <%roundTo(locator.default_transform.pos[2], 10)%>, \ + ry: <%roundTo(locator.default_transform.head_rot[1], 10)%>, \ + rx: <%roundTo(locator.default_transform.head_rot[0], 10)%> \ + } + } + } ELSE { + data modify storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> merge value { \ px: <%roundTo(locator.default_transform.pos[0], 10)%>, \ py: <%roundTo(locator.default_transform.pos[1], 10)%>, \ pz: <%roundTo(locator.default_transform.pos[2], 10)%>, \ @@ -802,11 +812,7 @@ IF (has_locators || has_cameras) { IF (has_cameras) { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - execute \ - at @s \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/set_default_pose/as_camera_<%camera.storage_name%> { with entity @s data.cameras.<%camera.storage_name%> + execute at @s run block set_default_pose/as_camera_<%camera.storage_name%> { with storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> $tp $(uuid) \ ^<%roundTo(camera.default_transform.pos[0], 10)%> \ ^<%roundTo(camera.default_transform.pos[1], 10)%> \ @@ -814,7 +820,7 @@ IF (has_locators || has_cameras) { ~<%roundTo(camera.default_transform.head_rot[1], 10)%> \ ~<%roundTo(camera.default_transform.head_rot[0], 10)%> - data modify entity @s data.cameras.<%camera.storage_name%> merge value { \ + data modify storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> merge value { \ px: <%roundTo(camera.default_transform.pos[0], 10)%>, \ py: <%roundTo(camera.default_transform.pos[1], 10)%>, \ pz: <%roundTo(camera.default_transform.pos[2], 10)%>, \ @@ -828,22 +834,31 @@ IF (has_locators || has_cameras) { } } +dir zzz { + function set_default_pose { + IF (has_locators || has_cameras) { + function ../zzz/reset_floating_entities + } + + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + execute \ + on passengers \ + if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ + run \ + data merge entity @s { \ + transformation: <%matrixToNbtFloatArray(node.default_transform.matrix).toString()%>, \ + start_interpolation: -1 \ + } + } + } +} + function set_default_pose { # Changes the pose of the rig to the the default pose without interpolation - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> IF (has_locators || has_cameras) { - function ./zzz/reset_floating_entities + data_manager prep read } - - REPEAT (Object.values(rig.nodes).filter(node => node.type !== 'locator' && node.type !== 'camera')) as node { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ - run \ - data merge entity @s { \ - transformation: <%matrixToNbtFloatArray(node.default_transform.matrix).toString()%>, \ - start_interpolation: -1 \ - } - } -} + function ./zzz/set_default_pose +} \ No newline at end of file diff --git a/src/systems/datapackCompiler/1.20.5/animation.mcb b/src/systems/datapackCompiler/1.20.5/animation.mcb index e068f7e7..2f9667f2 100644 --- a/src/systems/datapackCompiler/1.20.5/animation.mcb +++ b/src/systems/datapackCompiler/1.20.5/animation.mcb @@ -1,5 +1,7 @@ # TODO - Move all internal functions into an internal namespace, and only have user-facing functions in the main `animated_java:<%export_namespace%>` namespace. -import ../global.mcbt + +# DIFFERENCES FROM 1.20.4: +# - Item components: item.tag.CustomModelData -> item.components."minecraft:custom_model_data" function on_load { data modify storage <%project_storage%> rig_hash set value <%"'" + rig_hash + "'"%> @@ -26,14 +28,8 @@ function remove_animation_objectives { tellraw @a <%TELLRAW.UNINSTALL()%> } -function invalid_version_warning { - # This function will contain a tellraw if the datapack is loaded in the wrong version. -} - dir root { function on_tick { - execute unless entity @s[tag=<%TAGS.PROJECT_ROOT(export_namespace)%>] run return 0 - # Custom pre-tick function IF (on_pre_tick_function) { <%% @@ -41,38 +37,35 @@ dir root { %%> } + # animated_java:global/root/on_tick already runs this right before calling this function. + # data_manager prep read + # Once we have more than 8 animations, calling a function only if at least one animation is playing is more efficient. IF (animations.length > 8) { # If no animations are playing, we can skip all animation logic. # This helps reduce ticking commands for rigs that are idle. execute \ - unless entity @s[<%animations.map(anim => 'tag=!' + TAGS.ANIMATION_PLAYING(export_namespace, anim.storage_name)).join(',')%>] \ + unless entity @s[<%animations.map(anim => 'tag=!' + TAGS.ANIMATION_PLAYING(blueprint_id, anim.storage_name)).join(',')%>] \ run block tick_animations { REPEAT (animations) as animation { - execute if entity @s[tag=<%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%>] run \ - function *<%export_namespace%>/animations/<%animation.storage_name%>/zzz/on_tick + execute if entity @s[tag=<%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%>] run \ + function <%blueprint_id%>/animations/<%animation.storage_name%>/zzz/on_tick } } } ELSE { REPEAT (animations) as animation { - execute if entity @s[tag=<%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%>] run \ - function *<%export_namespace%>/animations/<%animation.storage_name%>/zzz/on_tick + execute if entity @s[tag=<%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%>] run \ + function <%blueprint_id%>/animations/<%animation.storage_name%>/zzz/on_tick } } IF (auto_update_rig_orientation) { IF (has_locators || has_cameras) { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run function ./on_tick/transform_floating_entities + function <%blueprint_id%>/root/on_tick/transform_floating_entities } execute on passengers run tp @s ~ ~ ~ ~ ~ } ELSE IF (has_ticking_locators) { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run function ./on_tick/transform_locators + function <%blueprint_id%>/root/on_tick/transform_locators } # Custom post-tick function @@ -87,7 +80,7 @@ dir root { dir on_tick { function transform_locators { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - block select_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> + block select_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> IF (locator.config?.use_entity) { $execute \ as $(uuid) \ @@ -124,7 +117,7 @@ dir root { function ./transform_locators REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - block select_camera_<%camera.storage_name%> { with entity @s data.cameras.<%camera.storage_name%> + block select_camera_<%camera.storage_name%> { with storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> $execute \ as $(uuid) \ positioned ^$(px) ^$(py) ^$(pz) \ @@ -139,15 +132,13 @@ dir root { IF (!auto_update_rig_orientation) { function move { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> tp @s ~ ~ ~ ~ ~ IF (has_locators || has_cameras) { - execute \ - at @s on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run function ./on_tick/transform_floating_entities + data_manager prep read + function <%blueprint_id%>/root/on_tick/transform_floating_entities } execute at @s on passengers run tp @s ~ ~ ~ ~ ~ } @@ -161,11 +152,11 @@ dir animations { REPEAT (animations) as animation { dir <%animation.storage_name%> { function play { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> - function *<%export_namespace%>/animations/pause_all + function <%blueprint_id%>/animations/pause_all - tag @s add <%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%> + tag @s add <%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%> scoreboard players set @s <%OBJECTIVES.FRAME(animation.storage_name)%> 0 tag @s add <%TAGS.TRANSFORMS_ONLY()%> execute at @s run function ./zzz/set_frame {frame: 0} @@ -173,9 +164,9 @@ dir animations { } function stop { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> - function *<%export_namespace%>/animations/pause_all + function <%blueprint_id%>/animations/pause_all scoreboard players set @s <%OBJECTIVES.FRAME(animation.storage_name)%> 0 tag @s add <%TAGS.TRANSFORMS_ONLY()%> @@ -184,19 +175,19 @@ dir animations { } function pause { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> - tag @s remove <%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%> + tag @s remove <%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%> } function resume { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> - tag @s add <%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%> + tag @s add <%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%> } function next_frame { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> execute if score @s <%OBJECTIVES.FRAME(animation.storage_name)%> matches <%animation.duration%>.. run scoreboard players set @s <%OBJECTIVES.FRAME(animation.storage_name)%> 1 data remove storage <%temp_storage%> args @@ -208,7 +199,9 @@ dir animations { function set_frame { # Sets the frame without interpolation #ARGS: {frame: int} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + data_manager prep read data remove storage <%temp_storage%> args $execute store result storage <%temp_storage%> args.frame int 1 run scoreboard players set @s <%OBJECTIVES.FRAME(animation.storage_name)%> $(frame) @@ -217,7 +210,9 @@ dir animations { function apply_frame { #ARGS: {frame: int} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + data_manager prep read data remove storage <%temp_storage%> args $execute store result storage <%temp_storage%> args.frame int 1 run scoreboard players set @s <%OBJECTIVES.FRAME(animation.storage_name)%> $(frame) @@ -227,11 +222,11 @@ dir animations { function tween { # Attempts to smoothly transition from the currently playing animation into this one. #ARGS: {duration: int, to_frame: int} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> - function *<%export_namespace%>/animations/pause_all + function <%blueprint_id%>/animations/pause_all - tag @s add <%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%> + tag @s add <%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%> $scoreboard players set @s <%OBJECTIVES.TWEEN_DURATION()%> $(duration) $scoreboard players set @s <%OBJECTIVES.FRAME(animation.storage_name)%> $(to_frame) @@ -255,7 +250,7 @@ dir animations { # Makes sure function keyframes in the last frame of the animation are activated. execute if score @s <%OBJECTIVES.FRAME(animation.storage_name)%> matches -1 run \ block function_keyframe_loop_patch { - function ./apply_frame {frame: <%animation.duration-1%>} + function ./frames/last_frame_effects with storage <%temp_storage%> entry.data.uuids_by_name scoreboard players add @s <%OBJECTIVES.FRAME(animation.storage_name)%> 1 } } @@ -288,7 +283,7 @@ dir animations { tag @s add <%TAGS.TRANSFORMS_ONLY()%> execute at @s run function ./zzz/set_frame {frame: 0} tag @s remove <%TAGS.TRANSFORMS_ONLY()%> - tag @s remove <%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%> + tag @s remove <%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%> } } scoreboard players add @s <%OBJECTIVES.FRAME(animation.storage_name)%> 1 @@ -298,7 +293,7 @@ dir animations { function set_frame { #ARGS: {frame: int} $function ./apply_frame {frame: $(frame)} - execute on passengers run data modify entity @s[tag=!<%TAGS.GLOBAL_DATA()%>] start_interpolation set value -1 + execute on passengers run data modify entity @s start_interpolation set value -1 return 1 } @@ -306,12 +301,11 @@ dir animations { #ARGS: {frame: int} REPEAT (Object.values(animation.modified_nodes).sort(nodeSorter)) as node { IF (BONE_TYPES.includes(node.type)) { - $execute on passengers if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] run \ + $execute on passengers if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] run \ data modify entity @s {} merge from \ storage <%project_storage%>/animations <%animation.storage_name%>.$(frame).<%node.storage_name%> } ELSE IF (node.type === 'locator' || node.type === 'camera') { - $execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run \ - $data modify entity @s data.uuids_by_name.<%node.storage_name%> merge from \ + $data modify storage <%temp_storage%> entry.data.uuids_by_name.<%node.storage_name%> merge from \ storage <%project_storage%>/animations <%animation.storage_name%>.$(frame).<%node.storage_name%> } } @@ -322,7 +316,7 @@ dir animations { unless entity @s[tag=<%TAGS.TRANSFORMS_ONLY()%>] \ run { with storage <%project_storage%>/animations <%animation.storage_name%>.$(frame).variant #ARGS: {name: string, condition: string} - $execute $(condition)run function *<%export_namespace%>/variants/$(name)/apply + $execute $(condition)run function <%blueprint_id%>/variants/$(name)/apply } } @@ -332,10 +326,10 @@ dir animations { function set_frame { # Sets the frame without interpolation #ARGS: {frame: int} - $execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run \ - function ./frames/$(frame) with entity @s data.uuids_by_name - execute on passengers if entity @s[tag=!<%TAGS.GLOBAL_DATA()%>] run \ + $function ./frames/$(frame) with storage <%temp_storage%> entry.data.uuids_by_name + + execute on passengers run \ data modify entity @s start_interpolation set value -1 return 1 @@ -343,14 +337,67 @@ dir animations { function apply_frame { #ARGS: {frame: int} - $execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run \ - function ./frames/$(frame) with entity @s data.uuids_by_name + + $function ./frames/$(frame) with storage <%temp_storage%> entry.data.uuids_by_name return 1 } # FIXME - %NEWLINE_PATCH% is a temporary solution to temporarily fix an MCB bug where extra newlines are being added to the output. dir frames { + <%% + global.frame = animation.frames.at(-1) + global.modified_effect_nodes = Object.values(animation.modified_nodes).filter( + node => node.type === 'locator' && global.frame.node_transforms[node.uuid] + ) + console.log(global.modified_effect_nodes) + %%> + IF(Object.keys(global.modified_effect_nodes).length > 0) { + function last_frame_effects { + REPEAT(global.modified_effect_nodes) as node { + <%% + global.transform = global.frame.node_transforms[node.uuid] + %%> + IF (node.config?.use_entity) { + $execute \ + as $(<%node.storage_name%>) \ + positioned \ + ^<%roundTo(global.transform.pos[0], 10)%> \ + ^<%roundTo(global.transform.pos[1], 10)%> \ + ^<%roundTo(global.transform.pos[2], 10)%> \ + rotated \ + ~<%roundTo(global.transform.head_rot[1], 10)%> \ + ~<%roundTo(global.transform.head_rot[0], 10)%> \ + <%global.transform.function_execute_condition ? global.transform.function_execute_condition + ' ' : ''%>run \ + function ./<%animation.duration%>_locator_<%node.storage_name%> + } ELSE { + execute \ + positioned \ + ^<%roundTo(global.transform.pos[0], 10)%> \ + ^<%roundTo(global.transform.pos[1], 10)%> \ + ^<%roundTo(global.transform.pos[2], 10)%> \ + rotated \ + ~<%roundTo(global.transform.head_rot[1], 10)%> \ + ~<%roundTo(global.transform.head_rot[0], 10)%> \ + <%global.transform.function_execute_condition ? global.transform.function_execute_condition + ' ' : ''%>run \ + function ./<%animation.duration%>_locator_<%node.storage_name%> + } + } + + IF (global.frame.variants?.length > 0) { + execute <%global.frame.variants_execute_condition ? global.frame.variants_execute_condition + ' ' : ''%>run \ + function <%blueprint_id%>/variants/<%global.frame.variants[0].name%>/apply + } + + IF (global.frame.function) { + execute <%global.frame.function_execute_condition ? global.frame.function_execute_condition + ' ' : ''%>run \ + block <%animation.duration%>_function_keyframe { + <%global.frame.function%> + } + } + } + } + <%% // A record of node uuid to INodeTransform. // Keeps track of the last time a bone was updated. @@ -409,7 +456,7 @@ dir animations { if (transform.function) { if (node.config?.use_entity) { frameFunc += - `\n$execute on vehicle unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] as $(${node.storage_name}) ` + `\n$execute unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] as $(${node.storage_name}) ` + `positioned ^${roundTo(transform.pos[0], 10)} ^${roundTo(transform.pos[1], 10)} ^${roundTo(transform.pos[2], 10)} ` + `rotated ~${roundTo(transform.head_rot[1], 10)} ~${roundTo(transform.head_rot[0], 10)} ` + `${transform.function_execute_condition ? transform.function_execute_condition + ' ' : ''}run ` @@ -419,7 +466,7 @@ dir animations { + `\n}` } else { frameFunc += - `\nexecute on vehicle unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] ` + `\nexecute unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] ` + `positioned ^${roundTo(transform.pos[0], 10)} ^${roundTo(transform.pos[1], 10)} ^${roundTo(transform.pos[2], 10)} ` + `rotated ~${roundTo(transform.head_rot[1], 10)} ~${roundTo(transform.head_rot[0], 10)} ` + `${transform.function_execute_condition ? transform.function_execute_condition + ' ' : ''}run ` @@ -448,9 +495,10 @@ dir animations { } if (Object.keys(to_merge.locators).length > 0 || Object.keys(to_merge.cameras).length > 0) { - frameFunc += `\ndata modify entity @s data merge value ${JSON.stringify(to_merge)}` + frameFunc += `\ndata modify storage <%temp_storage%> entry.data merge value ${JSON.stringify(to_merge)}` + frameFunc += `\ndata_manager write` if (!auto_update_rig_orientation) { - frameFunc += `\nfunction ./on_tick/transform_floating_entities` + frameFunc += `\nfunction ${blueprint_id}/root/on_tick/transform_floating_entities` } hasFunction = true } @@ -461,14 +509,14 @@ dir animations { throw new Error(`Could not find Variant with uuid "${frame.variants[0]}" while generating frame "${frameIndex}" of animation "${animation.name}".`) } const execute_condition = frame.variants_execute_condition ? frame.variants_execute_condition + ' ' : '' - frameFunc += `\nexecute on vehicle unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] ${execute_condition}run function *${export_namespace}/variants/${variant.name}/apply` + frameFunc += `\nexecute unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] ${execute_condition}run function ${blueprint_id}/variants/${variant.name}/apply` ;hasFunction = true } // Root function keyframes. if (frame.function) { const execute_condition = frame.function_execute_condition ? frame.function_execute_condition + ' ' : '' - frameFunc += `\nexecute on vehicle unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] at @s ${execute_condition}run block ${frameIndex}_root_function%NEWLINE_PATCH%{\n${frame.function}\n}` + frameFunc += `\nexecute unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] at @s ${execute_condition}run block ${frameIndex}_root_function%NEWLINE_PATCH%{\n${frame.function}\n}` ;hasFunction = true } ;if (frameFunc.length > 0) { @@ -484,10 +532,10 @@ dir animations { } function pause_all { # Pauses all animations - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> REPEAT (animations) as animation { - tag @s remove <%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%> + tag @s remove <%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%> } } } @@ -504,97 +552,112 @@ function summon { '<%TAGS.NEW()%>', \ '<%TAGS.GLOBAL_ENTITY()%>', \ '<%TAGS.GLOBAL_ROOT()%>', \ - '<%TAGS.PROJECT_ENTITY(export_namespace)%>', \ - '<%TAGS.PROJECT_ROOT(export_namespace)%>' \ + '<%TAGS.PROJECT_ENTITY(blueprint_id)%>', \ + '<%TAGS.PROJECT_ROOT(blueprint_id)%>' \ ], \ teleport_duration: 0, \ interpolation_duration: <%interpolation_duration%>, \ Passengers:<%root_entity_passengers%>, \ + CustomName: '<%ENTITY_NAMES.ROOT(blueprint_id)%>', \ } execute as @e[ \ type=minecraft:item_display, \ - tag=<%TAGS.PROJECT_ROOT(export_namespace)%>, \ + tag=<%TAGS.PROJECT_ROOT(blueprint_id)%>, \ tag=<%TAGS.NEW()%>, \ limit=1, distance=..0.01 \ ] run block zzz/summon/as_root_entity { execute store result score @s <%OBJECTIVES.ID()%> run scoreboard players add aj.last_id <%OBJECTIVES.ID()%> 1 + + data_manager init prep read + # Data manager init runs gu:get_entity_uuid_string. So we don't need to call it again here. + # function animated_java:global/gu/get_entity_uuid_string + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.root_uuid set from storage <%gu_storage%> out + + data modify storage <%temp_storage%> entry.data.blueprint_id set value "<%blueprint_id%>" + data modify storage <%temp_storage%> entry.data.rig_hash set value "<%rig_hash%>" + # Align the position and rotation of the root with the command context. tp @s ~ ~ ~ ~ ~ - function *global/gu/get_entity_uuid_string - execute at @s on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block as_data_entity { - # Rig Root UUID - data modify storage <%temp_storage%> root_uuid set from storage <%gu_storage%> out - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.root_uuid set from storage <%gu_storage%> out - # Data Entity UUID - function *global/gu/get_entity_uuid_string - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.data_data set from storage <%gu_storage%> out + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { + summon <%locator.config.entity_type%> \ + ^<%roundTo(locator.default_transform.pos[0], 10)%> \ + ^<%roundTo(locator.default_transform.pos[1], 10)%> \ + ^<%roundTo(locator.default_transform.pos[2], 10)%> \ + {Tags:<%getNodeTags(locator, rig)%>} + execute \ + as @e[ \ + type=<%locator.config.entity_type%>, \ + tag=<%TAGS.PROJECT_LOCATOR_NAMED(blueprint_id, locator.storage_name)%>, \ + tag=<%TAGS.NEW()%>, \ + limit=1, distance=..<%Math.ceil(locator.max_distance)%> \ + ] \ + run block as_locator/<%locator.storage_name%> { + # run block ../as_locator/<%locator.storage_name%> { + tag @s remove <%TAGS.NEW()%> + data modify entity @s CustomName set value '<%ENTITY_NAMES.NODE(blueprint_id, locator.type, locator.storage_name)%>' + function animated_java:global/gu/get_entity_uuid_string + scoreboard players operation @s <%OBJECTIVES.ID()%> = aj.last_id <%OBJECTIVES.ID()%> + } + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids_by_name.<%locator.storage_name%> set from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.locators.<%locator.storage_name%>.uuid set from storage <%gu_storage%> out + } - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - summon <%locator.config.entity_type%> \ - ^<%roundTo(locator.default_transform.pos[0], 10)%> \ - ^<%roundTo(locator.default_transform.pos[1], 10)%> \ - ^<%roundTo(locator.default_transform.pos[2], 10)%> \ - {Tags:<%getNodeTags(locator, rig)%>} - execute \ - as @e[ \ - type=<%locator.config.entity_type%>, \ - tag=<%TAGS.PROJECT_LOCATOR_NAMED(export_namespace, locator.storage_name)%>, \ - tag=<%TAGS.NEW()%>, \ - limit=1, distance=..<%Math.ceil(locator.max_distance)%> \ - ] \ - run block as_locator/<%locator.storage_name%> { - # run block ../as_locator/<%locator.storage_name%> { - tag @s remove <%TAGS.NEW()%> - function *global/gu/get_entity_uuid_string - data modify entity @s data.root_uuid set from storage <%temp_storage%> root_uuid - } - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.<%locator.storage_name%> set from storage <%gu_storage%> out - data modify entity @s data.locators.<%locator.storage_name%>.uuid set from storage <%gu_storage%> out + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { + summon minecraft:item_display \ + ^<%roundTo(camera.default_transform.pos[0], 10)%> \ + ^<%roundTo(camera.default_transform.pos[1], 10)%> \ + ^<%roundTo(camera.default_transform.pos[2], 10)%> \ + {Tags:<%getNodeTags(camera, rig)%>, teleport_duration: 2} + execute \ + as @e[ \ + type=minecraft:item_display, \ + tag=<%TAGS.PROJECT_CAMERA_NAMED(blueprint_id, camera.storage_name)%>, \ + tag=<%TAGS.NEW()%>, \ + limit=1, distance=..<%Math.ceil(camera.max_distance)%> \ + ] \ + run block as_camera/<%camera.storage_name%> { + # run block ../as_camera/<%camera.storage_name%> { + tag @s remove <%TAGS.NEW()%> + data modify entity @s CustomName set value '<%ENTITY_NAMES.NODE(blueprint_id, camera.type, camera.storage_name)%>' + function animated_java:global/gu/get_entity_uuid_string + scoreboard players operation @s <%OBJECTIVES.ID()%> = aj.last_id <%OBJECTIVES.ID()%> } + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids_by_name.<%camera.storage_name%> set from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%>.uuid set from storage <%gu_storage%> out + } - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - summon minecraft:item_display \ - ^<%roundTo(camera.default_transform.pos[0], 10)%> \ - ^<%roundTo(camera.default_transform.pos[1], 10)%> \ - ^<%roundTo(camera.default_transform.pos[2], 10)%> \ - {Tags:<%getNodeTags(camera, rig)%>, teleport_duration: 2} - execute \ - as @e[ \ - type=minecraft:item_display, \ - tag=<%TAGS.PROJECT_CAMERA_NAMED(export_namespace, camera.storage_name)%>, \ - tag=<%TAGS.NEW()%>, \ - limit=1, distance=..<%Math.ceil(camera.max_distance)%> \ - ] \ - run block as_camera/<%camera.storage_name%> { - # run block ../as_camera/<%camera.storage_name%> { - tag @s remove <%TAGS.NEW()%> - function *global/gu/get_entity_uuid_string - data modify entity @s data.root_uuid set from storage <%temp_storage%> root_uuid - } - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.<%camera.storage_name%> set from storage <%gu_storage%> out - data modify entity @s data.cameras.<%camera.storage_name%>.uuid set from storage <%gu_storage%> out + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + execute \ + on passengers \ + if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ + run block as_node/<%node.storage_name%> { + data modify entity @s CustomName set value '<%ENTITY_NAMES.NODE(blueprint_id, node.type, node.storage_name)%>' + function animated_java:global/gu/get_entity_uuid_string + scoreboard players operation @s <%OBJECTIVES.ID()%> = aj.last_id <%OBJECTIVES.ID()%> } - REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { - execute \ - on vehicle \ - on passengers \ - if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ - run block as_node/<%node.storage_name%> { - function *global/gu/get_entity_uuid_string - data modify entity @s data.root_uuid set from storage <%temp_storage%> root_uuid - } + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids_by_name.<%node.storage_name%> set from storage <%gu_storage%> out + } - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.<%node.storage_name%> set from storage <%gu_storage%> out + IF (has_entity_locators) { + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { + block { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + # Track any custom entities on the locator. + $execute at @s as $(uuid) at @s run function animated_java:global/util/get_entity_stack_uuids + } + data modify storage <%temp_storage%> entry.data.uuids append from storage <%temp_storage%> uuids } } + function <%blueprint_id%>/zzz/set_default_pose + + data_manager write + # Variant Arguement IF (Object.keys(rig.variants).length > 1) { execute if data storage <%temp_storage%> args.variant run block variant_arg/process { with storage <%temp_storage%> args @@ -603,12 +666,12 @@ function summon { execute if data storage <%temp_storage%> {args:{variant:''}} run return run block if_empty { # Tell the user that the variant cannot be empty. tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('variant')%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function } # Attempt to apply the requested variant. # We get the success of the `try_apply` function in just in case the user's arguments are *very* wrong. execute store success score #success <%OBJECTIVES.I()%> run block try_apply { with storage <%temp_storage%> args - $execute if function animated_java:<%export_namespace%>/variants/$(variant)/apply run return 1 + $execute if function <%blueprint_id%>/variants/$(variant)/apply run return 1 # If the apply function fails, the variant doesn't exist, so we return an error. return fail } @@ -616,21 +679,19 @@ function summon { execute unless score #success <%OBJECTIVES.I()%> matches 1 run return run block invalid_variant { # Tell the user that the provided variant doesn't exist, remove the rig, and list all available variants for this rig. tellraw @a <%TELLRAW.INVALID_VARIANT(rig.variants)%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function } scoreboard players set #success <%OBJECTIVES.I()%> 1 } } ELSE { execute if data storage <%temp_storage%> args.variant run block zzz/variant_arg/no_variants_warning { tellraw @a <%TELLRAW.NO_VARIANTS()%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function scoreboard players set #success <%OBJECTIVES.I()%> 0 } } execute if score #success <%OBJECTIVES.I()%> matches 0 run return fail - function *<%export_namespace%>/set_default_pose - # Animation Argument # If the animation argument is provided, attempt to apply the animation. execute if data storage <%temp_storage%> args.animation run block animation_arg/process { with storage <%temp_storage%> args @@ -638,7 +699,7 @@ function summon { # If the animation argument is *explicitly* set to an empty string, return an error. execute if data storage <%temp_storage%> {args:{animation:''}} run return run block if_empty { tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('animation')%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function } # Automatically set the frame argument to 0 if the frame argument is not provided. # Takes advantage of `store result score` setting the score to 0 if the command fails. @@ -651,13 +712,13 @@ function summon { execute if score #frame <%OBJECTIVES.I()%> matches ..-1 run return run block no_negative { # Tell the user that the frame argument cannot be negative. tellraw @a <%TELLRAW.FRAME_CANNOT_BE_NEGATIVE()%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function } # Attempt to apply the animation frame. execute store success score #success <%OBJECTIVES.I()%> run block try_set_frame { with storage <%temp_storage%> args # Make sure we're only applying transforms when setting the summon pose. tag @s add <%TAGS.TRANSFORMS_ONLY()%> - $execute store success score #success <%OBJECTIVES.I()%> run function *<%export_namespace%>/animations/$(animation)/zzz/set_frame with storage <%temp_storage%> args + $execute store success score #success <%OBJECTIVES.I()%> run function <%blueprint_id%>/animations/$(animation)/zzz/set_frame with storage <%temp_storage%> args tag @s remove <%TAGS.TRANSFORMS_ONLY()%> execute if score #success <%OBJECTIVES.I()%> matches 1 run return 1 # If the set_frame function fails, the animation doesn't exist, so we return an error. @@ -667,22 +728,19 @@ function summon { execute unless score #success <%OBJECTIVES.I()%> matches 1 run return run block invalid_animation { # Tell the user that the provided animation doesn't exist, remove the rig, and list all available animations for this rig. tellraw @a <%TELLRAW.INVALID_ANIMATION(animations)%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function } # If the animation is successfully applied, and the start_animation argument is set to true, start the animation. execute if data storage <%temp_storage%> {args:{start_animation: true}} run block start_animation { with storage <%temp_storage%> args - $function *<%export_namespace%>/animations/$(animation)/resume + $function <%blueprint_id%>/animations/$(animation)/resume } scoreboard players set #success <%OBJECTIVES.I()%> 1 } execute if score #success <%OBJECTIVES.I()%> matches 0 run return fail IF (has_locators || has_cameras) { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run function ./on_tick/transform_floating_entities + function <%blueprint_id%>/root/on_tick/transform_floating_entities } execute on passengers run tp @s ~ ~ ~ ~ ~ @@ -691,26 +749,21 @@ function summon { execute on passengers run data modify entity @s teleport_duration set value <%teleportation_duration%> IF (has_entity_locators) { - execute at @s on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block locators_on_summon { - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity && node.config.on_summon_function)) as locator { - block { with entity @s data.locators.<%locator.storage_name%> - $execute as $(uuid) at @s run block <%locator.storage_name%> { - <%% - emit.mcb(locator.config.on_summon_function) - %%> - # Track any custom entities on the locator. - function *global/util/get_entity_stack_uuids - } + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity && node.config.on_summon_function)) as locator { + block { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + $execute at @s as $(uuid) at @s run block on_summon/custom_<%locator.type + '_' + locator.storage_name%> { + <%% + emit.mcb(locator.config.on_summon_function) + %%> } - data modify entity @s data.uuids append from storage <%temp_storage%> uuids } } } REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type) && node.on_summon_function?.trim())) as node { execute \ - on passengers if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ - run block node_on_summon_<%node.storage_name%> { + on passengers if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ + run block on_summon/<%node.type + '_' + node.storage_name%> { <%% emit.mcb(node.on_summon_function.trim()) %%> @@ -718,7 +771,7 @@ function summon { } IF (on_summon_function) { - execute at @s run block rig_on_summon { + execute at @s run block on_summon/rig { <%% emit.mcb(on_summon_function) %%> @@ -733,7 +786,7 @@ function summon { function as_node { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -742,8 +795,10 @@ function as_node { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block zzz/as_node/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.uuids_by_name.$(name) + data_manager prep read + + block zzz/as_node/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.uuids_by_name.$(name) IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -767,7 +822,7 @@ function as_node { IF (has_entity_locators) { function as_locator { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -777,11 +832,10 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/as_locator/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.$(name).uuid + data_manager prep read + + block zzz/as_locator/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.$(name).uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -804,7 +858,7 @@ IF (has_entity_locators) { function as_at_locator { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -814,11 +868,10 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/as_locator/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.$(name).uuid + data_manager prep read + + block zzz/as_locator/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.$(name).uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -841,7 +894,7 @@ IF (has_entity_locators) { function as_all_locators { #ARGS: {command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {command:'$(command)'} @@ -850,9 +903,11 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block zzz/as_all_locators/as_data { + data_manager prep read + + block zzz/as_all_locators/as_data { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.<%locator.storage_name%>.uuid + data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.<%locator.storage_name%>.uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -876,7 +931,7 @@ IF (has_entity_locators) { function as_at_all_locators { #ARGS: {command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {command:'$(command)'} @@ -885,9 +940,11 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block zzz/as_all_locators/as_data { + data_manager prep read + + block zzz/as_all_locators/as_data { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.<%locator.storage_name%>.uuid + data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.<%locator.storage_name%>.uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -913,7 +970,7 @@ IF (has_entity_locators) { IF (has_locators) { function at_locator { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)'} @@ -923,15 +980,13 @@ IF (has_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute \ - at @s \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/at_locator/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args merge from entity @s data.locators.$(name) + data_manager prep read + + execute at @s run block zzz/at_locator/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args merge from storage <%temp_storage%> entry.data.locators.$(name) IF (debug_mode) { - execute unless data storage <%temp_storage%> args.uuid run return run tellraw @a <%TELLRAW.LOCATOR_NOT_FOUND()%> + execute unless data storage <%temp_storage%> args.px run return run tellraw @a <%TELLRAW.LOCATOR_NOT_FOUND()%> scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -955,7 +1010,7 @@ IF (has_locators) { function at_all_locators { #ARGS: {command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {command:'$(command)'} @@ -964,9 +1019,11 @@ IF (has_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute at @s on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block zzz/at_all_locators/as_data { + data_manager prep read + + block zzz/at_all_locators/as_data { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - data modify storage <%temp_storage%> args merge from entity @s data.locators.<%locator.storage_name%> + data modify storage <%temp_storage%> args merge from storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -995,7 +1052,7 @@ IF (has_locators) { IF (has_cameras) { function as_camera { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -1005,11 +1062,10 @@ IF (has_cameras) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/as_camera/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.cameras.$(name).uuid + data_manager prep read + + block zzz/as_camera/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.cameras.$(name).uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -1038,10 +1094,13 @@ IF (has_cameras) { function as_root { #ARGS: {command: string} - debug assert executed_as_entity_with_root_uuid_data + execute unless score @s <%OBJECTIVES.ID()%> matches <%-(2**31)%>..<%(2**31)-1%> run return run \ + tellraw @a <%TELLRAW.FUNCTION_NOT_EXECUTED_AS_ENTITY_WITH_ID_SCORE(context.functions.at(-1))%> + + data_manager prep read $data modify storage <%temp_storage%> args.command set value '$(command)' - data modify storage <%temp_storage%> args.root_uuid set from entity @s data.root_uuid + data modify storage <%temp_storage%> args.root_uuid set from storage <%temp_storage%> entry.data.root_uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -1062,44 +1121,43 @@ function as_root { dir remove { function all { # Removes all instances of this rig from the world. - execute as @e[type=minecraft:item_display,tag=<%TAGS.PROJECT_ROOT(export_namespace)%>] run function *<%export_namespace%>/remove/this + execute as @e[type=minecraft:item_display,tag=<%TAGS.PROJECT_ROOT(blueprint_id)%>] run function <%blueprint_id%>/remove/this } function entities { # Removes all entities related to this rig from the world. - kill @e[tag=<%TAGS.PROJECT_ENTITY(export_namespace)%>] + kill @e[tag=<%TAGS.PROJECT_ENTITY(blueprint_id)%>] } function this { # Removes the rig this function is executed as. - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> <%% if (on_remove_function) emit.mcb(on_remove_function) %%> IF (has_entity_locators) { - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block as_data { - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - IF (locator.config?.on_remove_function) { - IF (locator.config.use_entity) { - block as_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> - $execute as $(uuid) at @s run block locator_<%locator.storage_name%>_on_remove { - <%% - emit.mcb(locator.config.on_remove_function) - %%> - } + data_manager prep read + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { + IF (locator.config?.on_remove_function) { + IF (locator.config.use_entity) { + block as_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + $execute as $(uuid) at @s run block locator_<%locator.storage_name%>_on_remove { + <%% + emit.mcb(locator.config.on_remove_function) + %%> } - } ELSE { - block at_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> - $execute \ - positioned ^$(px) ^$(py) ^$(pz) \ - rotated ~$(ry) ~$(rx) \ - run block locator_<%locator.storage_name%>_on_remove { - <%% - emit.mcb(locator.config.on_remove_function) - %%> - } + } + } ELSE { + block at_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + $execute \ + positioned ^$(px) ^$(py) ^$(pz) \ + rotated ~$(ry) ~$(rx) \ + run block locator_<%locator.storage_name%>_on_remove { + <%% + emit.mcb(locator.config.on_remove_function) + %%> } } } @@ -1112,27 +1170,30 @@ dir remove { dir this { function without_on_remove_function { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + data_manager prep read IF (has_entity_locators || has_cameras) { - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block as_data { - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - function animated_java:global/remove/entity_stack_by_uuid with entity @s data.locators.<%locator.storage_name%> - } - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - function animated_java:global/remove/entity_stack_by_uuid with entity @s data.cameras.<%camera.storage_name%> - } + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { + function animated_java:global/remove/entity_stack_by_uuid with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + } + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { + function animated_java:global/remove/entity_stack_by_uuid with storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> } } # Remove the rig using the more expensive & thorough method if the rig_hash doesn't match. execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - unless data entity @s {data:{rig_hash: '<%rig_hash%>'}} \ - on vehicle \ + unless data storage <%temp_storage%> {entry:{data:{rig_hash: '<%rig_hash%>'}}} \ run function animated_java:global/remove/outdated_rig + block { with storage <%temp_storage%> entry.data.uuids_by_name + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + $kill $(<%node.storage_name%>) + } + } + function animated_java:global/remove/entity_stack } } @@ -1143,7 +1204,7 @@ IF (Object.keys(rig.variants).length > 1) { REPEAT (Object.values(rig.variants)) as variant { dir <%variant.name%> { function apply { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> <%% global.filteredNodes = Object.values(rig.nodes).filter( @@ -1166,7 +1227,7 @@ IF (Object.keys(rig.variants).length > 1) { REPEAT (global.filteredNodes) as node { execute \ on passengers \ - if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ + if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ at @s \ run \ block zzz/apply_to_node_<%node.storage_name%> { @@ -1206,21 +1267,25 @@ IF (has_locators || has_cameras) { function reset_floating_entities { IF (has_locators) { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - execute \ - at @s \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/set_default_pose/as_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> - IF (locator.config?.use_entity) { + IF (locator.config?.use_entity) { + execute at @s run block set_default_pose/as_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> $tp $(uuid) \ ^<%roundTo(locator.default_transform.pos[0], 10)%> \ ^<%roundTo(locator.default_transform.pos[1], 10)%> \ ^<%roundTo(locator.default_transform.pos[2], 10)%> \ ~<%roundTo(locator.default_transform.head_rot[1], 10)%> \ ~<%roundTo(locator.default_transform.head_rot[0], 10)%> - } - data modify entity @s data.locators.<%locator.storage_name%> merge value { \ + data modify storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> merge value { \ + px: <%roundTo(locator.default_transform.pos[0], 10)%>, \ + py: <%roundTo(locator.default_transform.pos[1], 10)%>, \ + pz: <%roundTo(locator.default_transform.pos[2], 10)%>, \ + ry: <%roundTo(locator.default_transform.head_rot[1], 10)%>, \ + rx: <%roundTo(locator.default_transform.head_rot[0], 10)%> \ + } + } + } ELSE { + data modify storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> merge value { \ px: <%roundTo(locator.default_transform.pos[0], 10)%>, \ py: <%roundTo(locator.default_transform.pos[1], 10)%>, \ pz: <%roundTo(locator.default_transform.pos[2], 10)%>, \ @@ -1233,11 +1298,7 @@ IF (has_locators || has_cameras) { IF (has_cameras) { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - execute \ - at @s \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/set_default_pose/as_camera_<%camera.storage_name%> { with entity @s data.cameras.<%camera.storage_name%> + execute at @s run block set_default_pose/as_camera_<%camera.storage_name%> { with storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> $tp $(uuid) \ ^<%roundTo(camera.default_transform.pos[0], 10)%> \ ^<%roundTo(camera.default_transform.pos[1], 10)%> \ @@ -1245,7 +1306,7 @@ IF (has_locators || has_cameras) { ~<%roundTo(camera.default_transform.head_rot[1], 10)%> \ ~<%roundTo(camera.default_transform.head_rot[0], 10)%> - data modify entity @s data.cameras.<%camera.storage_name%> merge value { \ + data modify storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> merge value { \ px: <%roundTo(camera.default_transform.pos[0], 10)%>, \ py: <%roundTo(camera.default_transform.pos[1], 10)%>, \ pz: <%roundTo(camera.default_transform.pos[2], 10)%>, \ @@ -1259,42 +1320,58 @@ IF (has_locators || has_cameras) { } } +dir zzz { + function apply_default_pose { + IF (has_locators || has_cameras) { + function ../zzz/reset_floating_entities + } + + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + execute \ + on passengers \ + if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ + run \ + data merge entity @s { \ + transformation: <%matrixToNbtFloatArray(node.default_transform.matrix).toString()%>, \ + start_interpolation: 0 \ + } + } + } + + function set_default_pose { + IF (has_locators || has_cameras) { + function ../zzz/reset_floating_entities + } + + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + execute \ + on passengers \ + if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ + run \ + data merge entity @s { \ + transformation: <%matrixToNbtFloatArray(node.default_transform.matrix).toString()%>, \ + start_interpolation: -1 \ + } + } + } +} + function apply_default_pose { # Changes the pose of the rig to the the default pose with interpolation - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> IF (has_locators || has_cameras) { - function ./zzz/reset_floating_entities - } - - REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ - run \ - data merge entity @s { \ - transformation: <%matrixToNbtFloatArray(node.default_transform.matrix).toString()%>, \ - start_interpolation: 0 \ - } + data_manager prep read } + function ./zzz/apply_default_pose } function set_default_pose { # Changes the pose of the rig to the the default pose without interpolation - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> IF (has_locators || has_cameras) { - function ./zzz/reset_floating_entities + data_manager prep read } - - REPEAT (Object.values(rig.nodes).filter(node => node.type !== 'locator' && node.type !== 'camera')) as node { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ - run \ - data merge entity @s { \ - transformation: <%matrixToNbtFloatArray(node.default_transform.matrix).toString()%>, \ - start_interpolation: -1 \ - } - } -} + function ./zzz/set_default_pose +} \ No newline at end of file diff --git a/src/systems/datapackCompiler/1.20.5/static.mcb b/src/systems/datapackCompiler/1.20.5/static.mcb index 0e875c16..fb97cddb 100644 --- a/src/systems/datapackCompiler/1.20.5/static.mcb +++ b/src/systems/datapackCompiler/1.20.5/static.mcb @@ -1,17 +1,14 @@ # TODO - Move all internal functions into an internal namespace, and only have user-facing functions in the main `animated_java:<%export_namespace%>` namespace. -import ../global.mcbt + +# DIFFERENCES FROM 1.20.4: +# - Item components: item.tag.CustomModelData -> item.components."minecraft:custom_model_data" + function on_load { data modify storage <%project_storage%> rig_hash set value <%"'" + rig_hash + "'"%> } -function invalid_version_warning { - # This function will contain a tellraw if the datapack is loaded in the wrong version. -} - dir root { function on_tick { - execute unless entity @s[tag=<%TAGS.PROJECT_ROOT(export_namespace)%>] run return 0 - # Custom pre-tick function IF (on_pre_tick_function) { <%% @@ -21,17 +18,11 @@ dir root { IF (auto_update_rig_orientation) { IF (has_locators || has_cameras) { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run function ./on_tick/transform_floating_entities + function <%blueprint_id%>/root/on_tick/transform_floating_entities } execute on passengers run tp @s ~ ~ ~ ~ ~ } ELSE IF (has_ticking_locators) { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run function ./on_tick/transform_locators + function <%blueprint_id%>/root/on_tick/transform_locators } # Custom post-tick function @@ -46,7 +37,7 @@ dir root { dir on_tick { function transform_locators { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - block select_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> + block select_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> IF (locator.config?.use_entity) { $execute \ as $(uuid) \ @@ -83,7 +74,7 @@ dir root { function ./transform_locators REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - block select_camera_<%camera.storage_name%> { with entity @s data.cameras.<%camera.storage_name%> + block select_camera_<%camera.storage_name%> { with storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> $execute \ as $(uuid) \ positioned ^$(px) ^$(py) ^$(pz) \ @@ -98,15 +89,13 @@ dir root { IF (!auto_update_rig_orientation) { function move { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> tp @s ~ ~ ~ ~ ~ IF (has_locators || has_cameras) { - execute \ - at @s on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run function ./on_tick/transform_floating_entities + data_manager prep read + function <%blueprint_id%>/root/on_tick/transform_floating_entities } execute at @s on passengers run tp @s ~ ~ ~ ~ ~ } @@ -127,90 +116,111 @@ function summon { '<%TAGS.NEW()%>', \ '<%TAGS.GLOBAL_ENTITY()%>', \ '<%TAGS.GLOBAL_ROOT()%>', \ - '<%TAGS.PROJECT_ENTITY(export_namespace)%>', \ - '<%TAGS.PROJECT_ROOT(export_namespace)%>' \ + '<%TAGS.PROJECT_ENTITY(blueprint_id)%>', \ + '<%TAGS.PROJECT_ROOT(blueprint_id)%>' \ ], \ teleport_duration: 0, \ interpolation_duration: <%interpolation_duration%>, \ Passengers:<%root_entity_passengers%>, \ + CustomName: '<%ENTITY_NAMES.ROOT(blueprint_id)%>', \ } execute as @e[ \ type=minecraft:item_display, \ - tag=<%TAGS.PROJECT_ROOT(export_namespace)%>, \ + tag=<%TAGS.PROJECT_ROOT(blueprint_id)%>, \ tag=<%TAGS.NEW()%>, \ limit=1, distance=..0.01 \ ] run block zzz/summon/as_root_entity { execute store result score @s <%OBJECTIVES.ID()%> run scoreboard players add aj.last_id <%OBJECTIVES.ID()%> 1 + + data_manager init prep read + # Data manager init runs gu:get_entity_uuid_string. So we don't need to call it again here. + # function animated_java:global/gu/get_entity_uuid_string + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.root_uuid set from storage <%gu_storage%> out + + data modify storage <%temp_storage%> entry.data.blueprint_id set value "<%blueprint_id%>" + data modify storage <%temp_storage%> entry.data.rig_hash set value "<%rig_hash%>" + # Align the position and rotation of the root with the command context. tp @s ~ ~ ~ ~ ~ - function *global/gu/get_entity_uuid_string - execute at @s on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block as_data_entity { - # Rig Root UUID - data modify entity @s data.uuids append from storage <%gu_storage%> out - # Data Entity UUID - function *global/gu/get_entity_uuid_string - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.data_data set from storage <%gu_storage%> out + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { + summon <%locator.config.entity_type%> \ + ^<%roundTo(locator.default_transform.pos[0], 10)%> \ + ^<%roundTo(locator.default_transform.pos[1], 10)%> \ + ^<%roundTo(locator.default_transform.pos[2], 10)%> \ + {Tags:<%getNodeTags(locator, rig)%>} + execute \ + as @e[ \ + type=<%locator.config.entity_type%>, \ + tag=<%TAGS.PROJECT_LOCATOR_NAMED(blueprint_id, locator.storage_name)%>, \ + tag=<%TAGS.NEW()%>, \ + limit=1, distance=..<%Math.ceil(locator.max_distance)%> \ + ] \ + run block as_locator/<%locator.storage_name%> { + # run block ../as_locator/<%locator.storage_name%> { + tag @s remove <%TAGS.NEW()%> + data modify entity @s CustomName set value '<%ENTITY_NAMES.NODE(blueprint_id, locator.type, locator.storage_name)%>' + function animated_java:global/gu/get_entity_uuid_string + scoreboard players operation @s <%OBJECTIVES.ID()%> = aj.last_id <%OBJECTIVES.ID()%> + } + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids_by_name.<%locator.storage_name%> set from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.locators.<%locator.storage_name%>.uuid set from storage <%gu_storage%> out + } + + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { + summon minecraft:item_display \ + ^<%roundTo(camera.default_transform.pos[0], 10)%> \ + ^<%roundTo(camera.default_transform.pos[1], 10)%> \ + ^<%roundTo(camera.default_transform.pos[2], 10)%> \ + {Tags:<%getNodeTags(camera, rig)%>, teleport_duration: 2} + execute \ + as @e[ \ + type=minecraft:item_display, \ + tag=<%TAGS.PROJECT_CAMERA_NAMED(blueprint_id, camera.storage_name)%>, \ + tag=<%TAGS.NEW()%>, \ + limit=1, distance=..<%Math.ceil(camera.max_distance)%> \ + ] \ + run block as_camera/<%camera.storage_name%> { + # run block ../as_camera/<%camera.storage_name%> { + tag @s remove <%TAGS.NEW()%> + data modify entity @s CustomName set value '<%ENTITY_NAMES.NODE(blueprint_id, camera.type, camera.storage_name)%>' + function animated_java:global/gu/get_entity_uuid_string + scoreboard players operation @s <%OBJECTIVES.ID()%> = aj.last_id <%OBJECTIVES.ID()%> + } + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids_by_name.<%camera.storage_name%> set from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%>.uuid set from storage <%gu_storage%> out + } + + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + execute \ + on passengers \ + if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ + run block as_node/<%node.storage_name%> { + data modify entity @s CustomName set value '<%ENTITY_NAMES.NODE(blueprint_id, node.type, node.storage_name)%>' + function animated_java:global/gu/get_entity_uuid_string + scoreboard players operation @s <%OBJECTIVES.ID()%> = aj.last_id <%OBJECTIVES.ID()%> + } + + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids_by_name.<%node.storage_name%> set from storage <%gu_storage%> out + } + IF (has_entity_locators) { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - summon <%locator.config.entity_type%> \ - ^<%roundTo(locator.default_transform.pos[0], 10)%> \ - ^<%roundTo(locator.default_transform.pos[1], 10)%> \ - ^<%roundTo(locator.default_transform.pos[2], 10)%> \ - {Tags:<%getNodeTags(locator, rig)%>} - execute \ - as @e[ \ - type=<%locator.config.entity_type%>, \ - tag=<%TAGS.PROJECT_LOCATOR_NAMED(export_namespace, locator.storage_name)%>, \ - tag=<%TAGS.NEW()%>, \ - limit=1, distance=..<%Math.ceil(locator.max_distance)%> \ - ] \ - run block as_locator/<%locator.storage_name%> { - # run block ../as_locator/<%locator.storage_name%> { - tag @s remove <%TAGS.NEW()%> - function *global/gu/get_entity_uuid_string - } - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.<%locator.storage_name%> set from storage <%gu_storage%> out - data modify entity @s data.locators.<%locator.storage_name%>.uuid set from storage <%gu_storage%> out - } - - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - summon minecraft:item_display \ - ^<%roundTo(camera.default_transform.pos[0], 10)%> \ - ^<%roundTo(camera.default_transform.pos[1], 10)%> \ - ^<%roundTo(camera.default_transform.pos[2], 10)%> \ - {Tags:<%getNodeTags(camera, rig)%>, teleport_duration: 2} - execute \ - as @e[ \ - type=minecraft:item_display, \ - tag=<%TAGS.PROJECT_CAMERA_NAMED(export_namespace, camera.storage_name)%>, \ - tag=<%TAGS.NEW()%>, \ - limit=1, distance=..<%Math.ceil(camera.max_distance)%> \ - ] \ - run block as_camera/<%camera.storage_name%> { - # run block ../as_camera/<%camera.storage_name%> { - tag @s remove <%TAGS.NEW()%> - function *global/gu/get_entity_uuid_string + block { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + # Track any custom entities on the locator. + $execute at @s as $(uuid) at @s run function animated_java:global/util/get_entity_stack_uuids } - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.<%camera.storage_name%> set from storage <%gu_storage%> out - data modify entity @s data.cameras.<%camera.storage_name%>.uuid set from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids append from storage <%temp_storage%> uuids } + } - REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { - execute \ - on vehicle \ - on passengers \ - if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ - run \ - function *global/gu/get_entity_uuid_string + function <%blueprint_id%>/zzz/set_default_pose - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.<%node.storage_name%> set from storage <%gu_storage%> out - } - } + data_manager write # Variant Arguement IF (Object.keys(rig.variants).length > 1) { @@ -220,12 +230,12 @@ function summon { execute if data storage <%temp_storage%> {args:{variant:''}} run return run block if_empty { # Tell the user that the variant cannot be empty. tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('variant')%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function } # Attempt to apply the requested variant. # We get the success of the `try_apply` function in just in case the user's arguments are *very* wrong. execute store success score #success <%OBJECTIVES.I()%> run block try_apply { with storage <%temp_storage%> args - $execute if function animated_java:<%export_namespace%>/variants/$(variant)/apply run return 1 + $execute if function <%blueprint_id%>/variants/$(variant)/apply run return 1 # If the apply function fails, the variant doesn't exist, so we return an error. return fail } @@ -233,25 +243,21 @@ function summon { execute unless score #success <%OBJECTIVES.I()%> matches 1 run return run block invalid_variant { # Tell the user that the provided variant doesn't exist, remove the rig, and list all available variants for this rig. tellraw @a <%TELLRAW.INVALID_VARIANT(rig.variants)%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function } scoreboard players set #success <%OBJECTIVES.I()%> 1 } } ELSE { execute if data storage <%temp_storage%> args.variant run block zzz/variant_arg/no_variants_warning { tellraw @a <%TELLRAW.NO_VARIANTS()%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function scoreboard players set #success <%OBJECTIVES.I()%> 0 } } execute if score #success <%OBJECTIVES.I()%> matches 0 run return fail - function *<%export_namespace%>/set_default_pose IF (has_locators || has_cameras) { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run function ./on_tick/transform_floating_entities + function <%blueprint_id%>/root/on_tick/transform_floating_entities } execute on passengers run tp @s ~ ~ ~ ~ ~ @@ -260,26 +266,21 @@ function summon { execute on passengers run data modify entity @s teleport_duration set value <%teleportation_duration%> IF (has_entity_locators) { - execute at @s on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block locators_on_summon { - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity && node.config.on_summon_function)) as locator { - block { with entity @s data.locators.<%locator.storage_name%> - $execute as $(uuid) at @s run block <%locator.storage_name%> { - <%% - emit.mcb(locator.config.on_summon_function) - %%> - # Track any custom entities on the locator. - function *global/util/get_entity_stack_uuids - } + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity && node.config.on_summon_function)) as locator { + block { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + $execute at @s as $(uuid) at @s run block on_summon/custom_<%locator.type + '_' + locator.storage_name%> { + <%% + emit.mcb(locator.config.on_summon_function) + %%> } - data modify entity @s data.uuids append from storage <%temp_storage%> uuids } } } REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type) && node.on_summon_function?.trim())) as node { execute \ - on passengers if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ - run block node_on_summon_<%node.storage_name%> { + on passengers if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ + run block on_summon/<%node.type + '_' + node.storage_name%> { <%% emit.mcb(node.on_summon_function.trim()) %%> @@ -287,7 +288,7 @@ function summon { } IF (on_summon_function) { - execute at @s run block rig_on_summon { + execute at @s run block on_summon/rig { <%% emit.mcb(on_summon_function) %%> @@ -302,7 +303,7 @@ function summon { function as_node { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -311,8 +312,10 @@ function as_node { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block zzz/as_node/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.uuids_by_name.$(name) + data_manager prep read + + block zzz/as_node/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.uuids_by_name.$(name) IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -336,7 +339,7 @@ function as_node { IF (has_entity_locators) { function as_locator { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -346,11 +349,10 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/as_locator/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.$(name).uuid + data_manager prep read + + block zzz/as_locator/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.$(name).uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -373,7 +375,7 @@ IF (has_entity_locators) { function as_at_locator { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -383,11 +385,10 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/as_locator/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.$(name).uuid + data_manager prep read + + block zzz/as_locator/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.$(name).uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -410,7 +411,7 @@ IF (has_entity_locators) { function as_all_locators { #ARGS: {command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {command:'$(command)'} @@ -419,9 +420,11 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block zzz/as_all_locators/as_data { + data_manager prep read + + block zzz/as_all_locators/as_data { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.<%locator.storage_name%>.uuid + data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.<%locator.storage_name%>.uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -445,7 +448,7 @@ IF (has_entity_locators) { function as_at_all_locators { #ARGS: {command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {command:'$(command)'} @@ -454,9 +457,11 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block zzz/as_all_locators/as_data { + data_manager prep read + + block zzz/as_all_locators/as_data { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.<%locator.storage_name%>.uuid + data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.<%locator.storage_name%>.uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -482,7 +487,7 @@ IF (has_entity_locators) { IF (has_locators) { function at_locator { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)'} @@ -492,15 +497,13 @@ IF (has_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute \ - at @s \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/at_locator/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args merge from entity @s data.locators.$(name) + data_manager prep read + + execute at @s run block zzz/at_locator/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args merge from storage <%temp_storage%> entry.data.locators.$(name) IF (debug_mode) { - execute unless data storage <%temp_storage%> args.uuid run return run tellraw @a <%TELLRAW.LOCATOR_NOT_FOUND()%> + execute unless data storage <%temp_storage%> args.px run return run tellraw @a <%TELLRAW.LOCATOR_NOT_FOUND()%> scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -524,7 +527,7 @@ IF (has_locators) { function at_all_locators { #ARGS: {command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {command:'$(command)'} @@ -533,9 +536,11 @@ IF (has_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute at @s on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block zzz/at_all_locators/as_data { + data_manager prep read + + block zzz/at_all_locators/as_data { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - data modify storage <%temp_storage%> args merge from entity @s data.locators.<%locator.storage_name%> + data modify storage <%temp_storage%> args merge from storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -564,7 +569,7 @@ IF (has_locators) { IF (has_cameras) { function as_camera { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -574,11 +579,10 @@ IF (has_cameras) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/as_camera/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.cameras.$(name).uuid + data_manager prep read + + block zzz/as_camera/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.cameras.$(name).uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -607,10 +611,13 @@ IF (has_cameras) { function as_root { #ARGS: {command: string} - debug assert executed_as_entity_with_root_uuid_data + execute unless score @s <%OBJECTIVES.ID()%> matches <%-(2**31)%>..<%(2**31)-1%> run return run \ + tellraw @a <%TELLRAW.FUNCTION_NOT_EXECUTED_AS_ENTITY_WITH_ID_SCORE(context.functions.at(-1))%> + + data_manager prep read $data modify storage <%temp_storage%> args.command set value '$(command)' - data modify storage <%temp_storage%> args.root_uuid set from entity @s data.root_uuid + data modify storage <%temp_storage%> args.root_uuid set from storage <%temp_storage%> entry.data.root_uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -631,44 +638,43 @@ function as_root { dir remove { function all { # Removes all instances of this rig from the world. - execute as @e[type=minecraft:item_display,tag=<%TAGS.PROJECT_ROOT(export_namespace)%>] run function *<%export_namespace%>/remove/this + execute as @e[type=minecraft:item_display,tag=<%TAGS.PROJECT_ROOT(blueprint_id)%>] run function <%blueprint_id%>/remove/this } function entities { # Removes all entities related to this rig from the world. - kill @e[tag=<%TAGS.PROJECT_ENTITY(export_namespace)%>] + kill @e[tag=<%TAGS.PROJECT_ENTITY(blueprint_id)%>] } function this { # Removes the rig this function is executed as. - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> <%% if (on_remove_function) emit.mcb(on_remove_function) %%> IF (has_entity_locators) { - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block as_data { - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - IF (locator.config?.on_remove_function) { - IF (locator.config.use_entity) { - block as_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> - $execute as $(uuid) at @s run block locator_<%locator.storage_name%>_on_remove { - <%% - emit.mcb(locator.config.on_remove_function) - %%> - } + data_manager prep read + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { + IF (locator.config?.on_remove_function) { + IF (locator.config.use_entity) { + block as_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + $execute as $(uuid) at @s run block locator_<%locator.storage_name%>_on_remove { + <%% + emit.mcb(locator.config.on_remove_function) + %%> } - } ELSE { - block at_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> - $execute \ - positioned ^$(px) ^$(py) ^$(pz) \ - rotated ~$(ry) ~$(rx) \ - run block locator_<%locator.storage_name%>_on_remove { - <%% - emit.mcb(locator.config.on_remove_function) - %%> - } + } + } ELSE { + block at_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + $execute \ + positioned ^$(px) ^$(py) ^$(pz) \ + rotated ~$(ry) ~$(rx) \ + run block locator_<%locator.storage_name%>_on_remove { + <%% + emit.mcb(locator.config.on_remove_function) + %%> } } } @@ -681,27 +687,30 @@ dir remove { dir this { function without_on_remove_function { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + data_manager prep read IF (has_entity_locators || has_cameras) { - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block as_data { - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - function animated_java:global/remove/entity_stack_by_uuid with entity @s data.locators.<%locator.storage_name%> - } - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - function animated_java:global/remove/entity_stack_by_uuid with entity @s data.cameras.<%camera.storage_name%> - } + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { + function animated_java:global/remove/entity_stack_by_uuid with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + } + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { + function animated_java:global/remove/entity_stack_by_uuid with storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> } } # Remove the rig using the more expensive & thorough method if the rig_hash doesn't match. execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - unless data entity @s {data:{rig_hash: '<%rig_hash%>'}} \ - on vehicle \ + unless data storage <%temp_storage%> {entry:{data:{rig_hash: '<%rig_hash%>'}}} \ run function animated_java:global/remove/outdated_rig + block { with storage <%temp_storage%> entry.data.uuids_by_name + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + $kill $(<%node.storage_name%>) + } + } + function animated_java:global/remove/entity_stack } } @@ -712,7 +721,7 @@ IF (Object.keys(rig.variants).length > 1) { REPEAT (Object.values(rig.variants)) as variant { dir <%variant.name%> { function apply { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> <%% global.filteredNodes = Object.values(rig.nodes).filter( @@ -735,7 +744,7 @@ IF (Object.keys(rig.variants).length > 1) { REPEAT (global.filteredNodes) as node { execute \ on passengers \ - if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ + if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ at @s \ run \ block zzz/apply_to_node_<%node.storage_name%> { @@ -775,21 +784,25 @@ IF (has_locators || has_cameras) { function reset_floating_entities { IF (has_locators) { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - execute \ - at @s \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/set_default_pose/as_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> - IF (locator.config?.use_entity) { + IF (locator.config?.use_entity) { + execute at @s run block set_default_pose/as_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> $tp $(uuid) \ ^<%roundTo(locator.default_transform.pos[0], 10)%> \ ^<%roundTo(locator.default_transform.pos[1], 10)%> \ ^<%roundTo(locator.default_transform.pos[2], 10)%> \ ~<%roundTo(locator.default_transform.head_rot[1], 10)%> \ ~<%roundTo(locator.default_transform.head_rot[0], 10)%> - } - data modify entity @s data.locators.<%locator.storage_name%> merge value { \ + data modify storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> merge value { \ + px: <%roundTo(locator.default_transform.pos[0], 10)%>, \ + py: <%roundTo(locator.default_transform.pos[1], 10)%>, \ + pz: <%roundTo(locator.default_transform.pos[2], 10)%>, \ + ry: <%roundTo(locator.default_transform.head_rot[1], 10)%>, \ + rx: <%roundTo(locator.default_transform.head_rot[0], 10)%> \ + } + } + } ELSE { + data modify storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> merge value { \ px: <%roundTo(locator.default_transform.pos[0], 10)%>, \ py: <%roundTo(locator.default_transform.pos[1], 10)%>, \ pz: <%roundTo(locator.default_transform.pos[2], 10)%>, \ @@ -802,11 +815,7 @@ IF (has_locators || has_cameras) { IF (has_cameras) { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - execute \ - at @s \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/set_default_pose/as_camera_<%camera.storage_name%> { with entity @s data.cameras.<%camera.storage_name%> + execute at @s run block set_default_pose/as_camera_<%camera.storage_name%> { with storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> $tp $(uuid) \ ^<%roundTo(camera.default_transform.pos[0], 10)%> \ ^<%roundTo(camera.default_transform.pos[1], 10)%> \ @@ -814,7 +823,7 @@ IF (has_locators || has_cameras) { ~<%roundTo(camera.default_transform.head_rot[1], 10)%> \ ~<%roundTo(camera.default_transform.head_rot[0], 10)%> - data modify entity @s data.cameras.<%camera.storage_name%> merge value { \ + data modify storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> merge value { \ px: <%roundTo(camera.default_transform.pos[0], 10)%>, \ py: <%roundTo(camera.default_transform.pos[1], 10)%>, \ pz: <%roundTo(camera.default_transform.pos[2], 10)%>, \ @@ -828,22 +837,31 @@ IF (has_locators || has_cameras) { } } +dir zzz { + function set_default_pose { + IF (has_locators || has_cameras) { + function ../zzz/reset_floating_entities + } + + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + execute \ + on passengers \ + if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ + run \ + data merge entity @s { \ + transformation: <%matrixToNbtFloatArray(node.default_transform.matrix).toString()%>, \ + start_interpolation: -1 \ + } + } + } +} + function set_default_pose { # Changes the pose of the rig to the the default pose without interpolation - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> IF (has_locators || has_cameras) { - function ./zzz/reset_floating_entities + data_manager prep read } - - REPEAT (Object.values(rig.nodes).filter(node => node.type !== 'locator' && node.type !== 'camera')) as node { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ - run \ - data merge entity @s { \ - transformation: <%matrixToNbtFloatArray(node.default_transform.matrix).toString()%>, \ - start_interpolation: -1 \ - } - } -} + function ./zzz/set_default_pose +} \ No newline at end of file diff --git a/src/systems/datapackCompiler/1.21.0/animation.mcb b/src/systems/datapackCompiler/1.21.0/animation.mcb index e660aa1a..56f91f43 100644 --- a/src/systems/datapackCompiler/1.21.0/animation.mcb +++ b/src/systems/datapackCompiler/1.21.0/animation.mcb @@ -1,5 +1,8 @@ # TODO - Move all internal functions into an internal namespace, and only have user-facing functions in the main `animated_java:<%export_namespace%>` namespace. -import ../global.mcbt + +# DIFFERENCES FROM 1.20.5: +# - @n entity selector +# - minecraft:item_model item component: item.components."minecraft:custom_model_data" -> item.components."minecraft:item_model" function on_load { data modify storage <%project_storage%> rig_hash set value <%"'" + rig_hash + "'"%> @@ -26,14 +29,8 @@ function remove_animation_objectives { tellraw @a <%TELLRAW.UNINSTALL()%> } -function invalid_version_warning { - # This function will contain a tellraw if the datapack is loaded in the wrong version. -} - dir root { function on_tick { - execute unless entity @s[tag=<%TAGS.PROJECT_ROOT(export_namespace)%>] run return 0 - # Custom pre-tick function IF (on_pre_tick_function) { <%% @@ -41,38 +38,35 @@ dir root { %%> } + # animated_java:global/root/on_tick already runs this right before calling this function. + # data_manager prep read + # Once we have more than 8 animations, calling a function only if at least one animation is playing is more efficient. IF (animations.length > 8) { # If no animations are playing, we can skip all animation logic. # This helps reduce ticking commands for rigs that are idle. execute \ - unless entity @s[<%animations.map(anim => 'tag=!' + TAGS.ANIMATION_PLAYING(export_namespace, anim.storage_name)).join(',')%>] \ + unless entity @s[<%animations.map(anim => 'tag=!' + TAGS.ANIMATION_PLAYING(blueprint_id, anim.storage_name)).join(',')%>] \ run block tick_animations { REPEAT (animations) as animation { - execute if entity @s[tag=<%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%>] run \ - function *<%export_namespace%>/animations/<%animation.storage_name%>/zzz/on_tick + execute if entity @s[tag=<%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%>] run \ + function <%blueprint_id%>/animations/<%animation.storage_name%>/zzz/on_tick } } } ELSE { REPEAT (animations) as animation { - execute if entity @s[tag=<%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%>] run \ - function *<%export_namespace%>/animations/<%animation.storage_name%>/zzz/on_tick + execute if entity @s[tag=<%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%>] run \ + function <%blueprint_id%>/animations/<%animation.storage_name%>/zzz/on_tick } } IF (auto_update_rig_orientation) { IF (has_locators || has_cameras) { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run function ./on_tick/transform_floating_entities + function <%blueprint_id%>/root/on_tick/transform_floating_entities } execute on passengers run tp @s ~ ~ ~ ~ ~ } ELSE IF (has_ticking_locators) { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run function ./on_tick/transform_locators + function <%blueprint_id%>/root/on_tick/transform_locators } # Custom post-tick function @@ -87,7 +81,7 @@ dir root { dir on_tick { function transform_locators { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - block select_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> + block select_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> IF (locator.config?.use_entity) { $execute \ as $(uuid) \ @@ -124,7 +118,7 @@ dir root { function ./transform_locators REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - block select_camera_<%camera.storage_name%> { with entity @s data.cameras.<%camera.storage_name%> + block select_camera_<%camera.storage_name%> { with storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> $execute \ as $(uuid) \ positioned ^$(px) ^$(py) ^$(pz) \ @@ -139,15 +133,13 @@ dir root { IF (!auto_update_rig_orientation) { function move { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> tp @s ~ ~ ~ ~ ~ IF (has_locators || has_cameras) { - execute \ - at @s on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run function ./on_tick/transform_floating_entities + data_manager prep read + function <%blueprint_id%>/root/on_tick/transform_floating_entities } execute at @s on passengers run tp @s ~ ~ ~ ~ ~ } @@ -161,11 +153,11 @@ dir animations { REPEAT (animations) as animation { dir <%animation.storage_name%> { function play { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> - function *<%export_namespace%>/animations/pause_all + function <%blueprint_id%>/animations/pause_all - tag @s add <%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%> + tag @s add <%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%> scoreboard players set @s <%OBJECTIVES.FRAME(animation.storage_name)%> 0 tag @s add <%TAGS.TRANSFORMS_ONLY()%> execute at @s run function ./zzz/set_frame {frame: 0} @@ -173,9 +165,9 @@ dir animations { } function stop { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> - function *<%export_namespace%>/animations/pause_all + function <%blueprint_id%>/animations/pause_all scoreboard players set @s <%OBJECTIVES.FRAME(animation.storage_name)%> 0 tag @s add <%TAGS.TRANSFORMS_ONLY()%> @@ -184,19 +176,19 @@ dir animations { } function pause { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> - tag @s remove <%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%> + tag @s remove <%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%> } function resume { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> - tag @s add <%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%> + tag @s add <%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%> } function next_frame { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> execute if score @s <%OBJECTIVES.FRAME(animation.storage_name)%> matches <%animation.duration%>.. run scoreboard players set @s <%OBJECTIVES.FRAME(animation.storage_name)%> 1 data remove storage <%temp_storage%> args @@ -208,7 +200,9 @@ dir animations { function set_frame { # Sets the frame without interpolation #ARGS: {frame: int} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + data_manager prep read data remove storage <%temp_storage%> args $execute store result storage <%temp_storage%> args.frame int 1 run scoreboard players set @s <%OBJECTIVES.FRAME(animation.storage_name)%> $(frame) @@ -217,7 +211,9 @@ dir animations { function apply_frame { #ARGS: {frame: int} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + data_manager prep read data remove storage <%temp_storage%> args $execute store result storage <%temp_storage%> args.frame int 1 run scoreboard players set @s <%OBJECTIVES.FRAME(animation.storage_name)%> $(frame) @@ -227,11 +223,11 @@ dir animations { function tween { # Attempts to smoothly transition from the currently playing animation into this one. #ARGS: {duration: int, to_frame: int} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> - function *<%export_namespace%>/animations/pause_all + function <%blueprint_id%>/animations/pause_all - tag @s add <%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%> + tag @s add <%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%> $scoreboard players set @s <%OBJECTIVES.TWEEN_DURATION()%> $(duration) $scoreboard players set @s <%OBJECTIVES.FRAME(animation.storage_name)%> $(to_frame) @@ -255,7 +251,7 @@ dir animations { # Makes sure function keyframes in the last frame of the animation are activated. execute if score @s <%OBJECTIVES.FRAME(animation.storage_name)%> matches -1 run \ block function_keyframe_loop_patch { - function ./apply_frame {frame: <%animation.duration-1%>} + function ./frames/last_frame_effects with storage <%temp_storage%> entry.data.uuids_by_name scoreboard players add @s <%OBJECTIVES.FRAME(animation.storage_name)%> 1 } } @@ -288,7 +284,7 @@ dir animations { tag @s add <%TAGS.TRANSFORMS_ONLY()%> execute at @s run function ./zzz/set_frame {frame: 0} tag @s remove <%TAGS.TRANSFORMS_ONLY()%> - tag @s remove <%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%> + tag @s remove <%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%> } } scoreboard players add @s <%OBJECTIVES.FRAME(animation.storage_name)%> 1 @@ -298,7 +294,7 @@ dir animations { function set_frame { #ARGS: {frame: int} $function ./apply_frame {frame: $(frame)} - execute on passengers run data modify entity @s[tag=!<%TAGS.GLOBAL_DATA()%>] start_interpolation set value -1 + execute on passengers run data modify entity @s start_interpolation set value -1 return 1 } @@ -306,12 +302,11 @@ dir animations { #ARGS: {frame: int} REPEAT (Object.values(animation.modified_nodes).sort(nodeSorter)) as node { IF (BONE_TYPES.includes(node.type)) { - $execute on passengers if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] run \ + $execute on passengers if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] run \ data modify entity @s {} merge from \ storage <%project_storage%>/animations <%animation.storage_name%>.$(frame).<%node.storage_name%> } ELSE IF (node.type === 'locator' || node.type === 'camera') { - $execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run \ - $data modify entity @s data.uuids_by_name.<%node.storage_name%> merge from \ + $data modify storage <%temp_storage%> entry.data.uuids_by_name.<%node.storage_name%> merge from \ storage <%project_storage%>/animations <%animation.storage_name%>.$(frame).<%node.storage_name%> } } @@ -322,7 +317,7 @@ dir animations { unless entity @s[tag=<%TAGS.TRANSFORMS_ONLY()%>] \ run { with storage <%project_storage%>/animations <%animation.storage_name%>.$(frame).variant #ARGS: {name: string, condition: string} - $execute $(condition)run function *<%export_namespace%>/variants/$(name)/apply + $execute $(condition)run function <%blueprint_id%>/variants/$(name)/apply } } @@ -332,10 +327,10 @@ dir animations { function set_frame { # Sets the frame without interpolation #ARGS: {frame: int} - $execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run \ - function ./frames/$(frame) with entity @s data.uuids_by_name - execute on passengers if entity @s[tag=!<%TAGS.GLOBAL_DATA()%>] run \ + $function ./frames/$(frame) with storage <%temp_storage%> entry.data.uuids_by_name + + execute on passengers run \ data modify entity @s start_interpolation set value -1 return 1 @@ -343,14 +338,67 @@ dir animations { function apply_frame { #ARGS: {frame: int} - $execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run \ - function ./frames/$(frame) with entity @s data.uuids_by_name + + $function ./frames/$(frame) with storage <%temp_storage%> entry.data.uuids_by_name return 1 } # FIXME - %NEWLINE_PATCH% is a temporary solution to temporarily fix an MCB bug where extra newlines are being added to the output. dir frames { + <%% + global.frame = animation.frames.at(-1) + global.modified_effect_nodes = Object.values(animation.modified_nodes).filter( + node => node.type === 'locator' && global.frame.node_transforms[node.uuid] + ) + console.log(global.modified_effect_nodes) + %%> + IF(Object.keys(global.modified_effect_nodes).length > 0) { + function last_frame_effects { + REPEAT(global.modified_effect_nodes) as node { + <%% + global.transform = global.frame.node_transforms[node.uuid] + %%> + IF (node.config?.use_entity) { + $execute \ + as $(<%node.storage_name%>) \ + positioned \ + ^<%roundTo(global.transform.pos[0], 10)%> \ + ^<%roundTo(global.transform.pos[1], 10)%> \ + ^<%roundTo(global.transform.pos[2], 10)%> \ + rotated \ + ~<%roundTo(global.transform.head_rot[1], 10)%> \ + ~<%roundTo(global.transform.head_rot[0], 10)%> \ + <%global.transform.function_execute_condition ? global.transform.function_execute_condition + ' ' : ''%>run \ + function ./<%animation.duration%>_locator_<%node.storage_name%> + } ELSE { + execute \ + positioned \ + ^<%roundTo(global.transform.pos[0], 10)%> \ + ^<%roundTo(global.transform.pos[1], 10)%> \ + ^<%roundTo(global.transform.pos[2], 10)%> \ + rotated \ + ~<%roundTo(global.transform.head_rot[1], 10)%> \ + ~<%roundTo(global.transform.head_rot[0], 10)%> \ + <%global.transform.function_execute_condition ? global.transform.function_execute_condition + ' ' : ''%>run \ + function ./<%animation.duration%>_locator_<%node.storage_name%> + } + } + + IF (global.frame.variants?.length > 0) { + execute <%global.frame.variants_execute_condition ? global.frame.variants_execute_condition + ' ' : ''%>run \ + function <%blueprint_id%>/variants/<%global.frame.variants[0].name%>/apply + } + + IF (global.frame.function) { + execute <%global.frame.function_execute_condition ? global.frame.function_execute_condition + ' ' : ''%>run \ + block <%animation.duration%>_function_keyframe { + <%global.frame.function%> + } + } + } + } + <%% // A record of node uuid to INodeTransform. // Keeps track of the last time a bone was updated. @@ -409,7 +457,7 @@ dir animations { if (transform.function) { if (node.config?.use_entity) { frameFunc += - `\n$execute on vehicle unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] as $(${node.storage_name}) ` + `\n$execute unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] as $(${node.storage_name}) ` + `positioned ^${roundTo(transform.pos[0], 10)} ^${roundTo(transform.pos[1], 10)} ^${roundTo(transform.pos[2], 10)} ` + `rotated ~${roundTo(transform.head_rot[1], 10)} ~${roundTo(transform.head_rot[0], 10)} ` + `${transform.function_execute_condition ? transform.function_execute_condition + ' ' : ''}run ` @@ -419,7 +467,7 @@ dir animations { + `\n}` } else { frameFunc += - `\nexecute on vehicle unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] ` + `\nexecute unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] ` + `positioned ^${roundTo(transform.pos[0], 10)} ^${roundTo(transform.pos[1], 10)} ^${roundTo(transform.pos[2], 10)} ` + `rotated ~${roundTo(transform.head_rot[1], 10)} ~${roundTo(transform.head_rot[0], 10)} ` + `${transform.function_execute_condition ? transform.function_execute_condition + ' ' : ''}run ` @@ -448,9 +496,10 @@ dir animations { } if (Object.keys(to_merge.locators).length > 0 || Object.keys(to_merge.cameras).length > 0) { - frameFunc += `\ndata modify entity @s data merge value ${JSON.stringify(to_merge)}` + frameFunc += `\ndata modify storage <%temp_storage%> entry.data merge value ${JSON.stringify(to_merge)}` + frameFunc += `\ndata_manager write` if (!auto_update_rig_orientation) { - frameFunc += `\nfunction ./on_tick/transform_floating_entities` + frameFunc += `\nfunction ${blueprint_id}/root/on_tick/transform_floating_entities` } hasFunction = true } @@ -461,14 +510,14 @@ dir animations { throw new Error(`Could not find Variant with uuid "${frame.variants[0]}" while generating frame "${frameIndex}" of animation "${animation.name}".`) } const execute_condition = frame.variants_execute_condition ? frame.variants_execute_condition + ' ' : '' - frameFunc += `\nexecute on vehicle unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] ${execute_condition}run function *${export_namespace}/variants/${variant.name}/apply` + frameFunc += `\nexecute unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] ${execute_condition}run function ${blueprint_id}/variants/${variant.name}/apply` ;hasFunction = true } // Root function keyframes. if (frame.function) { const execute_condition = frame.function_execute_condition ? frame.function_execute_condition + ' ' : '' - frameFunc += `\nexecute on vehicle unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] at @s ${execute_condition}run block ${frameIndex}_root_function%NEWLINE_PATCH%{\n${frame.function}\n}` + frameFunc += `\nexecute unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] at @s ${execute_condition}run block ${frameIndex}_root_function%NEWLINE_PATCH%{\n${frame.function}\n}` ;hasFunction = true } ;if (frameFunc.length > 0) { @@ -484,10 +533,10 @@ dir animations { } function pause_all { # Pauses all animations - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> REPEAT (animations) as animation { - tag @s remove <%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%> + tag @s remove <%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%> } } } @@ -504,97 +553,112 @@ function summon { '<%TAGS.NEW()%>', \ '<%TAGS.GLOBAL_ENTITY()%>', \ '<%TAGS.GLOBAL_ROOT()%>', \ - '<%TAGS.PROJECT_ENTITY(export_namespace)%>', \ - '<%TAGS.PROJECT_ROOT(export_namespace)%>' \ + '<%TAGS.PROJECT_ENTITY(blueprint_id)%>', \ + '<%TAGS.PROJECT_ROOT(blueprint_id)%>' \ ], \ teleport_duration: 0, \ interpolation_duration: <%interpolation_duration%>, \ Passengers:<%root_entity_passengers%>, \ + CustomName: '<%ENTITY_NAMES.ROOT(blueprint_id)%>', \ } execute as @n[ \ type=minecraft:item_display, \ - tag=<%TAGS.PROJECT_ROOT(export_namespace)%>, \ + tag=<%TAGS.PROJECT_ROOT(blueprint_id)%>, \ tag=<%TAGS.NEW()%>, \ distance=..0.01 \ ] run block zzz/summon/as_root_entity { execute store result score @s <%OBJECTIVES.ID()%> run scoreboard players add aj.last_id <%OBJECTIVES.ID()%> 1 + + data_manager init prep read + # Data manager init runs gu:get_entity_uuid_string. So we don't need to call it again here. + # function animated_java:global/gu/get_entity_uuid_string + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.root_uuid set from storage <%gu_storage%> out + + data modify storage <%temp_storage%> entry.data.blueprint_id set value "<%blueprint_id%>" + data modify storage <%temp_storage%> entry.data.rig_hash set value "<%rig_hash%>" + # Align the position and rotation of the root with the command context. tp @s ~ ~ ~ ~ ~ - function *global/gu/get_entity_uuid_string - execute at @s on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block as_data_entity { - # Rig Root UUID - data modify storage <%temp_storage%> root_uuid set from storage <%gu_storage%> out - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.root_uuid set from storage <%gu_storage%> out - # Data Entity UUID - function *global/gu/get_entity_uuid_string - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.data_data set from storage <%gu_storage%> out + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { + summon <%locator.config.entity_type%> \ + ^<%roundTo(locator.default_transform.pos[0], 10)%> \ + ^<%roundTo(locator.default_transform.pos[1], 10)%> \ + ^<%roundTo(locator.default_transform.pos[2], 10)%> \ + {Tags:<%getNodeTags(locator, rig)%>} + execute \ + as @n[ \ + type=<%locator.config.entity_type%>, \ + tag=<%TAGS.PROJECT_LOCATOR_NAMED(blueprint_id, locator.storage_name)%>, \ + tag=<%TAGS.NEW()%>, \ + distance=..<%Math.ceil(locator.max_distance)%> \ + ] \ + run block as_locator/<%locator.storage_name%> { + # run block ../as_locator/<%locator.storage_name%> { + tag @s remove <%TAGS.NEW()%> + data modify entity @s CustomName set value '<%ENTITY_NAMES.NODE(blueprint_id, locator.type, locator.storage_name)%>' + function animated_java:global/gu/get_entity_uuid_string + scoreboard players operation @s <%OBJECTIVES.ID()%> = aj.last_id <%OBJECTIVES.ID()%> + } + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids_by_name.<%locator.storage_name%> set from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.locators.<%locator.storage_name%>.uuid set from storage <%gu_storage%> out + } - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - summon <%locator.config.entity_type%> \ - ^<%roundTo(locator.default_transform.pos[0], 10)%> \ - ^<%roundTo(locator.default_transform.pos[1], 10)%> \ - ^<%roundTo(locator.default_transform.pos[2], 10)%> \ - {Tags:<%getNodeTags(locator, rig)%>} - execute \ - as @n[ \ - type=<%locator.config.entity_type%>, \ - tag=<%TAGS.PROJECT_LOCATOR_NAMED(export_namespace, locator.storage_name)%>, \ - tag=<%TAGS.NEW()%>, \ - distance=..<%Math.ceil(locator.max_distance)%> \ - ] \ - run block as_locator/<%locator.storage_name%> { - # run block ../as_locator/<%locator.storage_name%> { - tag @s remove <%TAGS.NEW()%> - function *global/gu/get_entity_uuid_string - data modify entity @s data.root_uuid set from storage <%temp_storage%> root_uuid - } - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.<%locator.storage_name%> set from storage <%gu_storage%> out - data modify entity @s data.locators.<%locator.storage_name%>.uuid set from storage <%gu_storage%> out + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { + summon minecraft:item_display \ + ^<%roundTo(camera.default_transform.pos[0], 10)%> \ + ^<%roundTo(camera.default_transform.pos[1], 10)%> \ + ^<%roundTo(camera.default_transform.pos[2], 10)%> \ + {Tags:<%getNodeTags(camera, rig)%>, teleport_duration: 2} + execute \ + as @n[ \ + type=minecraft:item_display, \ + tag=<%TAGS.PROJECT_CAMERA_NAMED(blueprint_id, camera.storage_name)%>, \ + tag=<%TAGS.NEW()%>, \ + distance=..<%Math.ceil(camera.max_distance)%> \ + ] \ + run block as_camera/<%camera.storage_name%> { + # run block ../as_camera/<%camera.storage_name%> { + tag @s remove <%TAGS.NEW()%> + data modify entity @s CustomName set value '<%ENTITY_NAMES.NODE(blueprint_id, camera.type, camera.storage_name)%>' + function animated_java:global/gu/get_entity_uuid_string + scoreboard players operation @s <%OBJECTIVES.ID()%> = aj.last_id <%OBJECTIVES.ID()%> } + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids_by_name.<%camera.storage_name%> set from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%>.uuid set from storage <%gu_storage%> out + } - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - summon minecraft:item_display \ - ^<%roundTo(camera.default_transform.pos[0], 10)%> \ - ^<%roundTo(camera.default_transform.pos[1], 10)%> \ - ^<%roundTo(camera.default_transform.pos[2], 10)%> \ - {Tags:<%getNodeTags(camera, rig)%>, teleport_duration: 2} - execute \ - as @n[ \ - type=minecraft:item_display, \ - tag=<%TAGS.PROJECT_CAMERA_NAMED(export_namespace, camera.storage_name)%>, \ - tag=<%TAGS.NEW()%>, \ - distance=..<%Math.ceil(camera.max_distance)%> \ - ] \ - run block as_camera/<%camera.storage_name%> { - # run block ../as_camera/<%camera.storage_name%> { - tag @s remove <%TAGS.NEW()%> - function *global/gu/get_entity_uuid_string - data modify entity @s data.root_uuid set from storage <%temp_storage%> root_uuid - } - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.<%camera.storage_name%> set from storage <%gu_storage%> out - data modify entity @s data.cameras.<%camera.storage_name%>.uuid set from storage <%gu_storage%> out + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + execute \ + on passengers \ + if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ + run block as_node/<%node.storage_name%> { + data modify entity @s CustomName set value '<%ENTITY_NAMES.NODE(blueprint_id, node.type, node.storage_name)%>' + function animated_java:global/gu/get_entity_uuid_string + scoreboard players operation @s <%OBJECTIVES.ID()%> = aj.last_id <%OBJECTIVES.ID()%> } - REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { - execute \ - on vehicle \ - on passengers \ - if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ - run block as_node/<%node.storage_name%> { - function *global/gu/get_entity_uuid_string - data modify entity @s data.root_uuid set from storage <%temp_storage%> root_uuid - } + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids_by_name.<%node.storage_name%> set from storage <%gu_storage%> out + } - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.<%node.storage_name%> set from storage <%gu_storage%> out + IF (has_entity_locators) { + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { + block { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + # Track any custom entities on the locator. + $execute at @s as $(uuid) at @s run function animated_java:global/util/get_entity_stack_uuids + } + data modify storage <%temp_storage%> entry.data.uuids append from storage <%temp_storage%> uuids } } + function <%blueprint_id%>/zzz/set_default_pose + + data_manager write + # Variant Arguement IF (Object.keys(rig.variants).length > 1) { execute if data storage <%temp_storage%> args.variant run block variant_arg/process { with storage <%temp_storage%> args @@ -603,12 +667,12 @@ function summon { execute if data storage <%temp_storage%> {args:{variant:''}} run return run block if_empty { # Tell the user that the variant cannot be empty. tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('variant')%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function } # Attempt to apply the requested variant. # We get the success of the `try_apply` function in just in case the user's arguments are *very* wrong. execute store success score #success <%OBJECTIVES.I()%> run block try_apply { with storage <%temp_storage%> args - $execute if function animated_java:<%export_namespace%>/variants/$(variant)/apply run return 1 + $execute if function <%blueprint_id%>/variants/$(variant)/apply run return 1 # If the apply function fails, the variant doesn't exist, so we return an error. return fail } @@ -616,21 +680,19 @@ function summon { execute unless score #success <%OBJECTIVES.I()%> matches 1 run return run block invalid_variant { # Tell the user that the provided variant doesn't exist, remove the rig, and list all available variants for this rig. tellraw @a <%TELLRAW.INVALID_VARIANT(rig.variants)%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function } scoreboard players set #success <%OBJECTIVES.I()%> 1 } } ELSE { execute if data storage <%temp_storage%> args.variant run block zzz/variant_arg/no_variants_warning { tellraw @a <%TELLRAW.NO_VARIANTS()%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function scoreboard players set #success <%OBJECTIVES.I()%> 0 } } execute if score #success <%OBJECTIVES.I()%> matches 0 run return fail - function *<%export_namespace%>/set_default_pose - # Animation Argument # If the animation argument is provided, attempt to apply the animation. execute if data storage <%temp_storage%> args.animation run block animation_arg/process { with storage <%temp_storage%> args @@ -638,7 +700,7 @@ function summon { # If the animation argument is *explicitly* set to an empty string, return an error. execute if data storage <%temp_storage%> {args:{animation:''}} run return run block if_empty { tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('animation')%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function } # Automatically set the frame argument to 0 if the frame argument is not provided. # Takes advantage of `store result score` setting the score to 0 if the command fails. @@ -651,13 +713,13 @@ function summon { execute if score #frame <%OBJECTIVES.I()%> matches ..-1 run return run block no_negative { # Tell the user that the frame argument cannot be negative. tellraw @a <%TELLRAW.FRAME_CANNOT_BE_NEGATIVE()%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function } # Attempt to apply the animation frame. execute store success score #success <%OBJECTIVES.I()%> run block try_set_frame { with storage <%temp_storage%> args # Make sure we're only applying transforms when setting the summon pose. tag @s add <%TAGS.TRANSFORMS_ONLY()%> - $execute store success score #success <%OBJECTIVES.I()%> run function *<%export_namespace%>/animations/$(animation)/zzz/set_frame with storage <%temp_storage%> args + $execute store success score #success <%OBJECTIVES.I()%> run function <%blueprint_id%>/animations/$(animation)/zzz/set_frame with storage <%temp_storage%> args tag @s remove <%TAGS.TRANSFORMS_ONLY()%> execute if score #success <%OBJECTIVES.I()%> matches 1 run return 1 # If the set_frame function fails, the animation doesn't exist, so we return an error. @@ -667,22 +729,19 @@ function summon { execute unless score #success <%OBJECTIVES.I()%> matches 1 run return run block invalid_animation { # Tell the user that the provided animation doesn't exist, remove the rig, and list all available animations for this rig. tellraw @a <%TELLRAW.INVALID_ANIMATION(animations)%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function } # If the animation is successfully applied, and the start_animation argument is set to true, start the animation. execute if data storage <%temp_storage%> {args:{start_animation: true}} run block start_animation { with storage <%temp_storage%> args - $function *<%export_namespace%>/animations/$(animation)/resume + $function <%blueprint_id%>/animations/$(animation)/resume } scoreboard players set #success <%OBJECTIVES.I()%> 1 } execute if score #success <%OBJECTIVES.I()%> matches 0 run return fail IF (has_locators || has_cameras) { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run function ./on_tick/transform_floating_entities + function <%blueprint_id%>/root/on_tick/transform_floating_entities } execute on passengers run tp @s ~ ~ ~ ~ ~ @@ -691,26 +750,21 @@ function summon { execute on passengers run data modify entity @s teleport_duration set value <%teleportation_duration%> IF (has_entity_locators) { - execute at @s on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block locators_on_summon { - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity && node.config.on_summon_function)) as locator { - block { with entity @s data.locators.<%locator.storage_name%> - $execute as $(uuid) at @s run block <%locator.storage_name%> { - <%% - emit.mcb(locator.config.on_summon_function) - %%> - # Track any custom entities on the locator. - function *global/util/get_entity_stack_uuids - } + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity && node.config.on_summon_function)) as locator { + block { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + $execute at @s as $(uuid) at @s run block on_summon/custom_<%locator.type + '_' + locator.storage_name%> { + <%% + emit.mcb(locator.config.on_summon_function) + %%> } - data modify entity @s data.uuids append from storage <%temp_storage%> uuids } } } REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type) && node.on_summon_function?.trim())) as node { execute \ - on passengers if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ - run block node_on_summon_<%node.storage_name%> { + on passengers if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ + run block on_summon/<%node.type + '_' + node.storage_name%> { <%% emit.mcb(node.on_summon_function.trim()) %%> @@ -718,7 +772,7 @@ function summon { } IF (on_summon_function) { - execute at @s run block rig_on_summon { + execute at @s run block on_summon/rig { <%% emit.mcb(on_summon_function) %%> @@ -733,7 +787,7 @@ function summon { function as_node { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -742,8 +796,10 @@ function as_node { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block zzz/as_node/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.uuids_by_name.$(name) + data_manager prep read + + block zzz/as_node/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.uuids_by_name.$(name) IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -767,7 +823,7 @@ function as_node { IF (has_entity_locators) { function as_locator { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -777,11 +833,10 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/as_locator/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.$(name).uuid + data_manager prep read + + block zzz/as_locator/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.$(name).uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -804,7 +859,7 @@ IF (has_entity_locators) { function as_at_locator { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -814,11 +869,10 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/as_locator/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.$(name).uuid + data_manager prep read + + block zzz/as_locator/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.$(name).uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -841,7 +895,7 @@ IF (has_entity_locators) { function as_all_locators { #ARGS: {command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {command:'$(command)'} @@ -850,9 +904,11 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block zzz/as_all_locators/as_data { + data_manager prep read + + block zzz/as_all_locators/as_data { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.<%locator.storage_name%>.uuid + data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.<%locator.storage_name%>.uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -876,7 +932,7 @@ IF (has_entity_locators) { function as_at_all_locators { #ARGS: {command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {command:'$(command)'} @@ -885,9 +941,11 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block zzz/as_all_locators/as_data { + data_manager prep read + + block zzz/as_all_locators/as_data { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.<%locator.storage_name%>.uuid + data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.<%locator.storage_name%>.uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -913,7 +971,7 @@ IF (has_entity_locators) { IF (has_locators) { function at_locator { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)'} @@ -923,15 +981,13 @@ IF (has_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute \ - at @s \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/at_locator/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args merge from entity @s data.locators.$(name) + data_manager prep read + + execute at @s run block zzz/at_locator/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args merge from storage <%temp_storage%> entry.data.locators.$(name) IF (debug_mode) { - execute unless data storage <%temp_storage%> args.uuid run return run tellraw @a <%TELLRAW.LOCATOR_NOT_FOUND()%> + execute unless data storage <%temp_storage%> args.px run return run tellraw @a <%TELLRAW.LOCATOR_NOT_FOUND()%> scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -955,7 +1011,7 @@ IF (has_locators) { function at_all_locators { #ARGS: {command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {command:'$(command)'} @@ -964,9 +1020,11 @@ IF (has_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute at @s on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block zzz/at_all_locators/as_data { + data_manager prep read + + block zzz/at_all_locators/as_data { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - data modify storage <%temp_storage%> args merge from entity @s data.locators.<%locator.storage_name%> + data modify storage <%temp_storage%> args merge from storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -995,7 +1053,7 @@ IF (has_locators) { IF (has_cameras) { function as_camera { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -1005,11 +1063,10 @@ IF (has_cameras) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/as_camera/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.cameras.$(name).uuid + data_manager prep read + + block zzz/as_camera/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.cameras.$(name).uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -1038,10 +1095,13 @@ IF (has_cameras) { function as_root { #ARGS: {command: string} - debug assert executed_as_entity_with_root_uuid_data + execute unless score @s <%OBJECTIVES.ID()%> matches <%-(2**31)%>..<%(2**31)-1%> run return run \ + tellraw @a <%TELLRAW.FUNCTION_NOT_EXECUTED_AS_ENTITY_WITH_ID_SCORE(context.functions.at(-1))%> + + data_manager prep read $data modify storage <%temp_storage%> args.command set value '$(command)' - data modify storage <%temp_storage%> args.root_uuid set from entity @s data.root_uuid + data modify storage <%temp_storage%> args.root_uuid set from storage <%temp_storage%> entry.data.root_uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -1062,44 +1122,43 @@ function as_root { dir remove { function all { # Removes all instances of this rig from the world. - execute as @e[type=minecraft:item_display,tag=<%TAGS.PROJECT_ROOT(export_namespace)%>] run function *<%export_namespace%>/remove/this + execute as @e[type=minecraft:item_display,tag=<%TAGS.PROJECT_ROOT(blueprint_id)%>] run function <%blueprint_id%>/remove/this } function entities { # Removes all entities related to this rig from the world. - kill @e[tag=<%TAGS.PROJECT_ENTITY(export_namespace)%>] + kill @e[tag=<%TAGS.PROJECT_ENTITY(blueprint_id)%>] } function this { # Removes the rig this function is executed as. - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> <%% if (on_remove_function) emit.mcb(on_remove_function) %%> IF (has_entity_locators) { - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block as_data { - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - IF (locator.config?.on_remove_function) { - IF (locator.config.use_entity) { - block as_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> - $execute as $(uuid) at @s run block locator_<%locator.storage_name%>_on_remove { - <%% - emit.mcb(locator.config.on_remove_function) - %%> - } + data_manager prep read + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { + IF (locator.config?.on_remove_function) { + IF (locator.config.use_entity) { + block as_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + $execute as $(uuid) at @s run block locator_<%locator.storage_name%>_on_remove { + <%% + emit.mcb(locator.config.on_remove_function) + %%> } - } ELSE { - block at_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> - $execute \ - positioned ^$(px) ^$(py) ^$(pz) \ - rotated ~$(ry) ~$(rx) \ - run block locator_<%locator.storage_name%>_on_remove { - <%% - emit.mcb(locator.config.on_remove_function) - %%> - } + } + } ELSE { + block at_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + $execute \ + positioned ^$(px) ^$(py) ^$(pz) \ + rotated ~$(ry) ~$(rx) \ + run block locator_<%locator.storage_name%>_on_remove { + <%% + emit.mcb(locator.config.on_remove_function) + %%> } } } @@ -1112,27 +1171,30 @@ dir remove { dir this { function without_on_remove_function { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + data_manager prep read IF (has_entity_locators || has_cameras) { - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block as_data { - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - function animated_java:global/remove/entity_stack_by_uuid with entity @s data.locators.<%locator.storage_name%> - } - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - function animated_java:global/remove/entity_stack_by_uuid with entity @s data.cameras.<%camera.storage_name%> - } + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { + function animated_java:global/remove/entity_stack_by_uuid with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + } + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { + function animated_java:global/remove/entity_stack_by_uuid with storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> } } # Remove the rig using the more expensive & thorough method if the rig_hash doesn't match. execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - unless data entity @s {data:{rig_hash: '<%rig_hash%>'}} \ - on vehicle \ + unless data storage <%temp_storage%> {entry:{data:{rig_hash: '<%rig_hash%>'}}} \ run function animated_java:global/remove/outdated_rig + block { with storage <%temp_storage%> entry.data.uuids_by_name + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + $kill $(<%node.storage_name%>) + } + } + function animated_java:global/remove/entity_stack } } @@ -1143,7 +1205,7 @@ IF (Object.keys(rig.variants).length > 1) { REPEAT (Object.values(rig.variants)) as variant { dir <%variant.name%> { function apply { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> <%% global.filteredNodes = Object.values(rig.nodes).filter( @@ -1166,7 +1228,7 @@ IF (Object.keys(rig.variants).length > 1) { REPEAT (global.filteredNodes) as node { execute \ on passengers \ - if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ + if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ at @s \ run \ block zzz/apply_to_node_<%node.storage_name%> { @@ -1206,21 +1268,25 @@ IF (has_locators || has_cameras) { function reset_floating_entities { IF (has_locators) { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - execute \ - at @s \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/set_default_pose/as_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> - IF (locator.config?.use_entity) { + IF (locator.config?.use_entity) { + execute at @s run block set_default_pose/as_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> $tp $(uuid) \ ^<%roundTo(locator.default_transform.pos[0], 10)%> \ ^<%roundTo(locator.default_transform.pos[1], 10)%> \ ^<%roundTo(locator.default_transform.pos[2], 10)%> \ ~<%roundTo(locator.default_transform.head_rot[1], 10)%> \ ~<%roundTo(locator.default_transform.head_rot[0], 10)%> - } - data modify entity @s data.locators.<%locator.storage_name%> merge value { \ + data modify storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> merge value { \ + px: <%roundTo(locator.default_transform.pos[0], 10)%>, \ + py: <%roundTo(locator.default_transform.pos[1], 10)%>, \ + pz: <%roundTo(locator.default_transform.pos[2], 10)%>, \ + ry: <%roundTo(locator.default_transform.head_rot[1], 10)%>, \ + rx: <%roundTo(locator.default_transform.head_rot[0], 10)%> \ + } + } + } ELSE { + data modify storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> merge value { \ px: <%roundTo(locator.default_transform.pos[0], 10)%>, \ py: <%roundTo(locator.default_transform.pos[1], 10)%>, \ pz: <%roundTo(locator.default_transform.pos[2], 10)%>, \ @@ -1233,11 +1299,7 @@ IF (has_locators || has_cameras) { IF (has_cameras) { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - execute \ - at @s \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/set_default_pose/as_camera_<%camera.storage_name%> { with entity @s data.cameras.<%camera.storage_name%> + execute at @s run block set_default_pose/as_camera_<%camera.storage_name%> { with storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> $tp $(uuid) \ ^<%roundTo(camera.default_transform.pos[0], 10)%> \ ^<%roundTo(camera.default_transform.pos[1], 10)%> \ @@ -1245,7 +1307,7 @@ IF (has_locators || has_cameras) { ~<%roundTo(camera.default_transform.head_rot[1], 10)%> \ ~<%roundTo(camera.default_transform.head_rot[0], 10)%> - data modify entity @s data.cameras.<%camera.storage_name%> merge value { \ + data modify storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> merge value { \ px: <%roundTo(camera.default_transform.pos[0], 10)%>, \ py: <%roundTo(camera.default_transform.pos[1], 10)%>, \ pz: <%roundTo(camera.default_transform.pos[2], 10)%>, \ @@ -1259,42 +1321,58 @@ IF (has_locators || has_cameras) { } } +dir zzz { + function apply_default_pose { + IF (has_locators || has_cameras) { + function ../zzz/reset_floating_entities + } + + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + execute \ + on passengers \ + if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ + run \ + data merge entity @s { \ + transformation: <%matrixToNbtFloatArray(node.default_transform.matrix).toString()%>, \ + start_interpolation: 0 \ + } + } + } + + function set_default_pose { + IF (has_locators || has_cameras) { + function ../zzz/reset_floating_entities + } + + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + execute \ + on passengers \ + if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ + run \ + data merge entity @s { \ + transformation: <%matrixToNbtFloatArray(node.default_transform.matrix).toString()%>, \ + start_interpolation: -1 \ + } + } + } +} + function apply_default_pose { # Changes the pose of the rig to the the default pose with interpolation - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> IF (has_locators || has_cameras) { - function ./zzz/reset_floating_entities - } - - REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ - run \ - data merge entity @s { \ - transformation: <%matrixToNbtFloatArray(node.default_transform.matrix).toString()%>, \ - start_interpolation: 0 \ - } + data_manager prep read } + function ./zzz/apply_default_pose } function set_default_pose { # Changes the pose of the rig to the the default pose without interpolation - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> IF (has_locators || has_cameras) { - function ./zzz/reset_floating_entities + data_manager prep read } - - REPEAT (Object.values(rig.nodes).filter(node => node.type !== 'locator' && node.type !== 'camera')) as node { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ - run \ - data merge entity @s { \ - transformation: <%matrixToNbtFloatArray(node.default_transform.matrix).toString()%>, \ - start_interpolation: -1 \ - } - } -} + function ./zzz/set_default_pose +} \ No newline at end of file diff --git a/src/systems/datapackCompiler/1.21.2/global.mcb b/src/systems/datapackCompiler/1.21.0/global.mcb similarity index 72% rename from src/systems/datapackCompiler/1.21.2/global.mcb rename to src/systems/datapackCompiler/1.21.0/global.mcb index 31f53747..318b3258 100644 --- a/src/systems/datapackCompiler/1.21.2/global.mcb +++ b/src/systems/datapackCompiler/1.21.0/global.mcb @@ -1,3 +1,6 @@ +# DIFFERENCES FROM 1.20.4: +# - @n entity selector + import ./global.mcbt dir global { @@ -10,40 +13,39 @@ dir global { scoreboard players add aj.last_id <%OBJECTIVES.ID()%> 0 - # Purposefully load gu first, as other functions depend on it. + # Enforce loading order. function *global/gu/on_load + function *global/data_manager/on_load function #*global/on_load + IF (debug_mode) { scoreboard players reset * <%OBJECTIVES.IS_RIG_LOADED()%> execute as @e[type=item_display,tag=<%TAGS.GLOBAL_ROOT()%>] at @s run function *global/root/on_load } } - IF (debug_mode) { - function on_tick minecraft:tick { - execute as @e[type=item_display,tag=<%TAGS.GLOBAL_ROOT()%>] at @s run function *global/root/on_tick - } - } ELSE { - function on_tick minecraft:tick { - execute as @e[type=item_display,tag=<%TAGS.GLOBAL_ROOT()%>] at @s run function #*global/root/on_tick - } + function on_tick minecraft:tick { + execute as @e[type=item_display,tag=<%TAGS.GLOBAL_ROOT()%>] at @s run function *global/root/on_tick } tag functions on_load { - *<%export_namespace%>/on_load + <%blueprint_id%>/on_load } dir root { - tag functions on_tick { - *<%export_namespace%>/root/on_tick - } - - IF (debug_mode) { - function on_tick { + function on_tick { + IF (debug_mode) { execute unless score @s <%OBJECTIVES.IS_RIG_LOADED()%> matches 1 run function *global/root/on_load - function #*global/root/on_tick } + data_manager prep read + function *global/root/run_project_tick with storage <%temp_storage%> entry.data + } + + function run_project_tick { + $function $(blueprint_id)/root/on_tick + } + IF (debug_mode) { function on_load { # Check if the rig is outdated by comparing the function's rig_hash of the rig to the rig_hash stored in the entity data. execute if function animated_java:global/util/is_rig_outdated run block outdated_warning/modify_rig { @@ -54,12 +56,16 @@ dir global { execute store result storage <%temp_storage%> args.x double 1 run data get entity @s Pos[0] 1 execute store result storage <%temp_storage%> args.y double 1 run data get entity @s Pos[1] 1 execute store result storage <%temp_storage%> args.z double 1 run data get entity @s Pos[2] 1 - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run { - # Get export namespace - data modify storage <%temp_storage%> args.export_namespace set from entity @s data.export_namespace - # Overwrite the rig hash so the warning doesn't show again. - data modify entity @s data.rig_hash set value '<%rig_hash%>' - } + + # No need to read here, since is_rig_outdated already reads the data. + # data_manager prep read + + # Get export namespace + data modify storage <%temp_storage%> args.blueprint_id set from storage <%temp_storage%> entry.data.blueprint_id + # Overwrite the rig hash so the warning doesn't show again. + data modify storage <%temp_storage%> entry.data.rig_hash set value '<%rig_hash%>' + data_manager write + block print { with storage <%temp_storage%> args $tellraw @a <%TELLRAW.RIG_OUTDATED()%> } @@ -117,20 +123,20 @@ dir global { # Removes locators and cameras owned by the rig, even if they're not included in the currently loaded export. function outdated_rig { - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block as_data { - data remove storage <%temp_storage%> args - data remove storage <%temp_storage%> uuids - data modify storage <%temp_storage%> uuids set from entity @s data.uuids - execute store result score #aj.length <%OBJECTIVES.I()%> run data get storage <%temp_storage%> uuids - - execute if score #aj.length <%OBJECTIVES.I()%> matches 1.. run block loop_over_uuids { - data modify storage <%temp_storage%> args.current_uuid set from storage <%temp_storage%> uuids[-1].uuid - data remove storage <%temp_storage%> uuids[-1] - function ./entity_stack_by_uuid with storage <%temp_storage%> args - - scoreboard players remove #aj.length <%OBJECTIVES.I()%> 1 - execute if score #aj.length <%OBJECTIVES.I()%> matches 1.. run function ^0 - } + data_manager prep read + + data remove storage <%temp_storage%> args + data remove storage <%temp_storage%> uuids + data modify storage <%temp_storage%> uuids set from entity @s data.uuids + execute store result score #aj.length <%OBJECTIVES.I()%> run data get storage <%temp_storage%> uuids + + execute if score #aj.length <%OBJECTIVES.I()%> matches 1.. run block loop_over_uuids { + data modify storage <%temp_storage%> args.current_uuid set from storage <%temp_storage%> uuids[-1].uuid + data remove storage <%temp_storage%> uuids[-1] + function ./entity_stack_by_uuid with storage <%temp_storage%> args + + scoreboard players remove #aj.length <%OBJECTIVES.I()%> 1 + execute if score #aj.length <%OBJECTIVES.I()%> matches 1.. run function ^0 } function ./entity_stack @@ -149,11 +155,12 @@ dir global { } # Returns 1 if the rig is outdated, else returns 0. function is_rig_outdated { - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run return run { with entity @s data + data_manager prep read + block { with storage <%temp_storage%> entry.data # REVIEW - The replace here is a bit hacky. # Because this is a core function, I need to create a generic version of - # project_storage that uses a macro to get the export namespace instead of hardcoding it. - $execute if data storage <%project_storage.replace(export_namespace, '$(export_namespace)')%> {rig_hash:'$(rig_hash)'} run return 0 + # project_storage that uses a macro to get the blueprint ID instead of hardcoding it. + $execute if data storage <%project_storage.replace(blueprint_id, '$(blueprint_id)')%> {rig_hash:'$(rig_hash)'} run return 0 return 1 } } @@ -214,14 +221,40 @@ dir global { } } } -} -dir <%export_namespace%> { - function on_load { - function *<%export_namespace%>/invalid_version_warning - } + # Storage-based per-entity NBT storage. Thanks Xanbelor for the concept! + dir data_manager { + function on_load { + scoreboard players add #aj.data_manager.index <%OBJECTIVES.I()%> 0 + } + + function on_tick minecraft:tick { + execute store result storage <%temp_storage%> args.id int 1 run scoreboard players get #aj.data_manager.index <%OBJECTIVES.I()%> + block { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%data_storage%> "$(id)".uuid + scoreboard players set #success <%OBJECTIVES.I()%> 0 + block { with storage <%temp_storage%> args + $execute store success score #success <%OBJECTIVES.I()%> if score $(uuid) matches 1.. + $execute if score #success <%OBJECTIVES.I()%> matches 0 run data remove storage <%data_storage%> "$(id)" + } + } + scoreboard players add #aj.data_manager.index <%OBJECTIVES.I()%> 1 + execute \ + if score #aj.data_manager.index <%OBJECTIVES.I()%> > aj.last_id <%OBJECTIVES.ID()%> \ + run scoreboard players set #aj.data_manager.index <%OBJECTIVES.I()%> 0 + } - function invalid_version_warning { - tellraw @a <%TELLRAW.INVALID_VERSION()%> + function create_entry { + $data modify storage <%data_storage%> "$(id)" set value {uuid: "$(uuid)", data: {}} + } + + function read { + data remove storage <%temp_storage%> entry + $data modify storage <%temp_storage%> entry set from storage <%data_storage%> "$(id)" + } + + function write { + $data modify storage <%data_storage%> "$(id)" set from storage <%temp_storage%> entry + } } } diff --git a/src/systems/datapackCompiler/1.21.0/static.mcb b/src/systems/datapackCompiler/1.21.0/static.mcb index 000eae98..4d2376c0 100644 --- a/src/systems/datapackCompiler/1.21.0/static.mcb +++ b/src/systems/datapackCompiler/1.21.0/static.mcb @@ -1,17 +1,15 @@ # TODO - Move all internal functions into an internal namespace, and only have user-facing functions in the main `animated_java:<%export_namespace%>` namespace. -import ../global.mcbt + +# DIFFERENCES FROM 1.20.5: +# - @n entity selector +# - minecraft:item_model item component: item.components."minecraft:custom_model_data" -> item.components."minecraft:item_model" + function on_load { data modify storage <%project_storage%> rig_hash set value <%"'" + rig_hash + "'"%> } -function invalid_version_warning { - # This function will contain a tellraw if the datapack is loaded in the wrong version. -} - dir root { function on_tick { - execute unless entity @s[tag=<%TAGS.PROJECT_ROOT(export_namespace)%>] run return 0 - # Custom pre-tick function IF (on_pre_tick_function) { <%% @@ -21,17 +19,11 @@ dir root { IF (auto_update_rig_orientation) { IF (has_locators || has_cameras) { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run function ./on_tick/transform_floating_entities + function <%blueprint_id%>/root/on_tick/transform_floating_entities } execute on passengers run tp @s ~ ~ ~ ~ ~ } ELSE IF (has_ticking_locators) { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run function ./on_tick/transform_locators + function <%blueprint_id%>/root/on_tick/transform_locators } # Custom post-tick function @@ -46,7 +38,7 @@ dir root { dir on_tick { function transform_locators { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - block select_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> + block select_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> IF (locator.config?.use_entity) { $execute \ as $(uuid) \ @@ -83,7 +75,7 @@ dir root { function ./transform_locators REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - block select_camera_<%camera.storage_name%> { with entity @s data.cameras.<%camera.storage_name%> + block select_camera_<%camera.storage_name%> { with storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> $execute \ as $(uuid) \ positioned ^$(px) ^$(py) ^$(pz) \ @@ -98,15 +90,13 @@ dir root { IF (!auto_update_rig_orientation) { function move { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> tp @s ~ ~ ~ ~ ~ IF (has_locators || has_cameras) { - execute \ - at @s on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run function ./on_tick/transform_floating_entities + data_manager prep read + function <%blueprint_id%>/root/on_tick/transform_floating_entities } execute at @s on passengers run tp @s ~ ~ ~ ~ ~ } @@ -127,90 +117,111 @@ function summon { '<%TAGS.NEW()%>', \ '<%TAGS.GLOBAL_ENTITY()%>', \ '<%TAGS.GLOBAL_ROOT()%>', \ - '<%TAGS.PROJECT_ENTITY(export_namespace)%>', \ - '<%TAGS.PROJECT_ROOT(export_namespace)%>' \ + '<%TAGS.PROJECT_ENTITY(blueprint_id)%>', \ + '<%TAGS.PROJECT_ROOT(blueprint_id)%>' \ ], \ teleport_duration: 0, \ interpolation_duration: <%interpolation_duration%>, \ Passengers:<%root_entity_passengers%>, \ + CustomName: '<%ENTITY_NAMES.ROOT(blueprint_id)%>', \ } execute as @n[ \ type=minecraft:item_display, \ - tag=<%TAGS.PROJECT_ROOT(export_namespace)%>, \ + tag=<%TAGS.PROJECT_ROOT(blueprint_id)%>, \ tag=<%TAGS.NEW()%>, \ distance=..0.01 \ ] run block zzz/summon/as_root_entity { execute store result score @s <%OBJECTIVES.ID()%> run scoreboard players add aj.last_id <%OBJECTIVES.ID()%> 1 + + data_manager init prep read + # Data manager init runs gu:get_entity_uuid_string. So we don't need to call it again here. + # function animated_java:global/gu/get_entity_uuid_string + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.root_uuid set from storage <%gu_storage%> out + + data modify storage <%temp_storage%> entry.data.blueprint_id set value "<%blueprint_id%>" + data modify storage <%temp_storage%> entry.data.rig_hash set value "<%rig_hash%>" + # Align the position and rotation of the root with the command context. tp @s ~ ~ ~ ~ ~ - function *global/gu/get_entity_uuid_string - execute at @s on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block as_data_entity { - # Rig Root UUID - data modify entity @s data.uuids append from storage <%gu_storage%> out - # Data Entity UUID - function *global/gu/get_entity_uuid_string - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.data_data set from storage <%gu_storage%> out + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { + summon <%locator.config.entity_type%> \ + ^<%roundTo(locator.default_transform.pos[0], 10)%> \ + ^<%roundTo(locator.default_transform.pos[1], 10)%> \ + ^<%roundTo(locator.default_transform.pos[2], 10)%> \ + {Tags:<%getNodeTags(locator, rig)%>} + execute \ + as @n[ \ + type=<%locator.config.entity_type%>, \ + tag=<%TAGS.PROJECT_LOCATOR_NAMED(blueprint_id, locator.storage_name)%>, \ + tag=<%TAGS.NEW()%>, \ + distance=..<%Math.ceil(locator.max_distance)%> \ + ] \ + run block as_locator/<%locator.storage_name%> { + # run block ../as_locator/<%locator.storage_name%> { + tag @s remove <%TAGS.NEW()%> + data modify entity @s CustomName set value '<%ENTITY_NAMES.NODE(blueprint_id, locator.type, locator.storage_name)%>' + function animated_java:global/gu/get_entity_uuid_string + scoreboard players operation @s <%OBJECTIVES.ID()%> = aj.last_id <%OBJECTIVES.ID()%> + } + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids_by_name.<%locator.storage_name%> set from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.locators.<%locator.storage_name%>.uuid set from storage <%gu_storage%> out + } + + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { + summon minecraft:item_display \ + ^<%roundTo(camera.default_transform.pos[0], 10)%> \ + ^<%roundTo(camera.default_transform.pos[1], 10)%> \ + ^<%roundTo(camera.default_transform.pos[2], 10)%> \ + {Tags:<%getNodeTags(camera, rig)%>, teleport_duration: 2} + execute \ + as @n[ \ + type=minecraft:item_display, \ + tag=<%TAGS.PROJECT_CAMERA_NAMED(blueprint_id, camera.storage_name)%>, \ + tag=<%TAGS.NEW()%>, \ + distance=..<%Math.ceil(camera.max_distance)%> \ + ] \ + run block as_camera/<%camera.storage_name%> { + # run block ../as_camera/<%camera.storage_name%> { + tag @s remove <%TAGS.NEW()%> + data modify entity @s CustomName set value '<%ENTITY_NAMES.NODE(blueprint_id, camera.type, camera.storage_name)%>' + function animated_java:global/gu/get_entity_uuid_string + scoreboard players operation @s <%OBJECTIVES.ID()%> = aj.last_id <%OBJECTIVES.ID()%> + } + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids_by_name.<%camera.storage_name%> set from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%>.uuid set from storage <%gu_storage%> out + } + + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + execute \ + on passengers \ + if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ + run block as_node/<%node.storage_name%> { + data modify entity @s CustomName set value '<%ENTITY_NAMES.NODE(blueprint_id, node.type, node.storage_name)%>' + function animated_java:global/gu/get_entity_uuid_string + scoreboard players operation @s <%OBJECTIVES.ID()%> = aj.last_id <%OBJECTIVES.ID()%> + } + + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids_by_name.<%node.storage_name%> set from storage <%gu_storage%> out + } + IF (has_entity_locators) { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - summon <%locator.config.entity_type%> \ - ^<%roundTo(locator.default_transform.pos[0], 10)%> \ - ^<%roundTo(locator.default_transform.pos[1], 10)%> \ - ^<%roundTo(locator.default_transform.pos[2], 10)%> \ - {Tags:<%getNodeTags(locator, rig)%>} - execute \ - as @n[ \ - type=<%locator.config.entity_type%>, \ - tag=<%TAGS.PROJECT_LOCATOR_NAMED(export_namespace, locator.storage_name)%>, \ - tag=<%TAGS.NEW()%>, \ - distance=..<%Math.ceil(locator.max_distance)%> \ - ] \ - run block as_locator/<%locator.storage_name%> { - # run block ../as_locator/<%locator.storage_name%> { - tag @s remove <%TAGS.NEW()%> - function *global/gu/get_entity_uuid_string - } - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.<%locator.storage_name%> set from storage <%gu_storage%> out - data modify entity @s data.locators.<%locator.storage_name%>.uuid set from storage <%gu_storage%> out - } - - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - summon minecraft:item_display \ - ^<%roundTo(camera.default_transform.pos[0], 10)%> \ - ^<%roundTo(camera.default_transform.pos[1], 10)%> \ - ^<%roundTo(camera.default_transform.pos[2], 10)%> \ - {Tags:<%getNodeTags(camera, rig)%>, teleport_duration: 2} - execute \ - as @n[ \ - type=minecraft:item_display, \ - tag=<%TAGS.PROJECT_CAMERA_NAMED(export_namespace, camera.storage_name)%>, \ - tag=<%TAGS.NEW()%>, \ - distance=..<%Math.ceil(camera.max_distance)%> \ - ] \ - run block as_camera/<%camera.storage_name%> { - # run block ../as_camera/<%camera.storage_name%> { - tag @s remove <%TAGS.NEW()%> - function *global/gu/get_entity_uuid_string + block { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + # Track any custom entities on the locator. + $execute at @s as $(uuid) at @s run function animated_java:global/util/get_entity_stack_uuids } - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.<%camera.storage_name%> set from storage <%gu_storage%> out - data modify entity @s data.cameras.<%camera.storage_name%>.uuid set from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids append from storage <%temp_storage%> uuids } + } - REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { - execute \ - on vehicle \ - on passengers \ - if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ - run \ - function *global/gu/get_entity_uuid_string + function <%blueprint_id%>/zzz/set_default_pose - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.<%node.storage_name%> set from storage <%gu_storage%> out - } - } + data_manager write # Variant Arguement IF (Object.keys(rig.variants).length > 1) { @@ -220,12 +231,12 @@ function summon { execute if data storage <%temp_storage%> {args:{variant:''}} run return run block if_empty { # Tell the user that the variant cannot be empty. tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('variant')%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function } # Attempt to apply the requested variant. # We get the success of the `try_apply` function in just in case the user's arguments are *very* wrong. execute store success score #success <%OBJECTIVES.I()%> run block try_apply { with storage <%temp_storage%> args - $execute if function animated_java:<%export_namespace%>/variants/$(variant)/apply run return 1 + $execute if function <%blueprint_id%>/variants/$(variant)/apply run return 1 # If the apply function fails, the variant doesn't exist, so we return an error. return fail } @@ -233,25 +244,21 @@ function summon { execute unless score #success <%OBJECTIVES.I()%> matches 1 run return run block invalid_variant { # Tell the user that the provided variant doesn't exist, remove the rig, and list all available variants for this rig. tellraw @a <%TELLRAW.INVALID_VARIANT(rig.variants)%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function } scoreboard players set #success <%OBJECTIVES.I()%> 1 } } ELSE { execute if data storage <%temp_storage%> args.variant run block zzz/variant_arg/no_variants_warning { tellraw @a <%TELLRAW.NO_VARIANTS()%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function scoreboard players set #success <%OBJECTIVES.I()%> 0 } } execute if score #success <%OBJECTIVES.I()%> matches 0 run return fail - function *<%export_namespace%>/set_default_pose IF (has_locators || has_cameras) { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run function ./on_tick/transform_floating_entities + function <%blueprint_id%>/root/on_tick/transform_floating_entities } execute on passengers run tp @s ~ ~ ~ ~ ~ @@ -260,26 +267,21 @@ function summon { execute on passengers run data modify entity @s teleport_duration set value <%teleportation_duration%> IF (has_entity_locators) { - execute at @s on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block locators_on_summon { - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity && node.config.on_summon_function)) as locator { - block { with entity @s data.locators.<%locator.storage_name%> - $execute as $(uuid) at @s run block <%locator.storage_name%> { - <%% - emit.mcb(locator.config.on_summon_function) - %%> - # Track any custom entities on the locator. - function *global/util/get_entity_stack_uuids - } + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity && node.config.on_summon_function)) as locator { + block { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + $execute at @s as $(uuid) at @s run block on_summon/custom_<%locator.type + '_' + locator.storage_name%> { + <%% + emit.mcb(locator.config.on_summon_function) + %%> } - data modify entity @s data.uuids append from storage <%temp_storage%> uuids } } } REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type) && node.on_summon_function?.trim())) as node { execute \ - on passengers if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ - run block node_on_summon_<%node.storage_name%> { + on passengers if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ + run block on_summon/<%node.type + '_' + node.storage_name%> { <%% emit.mcb(node.on_summon_function.trim()) %%> @@ -287,7 +289,7 @@ function summon { } IF (on_summon_function) { - execute at @s run block rig_on_summon { + execute at @s run block on_summon/rig { <%% emit.mcb(on_summon_function) %%> @@ -302,7 +304,7 @@ function summon { function as_node { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -311,8 +313,10 @@ function as_node { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block zzz/as_node/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.uuids_by_name.$(name) + data_manager prep read + + block zzz/as_node/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.uuids_by_name.$(name) IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -336,7 +340,7 @@ function as_node { IF (has_entity_locators) { function as_locator { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -346,11 +350,10 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/as_locator/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.$(name).uuid + data_manager prep read + + block zzz/as_locator/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.$(name).uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -373,7 +376,7 @@ IF (has_entity_locators) { function as_at_locator { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -383,11 +386,10 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/as_locator/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.$(name).uuid + data_manager prep read + + block zzz/as_locator/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.$(name).uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -410,7 +412,7 @@ IF (has_entity_locators) { function as_all_locators { #ARGS: {command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {command:'$(command)'} @@ -419,9 +421,11 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block zzz/as_all_locators/as_data { + data_manager prep read + + block zzz/as_all_locators/as_data { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.<%locator.storage_name%>.uuid + data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.<%locator.storage_name%>.uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -445,7 +449,7 @@ IF (has_entity_locators) { function as_at_all_locators { #ARGS: {command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {command:'$(command)'} @@ -454,9 +458,11 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block zzz/as_all_locators/as_data { + data_manager prep read + + block zzz/as_all_locators/as_data { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.<%locator.storage_name%>.uuid + data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.<%locator.storage_name%>.uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -482,7 +488,7 @@ IF (has_entity_locators) { IF (has_locators) { function at_locator { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)'} @@ -492,15 +498,13 @@ IF (has_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute \ - at @s \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/at_locator/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args merge from entity @s data.locators.$(name) + data_manager prep read + + execute at @s run block zzz/at_locator/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args merge from storage <%temp_storage%> entry.data.locators.$(name) IF (debug_mode) { - execute unless data storage <%temp_storage%> args.uuid run return run tellraw @a <%TELLRAW.LOCATOR_NOT_FOUND()%> + execute unless data storage <%temp_storage%> args.px run return run tellraw @a <%TELLRAW.LOCATOR_NOT_FOUND()%> scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -524,7 +528,7 @@ IF (has_locators) { function at_all_locators { #ARGS: {command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {command:'$(command)'} @@ -533,9 +537,11 @@ IF (has_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute at @s on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block zzz/at_all_locators/as_data { + data_manager prep read + + block zzz/at_all_locators/as_data { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - data modify storage <%temp_storage%> args merge from entity @s data.locators.<%locator.storage_name%> + data modify storage <%temp_storage%> args merge from storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -564,7 +570,7 @@ IF (has_locators) { IF (has_cameras) { function as_camera { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -574,11 +580,10 @@ IF (has_cameras) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/as_camera/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.cameras.$(name).uuid + data_manager prep read + + block zzz/as_camera/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.cameras.$(name).uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -607,10 +612,13 @@ IF (has_cameras) { function as_root { #ARGS: {command: string} - debug assert executed_as_entity_with_root_uuid_data + execute unless score @s <%OBJECTIVES.ID()%> matches <%-(2**31)%>..<%(2**31)-1%> run return run \ + tellraw @a <%TELLRAW.FUNCTION_NOT_EXECUTED_AS_ENTITY_WITH_ID_SCORE(context.functions.at(-1))%> + + data_manager prep read $data modify storage <%temp_storage%> args.command set value '$(command)' - data modify storage <%temp_storage%> args.root_uuid set from entity @s data.root_uuid + data modify storage <%temp_storage%> args.root_uuid set from storage <%temp_storage%> entry.data.root_uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -631,44 +639,43 @@ function as_root { dir remove { function all { # Removes all instances of this rig from the world. - execute as @e[type=minecraft:item_display,tag=<%TAGS.PROJECT_ROOT(export_namespace)%>] run function *<%export_namespace%>/remove/this + execute as @e[type=minecraft:item_display,tag=<%TAGS.PROJECT_ROOT(blueprint_id)%>] run function <%blueprint_id%>/remove/this } function entities { # Removes all entities related to this rig from the world. - kill @e[tag=<%TAGS.PROJECT_ENTITY(export_namespace)%>] + kill @e[tag=<%TAGS.PROJECT_ENTITY(blueprint_id)%>] } function this { # Removes the rig this function is executed as. - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> <%% if (on_remove_function) emit.mcb(on_remove_function) %%> IF (has_entity_locators) { - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block as_data { - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - IF (locator.config?.on_remove_function) { - IF (locator.config.use_entity) { - block as_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> - $execute as $(uuid) at @s run block locator_<%locator.storage_name%>_on_remove { - <%% - emit.mcb(locator.config.on_remove_function) - %%> - } + data_manager prep read + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { + IF (locator.config?.on_remove_function) { + IF (locator.config.use_entity) { + block as_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + $execute as $(uuid) at @s run block locator_<%locator.storage_name%>_on_remove { + <%% + emit.mcb(locator.config.on_remove_function) + %%> } - } ELSE { - block at_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> - $execute \ - positioned ^$(px) ^$(py) ^$(pz) \ - rotated ~$(ry) ~$(rx) \ - run block locator_<%locator.storage_name%>_on_remove { - <%% - emit.mcb(locator.config.on_remove_function) - %%> - } + } + } ELSE { + block at_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + $execute \ + positioned ^$(px) ^$(py) ^$(pz) \ + rotated ~$(ry) ~$(rx) \ + run block locator_<%locator.storage_name%>_on_remove { + <%% + emit.mcb(locator.config.on_remove_function) + %%> } } } @@ -681,27 +688,30 @@ dir remove { dir this { function without_on_remove_function { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + data_manager prep read IF (has_entity_locators || has_cameras) { - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block as_data { - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - function animated_java:global/remove/entity_stack_by_uuid with entity @s data.locators.<%locator.storage_name%> - } - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - function animated_java:global/remove/entity_stack_by_uuid with entity @s data.cameras.<%camera.storage_name%> - } + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { + function animated_java:global/remove/entity_stack_by_uuid with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + } + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { + function animated_java:global/remove/entity_stack_by_uuid with storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> } } # Remove the rig using the more expensive & thorough method if the rig_hash doesn't match. execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - unless data entity @s {data:{rig_hash: '<%rig_hash%>'}} \ - on vehicle \ + unless data storage <%temp_storage%> {entry:{data:{rig_hash: '<%rig_hash%>'}}} \ run function animated_java:global/remove/outdated_rig + block { with storage <%temp_storage%> entry.data.uuids_by_name + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + $kill $(<%node.storage_name%>) + } + } + function animated_java:global/remove/entity_stack } } @@ -712,7 +722,7 @@ IF (Object.keys(rig.variants).length > 1) { REPEAT (Object.values(rig.variants)) as variant { dir <%variant.name%> { function apply { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> <%% global.filteredNodes = Object.values(rig.nodes).filter( @@ -735,7 +745,7 @@ IF (Object.keys(rig.variants).length > 1) { REPEAT (global.filteredNodes) as node { execute \ on passengers \ - if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ + if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ at @s \ run \ block zzz/apply_to_node_<%node.storage_name%> { @@ -775,21 +785,25 @@ IF (has_locators || has_cameras) { function reset_floating_entities { IF (has_locators) { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - execute \ - at @s \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/set_default_pose/as_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> - IF (locator.config?.use_entity) { + IF (locator.config?.use_entity) { + execute at @s run block set_default_pose/as_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> $tp $(uuid) \ ^<%roundTo(locator.default_transform.pos[0], 10)%> \ ^<%roundTo(locator.default_transform.pos[1], 10)%> \ ^<%roundTo(locator.default_transform.pos[2], 10)%> \ ~<%roundTo(locator.default_transform.head_rot[1], 10)%> \ ~<%roundTo(locator.default_transform.head_rot[0], 10)%> - } - data modify entity @s data.locators.<%locator.storage_name%> merge value { \ + data modify storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> merge value { \ + px: <%roundTo(locator.default_transform.pos[0], 10)%>, \ + py: <%roundTo(locator.default_transform.pos[1], 10)%>, \ + pz: <%roundTo(locator.default_transform.pos[2], 10)%>, \ + ry: <%roundTo(locator.default_transform.head_rot[1], 10)%>, \ + rx: <%roundTo(locator.default_transform.head_rot[0], 10)%> \ + } + } + } ELSE { + data modify storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> merge value { \ px: <%roundTo(locator.default_transform.pos[0], 10)%>, \ py: <%roundTo(locator.default_transform.pos[1], 10)%>, \ pz: <%roundTo(locator.default_transform.pos[2], 10)%>, \ @@ -802,11 +816,7 @@ IF (has_locators || has_cameras) { IF (has_cameras) { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - execute \ - at @s \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/set_default_pose/as_camera_<%camera.storage_name%> { with entity @s data.cameras.<%camera.storage_name%> + execute at @s run block set_default_pose/as_camera_<%camera.storage_name%> { with storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> $tp $(uuid) \ ^<%roundTo(camera.default_transform.pos[0], 10)%> \ ^<%roundTo(camera.default_transform.pos[1], 10)%> \ @@ -814,7 +824,7 @@ IF (has_locators || has_cameras) { ~<%roundTo(camera.default_transform.head_rot[1], 10)%> \ ~<%roundTo(camera.default_transform.head_rot[0], 10)%> - data modify entity @s data.cameras.<%camera.storage_name%> merge value { \ + data modify storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> merge value { \ px: <%roundTo(camera.default_transform.pos[0], 10)%>, \ py: <%roundTo(camera.default_transform.pos[1], 10)%>, \ pz: <%roundTo(camera.default_transform.pos[2], 10)%>, \ @@ -828,22 +838,31 @@ IF (has_locators || has_cameras) { } } +dir zzz { + function set_default_pose { + IF (has_locators || has_cameras) { + function ../zzz/reset_floating_entities + } + + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + execute \ + on passengers \ + if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ + run \ + data merge entity @s { \ + transformation: <%matrixToNbtFloatArray(node.default_transform.matrix).toString()%>, \ + start_interpolation: -1 \ + } + } + } +} + function set_default_pose { # Changes the pose of the rig to the the default pose without interpolation - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> IF (has_locators || has_cameras) { - function ./zzz/reset_floating_entities + data_manager prep read } - - REPEAT (Object.values(rig.nodes).filter(node => node.type !== 'locator' && node.type !== 'camera')) as node { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ - run \ - data merge entity @s { \ - transformation: <%matrixToNbtFloatArray(node.default_transform.matrix).toString()%>, \ - start_interpolation: -1 \ - } - } -} + function ./zzz/set_default_pose +} \ No newline at end of file diff --git a/src/systems/datapackCompiler/1.21.2/animation.mcb b/src/systems/datapackCompiler/1.21.2/animation.mcb index e43cbefa..f79875ca 100644 --- a/src/systems/datapackCompiler/1.21.2/animation.mcb +++ b/src/systems/datapackCompiler/1.21.2/animation.mcb @@ -1,5 +1,7 @@ # TODO - Move all internal functions into an internal namespace, and only have user-facing functions in the main `animated_java:<%export_namespace%>` namespace. -import ../global.mcbt + +# DIFFERENCES FROM 1.21.0: +# - /rotate command function on_load { data modify storage <%project_storage%> rig_hash set value <%"'" + rig_hash + "'"%> @@ -26,14 +28,8 @@ function remove_animation_objectives { tellraw @a <%TELLRAW.UNINSTALL()%> } -function invalid_version_warning { - # This function will contain a tellraw if the datapack is loaded in the wrong version. -} - dir root { function on_tick { - execute unless entity @s[tag=<%TAGS.PROJECT_ROOT(export_namespace)%>] run return 0 - # Custom pre-tick function IF (on_pre_tick_function) { <%% @@ -41,38 +37,35 @@ dir root { %%> } + # animated_java:global/root/on_tick already runs this right before calling this function. + # data_manager prep read + # Once we have more than 8 animations, calling a function only if at least one animation is playing is more efficient. IF (animations.length > 8) { # If no animations are playing, we can skip all animation logic. # This helps reduce ticking commands for rigs that are idle. execute \ - unless entity @s[<%animations.map(anim => 'tag=!' + TAGS.ANIMATION_PLAYING(export_namespace, anim.storage_name)).join(',')%>] \ + unless entity @s[<%animations.map(anim => 'tag=!' + TAGS.ANIMATION_PLAYING(blueprint_id, anim.storage_name)).join(',')%>] \ run block tick_animations { REPEAT (animations) as animation { - execute if entity @s[tag=<%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%>] run \ - function *<%export_namespace%>/animations/<%animation.storage_name%>/zzz/on_tick + execute if entity @s[tag=<%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%>] run \ + function <%blueprint_id%>/animations/<%animation.storage_name%>/zzz/on_tick } } } ELSE { REPEAT (animations) as animation { - execute if entity @s[tag=<%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%>] run \ - function *<%export_namespace%>/animations/<%animation.storage_name%>/zzz/on_tick + execute if entity @s[tag=<%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%>] run \ + function <%blueprint_id%>/animations/<%animation.storage_name%>/zzz/on_tick } } IF (auto_update_rig_orientation) { IF (has_locators || has_cameras) { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run function ./on_tick/transform_floating_entities + function <%blueprint_id%>/root/on_tick/transform_floating_entities } execute on passengers run rotate @s ~ ~ } ELSE IF (has_ticking_locators) { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run function ./on_tick/transform_locators + function <%blueprint_id%>/root/on_tick/transform_locators } # Custom post-tick function @@ -87,7 +80,7 @@ dir root { dir on_tick { function transform_locators { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - block select_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> + block select_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> IF (locator.config?.use_entity) { $execute \ as $(uuid) \ @@ -124,7 +117,7 @@ dir root { function ./transform_locators REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - block select_camera_<%camera.storage_name%> { with entity @s data.cameras.<%camera.storage_name%> + block select_camera_<%camera.storage_name%> { with storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> $execute \ as $(uuid) \ positioned ^$(px) ^$(py) ^$(pz) \ @@ -139,15 +132,13 @@ dir root { IF (!auto_update_rig_orientation) { function move { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> tp @s ~ ~ ~ ~ ~ IF (has_locators || has_cameras) { - execute \ - at @s on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run function ./on_tick/transform_floating_entities + data_manager prep read + function <%blueprint_id%>/root/on_tick/transform_floating_entities } execute at @s on passengers run rotate @s ~ ~ } @@ -161,11 +152,11 @@ dir animations { REPEAT (animations) as animation { dir <%animation.storage_name%> { function play { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> - function *<%export_namespace%>/animations/pause_all + function <%blueprint_id%>/animations/pause_all - tag @s add <%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%> + tag @s add <%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%> scoreboard players set @s <%OBJECTIVES.FRAME(animation.storage_name)%> 0 tag @s add <%TAGS.TRANSFORMS_ONLY()%> execute at @s run function ./zzz/set_frame {frame: 0} @@ -173,9 +164,9 @@ dir animations { } function stop { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> - function *<%export_namespace%>/animations/pause_all + function <%blueprint_id%>/animations/pause_all scoreboard players set @s <%OBJECTIVES.FRAME(animation.storage_name)%> 0 tag @s add <%TAGS.TRANSFORMS_ONLY()%> @@ -184,19 +175,19 @@ dir animations { } function pause { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> - tag @s remove <%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%> + tag @s remove <%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%> } function resume { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> - tag @s add <%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%> + tag @s add <%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%> } function next_frame { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> execute if score @s <%OBJECTIVES.FRAME(animation.storage_name)%> matches <%animation.duration%>.. run scoreboard players set @s <%OBJECTIVES.FRAME(animation.storage_name)%> 1 data remove storage <%temp_storage%> args @@ -208,7 +199,9 @@ dir animations { function set_frame { # Sets the frame without interpolation #ARGS: {frame: int} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + data_manager prep read data remove storage <%temp_storage%> args $execute store result storage <%temp_storage%> args.frame int 1 run scoreboard players set @s <%OBJECTIVES.FRAME(animation.storage_name)%> $(frame) @@ -217,7 +210,9 @@ dir animations { function apply_frame { #ARGS: {frame: int} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + data_manager prep read data remove storage <%temp_storage%> args $execute store result storage <%temp_storage%> args.frame int 1 run scoreboard players set @s <%OBJECTIVES.FRAME(animation.storage_name)%> $(frame) @@ -227,11 +222,11 @@ dir animations { function tween { # Attempts to smoothly transition from the currently playing animation into this one. #ARGS: {duration: int, to_frame: int} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> - function *<%export_namespace%>/animations/pause_all + function <%blueprint_id%>/animations/pause_all - tag @s add <%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%> + tag @s add <%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%> $scoreboard players set @s <%OBJECTIVES.TWEEN_DURATION()%> $(duration) $scoreboard players set @s <%OBJECTIVES.FRAME(animation.storage_name)%> $(to_frame) @@ -255,7 +250,7 @@ dir animations { # Makes sure function keyframes in the last frame of the animation are activated. execute if score @s <%OBJECTIVES.FRAME(animation.storage_name)%> matches -1 run \ block function_keyframe_loop_patch { - function ./apply_frame {frame: <%animation.duration-1%>} + function ./frames/last_frame_effects with storage <%temp_storage%> entry.data.uuids_by_name scoreboard players add @s <%OBJECTIVES.FRAME(animation.storage_name)%> 1 } } @@ -288,7 +283,7 @@ dir animations { tag @s add <%TAGS.TRANSFORMS_ONLY()%> execute at @s run function ./zzz/set_frame {frame: 0} tag @s remove <%TAGS.TRANSFORMS_ONLY()%> - tag @s remove <%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%> + tag @s remove <%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%> } } scoreboard players add @s <%OBJECTIVES.FRAME(animation.storage_name)%> 1 @@ -298,7 +293,7 @@ dir animations { function set_frame { #ARGS: {frame: int} $function ./apply_frame {frame: $(frame)} - execute on passengers run data modify entity @s[tag=!<%TAGS.GLOBAL_DATA()%>] start_interpolation set value -1 + execute on passengers run data modify entity @s start_interpolation set value -1 return 1 } @@ -306,12 +301,11 @@ dir animations { #ARGS: {frame: int} REPEAT (Object.values(animation.modified_nodes).sort(nodeSorter)) as node { IF (BONE_TYPES.includes(node.type)) { - $execute on passengers if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] run \ + $execute on passengers if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] run \ data modify entity @s {} merge from \ storage <%project_storage%>/animations <%animation.storage_name%>.$(frame).<%node.storage_name%> } ELSE IF (node.type === 'locator' || node.type === 'camera') { - $execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run \ - $data modify entity @s data.uuids_by_name.<%node.storage_name%> merge from \ + $data modify storage <%temp_storage%> entry.data.uuids_by_name.<%node.storage_name%> merge from \ storage <%project_storage%>/animations <%animation.storage_name%>.$(frame).<%node.storage_name%> } } @@ -322,7 +316,7 @@ dir animations { unless entity @s[tag=<%TAGS.TRANSFORMS_ONLY()%>] \ run { with storage <%project_storage%>/animations <%animation.storage_name%>.$(frame).variant #ARGS: {name: string, condition: string} - $execute $(condition)run function *<%export_namespace%>/variants/$(name)/apply + $execute $(condition)run function <%blueprint_id%>/variants/$(name)/apply } } @@ -332,10 +326,10 @@ dir animations { function set_frame { # Sets the frame without interpolation #ARGS: {frame: int} - $execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run \ - function ./frames/$(frame) with entity @s data.uuids_by_name - execute on passengers if entity @s[tag=!<%TAGS.GLOBAL_DATA()%>] run \ + $function ./frames/$(frame) with storage <%temp_storage%> entry.data.uuids_by_name + + execute on passengers run \ data modify entity @s start_interpolation set value -1 return 1 @@ -343,14 +337,67 @@ dir animations { function apply_frame { #ARGS: {frame: int} - $execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run \ - function ./frames/$(frame) with entity @s data.uuids_by_name + + $function ./frames/$(frame) with storage <%temp_storage%> entry.data.uuids_by_name return 1 } # FIXME - %NEWLINE_PATCH% is a temporary solution to temporarily fix an MCB bug where extra newlines are being added to the output. dir frames { + <%% + global.frame = animation.frames.at(-1) + global.modified_effect_nodes = Object.values(animation.modified_nodes).filter( + node => node.type === 'locator' && global.frame.node_transforms[node.uuid] + ) + console.log(global.modified_effect_nodes) + %%> + IF(Object.keys(global.modified_effect_nodes).length > 0) { + function last_frame_effects { + REPEAT(global.modified_effect_nodes) as node { + <%% + global.transform = global.frame.node_transforms[node.uuid] + %%> + IF (node.config?.use_entity) { + $execute \ + as $(<%node.storage_name%>) \ + positioned \ + ^<%roundTo(global.transform.pos[0], 10)%> \ + ^<%roundTo(global.transform.pos[1], 10)%> \ + ^<%roundTo(global.transform.pos[2], 10)%> \ + rotated \ + ~<%roundTo(global.transform.head_rot[1], 10)%> \ + ~<%roundTo(global.transform.head_rot[0], 10)%> \ + <%global.transform.function_execute_condition ? global.transform.function_execute_condition + ' ' : ''%>run \ + function ./<%animation.duration%>_locator_<%node.storage_name%> + } ELSE { + execute \ + positioned \ + ^<%roundTo(global.transform.pos[0], 10)%> \ + ^<%roundTo(global.transform.pos[1], 10)%> \ + ^<%roundTo(global.transform.pos[2], 10)%> \ + rotated \ + ~<%roundTo(global.transform.head_rot[1], 10)%> \ + ~<%roundTo(global.transform.head_rot[0], 10)%> \ + <%global.transform.function_execute_condition ? global.transform.function_execute_condition + ' ' : ''%>run \ + function ./<%animation.duration%>_locator_<%node.storage_name%> + } + } + + IF (global.frame.variants?.length > 0) { + execute <%global.frame.variants_execute_condition ? global.frame.variants_execute_condition + ' ' : ''%>run \ + function <%blueprint_id%>/variants/<%global.frame.variants[0].name%>/apply + } + + IF (global.frame.function) { + execute <%global.frame.function_execute_condition ? global.frame.function_execute_condition + ' ' : ''%>run \ + block <%animation.duration%>_function_keyframe { + <%global.frame.function%> + } + } + } + } + <%% // A record of node uuid to INodeTransform. // Keeps track of the last time a bone was updated. @@ -409,7 +456,7 @@ dir animations { if (transform.function) { if (node.config?.use_entity) { frameFunc += - `\n$execute on vehicle unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] as $(${node.storage_name}) ` + `\n$execute unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] as $(${node.storage_name}) ` + `positioned ^${roundTo(transform.pos[0], 10)} ^${roundTo(transform.pos[1], 10)} ^${roundTo(transform.pos[2], 10)} ` + `rotated ~${roundTo(transform.head_rot[1], 10)} ~${roundTo(transform.head_rot[0], 10)} ` + `${transform.function_execute_condition ? transform.function_execute_condition + ' ' : ''}run ` @@ -419,7 +466,7 @@ dir animations { + `\n}` } else { frameFunc += - `\nexecute on vehicle unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] ` + `\nexecute unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] ` + `positioned ^${roundTo(transform.pos[0], 10)} ^${roundTo(transform.pos[1], 10)} ^${roundTo(transform.pos[2], 10)} ` + `rotated ~${roundTo(transform.head_rot[1], 10)} ~${roundTo(transform.head_rot[0], 10)} ` + `${transform.function_execute_condition ? transform.function_execute_condition + ' ' : ''}run ` @@ -448,9 +495,10 @@ dir animations { } if (Object.keys(to_merge.locators).length > 0 || Object.keys(to_merge.cameras).length > 0) { - frameFunc += `\ndata modify entity @s data merge value ${JSON.stringify(to_merge)}` + frameFunc += `\ndata modify storage <%temp_storage%> entry.data merge value ${JSON.stringify(to_merge)}` + frameFunc += `\ndata_manager write` if (!auto_update_rig_orientation) { - frameFunc += `\nfunction ./on_tick/transform_floating_entities` + frameFunc += `\nfunction ${blueprint_id}/root/on_tick/transform_floating_entities` } hasFunction = true } @@ -461,14 +509,14 @@ dir animations { throw new Error(`Could not find Variant with uuid "${frame.variants[0]}" while generating frame "${frameIndex}" of animation "${animation.name}".`) } const execute_condition = frame.variants_execute_condition ? frame.variants_execute_condition + ' ' : '' - frameFunc += `\nexecute on vehicle unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] ${execute_condition}run function *${export_namespace}/variants/${variant.name}/apply` + frameFunc += `\nexecute unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] ${execute_condition}run function ${blueprint_id}/variants/${variant.name}/apply` ;hasFunction = true } // Root function keyframes. if (frame.function) { const execute_condition = frame.function_execute_condition ? frame.function_execute_condition + ' ' : '' - frameFunc += `\nexecute on vehicle unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] at @s ${execute_condition}run block ${frameIndex}_root_function%NEWLINE_PATCH%{\n${frame.function}\n}` + frameFunc += `\nexecute unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] at @s ${execute_condition}run block ${frameIndex}_root_function%NEWLINE_PATCH%{\n${frame.function}\n}` ;hasFunction = true } ;if (frameFunc.length > 0) { @@ -484,10 +532,10 @@ dir animations { } function pause_all { # Pauses all animations - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> REPEAT (animations) as animation { - tag @s remove <%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%> + tag @s remove <%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%> } } } @@ -504,97 +552,112 @@ function summon { '<%TAGS.NEW()%>', \ '<%TAGS.GLOBAL_ENTITY()%>', \ '<%TAGS.GLOBAL_ROOT()%>', \ - '<%TAGS.PROJECT_ENTITY(export_namespace)%>', \ - '<%TAGS.PROJECT_ROOT(export_namespace)%>' \ + '<%TAGS.PROJECT_ENTITY(blueprint_id)%>', \ + '<%TAGS.PROJECT_ROOT(blueprint_id)%>' \ ], \ teleport_duration: 0, \ interpolation_duration: <%interpolation_duration%>, \ Passengers:<%root_entity_passengers%>, \ + CustomName: '<%ENTITY_NAMES.ROOT(blueprint_id)%>', \ } execute as @n[ \ type=minecraft:item_display, \ - tag=<%TAGS.PROJECT_ROOT(export_namespace)%>, \ + tag=<%TAGS.PROJECT_ROOT(blueprint_id)%>, \ tag=<%TAGS.NEW()%>, \ distance=..0.01 \ ] run block zzz/summon/as_root_entity { execute store result score @s <%OBJECTIVES.ID()%> run scoreboard players add aj.last_id <%OBJECTIVES.ID()%> 1 + + data_manager init prep read + # Data manager init runs gu:get_entity_uuid_string. So we don't need to call it again here. + # function animated_java:global/gu/get_entity_uuid_string + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.root_uuid set from storage <%gu_storage%> out + + data modify storage <%temp_storage%> entry.data.blueprint_id set value "<%blueprint_id%>" + data modify storage <%temp_storage%> entry.data.rig_hash set value "<%rig_hash%>" + # Align the position and rotation of the root with the command context. tp @s ~ ~ ~ ~ ~ - function *global/gu/get_entity_uuid_string - execute at @s on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block as_data_entity { - # Rig Root UUID - data modify storage <%temp_storage%> root_uuid set from storage <%gu_storage%> out - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.root_uuid set from storage <%gu_storage%> out - # Data Entity UUID - function *global/gu/get_entity_uuid_string - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.data_data set from storage <%gu_storage%> out + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { + summon <%locator.config.entity_type%> \ + ^<%roundTo(locator.default_transform.pos[0], 10)%> \ + ^<%roundTo(locator.default_transform.pos[1], 10)%> \ + ^<%roundTo(locator.default_transform.pos[2], 10)%> \ + {Tags:<%getNodeTags(locator, rig)%>} + execute \ + as @n[ \ + type=<%locator.config.entity_type%>, \ + tag=<%TAGS.PROJECT_LOCATOR_NAMED(blueprint_id, locator.storage_name)%>, \ + tag=<%TAGS.NEW()%>, \ + distance=..<%Math.ceil(locator.max_distance)%> \ + ] \ + run block as_locator/<%locator.storage_name%> { + # run block ../as_locator/<%locator.storage_name%> { + tag @s remove <%TAGS.NEW()%> + data modify entity @s CustomName set value '<%ENTITY_NAMES.NODE(blueprint_id, locator.type, locator.storage_name)%>' + function animated_java:global/gu/get_entity_uuid_string + scoreboard players operation @s <%OBJECTIVES.ID()%> = aj.last_id <%OBJECTIVES.ID()%> + } + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids_by_name.<%locator.storage_name%> set from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.locators.<%locator.storage_name%>.uuid set from storage <%gu_storage%> out + } - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - summon <%locator.config.entity_type%> \ - ^<%roundTo(locator.default_transform.pos[0], 10)%> \ - ^<%roundTo(locator.default_transform.pos[1], 10)%> \ - ^<%roundTo(locator.default_transform.pos[2], 10)%> \ - {Tags:<%getNodeTags(locator, rig)%>} - execute \ - as @n[ \ - type=<%locator.config.entity_type%>, \ - tag=<%TAGS.PROJECT_LOCATOR_NAMED(export_namespace, locator.storage_name)%>, \ - tag=<%TAGS.NEW()%>, \ - distance=..<%Math.ceil(locator.max_distance)%> \ - ] \ - run block as_locator/<%locator.storage_name%> { - # run block ../as_locator/<%locator.storage_name%> { - tag @s remove <%TAGS.NEW()%> - function *global/gu/get_entity_uuid_string - data modify entity @s data.root_uuid set from storage <%temp_storage%> root_uuid - } - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.<%locator.storage_name%> set from storage <%gu_storage%> out - data modify entity @s data.locators.<%locator.storage_name%>.uuid set from storage <%gu_storage%> out + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { + summon minecraft:item_display \ + ^<%roundTo(camera.default_transform.pos[0], 10)%> \ + ^<%roundTo(camera.default_transform.pos[1], 10)%> \ + ^<%roundTo(camera.default_transform.pos[2], 10)%> \ + {Tags:<%getNodeTags(camera, rig)%>, teleport_duration: 2} + execute \ + as @n[ \ + type=minecraft:item_display, \ + tag=<%TAGS.PROJECT_CAMERA_NAMED(blueprint_id, camera.storage_name)%>, \ + tag=<%TAGS.NEW()%>, \ + distance=..<%Math.ceil(camera.max_distance)%> \ + ] \ + run block as_camera/<%camera.storage_name%> { + # run block ../as_camera/<%camera.storage_name%> { + tag @s remove <%TAGS.NEW()%> + data modify entity @s CustomName set value '<%ENTITY_NAMES.NODE(blueprint_id, camera.type, camera.storage_name)%>' + function animated_java:global/gu/get_entity_uuid_string + scoreboard players operation @s <%OBJECTIVES.ID()%> = aj.last_id <%OBJECTIVES.ID()%> } + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids_by_name.<%camera.storage_name%> set from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%>.uuid set from storage <%gu_storage%> out + } - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - summon minecraft:item_display \ - ^<%roundTo(camera.default_transform.pos[0], 10)%> \ - ^<%roundTo(camera.default_transform.pos[1], 10)%> \ - ^<%roundTo(camera.default_transform.pos[2], 10)%> \ - {Tags:<%getNodeTags(camera, rig)%>, teleport_duration: 2} - execute \ - as @n[ \ - type=minecraft:item_display, \ - tag=<%TAGS.PROJECT_CAMERA_NAMED(export_namespace, camera.storage_name)%>, \ - tag=<%TAGS.NEW()%>, \ - distance=..<%Math.ceil(camera.max_distance)%> \ - ] \ - run block as_camera/<%camera.storage_name%> { - # run block ../as_camera/<%camera.storage_name%> { - tag @s remove <%TAGS.NEW()%> - function *global/gu/get_entity_uuid_string - data modify entity @s data.root_uuid set from storage <%temp_storage%> root_uuid - } - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.<%camera.storage_name%> set from storage <%gu_storage%> out - data modify entity @s data.cameras.<%camera.storage_name%>.uuid set from storage <%gu_storage%> out + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + execute \ + on passengers \ + if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ + run block as_node/<%node.storage_name%> { + data modify entity @s CustomName set value '<%ENTITY_NAMES.NODE(blueprint_id, node.type, node.storage_name)%>' + function animated_java:global/gu/get_entity_uuid_string + scoreboard players operation @s <%OBJECTIVES.ID()%> = aj.last_id <%OBJECTIVES.ID()%> } - REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { - execute \ - on vehicle \ - on passengers \ - if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ - run block as_node/<%node.storage_name%> { - function *global/gu/get_entity_uuid_string - data modify entity @s data.root_uuid set from storage <%temp_storage%> root_uuid - } + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids_by_name.<%node.storage_name%> set from storage <%gu_storage%> out + } - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.<%node.storage_name%> set from storage <%gu_storage%> out + IF (has_entity_locators) { + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { + block { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + # Track any custom entities on the locator. + $execute at @s as $(uuid) at @s run function animated_java:global/util/get_entity_stack_uuids + } + data modify storage <%temp_storage%> entry.data.uuids append from storage <%temp_storage%> uuids } } + function <%blueprint_id%>/zzz/set_default_pose + + data_manager write + # Variant Arguement IF (Object.keys(rig.variants).length > 1) { execute if data storage <%temp_storage%> args.variant run block variant_arg/process { with storage <%temp_storage%> args @@ -603,12 +666,12 @@ function summon { execute if data storage <%temp_storage%> {args:{variant:''}} run return run block if_empty { # Tell the user that the variant cannot be empty. tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('variant')%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function } # Attempt to apply the requested variant. # We get the success of the `try_apply` function in just in case the user's arguments are *very* wrong. execute store success score #success <%OBJECTIVES.I()%> run block try_apply { with storage <%temp_storage%> args - $execute if function animated_java:<%export_namespace%>/variants/$(variant)/apply run return 1 + $execute if function <%blueprint_id%>/variants/$(variant)/apply run return 1 # If the apply function fails, the variant doesn't exist, so we return an error. return fail } @@ -616,21 +679,19 @@ function summon { execute unless score #success <%OBJECTIVES.I()%> matches 1 run return run block invalid_variant { # Tell the user that the provided variant doesn't exist, remove the rig, and list all available variants for this rig. tellraw @a <%TELLRAW.INVALID_VARIANT(rig.variants)%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function } scoreboard players set #success <%OBJECTIVES.I()%> 1 } } ELSE { execute if data storage <%temp_storage%> args.variant run block zzz/variant_arg/no_variants_warning { tellraw @a <%TELLRAW.NO_VARIANTS()%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function scoreboard players set #success <%OBJECTIVES.I()%> 0 } } execute if score #success <%OBJECTIVES.I()%> matches 0 run return fail - function *<%export_namespace%>/set_default_pose - # Animation Argument # If the animation argument is provided, attempt to apply the animation. execute if data storage <%temp_storage%> args.animation run block animation_arg/process { with storage <%temp_storage%> args @@ -638,7 +699,7 @@ function summon { # If the animation argument is *explicitly* set to an empty string, return an error. execute if data storage <%temp_storage%> {args:{animation:''}} run return run block if_empty { tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('animation')%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function } # Automatically set the frame argument to 0 if the frame argument is not provided. # Takes advantage of `store result score` setting the score to 0 if the command fails. @@ -651,13 +712,13 @@ function summon { execute if score #frame <%OBJECTIVES.I()%> matches ..-1 run return run block no_negative { # Tell the user that the frame argument cannot be negative. tellraw @a <%TELLRAW.FRAME_CANNOT_BE_NEGATIVE()%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function } # Attempt to apply the animation frame. execute store success score #success <%OBJECTIVES.I()%> run block try_set_frame { with storage <%temp_storage%> args # Make sure we're only applying transforms when setting the summon pose. tag @s add <%TAGS.TRANSFORMS_ONLY()%> - $execute store success score #success <%OBJECTIVES.I()%> run function *<%export_namespace%>/animations/$(animation)/zzz/set_frame with storage <%temp_storage%> args + $execute store success score #success <%OBJECTIVES.I()%> run function <%blueprint_id%>/animations/$(animation)/zzz/set_frame with storage <%temp_storage%> args tag @s remove <%TAGS.TRANSFORMS_ONLY()%> execute if score #success <%OBJECTIVES.I()%> matches 1 run return 1 # If the set_frame function fails, the animation doesn't exist, so we return an error. @@ -667,22 +728,19 @@ function summon { execute unless score #success <%OBJECTIVES.I()%> matches 1 run return run block invalid_animation { # Tell the user that the provided animation doesn't exist, remove the rig, and list all available animations for this rig. tellraw @a <%TELLRAW.INVALID_ANIMATION(animations)%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function } # If the animation is successfully applied, and the start_animation argument is set to true, start the animation. execute if data storage <%temp_storage%> {args:{start_animation: true}} run block start_animation { with storage <%temp_storage%> args - $function *<%export_namespace%>/animations/$(animation)/resume + $function <%blueprint_id%>/animations/$(animation)/resume } scoreboard players set #success <%OBJECTIVES.I()%> 1 } execute if score #success <%OBJECTIVES.I()%> matches 0 run return fail IF (has_locators || has_cameras) { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run function ./on_tick/transform_floating_entities + function <%blueprint_id%>/root/on_tick/transform_floating_entities } execute on passengers run rotate @s ~ ~ @@ -691,26 +749,21 @@ function summon { execute on passengers run data modify entity @s teleport_duration set value <%teleportation_duration%> IF (has_entity_locators) { - execute at @s on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block locators_on_summon { - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity && node.config.on_summon_function)) as locator { - block { with entity @s data.locators.<%locator.storage_name%> - $execute as $(uuid) at @s run block <%locator.storage_name%> { - <%% - emit.mcb(locator.config.on_summon_function) - %%> - # Track any custom entities on the locator. - function *global/util/get_entity_stack_uuids - } + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity && node.config.on_summon_function)) as locator { + block { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + $execute at @s as $(uuid) at @s run block on_summon/custom_<%locator.type + '_' + locator.storage_name%> { + <%% + emit.mcb(locator.config.on_summon_function) + %%> } - data modify entity @s data.uuids append from storage <%temp_storage%> uuids } } } REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type) && node.on_summon_function?.trim())) as node { execute \ - on passengers if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ - run block node_on_summon_<%node.storage_name%> { + on passengers if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ + run block on_summon/<%node.type + '_' + node.storage_name%> { <%% emit.mcb(node.on_summon_function.trim()) %%> @@ -718,7 +771,7 @@ function summon { } IF (on_summon_function) { - execute at @s run block rig_on_summon { + execute at @s run block on_summon/rig { <%% emit.mcb(on_summon_function) %%> @@ -733,7 +786,7 @@ function summon { function as_node { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -742,8 +795,10 @@ function as_node { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block zzz/as_node/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.uuids_by_name.$(name) + data_manager prep read + + block zzz/as_node/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.uuids_by_name.$(name) IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -767,7 +822,7 @@ function as_node { IF (has_entity_locators) { function as_locator { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -777,11 +832,10 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/as_locator/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.$(name).uuid + data_manager prep read + + block zzz/as_locator/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.$(name).uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -804,7 +858,7 @@ IF (has_entity_locators) { function as_at_locator { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -814,11 +868,10 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/as_locator/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.$(name).uuid + data_manager prep read + + block zzz/as_locator/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.$(name).uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -841,7 +894,7 @@ IF (has_entity_locators) { function as_all_locators { #ARGS: {command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {command:'$(command)'} @@ -850,9 +903,11 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block zzz/as_all_locators/as_data { + data_manager prep read + + block zzz/as_all_locators/as_data { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.<%locator.storage_name%>.uuid + data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.<%locator.storage_name%>.uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -876,7 +931,7 @@ IF (has_entity_locators) { function as_at_all_locators { #ARGS: {command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {command:'$(command)'} @@ -885,9 +940,11 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block zzz/as_all_locators/as_data { + data_manager prep read + + block zzz/as_all_locators/as_data { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.<%locator.storage_name%>.uuid + data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.<%locator.storage_name%>.uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -913,7 +970,7 @@ IF (has_entity_locators) { IF (has_locators) { function at_locator { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)'} @@ -923,15 +980,13 @@ IF (has_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute \ - at @s \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/at_locator/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args merge from entity @s data.locators.$(name) + data_manager prep read + + execute at @s run block zzz/at_locator/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args merge from storage <%temp_storage%> entry.data.locators.$(name) IF (debug_mode) { - execute unless data storage <%temp_storage%> args.uuid run return run tellraw @a <%TELLRAW.LOCATOR_NOT_FOUND()%> + execute unless data storage <%temp_storage%> args.px run return run tellraw @a <%TELLRAW.LOCATOR_NOT_FOUND()%> scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -955,7 +1010,7 @@ IF (has_locators) { function at_all_locators { #ARGS: {command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {command:'$(command)'} @@ -964,9 +1019,11 @@ IF (has_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute at @s on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block zzz/at_all_locators/as_data { + data_manager prep read + + block zzz/at_all_locators/as_data { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - data modify storage <%temp_storage%> args merge from entity @s data.locators.<%locator.storage_name%> + data modify storage <%temp_storage%> args merge from storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -995,7 +1052,7 @@ IF (has_locators) { IF (has_cameras) { function as_camera { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -1005,11 +1062,10 @@ IF (has_cameras) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/as_camera/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.cameras.$(name).uuid + data_manager prep read + + block zzz/as_camera/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.cameras.$(name).uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -1038,10 +1094,13 @@ IF (has_cameras) { function as_root { #ARGS: {command: string} - debug assert executed_as_entity_with_root_uuid_data + execute unless score @s <%OBJECTIVES.ID()%> matches <%-(2**31)%>..<%(2**31)-1%> run return run \ + tellraw @a <%TELLRAW.FUNCTION_NOT_EXECUTED_AS_ENTITY_WITH_ID_SCORE(context.functions.at(-1))%> + + data_manager prep read $data modify storage <%temp_storage%> args.command set value '$(command)' - data modify storage <%temp_storage%> args.root_uuid set from entity @s data.root_uuid + data modify storage <%temp_storage%> args.root_uuid set from storage <%temp_storage%> entry.data.root_uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -1062,44 +1121,43 @@ function as_root { dir remove { function all { # Removes all instances of this rig from the world. - execute as @e[type=minecraft:item_display,tag=<%TAGS.PROJECT_ROOT(export_namespace)%>] run function *<%export_namespace%>/remove/this + execute as @e[type=minecraft:item_display,tag=<%TAGS.PROJECT_ROOT(blueprint_id)%>] run function <%blueprint_id%>/remove/this } function entities { # Removes all entities related to this rig from the world. - kill @e[tag=<%TAGS.PROJECT_ENTITY(export_namespace)%>] + kill @e[tag=<%TAGS.PROJECT_ENTITY(blueprint_id)%>] } function this { # Removes the rig this function is executed as. - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> <%% if (on_remove_function) emit.mcb(on_remove_function) %%> IF (has_entity_locators) { - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block as_data { - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - IF (locator.config?.on_remove_function) { - IF (locator.config.use_entity) { - block as_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> - $execute as $(uuid) at @s run block locator_<%locator.storage_name%>_on_remove { - <%% - emit.mcb(locator.config.on_remove_function) - %%> - } + data_manager prep read + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { + IF (locator.config?.on_remove_function) { + IF (locator.config.use_entity) { + block as_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + $execute as $(uuid) at @s run block locator_<%locator.storage_name%>_on_remove { + <%% + emit.mcb(locator.config.on_remove_function) + %%> } - } ELSE { - block at_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> - $execute \ - positioned ^$(px) ^$(py) ^$(pz) \ - rotated ~$(ry) ~$(rx) \ - run block locator_<%locator.storage_name%>_on_remove { - <%% - emit.mcb(locator.config.on_remove_function) - %%> - } + } + } ELSE { + block at_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + $execute \ + positioned ^$(px) ^$(py) ^$(pz) \ + rotated ~$(ry) ~$(rx) \ + run block locator_<%locator.storage_name%>_on_remove { + <%% + emit.mcb(locator.config.on_remove_function) + %%> } } } @@ -1112,27 +1170,30 @@ dir remove { dir this { function without_on_remove_function { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + data_manager prep read IF (has_entity_locators || has_cameras) { - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block as_data { - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - function animated_java:global/remove/entity_stack_by_uuid with entity @s data.locators.<%locator.storage_name%> - } - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - function animated_java:global/remove/entity_stack_by_uuid with entity @s data.cameras.<%camera.storage_name%> - } + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { + function animated_java:global/remove/entity_stack_by_uuid with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + } + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { + function animated_java:global/remove/entity_stack_by_uuid with storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> } } # Remove the rig using the more expensive & thorough method if the rig_hash doesn't match. execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - unless data entity @s {data:{rig_hash: '<%rig_hash%>'}} \ - on vehicle \ + unless data storage <%temp_storage%> {entry:{data:{rig_hash: '<%rig_hash%>'}}} \ run function animated_java:global/remove/outdated_rig + block { with storage <%temp_storage%> entry.data.uuids_by_name + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + $kill $(<%node.storage_name%>) + } + } + function animated_java:global/remove/entity_stack } } @@ -1143,7 +1204,7 @@ IF (Object.keys(rig.variants).length > 1) { REPEAT (Object.values(rig.variants)) as variant { dir <%variant.name%> { function apply { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> <%% global.filteredNodes = Object.values(rig.nodes).filter( @@ -1166,7 +1227,7 @@ IF (Object.keys(rig.variants).length > 1) { REPEAT (global.filteredNodes) as node { execute \ on passengers \ - if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ + if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ at @s \ run \ block zzz/apply_to_node_<%node.storage_name%> { @@ -1206,21 +1267,25 @@ IF (has_locators || has_cameras) { function reset_floating_entities { IF (has_locators) { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - execute \ - at @s \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/set_default_pose/as_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> - IF (locator.config?.use_entity) { + IF (locator.config?.use_entity) { + execute at @s run block set_default_pose/as_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> $tp $(uuid) \ ^<%roundTo(locator.default_transform.pos[0], 10)%> \ ^<%roundTo(locator.default_transform.pos[1], 10)%> \ ^<%roundTo(locator.default_transform.pos[2], 10)%> \ ~<%roundTo(locator.default_transform.head_rot[1], 10)%> \ ~<%roundTo(locator.default_transform.head_rot[0], 10)%> - } - data modify entity @s data.locators.<%locator.storage_name%> merge value { \ + data modify storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> merge value { \ + px: <%roundTo(locator.default_transform.pos[0], 10)%>, \ + py: <%roundTo(locator.default_transform.pos[1], 10)%>, \ + pz: <%roundTo(locator.default_transform.pos[2], 10)%>, \ + ry: <%roundTo(locator.default_transform.head_rot[1], 10)%>, \ + rx: <%roundTo(locator.default_transform.head_rot[0], 10)%> \ + } + } + } ELSE { + data modify storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> merge value { \ px: <%roundTo(locator.default_transform.pos[0], 10)%>, \ py: <%roundTo(locator.default_transform.pos[1], 10)%>, \ pz: <%roundTo(locator.default_transform.pos[2], 10)%>, \ @@ -1233,11 +1298,7 @@ IF (has_locators || has_cameras) { IF (has_cameras) { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - execute \ - at @s \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/set_default_pose/as_camera_<%camera.storage_name%> { with entity @s data.cameras.<%camera.storage_name%> + execute at @s run block set_default_pose/as_camera_<%camera.storage_name%> { with storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> $tp $(uuid) \ ^<%roundTo(camera.default_transform.pos[0], 10)%> \ ^<%roundTo(camera.default_transform.pos[1], 10)%> \ @@ -1245,7 +1306,7 @@ IF (has_locators || has_cameras) { ~<%roundTo(camera.default_transform.head_rot[1], 10)%> \ ~<%roundTo(camera.default_transform.head_rot[0], 10)%> - data modify entity @s data.cameras.<%camera.storage_name%> merge value { \ + data modify storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> merge value { \ px: <%roundTo(camera.default_transform.pos[0], 10)%>, \ py: <%roundTo(camera.default_transform.pos[1], 10)%>, \ pz: <%roundTo(camera.default_transform.pos[2], 10)%>, \ @@ -1259,42 +1320,58 @@ IF (has_locators || has_cameras) { } } +dir zzz { + function apply_default_pose { + IF (has_locators || has_cameras) { + function ../zzz/reset_floating_entities + } + + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + execute \ + on passengers \ + if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ + run \ + data merge entity @s { \ + transformation: <%matrixToNbtFloatArray(node.default_transform.matrix).toString()%>, \ + start_interpolation: 0 \ + } + } + } + + function set_default_pose { + IF (has_locators || has_cameras) { + function ../zzz/reset_floating_entities + } + + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + execute \ + on passengers \ + if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ + run \ + data merge entity @s { \ + transformation: <%matrixToNbtFloatArray(node.default_transform.matrix).toString()%>, \ + start_interpolation: -1 \ + } + } + } +} + function apply_default_pose { # Changes the pose of the rig to the the default pose with interpolation - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> IF (has_locators || has_cameras) { - function ./zzz/reset_floating_entities - } - - REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ - run \ - data merge entity @s { \ - transformation: <%matrixToNbtFloatArray(node.default_transform.matrix).toString()%>, \ - start_interpolation: 0 \ - } + data_manager prep read } + function ./zzz/apply_default_pose } function set_default_pose { # Changes the pose of the rig to the the default pose without interpolation - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> IF (has_locators || has_cameras) { - function ./zzz/reset_floating_entities + data_manager prep read } - - REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ - run \ - data merge entity @s { \ - transformation: <%matrixToNbtFloatArray(node.default_transform.matrix).toString()%>, \ - start_interpolation: -1 \ - } - } -} + function ./zzz/set_default_pose +} \ No newline at end of file diff --git a/src/systems/datapackCompiler/1.21.2/static.mcb b/src/systems/datapackCompiler/1.21.2/static.mcb index 9191855d..79b96d9b 100644 --- a/src/systems/datapackCompiler/1.21.2/static.mcb +++ b/src/systems/datapackCompiler/1.21.2/static.mcb @@ -1,17 +1,14 @@ # TODO - Move all internal functions into an internal namespace, and only have user-facing functions in the main `animated_java:<%export_namespace%>` namespace. -import ../global.mcbt + +# DIFFERENCES FROM 1.21.0: +# - /rotate command + function on_load { data modify storage <%project_storage%> rig_hash set value <%"'" + rig_hash + "'"%> } -function invalid_version_warning { - # This function will contain a tellraw if the datapack is loaded in the wrong version. -} - dir root { function on_tick { - execute unless entity @s[tag=<%TAGS.PROJECT_ROOT(export_namespace)%>] run return 0 - # Custom pre-tick function IF (on_pre_tick_function) { <%% @@ -21,17 +18,11 @@ dir root { IF (auto_update_rig_orientation) { IF (has_locators || has_cameras) { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run function ./on_tick/transform_floating_entities + function <%blueprint_id%>/root/on_tick/transform_floating_entities } execute on passengers run rotate @s ~ ~ } ELSE IF (has_ticking_locators) { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run function ./on_tick/transform_locators + function <%blueprint_id%>/root/on_tick/transform_locators } # Custom post-tick function @@ -46,7 +37,7 @@ dir root { dir on_tick { function transform_locators { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - block select_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> + block select_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> IF (locator.config?.use_entity) { $execute \ as $(uuid) \ @@ -83,7 +74,7 @@ dir root { function ./transform_locators REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - block select_camera_<%camera.storage_name%> { with entity @s data.cameras.<%camera.storage_name%> + block select_camera_<%camera.storage_name%> { with storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> $execute \ as $(uuid) \ positioned ^$(px) ^$(py) ^$(pz) \ @@ -98,15 +89,13 @@ dir root { IF (!auto_update_rig_orientation) { function move { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> tp @s ~ ~ ~ ~ ~ IF (has_locators || has_cameras) { - execute \ - at @s on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run function ./on_tick/transform_floating_entities + data_manager prep read + function <%blueprint_id%>/root/on_tick/transform_floating_entities } execute at @s on passengers run rotate @s ~ ~ } @@ -127,90 +116,111 @@ function summon { '<%TAGS.NEW()%>', \ '<%TAGS.GLOBAL_ENTITY()%>', \ '<%TAGS.GLOBAL_ROOT()%>', \ - '<%TAGS.PROJECT_ENTITY(export_namespace)%>', \ - '<%TAGS.PROJECT_ROOT(export_namespace)%>' \ + '<%TAGS.PROJECT_ENTITY(blueprint_id)%>', \ + '<%TAGS.PROJECT_ROOT(blueprint_id)%>' \ ], \ teleport_duration: 0, \ interpolation_duration: <%interpolation_duration%>, \ Passengers:<%root_entity_passengers%>, \ + CustomName: '<%ENTITY_NAMES.ROOT(blueprint_id)%>', \ } execute as @n[ \ type=minecraft:item_display, \ - tag=<%TAGS.PROJECT_ROOT(export_namespace)%>, \ + tag=<%TAGS.PROJECT_ROOT(blueprint_id)%>, \ tag=<%TAGS.NEW()%>, \ distance=..0.01 \ ] run block zzz/summon/as_root_entity { execute store result score @s <%OBJECTIVES.ID()%> run scoreboard players add aj.last_id <%OBJECTIVES.ID()%> 1 + + data_manager init prep read + # Data manager init runs gu:get_entity_uuid_string. So we don't need to call it again here. + # function animated_java:global/gu/get_entity_uuid_string + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.root_uuid set from storage <%gu_storage%> out + + data modify storage <%temp_storage%> entry.data.blueprint_id set value "<%blueprint_id%>" + data modify storage <%temp_storage%> entry.data.rig_hash set value "<%rig_hash%>" + # Align the position and rotation of the root with the command context. tp @s ~ ~ ~ ~ ~ - function *global/gu/get_entity_uuid_string - execute at @s on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block as_data_entity { - # Rig Root UUID - data modify entity @s data.uuids append from storage <%gu_storage%> out - # Data Entity UUID - function *global/gu/get_entity_uuid_string - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.data_data set from storage <%gu_storage%> out + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { + summon <%locator.config.entity_type%> \ + ^<%roundTo(locator.default_transform.pos[0], 10)%> \ + ^<%roundTo(locator.default_transform.pos[1], 10)%> \ + ^<%roundTo(locator.default_transform.pos[2], 10)%> \ + {Tags:<%getNodeTags(locator, rig)%>} + execute \ + as @n[ \ + type=<%locator.config.entity_type%>, \ + tag=<%TAGS.PROJECT_LOCATOR_NAMED(blueprint_id, locator.storage_name)%>, \ + tag=<%TAGS.NEW()%>, \ + distance=..<%Math.ceil(locator.max_distance)%> \ + ] \ + run block as_locator/<%locator.storage_name%> { + # run block ../as_locator/<%locator.storage_name%> { + tag @s remove <%TAGS.NEW()%> + data modify entity @s CustomName set value '<%ENTITY_NAMES.NODE(blueprint_id, locator.type, locator.storage_name)%>' + function animated_java:global/gu/get_entity_uuid_string + scoreboard players operation @s <%OBJECTIVES.ID()%> = aj.last_id <%OBJECTIVES.ID()%> + } + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids_by_name.<%locator.storage_name%> set from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.locators.<%locator.storage_name%>.uuid set from storage <%gu_storage%> out + } + + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { + summon minecraft:item_display \ + ^<%roundTo(camera.default_transform.pos[0], 10)%> \ + ^<%roundTo(camera.default_transform.pos[1], 10)%> \ + ^<%roundTo(camera.default_transform.pos[2], 10)%> \ + {Tags:<%getNodeTags(camera, rig)%>, teleport_duration: 2} + execute \ + as @n[ \ + type=minecraft:item_display, \ + tag=<%TAGS.PROJECT_CAMERA_NAMED(blueprint_id, camera.storage_name)%>, \ + tag=<%TAGS.NEW()%>, \ + distance=..<%Math.ceil(camera.max_distance)%> \ + ] \ + run block as_camera/<%camera.storage_name%> { + # run block ../as_camera/<%camera.storage_name%> { + tag @s remove <%TAGS.NEW()%> + data modify entity @s CustomName set value '<%ENTITY_NAMES.NODE(blueprint_id, camera.type, camera.storage_name)%>' + function animated_java:global/gu/get_entity_uuid_string + scoreboard players operation @s <%OBJECTIVES.ID()%> = aj.last_id <%OBJECTIVES.ID()%> + } + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids_by_name.<%camera.storage_name%> set from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%>.uuid set from storage <%gu_storage%> out + } + + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + execute \ + on passengers \ + if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ + run block as_node/<%node.storage_name%> { + data modify entity @s CustomName set value '<%ENTITY_NAMES.NODE(blueprint_id, node.type, node.storage_name)%>' + function animated_java:global/gu/get_entity_uuid_string + scoreboard players operation @s <%OBJECTIVES.ID()%> = aj.last_id <%OBJECTIVES.ID()%> + } + + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids_by_name.<%node.storage_name%> set from storage <%gu_storage%> out + } + IF (has_entity_locators) { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - summon <%locator.config.entity_type%> \ - ^<%roundTo(locator.default_transform.pos[0], 10)%> \ - ^<%roundTo(locator.default_transform.pos[1], 10)%> \ - ^<%roundTo(locator.default_transform.pos[2], 10)%> \ - {Tags:<%getNodeTags(locator, rig)%>} - execute \ - as @n[ \ - type=<%locator.config.entity_type%>, \ - tag=<%TAGS.PROJECT_LOCATOR_NAMED(export_namespace, locator.storage_name)%>, \ - tag=<%TAGS.NEW()%>, \ - distance=..<%Math.ceil(locator.max_distance)%> \ - ] \ - run block as_locator/<%locator.storage_name%> { - # run block ../as_locator/<%locator.storage_name%> { - tag @s remove <%TAGS.NEW()%> - function *global/gu/get_entity_uuid_string - } - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.<%locator.storage_name%> set from storage <%gu_storage%> out - data modify entity @s data.locators.<%locator.storage_name%>.uuid set from storage <%gu_storage%> out - } - - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - summon minecraft:item_display \ - ^<%roundTo(camera.default_transform.pos[0], 10)%> \ - ^<%roundTo(camera.default_transform.pos[1], 10)%> \ - ^<%roundTo(camera.default_transform.pos[2], 10)%> \ - {Tags:<%getNodeTags(camera, rig)%>, teleport_duration: 2} - execute \ - as @n[ \ - type=minecraft:item_display, \ - tag=<%TAGS.PROJECT_CAMERA_NAMED(export_namespace, camera.storage_name)%>, \ - tag=<%TAGS.NEW()%>, \ - distance=..<%Math.ceil(camera.max_distance)%> \ - ] \ - run block as_camera/<%camera.storage_name%> { - # run block ../as_camera/<%camera.storage_name%> { - tag @s remove <%TAGS.NEW()%> - function *global/gu/get_entity_uuid_string + block { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + # Track any custom entities on the locator. + $execute at @s as $(uuid) at @s run function animated_java:global/util/get_entity_stack_uuids } - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.<%camera.storage_name%> set from storage <%gu_storage%> out - data modify entity @s data.cameras.<%camera.storage_name%>.uuid set from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids append from storage <%temp_storage%> uuids } + } - REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { - execute \ - on vehicle \ - on passengers \ - if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ - run \ - function *global/gu/get_entity_uuid_string + function <%blueprint_id%>/zzz/set_default_pose - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.<%node.storage_name%> set from storage <%gu_storage%> out - } - } + data_manager write # Variant Arguement IF (Object.keys(rig.variants).length > 1) { @@ -220,12 +230,12 @@ function summon { execute if data storage <%temp_storage%> {args:{variant:''}} run return run block if_empty { # Tell the user that the variant cannot be empty. tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('variant')%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function } # Attempt to apply the requested variant. # We get the success of the `try_apply` function in just in case the user's arguments are *very* wrong. execute store success score #success <%OBJECTIVES.I()%> run block try_apply { with storage <%temp_storage%> args - $execute if function animated_java:<%export_namespace%>/variants/$(variant)/apply run return 1 + $execute if function <%blueprint_id%>/variants/$(variant)/apply run return 1 # If the apply function fails, the variant doesn't exist, so we return an error. return fail } @@ -233,25 +243,21 @@ function summon { execute unless score #success <%OBJECTIVES.I()%> matches 1 run return run block invalid_variant { # Tell the user that the provided variant doesn't exist, remove the rig, and list all available variants for this rig. tellraw @a <%TELLRAW.INVALID_VARIANT(rig.variants)%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function } scoreboard players set #success <%OBJECTIVES.I()%> 1 } } ELSE { execute if data storage <%temp_storage%> args.variant run block zzz/variant_arg/no_variants_warning { tellraw @a <%TELLRAW.NO_VARIANTS()%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function scoreboard players set #success <%OBJECTIVES.I()%> 0 } } execute if score #success <%OBJECTIVES.I()%> matches 0 run return fail - function *<%export_namespace%>/set_default_pose IF (has_locators || has_cameras) { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run function ./on_tick/transform_floating_entities + function <%blueprint_id%>/root/on_tick/transform_floating_entities } execute on passengers run rotate @s ~ ~ @@ -260,26 +266,21 @@ function summon { execute on passengers run data modify entity @s teleport_duration set value <%teleportation_duration%> IF (has_entity_locators) { - execute at @s on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block locators_on_summon { - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity && node.config.on_summon_function)) as locator { - block { with entity @s data.locators.<%locator.storage_name%> - $execute as $(uuid) at @s run block <%locator.storage_name%> { - <%% - emit.mcb(locator.config.on_summon_function) - %%> - # Track any custom entities on the locator. - function *global/util/get_entity_stack_uuids - } + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity && node.config.on_summon_function)) as locator { + block { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + $execute at @s as $(uuid) at @s run block on_summon/custom_<%locator.type + '_' + locator.storage_name%> { + <%% + emit.mcb(locator.config.on_summon_function) + %%> } - data modify entity @s data.uuids append from storage <%temp_storage%> uuids } } } REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type) && node.on_summon_function?.trim())) as node { execute \ - on passengers if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ - run block node_on_summon_<%node.storage_name%> { + on passengers if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ + run block on_summon/<%node.type + '_' + node.storage_name%> { <%% emit.mcb(node.on_summon_function.trim()) %%> @@ -287,7 +288,7 @@ function summon { } IF (on_summon_function) { - execute at @s run block rig_on_summon { + execute at @s run block on_summon/rig { <%% emit.mcb(on_summon_function) %%> @@ -302,7 +303,7 @@ function summon { function as_node { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -311,8 +312,10 @@ function as_node { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block zzz/as_node/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.uuids_by_name.$(name) + data_manager prep read + + block zzz/as_node/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.uuids_by_name.$(name) IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -336,7 +339,7 @@ function as_node { IF (has_entity_locators) { function as_locator { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -346,11 +349,10 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/as_locator/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.$(name).uuid + data_manager prep read + + block zzz/as_locator/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.$(name).uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -373,7 +375,7 @@ IF (has_entity_locators) { function as_at_locator { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -383,11 +385,10 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/as_locator/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.$(name).uuid + data_manager prep read + + block zzz/as_locator/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.$(name).uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -410,7 +411,7 @@ IF (has_entity_locators) { function as_all_locators { #ARGS: {command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {command:'$(command)'} @@ -419,9 +420,11 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block zzz/as_all_locators/as_data { + data_manager prep read + + block zzz/as_all_locators/as_data { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.<%locator.storage_name%>.uuid + data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.<%locator.storage_name%>.uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -445,7 +448,7 @@ IF (has_entity_locators) { function as_at_all_locators { #ARGS: {command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {command:'$(command)'} @@ -454,9 +457,11 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block zzz/as_all_locators/as_data { + data_manager prep read + + block zzz/as_all_locators/as_data { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.<%locator.storage_name%>.uuid + data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.<%locator.storage_name%>.uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -482,7 +487,7 @@ IF (has_entity_locators) { IF (has_locators) { function at_locator { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)'} @@ -492,15 +497,13 @@ IF (has_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute \ - at @s \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/at_locator/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args merge from entity @s data.locators.$(name) + data_manager prep read + + execute at @s run block zzz/at_locator/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args merge from storage <%temp_storage%> entry.data.locators.$(name) IF (debug_mode) { - execute unless data storage <%temp_storage%> args.uuid run return run tellraw @a <%TELLRAW.LOCATOR_NOT_FOUND()%> + execute unless data storage <%temp_storage%> args.px run return run tellraw @a <%TELLRAW.LOCATOR_NOT_FOUND()%> scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -524,7 +527,7 @@ IF (has_locators) { function at_all_locators { #ARGS: {command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {command:'$(command)'} @@ -533,9 +536,11 @@ IF (has_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute at @s on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block zzz/at_all_locators/as_data { + data_manager prep read + + block zzz/at_all_locators/as_data { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - data modify storage <%temp_storage%> args merge from entity @s data.locators.<%locator.storage_name%> + data modify storage <%temp_storage%> args merge from storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -564,7 +569,7 @@ IF (has_locators) { IF (has_cameras) { function as_camera { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -574,11 +579,10 @@ IF (has_cameras) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/as_camera/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.cameras.$(name).uuid + data_manager prep read + + block zzz/as_camera/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.cameras.$(name).uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -607,10 +611,13 @@ IF (has_cameras) { function as_root { #ARGS: {command: string} - debug assert executed_as_entity_with_root_uuid_data + execute unless score @s <%OBJECTIVES.ID()%> matches <%-(2**31)%>..<%(2**31)-1%> run return run \ + tellraw @a <%TELLRAW.FUNCTION_NOT_EXECUTED_AS_ENTITY_WITH_ID_SCORE(context.functions.at(-1))%> + + data_manager prep read $data modify storage <%temp_storage%> args.command set value '$(command)' - data modify storage <%temp_storage%> args.root_uuid set from entity @s data.root_uuid + data modify storage <%temp_storage%> args.root_uuid set from storage <%temp_storage%> entry.data.root_uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -631,44 +638,43 @@ function as_root { dir remove { function all { # Removes all instances of this rig from the world. - execute as @e[type=minecraft:item_display,tag=<%TAGS.PROJECT_ROOT(export_namespace)%>] run function *<%export_namespace%>/remove/this + execute as @e[type=minecraft:item_display,tag=<%TAGS.PROJECT_ROOT(blueprint_id)%>] run function <%blueprint_id%>/remove/this } function entities { # Removes all entities related to this rig from the world. - kill @e[tag=<%TAGS.PROJECT_ENTITY(export_namespace)%>] + kill @e[tag=<%TAGS.PROJECT_ENTITY(blueprint_id)%>] } function this { # Removes the rig this function is executed as. - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> <%% if (on_remove_function) emit.mcb(on_remove_function) %%> IF (has_entity_locators) { - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block as_data { - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - IF (locator.config?.on_remove_function) { - IF (locator.config.use_entity) { - block as_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> - $execute as $(uuid) at @s run block locator_<%locator.storage_name%>_on_remove { - <%% - emit.mcb(locator.config.on_remove_function) - %%> - } + data_manager prep read + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { + IF (locator.config?.on_remove_function) { + IF (locator.config.use_entity) { + block as_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + $execute as $(uuid) at @s run block locator_<%locator.storage_name%>_on_remove { + <%% + emit.mcb(locator.config.on_remove_function) + %%> } - } ELSE { - block at_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> - $execute \ - positioned ^$(px) ^$(py) ^$(pz) \ - rotated ~$(ry) ~$(rx) \ - run block locator_<%locator.storage_name%>_on_remove { - <%% - emit.mcb(locator.config.on_remove_function) - %%> - } + } + } ELSE { + block at_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + $execute \ + positioned ^$(px) ^$(py) ^$(pz) \ + rotated ~$(ry) ~$(rx) \ + run block locator_<%locator.storage_name%>_on_remove { + <%% + emit.mcb(locator.config.on_remove_function) + %%> } } } @@ -681,27 +687,30 @@ dir remove { dir this { function without_on_remove_function { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + data_manager prep read IF (has_entity_locators || has_cameras) { - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block as_data { - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - function animated_java:global/remove/entity_stack_by_uuid with entity @s data.locators.<%locator.storage_name%> - } - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - function animated_java:global/remove/entity_stack_by_uuid with entity @s data.cameras.<%camera.storage_name%> - } + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { + function animated_java:global/remove/entity_stack_by_uuid with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + } + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { + function animated_java:global/remove/entity_stack_by_uuid with storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> } } # Remove the rig using the more expensive & thorough method if the rig_hash doesn't match. execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - unless data entity @s {data:{rig_hash: '<%rig_hash%>'}} \ - on vehicle \ + unless data storage <%temp_storage%> {entry:{data:{rig_hash: '<%rig_hash%>'}}} \ run function animated_java:global/remove/outdated_rig + block { with storage <%temp_storage%> entry.data.uuids_by_name + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + $kill $(<%node.storage_name%>) + } + } + function animated_java:global/remove/entity_stack } } @@ -712,7 +721,7 @@ IF (Object.keys(rig.variants).length > 1) { REPEAT (Object.values(rig.variants)) as variant { dir <%variant.name%> { function apply { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> <%% global.filteredNodes = Object.values(rig.nodes).filter( @@ -735,7 +744,7 @@ IF (Object.keys(rig.variants).length > 1) { REPEAT (global.filteredNodes) as node { execute \ on passengers \ - if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ + if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ at @s \ run \ block zzz/apply_to_node_<%node.storage_name%> { @@ -775,21 +784,25 @@ IF (has_locators || has_cameras) { function reset_floating_entities { IF (has_locators) { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - execute \ - at @s \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/set_default_pose/as_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> - IF (locator.config?.use_entity) { + IF (locator.config?.use_entity) { + execute at @s run block set_default_pose/as_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> $tp $(uuid) \ ^<%roundTo(locator.default_transform.pos[0], 10)%> \ ^<%roundTo(locator.default_transform.pos[1], 10)%> \ ^<%roundTo(locator.default_transform.pos[2], 10)%> \ ~<%roundTo(locator.default_transform.head_rot[1], 10)%> \ ~<%roundTo(locator.default_transform.head_rot[0], 10)%> - } - data modify entity @s data.locators.<%locator.storage_name%> merge value { \ + data modify storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> merge value { \ + px: <%roundTo(locator.default_transform.pos[0], 10)%>, \ + py: <%roundTo(locator.default_transform.pos[1], 10)%>, \ + pz: <%roundTo(locator.default_transform.pos[2], 10)%>, \ + ry: <%roundTo(locator.default_transform.head_rot[1], 10)%>, \ + rx: <%roundTo(locator.default_transform.head_rot[0], 10)%> \ + } + } + } ELSE { + data modify storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> merge value { \ px: <%roundTo(locator.default_transform.pos[0], 10)%>, \ py: <%roundTo(locator.default_transform.pos[1], 10)%>, \ pz: <%roundTo(locator.default_transform.pos[2], 10)%>, \ @@ -802,11 +815,7 @@ IF (has_locators || has_cameras) { IF (has_cameras) { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - execute \ - at @s \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/set_default_pose/as_camera_<%camera.storage_name%> { with entity @s data.cameras.<%camera.storage_name%> + execute at @s run block set_default_pose/as_camera_<%camera.storage_name%> { with storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> $tp $(uuid) \ ^<%roundTo(camera.default_transform.pos[0], 10)%> \ ^<%roundTo(camera.default_transform.pos[1], 10)%> \ @@ -814,7 +823,7 @@ IF (has_locators || has_cameras) { ~<%roundTo(camera.default_transform.head_rot[1], 10)%> \ ~<%roundTo(camera.default_transform.head_rot[0], 10)%> - data modify entity @s data.cameras.<%camera.storage_name%> merge value { \ + data modify storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> merge value { \ px: <%roundTo(camera.default_transform.pos[0], 10)%>, \ py: <%roundTo(camera.default_transform.pos[1], 10)%>, \ pz: <%roundTo(camera.default_transform.pos[2], 10)%>, \ @@ -828,22 +837,31 @@ IF (has_locators || has_cameras) { } } +dir zzz { + function set_default_pose { + IF (has_locators || has_cameras) { + function ../zzz/reset_floating_entities + } + + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + execute \ + on passengers \ + if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ + run \ + data merge entity @s { \ + transformation: <%matrixToNbtFloatArray(node.default_transform.matrix).toString()%>, \ + start_interpolation: -1 \ + } + } + } +} + function set_default_pose { # Changes the pose of the rig to the the default pose without interpolation - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> IF (has_locators || has_cameras) { - function ./zzz/reset_floating_entities + data_manager prep read } - - REPEAT (Object.values(rig.nodes).filter(node => node.type !== 'locator' && node.type !== 'camera')) as node { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ - run \ - data merge entity @s { \ - transformation: <%matrixToNbtFloatArray(node.default_transform.matrix).toString()%>, \ - start_interpolation: -1 \ - } - } -} + function ./zzz/set_default_pose +} \ No newline at end of file diff --git a/src/systems/datapackCompiler/1.21.4/animation.mcb b/src/systems/datapackCompiler/1.21.4/animation.mcb index 6cde8fee..72e66cd2 100644 --- a/src/systems/datapackCompiler/1.21.4/animation.mcb +++ b/src/systems/datapackCompiler/1.21.4/animation.mcb @@ -1,5 +1,8 @@ # TODO - Move all internal functions into an internal namespace, and only have user-facing functions in the main `animated_java:<%export_namespace%>` namespace. -import ../global.mcbt + +# DIFFERENCES FROM 1.21.2: +# - node entities are no longer passengers of the root entity for smooth rotation fix. +# - minecraft:custom_model_data is now more powerful than minecraft:item_model: item.components."minecraft:item_model" -> item.components."minecraft:custom_model_data".strings[0] function on_load { data modify storage <%project_storage%> rig_hash set value <%"'" + rig_hash + "'"%> @@ -26,14 +29,8 @@ function remove_animation_objectives { tellraw @a <%TELLRAW.UNINSTALL()%> } -function invalid_version_warning { - # This function will contain a tellraw if the datapack is loaded in the wrong version. -} - dir root { function on_tick { - execute unless entity @s[tag=<%TAGS.PROJECT_ROOT(export_namespace)%>] run return 0 - # Custom pre-tick function IF (on_pre_tick_function) { <%% @@ -41,30 +38,34 @@ dir root { %%> } + # animated_java:global/root/on_tick already runs this right before calling this function. + # data_manager prep read + # Once we have more than 8 animations, calling a function only if at least one animation is playing is more efficient. IF (animations.length > 8) { # If no animations are playing, we can skip all animation logic. # This helps reduce ticking commands for rigs that are idle. execute \ - unless entity @s[<%animations.map(anim => 'tag=!' + TAGS.ANIMATION_PLAYING(export_namespace, anim.storage_name)).join(',')%>] \ + unless entity @s[<%animations.map(anim => 'tag=!' + TAGS.ANIMATION_PLAYING(blueprint_id, anim.storage_name)).join(',')%>] \ run block tick_animations { REPEAT (animations) as animation { - execute if entity @s[tag=<%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%>] run \ - function *<%export_namespace%>/animations/<%animation.storage_name%>/zzz/on_tick + execute if entity @s[tag=<%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%>] run \ + function <%blueprint_id%>/animations/<%animation.storage_name%>/zzz/on_tick } } } ELSE { REPEAT (animations) as animation { - execute if entity @s[tag=<%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%>] run \ - function *<%export_namespace%>/animations/<%animation.storage_name%>/zzz/on_tick + execute if entity @s[tag=<%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%>] run \ + function <%blueprint_id%>/animations/<%animation.storage_name%>/zzz/on_tick } } IF (auto_update_rig_orientation) { IF (has_locators || has_cameras) { - execute on passengers run function ./on_tick/transform_floating_entities + function <%blueprint_id%>/root/on_tick/transform_floating_entities } - execute on passengers run { with entity @s data.uuids_by_name + + block { with storage <%temp_storage%> entry.data.uuids_by_name REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { $tp $(<%node.storage_name%>) ~ ~ ~ ~ ~ # Precise Rotation Workaround. Fixes MC-272913. @@ -77,7 +78,7 @@ dir root { } } } ELSE IF (has_ticking_locators) { - execute on passengers run function ./on_tick/transform_locators + function <%blueprint_id%>/root/on_tick/transform_locators } # Custom post-tick function @@ -92,7 +93,7 @@ dir root { dir on_tick { function transform_locators { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - block select_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> + block select_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> IF (locator.config?.use_entity) { $execute \ as $(uuid) \ @@ -139,7 +140,7 @@ dir root { function ./transform_locators REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - block select_camera_<%camera.storage_name%> { with entity @s data.cameras.<%camera.storage_name%> + block select_camera_<%camera.storage_name%> { with storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> $execute \ as $(uuid) \ positioned ^$(px) ^$(py) ^$(pz) \ @@ -161,14 +162,16 @@ dir root { IF (!auto_update_rig_orientation) { function move { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> tp @s ~ ~ ~ ~ ~ - execute on passengers run { with entity @s data.uuids_by_name - IF (has_locators || has_cameras) { - function ./root/on_tick/transform_floating_entities - } + data_manager prep read + IF (has_locators || has_cameras) { + function <%blueprint_id%>/root/on_tick/transform_floating_entities + } + + block { with storage <%temp_storage%> entry.data.uuids_by_name REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { $tp $(<%node.storage_name%>) ~ ~ ~ ~ ~ # Precise Rotation Workaround. Fixes MC-272913. @@ -191,11 +194,11 @@ dir animations { REPEAT (animations) as animation { dir <%animation.storage_name%> { function play { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> - function *<%export_namespace%>/animations/pause_all + function <%blueprint_id%>/animations/pause_all - tag @s add <%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%> + tag @s add <%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%> scoreboard players set @s <%OBJECTIVES.FRAME(animation.storage_name)%> 0 tag @s add <%TAGS.TRANSFORMS_ONLY()%> execute at @s run function ./zzz/set_frame {frame: 0} @@ -203,9 +206,9 @@ dir animations { } function stop { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> - function *<%export_namespace%>/animations/pause_all + function <%blueprint_id%>/animations/pause_all scoreboard players set @s <%OBJECTIVES.FRAME(animation.storage_name)%> 0 tag @s add <%TAGS.TRANSFORMS_ONLY()%> @@ -214,19 +217,19 @@ dir animations { } function pause { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> - tag @s remove <%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%> + tag @s remove <%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%> } function resume { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> - tag @s add <%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%> + tag @s add <%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%> } function next_frame { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> execute if score @s <%OBJECTIVES.FRAME(animation.storage_name)%> matches <%animation.duration%>.. run scoreboard players set @s <%OBJECTIVES.FRAME(animation.storage_name)%> 1 data remove storage <%temp_storage%> args @@ -238,7 +241,9 @@ dir animations { function set_frame { # Sets the frame without interpolation #ARGS: {frame: int} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + data_manager prep read data remove storage <%temp_storage%> args $execute store result storage <%temp_storage%> args.frame int 1 run scoreboard players set @s <%OBJECTIVES.FRAME(animation.storage_name)%> $(frame) @@ -247,7 +252,9 @@ dir animations { function apply_frame { #ARGS: {frame: int} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + data_manager prep read data remove storage <%temp_storage%> args $execute store result storage <%temp_storage%> args.frame int 1 run scoreboard players set @s <%OBJECTIVES.FRAME(animation.storage_name)%> $(frame) @@ -257,11 +264,11 @@ dir animations { function tween { # Attempts to smoothly transition from the currently playing animation into this one. #ARGS: {duration: int, to_frame: int} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> - function *<%export_namespace%>/animations/pause_all + function <%blueprint_id%>/animations/pause_all - tag @s add <%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%> + tag @s add <%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%> $scoreboard players set @s <%OBJECTIVES.TWEEN_DURATION()%> $(duration) $scoreboard players set @s <%OBJECTIVES.FRAME(animation.storage_name)%> $(to_frame) @@ -271,7 +278,8 @@ dir animations { $execute at @s run function ./zzz/apply_frame {frame: $(to_frame)} tag @s remove <%TAGS.TRANSFORMS_ONLY()%> - execute on passengers run { with entity @s data.uuids_by_name + data_manager prep read + block { with storage <%temp_storage%> entry.data.uuids_by_name REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { $execute \ as $(<%node.storage_name%>) \ @@ -286,21 +294,19 @@ dir animations { # Tweening logic scoreboard players remove @s <%OBJECTIVES.TWEEN_DURATION()%> 1 execute if score @s <%OBJECTIVES.TWEEN_DURATION()%> matches 1.. run return 1 - execute \ - if score @s <%OBJECTIVES.TWEEN_DURATION()%> matches 0 \ - on passengers \ - run { with entity @s data.uuids_by_name - REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { - $data modify entity $(<%node.storage_name%>) interpolation_duration set value <%interpolation_duration%> + execute if score @s <%OBJECTIVES.TWEEN_DURATION()%> matches 0 run \ + block { with storage <%temp_storage%> entry.data.uuids_by_name + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + $data modify entity $(<%node.storage_name%>) interpolation_duration set value <%interpolation_duration%> + } } - } # Animation logic IF (animation.loop_mode === 'loop' && animation.loop_delay === 0) { # Makes sure function keyframes in the last frame of the animation are activated. execute if score @s <%OBJECTIVES.FRAME(animation.storage_name)%> matches -1 run \ block function_keyframe_loop_patch { - function ./apply_frame {frame: <%animation.duration-1%>} + function ./frames/last_frame_effects with storage <%temp_storage%> entry.data.uuids_by_name scoreboard players add @s <%OBJECTIVES.FRAME(animation.storage_name)%> 1 } } @@ -333,7 +339,7 @@ dir animations { tag @s add <%TAGS.TRANSFORMS_ONLY()%> execute at @s run function ./zzz/set_frame {frame: 0} tag @s remove <%TAGS.TRANSFORMS_ONLY()%> - tag @s remove <%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%> + tag @s remove <%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%> } } scoreboard players add @s <%OBJECTIVES.FRAME(animation.storage_name)%> 1 @@ -343,7 +349,7 @@ dir animations { function set_frame { #ARGS: {frame: int} $function ./apply_frame {frame: $(frame)} - execute on passengers run { with entity @s data.uuids_by_name + block { with storage <%temp_storage%> entry.data.uuids_by_name REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { $data modify entity $(<%node.storage_name%>) start_interpolation set value -1 } @@ -354,27 +360,25 @@ dir animations { function apply_frame { #ARGS: {frame: int} - execute on passengers run { with entity @s data.uuids_by_name + block { with storage <%temp_storage%> entry.data.uuids_by_name REPEAT (Object.values(animation.modified_nodes).sort(nodeSorter)) as node { IF (BONE_TYPES.includes(node.type)) { $data modify entity $(<%node.storage_name%>) {} merge from \ storage <%project_storage%>/animations <%animation.storage_name%>.$(frame).<%node.storage_name%> } ELSE IF (node.type === 'locator' || node.type === 'camera') { - $execute on passengers run \ - $data modify entity @s data.uuids_by_name.<%node.storage_name%> merge from \ - storage <%project_storage%>/animations <%animation.storage_name%>.$(frame).<%node.storage_name%> + $data modify storage <%temp_storage%> entry.data.uuids_by_name.<%node.storage_name%> merge from \ + storage <%project_storage%>/animations <%animation.storage_name%>.$(frame).<%node.storage_name%> } } } - IF (animation.frames.some(anim => anim.variant)) { $execute \ if data storage <%project_storage%>/animations <%animation.storage_name%>.$(frame).variant \ unless entity @s[tag=<%TAGS.TRANSFORMS_ONLY()%>] \ run { with storage <%project_storage%>/animations <%animation.storage_name%>.$(frame).variant #ARGS: {name: string, condition: string} - $execute $(condition)run function *<%export_namespace%>/variants/$(name)/apply + $execute $(condition)run function <%blueprint_id%>/variants/$(name)/apply } } @@ -384,10 +388,10 @@ dir animations { function set_frame { # Sets the frame without interpolation #ARGS: {frame: int} - $execute on passengers run \ - function ./frames/$(frame) with entity @s data.uuids_by_name - execute on passengers run { with entity @s data.uuids_by_name + $function ./frames/$(frame) with storage <%temp_storage%> entry.data.uuids_by_name + + block { with storage <%temp_storage%> entry.data.uuids_by_name REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { $data modify entity $(<%node.storage_name%>) start_interpolation set value -1 } @@ -398,14 +402,67 @@ dir animations { function apply_frame { #ARGS: {frame: int} - $execute on passengers run \ - function ./frames/$(frame) with entity @s data.uuids_by_name + + $function ./frames/$(frame) with storage <%temp_storage%> entry.data.uuids_by_name return 1 } # FIXME - %NEWLINE_PATCH% is a temporary solution to temporarily fix an MCB bug where extra newlines are being added to the output. dir frames { + <%% + global.frame = animation.frames.at(-1) + global.modified_effect_nodes = Object.values(animation.modified_nodes).filter( + node => node.type === 'locator' && global.frame.node_transforms[node.uuid] + ) + console.log(global.modified_effect_nodes) + %%> + IF(Object.keys(global.modified_effect_nodes).length > 0) { + function last_frame_effects { + REPEAT(global.modified_effect_nodes) as node { + <%% + global.transform = global.frame.node_transforms[node.uuid] + %%> + IF (node.config?.use_entity) { + $execute \ + as $(<%node.storage_name%>) \ + positioned \ + ^<%roundTo(global.transform.pos[0], 10)%> \ + ^<%roundTo(global.transform.pos[1], 10)%> \ + ^<%roundTo(global.transform.pos[2], 10)%> \ + rotated \ + ~<%roundTo(global.transform.head_rot[1], 10)%> \ + ~<%roundTo(global.transform.head_rot[0], 10)%> \ + <%global.transform.function_execute_condition ? global.transform.function_execute_condition + ' ' : ''%>run \ + function ./<%animation.duration%>_locator_<%node.storage_name%> + } ELSE { + execute \ + positioned \ + ^<%roundTo(global.transform.pos[0], 10)%> \ + ^<%roundTo(global.transform.pos[1], 10)%> \ + ^<%roundTo(global.transform.pos[2], 10)%> \ + rotated \ + ~<%roundTo(global.transform.head_rot[1], 10)%> \ + ~<%roundTo(global.transform.head_rot[0], 10)%> \ + <%global.transform.function_execute_condition ? global.transform.function_execute_condition + ' ' : ''%>run \ + function ./<%animation.duration%>_locator_<%node.storage_name%> + } + } + + IF (global.frame.variants?.length > 0) { + execute <%global.frame.variants_execute_condition ? global.frame.variants_execute_condition + ' ' : ''%>run \ + function <%blueprint_id%>/variants/<%global.frame.variants[0].name%>/apply + } + + IF (global.frame.function) { + execute <%global.frame.function_execute_condition ? global.frame.function_execute_condition + ' ' : ''%>run \ + block <%animation.duration%>_function_keyframe { + <%global.frame.function%> + } + } + } + } + <%% // A record of node uuid to INodeTransform. // Keeps track of the last time a bone was updated. @@ -464,7 +521,7 @@ dir animations { if (transform.function) { if (node.config?.use_entity) { frameFunc += - `\n$execute on vehicle unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] as $(${node.storage_name}) ` + `\n$execute unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] as $(${node.storage_name}) ` + `positioned ^${roundTo(transform.pos[0], 10)} ^${roundTo(transform.pos[1], 10)} ^${roundTo(transform.pos[2], 10)} ` + `rotated ~${roundTo(transform.head_rot[1], 10)} ~${roundTo(transform.head_rot[0], 10)} ` + `${transform.function_execute_condition ? transform.function_execute_condition + ' ' : ''}run ` @@ -474,7 +531,7 @@ dir animations { + `\n}` } else { frameFunc += - `\nexecute on vehicle unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] ` + `\nexecute unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] ` + `positioned ^${roundTo(transform.pos[0], 10)} ^${roundTo(transform.pos[1], 10)} ^${roundTo(transform.pos[2], 10)} ` + `rotated ~${roundTo(transform.head_rot[1], 10)} ~${roundTo(transform.head_rot[0], 10)} ` + `${transform.function_execute_condition ? transform.function_execute_condition + ' ' : ''}run ` @@ -503,9 +560,10 @@ dir animations { } if (Object.keys(to_merge.locators).length > 0 || Object.keys(to_merge.cameras).length > 0) { - frameFunc += `\ndata modify entity @s data merge value ${JSON.stringify(to_merge)}` + frameFunc += `\ndata modify storage <%temp_storage%> entry.data merge value ${JSON.stringify(to_merge)}` + frameFunc += `\ndata_manager write` if (!auto_update_rig_orientation) { - frameFunc += `\nfunction animated_java:${export_namespace}/root/on_tick/transform_floating_entities` + frameFunc += `\nfunction ${blueprint_id}/root/on_tick/transform_floating_entities` } hasFunction = true } @@ -516,14 +574,14 @@ dir animations { throw new Error(`Could not find Variant with uuid "${frame.variants[0]}" while generating frame "${frameIndex}" of animation "${animation.name}".`) } const execute_condition = frame.variants_execute_condition ? frame.variants_execute_condition + ' ' : '' - frameFunc += `\nexecute on vehicle unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] ${execute_condition}run function *${export_namespace}/variants/${variant.name}/apply` + frameFunc += `\nexecute unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] ${execute_condition}run function ${blueprint_id}/variants/${variant.name}/apply` ;hasFunction = true } // Root function keyframes. if (frame.function) { const execute_condition = frame.function_execute_condition ? frame.function_execute_condition + ' ' : '' - frameFunc += `\nexecute on vehicle unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] at @s ${execute_condition}run block ${frameIndex}_root_function%NEWLINE_PATCH%{\n${frame.function}\n}` + frameFunc += `\nexecute unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] at @s ${execute_condition}run block ${frameIndex}_root_function%NEWLINE_PATCH%{\n${frame.function}\n}` ;hasFunction = true } ;if (frameFunc.length > 0) { @@ -539,10 +597,10 @@ dir animations { } function pause_all { # Pauses all animations - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> REPEAT (animations) as animation { - tag @s remove <%TAGS.ANIMATION_PLAYING(export_namespace, animation.storage_name)%> + tag @s remove <%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%> } } } @@ -559,97 +617,112 @@ function summon { '<%TAGS.NEW()%>', \ '<%TAGS.GLOBAL_ENTITY()%>', \ '<%TAGS.GLOBAL_ROOT()%>', \ - '<%TAGS.PROJECT_ENTITY(export_namespace)%>', \ - '<%TAGS.PROJECT_ROOT(export_namespace)%>' \ + '<%TAGS.PROJECT_ENTITY(blueprint_id)%>', \ + '<%TAGS.PROJECT_ROOT(blueprint_id)%>' \ ], \ teleport_duration: 0, \ interpolation_duration: <%interpolation_duration%>, \ Passengers:<%root_entity_passengers%>, \ + CustomName: '<%ENTITY_NAMES.ROOT(blueprint_id)%>', \ } execute as @n[ \ type=minecraft:item_display, \ - tag=<%TAGS.PROJECT_ROOT(export_namespace)%>, \ + tag=<%TAGS.PROJECT_ROOT(blueprint_id)%>, \ tag=<%TAGS.NEW()%>, \ distance=..0.01 \ ] run block zzz/summon/as_root_entity { execute store result score @s <%OBJECTIVES.ID()%> run scoreboard players add aj.last_id <%OBJECTIVES.ID()%> 1 + + data_manager init prep read + # Data manager init runs gu:get_entity_uuid_string. So we don't need to call it again here. + # function animated_java:global/gu/get_entity_uuid_string + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.root_uuid set from storage <%gu_storage%> out + + data modify storage <%temp_storage%> entry.data.blueprint_id set value "<%blueprint_id%>" + data modify storage <%temp_storage%> entry.data.rig_hash set value "<%rig_hash%>" + # Align the position and rotation of the root with the command context. tp @s ~ ~ ~ ~ ~ - function *global/gu/get_entity_uuid_string - execute at @s on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block as_data_entity { - # Rig Root UUID - data modify storage <%temp_storage%> root_uuid set from storage <%gu_storage%> out - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.root_uuid set from storage <%gu_storage%> out - # Data Entity UUID - function *global/gu/get_entity_uuid_string - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.data_data set from storage <%gu_storage%> out + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { + summon <%locator.config.entity_type%> \ + ^<%roundTo(locator.default_transform.pos[0], 10)%> \ + ^<%roundTo(locator.default_transform.pos[1], 10)%> \ + ^<%roundTo(locator.default_transform.pos[2], 10)%> \ + {Tags:<%getNodeTags(locator, rig)%>} + execute \ + as @n[ \ + type=<%locator.config.entity_type%>, \ + tag=<%TAGS.PROJECT_LOCATOR_NAMED(blueprint_id, locator.storage_name)%>, \ + tag=<%TAGS.NEW()%>, \ + distance=..<%Math.ceil(locator.max_distance)%> \ + ] \ + run block as_locator/<%locator.storage_name%> { + # run block ../as_locator/<%locator.storage_name%> { + tag @s remove <%TAGS.NEW()%> + data modify entity @s CustomName set value '<%ENTITY_NAMES.NODE(blueprint_id, locator.type, locator.storage_name)%>' + function animated_java:global/gu/get_entity_uuid_string + scoreboard players operation @s <%OBJECTIVES.ID()%> = aj.last_id <%OBJECTIVES.ID()%> + } + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids_by_name.<%locator.storage_name%> set from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.locators.<%locator.storage_name%>.uuid set from storage <%gu_storage%> out + } - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - summon <%locator.config.entity_type%> \ - ^<%roundTo(locator.default_transform.pos[0], 10)%> \ - ^<%roundTo(locator.default_transform.pos[1], 10)%> \ - ^<%roundTo(locator.default_transform.pos[2], 10)%> \ - {Tags:<%getNodeTags(locator, rig)%>} - execute \ - as @n[ \ - type=<%locator.config.entity_type%>, \ - tag=<%TAGS.PROJECT_LOCATOR_NAMED(export_namespace, locator.storage_name)%>, \ - tag=<%TAGS.NEW()%>, \ - distance=..<%Math.ceil(locator.max_distance)%> \ - ] \ - run block as_locator/<%locator.storage_name%> { - # run block ../as_locator/<%locator.storage_name%> { - tag @s remove <%TAGS.NEW()%> - function *global/gu/get_entity_uuid_string - data modify entity @s data.root_uuid set from storage <%temp_storage%> root_uuid - } - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.<%locator.storage_name%> set from storage <%gu_storage%> out - data modify entity @s data.locators.<%locator.storage_name%>.uuid set from storage <%gu_storage%> out + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { + summon minecraft:item_display \ + ^<%roundTo(camera.default_transform.pos[0], 10)%> \ + ^<%roundTo(camera.default_transform.pos[1], 10)%> \ + ^<%roundTo(camera.default_transform.pos[2], 10)%> \ + {Tags:<%getNodeTags(camera, rig)%>, teleport_duration: 2} + execute \ + as @n[ \ + type=minecraft:item_display, \ + tag=<%TAGS.PROJECT_CAMERA_NAMED(blueprint_id, camera.storage_name)%>, \ + tag=<%TAGS.NEW()%>, \ + distance=..<%Math.ceil(camera.max_distance)%> \ + ] \ + run block as_camera/<%camera.storage_name%> { + # run block ../as_camera/<%camera.storage_name%> { + tag @s remove <%TAGS.NEW()%> + data modify entity @s CustomName set value '<%ENTITY_NAMES.NODE(blueprint_id, camera.type, camera.storage_name)%>' + function animated_java:global/gu/get_entity_uuid_string + scoreboard players operation @s <%OBJECTIVES.ID()%> = aj.last_id <%OBJECTIVES.ID()%> } + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids_by_name.<%camera.storage_name%> set from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%>.uuid set from storage <%gu_storage%> out + } - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - summon minecraft:item_display \ - ^<%roundTo(camera.default_transform.pos[0], 10)%> \ - ^<%roundTo(camera.default_transform.pos[1], 10)%> \ - ^<%roundTo(camera.default_transform.pos[2], 10)%> \ - {Tags:<%getNodeTags(camera, rig)%>, teleport_duration: 2} - execute \ - as @n[ \ - type=minecraft:item_display, \ - tag=<%TAGS.PROJECT_CAMERA_NAMED(export_namespace, camera.storage_name)%>, \ - tag=<%TAGS.NEW()%>, \ - distance=..<%Math.ceil(camera.max_distance)%> \ - ] \ - run block as_camera/<%camera.storage_name%> { - # run block ../as_camera/<%camera.storage_name%> { - tag @s remove <%TAGS.NEW()%> - function *global/gu/get_entity_uuid_string - data modify entity @s data.root_uuid set from storage <%temp_storage%> root_uuid - } - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.<%camera.storage_name%> set from storage <%gu_storage%> out - data modify entity @s data.cameras.<%camera.storage_name%>.uuid set from storage <%gu_storage%> out + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + execute \ + on passengers \ + if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ + run block as_node/<%node.storage_name%> { + data modify entity @s CustomName set value '<%ENTITY_NAMES.NODE(blueprint_id, node.type, node.storage_name)%>' + function animated_java:global/gu/get_entity_uuid_string + scoreboard players operation @s <%OBJECTIVES.ID()%> = aj.last_id <%OBJECTIVES.ID()%> } - REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { - execute \ - on vehicle \ - on passengers \ - if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ - run block as_node/<%node.storage_name%> { - function *global/gu/get_entity_uuid_string - data modify entity @s data.root_uuid set from storage <%temp_storage%> root_uuid - } + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids_by_name.<%node.storage_name%> set from storage <%gu_storage%> out + } - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.<%node.storage_name%> set from storage <%gu_storage%> out + IF (has_entity_locators) { + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { + block { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + # Track any custom entities on the locator. + $execute at @s as $(uuid) at @s run function animated_java:global/util/get_entity_stack_uuids + } + data modify storage <%temp_storage%> entry.data.uuids append from storage <%temp_storage%> uuids } } + function <%blueprint_id%>/zzz/set_default_pose + + data_manager write + # Variant Arguement IF (Object.keys(rig.variants).length > 1) { execute if data storage <%temp_storage%> args.variant run block variant_arg/process { with storage <%temp_storage%> args @@ -658,12 +731,12 @@ function summon { execute if data storage <%temp_storage%> {args:{variant:''}} run return run block if_empty { # Tell the user that the variant cannot be empty. tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('variant')%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function } # Attempt to apply the requested variant. # We get the success of the `try_apply` function in just in case the user's arguments are *very* wrong. execute store success score #success <%OBJECTIVES.I()%> run block try_apply { with storage <%temp_storage%> args - $execute if function animated_java:<%export_namespace%>/variants/$(variant)/apply run return 1 + $execute if function <%blueprint_id%>/variants/$(variant)/apply run return 1 # If the apply function fails, the variant doesn't exist, so we return an error. return fail } @@ -671,21 +744,19 @@ function summon { execute unless score #success <%OBJECTIVES.I()%> matches 1 run return run block invalid_variant { # Tell the user that the provided variant doesn't exist, remove the rig, and list all available variants for this rig. tellraw @a <%TELLRAW.INVALID_VARIANT(rig.variants)%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function } scoreboard players set #success <%OBJECTIVES.I()%> 1 } } ELSE { execute if data storage <%temp_storage%> args.variant run block zzz/variant_arg/no_variants_warning { tellraw @a <%TELLRAW.NO_VARIANTS()%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function scoreboard players set #success <%OBJECTIVES.I()%> 0 } } execute if score #success <%OBJECTIVES.I()%> matches 0 run return fail - function *<%export_namespace%>/set_default_pose - # Animation Argument # If the animation argument is provided, attempt to apply the animation. execute if data storage <%temp_storage%> args.animation run block animation_arg/process { with storage <%temp_storage%> args @@ -693,7 +764,7 @@ function summon { # If the animation argument is *explicitly* set to an empty string, return an error. execute if data storage <%temp_storage%> {args:{animation:''}} run return run block if_empty { tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('animation')%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function } # Automatically set the frame argument to 0 if the frame argument is not provided. # Takes advantage of `store result score` setting the score to 0 if the command fails. @@ -706,13 +777,13 @@ function summon { execute if score #frame <%OBJECTIVES.I()%> matches ..-1 run return run block no_negative { # Tell the user that the frame argument cannot be negative. tellraw @a <%TELLRAW.FRAME_CANNOT_BE_NEGATIVE()%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function } # Attempt to apply the animation frame. execute store success score #success <%OBJECTIVES.I()%> run block try_set_frame { with storage <%temp_storage%> args # Make sure we're only applying transforms when setting the summon pose. tag @s add <%TAGS.TRANSFORMS_ONLY()%> - $execute store success score #success <%OBJECTIVES.I()%> run function *<%export_namespace%>/animations/$(animation)/zzz/set_frame with storage <%temp_storage%> args + $execute store success score #success <%OBJECTIVES.I()%> run function <%blueprint_id%>/animations/$(animation)/zzz/set_frame with storage <%temp_storage%> args tag @s remove <%TAGS.TRANSFORMS_ONLY()%> execute if score #success <%OBJECTIVES.I()%> matches 1 run return 1 # If the set_frame function fails, the animation doesn't exist, so we return an error. @@ -722,22 +793,19 @@ function summon { execute unless score #success <%OBJECTIVES.I()%> matches 1 run return run block invalid_animation { # Tell the user that the provided animation doesn't exist, remove the rig, and list all available animations for this rig. tellraw @a <%TELLRAW.INVALID_ANIMATION(animations)%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function } # If the animation is successfully applied, and the start_animation argument is set to true, start the animation. execute if data storage <%temp_storage%> {args:{start_animation: true}} run block start_animation { with storage <%temp_storage%> args - $function *<%export_namespace%>/animations/$(animation)/resume + $function <%blueprint_id%>/animations/$(animation)/resume } scoreboard players set #success <%OBJECTIVES.I()%> 1 } execute if score #success <%OBJECTIVES.I()%> matches 0 run return fail IF (has_locators || has_cameras) { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run function ./on_tick/transform_floating_entities + function <%blueprint_id%>/root/on_tick/transform_floating_entities } execute on passengers run rotate @s ~ ~ @@ -746,26 +814,21 @@ function summon { execute on passengers run data modify entity @s teleport_duration set value <%teleportation_duration%> IF (has_entity_locators) { - execute at @s on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block locators_on_summon { - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity && node.config.on_summon_function)) as locator { - block { with entity @s data.locators.<%locator.storage_name%> - $execute as $(uuid) at @s run block <%locator.storage_name%> { - <%% - emit.mcb(locator.config.on_summon_function) - %%> - # Track any custom entities on the locator. - function *global/util/get_entity_stack_uuids - } + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity && node.config.on_summon_function)) as locator { + block { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + $execute at @s as $(uuid) at @s run block on_summon/custom_<%locator.type + '_' + locator.storage_name%> { + <%% + emit.mcb(locator.config.on_summon_function) + %%> } - data modify entity @s data.uuids append from storage <%temp_storage%> uuids } } } REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type) && node.on_summon_function?.trim())) as node { execute \ - on passengers if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ - run block node_on_summon_<%node.storage_name%> { + on passengers if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ + run block on_summon/<%node.type + '_' + node.storage_name%> { <%% emit.mcb(node.on_summon_function.trim()) %%> @@ -773,7 +836,7 @@ function summon { } IF (on_summon_function) { - execute at @s run block rig_on_summon { + execute at @s run block on_summon/rig { <%% emit.mcb(on_summon_function) %%> @@ -784,13 +847,13 @@ function summon { tag @s remove <%TAGS.NEW()%> execute on passengers run tag @s remove <%TAGS.NEW()%> # Dismount bone entities from the root entity. - execute on passengers unless entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run ride @s dismount + execute on passengers run ride @s dismount } } function as_node { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -799,8 +862,10 @@ function as_node { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute on passengers run block zzz/as_node/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.uuids_by_name.$(name) + data_manager prep read + + block zzz/as_node/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.uuids_by_name.$(name) IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -824,7 +889,7 @@ function as_node { IF (has_entity_locators) { function as_locator { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -834,8 +899,10 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute on passengers run block zzz/as_locator/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.$(name).uuid + data_manager prep read + + block zzz/as_locator/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.$(name).uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -858,7 +925,7 @@ IF (has_entity_locators) { function as_at_locator { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -868,8 +935,10 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute on passengers run block zzz/as_locator/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.$(name).uuid + data_manager prep read + + block zzz/as_locator/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.$(name).uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -892,7 +961,7 @@ IF (has_entity_locators) { function as_all_locators { #ARGS: {command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {command:'$(command)'} @@ -901,9 +970,11 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute on passengers run block zzz/as_all_locators/as_data { + data_manager prep read + + block zzz/as_all_locators/as_data { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.<%locator.storage_name%>.uuid + data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.<%locator.storage_name%>.uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -927,7 +998,7 @@ IF (has_entity_locators) { function as_at_all_locators { #ARGS: {command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {command:'$(command)'} @@ -936,9 +1007,11 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute on passengers run block zzz/as_all_locators/as_data { + data_manager prep read + + block zzz/as_all_locators/as_data { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.<%locator.storage_name%>.uuid + data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.<%locator.storage_name%>.uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -964,7 +1037,7 @@ IF (has_entity_locators) { IF (has_locators) { function at_locator { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)'} @@ -974,11 +1047,13 @@ IF (has_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute at @s on passengers run block zzz/at_locator/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args merge from entity @s data.locators.$(name) + data_manager prep read + + execute at @s run block zzz/at_locator/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args merge from storage <%temp_storage%> entry.data.locators.$(name) IF (debug_mode) { - execute unless data storage <%temp_storage%> args.uuid run return run tellraw @a <%TELLRAW.LOCATOR_NOT_FOUND()%> + execute unless data storage <%temp_storage%> args.px run return run tellraw @a <%TELLRAW.LOCATOR_NOT_FOUND()%> scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -1002,7 +1077,7 @@ IF (has_locators) { function at_all_locators { #ARGS: {command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {command:'$(command)'} @@ -1011,9 +1086,11 @@ IF (has_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute at @s on passengers run block zzz/at_all_locators/as_data { + data_manager prep read + + block zzz/at_all_locators/as_data { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - data modify storage <%temp_storage%> args merge from entity @s data.locators.<%locator.storage_name%> + data modify storage <%temp_storage%> args merge from storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -1042,7 +1119,7 @@ IF (has_locators) { IF (has_cameras) { function as_camera { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -1052,8 +1129,10 @@ IF (has_cameras) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute on passengers run block zzz/as_camera/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.cameras.$(name).uuid + data_manager prep read + + block zzz/as_camera/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.cameras.$(name).uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -1082,10 +1161,13 @@ IF (has_cameras) { function as_root { #ARGS: {command: string} - debug assert executed_as_entity_with_root_uuid_data + execute unless score @s <%OBJECTIVES.ID()%> matches <%-(2**31)%>..<%(2**31)-1%> run return run \ + tellraw @a <%TELLRAW.FUNCTION_NOT_EXECUTED_AS_ENTITY_WITH_ID_SCORE(context.functions.at(-1))%> + + data_manager prep read $data modify storage <%temp_storage%> args.command set value '$(command)' - data modify storage <%temp_storage%> args.root_uuid set from entity @s data.root_uuid + data modify storage <%temp_storage%> args.root_uuid set from storage <%temp_storage%> entry.data.root_uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -1106,44 +1188,43 @@ function as_root { dir remove { function all { # Removes all instances of this rig from the world. - execute as @e[type=minecraft:item_display,tag=<%TAGS.PROJECT_ROOT(export_namespace)%>] run function *<%export_namespace%>/remove/this + execute as @e[type=minecraft:item_display,tag=<%TAGS.PROJECT_ROOT(blueprint_id)%>] run function <%blueprint_id%>/remove/this } function entities { # Removes all entities related to this rig from the world. - kill @e[tag=<%TAGS.PROJECT_ENTITY(export_namespace)%>] + kill @e[tag=<%TAGS.PROJECT_ENTITY(blueprint_id)%>] } function this { # Removes the rig this function is executed as. - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> <%% if (on_remove_function) emit.mcb(on_remove_function) %%> IF (has_entity_locators) { - execute on passengers run block as_data { - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - IF (locator.config?.on_remove_function) { - IF (locator.config.use_entity) { - block as_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> - $execute as $(uuid) at @s run block locator_<%locator.storage_name%>_on_remove { - <%% - emit.mcb(locator.config.on_remove_function) - %%> - } + data_manager prep read + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { + IF (locator.config?.on_remove_function) { + IF (locator.config.use_entity) { + block as_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + $execute as $(uuid) at @s run block locator_<%locator.storage_name%>_on_remove { + <%% + emit.mcb(locator.config.on_remove_function) + %%> } - } ELSE { - block at_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> - $execute \ - positioned ^$(px) ^$(py) ^$(pz) \ - rotated ~$(ry) ~$(rx) \ - run block locator_<%locator.storage_name%>_on_remove { - <%% - emit.mcb(locator.config.on_remove_function) - %%> - } + } + } ELSE { + block at_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + $execute \ + positioned ^$(px) ^$(py) ^$(pz) \ + rotated ~$(ry) ~$(rx) \ + run block locator_<%locator.storage_name%>_on_remove { + <%% + emit.mcb(locator.config.on_remove_function) + %%> } } } @@ -1156,27 +1237,25 @@ dir remove { dir this { function without_on_remove_function { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + data_manager prep read IF (has_entity_locators || has_cameras) { - execute on passengers run block as_data { - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - function animated_java:global/remove/entity_stack_by_uuid with entity @s data.locators.<%locator.storage_name%> - } - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - function animated_java:global/remove/entity_stack_by_uuid with entity @s data.cameras.<%camera.storage_name%> - } + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { + function animated_java:global/remove/entity_stack_by_uuid with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + } + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { + function animated_java:global/remove/entity_stack_by_uuid with storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> } } # Remove the rig using the more expensive & thorough method if the rig_hash doesn't match. execute \ - on passengers \ - unless data entity @s {data:{rig_hash: '<%rig_hash%>'}} \ - on vehicle \ + unless data storage <%temp_storage%> {entry:{data:{rig_hash: '<%rig_hash%>'}}} \ run function animated_java:global/remove/outdated_rig - execute on passengers run { with entity @s data.uuids_by_name + block { with storage <%temp_storage%> entry.data.uuids_by_name REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { $kill $(<%node.storage_name%>) } @@ -1192,7 +1271,7 @@ IF (Object.keys(rig.variants).length > 1) { REPEAT (Object.values(rig.variants)) as variant { dir <%variant.name%> { function apply { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> <%% global.filteredNodes = Object.values(rig.nodes).filter( @@ -1212,7 +1291,8 @@ IF (Object.keys(rig.variants).length > 1) { ) %%> - execute on passengers run { with entity @s data.uuids_by_name + data_manager prep read + block { with storage <%temp_storage%> entry.data.uuids_by_name REPEAT (global.filteredNodes) as node { $execute as $(<%node.storage_name%>) run block zzz/apply_to_node_<%node.storage_name%> { IF (node.type === 'bone' && variant.models[node.uuid] !== undefined) { @@ -1253,20 +1333,25 @@ IF (has_locators || has_cameras) { function reset_floating_entities { IF (has_locators) { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - execute \ - at @s \ - on passengers \ - run block zzz/set_default_pose/as_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> - IF (locator.config?.use_entity) { + IF (locator.config?.use_entity) { + execute at @s run block set_default_pose/as_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> $tp $(uuid) \ ^<%roundTo(locator.default_transform.pos[0], 10)%> \ ^<%roundTo(locator.default_transform.pos[1], 10)%> \ ^<%roundTo(locator.default_transform.pos[2], 10)%> \ ~<%roundTo(locator.default_transform.head_rot[1], 10)%> \ ~<%roundTo(locator.default_transform.head_rot[0], 10)%> - } - data modify entity @s data.locators.<%locator.storage_name%> merge value { \ + data modify storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> merge value { \ + px: <%roundTo(locator.default_transform.pos[0], 10)%>, \ + py: <%roundTo(locator.default_transform.pos[1], 10)%>, \ + pz: <%roundTo(locator.default_transform.pos[2], 10)%>, \ + ry: <%roundTo(locator.default_transform.head_rot[1], 10)%>, \ + rx: <%roundTo(locator.default_transform.head_rot[0], 10)%> \ + } + } + } ELSE { + data modify storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> merge value { \ px: <%roundTo(locator.default_transform.pos[0], 10)%>, \ py: <%roundTo(locator.default_transform.pos[1], 10)%>, \ pz: <%roundTo(locator.default_transform.pos[2], 10)%>, \ @@ -1279,10 +1364,7 @@ IF (has_locators || has_cameras) { IF (has_cameras) { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - execute \ - at @s \ - on passengers \ - run block zzz/set_default_pose/as_camera_<%camera.storage_name%> { with entity @s data.cameras.<%camera.storage_name%> + execute at @s run block set_default_pose/as_camera_<%camera.storage_name%> { with storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> $tp $(uuid) \ ^<%roundTo(camera.default_transform.pos[0], 10)%> \ ^<%roundTo(camera.default_transform.pos[1], 10)%> \ @@ -1290,7 +1372,7 @@ IF (has_locators || has_cameras) { ~<%roundTo(camera.default_transform.head_rot[1], 10)%> \ ~<%roundTo(camera.default_transform.head_rot[0], 10)%> - data modify entity @s data.cameras.<%camera.storage_name%> merge value { \ + data modify storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> merge value { \ px: <%roundTo(camera.default_transform.pos[0], 10)%>, \ py: <%roundTo(camera.default_transform.pos[1], 10)%>, \ pz: <%roundTo(camera.default_transform.pos[2], 10)%>, \ @@ -1304,38 +1386,53 @@ IF (has_locators || has_cameras) { } } -function apply_default_pose { - # Changes the pose of the rig to the the default pose with interpolation - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> +dir zzz { + function apply_default_pose { + IF (has_locators || has_cameras) { + function ../zzz/reset_floating_entities + } - IF (has_locators || has_cameras) { - function ./zzz/reset_floating_entities + block apply_default_pose_to_nodes { with storage <%temp_storage%> entry.data.uuids_by_name + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + $data merge entity $(<%node.storage_name%>) { \ + transformation: <%matrixToNbtFloatArray(node.default_transform.matrix).toString()%>, \ + start_interpolation: 0 \ + } + } + } } - execute on passengers run { with entity @s data.uuids_by_name - REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { - $data merge entity $(<%node.storage_name%>) { \ - transformation: <%matrixToNbtFloatArray(node.default_transform.matrix).toString()%>, \ - start_interpolation: 0 \ + function set_default_pose { + IF (has_locators || has_cameras) { + function ../zzz/reset_floating_entities + } + + block set_default_pose_to_nodes { with storage <%temp_storage%> entry.data.uuids_by_name + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + $data merge entity $(<%node.storage_name%>) { \ + transformation: <%matrixToNbtFloatArray(node.default_transform.matrix).toString()%>, \ + start_interpolation: -1 \ + } } } } } +function apply_default_pose { + # Changes the pose of the rig to the the default pose with interpolation + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + IF (has_locators || has_cameras) { + data_manager prep read + } + function ./zzz/apply_default_pose +} function set_default_pose { # Changes the pose of the rig to the the default pose without interpolation - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> IF (has_locators || has_cameras) { - function ./zzz/reset_floating_entities + data_manager prep read } - - execute on passengers run { with entity @s data.uuids_by_name - REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { - $data merge entity $(<%node.storage_name%>) { \ - transformation: <%matrixToNbtFloatArray(node.default_transform.matrix).toString()%>, \ - start_interpolation: -1 \ - } - } - } -} + function ./zzz/set_default_pose +} \ No newline at end of file diff --git a/src/systems/datapackCompiler/1.21.4/static.mcb b/src/systems/datapackCompiler/1.21.4/static.mcb index c70a65a3..1af994f6 100644 --- a/src/systems/datapackCompiler/1.21.4/static.mcb +++ b/src/systems/datapackCompiler/1.21.4/static.mcb @@ -1,5 +1,9 @@ -# TODO - Move all internal functions into an internal namespace, and only have user-facing functions in the main `animated_java:<%export_namespace%>` namespace. -import ../global.mcbt +# TODO - Move all internal functions into an internal namespace, and only have user-facing functions in the main `<%blueprint_id%>` namespace. + +# DIFFERENCES FROM 1.21.2: +# - node entities are no longer passengers of the root entity for smooth rotation fix. +# - minecraft:custom_model_data is now more powerful than minecraft:item_model: item.components."minecraft:item_model" -> item.components."minecraft:custom_model_data".strings[0] + function on_load { data modify storage <%project_storage%> rig_hash set value <%"'" + rig_hash + "'"%> } @@ -10,8 +14,6 @@ function invalid_version_warning { dir root { function on_tick { - execute unless entity @s[tag=<%TAGS.PROJECT_ROOT(export_namespace)%>] run return 0 - # Custom pre-tick function IF (on_pre_tick_function) { <%% @@ -21,17 +23,23 @@ dir root { IF (auto_update_rig_orientation) { IF (has_locators || has_cameras) { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run function ./on_tick/transform_floating_entities + function <%blueprint_id%>/root/on_tick/transform_floating_entities + } + + block { with storage <%temp_storage%> entry.data.uuids_by_name + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + $tp $(<%node.storage_name%>) ~ ~ ~ ~ ~ + # Precise Rotation Workaround. Fixes MC-272913. + # Thanks @Triton365! (https://discord.com/channels/154777837382008833/157097006500806656/1402253905408163842) + $execute \ + as $(<%node.storage_name%>) \ + store success entity @s OnGround byte 1 \ + store success score @s <%OBJECTIVES.I()%> \ + unless score @s <%OBJECTIVES.I()%> matches 1 + } } - execute on passengers run rotate @s ~ ~ } ELSE IF (has_ticking_locators) { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run function ./on_tick/transform_locators + function <%blueprint_id%>/root/on_tick/transform_locators } # Custom post-tick function @@ -46,7 +54,7 @@ dir root { dir on_tick { function transform_locators { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - block select_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> + block select_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> IF (locator.config?.use_entity) { $execute \ as $(uuid) \ @@ -65,6 +73,16 @@ dir root { %%> } } + + IF (locator.config?.sync_passenger_rotation) { + # Precise Rotation Workaround. Fixes MC-272913. + # Thanks @Triton365! (https://discord.com/channels/154777837382008833/157097006500806656/1402253905408163842) + $execute \ + as $(uuid) \ + store success entity @s OnGround byte 1 \ + store success score @s <%OBJECTIVES.I()%> \ + unless score @s <%OBJECTIVES.I()%> matches 1 + } } ELSE IF (locator.config?.on_tick_function) { $execute \ positioned ^$(px) ^$(py) ^$(pz) \ @@ -83,12 +101,19 @@ dir root { function ./transform_locators REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - block select_camera_<%camera.storage_name%> { with entity @s data.cameras.<%camera.storage_name%> + block select_camera_<%camera.storage_name%> { with storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> $execute \ as $(uuid) \ positioned ^$(px) ^$(py) ^$(pz) \ rotated ~$(ry) ~$(rx) \ run tp @s ~ ~ ~ ~ ~ + # Precise Rotation Workaround. Fixes MC-272913. + # Thanks @Triton365! (https://discord.com/channels/154777837382008833/157097006500806656/1402253905408163842) + $execute \ + as $(uuid) \ + store success entity @s OnGround byte 1 \ + store success score @s <%OBJECTIVES.I()%> \ + unless score @s <%OBJECTIVES.I()%> matches 1 } } } @@ -98,17 +123,27 @@ dir root { IF (!auto_update_rig_orientation) { function move { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> tp @s ~ ~ ~ ~ ~ + data_manager prep read IF (has_locators || has_cameras) { - execute \ - at @s on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run function ./on_tick/transform_floating_entities + function <%blueprint_id%>/root/on_tick/transform_floating_entities + } + + block { with storage <%temp_storage%> entry.data.uuids_by_name + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + $tp $(<%node.storage_name%>) ~ ~ ~ ~ ~ + # Precise Rotation Workaround. Fixes MC-272913. + # Thanks @Triton365! (https://discord.com/channels/154777837382008833/157097006500806656/1402253905408163842) + $execute \ + as $(<%node.storage_name%>) \ + store success entity @s OnGround byte 1 \ + store success score @s <%OBJECTIVES.I()%> \ + unless score @s <%OBJECTIVES.I()%> matches 1 + } } - execute at @s on passengers run rotate @s ~ ~ } } ELSE { function move { @@ -127,91 +162,112 @@ function summon { '<%TAGS.NEW()%>', \ '<%TAGS.GLOBAL_ENTITY()%>', \ '<%TAGS.GLOBAL_ROOT()%>', \ - '<%TAGS.PROJECT_ENTITY(export_namespace)%>', \ - '<%TAGS.PROJECT_ROOT(export_namespace)%>' \ + '<%TAGS.PROJECT_ENTITY(blueprint_id)%>', \ + '<%TAGS.PROJECT_ROOT(blueprint_id)%>' \ ], \ teleport_duration: 0, \ interpolation_duration: <%interpolation_duration%>, \ Passengers:<%root_entity_passengers%>, \ + CustomName: '<%ENTITY_NAMES.ROOT(blueprint_id)%>', \ } execute as @n[ \ type=minecraft:item_display, \ - tag=<%TAGS.PROJECT_ROOT(export_namespace)%>, \ + tag=<%TAGS.PROJECT_ROOT(blueprint_id)%>, \ tag=<%TAGS.NEW()%>, \ distance=..0.01 \ ] run block zzz/summon/as_root_entity { execute store result score @s <%OBJECTIVES.ID()%> run scoreboard players add aj.last_id <%OBJECTIVES.ID()%> 1 + + data_manager init prep read + # Data manager init runs gu:get_entity_uuid_string. So we don't need to call it again here. + # function animated_java:global/gu/get_entity_uuid_string + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.root_uuid set from storage <%gu_storage%> out + + data modify storage <%temp_storage%> entry.data.blueprint_id set value "<%blueprint_id%>" + data modify storage <%temp_storage%> entry.data.rig_hash set value "<%rig_hash%>" + # Align the position and rotation of the root with the command context. tp @s ~ ~ ~ ~ ~ - function *global/gu/get_entity_uuid_string - execute at @s on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block as_data_entity { - # Rig Root UUID - data modify entity @s data.uuids append from storage <%gu_storage%> out - # Data Entity UUID - function *global/gu/get_entity_uuid_string - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.data_data set from storage <%gu_storage%> out - - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - summon <%locator.config.entity_type%> \ - ^<%roundTo(locator.default_transform.pos[0], 10)%> \ - ^<%roundTo(locator.default_transform.pos[1], 10)%> \ - ^<%roundTo(locator.default_transform.pos[2], 10)%> \ - {Tags:<%getNodeTags(locator, rig)%>} - execute \ - as @n[ \ - type=<%locator.config.entity_type%>, \ - tag=<%TAGS.PROJECT_LOCATOR_NAMED(export_namespace, locator.storage_name)%>, \ - tag=<%TAGS.NEW()%>, \ - distance=..<%Math.ceil(locator.max_distance)%> \ - ] \ - run block as_locator/<%locator.storage_name%> { - # run block ../as_locator/<%locator.storage_name%> { - tag @s remove <%TAGS.NEW()%> - function *global/gu/get_entity_uuid_string - } - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.<%locator.storage_name%> set from storage <%gu_storage%> out - data modify entity @s data.locators.<%locator.storage_name%>.uuid set from storage <%gu_storage%> out - } - - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - summon minecraft:item_display \ - ^<%roundTo(camera.default_transform.pos[0], 10)%> \ - ^<%roundTo(camera.default_transform.pos[1], 10)%> \ - ^<%roundTo(camera.default_transform.pos[2], 10)%> \ - {Tags:<%getNodeTags(camera, rig)%>, teleport_duration: 2} - execute \ - as @n[ \ - type=minecraft:item_display, \ - tag=<%TAGS.PROJECT_CAMERA_NAMED(export_namespace, camera.storage_name)%>, \ - tag=<%TAGS.NEW()%>, \ - distance=..<%Math.ceil(camera.max_distance)%> \ - ] \ - run block as_camera/<%camera.storage_name%> { - # run block ../as_camera/<%camera.storage_name%> { - tag @s remove <%TAGS.NEW()%> - function *global/gu/get_entity_uuid_string - } - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.<%camera.storage_name%> set from storage <%gu_storage%> out - data modify entity @s data.cameras.<%camera.storage_name%>.uuid set from storage <%gu_storage%> out + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { + summon <%locator.config.entity_type%> \ + ^<%roundTo(locator.default_transform.pos[0], 10)%> \ + ^<%roundTo(locator.default_transform.pos[1], 10)%> \ + ^<%roundTo(locator.default_transform.pos[2], 10)%> \ + {Tags:<%getNodeTags(locator, rig)%>} + execute \ + as @n[ \ + type=<%locator.config.entity_type%>, \ + tag=<%TAGS.PROJECT_LOCATOR_NAMED(blueprint_id, locator.storage_name)%>, \ + tag=<%TAGS.NEW()%>, \ + distance=..<%Math.ceil(locator.max_distance)%> \ + ] \ + run block as_locator/<%locator.storage_name%> { + # run block ../as_locator/<%locator.storage_name%> { + tag @s remove <%TAGS.NEW()%> + data modify entity @s CustomName set value '<%ENTITY_NAMES.NODE(blueprint_id, locator.type, locator.storage_name)%>' + function animated_java:global/gu/get_entity_uuid_string + scoreboard players operation @s <%OBJECTIVES.ID()%> = aj.last_id <%OBJECTIVES.ID()%> + } + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids_by_name.<%locator.storage_name%> set from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.locators.<%locator.storage_name%>.uuid set from storage <%gu_storage%> out + } + + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { + summon minecraft:item_display \ + ^<%roundTo(camera.default_transform.pos[0], 10)%> \ + ^<%roundTo(camera.default_transform.pos[1], 10)%> \ + ^<%roundTo(camera.default_transform.pos[2], 10)%> \ + {Tags:<%getNodeTags(camera, rig)%>, teleport_duration: 2} + execute \ + as @n[ \ + type=minecraft:item_display, \ + tag=<%TAGS.PROJECT_CAMERA_NAMED(blueprint_id, camera.storage_name)%>, \ + tag=<%TAGS.NEW()%>, \ + distance=..<%Math.ceil(camera.max_distance)%> \ + ] \ + run block as_camera/<%camera.storage_name%> { + # run block ../as_camera/<%camera.storage_name%> { + tag @s remove <%TAGS.NEW()%> + data modify entity @s CustomName set value '<%ENTITY_NAMES.NODE(blueprint_id, camera.type, camera.storage_name)%>' + function animated_java:global/gu/get_entity_uuid_string + scoreboard players operation @s <%OBJECTIVES.ID()%> = aj.last_id <%OBJECTIVES.ID()%> + } + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids_by_name.<%camera.storage_name%> set from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%>.uuid set from storage <%gu_storage%> out + } + + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + execute \ + on passengers \ + if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ + run block as_node/<%node.storage_name%> { + data modify entity @s CustomName set value '<%ENTITY_NAMES.NODE(blueprint_id, node.type, node.storage_name)%>' + function animated_java:global/gu/get_entity_uuid_string + scoreboard players operation @s <%OBJECTIVES.ID()%> = aj.last_id <%OBJECTIVES.ID()%> } - REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { - execute \ - on vehicle \ - on passengers \ - if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ - run \ - function *global/gu/get_entity_uuid_string + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids_by_name.<%node.storage_name%> set from storage <%gu_storage%> out + } - data modify entity @s data.uuids append from storage <%gu_storage%> out - data modify entity @s data.uuids_by_name.<%node.storage_name%> set from storage <%gu_storage%> out + IF (has_entity_locators) { + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { + block { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + # Track any custom entities on the locator. + $execute at @s as $(uuid) at @s run function animated_java:global/util/get_entity_stack_uuids + } + data modify storage <%temp_storage%> entry.data.uuids append from storage <%temp_storage%> uuids } } + function <%blueprint_id%>/zzz/set_default_pose + + data_manager write + # Variant Arguement IF (Object.keys(rig.variants).length > 1) { execute if data storage <%temp_storage%> args.variant run block variant_arg/process { with storage <%temp_storage%> args @@ -220,12 +276,12 @@ function summon { execute if data storage <%temp_storage%> {args:{variant:''}} run return run block if_empty { # Tell the user that the variant cannot be empty. tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('variant')%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function } # Attempt to apply the requested variant. # We get the success of the `try_apply` function in just in case the user's arguments are *very* wrong. execute store success score #success <%OBJECTIVES.I()%> run block try_apply { with storage <%temp_storage%> args - $execute if function animated_java:<%export_namespace%>/variants/$(variant)/apply run return 1 + $execute if function <%blueprint_id%>/variants/$(variant)/apply run return 1 # If the apply function fails, the variant doesn't exist, so we return an error. return fail } @@ -233,25 +289,21 @@ function summon { execute unless score #success <%OBJECTIVES.I()%> matches 1 run return run block invalid_variant { # Tell the user that the provided variant doesn't exist, remove the rig, and list all available variants for this rig. tellraw @a <%TELLRAW.INVALID_VARIANT(rig.variants)%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function } scoreboard players set #success <%OBJECTIVES.I()%> 1 } } ELSE { execute if data storage <%temp_storage%> args.variant run block zzz/variant_arg/no_variants_warning { tellraw @a <%TELLRAW.NO_VARIANTS()%> - function *<%export_namespace%>/remove/this/without_on_remove_function + function <%blueprint_id%>/remove/this/without_on_remove_function scoreboard players set #success <%OBJECTIVES.I()%> 0 } } execute if score #success <%OBJECTIVES.I()%> matches 0 run return fail - function *<%export_namespace%>/set_default_pose IF (has_locators || has_cameras) { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run function ./on_tick/transform_floating_entities + function <%blueprint_id%>/root/on_tick/transform_floating_entities } execute on passengers run rotate @s ~ ~ @@ -260,26 +312,21 @@ function summon { execute on passengers run data modify entity @s teleport_duration set value <%teleportation_duration%> IF (has_entity_locators) { - execute at @s on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block locators_on_summon { - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity && node.config.on_summon_function)) as locator { - block { with entity @s data.locators.<%locator.storage_name%> - $execute as $(uuid) at @s run block <%locator.storage_name%> { - <%% - emit.mcb(locator.config.on_summon_function) - %%> - # Track any custom entities on the locator. - function *global/util/get_entity_stack_uuids - } + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity && node.config.on_summon_function)) as locator { + block { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + $execute at @s as $(uuid) at @s run block on_summon/custom_<%locator.type + '_' + locator.storage_name%> { + <%% + emit.mcb(locator.config.on_summon_function) + %%> } - data modify entity @s data.uuids append from storage <%temp_storage%> uuids } } } REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type) && node.on_summon_function?.trim())) as node { execute \ - on passengers if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ - run block node_on_summon_<%node.storage_name%> { + on passengers if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ + run block on_summon/<%node.type + '_' + node.storage_name%> { <%% emit.mcb(node.on_summon_function.trim()) %%> @@ -287,7 +334,7 @@ function summon { } IF (on_summon_function) { - execute at @s run block rig_on_summon { + execute at @s run block on_summon/rig { <%% emit.mcb(on_summon_function) %%> @@ -297,12 +344,14 @@ function summon { # Remove the NEW tag from the root entity, and it's passengers. tag @s remove <%TAGS.NEW()%> execute on passengers run tag @s remove <%TAGS.NEW()%> + # Dismount bone entities from the root entity. + execute on passengers run ride @s dismount } } function as_node { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -311,8 +360,10 @@ function as_node { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block zzz/as_node/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.uuids_by_name.$(name) + data_manager prep read + + block zzz/as_node/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.uuids_by_name.$(name) IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -336,7 +387,7 @@ function as_node { IF (has_entity_locators) { function as_locator { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -346,11 +397,10 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/as_locator/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.$(name).uuid + data_manager prep read + + block zzz/as_locator/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.$(name).uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -373,7 +423,7 @@ IF (has_entity_locators) { function as_at_locator { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -383,11 +433,10 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/as_locator/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.$(name).uuid + data_manager prep read + + block zzz/as_locator/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.$(name).uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -410,7 +459,7 @@ IF (has_entity_locators) { function as_all_locators { #ARGS: {command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {command:'$(command)'} @@ -419,9 +468,11 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block zzz/as_all_locators/as_data { + data_manager prep read + + block zzz/as_all_locators/as_data { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.<%locator.storage_name%>.uuid + data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.<%locator.storage_name%>.uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -445,7 +496,7 @@ IF (has_entity_locators) { function as_at_all_locators { #ARGS: {command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {command:'$(command)'} @@ -454,9 +505,11 @@ IF (has_entity_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block zzz/as_all_locators/as_data { + data_manager prep read + + block zzz/as_all_locators/as_data { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - data modify storage <%temp_storage%> args.uuid set from entity @s data.locators.<%locator.storage_name%>.uuid + data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.<%locator.storage_name%>.uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -482,7 +535,7 @@ IF (has_entity_locators) { IF (has_locators) { function at_locator { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)'} @@ -492,15 +545,13 @@ IF (has_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute \ - at @s \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/at_locator/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args merge from entity @s data.locators.$(name) + data_manager prep read + + execute at @s run block zzz/at_locator/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args merge from storage <%temp_storage%> entry.data.locators.$(name) IF (debug_mode) { - execute unless data storage <%temp_storage%> args.uuid run return run tellraw @a <%TELLRAW.LOCATOR_NOT_FOUND()%> + execute unless data storage <%temp_storage%> args.px run return run tellraw @a <%TELLRAW.LOCATOR_NOT_FOUND()%> scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 } @@ -524,7 +575,7 @@ IF (has_locators) { function at_all_locators { #ARGS: {command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {command:'$(command)'} @@ -533,9 +584,11 @@ IF (has_locators) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute at @s on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block zzz/at_all_locators/as_data { + data_manager prep read + + block zzz/at_all_locators/as_data { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - data modify storage <%temp_storage%> args merge from entity @s data.locators.<%locator.storage_name%> + data modify storage <%temp_storage%> args merge from storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -564,7 +617,7 @@ IF (has_locators) { IF (has_cameras) { function as_camera { #ARGS: {name: string, command: string} - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> data remove storage <%temp_storage%> args $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} @@ -574,11 +627,10 @@ IF (has_cameras) { execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> } - execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/as_camera/as_data { with storage <%temp_storage%> args - $data modify storage <%temp_storage%> args.uuid set from entity @s data.cameras.$(name).uuid + data_manager prep read + + block zzz/as_camera/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.cameras.$(name).uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -607,10 +659,13 @@ IF (has_cameras) { function as_root { #ARGS: {command: string} - debug assert executed_as_entity_with_root_uuid_data + execute unless score @s <%OBJECTIVES.ID()%> matches <%-(2**31)%>..<%(2**31)-1%> run return run \ + tellraw @a <%TELLRAW.FUNCTION_NOT_EXECUTED_AS_ENTITY_WITH_ID_SCORE(context.functions.at(-1))%> + + data_manager prep read $data modify storage <%temp_storage%> args.command set value '$(command)' - data modify storage <%temp_storage%> args.root_uuid set from entity @s data.root_uuid + data modify storage <%temp_storage%> args.root_uuid set from storage <%temp_storage%> entry.data.root_uuid IF (debug_mode) { scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 @@ -631,44 +686,43 @@ function as_root { dir remove { function all { # Removes all instances of this rig from the world. - execute as @e[type=minecraft:item_display,tag=<%TAGS.PROJECT_ROOT(export_namespace)%>] run function *<%export_namespace%>/remove/this + execute as @e[type=minecraft:item_display,tag=<%TAGS.PROJECT_ROOT(blueprint_id)%>] run function <%blueprint_id%>/remove/this } function entities { # Removes all entities related to this rig from the world. - kill @e[tag=<%TAGS.PROJECT_ENTITY(export_namespace)%>] + kill @e[tag=<%TAGS.PROJECT_ENTITY(blueprint_id)%>] } function this { # Removes the rig this function is executed as. - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> <%% if (on_remove_function) emit.mcb(on_remove_function) %%> IF (has_entity_locators) { - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block as_data { - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - IF (locator.config?.on_remove_function) { - IF (locator.config.use_entity) { - block as_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> - $execute as $(uuid) at @s run block locator_<%locator.storage_name%>_on_remove { - <%% - emit.mcb(locator.config.on_remove_function) - %%> - } + data_manager prep read + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { + IF (locator.config?.on_remove_function) { + IF (locator.config.use_entity) { + block as_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + $execute as $(uuid) at @s run block locator_<%locator.storage_name%>_on_remove { + <%% + emit.mcb(locator.config.on_remove_function) + %%> } - } ELSE { - block at_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> - $execute \ - positioned ^$(px) ^$(py) ^$(pz) \ - rotated ~$(ry) ~$(rx) \ - run block locator_<%locator.storage_name%>_on_remove { - <%% - emit.mcb(locator.config.on_remove_function) - %%> - } + } + } ELSE { + block at_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + $execute \ + positioned ^$(px) ^$(py) ^$(pz) \ + rotated ~$(ry) ~$(rx) \ + run block locator_<%locator.storage_name%>_on_remove { + <%% + emit.mcb(locator.config.on_remove_function) + %%> } } } @@ -681,27 +735,30 @@ dir remove { dir this { function without_on_remove_function { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + data_manager prep read IF (has_entity_locators || has_cameras) { - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block as_data { - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { - function animated_java:global/remove/entity_stack_by_uuid with entity @s data.locators.<%locator.storage_name%> - } - REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - function animated_java:global/remove/entity_stack_by_uuid with entity @s data.cameras.<%camera.storage_name%> - } + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { + function animated_java:global/remove/entity_stack_by_uuid with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + } + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { + function animated_java:global/remove/entity_stack_by_uuid with storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> } } # Remove the rig using the more expensive & thorough method if the rig_hash doesn't match. execute \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - unless data entity @s {data:{rig_hash: '<%rig_hash%>'}} \ - on vehicle \ + unless data storage <%temp_storage%> {entry:{data:{rig_hash: '<%rig_hash%>'}}} \ run function animated_java:global/remove/outdated_rig + block { with storage <%temp_storage%> entry.data.uuids_by_name + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + $kill $(<%node.storage_name%>) + } + } + function animated_java:global/remove/entity_stack } } @@ -712,7 +769,7 @@ IF (Object.keys(rig.variants).length > 1) { REPEAT (Object.values(rig.variants)) as variant { dir <%variant.name%> { function apply { - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> <%% global.filteredNodes = Object.values(rig.nodes).filter( @@ -732,13 +789,10 @@ IF (Object.keys(rig.variants).length > 1) { ) %%> - REPEAT (global.filteredNodes) as node { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ - at @s \ - run \ - block zzz/apply_to_node_<%node.storage_name%> { + data_manager prep read + block { with storage <%temp_storage%> entry.data.uuids_by_name + REPEAT (global.filteredNodes) as node { + $execute as $(<%node.storage_name%>) run block zzz/apply_to_node_<%node.storage_name%> { IF (node.type === 'bone' && variant.models[node.uuid] !== undefined) { # Special case for `animated_java:empty` model. IF (variant.models[node.uuid].model === null) { @@ -760,8 +814,10 @@ IF (Object.keys(rig.variants).length > 1) { %%> } } + } } } + # Return success to allow this function to be used in function conditions. return 1 } @@ -775,21 +831,25 @@ IF (has_locators || has_cameras) { function reset_floating_entities { IF (has_locators) { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { - execute \ - at @s \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/set_default_pose/as_locator_<%locator.storage_name%> { with entity @s data.locators.<%locator.storage_name%> - IF (locator.config?.use_entity) { + IF (locator.config?.use_entity) { + execute at @s run block set_default_pose/as_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> $tp $(uuid) \ ^<%roundTo(locator.default_transform.pos[0], 10)%> \ ^<%roundTo(locator.default_transform.pos[1], 10)%> \ ^<%roundTo(locator.default_transform.pos[2], 10)%> \ ~<%roundTo(locator.default_transform.head_rot[1], 10)%> \ ~<%roundTo(locator.default_transform.head_rot[0], 10)%> - } - data modify entity @s data.locators.<%locator.storage_name%> merge value { \ + data modify storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> merge value { \ + px: <%roundTo(locator.default_transform.pos[0], 10)%>, \ + py: <%roundTo(locator.default_transform.pos[1], 10)%>, \ + pz: <%roundTo(locator.default_transform.pos[2], 10)%>, \ + ry: <%roundTo(locator.default_transform.head_rot[1], 10)%>, \ + rx: <%roundTo(locator.default_transform.head_rot[0], 10)%> \ + } + } + } ELSE { + data modify storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> merge value { \ px: <%roundTo(locator.default_transform.pos[0], 10)%>, \ py: <%roundTo(locator.default_transform.pos[1], 10)%>, \ pz: <%roundTo(locator.default_transform.pos[2], 10)%>, \ @@ -802,11 +862,7 @@ IF (has_locators || has_cameras) { IF (has_cameras) { REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { - execute \ - at @s \ - on passengers \ - if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] \ - run block zzz/set_default_pose/as_camera_<%camera.storage_name%> { with entity @s data.cameras.<%camera.storage_name%> + execute at @s run block set_default_pose/as_camera_<%camera.storage_name%> { with storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> $tp $(uuid) \ ^<%roundTo(camera.default_transform.pos[0], 10)%> \ ^<%roundTo(camera.default_transform.pos[1], 10)%> \ @@ -814,7 +870,7 @@ IF (has_locators || has_cameras) { ~<%roundTo(camera.default_transform.head_rot[1], 10)%> \ ~<%roundTo(camera.default_transform.head_rot[0], 10)%> - data modify entity @s data.cameras.<%camera.storage_name%> merge value { \ + data modify storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> merge value { \ px: <%roundTo(camera.default_transform.pos[0], 10)%>, \ py: <%roundTo(camera.default_transform.pos[1], 10)%>, \ pz: <%roundTo(camera.default_transform.pos[2], 10)%>, \ @@ -828,22 +884,29 @@ IF (has_locators || has_cameras) { } } +dir zzz { + function set_default_pose { + IF (has_locators || has_cameras) { + function ../zzz/reset_floating_entities + } + + block set_default_pose_to_nodes { with storage <%temp_storage%> entry.data.uuids_by_name + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + $data merge entity $(<%node.storage_name%>) { \ + transformation: <%matrixToNbtFloatArray(node.default_transform.matrix).toString()%>, \ + start_interpolation: -1 \ + } + } + } + } +} + function set_default_pose { # Changes the pose of the rig to the the default pose without interpolation - debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(export_namespace)%> + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> IF (has_locators || has_cameras) { - function ./zzz/reset_floating_entities + data_manager prep read } - - REPEAT (Object.values(rig.nodes).filter(node => node.type !== 'locator' && node.type !== 'camera')) as node { - execute \ - on passengers \ - if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(export_namespace, node.storage_name)%>] \ - run \ - data merge entity @s { \ - transformation: <%matrixToNbtFloatArray(node.default_transform.matrix).toString()%>, \ - start_interpolation: -1 \ - } - } -} + function ./zzz/set_default_pose +} \ No newline at end of file diff --git a/src/systems/datapackCompiler/1.21.5/animation.mcb b/src/systems/datapackCompiler/1.21.5/animation.mcb new file mode 100644 index 00000000..edaeff96 --- /dev/null +++ b/src/systems/datapackCompiler/1.21.5/animation.mcb @@ -0,0 +1,1437 @@ +# TODO - Move all internal functions into an internal namespace, and only have user-facing functions in the main `<%blueprint_id%>` namespace. + +# DIFFERENCES FROM 1.21.4: +# - JSON text components are now stored as NBT in entities. + +function on_load { + data modify storage <%project_storage%> rig_hash set value <%"'" + rig_hash + "'"%> + + IF (use_storage_for_animation) { + REPEAT (animations) as animation { + data remove storage <%project_storage%>/animations <%animation.storage_name%> + } + <%animationStorage.join('\n')%> + } + <%% + animations.forEach(animation => { + emit(`scoreboard objectives add ${OBJECTIVES.FRAME(animation.storage_name)} dummy`) + }) + %%> +} + +function remove_animation_objectives { + <%% + animations.forEach(animation => { + emit(`scoreboard objectives remove ${OBJECTIVES.FRAME(animation.storage_name)}`) + }) + %%> + tellraw @a <%TELLRAW.UNINSTALL()%> +} + +dir root { + function on_tick { + # Custom pre-tick function + IF (on_pre_tick_function) { + <%% + emit.mcb(on_pre_tick_function) + %%> + } + + # animated_java:global/root/on_tick already runs this right before calling this function. + # data_manager prep read + + # Once we have more than 8 animations, calling a function only if at least one animation is playing is more efficient. + IF (animations.length > 8) { + # If no animations are playing, we can skip all animation logic. + # This helps reduce ticking commands for rigs that are idle. + execute \ + unless entity @s[<%animations.map(anim => 'tag=!' + TAGS.ANIMATION_PLAYING(blueprint_id, anim.storage_name)).join(',')%>] \ + run block tick_animations { + REPEAT (animations) as animation { + execute if entity @s[tag=<%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%>] run \ + function <%blueprint_id%>/animations/<%animation.storage_name%>/zzz/on_tick + } + } + } ELSE { + REPEAT (animations) as animation { + execute if entity @s[tag=<%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%>] run \ + function <%blueprint_id%>/animations/<%animation.storage_name%>/zzz/on_tick + } + } + + IF (auto_update_rig_orientation) { + IF (has_locators || has_cameras) { + function <%blueprint_id%>/root/on_tick/transform_floating_entities + } + + block { with storage <%temp_storage%> entry.data.uuids_by_name + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + $tp $(<%node.storage_name%>) ~ ~ ~ ~ ~ + # Precise Rotation Workaround. Fixes MC-272913. + # Thanks @Triton365! (https://discord.com/channels/154777837382008833/157097006500806656/1402253905408163842) + $execute \ + as $(<%node.storage_name%>) \ + store success entity @s OnGround byte 1 \ + store success score @s <%OBJECTIVES.I()%> \ + unless score @s <%OBJECTIVES.I()%> matches 1 + } + } + } ELSE IF (has_ticking_locators) { + function <%blueprint_id%>/root/on_tick/transform_locators + } + + # Custom post-tick function + IF (on_post_tick_function) { + <%% + emit.mcb(on_post_tick_function) + %%> + } + } + + IF (has_locators || has_cameras) { + dir on_tick { + function transform_locators { + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { + block select_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + IF (locator.config?.use_entity) { + $execute \ + as $(uuid) \ + positioned ^$(px) ^$(py) ^$(pz) \ + rotated ~$(ry) ~$(rx) \ + run block as_locator_<%locator.storage_name%> { + tp @s ~ ~ ~ ~ ~ + + IF (locator.config?.sync_passenger_rotation) { + execute on passengers run rotate @s ~ ~ + } + + IF (locator.config?.on_tick_function) { + <%% + emit.mcb(locator.config.on_tick_function) + %%> + } + } + + IF (locator.config?.sync_passenger_rotation) { + # Precise Rotation Workaround. Fixes MC-272913. + # Thanks @Triton365! (https://discord.com/channels/154777837382008833/157097006500806656/1402253905408163842) + $execute \ + as $(uuid) \ + store success entity @s OnGround byte 1 \ + store success score @s <%OBJECTIVES.I()%> \ + unless score @s <%OBJECTIVES.I()%> matches 1 + } + } ELSE IF (locator.config?.on_tick_function) { + $execute \ + positioned ^$(px) ^$(py) ^$(pz) \ + rotated ~$(ry) ~$(rx) \ + run block at_locator_<%locator.storage_name%> { + <%% + emit.mcb(locator.config.on_tick_function) + %%> + } + } + } + } + } + + function transform_floating_entities { + function ./transform_locators + + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { + block select_camera_<%camera.storage_name%> { with storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> + $execute \ + as $(uuid) \ + positioned ^$(px) ^$(py) ^$(pz) \ + rotated ~$(ry) ~$(rx) \ + run tp @s ~ ~ ~ ~ ~ + # Precise Rotation Workaround. Fixes MC-272913. + # Thanks @Triton365! (https://discord.com/channels/154777837382008833/157097006500806656/1402253905408163842) + $execute \ + as $(uuid) \ + store success entity @s OnGround byte 1 \ + store success score @s <%OBJECTIVES.I()%> \ + unless score @s <%OBJECTIVES.I()%> matches 1 + } + } + } + } + } +} + +IF (!auto_update_rig_orientation) { + function move { + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + tp @s ~ ~ ~ ~ ~ + + data_manager prep read + IF (has_locators || has_cameras) { + function <%blueprint_id%>/root/on_tick/transform_floating_entities + } + + block { with storage <%temp_storage%> entry.data.uuids_by_name + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + $tp $(<%node.storage_name%>) ~ ~ ~ ~ ~ + # Precise Rotation Workaround. Fixes MC-272913. + # Thanks @Triton365! (https://discord.com/channels/154777837382008833/157097006500806656/1402253905408163842) + $execute \ + as $(<%node.storage_name%>) \ + store success entity @s OnGround byte 1 \ + store success score @s <%OBJECTIVES.I()%> \ + unless score @s <%OBJECTIVES.I()%> matches 1 + } + } + } +} ELSE { + function move { + tellraw @a <%TELLRAW.AUTO_UPDATE_RIG_ORIENTATION_MOVE_WARNING()%> + } +} + +dir animations { + REPEAT (animations) as animation { + dir <%animation.storage_name%> { + function play { + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + function <%blueprint_id%>/animations/pause_all + + tag @s add <%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%> + scoreboard players set @s <%OBJECTIVES.FRAME(animation.storage_name)%> 0 + tag @s add <%TAGS.TRANSFORMS_ONLY()%> + execute at @s run function ./zzz/set_frame {frame: 0} + tag @s remove <%TAGS.TRANSFORMS_ONLY()%> + } + + function stop { + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + function <%blueprint_id%>/animations/pause_all + + scoreboard players set @s <%OBJECTIVES.FRAME(animation.storage_name)%> 0 + tag @s add <%TAGS.TRANSFORMS_ONLY()%> + execute at @s run function ./zzz/set_frame {frame: 0} + tag @s remove <%TAGS.TRANSFORMS_ONLY()%> + } + + function pause { + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + tag @s remove <%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%> + } + + function resume { + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + tag @s add <%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%> + } + + function next_frame { + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + execute if score @s <%OBJECTIVES.FRAME(animation.storage_name)%> matches <%animation.duration%>.. run scoreboard players set @s <%OBJECTIVES.FRAME(animation.storage_name)%> 1 + data remove storage <%temp_storage%> args + execute store result storage <%temp_storage%> args.frame int 1 run scoreboard players get @s <%OBJECTIVES.FRAME(animation.storage_name)%> + execute at @s run function ./zzz/apply_frame with storage <%temp_storage%> args + scoreboard players add @s <%OBJECTIVES.FRAME(animation.storage_name)%> 1 + } + + function set_frame { + # Sets the frame without interpolation + #ARGS: {frame: int} + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + data_manager prep read + + data remove storage <%temp_storage%> args + $execute store result storage <%temp_storage%> args.frame int 1 run scoreboard players set @s <%OBJECTIVES.FRAME(animation.storage_name)%> $(frame) + execute at @s run function ./zzz/set_frame with storage <%temp_storage%> args + } + + function apply_frame { + #ARGS: {frame: int} + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + data_manager prep read + + data remove storage <%temp_storage%> args + $execute store result storage <%temp_storage%> args.frame int 1 run scoreboard players set @s <%OBJECTIVES.FRAME(animation.storage_name)%> $(frame) + execute at @s run function ./zzz/apply_frame with storage <%temp_storage%> args + } + + function tween { + # Attempts to smoothly transition from the currently playing animation into this one. + #ARGS: {duration: int, to_frame: int} + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + function <%blueprint_id%>/animations/pause_all + + tag @s add <%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%> + $scoreboard players set @s <%OBJECTIVES.TWEEN_DURATION()%> $(duration) + $scoreboard players set @s <%OBJECTIVES.FRAME(animation.storage_name)%> $(to_frame) + + scoreboard players operation #this <%OBJECTIVES.I()%> = @s <%OBJECTIVES.TWEEN_DURATION()%> + tag @s add <%TAGS.TRANSFORMS_ONLY()%> + execute at @s run function ./zzz/apply_frame {frame: 0} + $execute at @s run function ./zzz/apply_frame {frame: $(to_frame)} + tag @s remove <%TAGS.TRANSFORMS_ONLY()%> + + data_manager prep read + block { with storage <%temp_storage%> entry.data.uuids_by_name + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + $execute \ + as $(<%node.storage_name%>) \ + store result entity @s interpolation_duration int 1 \ + run scoreboard players get #this <%OBJECTIVES.I()%> + } + } + } + + dir zzz { + function on_tick { + # Tweening logic + scoreboard players remove @s <%OBJECTIVES.TWEEN_DURATION()%> 1 + execute if score @s <%OBJECTIVES.TWEEN_DURATION()%> matches 1.. run return 1 + execute if score @s <%OBJECTIVES.TWEEN_DURATION()%> matches 0 run \ + block { with storage <%temp_storage%> entry.data.uuids_by_name + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + $data modify entity $(<%node.storage_name%>) interpolation_duration set value <%interpolation_duration%> + } + } + + # Animation logic + IF (animation.loop_mode === 'loop' && animation.loop_delay === 0) { + # Makes sure function keyframes in the last frame of the animation are activated. + execute if score @s <%OBJECTIVES.FRAME(animation.storage_name)%> matches -1 run \ + block function_keyframe_loop_patch { + function ./frames/last_frame_effects with storage <%temp_storage%> entry.data.uuids_by_name + scoreboard players add @s <%OBJECTIVES.FRAME(animation.storage_name)%> 1 + } + } + data remove storage <%temp_storage%> args + execute store result storage <%temp_storage%> args.frame int 1 run \ + scoreboard players get @s <%OBJECTIVES.FRAME(animation.storage_name)%> + function ./apply_frame with storage <%temp_storage%> args + IF (animation.loop_mode === 'loop') { + # Loop the animation back to the start once it reaches the last frame. + # If loop_delay is 0, the animation will loop instantly, otherwise, it will wait for the specified amount of ticks. + execute \ + if score @s <%OBJECTIVES.FRAME(animation.storage_name)%> \ + matches <%animation.duration-2 + animation.loop_delay%>.. \ + run return run \ + scoreboard players set @s <%OBJECTIVES.FRAME(animation.storage_name)%> <%animation.loop_delay === 0 ? -1 : 0%> + } ELSE IF (animation.loop_mode === 'hold') { + # Pause the animation at the last frame. + execute \ + if score @s <%OBJECTIVES.FRAME(animation.storage_name)%> \ + matches <%animation.duration-1%>.. \ + run return run \ + function ../pause + } ELSE IF (animation.loop_mode === 'once') { + # Stop the animation once it reaches the last frame. + execute \ + if score @s <%OBJECTIVES.FRAME(animation.storage_name)%> \ + matches <%animation.duration-1%> \ + run return run block loop_mode_stop { + scoreboard players set @s <%OBJECTIVES.FRAME(animation.storage_name)%> 0 + tag @s add <%TAGS.TRANSFORMS_ONLY()%> + execute at @s run function ./zzz/set_frame {frame: 0} + tag @s remove <%TAGS.TRANSFORMS_ONLY()%> + tag @s remove <%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%> + } + } + scoreboard players add @s <%OBJECTIVES.FRAME(animation.storage_name)%> 1 + } + + IF (use_storage_for_animation) { + function set_frame { + #ARGS: {frame: int} + $function ./apply_frame {frame: $(frame)} + block { with storage <%temp_storage%> entry.data.uuids_by_name + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + $data modify entity $(<%node.storage_name%>) start_interpolation set value -1 + } + } + return 1 + } + + function apply_frame { + #ARGS: {frame: int} + + block { with storage <%temp_storage%> entry.data.uuids_by_name + REPEAT (Object.values(animation.modified_nodes).sort(nodeSorter)) as node { + IF (BONE_TYPES.includes(node.type)) { + $data modify entity $(<%node.storage_name%>) {} merge from \ + storage <%project_storage%>/animations <%animation.storage_name%>.$(frame).<%node.storage_name%> + } ELSE IF (node.type === 'locator' || node.type === 'camera') { + $data modify storage <%temp_storage%> entry.data.uuids_by_name.<%node.storage_name%> merge from \ + storage <%project_storage%>/animations <%animation.storage_name%>.$(frame).<%node.storage_name%> + } + } + } + + IF (animation.frames.some(anim => anim.variant)) { + $execute \ + if data storage <%project_storage%>/animations <%animation.storage_name%>.$(frame).variant \ + unless entity @s[tag=<%TAGS.TRANSFORMS_ONLY()%>] \ + run { with storage <%project_storage%>/animations <%animation.storage_name%>.$(frame).variant + #ARGS: {name: string, condition: string} + $execute $(condition)run function <%blueprint_id%>/variants/$(name)/apply + } + } + + return 1 + } + } ELSE { + function set_frame { + # Sets the frame without interpolation + #ARGS: {frame: int} + + $function ./frames/$(frame) with storage <%temp_storage%> entry.data.uuids_by_name + + block { with storage <%temp_storage%> entry.data.uuids_by_name + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + $data modify entity $(<%node.storage_name%>) start_interpolation set value -1 + } + } + + return 1 + } + + function apply_frame { + #ARGS: {frame: int} + + $function ./frames/$(frame) with storage <%temp_storage%> entry.data.uuids_by_name + + return 1 + } + + # FIXME - %NEWLINE_PATCH% is a temporary solution to temporarily fix an MCB bug where extra newlines are being added to the output. + dir frames { + <%% + global.frame = animation.frames.at(-1) + global.modified_effect_nodes = Object.values(animation.modified_nodes).filter( + node => node.type === 'locator' && global.frame.node_transforms[node.uuid] + ) + console.log(global.modified_effect_nodes) + %%> + IF(Object.keys(global.modified_effect_nodes).length > 0) { + function last_frame_effects { + REPEAT(global.modified_effect_nodes) as node { + <%% + global.transform = global.frame.node_transforms[node.uuid] + %%> + IF (node.config?.use_entity) { + $execute \ + as $(<%node.storage_name%>) \ + positioned \ + ^<%roundTo(global.transform.pos[0], 10)%> \ + ^<%roundTo(global.transform.pos[1], 10)%> \ + ^<%roundTo(global.transform.pos[2], 10)%> \ + rotated \ + ~<%roundTo(global.transform.head_rot[1], 10)%> \ + ~<%roundTo(global.transform.head_rot[0], 10)%> \ + <%global.transform.function_execute_condition ? global.transform.function_execute_condition + ' ' : ''%>run \ + function ./<%animation.duration%>_locator_<%node.storage_name%> + } ELSE { + execute \ + positioned \ + ^<%roundTo(global.transform.pos[0], 10)%> \ + ^<%roundTo(global.transform.pos[1], 10)%> \ + ^<%roundTo(global.transform.pos[2], 10)%> \ + rotated \ + ~<%roundTo(global.transform.head_rot[1], 10)%> \ + ~<%roundTo(global.transform.head_rot[0], 10)%> \ + <%global.transform.function_execute_condition ? global.transform.function_execute_condition + ' ' : ''%>run \ + function ./<%animation.duration%>_locator_<%node.storage_name%> + } + } + + IF (global.frame.variants?.length > 0) { + execute <%global.frame.variants_execute_condition ? global.frame.variants_execute_condition + ' ' : ''%>run \ + function <%blueprint_id%>/variants/<%global.frame.variants[0].name%>/apply + } + + IF (global.frame.function) { + execute <%global.frame.function_execute_condition ? global.frame.function_execute_condition + ' ' : ''%>run \ + block <%animation.duration%>_function_keyframe { + <%global.frame.function%> + } + } + } + } + + <%% + // A record of node uuid to INodeTransform. + // Keeps track of the last time a bone was updated. + // Only used for step keyframe interpolation. + let hasFunction = false + const lastActiveFrame = {} + const modifiedNodes = Object.values(animation.modified_nodes).filter(n => n.type !== 'struct').sort(nodeSorter); + for (const [frameIndex, frame] of animation.frames.entries()) { + const to_merge = {cameras: {}, locators: {}} + let frameFunc = ``; + for (const node of modifiedNodes) { + const transform = frame.node_transforms[node.uuid] + // Skip if the node doesn't have a transform for this frame. + if (!transform) continue + switch (node.type) { + case 'bone': + case 'text_display': + case 'item_display': + case 'block_display': { + const lastFrame = lastActiveFrame[node.uuid] + const isStepInterpolation = !!(lastFrame?.interpolation === 'step') + lastActiveFrame[node.uuid] = transform + + if (transform.interpolation === 'pre-post' || isStepInterpolation) { + frameFunc += + `\n$data merge entity $(${node.storage_name})%NEWLINE_PATCH%{` + + `transformation: ${matrixToNbtFloatArray(transform.matrix).toString()},` + + `start_interpolation: ${isStepInterpolation ? -1 : 0},` + + `interpolation_duration: ${isStepInterpolation ? 0 : interpolation_duration}` + + `}` + } else { + frameFunc += + `\n$data merge entity $(${node.storage_name})%NEWLINE_PATCH%{` + + `transformation: ${matrixToNbtFloatArray(transform.matrix).toString()},` + + `start_interpolation: 0,` + + `interpolation_duration: ${interpolation_duration}` + + `}` + } + + ;hasFunction = true + break + } + case 'locator': { + const lastFrame = lastActiveFrame[node.uuid] + lastActiveFrame[node.uuid] = transform + ;if (!lastFrame || matrixToNbtFloatArray(transform.matrix).toString() !== matrixToNbtFloatArray(lastFrame.matrix).toString()) { + to_merge.locators[node.storage_name] = { + px: transform.pos[0], + py: transform.pos[1], + pz: transform.pos[2], + ry: transform.head_rot[1], + rx: transform.head_rot[0] + }; + } + + if (transform.function) { + if (node.config?.use_entity) { + frameFunc += + `\n$execute unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] as $(${node.storage_name}) ` + + `positioned ^${roundTo(transform.pos[0], 10)} ^${roundTo(transform.pos[1], 10)} ^${roundTo(transform.pos[2], 10)} ` + + `rotated ~${roundTo(transform.head_rot[1], 10)} ~${roundTo(transform.head_rot[0], 10)} ` + + `${transform.function_execute_condition ? transform.function_execute_condition + ' ' : ''}run ` + + `block ${frameIndex}_locator_${node.storage_name}%NEWLINE_PATCH%{\n` + + `tp @s ~ ~ ~ ~ ~\n` + + `${transform.function}` + + `\n}` + } else { + frameFunc += + `\nexecute unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] ` + + `positioned ^${roundTo(transform.pos[0], 10)} ^${roundTo(transform.pos[1], 10)} ^${roundTo(transform.pos[2], 10)} ` + + `rotated ~${roundTo(transform.head_rot[1], 10)} ~${roundTo(transform.head_rot[0], 10)} ` + + `${transform.function_execute_condition ? transform.function_execute_condition + ' ' : ''}run ` + + `block ${frameIndex}_locator_${node.storage_name}%NEWLINE_PATCH%{\n` + + `${transform.function}` + + `\n}` + } + } + break + } + case 'camera': { + const lastFrame = lastActiveFrame[node.uuid] + lastActiveFrame[node.uuid] = transform + ;if (!lastFrame || matrixToNbtFloatArray(transform.matrix).toString() !== matrixToNbtFloatArray(lastFrame.matrix).toString()) { + to_merge.cameras[node.storage_name] = { + px: transform.pos[0], + py: transform.pos[1], + pz: transform.pos[2], + ry: transform.head_rot[1], + rx: transform.head_rot[0] + }; + } + ;break + } + } + } + + if (Object.keys(to_merge.locators).length > 0 || Object.keys(to_merge.cameras).length > 0) { + frameFunc += `\ndata modify storage <%temp_storage%> entry.data merge value ${JSON.stringify(to_merge)}` + frameFunc += `\ndata_manager write` + if (!auto_update_rig_orientation) { + frameFunc += `\nfunction ${blueprint_id}/root/on_tick/transform_floating_entities` + } + hasFunction = true + } + + if (frame.variants?.length) { + const variant = rig.variants[frame.variants[0]] + if (!variant) { + throw new Error(`Could not find Variant with uuid "${frame.variants[0]}" while generating frame "${frameIndex}" of animation "${animation.name}".`) + } + const execute_condition = frame.variants_execute_condition ? frame.variants_execute_condition + ' ' : '' + frameFunc += `\nexecute unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] ${execute_condition}run function ${blueprint_id}/variants/${variant.name}/apply` + ;hasFunction = true + } + + // Root function keyframes. + if (frame.function) { + const execute_condition = frame.function_execute_condition ? frame.function_execute_condition + ' ' : '' + frameFunc += `\nexecute unless entity @s[tag=${TAGS.TRANSFORMS_ONLY()}] at @s ${execute_condition}run block ${frameIndex}_root_function%NEWLINE_PATCH%{\n${frame.function}\n}` + ;hasFunction = true + } + ;if (frameFunc.length > 0) { + frameFunc = `function ${frameIndex}%NEWLINE_PATCH%{${frameFunc}\n}` + emit.mcb(frameFunc.replaceAll(/%NEWLINE_PATCH%\n?/g, ' ')) + } + } + %%> + } + } + } + } + } + function pause_all { + # Pauses all animations + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + REPEAT (animations) as animation { + tag @s remove <%TAGS.ANIMATION_PLAYING(blueprint_id, animation.storage_name)%> + } + } +} + +function summon { + #Args: {args:{variant: string, animation: string, frame: int, start_animation: boolean}} + # frame is ignored unless animation is specified. + + data modify storage <%temp_storage%> args set value {variant:'', animation:'', frame: 0} + $execute store success score #success <%OBJECTIVES.I()%> run data modify storage <%temp_storage%> args set value $(args) + + summon minecraft:item_display ~ ~ ~ { \ + Tags:[ \ + '<%TAGS.NEW()%>', \ + '<%TAGS.GLOBAL_ENTITY()%>', \ + '<%TAGS.GLOBAL_ROOT()%>', \ + '<%TAGS.PROJECT_ENTITY(blueprint_id)%>', \ + '<%TAGS.PROJECT_ROOT(blueprint_id)%>' \ + ], \ + teleport_duration: 0, \ + interpolation_duration: <%interpolation_duration%>, \ + Passengers:<%root_entity_passengers%>, \ + CustomName: <%ENTITY_NAMES.ROOT(blueprint_id)%>, \ + } + execute as @n[ \ + type=minecraft:item_display, \ + tag=<%TAGS.PROJECT_ROOT(blueprint_id)%>, \ + tag=<%TAGS.NEW()%>, \ + distance=..0.01 \ + ] run block zzz/summon/as_root_entity { + execute store result score @s <%OBJECTIVES.ID()%> run scoreboard players add aj.last_id <%OBJECTIVES.ID()%> 1 + + data_manager init prep read + # Data manager init runs gu:get_entity_uuid_string. So we don't need to call it again here. + # function animated_java:global/gu/get_entity_uuid_string + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.root_uuid set from storage <%gu_storage%> out + + data modify storage <%temp_storage%> entry.data.blueprint_id set value "<%blueprint_id%>" + data modify storage <%temp_storage%> entry.data.rig_hash set value "<%rig_hash%>" + + # Align the position and rotation of the root with the command context. + tp @s ~ ~ ~ ~ ~ + + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { + summon <%locator.config.entity_type%> \ + ^<%roundTo(locator.default_transform.pos[0], 10)%> \ + ^<%roundTo(locator.default_transform.pos[1], 10)%> \ + ^<%roundTo(locator.default_transform.pos[2], 10)%> \ + {Tags:<%getNodeTags(locator, rig)%>} + execute \ + as @n[ \ + type=<%locator.config.entity_type%>, \ + tag=<%TAGS.PROJECT_LOCATOR_NAMED(blueprint_id, locator.storage_name)%>, \ + tag=<%TAGS.NEW()%>, \ + distance=..<%Math.ceil(locator.max_distance + 0.5)%> \ + ] \ + run block as_locator/<%locator.storage_name%> { + # run block ../as_locator/<%locator.storage_name%> { + tag @s remove <%TAGS.NEW()%> + data modify entity @s CustomName set value <%ENTITY_NAMES.NODE(blueprint_id, locator.type, locator.storage_name)%> + function animated_java:global/gu/get_entity_uuid_string + scoreboard players operation @s <%OBJECTIVES.ID()%> = aj.last_id <%OBJECTIVES.ID()%> + } + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids_by_name.<%locator.storage_name%> set from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.locators.<%locator.storage_name%>.uuid set from storage <%gu_storage%> out + } + + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { + summon minecraft:item_display \ + ^<%roundTo(camera.default_transform.pos[0], 10)%> \ + ^<%roundTo(camera.default_transform.pos[1], 10)%> \ + ^<%roundTo(camera.default_transform.pos[2], 10)%> \ + {Tags:<%getNodeTags(camera, rig)%>, teleport_duration: 2} + execute \ + as @n[ \ + type=minecraft:item_display, \ + tag=<%TAGS.PROJECT_CAMERA_NAMED(blueprint_id, camera.storage_name)%>, \ + tag=<%TAGS.NEW()%>, \ + distance=..<%Math.ceil(camera.max_distance + 0.5)%> \ + ] \ + run block as_camera/<%camera.storage_name%> { + # run block ../as_camera/<%camera.storage_name%> { + tag @s remove <%TAGS.NEW()%> + data modify entity @s CustomName set value <%ENTITY_NAMES.NODE(blueprint_id, camera.type, camera.storage_name)%> + function animated_java:global/gu/get_entity_uuid_string + scoreboard players operation @s <%OBJECTIVES.ID()%> = aj.last_id <%OBJECTIVES.ID()%> + } + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids_by_name.<%camera.storage_name%> set from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%>.uuid set from storage <%gu_storage%> out + } + + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + execute \ + on passengers \ + if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ + run block as_node/<%node.storage_name%> { + data modify entity @s CustomName set value <%ENTITY_NAMES.NODE(blueprint_id, node.type, node.storage_name)%> + function animated_java:global/gu/get_entity_uuid_string + scoreboard players operation @s <%OBJECTIVES.ID()%> = aj.last_id <%OBJECTIVES.ID()%> + } + + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids_by_name.<%node.storage_name%> set from storage <%gu_storage%> out + } + + IF (has_entity_locators) { + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { + block { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + # Track any custom entities on the locator. + $execute at @s as $(uuid) at @s run function animated_java:global/util/get_entity_stack_uuids + } + data modify storage <%temp_storage%> entry.data.uuids append from storage <%temp_storage%> uuids + } + } + + function <%blueprint_id%>/zzz/set_default_pose + + data_manager write + + # Variant Arguement + IF (Object.keys(rig.variants).length > 1) { + execute if data storage <%temp_storage%> args.variant run block variant_arg/process { with storage <%temp_storage%> args + scoreboard players set #success <%OBJECTIVES.I()%> 0 + # If the variant argument is *explicitly* set to an empty string, return an error. + execute if data storage <%temp_storage%> {args:{variant:''}} run return run block if_empty { + # Tell the user that the variant cannot be empty. + tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('variant')%> + function <%blueprint_id%>/remove/this/without_on_remove_function + } + # Attempt to apply the requested variant. + # We get the success of the `try_apply` function in just in case the user's arguments are *very* wrong. + execute store success score #success <%OBJECTIVES.I()%> run block try_apply { with storage <%temp_storage%> args + $execute if function <%blueprint_id%>/variants/$(variant)/apply run return 1 + # If the apply function fails, the variant doesn't exist, so we return an error. + return fail + } + # If the apply function failed, return an error. + execute unless score #success <%OBJECTIVES.I()%> matches 1 run return run block invalid_variant { + # Tell the user that the provided variant doesn't exist, remove the rig, and list all available variants for this rig. + tellraw @a <%TELLRAW.INVALID_VARIANT(rig.variants)%> + function <%blueprint_id%>/remove/this/without_on_remove_function + } + scoreboard players set #success <%OBJECTIVES.I()%> 1 + } + } ELSE { + execute if data storage <%temp_storage%> args.variant run block zzz/variant_arg/no_variants_warning { + tellraw @a <%TELLRAW.NO_VARIANTS()%> + function <%blueprint_id%>/remove/this/without_on_remove_function + scoreboard players set #success <%OBJECTIVES.I()%> 0 + } + } + execute if score #success <%OBJECTIVES.I()%> matches 0 run return fail + + # Animation Argument + # If the animation argument is provided, attempt to apply the animation. + execute if data storage <%temp_storage%> args.animation run block animation_arg/process { with storage <%temp_storage%> args + scoreboard players set #success <%OBJECTIVES.I()%> 0 + # If the animation argument is *explicitly* set to an empty string, return an error. + execute if data storage <%temp_storage%> {args:{animation:''}} run return run block if_empty { + tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('animation')%> + function <%blueprint_id%>/remove/this/without_on_remove_function + } + # Automatically set the frame argument to 0 if the frame argument is not provided. + # Takes advantage of `store result score` setting the score to 0 if the command fails. + execute \ + store result storage <%temp_storage%> args.frame int 1 \ + store result score #frame <%OBJECTIVES.I()%> \ + run \ + data get storage <%temp_storage%> args.frame + # If the frame argument is negative, return an error. + execute if score #frame <%OBJECTIVES.I()%> matches ..-1 run return run block no_negative { + # Tell the user that the frame argument cannot be negative. + tellraw @a <%TELLRAW.FRAME_CANNOT_BE_NEGATIVE()%> + function <%blueprint_id%>/remove/this/without_on_remove_function + } + # Attempt to apply the animation frame. + execute store success score #success <%OBJECTIVES.I()%> run block try_set_frame { with storage <%temp_storage%> args + # Make sure we're only applying transforms when setting the summon pose. + tag @s add <%TAGS.TRANSFORMS_ONLY()%> + $execute store success score #success <%OBJECTIVES.I()%> run function <%blueprint_id%>/animations/$(animation)/zzz/set_frame with storage <%temp_storage%> args + tag @s remove <%TAGS.TRANSFORMS_ONLY()%> + execute if score #success <%OBJECTIVES.I()%> matches 1 run return 1 + # If the set_frame function fails, the animation doesn't exist, so we return an error. + return fail + } + # If the set_frame function failed, return an error. + execute unless score #success <%OBJECTIVES.I()%> matches 1 run return run block invalid_animation { + # Tell the user that the provided animation doesn't exist, remove the rig, and list all available animations for this rig. + tellraw @a <%TELLRAW.INVALID_ANIMATION(animations)%> + function <%blueprint_id%>/remove/this/without_on_remove_function + } + + # If the animation is successfully applied, and the start_animation argument is set to true, start the animation. + execute if data storage <%temp_storage%> {args:{start_animation: true}} run block start_animation { with storage <%temp_storage%> args + $function <%blueprint_id%>/animations/$(animation)/resume + } + scoreboard players set #success <%OBJECTIVES.I()%> 1 + } + execute if score #success <%OBJECTIVES.I()%> matches 0 run return fail + + IF (has_locators || has_cameras) { + function <%blueprint_id%>/root/on_tick/transform_floating_entities + } + execute on passengers run rotate @s ~ ~ + + # Apply teleport duration + data modify entity @s teleport_duration set value <%teleportation_duration%> + execute on passengers run data modify entity @s teleport_duration set value <%teleportation_duration%> + + IF (has_entity_locators) { + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity && node.config.on_summon_function)) as locator { + block { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + $execute at @s as $(uuid) at @s run block on_summon/custom_<%locator.type + '_' + locator.storage_name%> { + <%% + emit.mcb(locator.config.on_summon_function) + %%> + } + } + } + } + + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type) && node.on_summon_function?.trim())) as node { + execute \ + on passengers if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ + run block on_summon/<%node.type + '_' + node.storage_name%> { + <%% + emit.mcb(node.on_summon_function.trim()) + %%> + } + } + + IF (on_summon_function) { + execute at @s run block on_summon/rig { + <%% + emit.mcb(on_summon_function) + %%> + } + } + + # Remove the NEW tag from the root entity, and it's passengers. + tag @s remove <%TAGS.NEW()%> + execute on passengers run tag @s remove <%TAGS.NEW()%> + # Dismount bone entities from the root entity. + execute on passengers run ride @s dismount + } +} + +function as_node { + #ARGS: {name: string, command: string} + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + data remove storage <%temp_storage%> args + $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} + + IF (debug_mode) { + execute if data storage <%temp_storage%> {args:{name:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('name')%> + execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> + } + + data_manager prep read + + block zzz/as_node/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.uuids_by_name.$(name) + IF (debug_mode) { + scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 + } + block execute_as_uuid { with storage <%temp_storage%> args + IF (debug_mode) { + # If the function successfully instantiated, the provided command is valid. + scoreboard players set #aj.check <%OBJECTIVES.I()%> 1 + } + $execute as $(uuid) run return run $(command) + IF (debug_mode) { + # If the entity with the provided UUID doesn't exist, the node wasn't found. + tellraw @a <%TELLRAW.NODE_ENTITY_NOT_FOUND()%> + } + } + IF (debug_mode) { + execute if score #aj.check <%OBJECTIVES.I()%> matches 0 run tellraw @a <%TELLRAW.NODE_COMMAND_FAILED_TO_EXECUTE()%> + } + } +} + +IF (has_entity_locators) { + function as_locator { + #ARGS: {name: string, command: string} + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + data remove storage <%temp_storage%> args + $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} + + IF (debug_mode) { + execute if data storage <%temp_storage%> {args:{name:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('name')%> + execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> + } + + data_manager prep read + + block zzz/as_locator/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.$(name).uuid + IF (debug_mode) { + scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 + } + block execute_as_uuid { with storage <%temp_storage%> args + IF (debug_mode) { + # If the function successfully instantiated, the provided command is valid. + scoreboard players set #aj.check <%OBJECTIVES.I()%> 1 + } + $execute as $(uuid) run return run $(command) + IF (debug_mode) { + # If the entity with the provided UUID doesn't exist, the locator wasn't found. + tellraw @a <%TELLRAW.LOCATOR_ENTITY_NOT_FOUND()%> + } + } + IF (debug_mode) { + execute if score #aj.check <%OBJECTIVES.I()%> matches 0 run tellraw @a <%TELLRAW.LOCATOR_COMMAND_FAILED_TO_EXECUTE()%> + } + } + } + + function as_at_locator { + #ARGS: {name: string, command: string} + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + data remove storage <%temp_storage%> args + $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} + + IF (debug_mode) { + execute if data storage <%temp_storage%> {args:{name:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('name')%> + execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> + } + + data_manager prep read + + block zzz/as_locator/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.$(name).uuid + IF (debug_mode) { + scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 + } + block execute_as_uuid { with storage <%temp_storage%> args + IF (debug_mode) { + # If the function successfully instantiated, the provided command is valid. + scoreboard players set #aj.check <%OBJECTIVES.I()%> 1 + } + $execute as $(uuid) at @s run return run $(command) + IF (debug_mode) { + # If the entity with the provided UUID doesn't exist, the locator wasn't found. + tellraw @a <%TELLRAW.LOCATOR_ENTITY_NOT_FOUND()%> + } + } + IF (debug_mode) { + execute if score #aj.check <%OBJECTIVES.I()%> matches 0 run tellraw @a <%TELLRAW.LOCATOR_COMMAND_FAILED_TO_EXECUTE()%> + } + } + } + + function as_all_locators { + #ARGS: {command: string} + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + data remove storage <%temp_storage%> args + $data modify storage <%temp_storage%> args merge value {command:'$(command)'} + + IF (debug_mode) { + execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> + } + + data_manager prep read + + block zzz/as_all_locators/as_data { + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { + data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.<%locator.storage_name%>.uuid + + IF (debug_mode) { + scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 + } + + block execute_as_uuid { with storage <%temp_storage%> args + IF (debug_mode) { + # If the function successfully instantiated, the provided command is valid. + scoreboard players set #aj.check <%OBJECTIVES.I()%> 1 + } + + $execute as $(uuid) run return run $(command) + } + + IF (debug_mode) { + execute if score #aj.check <%OBJECTIVES.I()%> matches 0 run tellraw @a <%TELLRAW.LOCATOR_COMMAND_FAILED_TO_EXECUTE({text: locator.storage_name, color: 'aqua'})%> + } + } + } + } + + function as_at_all_locators { + #ARGS: {command: string} + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + data remove storage <%temp_storage%> args + $data modify storage <%temp_storage%> args merge value {command:'$(command)'} + + IF (debug_mode) { + execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> + } + + data_manager prep read + + block zzz/as_all_locators/as_data { + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { + data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.<%locator.storage_name%>.uuid + + IF (debug_mode) { + scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 + } + + block execute_as_uuid { with storage <%temp_storage%> args + IF (debug_mode) { + # If the function successfully instantiated, the provided command is valid. + scoreboard players set #aj.check <%OBJECTIVES.I()%> 1 + } + + $execute as $(uuid) at @s run return run $(command) + } + + IF (debug_mode) { + execute if score #aj.check <%OBJECTIVES.I()%> matches 0 run tellraw @a <%TELLRAW.LOCATOR_COMMAND_FAILED_TO_EXECUTE({text: locator.storage_name, color: 'aqua'})%> + } + } + } + } +} + +IF (has_locators) { + function at_locator { + #ARGS: {name: string, command: string} + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + data remove storage <%temp_storage%> args + $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)'} + + IF (debug_mode) { + execute if data storage <%temp_storage%> {args:{name:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('name')%> + execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> + } + + data_manager prep read + + execute at @s run block zzz/at_locator/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args merge from storage <%temp_storage%> entry.data.locators.$(name) + + IF (debug_mode) { + execute unless data storage <%temp_storage%> args.px run return run tellraw @a <%TELLRAW.LOCATOR_NOT_FOUND()%> + scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 + } + + block execute_at_transform { with storage <%temp_storage%> args + IF (debug_mode) { + # If the function successfully instantiated, the provided command is valid. + scoreboard players set #aj.check <%OBJECTIVES.I()%> 1 + } + + $execute \ + positioned ^$(px) ^$(py) ^$(pz) \ + rotated ~$(ry) ~$(rx) \ + run $(command) + } + + IF (debug_mode) { + execute if score #aj.check <%OBJECTIVES.I()%> matches 0 run tellraw @a <%TELLRAW.LOCATOR_COMMAND_FAILED_TO_EXECUTE()%> + } + } + } + + function at_all_locators { + #ARGS: {command: string} + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + data remove storage <%temp_storage%> args + $data modify storage <%temp_storage%> args merge value {command:'$(command)'} + + IF (debug_mode) { + execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> + } + + data_manager prep read + + block zzz/at_all_locators/as_data { + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { + data modify storage <%temp_storage%> args merge from storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + + IF (debug_mode) { + scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 + } + + block execute_at_transform { with storage <%temp_storage%> args + IF (debug_mode) { + # If the function successfully instantiated, the provided command is valid. + scoreboard players set #aj.check <%OBJECTIVES.I()%> 1 + } + + $execute \ + positioned ^$(px) ^$(py) ^$(pz) \ + rotated ~$(ry) ~$(rx) \ + run $(command) + } + + IF (debug_mode) { + execute if score #aj.check <%OBJECTIVES.I()%> matches 0 run tellraw @a <%TELLRAW.LOCATOR_COMMAND_FAILED_TO_EXECUTE({text: locator.storage_name, color: 'aqua'})%> + } + } + } + } +} + +IF (has_cameras) { + function as_camera { + #ARGS: {name: string, command: string} + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + data remove storage <%temp_storage%> args + $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} + + IF (debug_mode) { + execute if data storage <%temp_storage%> {args:{name:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('name')%> + execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> + } + + data_manager prep read + + block zzz/as_camera/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.cameras.$(name).uuid + + IF (debug_mode) { + scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 + } + + block execute_as_uuid { with storage <%temp_storage%> args + IF (debug_mode) { + # If the function successfully instantiated, the provided command is valid. + scoreboard players set #aj.check <%OBJECTIVES.I()%> 1 + } + + $execute as $(uuid) at @s run return run $(command) + + IF (debug_mode) { + # If the entity with the provided UUID doesn't exist, the camera wasn't found. + tellraw @a <%TELLRAW.CAMERA_ENTITY_NOT_FOUND()%> + } + } + + IF (debug_mode) { + execute if score #aj.check <%OBJECTIVES.I()%> matches 0 run tellraw @a <%TELLRAW.CAMERA_COMMAND_FAILED_TO_EXECUTE()%> + } + } + } +} + +function as_root { + #ARGS: {command: string} + execute unless score @s <%OBJECTIVES.ID()%> matches <%-(2**31)%>..<%(2**31)-1%> run return run \ + tellraw @a <%TELLRAW.FUNCTION_NOT_EXECUTED_AS_ENTITY_WITH_ID_SCORE(context.functions.at(-1))%> + + data_manager prep read + + $data modify storage <%temp_storage%> args.command set value '$(command)' + data modify storage <%temp_storage%> args.root_uuid set from storage <%temp_storage%> entry.data.root_uuid + + IF (debug_mode) { + scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 + } + block as_root_entity { with storage <%temp_storage%> args + $execute as $(root_uuid) run $(command) + IF (debug_mode) { + # If the function successfully instantiated, the provided command is valid. + scoreboard players set #aj.check <%OBJECTIVES.I()%> 1 + } + } + IF (debug_mode) { + execute if score #aj.check <%OBJECTIVES.I()%> matches 0 run tellraw @a <%TELLRAW.ROOT_COMMAND_FAILED_TO_EXECUTE()%> + } + +} + +dir remove { + function all { + # Removes all instances of this rig from the world. + execute as @e[type=minecraft:item_display,tag=<%TAGS.PROJECT_ROOT(blueprint_id)%>] run function <%blueprint_id%>/remove/this + } + + function entities { + # Removes all entities related to this rig from the world. + kill @e[tag=<%TAGS.PROJECT_ENTITY(blueprint_id)%>] + } + + function this { + # Removes the rig this function is executed as. + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + <%% + if (on_remove_function) emit.mcb(on_remove_function) + %%> + + IF (has_entity_locators) { + data_manager prep read + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { + IF (locator.config?.on_remove_function) { + IF (locator.config.use_entity) { + block as_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + $execute as $(uuid) at @s run block locator_<%locator.storage_name%>_on_remove { + <%% + emit.mcb(locator.config.on_remove_function) + %%> + } + } + } ELSE { + block at_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + $execute \ + positioned ^$(px) ^$(py) ^$(pz) \ + rotated ~$(ry) ~$(rx) \ + run block locator_<%locator.storage_name%>_on_remove { + <%% + emit.mcb(locator.config.on_remove_function) + %%> + } + } + } + } + } + } + + function ./this/without_on_remove_function + } + + dir this { + function without_on_remove_function { + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + data_manager prep read + + IF (has_entity_locators || has_cameras) { + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { + function animated_java:global/remove/entity_stack_by_uuid with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + } + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { + function animated_java:global/remove/entity_stack_by_uuid with storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> + } + } + + # Remove the rig using the more expensive & thorough method if the rig_hash doesn't match. + execute \ + unless data storage <%temp_storage%> {entry:{data:{rig_hash: '<%rig_hash%>'}}} \ + run function animated_java:global/remove/outdated_rig + + block { with storage <%temp_storage%> entry.data.uuids_by_name + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + $kill $(<%node.storage_name%>) + } + } + + function animated_java:global/remove/entity_stack + } + } +} + +IF (Object.keys(rig.variants).length > 1) { + dir variants { + REPEAT (Object.values(rig.variants)) as variant { + dir <%variant.name%> { + function apply { + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + <%% + global.filteredNodes = Object.values(rig.nodes).filter( + node => ( + node.type === 'bone' && + !variant.excluded_nodes.includes(node.uuid) && + ( // Variant has a model override or a config override for this bone. + variant.models[node.uuid] !== undefined || + node.configs.variants[variant.uuid] !== undefined + ) + ) || ( + BONE_TYPES.includes(node.type) && + !variant.excluded_nodes.includes(node.uuid) && + // Variant has a config override for this node. + node.configs.variants[variant.uuid] !== undefined + ) + ) + %%> + + data_manager prep read + block { with storage <%temp_storage%> entry.data.uuids_by_name + REPEAT (global.filteredNodes) as node { + $execute as $(<%node.storage_name%>) run block zzz/apply_to_node_<%node.storage_name%> { + IF (node.type === 'bone' && variant.models[node.uuid] !== undefined) { + # Special case for `animated_java:empty` model. + IF (variant.models[node.uuid].model === null) { + data modify entity @s item.components."minecraft:custom_model_data".strings[0] set value "AJ_INTERNAL_EMPTY" + } ELSE { + data modify entity @s item.components."minecraft:custom_model_data".strings[0] set value "<%variant.name%>" + } + } + IF (node.configs.variants[variant.uuid]) { + <%% + global.config = DisplayEntityConfig.fromJSON(node.configs.variants[variant.uuid]) + %%> + IF (!global.config.isDefault()) { + data merge entity @s <%global.config.toNBT(undefined, variant.is_default)%> + } + IF (global.config.onApplyFunction) { + <%% + emit.mcb(global.config.onApplyFunction) + %%> + } + } + } + } + } + + # Return success to allow this function to be used in function conditions. + return 1 + } + } + } + } +} + +IF (has_locators || has_cameras) { + dir zzz { + function reset_floating_entities { + IF (has_locators) { + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { + IF (locator.config?.use_entity) { + execute at @s run block set_default_pose/as_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + $tp $(uuid) \ + ^<%roundTo(locator.default_transform.pos[0], 10)%> \ + ^<%roundTo(locator.default_transform.pos[1], 10)%> \ + ^<%roundTo(locator.default_transform.pos[2], 10)%> \ + ~<%roundTo(locator.default_transform.head_rot[1], 10)%> \ + ~<%roundTo(locator.default_transform.head_rot[0], 10)%> + + data modify storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> merge value { \ + px: <%roundTo(locator.default_transform.pos[0], 10)%>, \ + py: <%roundTo(locator.default_transform.pos[1], 10)%>, \ + pz: <%roundTo(locator.default_transform.pos[2], 10)%>, \ + ry: <%roundTo(locator.default_transform.head_rot[1], 10)%>, \ + rx: <%roundTo(locator.default_transform.head_rot[0], 10)%> \ + } + } + } ELSE { + data modify storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> merge value { \ + px: <%roundTo(locator.default_transform.pos[0], 10)%>, \ + py: <%roundTo(locator.default_transform.pos[1], 10)%>, \ + pz: <%roundTo(locator.default_transform.pos[2], 10)%>, \ + ry: <%roundTo(locator.default_transform.head_rot[1], 10)%>, \ + rx: <%roundTo(locator.default_transform.head_rot[0], 10)%> \ + } + } + } + } + + IF (has_cameras) { + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { + execute at @s run block set_default_pose/as_camera_<%camera.storage_name%> { with storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> + $tp $(uuid) \ + ^<%roundTo(camera.default_transform.pos[0], 10)%> \ + ^<%roundTo(camera.default_transform.pos[1], 10)%> \ + ^<%roundTo(camera.default_transform.pos[2], 10)%> \ + ~<%roundTo(camera.default_transform.head_rot[1], 10)%> \ + ~<%roundTo(camera.default_transform.head_rot[0], 10)%> + + data modify storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> merge value { \ + px: <%roundTo(camera.default_transform.pos[0], 10)%>, \ + py: <%roundTo(camera.default_transform.pos[1], 10)%>, \ + pz: <%roundTo(camera.default_transform.pos[2], 10)%>, \ + ry: <%roundTo(camera.default_transform.head_rot[1], 10)%>, \ + rx: <%roundTo(camera.default_transform.head_rot[0], 10)%> \ + } + } + } + } + } + } +} + +dir zzz { + function apply_default_pose { + IF (has_locators || has_cameras) { + function ../zzz/reset_floating_entities + } + + block apply_default_pose_to_nodes { with storage <%temp_storage%> entry.data.uuids_by_name + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + $data merge entity $(<%node.storage_name%>) { \ + transformation: <%matrixToNbtFloatArray(node.default_transform.matrix).toString()%>, \ + start_interpolation: 0 \ + } + } + } + } + + function set_default_pose { + IF (has_locators || has_cameras) { + function ../zzz/reset_floating_entities + } + + block set_default_pose_to_nodes { with storage <%temp_storage%> entry.data.uuids_by_name + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + $data merge entity $(<%node.storage_name%>) { \ + transformation: <%matrixToNbtFloatArray(node.default_transform.matrix).toString()%>, \ + start_interpolation: -1 \ + } + } + } + } +} +function apply_default_pose { + # Changes the pose of the rig to the the default pose with interpolation + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + IF (has_locators || has_cameras) { + data_manager prep read + } + function ./zzz/apply_default_pose +} + +function set_default_pose { + # Changes the pose of the rig to the the default pose without interpolation + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + IF (has_locators || has_cameras) { + data_manager prep read + } + function ./zzz/set_default_pose +} \ No newline at end of file diff --git a/src/systems/datapackCompiler/1.21.5/global.mcb b/src/systems/datapackCompiler/1.21.5/global.mcb index b50f7b78..ec2afdfb 100644 --- a/src/systems/datapackCompiler/1.21.5/global.mcb +++ b/src/systems/datapackCompiler/1.21.5/global.mcb @@ -1,3 +1,6 @@ +# DIFFERENCES FROM 1.21.0: +# - JSON text components are now stored as NBT in entities. + import ./global.mcbt dir global { @@ -10,40 +13,39 @@ dir global { scoreboard players add aj.last_id <%OBJECTIVES.ID()%> 0 - # Purposefully load gu first, as other functions depend on it. + # Enforce loading order. function *global/gu/on_load + function *global/data_manager/on_load function #*global/on_load + IF (debug_mode) { scoreboard players reset * <%OBJECTIVES.IS_RIG_LOADED()%> execute as @e[type=item_display,tag=<%TAGS.GLOBAL_ROOT()%>] at @s run function *global/root/on_load } } - IF (debug_mode) { - function on_tick minecraft:tick { - execute as @e[type=item_display,tag=<%TAGS.GLOBAL_ROOT()%>] at @s run function *global/root/on_tick - } - } ELSE { - function on_tick minecraft:tick { - execute as @e[type=item_display,tag=<%TAGS.GLOBAL_ROOT()%>] at @s run function #*global/root/on_tick - } + function on_tick minecraft:tick { + execute as @e[type=item_display,tag=<%TAGS.GLOBAL_ROOT()%>] at @s run function *global/root/on_tick } tag functions on_load { - *<%export_namespace%>/on_load + <%blueprint_id%>/on_load } dir root { - tag functions on_tick { - *<%export_namespace%>/root/on_tick - } - - IF (debug_mode) { - function on_tick { + function on_tick { + IF (debug_mode) { execute unless score @s <%OBJECTIVES.IS_RIG_LOADED()%> matches 1 run function *global/root/on_load - function #*global/root/on_tick } + data_manager prep read + function *global/root/run_project_tick with storage <%temp_storage%> entry.data + } + + function run_project_tick { + $function $(blueprint_id)/root/on_tick + } + IF (debug_mode) { function on_load { # Check if the rig is outdated by comparing the function's rig_hash of the rig to the rig_hash stored in the entity data. execute if function animated_java:global/util/is_rig_outdated run block outdated_warning/modify_rig { @@ -54,12 +56,16 @@ dir global { execute store result storage <%temp_storage%> args.x double 1 run data get entity @s Pos[0] 1 execute store result storage <%temp_storage%> args.y double 1 run data get entity @s Pos[1] 1 execute store result storage <%temp_storage%> args.z double 1 run data get entity @s Pos[2] 1 - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run { - # Get export namespace - data modify storage <%temp_storage%> args.export_namespace set from entity @s data.export_namespace - # Overwrite the rig hash so the warning doesn't show again. - data modify entity @s data.rig_hash set value '<%rig_hash%>' - } + + # No need to read here, since is_rig_outdated already reads the data. + # data_manager prep read + + # Get export namespace + data modify storage <%temp_storage%> args.blueprint_id set from storage <%temp_storage%> entry.data.blueprint_id + # Overwrite the rig hash so the warning doesn't show again. + data modify storage <%temp_storage%> entry.data.rig_hash set value '<%rig_hash%>' + data_manager write + block print { with storage <%temp_storage%> args $tellraw @a <%TELLRAW.RIG_OUTDATED()%> } @@ -117,20 +123,20 @@ dir global { # Removes locators and cameras owned by the rig, even if they're not included in the currently loaded export. function outdated_rig { - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run block as_data { - data remove storage <%temp_storage%> args - data remove storage <%temp_storage%> uuids - data modify storage <%temp_storage%> uuids set from entity @s data.uuids - execute store result score #aj.length <%OBJECTIVES.I()%> run data get storage <%temp_storage%> uuids - - execute if score #aj.length <%OBJECTIVES.I()%> matches 1.. run block loop_over_uuids { - data modify storage <%temp_storage%> args.current_uuid set from storage <%temp_storage%> uuids[-1].uuid - data remove storage <%temp_storage%> uuids[-1] - function ./entity_stack_by_uuid with storage <%temp_storage%> args - - scoreboard players remove #aj.length <%OBJECTIVES.I()%> 1 - execute if score #aj.length <%OBJECTIVES.I()%> matches 1.. run function ^0 - } + data_manager prep read + + data remove storage <%temp_storage%> args + data remove storage <%temp_storage%> uuids + data modify storage <%temp_storage%> uuids set from entity @s data.uuids + execute store result score #aj.length <%OBJECTIVES.I()%> run data get storage <%temp_storage%> uuids + + execute if score #aj.length <%OBJECTIVES.I()%> matches 1.. run block loop_over_uuids { + data modify storage <%temp_storage%> args.current_uuid set from storage <%temp_storage%> uuids[-1].uuid + data remove storage <%temp_storage%> uuids[-1] + function ./entity_stack_by_uuid with storage <%temp_storage%> args + + scoreboard players remove #aj.length <%OBJECTIVES.I()%> 1 + execute if score #aj.length <%OBJECTIVES.I()%> matches 1.. run function ^0 } function ./entity_stack @@ -149,11 +155,12 @@ dir global { } # Returns 1 if the rig is outdated, else returns 0. function is_rig_outdated { - execute on passengers if entity @s[tag=<%TAGS.GLOBAL_DATA()%>] run return run { with entity @s data + data_manager prep read + block { with storage <%temp_storage%> entry.data # REVIEW - The replace here is a bit hacky. # Because this is a core function, I need to create a generic version of - # project_storage that uses a macro to get the export namespace instead of hardcoding it. - $execute if data storage <%project_storage.replace(export_namespace, '$(export_namespace)')%> {rig_hash:'$(rig_hash)'} run return 0 + # project_storage that uses a macro to get the blueprint ID instead of hardcoding it. + $execute if data storage <%project_storage.replace(blueprint_id, '$(blueprint_id)')%> {rig_hash:'$(rig_hash)'} run return 0 return 1 } } @@ -214,14 +221,40 @@ dir global { } } } -} -dir <%export_namespace%> { - function on_load { - function *<%export_namespace%>/invalid_version_warning - } + # Storage-based per-entity NBT storage. Thanks Xanbelor for the concept! + dir data_manager { + function on_load { + scoreboard players add #aj.data_manager.index <%OBJECTIVES.I()%> 0 + } + + function on_tick minecraft:tick { + execute store result storage <%temp_storage%> args.id int 1 run scoreboard players get #aj.data_manager.index <%OBJECTIVES.I()%> + block { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%data_storage%> "$(id)".uuid + scoreboard players set #success <%OBJECTIVES.I()%> 0 + block { with storage <%temp_storage%> args + $execute store success score #success <%OBJECTIVES.I()%> if score $(uuid) matches 1.. + $execute if score #success <%OBJECTIVES.I()%> matches 0 run data remove storage <%data_storage%> "$(id)" + } + } + scoreboard players add #aj.data_manager.index <%OBJECTIVES.I()%> 1 + execute \ + if score #aj.data_manager.index <%OBJECTIVES.I()%> > aj.last_id <%OBJECTIVES.ID()%> \ + run scoreboard players set #aj.data_manager.index <%OBJECTIVES.I()%> 0 + } - function invalid_version_warning { - tellraw @a <%TELLRAW.INVALID_VERSION()%> + function create_entry { + $data modify storage <%data_storage%> "$(id)" set value {uuid: "$(uuid)", data: {}} + } + + function read { + data remove storage <%temp_storage%> entry + $data modify storage <%temp_storage%> entry set from storage <%data_storage%> "$(id)" + } + + function write { + $data modify storage <%data_storage%> "$(id)" set from storage <%temp_storage%> entry + } } } diff --git a/src/systems/datapackCompiler/1.21.5/static.mcb b/src/systems/datapackCompiler/1.21.5/static.mcb new file mode 100644 index 00000000..207b1af4 --- /dev/null +++ b/src/systems/datapackCompiler/1.21.5/static.mcb @@ -0,0 +1,907 @@ +# TODO - Move all internal functions into an internal namespace, and only have user-facing functions in the main `<%blueprint_id%>` namespace. + +# DIFFERENCES FROM 1.21.4: +# - JSON text components are now stored as NBT in entities. + +function on_load { + data modify storage <%project_storage%> rig_hash set value <%"'" + rig_hash + "'"%> +} + +dir root { + function on_tick { + # Custom pre-tick function + IF (on_pre_tick_function) { + <%% + emit.mcb(on_pre_tick_function) + %%> + } + + IF (auto_update_rig_orientation) { + IF (has_locators || has_cameras) { + function <%blueprint_id%>/root/on_tick/transform_floating_entities + } + + block { with storage <%temp_storage%> entry.data.uuids_by_name + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + $tp $(<%node.storage_name%>) ~ ~ ~ ~ ~ + # Precise Rotation Workaround. Fixes MC-272913. + # Thanks @Triton365! (https://discord.com/channels/154777837382008833/157097006500806656/1402253905408163842) + $execute \ + as $(<%node.storage_name%>) \ + store success entity @s OnGround byte 1 \ + store success score @s <%OBJECTIVES.I()%> \ + unless score @s <%OBJECTIVES.I()%> matches 1 + } + } + } ELSE IF (has_ticking_locators) { + function <%blueprint_id%>/root/on_tick/transform_locators + } + + # Custom post-tick function + IF (on_post_tick_function) { + <%% + emit.mcb(on_post_tick_function) + %%> + } + } + + IF (has_locators || has_cameras) { + dir on_tick { + function transform_locators { + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { + block select_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + IF (locator.config?.use_entity) { + $execute \ + as $(uuid) \ + positioned ^$(px) ^$(py) ^$(pz) \ + rotated ~$(ry) ~$(rx) \ + run block as_locator_<%locator.storage_name%> { + tp @s ~ ~ ~ ~ ~ + + IF (locator.config?.sync_passenger_rotation) { + execute on passengers run rotate @s ~ ~ + } + + IF (locator.config?.on_tick_function) { + <%% + emit.mcb(locator.config.on_tick_function) + %%> + } + } + + IF (locator.config?.sync_passenger_rotation) { + # Precise Rotation Workaround. Fixes MC-272913. + # Thanks @Triton365! (https://discord.com/channels/154777837382008833/157097006500806656/1402253905408163842) + $execute \ + as $(uuid) \ + store success entity @s OnGround byte 1 \ + store success score @s <%OBJECTIVES.I()%> \ + unless score @s <%OBJECTIVES.I()%> matches 1 + } + } ELSE IF (locator.config?.on_tick_function) { + $execute \ + positioned ^$(px) ^$(py) ^$(pz) \ + rotated ~$(ry) ~$(rx) \ + run block at_locator_<%locator.storage_name%> { + <%% + emit.mcb(locator.config.on_tick_function) + %%> + } + } + } + } + } + + function transform_floating_entities { + function ./transform_locators + + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { + block select_camera_<%camera.storage_name%> { with storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> + $execute \ + as $(uuid) \ + positioned ^$(px) ^$(py) ^$(pz) \ + rotated ~$(ry) ~$(rx) \ + run tp @s ~ ~ ~ ~ ~ + # Precise Rotation Workaround. Fixes MC-272913. + # Thanks @Triton365! (https://discord.com/channels/154777837382008833/157097006500806656/1402253905408163842) + $execute \ + as $(uuid) \ + store success entity @s OnGround byte 1 \ + store success score @s <%OBJECTIVES.I()%> \ + unless score @s <%OBJECTIVES.I()%> matches 1 + } + } + } + } + } +} + +IF (!auto_update_rig_orientation) { + function move { + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + tp @s ~ ~ ~ ~ ~ + + data_manager prep read + IF (has_locators || has_cameras) { + function <%blueprint_id%>/root/on_tick/transform_floating_entities + } + + block { with storage <%temp_storage%> entry.data.uuids_by_name + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + $tp $(<%node.storage_name%>) ~ ~ ~ ~ ~ + # Precise Rotation Workaround. Fixes MC-272913. + # Thanks @Triton365! (https://discord.com/channels/154777837382008833/157097006500806656/1402253905408163842) + $execute \ + as $(<%node.storage_name%>) \ + store success entity @s OnGround byte 1 \ + store success score @s <%OBJECTIVES.I()%> \ + unless score @s <%OBJECTIVES.I()%> matches 1 + } + } + } +} ELSE { + function move { + tellraw @a <%TELLRAW.AUTO_UPDATE_RIG_ORIENTATION_MOVE_WARNING()%> + } +} + +function summon { + #Args: {args:{variant: string}} + + data modify storage <%temp_storage%> args set value {variant:''} + $execute store success score #success <%OBJECTIVES.I()%> run data modify storage <%temp_storage%> args set value $(args) + + summon minecraft:item_display ~ ~ ~ { \ + Tags:[ \ + '<%TAGS.NEW()%>', \ + '<%TAGS.GLOBAL_ENTITY()%>', \ + '<%TAGS.GLOBAL_ROOT()%>', \ + '<%TAGS.PROJECT_ENTITY(blueprint_id)%>', \ + '<%TAGS.PROJECT_ROOT(blueprint_id)%>' \ + ], \ + teleport_duration: 0, \ + interpolation_duration: <%interpolation_duration%>, \ + Passengers:<%root_entity_passengers%>, \ + CustomName: <%ENTITY_NAMES.ROOT(blueprint_id)%>, \ + } + execute as @n[ \ + type=minecraft:item_display, \ + tag=<%TAGS.PROJECT_ROOT(blueprint_id)%>, \ + tag=<%TAGS.NEW()%>, \ + distance=..0.01 \ + ] run block zzz/summon/as_root_entity { + execute store result score @s <%OBJECTIVES.ID()%> run scoreboard players add aj.last_id <%OBJECTIVES.ID()%> 1 + + data_manager init prep read + # Data manager init runs gu:get_entity_uuid_string. So we don't need to call it again here. + # function animated_java:global/gu/get_entity_uuid_string + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.root_uuid set from storage <%gu_storage%> out + + data modify storage <%temp_storage%> entry.data.blueprint_id set value "<%blueprint_id%>" + data modify storage <%temp_storage%> entry.data.rig_hash set value "<%rig_hash%>" + + # Align the position and rotation of the root with the command context. + tp @s ~ ~ ~ ~ ~ + + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { + summon <%locator.config.entity_type%> \ + ^<%roundTo(locator.default_transform.pos[0], 10)%> \ + ^<%roundTo(locator.default_transform.pos[1], 10)%> \ + ^<%roundTo(locator.default_transform.pos[2], 10)%> \ + {Tags:<%getNodeTags(locator, rig)%>} + execute \ + as @n[ \ + type=<%locator.config.entity_type%>, \ + tag=<%TAGS.PROJECT_LOCATOR_NAMED(blueprint_id, locator.storage_name)%>, \ + tag=<%TAGS.NEW()%>, \ + distance=..<%Math.ceil(locator.max_distance + 0.5)%> \ + ] \ + run block as_locator/<%locator.storage_name%> { + # run block ../as_locator/<%locator.storage_name%> { + tag @s remove <%TAGS.NEW()%> + data modify entity @s CustomName set value <%ENTITY_NAMES.NODE(blueprint_id, locator.type, locator.storage_name)%> + function animated_java:global/gu/get_entity_uuid_string + scoreboard players operation @s <%OBJECTIVES.ID()%> = aj.last_id <%OBJECTIVES.ID()%> + } + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids_by_name.<%locator.storage_name%> set from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.locators.<%locator.storage_name%>.uuid set from storage <%gu_storage%> out + } + + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { + summon minecraft:item_display \ + ^<%roundTo(camera.default_transform.pos[0], 10)%> \ + ^<%roundTo(camera.default_transform.pos[1], 10)%> \ + ^<%roundTo(camera.default_transform.pos[2], 10)%> \ + {Tags:<%getNodeTags(camera, rig)%>, teleport_duration: 2} + execute \ + as @n[ \ + type=minecraft:item_display, \ + tag=<%TAGS.PROJECT_CAMERA_NAMED(blueprint_id, camera.storage_name)%>, \ + tag=<%TAGS.NEW()%>, \ + distance=..<%Math.ceil(camera.max_distance + 0.5)%> \ + ] \ + run block as_camera/<%camera.storage_name%> { + # run block ../as_camera/<%camera.storage_name%> { + tag @s remove <%TAGS.NEW()%> + data modify entity @s CustomName set value <%ENTITY_NAMES.NODE(blueprint_id, camera.type, camera.storage_name)%> + function animated_java:global/gu/get_entity_uuid_string + scoreboard players operation @s <%OBJECTIVES.ID()%> = aj.last_id <%OBJECTIVES.ID()%> + } + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids_by_name.<%camera.storage_name%> set from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%>.uuid set from storage <%gu_storage%> out + } + + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + execute \ + on passengers \ + if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ + run block as_node/<%node.storage_name%> { + data modify entity @s CustomName set value <%ENTITY_NAMES.NODE(blueprint_id, node.type, node.storage_name)%> + function animated_java:global/gu/get_entity_uuid_string + scoreboard players operation @s <%OBJECTIVES.ID()%> = aj.last_id <%OBJECTIVES.ID()%> + } + + data modify storage <%temp_storage%> entry.data.uuids append from storage <%gu_storage%> out + data modify storage <%temp_storage%> entry.data.uuids_by_name.<%node.storage_name%> set from storage <%gu_storage%> out + } + + IF (has_entity_locators) { + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { + block { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + # Track any custom entities on the locator. + $execute at @s as $(uuid) at @s run function animated_java:global/util/get_entity_stack_uuids + } + data modify storage <%temp_storage%> entry.data.uuids append from storage <%temp_storage%> uuids + } + } + + function <%blueprint_id%>/zzz/set_default_pose + + data_manager write + + # Variant Arguement + IF (Object.keys(rig.variants).length > 1) { + execute if data storage <%temp_storage%> args.variant run block variant_arg/process { with storage <%temp_storage%> args + scoreboard players set #success <%OBJECTIVES.I()%> 0 + # If the variant argument is *explicitly* set to an empty string, return an error. + execute if data storage <%temp_storage%> {args:{variant:''}} run return run block if_empty { + # Tell the user that the variant cannot be empty. + tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('variant')%> + function <%blueprint_id%>/remove/this/without_on_remove_function + } + # Attempt to apply the requested variant. + # We get the success of the `try_apply` function in just in case the user's arguments are *very* wrong. + execute store success score #success <%OBJECTIVES.I()%> run block try_apply { with storage <%temp_storage%> args + $execute if function <%blueprint_id%>/variants/$(variant)/apply run return 1 + # If the apply function fails, the variant doesn't exist, so we return an error. + return fail + } + # If the apply function failed, return an error. + execute unless score #success <%OBJECTIVES.I()%> matches 1 run return run block invalid_variant { + # Tell the user that the provided variant doesn't exist, remove the rig, and list all available variants for this rig. + tellraw @a <%TELLRAW.INVALID_VARIANT(rig.variants)%> + function <%blueprint_id%>/remove/this/without_on_remove_function + } + scoreboard players set #success <%OBJECTIVES.I()%> 1 + } + } ELSE { + execute if data storage <%temp_storage%> args.variant run block zzz/variant_arg/no_variants_warning { + tellraw @a <%TELLRAW.NO_VARIANTS()%> + function <%blueprint_id%>/remove/this/without_on_remove_function + scoreboard players set #success <%OBJECTIVES.I()%> 0 + } + } + execute if score #success <%OBJECTIVES.I()%> matches 0 run return fail + + IF (has_locators || has_cameras) { + function <%blueprint_id%>/root/on_tick/transform_floating_entities + } + execute on passengers run rotate @s ~ ~ + + # Apply teleport duration + data modify entity @s teleport_duration set value <%teleportation_duration%> + execute on passengers run data modify entity @s teleport_duration set value <%teleportation_duration%> + + IF (has_entity_locators) { + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity && node.config.on_summon_function)) as locator { + block { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + $execute at @s as $(uuid) at @s run block on_summon/custom_<%locator.type + '_' + locator.storage_name%> { + <%% + emit.mcb(locator.config.on_summon_function) + %%> + } + } + } + } + + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type) && node.on_summon_function?.trim())) as node { + execute \ + on passengers if entity @s[tag=<%TAGS.PROJECT_NODE_NAMED(blueprint_id, node.storage_name)%>] \ + run block on_summon/<%node.type + '_' + node.storage_name%> { + <%% + emit.mcb(node.on_summon_function.trim()) + %%> + } + } + + IF (on_summon_function) { + execute at @s run block on_summon/rig { + <%% + emit.mcb(on_summon_function) + %%> + } + } + + # Remove the NEW tag from the root entity, and it's passengers. + tag @s remove <%TAGS.NEW()%> + execute on passengers run tag @s remove <%TAGS.NEW()%> + # Dismount bone entities from the root entity. + execute on passengers run ride @s dismount + } +} + +function as_node { + #ARGS: {name: string, command: string} + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + data remove storage <%temp_storage%> args + $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} + + IF (debug_mode) { + execute if data storage <%temp_storage%> {args:{name:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('name')%> + execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> + } + + data_manager prep read + + block zzz/as_node/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.uuids_by_name.$(name) + IF (debug_mode) { + scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 + } + block execute_as_uuid { with storage <%temp_storage%> args + IF (debug_mode) { + # If the function successfully instantiated, the provided command is valid. + scoreboard players set #aj.check <%OBJECTIVES.I()%> 1 + } + $execute as $(uuid) run return run $(command) + IF (debug_mode) { + # If the entity with the provided UUID doesn't exist, the node wasn't found. + tellraw @a <%TELLRAW.NODE_ENTITY_NOT_FOUND()%> + } + } + IF (debug_mode) { + execute if score #aj.check <%OBJECTIVES.I()%> matches 0 run tellraw @a <%TELLRAW.NODE_COMMAND_FAILED_TO_EXECUTE()%> + } + } +} + +IF (has_entity_locators) { + function as_locator { + #ARGS: {name: string, command: string} + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + data remove storage <%temp_storage%> args + $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} + + IF (debug_mode) { + execute if data storage <%temp_storage%> {args:{name:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('name')%> + execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> + } + + data_manager prep read + + block zzz/as_locator/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.$(name).uuid + IF (debug_mode) { + scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 + } + block execute_as_uuid { with storage <%temp_storage%> args + IF (debug_mode) { + # If the function successfully instantiated, the provided command is valid. + scoreboard players set #aj.check <%OBJECTIVES.I()%> 1 + } + $execute as $(uuid) run return run $(command) + IF (debug_mode) { + # If the entity with the provided UUID doesn't exist, the locator wasn't found. + tellraw @a <%TELLRAW.LOCATOR_ENTITY_NOT_FOUND()%> + } + } + IF (debug_mode) { + execute if score #aj.check <%OBJECTIVES.I()%> matches 0 run tellraw @a <%TELLRAW.LOCATOR_COMMAND_FAILED_TO_EXECUTE()%> + } + } + } + + function as_at_locator { + #ARGS: {name: string, command: string} + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + data remove storage <%temp_storage%> args + $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} + + IF (debug_mode) { + execute if data storage <%temp_storage%> {args:{name:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('name')%> + execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> + } + + data_manager prep read + + block zzz/as_locator/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.$(name).uuid + IF (debug_mode) { + scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 + } + block execute_as_uuid { with storage <%temp_storage%> args + IF (debug_mode) { + # If the function successfully instantiated, the provided command is valid. + scoreboard players set #aj.check <%OBJECTIVES.I()%> 1 + } + $execute as $(uuid) at @s run return run $(command) + IF (debug_mode) { + # If the entity with the provided UUID doesn't exist, the locator wasn't found. + tellraw @a <%TELLRAW.LOCATOR_ENTITY_NOT_FOUND()%> + } + } + IF (debug_mode) { + execute if score #aj.check <%OBJECTIVES.I()%> matches 0 run tellraw @a <%TELLRAW.LOCATOR_COMMAND_FAILED_TO_EXECUTE()%> + } + } + } + + function as_all_locators { + #ARGS: {command: string} + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + data remove storage <%temp_storage%> args + $data modify storage <%temp_storage%> args merge value {command:'$(command)'} + + IF (debug_mode) { + execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> + } + + data_manager prep read + + block zzz/as_all_locators/as_data { + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { + data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.<%locator.storage_name%>.uuid + + IF (debug_mode) { + scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 + } + + block execute_as_uuid { with storage <%temp_storage%> args + IF (debug_mode) { + # If the function successfully instantiated, the provided command is valid. + scoreboard players set #aj.check <%OBJECTIVES.I()%> 1 + } + + $execute as $(uuid) run return run $(command) + } + + IF (debug_mode) { + execute if score #aj.check <%OBJECTIVES.I()%> matches 0 run tellraw @a <%TELLRAW.LOCATOR_COMMAND_FAILED_TO_EXECUTE({text: locator.storage_name, color: 'aqua'})%> + } + } + } + } + + function as_at_all_locators { + #ARGS: {command: string} + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + data remove storage <%temp_storage%> args + $data modify storage <%temp_storage%> args merge value {command:'$(command)'} + + IF (debug_mode) { + execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> + } + + data_manager prep read + + block zzz/as_all_locators/as_data { + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { + data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.locators.<%locator.storage_name%>.uuid + + IF (debug_mode) { + scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 + } + + block execute_as_uuid { with storage <%temp_storage%> args + IF (debug_mode) { + # If the function successfully instantiated, the provided command is valid. + scoreboard players set #aj.check <%OBJECTIVES.I()%> 1 + } + + $execute as $(uuid) at @s run return run $(command) + } + + IF (debug_mode) { + execute if score #aj.check <%OBJECTIVES.I()%> matches 0 run tellraw @a <%TELLRAW.LOCATOR_COMMAND_FAILED_TO_EXECUTE({text: locator.storage_name, color: 'aqua'})%> + } + } + } + } +} + +IF (has_locators) { + function at_locator { + #ARGS: {name: string, command: string} + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + data remove storage <%temp_storage%> args + $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)'} + + IF (debug_mode) { + execute if data storage <%temp_storage%> {args:{name:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('name')%> + execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> + } + + data_manager prep read + + execute at @s run block zzz/at_locator/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args merge from storage <%temp_storage%> entry.data.locators.$(name) + + IF (debug_mode) { + execute unless data storage <%temp_storage%> args.px run return run tellraw @a <%TELLRAW.LOCATOR_NOT_FOUND()%> + scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 + } + + block execute_at_transform { with storage <%temp_storage%> args + IF (debug_mode) { + # If the function successfully instantiated, the provided command is valid. + scoreboard players set #aj.check <%OBJECTIVES.I()%> 1 + } + + $execute \ + positioned ^$(px) ^$(py) ^$(pz) \ + rotated ~$(ry) ~$(rx) \ + run $(command) + } + + IF (debug_mode) { + execute if score #aj.check <%OBJECTIVES.I()%> matches 0 run tellraw @a <%TELLRAW.LOCATOR_COMMAND_FAILED_TO_EXECUTE()%> + } + } + } + + function at_all_locators { + #ARGS: {command: string} + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + data remove storage <%temp_storage%> args + $data modify storage <%temp_storage%> args merge value {command:'$(command)'} + + IF (debug_mode) { + execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> + } + + data_manager prep read + + block zzz/at_all_locators/as_data { + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { + data modify storage <%temp_storage%> args merge from storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + + IF (debug_mode) { + scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 + } + + block execute_at_transform { with storage <%temp_storage%> args + IF (debug_mode) { + # If the function successfully instantiated, the provided command is valid. + scoreboard players set #aj.check <%OBJECTIVES.I()%> 1 + } + + $execute \ + positioned ^$(px) ^$(py) ^$(pz) \ + rotated ~$(ry) ~$(rx) \ + run $(command) + } + + IF (debug_mode) { + execute if score #aj.check <%OBJECTIVES.I()%> matches 0 run tellraw @a <%TELLRAW.LOCATOR_COMMAND_FAILED_TO_EXECUTE({text: locator.storage_name, color: 'aqua'})%> + } + } + } + } +} + +IF (has_cameras) { + function as_camera { + #ARGS: {name: string, command: string} + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + data remove storage <%temp_storage%> args + $data modify storage <%temp_storage%> args merge value {name:'$(name)', command:'$(command)', uuid:'+MISSING_UUID+'} + + IF (debug_mode) { + execute if data storage <%temp_storage%> {args:{name:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('name')%> + execute if data storage <%temp_storage%> {args:{command:''}} run return run tellraw @a <%TELLRAW.ARGUMENT_CANNOT_BE_EMPTY('command')%> + } + + data_manager prep read + + block zzz/as_camera/as_data { with storage <%temp_storage%> args + $data modify storage <%temp_storage%> args.uuid set from storage <%temp_storage%> entry.data.cameras.$(name).uuid + + IF (debug_mode) { + scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 + } + + block execute_as_uuid { with storage <%temp_storage%> args + IF (debug_mode) { + # If the function successfully instantiated, the provided command is valid. + scoreboard players set #aj.check <%OBJECTIVES.I()%> 1 + } + + $execute as $(uuid) at @s run return run $(command) + + IF (debug_mode) { + # If the entity with the provided UUID doesn't exist, the camera wasn't found. + tellraw @a <%TELLRAW.CAMERA_ENTITY_NOT_FOUND()%> + } + } + + IF (debug_mode) { + execute if score #aj.check <%OBJECTIVES.I()%> matches 0 run tellraw @a <%TELLRAW.CAMERA_COMMAND_FAILED_TO_EXECUTE()%> + } + } + } +} + +function as_root { + #ARGS: {command: string} + execute unless score @s <%OBJECTIVES.ID()%> matches <%-(2**31)%>..<%(2**31)-1%> run return run \ + tellraw @a <%TELLRAW.FUNCTION_NOT_EXECUTED_AS_ENTITY_WITH_ID_SCORE(context.functions.at(-1))%> + + data_manager prep read + + $data modify storage <%temp_storage%> args.command set value '$(command)' + data modify storage <%temp_storage%> args.root_uuid set from storage <%temp_storage%> entry.data.root_uuid + + IF (debug_mode) { + scoreboard players set #aj.check <%OBJECTIVES.I()%> 0 + } + block as_root_entity { with storage <%temp_storage%> args + $execute as $(root_uuid) run $(command) + IF (debug_mode) { + # If the function successfully instantiated, the provided command is valid. + scoreboard players set #aj.check <%OBJECTIVES.I()%> 1 + } + } + IF (debug_mode) { + execute if score #aj.check <%OBJECTIVES.I()%> matches 0 run tellraw @a <%TELLRAW.ROOT_COMMAND_FAILED_TO_EXECUTE()%> + } + +} + +dir remove { + function all { + # Removes all instances of this rig from the world. + execute as @e[type=minecraft:item_display,tag=<%TAGS.PROJECT_ROOT(blueprint_id)%>] run function <%blueprint_id%>/remove/this + } + + function entities { + # Removes all entities related to this rig from the world. + kill @e[tag=<%TAGS.PROJECT_ENTITY(blueprint_id)%>] + } + + function this { + # Removes the rig this function is executed as. + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + <%% + if (on_remove_function) emit.mcb(on_remove_function) + %%> + + IF (has_entity_locators) { + data_manager prep read + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { + IF (locator.config?.on_remove_function) { + IF (locator.config.use_entity) { + block as_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + $execute as $(uuid) at @s run block locator_<%locator.storage_name%>_on_remove { + <%% + emit.mcb(locator.config.on_remove_function) + %%> + } + } + } ELSE { + block at_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + $execute \ + positioned ^$(px) ^$(py) ^$(pz) \ + rotated ~$(ry) ~$(rx) \ + run block locator_<%locator.storage_name%>_on_remove { + <%% + emit.mcb(locator.config.on_remove_function) + %%> + } + } + } + } + } + } + + function ./this/without_on_remove_function + } + + dir this { + function without_on_remove_function { + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + data_manager prep read + + IF (has_entity_locators || has_cameras) { + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator' && node.config?.use_entity)) as locator { + function animated_java:global/remove/entity_stack_by_uuid with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + } + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { + function animated_java:global/remove/entity_stack_by_uuid with storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> + } + } + + # Remove the rig using the more expensive & thorough method if the rig_hash doesn't match. + execute \ + unless data storage <%temp_storage%> {entry:{data:{rig_hash: '<%rig_hash%>'}}} \ + run function animated_java:global/remove/outdated_rig + + block { with storage <%temp_storage%> entry.data.uuids_by_name + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + $kill $(<%node.storage_name%>) + } + } + + function animated_java:global/remove/entity_stack + } + } +} + +IF (Object.keys(rig.variants).length > 1) { + dir variants { + REPEAT (Object.values(rig.variants)) as variant { + dir <%variant.name%> { + function apply { + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + <%% + global.filteredNodes = Object.values(rig.nodes).filter( + node => ( + node.type === 'bone' && + !variant.excluded_nodes.includes(node.uuid) && + ( // Variant has a model override or a config override for this bone. + variant.models[node.uuid] !== undefined || + node.configs.variants[variant.uuid] !== undefined + ) + ) || ( + BONE_TYPES.includes(node.type) && + !variant.excluded_nodes.includes(node.uuid) && + // Variant has a config override for this node. + node.configs.variants[variant.uuid] !== undefined + ) + ) + %%> + + data_manager prep read + block { with storage <%temp_storage%> entry.data.uuids_by_name + REPEAT (global.filteredNodes) as node { + $execute as $(<%node.storage_name%>) run block zzz/apply_to_node_<%node.storage_name%> { + IF (node.type === 'bone' && variant.models[node.uuid] !== undefined) { + # Special case for `animated_java:empty` model. + IF (variant.models[node.uuid].model === null) { + data modify entity @s item.components."minecraft:custom_model_data".strings[0] set value "AJ_INTERNAL_EMPTY" + } ELSE { + data modify entity @s item.components."minecraft:custom_model_data".strings[0] set value "<%variant.name%>" + } + } + IF (node.configs.variants[variant.uuid]) { + <%% + global.config = DisplayEntityConfig.fromJSON(node.configs.variants[variant.uuid]) + %%> + IF (!global.config.isDefault()) { + data merge entity @s <%global.config.toNBT(undefined, variant.is_default)%> + } + IF (global.config.onApplyFunction) { + <%% + emit.mcb(global.config.onApplyFunction) + %%> + } + } + } + } + } + + # Return success to allow this function to be used in function conditions. + return 1 + } + } + } + } +} + +IF (has_locators || has_cameras) { + dir zzz { + function reset_floating_entities { + IF (has_locators) { + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'locator')) as locator { + IF (locator.config?.use_entity) { + execute at @s run block set_default_pose/as_locator_<%locator.storage_name%> { with storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> + $tp $(uuid) \ + ^<%roundTo(locator.default_transform.pos[0], 10)%> \ + ^<%roundTo(locator.default_transform.pos[1], 10)%> \ + ^<%roundTo(locator.default_transform.pos[2], 10)%> \ + ~<%roundTo(locator.default_transform.head_rot[1], 10)%> \ + ~<%roundTo(locator.default_transform.head_rot[0], 10)%> + + data modify storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> merge value { \ + px: <%roundTo(locator.default_transform.pos[0], 10)%>, \ + py: <%roundTo(locator.default_transform.pos[1], 10)%>, \ + pz: <%roundTo(locator.default_transform.pos[2], 10)%>, \ + ry: <%roundTo(locator.default_transform.head_rot[1], 10)%>, \ + rx: <%roundTo(locator.default_transform.head_rot[0], 10)%> \ + } + } + } ELSE { + data modify storage <%temp_storage%> entry.data.locators.<%locator.storage_name%> merge value { \ + px: <%roundTo(locator.default_transform.pos[0], 10)%>, \ + py: <%roundTo(locator.default_transform.pos[1], 10)%>, \ + pz: <%roundTo(locator.default_transform.pos[2], 10)%>, \ + ry: <%roundTo(locator.default_transform.head_rot[1], 10)%>, \ + rx: <%roundTo(locator.default_transform.head_rot[0], 10)%> \ + } + } + } + } + + IF (has_cameras) { + REPEAT (Object.values(rig.nodes).filter(node => node.type === 'camera')) as camera { + execute at @s run block set_default_pose/as_camera_<%camera.storage_name%> { with storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> + $tp $(uuid) \ + ^<%roundTo(camera.default_transform.pos[0], 10)%> \ + ^<%roundTo(camera.default_transform.pos[1], 10)%> \ + ^<%roundTo(camera.default_transform.pos[2], 10)%> \ + ~<%roundTo(camera.default_transform.head_rot[1], 10)%> \ + ~<%roundTo(camera.default_transform.head_rot[0], 10)%> + + data modify storage <%temp_storage%> entry.data.cameras.<%camera.storage_name%> merge value { \ + px: <%roundTo(camera.default_transform.pos[0], 10)%>, \ + py: <%roundTo(camera.default_transform.pos[1], 10)%>, \ + pz: <%roundTo(camera.default_transform.pos[2], 10)%>, \ + ry: <%roundTo(camera.default_transform.head_rot[1], 10)%>, \ + rx: <%roundTo(camera.default_transform.head_rot[0], 10)%> \ + } + } + } + } + } + } +} + +dir zzz { + function set_default_pose { + IF (has_locators || has_cameras) { + function ../zzz/reset_floating_entities + } + + block set_default_pose_to_nodes { with storage <%temp_storage%> entry.data.uuids_by_name + REPEAT (Object.values(rig.nodes).filter(node => BONE_TYPES.includes(node.type))) as node { + $data merge entity $(<%node.storage_name%>) { \ + transformation: <%matrixToNbtFloatArray(node.default_transform.matrix).toString()%>, \ + start_interpolation: -1 \ + } + } + } + } +} + +function set_default_pose { + # Changes the pose of the rig to the the default pose without interpolation + debug assert executed_as_root_entity <%TAGS.PROJECT_ROOT(blueprint_id)%> + + IF (has_locators || has_cameras) { + data_manager prep read + } + function ./zzz/set_default_pose +} \ No newline at end of file diff --git a/src/systems/datapackCompiler/entityNames.ts b/src/systems/datapackCompiler/entityNames.ts new file mode 100644 index 00000000..9ead9db7 --- /dev/null +++ b/src/systems/datapackCompiler/entityNames.ts @@ -0,0 +1,24 @@ +import { TextComponent } from 'book-and-quill' +import { makeTagSafe } from './tags' + +namespace ENTITY_NAMES { + export const ROOT = (exportNamespace: string) => + new TextComponent([ + '', + { text: makeTagSafe(exportNamespace), color: '#00aced' }, + '.', + { text: 'root', color: 'light_purple' }, + ]).toString(true) + + export const NODE = (exportNamespace: string, type: string, name: string) => + new TextComponent([ + '', + { text: makeTagSafe(exportNamespace), color: '#00aced' }, + '.', + { text: type, color: 'light_purple' }, + '.', + { text: name, color: 'gold' }, + ]).toString(true) +} + +export default ENTITY_NAMES diff --git a/src/systems/datapackCompiler/index.ts b/src/systems/datapackCompiler/index.ts index 623629ea..6c2a511c 100644 --- a/src/systems/datapackCompiler/index.ts +++ b/src/systems/datapackCompiler/index.ts @@ -1,13 +1,18 @@ +import { TextComponent } from 'book-and-quill' import { NbtByte, NbtCompound, NbtFloat, NbtInt, NbtList, NbtString } from 'deepslate/lib/nbt' -import { projectTargetVersionIsAtLeast } from 'src/formats/blueprint' -import { MAX_PROGRESS, PROGRESS, PROGRESS_DESCRIPTION } from '../../interface/dialog/exportProgress' +import type { AsyncZippable } from 'fflate/browser' +import { getFsModule } from '../../constants' +import { + MAX_PROGRESS, + PROGRESS, + PROGRESS_DESCRIPTION, +} from '../../dialogs/exportProgress/exportProgress' +import { projectTargetVersionIsAtLeast } from '../../formats/blueprint' import { DisplayEntityConfig } from '../../nodeConfigs' import { isFunctionTagPath } from '../../util/fileUtil' import { DataPackTag, type FunctionTagJSON, - getDataPackFormat, - getNextSupportedVersion, parseBlock, parseDataPackPath, parseResourceLocation, @@ -16,11 +21,10 @@ import { eulerFromQuaternion, roundTo } from '../../util/misc' import { MSLimiter } from '../../util/msLimiter' import { Variant } from '../../variants' import type { IRenderedAnimation } from '../animationRenderer' -import mcbFiles from '../datapackCompiler/mcbFiles' +import { getMCBFilesByVersion } from '../datapackCompiler/mcbFiles' import { IntentionalExportError } from '../errors' -import { AJMeta, PackMeta, SUPPORTED_MINECRAFT_VERSIONS } from '../global' -import { JsonText } from '../jsonText' -import { JsonTextParser } from '../jsonText/parser' +import { AJMeta, PackMeta } from '../global' +import { getMisodeVersion } from '../minecraft/versionManager' import type { AnyRenderedNode, IRenderedRig } from '../rigRenderer' import { arrayToNbtFloatArray, @@ -28,410 +32,20 @@ import { matrixToNbtFloatArray, replacePathPart, transformationToNbt, + zip, } from '../util' +import ENTITY_NAMES from './entityNames' import { compileMcbProject } from './mcbCompiler' -import { TAGS } from './tags' +import OBJECTIVES from './objectives' +import TAGS, { getNodeTags } from './tags' import TELLRAW from './tellraw' const BONE_TYPES = ['bone', 'text_display', 'item_display', 'block_display'] -namespace OBJECTIVES { - export const I = () => 'aj.i' - export const ID = () => 'aj.id' - export const FRAME = (animationName: string) => `aj.${animationName}.frame` - export const IS_RIG_LOADED = () => 'aj.is_rig_loaded' - export const TWEEN_DURATION = () => 'aj.tween_duration' -} - -function getNodeTags(node: AnyRenderedNode, rig: IRenderedRig): NbtList { - const tags: string[] = [] - - const parentNames: Array<{ name: string; type: string }> = [] - - function recurseParents(n: AnyRenderedNode) { - if (n.parent === 'root') { - // Root is ignored - } else if (n.parent) { - parentNames.push({ - name: rig.nodes[n.parent].storage_name, - type: rig.nodes[n.parent].type, - }) - recurseParents(rig.nodes[n.parent]) - } - } - recurseParents(node) - - const hasParent = node.parent && node.parent !== 'root' - - tags.push( - // Global - TAGS.NEW(), - TAGS.GLOBAL_ENTITY(), - TAGS.GLOBAL_NODE(), - TAGS.GLOBAL_NODE_NAMED(node.storage_name), - // Project - TAGS.PROJECT_ENTITY(Project!.animated_java.export_namespace), - TAGS.PROJECT_NODE(Project!.animated_java.export_namespace), - TAGS.PROJECT_NODE_NAMED(Project!.animated_java.export_namespace, node.storage_name) - ) - - if (!hasParent) { - tags.push(TAGS.GLOBAL_ROOT_CHILD()) - } - switch (node.type) { - case 'bone': { - tags.push( - // Global - TAGS.GLOBAL_DISPLAY_NODE_NAMED(node.storage_name), - TAGS.GLOBAL_BONE(), - TAGS.GLOBAL_BONE_TREE(node.storage_name), // Tree includes self - TAGS.GLOBAL_BONE_TREE_BONE(node.storage_name), // Tree includes self - // Project - TAGS.PROJECT_DISPLAY_NODE_NAMED( - Project!.animated_java.export_namespace, - node.storage_name - ), - TAGS.PROJECT_BONE(Project!.animated_java.export_namespace), - TAGS.PROJECT_BONE_NAMED(Project!.animated_java.export_namespace, node.storage_name), - TAGS.PROJECT_BONE_TREE(Project!.animated_java.export_namespace, node.storage_name), // Tree includes self - TAGS.PROJECT_BONE_TREE_BONE( - Project!.animated_java.export_namespace, - node.storage_name - ) // Tree includes self - ) - if (!hasParent) { - // Nodes without parents are assumed to be root nodes - tags.push(TAGS.GLOBAL_ROOT_CHILD_BONE()) - } else { - tags.push( - // Global - TAGS.GLOBAL_BONE_CHILD(parentNames[0].name), - TAGS.GLOBAL_BONE_CHILD_BONE(parentNames[0].name), - // Project - TAGS.PROJECT_BONE_CHILD( - Project!.animated_java.export_namespace, - parentNames[0].name - ), - TAGS.PROJECT_BONE_CHILD_BONE( - Project!.animated_java.export_namespace, - parentNames[0].name - ) - ) - } - for (const { name } of parentNames) { - tags.push( - // Global - TAGS.GLOBAL_BONE_DECENDANT(name), - TAGS.GLOBAL_BONE_DECENDANT_BONE(name), - TAGS.GLOBAL_BONE_TREE(name), - TAGS.GLOBAL_BONE_TREE_BONE(name), - // Project - TAGS.PROJECT_BONE_DECENDANT(Project!.animated_java.export_namespace, name), - TAGS.PROJECT_BONE_DECENDANT_BONE(Project!.animated_java.export_namespace, name), - TAGS.PROJECT_BONE_TREE(Project!.animated_java.export_namespace, name), - TAGS.PROJECT_BONE_TREE_BONE(Project!.animated_java.export_namespace, name) - ) - } - break - } - case 'item_display': { - tags.push( - // Global - TAGS.GLOBAL_DISPLAY_NODE_NAMED(node.storage_name), - TAGS.GLOBAL_ITEM_DISPLAY(), - // Project - TAGS.PROJECT_DISPLAY_NODE_NAMED( - Project!.animated_java.export_namespace, - node.storage_name - ), - TAGS.PROJECT_ITEM_DISPLAY(Project!.animated_java.export_namespace), - TAGS.PROJECT_ITEM_DISPLAY_NAMED( - Project!.animated_java.export_namespace, - node.storage_name - ) - ) - if (!hasParent) { - // Nodes without parents are assumed to be root nodes - tags.push(TAGS.GLOBAL_ROOT_CHILD_ITEM_DISPLAY()) - } else { - tags.push( - // Global - TAGS.GLOBAL_BONE_CHILD(parentNames[0].name), - TAGS.GLOBAL_BONE_CHILD_ITEM_DISPLAY(parentNames[0].name), - // Project - TAGS.PROJECT_BONE_CHILD( - Project!.animated_java.export_namespace, - parentNames[0].name - ), - TAGS.PROJECT_BONE_CHILD_ITEM_DISPLAY( - Project!.animated_java.export_namespace, - parentNames[0].name - ) - ) - } - for (const { name } of parentNames) { - tags.push( - // Global - TAGS.GLOBAL_BONE_DECENDANT(name), - TAGS.GLOBAL_BONE_DECENDANT_ITEM_DISPLAY(name), - TAGS.GLOBAL_BONE_TREE(name), - // Project - TAGS.PROJECT_BONE_DECENDANT(Project!.animated_java.export_namespace, name), - TAGS.PROJECT_BONE_DECENDANT_ITEM_DISPLAY( - Project!.animated_java.export_namespace, - name - ), - TAGS.PROJECT_BONE_TREE(Project!.animated_java.export_namespace, name) - ) - } - break - } - case 'block_display': { - tags.push( - // Global - TAGS.GLOBAL_DISPLAY_NODE_NAMED(node.storage_name), - TAGS.GLOBAL_BLOCK_DISPLAY(), - // Project - TAGS.PROJECT_DISPLAY_NODE_NAMED( - Project!.animated_java.export_namespace, - node.storage_name - ), - TAGS.PROJECT_BLOCK_DISPLAY(Project!.animated_java.export_namespace), - TAGS.PROJECT_BLOCK_DISPLAY_NAMED( - Project!.animated_java.export_namespace, - node.storage_name - ) - ) - if (!hasParent) { - // Nodes without parents are assumed to be root nodes - tags.push(TAGS.GLOBAL_ROOT_CHILD_BLOCK_DISPLAY()) - } else { - tags.push( - // Global - TAGS.GLOBAL_BONE_CHILD(parentNames[0].name), - TAGS.GLOBAL_BONE_CHILD_BLOCK_DISPLAY(parentNames[0].name), - // Project - TAGS.PROJECT_BONE_CHILD( - Project!.animated_java.export_namespace, - parentNames[0].name - ), - TAGS.PROJECT_BONE_CHILD_BLOCK_DISPLAY( - Project!.animated_java.export_namespace, - parentNames[0].name - ) - ) - } - for (const { name } of parentNames) { - tags.push( - // Global - TAGS.GLOBAL_BONE_DECENDANT(name), - TAGS.GLOBAL_BONE_DECENDANT_BLOCK_DISPLAY(name), - TAGS.GLOBAL_BONE_TREE(name), - // Project - TAGS.PROJECT_BONE_DECENDANT(Project!.animated_java.export_namespace, name), - TAGS.PROJECT_BONE_DECENDANT_BLOCK_DISPLAY( - Project!.animated_java.export_namespace, - name - ), - TAGS.PROJECT_BONE_TREE(Project!.animated_java.export_namespace, name) - ) - } - break - } - case 'text_display': { - tags.push( - // Global - TAGS.GLOBAL_DISPLAY_NODE_NAMED(node.storage_name), - TAGS.GLOBAL_TEXT_DISPLAY(), - // Project - TAGS.PROJECT_DISPLAY_NODE_NAMED( - Project!.animated_java.export_namespace, - node.storage_name - ), - TAGS.PROJECT_TEXT_DISPLAY(Project!.animated_java.export_namespace), - TAGS.PROJECT_TEXT_DISPLAY_NAMED( - Project!.animated_java.export_namespace, - node.storage_name - ) - ) - if (!hasParent) { - // Nodes without parents are assumed to be root nodes - tags.push(TAGS.GLOBAL_ROOT_CHILD_TEXT_DISPLAY()) - } else { - tags.push( - // Global - TAGS.GLOBAL_BONE_CHILD(parentNames[0].name), - TAGS.GLOBAL_BONE_CHILD_TEXT_DISPLAY(parentNames[0].name), - // Project - TAGS.PROJECT_BONE_CHILD( - Project!.animated_java.export_namespace, - parentNames[0].name - ), - TAGS.PROJECT_BONE_CHILD_TEXT_DISPLAY( - Project!.animated_java.export_namespace, - parentNames[0].name - ) - ) - } - for (const { name } of parentNames) { - tags.push( - // Global - TAGS.GLOBAL_BONE_DECENDANT(name), - TAGS.GLOBAL_BONE_DECENDANT_TEXT_DISPLAY(name), - TAGS.GLOBAL_BONE_TREE(name), - // Project - TAGS.PROJECT_BONE_DECENDANT(Project!.animated_java.export_namespace, name), - TAGS.PROJECT_BONE_DECENDANT_TEXT_DISPLAY( - Project!.animated_java.export_namespace, - name - ), - TAGS.PROJECT_BONE_TREE(Project!.animated_java.export_namespace, name) - ) - } - break - } - case 'locator': { - tags.push( - // Global - TAGS.GLOBAL_LOCATOR(), - // Project - TAGS.PROJECT_LOCATOR(Project!.animated_java.export_namespace), - TAGS.PROJECT_LOCATOR_NAMED( - Project!.animated_java.export_namespace, - node.storage_name - ) - ) - if (!hasParent) { - // Nodes without parents are assumed to be root nodes - tags.push(TAGS.GLOBAL_ROOT_CHILD_LOCATOR()) - } else { - tags.push( - // Global - TAGS.GLOBAL_BONE_CHILD(parentNames[0].name), - TAGS.GLOBAL_BONE_CHILD_LOCATOR(parentNames[0].name), - // Project - TAGS.PROJECT_BONE_CHILD( - Project!.animated_java.export_namespace, - parentNames[0].name - ), - TAGS.PROJECT_BONE_CHILD_LOCATOR( - Project!.animated_java.export_namespace, - parentNames[0].name - ) - ) - } - for (const { name } of parentNames) { - tags.push( - // Global - TAGS.GLOBAL_BONE_DECENDANT(name), - TAGS.GLOBAL_BONE_DECENDANT_LOCATOR(name), - TAGS.GLOBAL_BONE_TREE(name), - // Project - TAGS.PROJECT_BONE_DECENDANT(Project!.animated_java.export_namespace, name), - TAGS.PROJECT_BONE_DECENDANT_LOCATOR( - Project!.animated_java.export_namespace, - name - ), - TAGS.PROJECT_BONE_TREE(Project!.animated_java.export_namespace, name) - ) - } - break - } - case 'camera': { - tags.push( - // Global - TAGS.GLOBAL_CAMERA(), - // Project - TAGS.PROJECT_CAMERA(Project!.animated_java.export_namespace), - TAGS.PROJECT_CAMERA_NAMED( - Project!.animated_java.export_namespace, - node.storage_name - ) - ) - if (!hasParent) { - // Nodes without parents are assumed to be root nodes - tags.push(TAGS.GLOBAL_ROOT_CHILD_CAMERA()) - } else { - tags.push( - // Global - TAGS.GLOBAL_BONE_CHILD(parentNames[0].name), - TAGS.GLOBAL_BONE_CHILD_CAMERA(parentNames[0].name), - // Project - TAGS.PROJECT_BONE_CHILD( - Project!.animated_java.export_namespace, - parentNames[0].name - ), - TAGS.PROJECT_BONE_CHILD_CAMERA( - Project!.animated_java.export_namespace, - parentNames[0].name - ) - ) - } - for (const { name } of parentNames) { - tags.push( - // Global - TAGS.GLOBAL_BONE_DECENDANT(name), - TAGS.GLOBAL_BONE_DECENDANT_CAMERA(name), - TAGS.GLOBAL_BONE_TREE(name), - // Project - TAGS.PROJECT_BONE_DECENDANT(Project!.animated_java.export_namespace, name), - TAGS.PROJECT_BONE_DECENDANT_CAMERA( - Project!.animated_java.export_namespace, - name - ), - TAGS.PROJECT_BONE_TREE(Project!.animated_java.export_namespace, name) - ) - } - break - } - default: { - throw new IntentionalExportError( - `Attempted to get tags for an unknown node type: '${node.type}'!` - ) - } - } - - return new NbtList(tags.sort().map(v => new NbtString(v))) -} - -async function generateRootEntityPassengers( - version: SUPPORTED_MINECRAFT_VERSIONS, - rig: IRenderedRig, - rigHash: string -) { +async function generateRootEntityPassengers(version: string, rig: IRenderedRig) { const aj = Project!.animated_java const passengers: NbtList = new NbtList() - const dataEntity = new NbtCompound() - - if (!compareVersions('1.21.5', version) /* >= 1.21.5 */) { - dataEntity.set('id', new NbtString('minecraft:item_display')) - } else if (!compareVersions('1.20.4', version) /* >= 1.20.4 */) { - dataEntity.set('id', new NbtString('minecraft:marker')) - } else { - throw new Error(`Minecraft version is below minimum supported version 1.20.4!`) - } - - passengers.add( - dataEntity - .set( - 'Tags', - new NbtList([ - new NbtString(TAGS.NEW()), - new NbtString(TAGS.GLOBAL_ENTITY()), - new NbtString(TAGS.GLOBAL_DATA()), - new NbtString(TAGS.PROJECT_ENTITY(aj.export_namespace)), - new NbtString(TAGS.PROJECT_DATA(aj.export_namespace)), - ]) - ) - .set( - 'data', - new NbtCompound() - .set('rig_hash', new NbtString(rigHash)) - .set('export_namespace', new NbtString(aj.export_namespace)) - ) - ) - for (const [uuid, node] of Object.entries(rig.nodes)) { if (node.type === 'struct') continue @@ -519,7 +133,7 @@ async function generateRootEntityPassengers( case 'text_display': { passenger .set('id', new NbtString('minecraft:text_display')) - .set('background', new NbtInt(JsonText.hexToInt(node.background_color))) + .set('background', new NbtInt(TextComponent.hexToInt(node.background_color))) .set('line_width', new NbtInt(node.line_width)) .set('shadow', new NbtByte(node.shadow ? 1 : 0)) .set('see_through', new NbtByte(node.see_through ? 1 : 0)) @@ -539,9 +153,9 @@ async function generateRootEntityPassengers( 'text', // String JSON text format new NbtString( - new JsonTextParser({ minecraftVersion: version }) - .parse(node.text) - .toString(true, version) + TextComponent.fromString(node.text, { + minecraftVersion: version, + }).toString(true, version) ) ) } else { @@ -612,9 +226,10 @@ async function generateRootEntityPassengers( for (const display of Object.values(rig.nodes).filter(n => n.type === 'text_display')) { result = result.replace( '"$$$' + display.type + '_' + display.storage_name + '_text_placeholder$$$"', - new JsonTextParser({ minecraftVersion: version }) - .parse(display.text) - .toString(true, version) + TextComponent.fromString(display.text, { minecraftVersion: version }).toString( + true, + version + ) ) } } @@ -636,7 +251,7 @@ async function createAnimationStorage(rig: IRenderedRig, animations: IRenderedAn let frames = new NbtCompound() const addFrameDataCommand = () => { const str = `data modify storage animated_java:${ - Project!.animated_java.export_namespace + Project!.animated_java.blueprint_id }/animations ${animation.storage_name} merge value ${frames.toString()}` dataCommands.push(str) frames = new NbtCompound() @@ -709,7 +324,7 @@ function nodeSorter(a: AnyRenderedNode, b: AnyRenderedNode): number { interface DataPackCompilerOptions { ajmeta: AJMeta - version: SUPPORTED_MINECRAFT_VERSIONS + version: string coreFiles: Map versionedFiles: Map rig: IRenderedRig @@ -730,18 +345,15 @@ interface CompileDataPackOptions { debugMode: boolean } -export default async function compileDataPack( - targetVersions: SUPPORTED_MINECRAFT_VERSIONS[], - options: CompileDataPackOptions -) { +export default async function compileDataPack(version: string, options: CompileDataPackOptions) { console.time('Data Pack Compilation took') const aj = Project!.animated_java const ajmeta = new AJMeta( PathModule.join(options.dataPackFolder, 'data.ajmeta'), - aj.export_namespace, - Project!.last_used_export_namespace, + aj.blueprint_id, + Project!.last_used_blueprint_id, options.dataPackFolder ) @@ -753,88 +365,55 @@ export default async function compileDataPack( const globalVersionSpecificFiles = new Map() const coreDataPackFolder = options.dataPackFolder - for (const version of targetVersions) { - console.groupCollapsed(`Compiling data pack for Minecraft ${version}`) - const coreFiles = new Map() - const versionedFiles = new Map() - - const versionedDataPackFolder = - targetVersions.length > 1 - ? PathModule.join( - options.dataPackFolder, - `animated_java_${version.replaceAll('.', '_')}` - ) - : coreDataPackFolder - - await dataPackCompiler({ - ...options, - ajmeta, - version, - coreFiles, - versionedFiles, - }) + console.groupCollapsed(`Compiling data pack for Minecraft ${version}`) + const coreFiles = new Map() + const versionedFiles = new Map() - for (const [path, file] of coreFiles) { - const relative = PathModule.join(coreDataPackFolder, path) - globalCoreFiles.set(relative, file) - if (file.includeInAJMeta === false) continue - ajmeta.coreFiles.add(relative) - } + await dataPackCompiler({ + ...options, + ajmeta, + version, + coreFiles, + versionedFiles, + }) - for (const [path, file] of versionedFiles) { - const relative = PathModule.join(versionedDataPackFolder, path) - globalVersionSpecificFiles.set(relative, file) - if (file.includeInAJMeta === false) continue - ajmeta.versionedFiles.add(relative) - } + for (const [path, file] of coreFiles) { + const relative = PathModule.join(coreDataPackFolder, path) + globalCoreFiles.set(relative, file) + if (file.includeInAJMeta === false) continue + ajmeta.coreFiles.add(relative) + } - console.groupEnd() + for (const [path, file] of versionedFiles) { + const relative = PathModule.join(coreDataPackFolder, path) + globalVersionSpecificFiles.set(relative, file) + if (file.includeInAJMeta === false) continue + ajmeta.versionedFiles.add(relative) } + console.groupEnd() + console.log('Exported Files:', globalCoreFiles.size + globalVersionSpecificFiles.size) const packMetaPath = PathModule.join(options.dataPackFolder, 'pack.mcmeta') const packMeta = PackMeta.fromFile(packMetaPath) packMeta.content.pack ??= {} - const nextVersion = getNextSupportedVersion(targetVersions[0]) - const format = getDataPackFormat(targetVersions[0]) - const nextFormat = nextVersion ? getDataPackFormat(nextVersion) : 10000000 - if (!compareVersions('1.21.9', targetVersions[0]) /* >= 1.21.9 */) { + const misodeVersionData = await getMisodeVersion(version) + const format = misodeVersionData.data_pack_version + + if (VersionUtil.compare(version, '>=', '1.21.9')) { packMeta.content.pack.min_format = format - packMeta.content.pack.max_format = nextFormat - 1 + packMeta.content.pack.max_format = format } else { packMeta.content.pack.pack_format = format packMeta.content.pack.supported_formats = { min_inclusive: format, - max_inclusive: nextFormat - 1, + max_inclusive: format, } } - packMeta.content.pack.description ??= `Animated Java Data Pack for ${targetVersions.join(', ')}` - - // if (targetVersions.length > 1) { - // packMeta.content.pack.supported_formats = [] - // packMeta.content.overlays ??= {} - // packMeta.content.overlays.entries ??= [] - - // for (const version of targetVersions) { - // const format: PackMetaFormats = getDataPackFormat(version) - // packMeta.content.pack.supported_formats.push(format) - - // const existingOverlay = packMeta.content.overlays.entries.find( - // e => e.directory === `animated_java_${version.replaceAll('.', '_')}` - // ) - // if (!existingOverlay) { - // packMeta.content.overlays.entries.push({ - // directory: `animated_java_${version.replaceAll('.', '_')}`, - // formats: format, - // }) - // } else { - // existingOverlay.formats = format - // } - // } - // } + packMeta.content.pack.description ??= `Animated Java Data Pack for ${version}` globalCoreFiles.set(PathModule.join(options.dataPackFolder, 'pack.mcmeta'), { content: autoStringify(packMeta.toJSON()), @@ -857,6 +436,32 @@ export default async function compileDataPack( console.time('Writing DataPack Files took') await writeFiles(exportedFiles, options.dataPackFolder) console.timeEnd('Writing DataPack Files took') + } else if (aj.data_pack_export_mode === 'zip') { + const data: AsyncZippable = {} + + for (const [path, file] of coreFiles.entries()) { + const content = Uint8Array.from( + typeof file.content === 'string' ? Buffer.from(file.content) : file.content + ) + data[path] = content + } + + for (const [path, file] of versionedFiles.entries()) { + const content = Uint8Array.from( + typeof file.content === 'string' ? Buffer.from(file.content) : file.content + ) + data[path] = content + } + + data['pack.mcmeta'] = Uint8Array.from( + Buffer.from(autoStringify(packMeta.toJSON()), 'utf-8') + ) + + const { rm, writeFile } = getFsModule().promises + + await rm(options.dataPackFolder, { recursive: true, force: true }) + const zipped = await zip(data, {}) + await writeFile(options.dataPackFolder, zipped) } console.timeEnd('Data Pack Compilation took') @@ -865,35 +470,34 @@ export default async function compileDataPack( async function removeFiles(ajmeta: AJMeta) { console.time('Removing Files took') const aj = Project!.animated_java + const { existsSync, promises } = getFsModule() + const { rm, writeFile, mkdir, copyFile, unlink, readFile } = promises + if (aj.data_pack_export_mode === 'folder') { PROGRESS_DESCRIPTION.set('Removing Old Data Pack Files...') PROGRESS.set(0) MAX_PROGRESS.set(ajmeta.previousVersionedFiles.size) const removedFolders = new Set() for (const file of ajmeta.previousVersionedFiles) { - if (isFunctionTagPath(file) && fs.existsSync(file)) { - if (aj.export_namespace !== Project!.last_used_export_namespace) { + if (isFunctionTagPath(file) && existsSync(file)) { + if (aj.blueprint_id !== Project!.last_used_blueprint_id) { const resourceLocation = parseDataPackPath(file)!.resourceLocation - if ( - resourceLocation.startsWith( - `animated_java:${Project!.last_used_export_namespace}/` - ) - ) { + if (resourceLocation.startsWith(`${Project!.last_used_blueprint_id}/`)) { const newPath = replacePathPart( file, - Project!.last_used_export_namespace, - aj.export_namespace + Project!.last_used_blueprint_id, + aj.blueprint_id ) - await fs.promises.mkdir(PathModule.dirname(newPath), { recursive: true }) - await fs.promises.copyFile(file, newPath) - await fs.promises.unlink(file) + await mkdir(PathModule.dirname(newPath), { recursive: true }) + await copyFile(file, newPath) + await unlink(file) } } // Remove mentions of the export namespace from the file let content: FunctionTagJSON // Remove mentions of the export namespace from the file try { - content = JSON.parse((await fs.promises.readFile(file)).toString()) + content = JSON.parse((await readFile(file)).toString()) } catch (e) { if (e instanceof SyntaxError) { throw new IntentionalExportError( @@ -905,21 +509,21 @@ async function removeFiles(ajmeta: AJMeta) { content.values = content.values.filter( v => typeof v === 'string' && - (!v.startsWith(`animated_java:${aj.export_namespace}/`) || - !v.startsWith(`animated_java:${Project!.last_used_export_namespace}/`)) + (!v.startsWith(`${aj.blueprint_id}/`) || + !v.startsWith(`${Project!.last_used_blueprint_id}/`)) ) - await fs.promises.writeFile(file, autoStringify(content)) + await writeFile(file, autoStringify(content)) } else { // Delete the file - if (fs.existsSync(file)) await fs.promises.unlink(file) + if (existsSync(file)) await unlink(file) } let folder = PathModule.dirname(file) while ( !removedFolders.has(folder) && - fs.existsSync(folder) && - (await fs.promises.readdir(folder)).length === 0 + existsSync(folder) && + (await promises.readdir(folder)).length === 0 ) { - await fs.promises.rm(folder, { recursive: true }) + await rm(folder, { recursive: true }) removedFolders.add(folder) folder = PathModule.dirname(folder) } @@ -940,22 +544,31 @@ const dataPackCompiler: DataPackCompiler = async ({ animationHash, debugMode, }) => { - JsonText.defaultMinecraftVersion = version + TextComponent.defaultMinecraftVersion = version const aj = Project!.animated_java const isStatic = animations.length === 0 + + const parsed = parseResourceLocation(aj.blueprint_id) + const relativePathToSrc = parsed.path + .split('/') + .map(() => '..') + .join('/') + const variables = { - export_namespace: aj.export_namespace, + relativePathToSrc, + blueprint_id: aj.blueprint_id, interpolation_duration: aj.interpolation_duration, teleportation_duration: aj.teleportation_duration, display_item: aj.display_item, rig, animations, export_version: Math.random().toString().substring(2, 10), - root_entity_passengers: await generateRootEntityPassengers(version, rig, rigHash), + root_entity_passengers: await generateRootEntityPassengers(version, rig), TAGS, OBJECTIVES, TELLRAW, + ENTITY_NAMES, on_summon_function: aj.on_summon_function, on_remove_function: aj.on_remove_function, on_pre_tick_function: aj.on_pre_tick_function, @@ -984,20 +597,23 @@ const dataPackCompiler: DataPackCompiler = async ({ is_static: isStatic, getNodeTags, BONE_TYPES, - project_storage: `animated_java:${aj.export_namespace}`, + project_storage: `${aj.blueprint_id}`, temp_storage: `animated_java:temp`, gu_storage: `animated_java:gu`, + data_storage: `animated_java:data`, auto_update_rig_orientation: aj.auto_update_rig_orientation, debug_mode: debugMode, } - compileMcbProject({ + const mcbFiles = getMCBFilesByVersion(version) + + await compileMcbProject({ sourceFiles: { - 'src/global.mcbt': mcbFiles[version].globalTemplates, - 'src/animated_java.mcb': mcbFiles[version].global, - [`src/animated_java/${aj.export_namespace}.mcb`]: isStatic - ? mcbFiles[version].static - : mcbFiles[version].animation, + 'src/global.mcbt': mcbFiles.globalTemplates, + 'src/animated_java.mcb': mcbFiles.global, + [`src/${parsed.fullPath}.mcb`]: + `import ${relativePathToSrc}/global.mcbt\n` + + (isStatic ? mcbFiles.static : mcbFiles.animation), }, destPath: '.', variables, @@ -1011,26 +627,29 @@ async function writeFiles(exportedFiles: Map, dataPackFold PROGRESS.set(0) MAX_PROGRESS.set(exportedFiles.size) const aj = Project!.animated_java - const lastNamespace = Project!.last_used_export_namespace + const lastNamespace = Project!.last_used_blueprint_id const createdFolderCache = new Set() const functionTagQueue = new Map() - async function writeFile(path: string, file: ExportedFile) { - if (isFunctionTagPath(path) && fs.existsSync(path)) { + const { existsSync, readdirSync, promises } = getFsModule() + const { mkdir, readFile, writeFile } = promises + + async function customWriteFile(path: string, file: ExportedFile) { + if (isFunctionTagPath(path) && existsSync(path)) { functionTagQueue.set(path, file) return } const folder = PathModule.dirname(path) if (!createdFolderCache.has(folder)) { - await fs.promises.mkdir(folder, { recursive: true }) + await mkdir(folder, { recursive: true }) createdFolderCache.add(folder) } if (file.writeHandler) { await file.writeHandler(path, file.content) } else { - await fs.promises.writeFile( + await writeFile( path, new Uint8Array( Buffer.isBuffer(file.content) ? file.content : Buffer.from(file.content) @@ -1045,7 +664,7 @@ async function writeFiles(exportedFiles: Map, dataPackFold for (const [path, data] of exportedFiles) { writeQueue.set( path, - writeFile(path, data).finally(() => { + customWriteFile(path, data).finally(() => { writeQueue.delete(path) }) ) @@ -1059,18 +678,16 @@ async function writeFiles(exportedFiles: Map, dataPackFold MAX_PROGRESS.set(functionTagQueue.size) PROGRESS.set(0) for (const [path, file] of functionTagQueue.entries()) { - const oldTag = DataPackTag.fromJSON(JSON.parse(fs.readFileSync(path, 'utf-8'))) + const oldTag = DataPackTag.fromJSON(JSON.parse((await readFile(path)).toString())) const merged = oldTag.merge(DataPackTag.fromJSON(JSON.parse(file.content.toString()))) merged.filter(entry => { const id = DataPackTag.getEntryId(entry) const isTag = id.startsWith('#') const location = parseResourceLocation(isTag ? id.substring(1) : id) - // Ignore entries unrelated to Animated Java - if (location.namespace !== 'animated_java') return true // Remove last namespace entries if the namespace has changed - if (aj.export_namespace !== lastNamespace && location.namespace === lastNamespace) + if (aj.blueprint_id !== lastNamespace && location.namespace === lastNamespace) return false // Search for the entry in all data folders @@ -1080,7 +697,7 @@ async function writeFiles(exportedFiles: Map, dataPackFold const subPath = (isTag ? 'tags/' : '') + functionFolderName const extension = isTag ? '.json' : '.mcfunction' - for (const folder of fs.readdirSync(dataPackFolder)) { + for (const folder of readdirSync(dataPackFolder)) { const fullPath = PathModule.join( dataPackFolder, folder, @@ -1089,7 +706,7 @@ async function writeFiles(exportedFiles: Map, dataPackFold location.path + extension ) - if (fs.existsSync(fullPath)) return true + if (existsSync(fullPath)) return true } console.warn( @@ -1103,7 +720,7 @@ async function writeFiles(exportedFiles: Map, dataPackFold merged.sort() - await fs.promises.writeFile(path, autoStringify(merged.toJSON())) + await writeFile(path, autoStringify(merged.toJSON())) PROGRESS.set(PROGRESS.get() + 1) } } diff --git a/src/systems/datapackCompiler/mcbCompiler.ts b/src/systems/datapackCompiler/mcbCompiler.ts index 5ca30fbc..b2564dc9 100644 --- a/src/systems/datapackCompiler/mcbCompiler.ts +++ b/src/systems/datapackCompiler/mcbCompiler.ts @@ -1,18 +1,19 @@ -import { Compiler, Parser, SyncIo, Tokenizer } from 'mc-build' -import { VariableMap } from 'mc-build/dist/mcl/Compiler' -import { getDataPackFormat } from '../../util/minecraftUtil' -import { SUPPORTED_MINECRAFT_VERSIONS } from '../global' +import { Compiler, VariableMap } from 'mc-build/mcl/Compiler' +import { Parser } from 'mc-build/mcl/Parser' +import { TemplateRegisterer } from 'mc-build/mcl/TemplateRegisterer' +import { Tokenizer } from 'mc-build/mcl/TokenizerImpl' +import { getMisodeVersion } from '../minecraft/versionManager' import type { ExportedFile } from '../util' interface CompilerOptions { sourceFiles: Record destPath: string variables: Record - version: SUPPORTED_MINECRAFT_VERSIONS + version: string exportedFiles: Map } -export function compileMcbProject({ +export async function compileMcbProject({ sourceFiles, destPath, variables, @@ -22,6 +23,10 @@ export function compileMcbProject({ console.group('Compiling', sourceFiles) console.log('Variables:', variables) + TemplateRegisterer.register() + + const misodeVersionData = await getMisodeVersion(version) + const compiler = new Compiler('src', { libDir: null, generatedDirName: 'zzz', @@ -32,22 +37,21 @@ export function compileMcbProject({ ioThreadCount: null, dontEmitComments: true, setup: null, - formatVersion: getDataPackFormat(version), + formatVersion: misodeVersionData.data_pack_version, }) compiler.disableRequire = true - function createSyncIO() { - const io = new SyncIo() - io.write = (localPath, content) => { + compiler.io = { + cleanup: () => undefined, + finished: () => true, + write: (localPath, content) => { const writePath = PathModule.join(destPath, localPath) exportedFiles.set(writePath, { content, includeInAJMeta: true, }) - } - return io + }, } - compiler.io = createSyncIO() console.time('MC-Build compiled in') diff --git a/src/systems/datapackCompiler/mcbFiles.ts b/src/systems/datapackCompiler/mcbFiles.ts index 924d130f..0796dcc8 100644 --- a/src/systems/datapackCompiler/mcbFiles.ts +++ b/src/systems/datapackCompiler/mcbFiles.ts @@ -1,4 +1,3 @@ -import { SUPPORTED_MINECRAFT_VERSIONS } from '../global' // FIXME - Figure out how to import these files dynamically and generate the MCB_FILES object automatically. import ANIMATION_1_20_4 from './1.20.4/animation.mcb' import GLOBAL_1_20_4 from './1.20.4/global.mcb' @@ -9,16 +8,18 @@ import ANIMATION_1_20_5 from './1.20.5/animation.mcb' import STATIC_1_20_5 from './1.20.5/static.mcb' import ANIMATION_1_21_0 from './1.21.0/animation.mcb' +import GLOBAL_1_21_0 from './1.21.0/global.mcb' import STATIC_1_21_0 from './1.21.0/static.mcb' import ANIMATION_1_21_2 from './1.21.2/animation.mcb' -import GLOBAL_1_21_2 from './1.21.2/global.mcb' import STATIC_1_21_2 from './1.21.2/static.mcb' import ANIMATION_1_21_4 from './1.21.4/animation.mcb' import STATIC_1_21_4 from './1.21.4/static.mcb' +import ANIMATION_1_21_5 from './1.21.5/animation.mcb' import GLOBAL_1_21_5 from './1.21.5/global.mcb' +import STATIC_1_21_5 from './1.21.5/static.mcb' // The core is content that always goes in the `data` folder directly, // while other files are in the `animated_java/data` folder to be overlayed when the correct version is loaded. @@ -30,61 +31,90 @@ interface MCBFiles { globalTemplates: string } -const MCB_FILES: Record = { - '1.21.11': { - animation: ANIMATION_1_21_4, - static: STATIC_1_21_4, - global: GLOBAL_1_21_5, - globalTemplates: GLOBAL_TEMPLATES_1_20_4, - }, - '1.21.9': { - animation: ANIMATION_1_21_4, - static: STATIC_1_21_4, - global: GLOBAL_1_21_5, - globalTemplates: GLOBAL_TEMPLATES_1_20_4, - }, - '1.21.6': { - animation: ANIMATION_1_21_4, - static: STATIC_1_21_4, - global: GLOBAL_1_21_5, - globalTemplates: GLOBAL_TEMPLATES_1_20_4, - }, - '1.21.5': { - animation: ANIMATION_1_21_4, - static: STATIC_1_21_4, - global: GLOBAL_1_21_5, - globalTemplates: GLOBAL_TEMPLATES_1_20_4, - }, - '1.21.4': { - animation: ANIMATION_1_21_4, - static: STATIC_1_21_4, - global: GLOBAL_1_21_2, - globalTemplates: GLOBAL_TEMPLATES_1_20_4, - }, - '1.21.2': { - animation: ANIMATION_1_21_2, - static: STATIC_1_21_2, - global: GLOBAL_1_21_2, - globalTemplates: GLOBAL_TEMPLATES_1_20_4, - }, - '1.21.0': { - animation: ANIMATION_1_21_0, - static: STATIC_1_21_0, - global: GLOBAL_1_20_4, - globalTemplates: GLOBAL_TEMPLATES_1_20_4, - }, - '1.20.5': { - animation: ANIMATION_1_20_5, - static: STATIC_1_20_5, - global: GLOBAL_1_20_4, - globalTemplates: GLOBAL_TEMPLATES_1_20_4, - }, - '1.20.4': { - animation: ANIMATION_1_20_4, - static: STATIC_1_20_4, - global: GLOBAL_1_20_4, - globalTemplates: GLOBAL_TEMPLATES_1_20_4, - }, -} +export function getMCBFilesByVersion(version: string): MCBFiles { + switch (true) { + case VersionUtil.compare(version, '>=', '1.21.11'): { + return { + animation: ANIMATION_1_21_5, + static: STATIC_1_21_5, + global: GLOBAL_1_21_5, + globalTemplates: GLOBAL_TEMPLATES_1_20_4, + } + } + + case VersionUtil.compare(version, '>=', '1.21.9'): { + return { + animation: ANIMATION_1_21_5, + static: STATIC_1_21_5, + global: GLOBAL_1_21_5, + globalTemplates: GLOBAL_TEMPLATES_1_20_4, + } + } + + case VersionUtil.compare(version, '>=', '1.21.6'): { + return { + animation: ANIMATION_1_21_5, + static: STATIC_1_21_5, + global: GLOBAL_1_21_5, + globalTemplates: GLOBAL_TEMPLATES_1_20_4, + } + } + + case VersionUtil.compare(version, '>=', '1.21.5'): { + return { + animation: ANIMATION_1_21_5, + static: STATIC_1_21_5, + global: GLOBAL_1_21_5, + globalTemplates: GLOBAL_TEMPLATES_1_20_4, + } + } + + case VersionUtil.compare(version, '>=', '1.21.4'): { + return { + animation: ANIMATION_1_21_4, + static: STATIC_1_21_4, + global: GLOBAL_1_21_0, + globalTemplates: GLOBAL_TEMPLATES_1_20_4, + } + } -export default MCB_FILES + case VersionUtil.compare(version, '>=', '1.21.2'): { + return { + animation: ANIMATION_1_21_2, + static: STATIC_1_21_2, + global: GLOBAL_1_21_0, + globalTemplates: GLOBAL_TEMPLATES_1_20_4, + } + } + + case VersionUtil.compare(version, '>=', '1.21.0'): { + return { + animation: ANIMATION_1_21_0, + static: STATIC_1_21_0, + global: GLOBAL_1_21_0, + globalTemplates: GLOBAL_TEMPLATES_1_20_4, + } + } + + case VersionUtil.compare(version, '>=', '1.20.5'): { + return { + animation: ANIMATION_1_20_5, + static: STATIC_1_20_5, + global: GLOBAL_1_20_4, + globalTemplates: GLOBAL_TEMPLATES_1_20_4, + } + } + + case VersionUtil.compare(version, '>=', '1.20.4'): { + return { + animation: ANIMATION_1_20_4, + static: STATIC_1_20_4, + global: GLOBAL_1_20_4, + globalTemplates: GLOBAL_TEMPLATES_1_20_4, + } + } + + default: + throw new Error(`Unsupported Minecraft version: ${version}`) + } +} diff --git a/src/systems/datapackCompiler/objectives.ts b/src/systems/datapackCompiler/objectives.ts new file mode 100644 index 00000000..70bd1ae7 --- /dev/null +++ b/src/systems/datapackCompiler/objectives.ts @@ -0,0 +1,9 @@ +namespace OBJECTIVES { + export const I = () => 'aj.i' + export const ID = () => 'aj.id' + export const FRAME = (animationName: string) => `aj.${animationName}.frame` + export const IS_RIG_LOADED = () => 'aj.is_rig_loaded' + export const TWEEN_DURATION = () => 'aj.tween_duration' +} + +export default OBJECTIVES diff --git a/src/systems/datapackCompiler/tags.ts b/src/systems/datapackCompiler/tags.ts index f9ffe411..4625663e 100644 --- a/src/systems/datapackCompiler/tags.ts +++ b/src/systems/datapackCompiler/tags.ts @@ -1,4 +1,12 @@ -export namespace TAGS { +import { NbtList, NbtString } from 'deepslate/lib/nbt' +import { IntentionalExportError } from '../errors' +import type { AnyRenderedNode, IRenderedRig } from '../rigRenderer' + +export function makeTagSafe(value: string) { + return value.replaceAll(/[:\/]/g, '.') +} + +namespace TAGS { // -------------------------------- // region Global Tags // -------------------------------- @@ -13,7 +21,6 @@ export namespace TAGS { export const GLOBAL_ROOT_CHILD_TEXT_DISPLAY = () => 'aj.global.root.child.text_display' export const GLOBAL_ROOT_CHILD_LOCATOR = () => 'aj.global.root.child.locator' export const GLOBAL_ROOT_CHILD_CAMERA = () => 'aj.global.root.child.camera' - export const GLOBAL_ROOT_CHILD_DATA = () => 'aj.global.root.child.data' export const GLOBAL_NODE = () => 'aj.global.node' export const GLOBAL_DISPLAY_NODE = () => 'aj.global.display_node' @@ -24,7 +31,6 @@ export namespace TAGS { export const GLOBAL_TEXT_DISPLAY = () => 'aj.global.text_display' export const GLOBAL_CAMERA = () => 'aj.global.camera' export const GLOBAL_LOCATOR = () => 'aj.global.locator' - export const GLOBAL_DATA = () => 'aj.global.data' export const GLOBAL_NODE_NAMED = (nodeName: string) => `aj.global.node.${nodeName}` export const GLOBAL_DISPLAY_NODE_NAMED = (nodeName: string) => @@ -65,110 +71,441 @@ export namespace TAGS { // -------------------------------- // region Project Tags // -------------------------------- - export const PROJECT_ENTITY = (exportNamespace: string) => `aj.${exportNamespace}.entity` - - export const PROJECT_ROOT = (exportNamespace: string) => `aj.${exportNamespace}.root` - export const PROJECT_ROOT_CHILD = (exportNamespace: string) => - `aj.${exportNamespace}.root.child` - export const PROJECT_ROOT_CHILD_BONE = (exportNamespace: string) => - `aj.${exportNamespace}.root.child.bone` - export const PROJECT_ROOT_CHILD_ITEM_DISPLAY = (exportNamespace: string) => - `aj.${exportNamespace}.root.child.item_display` - export const PROJECT_ROOT_CHILD_BLOCK_DISPLAY = (exportNamespace: string) => - `aj.${exportNamespace}.root.child.block_display` - export const PROJECT_ROOT_CHILD_TEXT_DISPLAY = (exportNamespace: string) => - `aj.${exportNamespace}.root.child.text_display` - export const PROJECT_ROOT_CHILD_LOCATOR = (exportNamespace: string) => - `aj.${exportNamespace}.root.child.locator` - export const PROJECT_ROOT_CHILD_CAMERA = (exportNamespace: string) => - `aj.${exportNamespace}.root.child.camera` - export const PROJECT_ROOT_CHILD_DATA = (exportNamespace: string) => - `aj.${exportNamespace}.root.child.data` - - export const PROJECT_NODE = (exportNamespace: string) => `aj.${exportNamespace}.node` - export const PROJECT_DISPLAY_NODE = (exportNamespace: string) => - `aj.${exportNamespace}.display_node` - export const PROJECT_VANILLA_DISPLAY_NODE = (exportNamespace: string) => - `aj.${exportNamespace}.vanilla_display_node` - export const PROJECT_BONE = (exportNamespace: string) => `aj.${exportNamespace}.bone` - export const PROJECT_ITEM_DISPLAY = (exportNamespace: string) => - `aj.${exportNamespace}.item_display` - export const PROJECT_BLOCK_DISPLAY = (exportNamespace: string) => - `aj.${exportNamespace}.block_display` - export const PROJECT_TEXT_DISPLAY = (exportNamespace: string) => - `aj.${exportNamespace}.text_display` - export const PROJECT_CAMERA = (exportNamespace: string) => `aj.${exportNamespace}.camera` - export const PROJECT_LOCATOR = (exportNamespace: string) => `aj.${exportNamespace}.locator` - export const PROJECT_DATA = (exportNamespace: string) => `aj.${exportNamespace}.data` - - export const PROJECT_NODE_NAMED = (exportNamespace: string, nodeName: string) => - `aj.${exportNamespace}.node.${nodeName}` - export const PROJECT_BONE_NAMED = (exportNamespace: string, boneName: string) => - `aj.${exportNamespace}.bone.${boneName}` - export const PROJECT_DISPLAY_NODE_NAMED = (exportNamespace: string, nodeName: string) => - `aj.${exportNamespace}.display_node.${nodeName}` - export const PROJECT_ITEM_DISPLAY_NAMED = (exportNamespace: string, boneName: string) => - `aj.${exportNamespace}.item_display.${boneName}` - export const PROJECT_BLOCK_DISPLAY_NAMED = (exportNamespace: string, boneName: string) => - `aj.${exportNamespace}.block_display.${boneName}` - export const PROJECT_TEXT_DISPLAY_NAMED = (exportNamespace: string, boneName: string) => - `aj.${exportNamespace}.text_display.${boneName}` - export const PROJECT_CAMERA_NAMED = (exportNamespace: string, cameraName: string) => - `aj.${exportNamespace}.camera.${cameraName}` - export const PROJECT_LOCATOR_NAMED = (exportNamespace: string, locatorName: string) => - `aj.${exportNamespace}.locator.${locatorName}` - - export const PROJECT_BONE_CHILD = (exportNamespace: string, boneName: string) => - `aj.${exportNamespace}.bone.${boneName}.child` - export const PROJECT_BONE_CHILD_BONE = (exportNamespace: string, boneName: string) => - `aj.${exportNamespace}.bone.${boneName}.child.bone` - export const PROJECT_BONE_CHILD_ITEM_DISPLAY = (exportNamespace: string, boneName: string) => - `aj.${exportNamespace}.bone.${boneName}.child.item_display` - export const PROJECT_BONE_CHILD_BLOCK_DISPLAY = (exportNamespace: string, boneName: string) => - `aj.${exportNamespace}.bone.${boneName}.child.block_display` - export const PROJECT_BONE_CHILD_TEXT_DISPLAY = (exportNamespace: string, boneName: string) => - `aj.${exportNamespace}.bone.${boneName}.child.text_display` - export const PROJECT_BONE_CHILD_LOCATOR = (exportNamespace: string, boneName: string) => - `aj.${exportNamespace}.bone.${boneName}.child.locator` - export const PROJECT_BONE_CHILD_CAMERA = (exportNamespace: string, boneName: string) => - `aj.${exportNamespace}.bone.${boneName}.child.camera` - - export const PROJECT_BONE_DECENDANT = (exportNamespace: string, boneName: string) => - `aj.${exportNamespace}.bone.${boneName}.decendant` - export const PROJECT_BONE_DECENDANT_BONE = (exportNamespace: string, boneName: string) => - `aj.${exportNamespace}.bone.${boneName}.decendant.bone` - export const PROJECT_BONE_DECENDANT_ITEM_DISPLAY = ( - exportNamespace: string, - boneName: string - ) => `aj.${exportNamespace}.bone.${boneName}.decendant.item_display` - export const PROJECT_BONE_DECENDANT_BLOCK_DISPLAY = ( - exportNamespace: string, - boneName: string - ) => `aj.${exportNamespace}.bone.${boneName}.decendant.block_display` - export const PROJECT_BONE_DECENDANT_TEXT_DISPLAY = ( - exportNamespace: string, - boneName: string - ) => `aj.${exportNamespace}.bone.${boneName}.decendant.text_display` - export const PROJECT_BONE_DECENDANT_LOCATOR = (exportNamespace: string, boneName: string) => - `aj.${exportNamespace}.bone.${boneName}.decendant.locator` - export const PROJECT_BONE_DECENDANT_CAMERA = (exportNamespace: string, boneName: string) => - `aj.${exportNamespace}.bone.${boneName}.decendant.camera` - - export const PROJECT_BONE_TREE = (exportNamespace: string, boneName: string) => - `aj.${exportNamespace}.bone.${boneName}.tree` - export const PROJECT_BONE_TREE_BONE = (exportNamespace: string, boneName: string) => - `aj.${exportNamespace}.bone.${boneName}.tree.bone` + export const PROJECT_ENTITY = (blueprintId: string) => `${makeTagSafe(blueprintId)}.entity` + + export const PROJECT_ROOT = (blueprintId: string) => `${makeTagSafe(blueprintId)}.root` + export const PROJECT_ROOT_CHILD = (blueprintId: string) => + `${makeTagSafe(blueprintId)}.root.child` + export const PROJECT_ROOT_CHILD_BONE = (blueprintId: string) => + `${makeTagSafe(blueprintId)}.root.child.bone` + export const PROJECT_ROOT_CHILD_ITEM_DISPLAY = (blueprintId: string) => + `${makeTagSafe(blueprintId)}.root.child.item_display` + export const PROJECT_ROOT_CHILD_BLOCK_DISPLAY = (blueprintId: string) => + `${makeTagSafe(blueprintId)}.root.child.block_display` + export const PROJECT_ROOT_CHILD_TEXT_DISPLAY = (blueprintId: string) => + `${makeTagSafe(blueprintId)}.root.child.text_display` + export const PROJECT_ROOT_CHILD_LOCATOR = (blueprintId: string) => + `${makeTagSafe(blueprintId)}.root.child.locator` + export const PROJECT_ROOT_CHILD_CAMERA = (blueprintId: string) => + `${makeTagSafe(blueprintId)}.root.child.camera` + + export const PROJECT_NODE = (blueprintId: string) => `${makeTagSafe(blueprintId)}.node` + export const PROJECT_DISPLAY_NODE = (blueprintId: string) => + `${makeTagSafe(blueprintId)}.display_node` + export const PROJECT_VANILLA_DISPLAY_NODE = (blueprintId: string) => + `${makeTagSafe(blueprintId)}.vanilla_display_node` + export const PROJECT_BONE = (blueprintId: string) => `${makeTagSafe(blueprintId)}.bone` + export const PROJECT_ITEM_DISPLAY = (blueprintId: string) => + `${makeTagSafe(blueprintId)}.item_display` + export const PROJECT_BLOCK_DISPLAY = (blueprintId: string) => + `${makeTagSafe(blueprintId)}.block_display` + export const PROJECT_TEXT_DISPLAY = (blueprintId: string) => + `${makeTagSafe(blueprintId)}.text_display` + export const PROJECT_CAMERA = (blueprintId: string) => `${makeTagSafe(blueprintId)}.camera` + export const PROJECT_LOCATOR = (blueprintId: string) => `${makeTagSafe(blueprintId)}.locator` + + export const PROJECT_NODE_NAMED = (blueprintId: string, nodeName: string) => + `${makeTagSafe(blueprintId)}.node.${nodeName}` + export const PROJECT_BONE_NAMED = (blueprintId: string, boneName: string) => + `${makeTagSafe(blueprintId)}.bone.${boneName}` + export const PROJECT_DISPLAY_NODE_NAMED = (blueprintId: string, nodeName: string) => + `${makeTagSafe(blueprintId)}.display_node.${nodeName}` + export const PROJECT_ITEM_DISPLAY_NAMED = (blueprintId: string, boneName: string) => + `${makeTagSafe(blueprintId)}.item_display.${boneName}` + export const PROJECT_BLOCK_DISPLAY_NAMED = (blueprintId: string, boneName: string) => + `${makeTagSafe(blueprintId)}.block_display.${boneName}` + export const PROJECT_TEXT_DISPLAY_NAMED = (blueprintId: string, boneName: string) => + `${makeTagSafe(blueprintId)}.text_display.${boneName}` + export const PROJECT_CAMERA_NAMED = (blueprintId: string, cameraName: string) => + `${makeTagSafe(blueprintId)}.camera.${cameraName}` + export const PROJECT_LOCATOR_NAMED = (blueprintId: string, locatorName: string) => + `${makeTagSafe(blueprintId)}.locator.${locatorName}` + + export const PROJECT_BONE_CHILD = (blueprintId: string, boneName: string) => + `${makeTagSafe(blueprintId)}.bone.${boneName}.child` + export const PROJECT_BONE_CHILD_BONE = (blueprintId: string, boneName: string) => + `${makeTagSafe(blueprintId)}.bone.${boneName}.child.bone` + export const PROJECT_BONE_CHILD_ITEM_DISPLAY = (blueprintId: string, boneName: string) => + `${makeTagSafe(blueprintId)}.bone.${boneName}.child.item_display` + export const PROJECT_BONE_CHILD_BLOCK_DISPLAY = (blueprintId: string, boneName: string) => + `${makeTagSafe(blueprintId)}.bone.${boneName}.child.block_display` + export const PROJECT_BONE_CHILD_TEXT_DISPLAY = (blueprintId: string, boneName: string) => + `${makeTagSafe(blueprintId)}.bone.${boneName}.child.text_display` + export const PROJECT_BONE_CHILD_LOCATOR = (blueprintId: string, boneName: string) => + `${makeTagSafe(blueprintId)}.bone.${boneName}.child.locator` + export const PROJECT_BONE_CHILD_CAMERA = (blueprintId: string, boneName: string) => + `${makeTagSafe(blueprintId)}.bone.${boneName}.child.camera` + + export const PROJECT_BONE_DECENDANT = (blueprintId: string, boneName: string) => + `${makeTagSafe(blueprintId)}.bone.${boneName}.decendant` + export const PROJECT_BONE_DECENDANT_BONE = (blueprintId: string, boneName: string) => + `${makeTagSafe(blueprintId)}.bone.${boneName}.decendant.bone` + export const PROJECT_BONE_DECENDANT_ITEM_DISPLAY = (blueprintId: string, boneName: string) => + `${makeTagSafe(blueprintId)}.bone.${boneName}.decendant.item_display` + export const PROJECT_BONE_DECENDANT_BLOCK_DISPLAY = (blueprintId: string, boneName: string) => + `${makeTagSafe(blueprintId)}.bone.${boneName}.decendant.block_display` + export const PROJECT_BONE_DECENDANT_TEXT_DISPLAY = (blueprintId: string, boneName: string) => + `${makeTagSafe(blueprintId)}.bone.${boneName}.decendant.text_display` + export const PROJECT_BONE_DECENDANT_LOCATOR = (blueprintId: string, boneName: string) => + `${makeTagSafe(blueprintId)}.bone.${boneName}.decendant.locator` + export const PROJECT_BONE_DECENDANT_CAMERA = (blueprintId: string, boneName: string) => + `${makeTagSafe(blueprintId)}.bone.${boneName}.decendant.camera` + + export const PROJECT_BONE_TREE = (blueprintId: string, boneName: string) => + `${makeTagSafe(blueprintId)}.bone.${boneName}.tree` + export const PROJECT_BONE_TREE_BONE = (blueprintId: string, boneName: string) => + `${makeTagSafe(blueprintId)}.bone.${boneName}.tree.bone` // -------------------------------- // region Misc Tags // -------------------------------- - export const ANIMATION_PLAYING = (exportNamespace: string, animationName: string) => - `aj.${exportNamespace}.animation.${animationName}.playing` - export const TWEENING = (exportNamespace: string, animationName: string) => - `aj.${exportNamespace}.animation.${animationName}.tween_playing` - export const VARIANT_APPLIED = (exportNamespace: string, variantName: string) => - `aj.${exportNamespace}.variant.${variantName}.applied` + export const ANIMATION_PLAYING = (blueprintId: string, animationName: string) => + `${makeTagSafe(blueprintId)}.animation.${animationName}.playing` + export const TWEENING = (blueprintId: string, animationName: string) => + `${makeTagSafe(blueprintId)}.animation.${animationName}.tween_playing` + export const VARIANT_APPLIED = (blueprintId: string, variantName: string) => + `${makeTagSafe(blueprintId)}.variant.${variantName}.applied` // Used to tell the set and apply frame functions to only apply the bone transforms, and ignore command/variant keyframes export const TRANSFORMS_ONLY = () => 'aj.transforms_only' + export const EFFECTS_ONLY = () => 'aj.effects_only' export const OUTDATED_RIG_TEXT_DISPLAY = () => 'aj.outdated_rig_text_display' } + +export default TAGS + +// region getNodeTags +export function getNodeTags(node: AnyRenderedNode, rig: IRenderedRig): NbtList { + const tags: string[] = [] + + const parentNames: Array<{ name: string; type: string }> = [] + + function recurseParents(n: AnyRenderedNode) { + if (n.parent === 'root') { + // Root is ignored + } else if (n.parent) { + parentNames.push({ + name: rig.nodes[n.parent].storage_name, + type: rig.nodes[n.parent].type, + }) + recurseParents(rig.nodes[n.parent]) + } + } + recurseParents(node) + + const hasParent = node.parent && node.parent !== 'root' + + tags.push( + // Global + TAGS.NEW(), + TAGS.GLOBAL_ENTITY(), + TAGS.GLOBAL_NODE(), + TAGS.GLOBAL_NODE_NAMED(node.storage_name), + // Project + TAGS.PROJECT_ENTITY(Project!.animated_java.blueprint_id), + TAGS.PROJECT_NODE(Project!.animated_java.blueprint_id), + TAGS.PROJECT_NODE_NAMED(Project!.animated_java.blueprint_id, node.storage_name) + ) + + if (!hasParent) { + tags.push(TAGS.GLOBAL_ROOT_CHILD()) + } + switch (node.type) { + case 'bone': { + tags.push( + // Global + TAGS.GLOBAL_DISPLAY_NODE_NAMED(node.storage_name), + TAGS.GLOBAL_BONE(), + TAGS.GLOBAL_BONE_TREE(node.storage_name), // Tree includes self + TAGS.GLOBAL_BONE_TREE_BONE(node.storage_name), // Tree includes self + // Project + TAGS.PROJECT_DISPLAY_NODE_NAMED( + Project!.animated_java.blueprint_id, + node.storage_name + ), + TAGS.PROJECT_BONE(Project!.animated_java.blueprint_id), + TAGS.PROJECT_BONE_NAMED(Project!.animated_java.blueprint_id, node.storage_name), + TAGS.PROJECT_BONE_TREE(Project!.animated_java.blueprint_id, node.storage_name), // Tree includes self + TAGS.PROJECT_BONE_TREE_BONE(Project!.animated_java.blueprint_id, node.storage_name) // Tree includes self + ) + if (!hasParent) { + // Nodes without parents are assumed to be root nodes + tags.push(TAGS.GLOBAL_ROOT_CHILD_BONE()) + } else { + tags.push( + // Global + TAGS.GLOBAL_BONE_CHILD(parentNames[0].name), + TAGS.GLOBAL_BONE_CHILD_BONE(parentNames[0].name), + // Project + TAGS.PROJECT_BONE_CHILD( + Project!.animated_java.blueprint_id, + parentNames[0].name + ), + TAGS.PROJECT_BONE_CHILD_BONE( + Project!.animated_java.blueprint_id, + parentNames[0].name + ) + ) + } + for (const { name } of parentNames) { + tags.push( + // Global + TAGS.GLOBAL_BONE_DECENDANT(name), + TAGS.GLOBAL_BONE_DECENDANT_BONE(name), + TAGS.GLOBAL_BONE_TREE(name), + TAGS.GLOBAL_BONE_TREE_BONE(name), + // Project + TAGS.PROJECT_BONE_DECENDANT(Project!.animated_java.blueprint_id, name), + TAGS.PROJECT_BONE_DECENDANT_BONE(Project!.animated_java.blueprint_id, name), + TAGS.PROJECT_BONE_TREE(Project!.animated_java.blueprint_id, name), + TAGS.PROJECT_BONE_TREE_BONE(Project!.animated_java.blueprint_id, name) + ) + } + break + } + case 'item_display': { + tags.push( + // Global + TAGS.GLOBAL_DISPLAY_NODE_NAMED(node.storage_name), + TAGS.GLOBAL_ITEM_DISPLAY(), + // Project + TAGS.PROJECT_DISPLAY_NODE_NAMED( + Project!.animated_java.blueprint_id, + node.storage_name + ), + TAGS.PROJECT_ITEM_DISPLAY(Project!.animated_java.blueprint_id), + TAGS.PROJECT_ITEM_DISPLAY_NAMED( + Project!.animated_java.blueprint_id, + node.storage_name + ) + ) + if (!hasParent) { + // Nodes without parents are assumed to be root nodes + tags.push(TAGS.GLOBAL_ROOT_CHILD_ITEM_DISPLAY()) + } else { + tags.push( + // Global + TAGS.GLOBAL_BONE_CHILD(parentNames[0].name), + TAGS.GLOBAL_BONE_CHILD_ITEM_DISPLAY(parentNames[0].name), + // Project + TAGS.PROJECT_BONE_CHILD( + Project!.animated_java.blueprint_id, + parentNames[0].name + ), + TAGS.PROJECT_BONE_CHILD_ITEM_DISPLAY( + Project!.animated_java.blueprint_id, + parentNames[0].name + ) + ) + } + for (const { name } of parentNames) { + tags.push( + // Global + TAGS.GLOBAL_BONE_DECENDANT(name), + TAGS.GLOBAL_BONE_DECENDANT_ITEM_DISPLAY(name), + TAGS.GLOBAL_BONE_TREE(name), + // Project + TAGS.PROJECT_BONE_DECENDANT(Project!.animated_java.blueprint_id, name), + TAGS.PROJECT_BONE_DECENDANT_ITEM_DISPLAY( + Project!.animated_java.blueprint_id, + name + ), + TAGS.PROJECT_BONE_TREE(Project!.animated_java.blueprint_id, name) + ) + } + break + } + case 'block_display': { + tags.push( + // Global + TAGS.GLOBAL_DISPLAY_NODE_NAMED(node.storage_name), + TAGS.GLOBAL_BLOCK_DISPLAY(), + // Project + TAGS.PROJECT_DISPLAY_NODE_NAMED( + Project!.animated_java.blueprint_id, + node.storage_name + ), + TAGS.PROJECT_BLOCK_DISPLAY(Project!.animated_java.blueprint_id), + TAGS.PROJECT_BLOCK_DISPLAY_NAMED( + Project!.animated_java.blueprint_id, + node.storage_name + ) + ) + if (!hasParent) { + // Nodes without parents are assumed to be root nodes + tags.push(TAGS.GLOBAL_ROOT_CHILD_BLOCK_DISPLAY()) + } else { + tags.push( + // Global + TAGS.GLOBAL_BONE_CHILD(parentNames[0].name), + TAGS.GLOBAL_BONE_CHILD_BLOCK_DISPLAY(parentNames[0].name), + // Project + TAGS.PROJECT_BONE_CHILD( + Project!.animated_java.blueprint_id, + parentNames[0].name + ), + TAGS.PROJECT_BONE_CHILD_BLOCK_DISPLAY( + Project!.animated_java.blueprint_id, + parentNames[0].name + ) + ) + } + for (const { name } of parentNames) { + tags.push( + // Global + TAGS.GLOBAL_BONE_DECENDANT(name), + TAGS.GLOBAL_BONE_DECENDANT_BLOCK_DISPLAY(name), + TAGS.GLOBAL_BONE_TREE(name), + // Project + TAGS.PROJECT_BONE_DECENDANT(Project!.animated_java.blueprint_id, name), + TAGS.PROJECT_BONE_DECENDANT_BLOCK_DISPLAY( + Project!.animated_java.blueprint_id, + name + ), + TAGS.PROJECT_BONE_TREE(Project!.animated_java.blueprint_id, name) + ) + } + break + } + case 'text_display': { + tags.push( + // Global + TAGS.GLOBAL_DISPLAY_NODE_NAMED(node.storage_name), + TAGS.GLOBAL_TEXT_DISPLAY(), + // Project + TAGS.PROJECT_DISPLAY_NODE_NAMED( + Project!.animated_java.blueprint_id, + node.storage_name + ), + TAGS.PROJECT_TEXT_DISPLAY(Project!.animated_java.blueprint_id), + TAGS.PROJECT_TEXT_DISPLAY_NAMED( + Project!.animated_java.blueprint_id, + node.storage_name + ) + ) + if (!hasParent) { + // Nodes without parents are assumed to be root nodes + tags.push(TAGS.GLOBAL_ROOT_CHILD_TEXT_DISPLAY()) + } else { + tags.push( + // Global + TAGS.GLOBAL_BONE_CHILD(parentNames[0].name), + TAGS.GLOBAL_BONE_CHILD_TEXT_DISPLAY(parentNames[0].name), + // Project + TAGS.PROJECT_BONE_CHILD( + Project!.animated_java.blueprint_id, + parentNames[0].name + ), + TAGS.PROJECT_BONE_CHILD_TEXT_DISPLAY( + Project!.animated_java.blueprint_id, + parentNames[0].name + ) + ) + } + for (const { name } of parentNames) { + tags.push( + // Global + TAGS.GLOBAL_BONE_DECENDANT(name), + TAGS.GLOBAL_BONE_DECENDANT_TEXT_DISPLAY(name), + TAGS.GLOBAL_BONE_TREE(name), + // Project + TAGS.PROJECT_BONE_DECENDANT(Project!.animated_java.blueprint_id, name), + TAGS.PROJECT_BONE_DECENDANT_TEXT_DISPLAY( + Project!.animated_java.blueprint_id, + name + ), + TAGS.PROJECT_BONE_TREE(Project!.animated_java.blueprint_id, name) + ) + } + break + } + case 'locator': { + tags.push( + // Global + TAGS.GLOBAL_LOCATOR(), + // Project + TAGS.PROJECT_LOCATOR(Project!.animated_java.blueprint_id), + TAGS.PROJECT_LOCATOR_NAMED(Project!.animated_java.blueprint_id, node.storage_name) + ) + if (!hasParent) { + // Nodes without parents are assumed to be root nodes + tags.push(TAGS.GLOBAL_ROOT_CHILD_LOCATOR()) + } else { + tags.push( + // Global + TAGS.GLOBAL_BONE_CHILD(parentNames[0].name), + TAGS.GLOBAL_BONE_CHILD_LOCATOR(parentNames[0].name), + // Project + TAGS.PROJECT_BONE_CHILD( + Project!.animated_java.blueprint_id, + parentNames[0].name + ), + TAGS.PROJECT_BONE_CHILD_LOCATOR( + Project!.animated_java.blueprint_id, + parentNames[0].name + ) + ) + } + for (const { name } of parentNames) { + tags.push( + // Global + TAGS.GLOBAL_BONE_DECENDANT(name), + TAGS.GLOBAL_BONE_DECENDANT_LOCATOR(name), + TAGS.GLOBAL_BONE_TREE(name), + // Project + TAGS.PROJECT_BONE_DECENDANT(Project!.animated_java.blueprint_id, name), + TAGS.PROJECT_BONE_DECENDANT_LOCATOR(Project!.animated_java.blueprint_id, name), + TAGS.PROJECT_BONE_TREE(Project!.animated_java.blueprint_id, name) + ) + } + break + } + case 'camera': { + tags.push( + // Global + TAGS.GLOBAL_CAMERA(), + // Project + TAGS.PROJECT_CAMERA(Project!.animated_java.blueprint_id), + TAGS.PROJECT_CAMERA_NAMED(Project!.animated_java.blueprint_id, node.storage_name) + ) + if (!hasParent) { + // Nodes without parents are assumed to be root nodes + tags.push(TAGS.GLOBAL_ROOT_CHILD_CAMERA()) + } else { + tags.push( + // Global + TAGS.GLOBAL_BONE_CHILD(parentNames[0].name), + TAGS.GLOBAL_BONE_CHILD_CAMERA(parentNames[0].name), + // Project + TAGS.PROJECT_BONE_CHILD( + Project!.animated_java.blueprint_id, + parentNames[0].name + ), + TAGS.PROJECT_BONE_CHILD_CAMERA( + Project!.animated_java.blueprint_id, + parentNames[0].name + ) + ) + } + for (const { name } of parentNames) { + tags.push( + // Global + TAGS.GLOBAL_BONE_DECENDANT(name), + TAGS.GLOBAL_BONE_DECENDANT_CAMERA(name), + TAGS.GLOBAL_BONE_TREE(name), + // Project + TAGS.PROJECT_BONE_DECENDANT(Project!.animated_java.blueprint_id, name), + TAGS.PROJECT_BONE_DECENDANT_CAMERA(Project!.animated_java.blueprint_id, name), + TAGS.PROJECT_BONE_TREE(Project!.animated_java.blueprint_id, name) + ) + } + break + } + default: { + throw new IntentionalExportError( + `Attempted to get tags for an unknown node type: '${node.type}'!` + ) + } + } + + return new NbtList(tags.sort().map(v => new NbtString(v))) +} diff --git a/src/systems/datapackCompiler/tellraw.ts b/src/systems/datapackCompiler/tellraw.ts index 825116a2..dff46064 100644 --- a/src/systems/datapackCompiler/tellraw.ts +++ b/src/systems/datapackCompiler/tellraw.ts @@ -1,24 +1,25 @@ -import { toSmallCaps } from 'src/util/minecraftUtil' +import { TextComponent, type TextElement } from 'book-and-quill' +import { toSmallCaps } from '../../util/minecraftUtil' import { type IRenderedAnimation } from '../animationRenderer' -import { JsonText, TextElement } from '../jsonText' import { type IRenderedVariant } from '../rigRenderer' +import OBJECTIVES from './objectives' const TELLRAW_PREFIX = () => - new JsonText([ + new TextComponent([ { text: '\n ', color: 'gray' }, { text: toSmallCaps('Animated Java'), color: '#00aced' }, { - text: `\n (animated_java:${Project!.animated_java.export_namespace})`, + text: `\n (${Project!.animated_java.blueprint_id})`, color: 'dark_gray', italic: true, }, '\n → ', - ]).flatten() + ]).optimized() const TELLRAW_SUFFIX = () => '\n' const TELLRAW_ERROR = (errorName: string, details: TextElement) => - new JsonText([ + new TextComponent([ { text: '', color: 'red' }, TELLRAW_PREFIX(), toSmallCaps('error') + ': ', @@ -29,7 +30,7 @@ const TELLRAW_ERROR = (errorName: string, details: TextElement) => ]) const TELLRAW_WARNING = (warningName: string, details: TextElement) => - new JsonText([ + new TextComponent([ { text: '', color: 'yellow' }, TELLRAW_PREFIX(), toSmallCaps('warning') + ': ', @@ -40,7 +41,7 @@ const TELLRAW_WARNING = (warningName: string, details: TextElement) => ]) const CREATE_TELLRAW_HELP_LINK = (url: string) => - new JsonText([ + new TextComponent([ '\n\n ', !compareVersions('1.21.5', Project!.animated_java.target_minecraft_version) ? { @@ -49,15 +50,15 @@ const CREATE_TELLRAW_HELP_LINK = (url: string) => underlined: true, italic: true, click_event: { action: 'open_url', url }, - } + } : { text: '▶ Learn More ◀', color: 'blue', underlined: true, italic: true, clickEvent: { action: 'open_url', value: url }, - }, - ]).flatten() + }, + ]).optimized() namespace TELLRAW { export const RIG_OUTDATED = () => @@ -78,7 +79,7 @@ namespace TELLRAW { }, color: 'aqua', underlined: true, - } + } : { text: toSmallCaps('Teleport to Instance'), clickEvent: { @@ -87,7 +88,7 @@ namespace TELLRAW { }, color: 'aqua', underlined: true, - }, + }, { text: '\n ≡ ', color: 'white' }, !compareVersions('1.21.5', Project!.animated_java.target_minecraft_version) ? { @@ -98,7 +99,7 @@ namespace TELLRAW { }, color: 'aqua', underlined: true, - } + } : { text: toSmallCaps('Remove Instance'), clickEvent: { @@ -107,11 +108,11 @@ namespace TELLRAW { }, color: 'aqua', underlined: true, - }, + }, ]) export const RIG_OUTDATED_TEXT_DISPLAY = () => - new JsonText([ + new TextComponent([ { text: '⚠ This rig instance is outdated! ⚠', color: 'red' }, '\n It should be removed and re-summoned to ensure it functions correctly.', ]) @@ -120,7 +121,10 @@ namespace TELLRAW { .replaceAll('\\n', '\\\\n') export const FUNCTION_NOT_EXECUTED_AS_ROOT_ERROR = (functionPath: string, tag: string) => { - const hoverText = new JsonText([{ text: functionPath, color: 'yellow' }, '']).flatten() + const hoverText = new TextComponent([ + { text: functionPath, color: 'yellow' }, + '', + ]).optimized() const exampleCommand = `/execute as @e[tag=${tag}] run function ${functionPath}` @@ -130,12 +134,12 @@ namespace TELLRAW { text: '[This Function]', color: 'yellow', hover_event: { action: 'show_text', value: hoverText }, - } + } : { text: '[This Function]', color: 'yellow', hoverEvent: { action: 'show_text', contents: hoverText }, - }, + }, " must be executed as the rig's root entity.", { text: '\n\n ≡ ', @@ -147,13 +151,13 @@ namespace TELLRAW { color: 'aqua', underlined: true, click_event: { action: 'suggest_command', command: exampleCommand }, - } + } : { text: toSmallCaps('Show Example Command'), color: 'aqua', underlined: true, clickEvent: { action: 'suggest_command', value: exampleCommand }, - }, + }, ], }, CREATE_TELLRAW_HELP_LINK( @@ -162,23 +166,27 @@ namespace TELLRAW { ]) } - export const FUNCTION_NOT_EXECUTED_AS_ENTITY_WITH_ROOT_UUID_ERROR = (functionPath: string) => { - const hoverText = new JsonText([{ text: functionPath, color: 'yellow' }, '']).flatten() + export const FUNCTION_NOT_EXECUTED_AS_ENTITY_WITH_ID_SCORE = (functionPath: string) => { + const hoverText = new TextComponent([ + { text: functionPath, color: 'yellow' }, + '', + ]).optimized() - return TELLRAW_ERROR('Function Not Executed as Entity with Root UUID Data', [ + return TELLRAW_ERROR('Function Not Executed as Entity with ID Score', [ !compareVersions('1.21.5', Project!.animated_java.target_minecraft_version) ? { text: '[This Function]', color: 'yellow', hover_event: { action: 'show_text', value: hoverText }, - } + } : { text: '[This Function]', color: 'yellow', hoverEvent: { action: 'show_text', contents: hoverText }, - }, - ' must be executed as an entity with the NBT ', - { text: 'data.root_uuid', color: 'yellow' }, + }, + ' must be executed as an entity with a ', + { text: `${OBJECTIVES.ID()}`, color: 'yellow' }, + ' score.', ]) } @@ -199,12 +207,12 @@ namespace TELLRAW { { text: ' ≡ ', color: 'white' }, { text: 'Available Variants:', color: 'green' }, ...Object.values(variants).map(variant => - new JsonText([ + new TextComponent([ { text: '\n ', color: 'gray' }, '\\s\\s\\s', ' ● ', { text: variant.name, color: 'yellow' }, - ]).flatten() + ]).optimized() ), ]) @@ -223,12 +231,12 @@ namespace TELLRAW { { text: ' ≡ ', color: 'white' }, { text: 'Available Animations:', color: 'green' }, ...animations.map(anim => - new JsonText([ + new TextComponent([ { text: '\n ', color: 'gray' }, '\\s\\s\\s', ' ● ', { text: anim.storage_name, color: 'yellow' }, - ]).flatten() + ]).optimized() ), ]) @@ -247,11 +255,11 @@ namespace TELLRAW { ]) export const UNINSTALL = () => - new JsonText([ + new TextComponent([ TELLRAW_PREFIX(), [ { text: 'Successfully uninstalled ', color: 'green' }, - { text: Project!.animated_java.export_namespace, color: 'yellow' }, + { text: Project!.animated_java.blueprint_id, color: 'yellow' }, { text: '!' }, { text: '\n If you have exported multiple times, you may have to remove objectives from previous exports manually, as Animated Java only knows about the objectives from the most recent export.', diff --git a/src/systems/exporter.ts b/src/systems/exporter.ts index 7136e0a5..57bc39fb 100644 --- a/src/systems/exporter.ts +++ b/src/systems/exporter.ts @@ -1,17 +1,21 @@ -import { Stopwatch } from 'src/util/stopwatch' +import { getFsModule } from '../constants' +import { + PROGRESS_DESCRIPTION, + openExportProgressDialog, +} from '../dialogs/exportProgress/exportProgress' +import { openUnexpectedErrorDialog } from '../dialogs/unexpectedError/unexpectedError' import { projectTargetVersionIsAtLeast, saveBlueprint } from '../formats/blueprint' -import { blueprintSettingErrors } from '../formats/blueprint/settings' -import { openBlueprintSettingsDialog } from '../interface/dialog/blueprintSettings' -import { PROGRESS_DESCRIPTION, openExportProgressDialog } from '../interface/dialog/exportProgress' -import { openUnexpectedErrorDialog } from '../interface/dialog/unexpectedError' +import { validateThisProjectsBlueprintSettings } from '../formats/blueprint/settings' import { resolvePath } from '../util/fileUtil' -import { isResourcePackPath } from '../util/minecraftUtil' -import { translate } from '../util/translation' +import { localize as translate } from '../util/lang' +import { isResourcePackPath, parseResourceLocation } from '../util/minecraftUtil' +import { scrubUndefined } from '../util/misc' +import { Stopwatch } from '../util/stopwatch' import { Variant } from '../variants' import { hashAnimations, renderProjectAnimations } from './animationRenderer' -import { exportPluginBlueprint } from './pluginCompiler' import compileDataPack from './datapackCompiler' import { IntentionalExportError } from './errors' +import { exportPluginBlueprint } from './pluginCompiler' import resourcepackCompiler from './resourcepackCompiler' import { hashRig, renderRig } from './rigRenderer' import { isCubeValid } from './util' @@ -22,14 +26,22 @@ export function getExportPaths() { const resourcePackFolder = resolvePath(aj.resource_pack) const dataPackFolder = resolvePath(aj.data_pack) + const parsed = parseResourceLocation(aj.blueprint_id) + // These paths are all relative to the resource pack folder const modelExportFolder = PathModule.join( - 'assets/animated_java/models/blueprint/', - aj.export_namespace + 'assets', + parsed.namespace, + 'models', + 'blueprint', + parsed.path ) const textureExportFolder = PathModule.join( - 'assets/animated_java/textures/blueprint/', - aj.export_namespace + 'assets', + parsed.namespace, + 'textures', + 'blueprint', + parsed.path ) const displayItemPath = PathModule.join( 'assets/minecraft/models/item/', @@ -68,8 +80,9 @@ async function actuallyExportProject({ } // Verify that all non-external textures have unique names + const { existsSync } = getFsModule() for (const texture of Texture.all) { - if (texture.path && isResourcePackPath(texture.path) && fs.existsSync(texture.path)) + if (texture.path && isResourcePackPath(texture.path) && existsSync(texture.path)) continue if (Texture.all.some(t => t !== texture && t.name === texture.name)) { throw new IntentionalExportError( @@ -120,7 +133,7 @@ async function actuallyExportProject({ // TODO - Plugin mode should run without the resource pack compiler // Always run the resource pack compiler because it calculates custom model data. - await resourcepackCompiler([aj.target_minecraft_version], { + await resourcepackCompiler(aj.target_minecraft_version, { rig, displayItemPath, resourcePackFolder, @@ -130,7 +143,7 @@ async function actuallyExportProject({ }) if (!aj.enable_plugin_mode && aj.data_pack_export_mode !== 'none') { - await compileDataPack([aj.target_minecraft_version], { + await compileDataPack(aj.target_minecraft_version, { rig, animations, dataPackFolder, @@ -145,7 +158,7 @@ async function actuallyExportProject({ exportPluginBlueprint({ rig, animations }) } - Project!.last_used_export_namespace = aj.export_namespace + Project!.last_used_blueprint_id = aj.blueprint_id if (forceSave) saveBlueprint() Blockbench.showQuickMessage('Project exported successfully!', 2000) @@ -190,23 +203,23 @@ export async function exportProject(options?: ExportProjectOptions): Promise requestAnimationFrame(resolve)) - console.log('Blueprint Setting Errors', blueprintSettingErrors.get()) - if (Object.keys(blueprintSettingErrors.get()).length > 0) { + let blueprintSettingErrors = scrubUndefined(await validateThisProjectsBlueprintSettings()) + blueprintSettingErrors = Object.fromEntries( + Object.entries(blueprintSettingErrors).filter(([, error]) => error.type === 'error') + ) + + if (Object.keys(blueprintSettingErrors).length > 0) { Blockbench.showMessageBox({ title: translate('misc.failed_to_export.title'), message: translate('misc.failed_to_export.blueprint_settings.message') + '\n\n' + - Object.entries(blueprintSettingErrors.get()) + Object.entries(blueprintSettingErrors) .map( v => translate('misc.failed_to_export.blueprint_settings.error_item', v[0]) + '\n - ' + - v[1] + v[1].message ) .join('\n\n'), buttons: [translate('misc.failed_to_export.button')], @@ -214,7 +227,5 @@ export async function exportProject(options?: ExportProjectOptions): Promise normalizePath(PathModule.relative(resourcePackFolder, v))) .sort(), @@ -110,7 +101,8 @@ export class AJMeta { }, }), } - fs.writeFileSync(this.path, autoStringify(content)) + const { writeFileSync } = getFsModule() + writeFileSync(this.path, autoStringify(content)) } } @@ -163,13 +155,14 @@ export class PackMeta { static fromFile(path: string) { const meta = new PackMeta() + const { existsSync, readFileSync } = getFsModule() - if (!fs.existsSync(path)) { + if (!existsSync(path)) { console.warn(`Pack meta file does not exist at ${path}`) return meta } - const raw = fs.readFileSync(path, 'utf-8') + const raw = readFileSync(path, 'utf-8') try { meta.content = JSON.parse(raw) } catch (e: any) { diff --git a/src/systems/jsonCompiler.ts b/src/systems/jsonCompiler.ts index 4e7823b5..3fdb77d5 100644 --- a/src/systems/jsonCompiler.ts +++ b/src/systems/jsonCompiler.ts @@ -2,7 +2,8 @@ /// /// -import { PACKAGE } from '../constants' +import { TextComponent } from 'book-and-quill' +import { getFsModule, PACKAGE } from '../constants' import type { IBlueprintDisplayEntityConfigJSON } from '../formats/blueprint' import { type defaultValues } from '../formats/blueprint/settings' import type { EasingKey } from '../util/easing' @@ -11,7 +12,6 @@ import { detectCircularReferences, mapObjEntries, scrubUndefined } from '../util import { Variant } from '../variants' import type { INodeTransform, IRenderedAnimation, IRenderedFrame } from './animationRenderer' import { IntentionalExportError } from './errors' -import { JsonText } from './jsonText' import type { AnyRenderedNode, IRenderedModel, @@ -30,10 +30,7 @@ type ExportedNodetransform = Omit & { } type ExportedRenderedNode = Omit< AnyRenderedNode, - 'default_transform' - | 'bounding_box' - | 'configs' - | 'storage_name' + 'default_transform' | 'bounding_box' | 'configs' | 'storage_name' > & { default_transform: ExportedNodetransform bounding_box?: { min: ArrayVector3; max: ArrayVector3 } @@ -44,10 +41,7 @@ type ExportedAnimationFrame = Omit & { } type ExportedBakedAnimation = Omit< IRenderedAnimation, - 'uuid' - | 'frames' - | 'modified_nodes' - | 'storage_name' + 'uuid' | 'frames' | 'modified_nodes' | 'storage_name' > & { frames: ExportedAnimationFrame[] modified_nodes: string[] @@ -98,9 +92,7 @@ interface ExportedTexture { } type ExportedVariantModel = Pick< IRenderedVariantModel, - 'custom_model_data' - | 'resource_location' - | 'item_model' + 'custom_model_data' | 'resource_location' | 'item_model' > & { model: IRenderedModel | null } type ExportedVariant = Omit & { /** @@ -119,7 +111,7 @@ export interface IExportedJSON { * The Blueprint's Settings */ settings: { - export_namespace: (typeof defaultValues)['export_namespace'] + export_namespace: (typeof defaultValues)['blueprint_id'] target_minecraft_version: (typeof defaultValues)['target_minecraft_version'] display_item: (typeof defaultValues)['display_item'] bounding_box: (typeof defaultValues)['render_box'] @@ -253,7 +245,7 @@ export function exportJSON(options: { version: PACKAGE.version, }, settings: { - export_namespace: aj.export_namespace, + export_namespace: aj.blueprint_id, target_minecraft_version: aj.target_minecraft_version, display_item: aj.display_item, bounding_box: aj.render_box, @@ -281,12 +273,15 @@ export function exportJSON(options: { name: animation.name, loop_mode: animation.loop, duration: animation.length, + // @ts-expect-error - Broken BB types excluded_nodes: animation.excluded_nodes.map(node => node.value), animators: {}, } for (const [uuid, animator] of Object.entries(animation.animators)) { // Only include animators with keyframes + // @ts-expect-error - Broken BB types if (animator.keyframes.length === 0) continue + // @ts-expect-error - Broken BB types animJSON.animators[uuid] = animator.keyframes.map(serailizeKeyframe) } json.animations[animation.uuid] = animJSON @@ -308,12 +303,14 @@ export function exportJSON(options: { ) } + const { existsSync, mkdirSync, writeFileSync } = getFsModule() + try { const dir = PathModule.dirname(exportPath) - if (dir && dir !== '.' && !fs.existsSync(dir)) { - fs.mkdirSync(dir, { recursive: true }) + if (dir && dir !== '.' && !existsSync(dir)) { + mkdirSync(dir, { recursive: true }) } - fs.writeFileSync(exportPath, compileJSON(json).toString()) + writeFileSync(exportPath, compileJSON(json).toString()) } catch (e: any) { throw new IntentionalExportError( `Failed to write JSON file ${exportPath}: ${String(e)}` @@ -373,7 +370,7 @@ function serailizeRenderedNode(node: AnyRenderedNode): ExportedRenderedNode { break } case 'text_display': { - json.text = new JsonText(node.text).toJSON() + json.text = new TextComponent(node.text).toJSON() break } } diff --git a/src/systems/jsonText/index.ts b/src/systems/jsonText/index.ts deleted file mode 100644 index d88a1c36..00000000 --- a/src/systems/jsonText/index.ts +++ /dev/null @@ -1,437 +0,0 @@ -import { JsonTextParser } from './parser' -import { JsonTextStringifier } from './stringifier' - -export const FONT = '16px MinecraftFull' - -export enum STYLE_KEYS { - BOLD = 'bold', - ITALIC = 'italic', - UNDERLINED = 'underlined', - STRIKETHROUGH = 'strikethrough', - OBFUSCATED = 'obfuscated', - COLOR = 'color', - FONT = 'font', - SHADOW_COLOR = 'shadow_color', -} - -export enum CONTENT_TYPES { - TEXT = 'text', - TRANSLATABLE = 'translatable', - SCORE = 'score', - SELECTOR = 'selector', - KEYBIND = 'keybind', - NBT = 'nbt', - OBJECT = 'object', -} - -export enum CONTENT_KEYS { - TEXT = 'text', - TRANSLATE = 'translate', - SCORE = 'score', - SELECTOR = 'selector', - KEYBIND = 'keybind', - NBT = 'nbt', - SPRITE = 'sprite', - PLAYER = 'player', -} - -export enum EVENT_KEYS { - CLICK_EVENT = 'click_event', - HOVER_EVENT = 'hover_event', - LEGACY_CLICK_EVENT = 'clickEvent', - LEGACY_HOVER_EVENT = 'hoverEvent', -} - -export enum NBT_SOURCE_KEYS { - BLOCK = 'block', - ENTITY = 'entity', - STORAGE = 'storage', -} - -export const COLOR_VALUES = { - dark_red: '#AA0000', - red: '#FF5555', - gold: '#FFAA00', - yellow: '#FFFF55', - dark_green: '#00AA00', - green: '#55FF55', - aqua: '#55FFFF', - dark_aqua: '#00AAAA', - dark_blue: '#0000AA', - blue: '#5555FF', - light_purple: '#FF55FF', - dark_purple: '#AA00AA', - white: '#FFFFFF', - gray: '#AAAAAA', - dark_gray: '#555555', - black: '#000000', -} as const - -export type ComponentStyle = Pick -export type TextObjectColor = keyof typeof COLOR_VALUES | `#${string}` -export type TextObjectShadowColor = number | [number, number, number, number] - -export interface LegacyClickEvent { - action: - | 'open_url' - | 'open_file' - | 'run_command' - | 'suggest_command' - | 'change_page' - | 'copy_to_clipboard' - value: string -} - -export type LegacyHoverEvent = - | { action: 'show_text'; contents: TextElement } - | { - action: 'show_item' - contents: - | string - | { - id: string - count?: number - // Text displays dont support hover events anyway, - // so I'll just ignore this for now. - tag?: any - } - } - | { - action: 'show_entity' - contents: { - type: string - id: string | [number, number, number, number] - name?: string - } - } - -export enum MODERN_CLICK_EVENT_SUBKEYS { - ID = 'id', - URL = 'url', - PATH = 'path', - COMMAND = 'command', - PAGE = 'page', - VALUE = 'value', - DIALOG = 'dialog', - PAYLOAD = 'payload', -} - -export type ModernClickEvent = - | { - action: 'open_url' - url: string - } - | { - action: 'open_file' - path: string - } - | { - action: 'run_command' - command: string - } - | { - action: 'suggest_command' - command: string - } - | { - action: 'change_page' - page: number - } - | { - action: 'copy_to_clipboard' - value: string - } - | { - action: 'show_dialog' - // Text displays don't support click events anyway, so I'll just ignore this type for now. - dialog: string | any - } - | { - action: 'custom' - id: string - payload?: any - } - -export type ModernHoverEvent = - | { - action: 'show_text' - value: TextElement - } - | { - action: 'show_item' - id: string - count?: number - components?: any - } - | { - action: 'show_entity' - id: string - uuid: string | [number, number, number, number] - name?: string - } - -export interface TextObject { - type?: CONTENT_TYPES - - text?: string - - translate?: string - fallback?: string - with?: TextElement[] - - score?: { - name: string - objective: string - } - - selector?: string - separator?: TextElement - - keybind?: string - - nbt?: string - source?: 'block' | 'entity' | 'storage' - block?: string - entity?: string - storage?: string - interpret?: boolean - - object?: 'atlas' | 'player' - sprite?: string - atlas?: string - player?: { - name?: string - id?: string | [number, number, number, number] - texture?: string - cape?: string - model?: 'wide' | 'slim' - hat?: boolean - properties?: Array<{ - name: string - value: string - signature?: string - }> - } - - font?: string - color?: TextObjectColor - bold?: boolean - italic?: boolean - underlined?: boolean - strikethrough?: boolean - obfuscated?: boolean - shadow_color?: TextObjectShadowColor - - extra?: TextElement[] - insertion?: string - - clickEvent?: LegacyClickEvent - hoverEvent?: LegacyHoverEvent - click_event?: ModernClickEvent - hover_event?: ModernHoverEvent -} - -export type TextElement = string | TextElement[] | TextObject - -export class JsonText { - static defaultStyle: ComponentStyle = { color: 'white' } - static defaultMinecraftVersion = '1.21.9' - - isJsonTextClass = true - content: TextElement - - constructor(jsonText: TextElement) { - this.content = jsonText - } - - toString(minify = true, minecraftVersion = JsonText.defaultMinecraftVersion) { - const content = minify ? this.flatten() : this.content - return new JsonTextStringifier(minecraftVersion).stringify(content) - } - - toJSON(): TextElement { - return structuredClone(this.content) - } - - /** - * Returns a flattened version of this JsonText. - * - * If `explicitStyles` is true, all styles will be explicitly set on each component, - * even if they are the same as the parent style. - */ - flatten(explicitStyles = false): Array { - const output: Array = [] - - const processComponent = (element: TextElement, parentStyle: ComponentStyle = {}) => { - const style = JsonText.getComponentStyle(element, parentStyle) - const previous = output[output.length - 1] - switch (true) { - case Array.isArray(element): { - for (const child of element) { - processComponent(child, style) - } - break - } - - case typeof element === 'string': - // Merge with previous element if possible - if (typeof previous === 'string' && JsonText.hasSameStyle(style, parentStyle)) { - output[output.length - 1] = previous + element - break - } else if ( - typeof previous === 'object' && - previous.text !== undefined && - JsonText.hasSameStyle(style, previous) - ) { - previous.text += element - break - } - - if (!explicitStyles && JsonText.hasSameStyle(style, parentStyle)) { - output.push(element) - break - } - output.push({ ...parentStyle, text: element }) - break - - case typeof element === 'object': { - const style = JsonText.getComponentStyle(element, parentStyle) - const processed = { ...element } - delete processed.with - delete processed.extra - output.push({ ...style, ...processed }) - - const { with: withArray = [], extra: extraArray = [] } = element - - if (withArray.length > 0) { - processComponent(withArray, style) - } - if (extraArray.length > 0) { - processComponent(extraArray, style) - } - break - } - - default: - console.warn('Unknown component type in flatten:', element) - break - } - } - - processComponent(this.content) - return output - } - - static getComponentStyle( - component: TextElement, - parentStyle: ComponentStyle = JsonText.defaultStyle - ): ComponentStyle { - switch (true) { - case Array.isArray(component): - if (component.length === 0) return { ...parentStyle } - return JsonText.getComponentStyle(component[0], parentStyle) - - case typeof component === 'string': - return { ...parentStyle } - - case typeof component === 'object': { - const style = { ...parentStyle } - for (const key of Object.values(STYLE_KEYS)) { - if (component[key] === undefined) continue - style[key] = component[key] as any - } - return style - } - - default: - console.warn('Unknown component type in getComponentStyle:', component) - return { ...parentStyle } - } - } - - static hasSameStyle(a: ComponentStyle, b: ComponentStyle): boolean { - for (const key of Object.values(STYLE_KEYS)) { - if (a[key] !== b[key]) return false - } - return true - } - - static intToRgba(color: number): [number, number, number, number] { - const a = (color >> 24) & 0xff - const r = (color >> 16) & 0xff - const g = (color >> 8) & 0xff - const b = color & 0xff - return [r / 255, g / 255, b / 255, a / 255] - } - - static rgbaToInt([r, g, b, a]: [number, number, number, number]): number { - r = Math.floor(r * 255) - g = Math.floor(g * 255) - b = Math.floor(b * 255) - a = Math.floor(a * 255) - return (a << 24) | (r << 16) | (g << 8) | b - } - - static intToHex8(color: number): string { - return `#${(color >>> 0).toString(16).padStart(8, '0')}` - } - - static hexToRgba(hex: string): [number, number, number, number] { - return JsonText.intToRgba(JsonText.hexToInt(hex)) - } - - static moveHex8AlphaToStart(hex: string): string { - const alpha = hex.slice(-2) - return '#' + alpha + hex.slice(1, -2) - } - - static hexToInt(hex: string): number { - if (!hex.startsWith('#') || (hex.length !== 7 && hex.length !== 9)) { - throw new Error('Invalid hex color format. Expected #RRGGBB or #AARRGGBB.') - } - if (hex.length === 7) { - hex = '#ff' + hex.slice(1) // Add alpha - } - const unsigned = parseInt(hex.slice(1), 16) - return unsigned > 0x7fffffff ? unsigned - 0x100000000 : unsigned - } - - static getColor(color: TextObjectColor | TextObjectShadowColor): tinycolor.Instance { - if (Array.isArray(color)) { - return tinycolor({ - r: color[0] * 255, - g: color[1] * 255, - b: color[2] * 255, - a: color[3] ?? 1 * 255, - }) - } else if (typeof color === 'number') { - const rgba = JsonText.intToRgba(color) - return tinycolor({ - r: rgba[0] * 255, - g: rgba[1] * 255, - b: rgba[2] * 255, - a: rgba[3] * 255, - }) - } else if (color.startsWith('#')) { - return tinycolor(color) - } else if (color in COLOR_VALUES) { - return tinycolor(COLOR_VALUES[color as keyof typeof COLOR_VALUES]) - } else { - console.warn('Unknown color:', color) - return tinycolor('white') - } - } - - /** - * Attempts to parse a stringified Json Text Component. - * - * Supports SNBT-based Json Text from 1.21.5+ - */ - static fromString( - str: string, - options?: ConstructorParameters[0] - ): JsonText | undefined { - const parser = new JsonTextParser(options) - return parser.parse(str) - } -} diff --git a/src/systems/jsonText/parser.ts b/src/systems/jsonText/parser.ts deleted file mode 100644 index 015e4f5e..00000000 --- a/src/systems/jsonText/parser.ts +++ /dev/null @@ -1,2305 +0,0 @@ -import { StringStream } from 'generic-stream' -import { Stopwatch } from 'src/util/stopwatch' -import { - COLOR_VALUES, - CONTENT_KEYS, - CONTENT_TYPES, - JsonText, - MODERN_CLICK_EVENT_SUBKEYS, - TextObjectShadowColor, - type LegacyClickEvent, - type LegacyHoverEvent, - type ModernClickEvent, - type ModernHoverEvent, - type TextElement, - type TextObject, - type TextObjectColor, -} from '.' -import type { MergeUnion } from '../../util/utilityTypes' - -enum NUMBER_TYPES { - ANY = 'number', - BYTE = 'byte', - SHORT = 'short', - INTEGER = 'int', - LONG = 'long', - FLOAT = 'float', - DOUBLE = 'double', - HEXADECIMAL = 'hexadecimal', - BINARY = 'binary number', -} - -enum FEATURES { - /** - * Allow unquoted object keys. - */ - LITERAL_KEYS = 1 << 0, - - /** - * Allow unquoted strings. - */ - LITERAL_STRINGS = 1 << 1, - - /** - * Allow using single quotes for object keys and strings. - */ - SINGLE_QUOTES = 1 << 2, - - /** - * Allow trailing commas in objects and arrays. - */ - TRAILING_COMMAS = 1 << 3, - - /** - * Allow omitting commas in objects and arrays. - * - * @NOTE This is not supported by Minecraft. Any JSON text components using this feature must be processed by this parser before using them in-game. - */ - OPTIONAL_COMMAS = 1 << 4, - - /** - * Use modern event format for text component mouse events. - * - `clickEvent` -> `click_event` - * - `hoverEvent` -> `hover_event` - * - * Requires [Minecraft 1.21.5](https://minecraft.wiki/w/Java_Edition_1.21.5) or above. - - * See [this](https://minecraft.wiki/w/Java_Edition_1.21.5#Command_format:~:text=Text%20component%20format) article for more information. - */ - MODERN_EVENT_FORMAT = 1 << 5, - - /** - * Enables the `show_dialog` action for `click_event`. - * - * Requires {@link MODERN_EVENT_FORMAT} to be enabled - * - * Requires [Minecraft 1.21.6](https://minecraft.wiki/w/Java_Edition_1.21.6) or above. - */ - CLICK_EVENT_ACTION_SHOW_DIALOG = 1 << 6, - - /** - * Enables use of `type: "object"` in text objects. - * - * Requires [Minecraft 1.21.9](https://minecraft.wiki/w/Java_Edition_1.21.9) or above. - * - * See [this](https://minecraft.wiki/w/Java_Edition_1.21.9#Command_format:~:text=Text%20component%20format) article for more information. - */ - TEXT_OBJECT_TYPE_OBJECT = 1 << 7, - - /** - * Enables the `shadow_color` field in text objects. - * - * Requires [Minecraft 1.21.4](https://minecraft.wiki/w/Java_Edition_1.21.4) or above. - * - * See [this](https://minecraft.wiki/w/Java_Edition_1.21.4#Command_format:~:text=Raw%20JSON%20text%20format) article for more information. - */ - SHADOW_COLOR = 1 << 8, - - /** - * Enables the `shadow_color` field to accept {@link TextObjectColor} values, in addition to the normal number and array formats. - * - * Requires {@link SHADOW_COLOR} to be enabled - * - * @NOTE This is not supported by Minecraft. Any JSON text components using this feature must be processed by this parser before using them in-game. - */ - SHADOW_COLOR_ACCEPTS_STRING = 1 << 9, - - /** - * Enables `\s` as an escape sequence for space characters in strings. - * - * E.g. `"Hello,\sWorld!"` -> `"Hello, World!"` - * - * Requires [Minecraft 1.21.5](https://minecraft.wiki/w/Java_Edition_1.21.5#Command_format:~:text=network%20format%20directly.-,SNBT%20format) or above. - */ - SPACE_ESCAPE_SEQUENCE = 1 << 10, - - /** - * Enables `\x` as an escape sequence for hexadecimal characters in strings. - * - * E.g. `"\x41"` -> `"A"` - * - * Requires [Minecraft 1.21.5](https://minecraft.wiki/w/Java_Edition_1.21.5#Command_format:~:text=network%20format%20directly.-,SNBT%20format) or above. - */ - HEX_ESCAPE_SEQUENCE = 1 << 11, - - /** - * Enables `\U` as an escape sequence for 8-digit unicode characters in strings. - * - * E.g. `"\U0001F600"` -> `"😀"` - * - * Requires [Minecraft 1.21.5](https://minecraft.wiki/w/Java_Edition_1.21.5#Command_format:~:text=network%20format%20directly.-,SNBT%20format) or above. - */ - EIGHT_DIGIT_UNICODE_ESCAPE_SEQUENCE = 1 << 12, - - /** - * Enables `\N{...}` as an escape sequence for named unicode characters in strings. - * - * E.g. `"\N{Snowman}"` -> `"☃"` - * - * Requires [Minecraft 1.21.5](https://minecraft.wiki/w/Java_Edition_1.21.5#Command_format:~:text=network%20format%20directly.-,SNBT%20format) or above. - */ - NAMED_UNICODE_ESCAPE_SEQUENCE = 1 << 13, - - /** - * Allows text objects to infer `text` as an empty string if no other {@link CONTENT_KEYS} are present. - * - * E.g. `{ color: green }` -> `{ text: '', color: green }` - */ - IMPLICIT_TEXT_KEY = 1 << 14, - - /** - * Allows text objects to infer keys from keyless values. - * - * Inferrable keys: - * - `text` - * - `{ 'Hello, World!', color: red }` -> `{ text: 'Hello, World!', color: red }` - * - `{ 'Hello, World!' }` -> `{ text: 'Hello, World!' }` - * - `translate` (if `with` or `fallback` is present) - * - `{ my.translation.key, with: [...] }` -> `{ translate: my.translation.key, with: [...] }` - * - `{ my.translation.key, fallback: 'Hello, World!' }` -> `{ translate: my.translation.key, fallback: 'Hello, World!' }` - * - `color` (if `text` or `translate` is present) - * - `{ text: 'Hello, World!', red }` -> `{ text: 'Hello, World!', color: red }` - * - `{ text: '', '#00aced' }` -> `{ text: '', color: '#00aced' }` - */ - TEXT_OBJECT_INFERRED_KEYS = 1 << 15, - - ALLOW_CLICK_EVENTS = 1 << 16, - ALLOW_HOVER_EVENTS = 1 << 17, -} - -export function compareVersions(a: string, b: string): number { - const aParts = a.split('.').map(Number) - const bParts = b.split('.').map(Number) - for (let i = 0; i < Math.max(aParts.length, bParts.length); i++) { - const aPart = aParts[i] ?? 0 - const bPart = bParts[i] ?? 0 - if (aPart > bPart) return 1 - if (aPart < bPart) return -1 - } - return 0 -} - -export class JsonTextParserError extends Error { - constructor(message: string) { - super(message) - this.name = 'JsonTextParserError' - } -} - -interface JsonTextSyntaxErrorOptions { - child?: Error - line?: number - column?: number - pointerLength?: number -} - -export class JsonTextSyntaxError extends Error { - private originalMessage: string - - stream: StringStream - child?: Error - line: number - column: number - pointerLength: number - - constructor( - message: string, - stream: StringStream, - { - child, - line = stream.line, - column = stream.column, - pointerLength = 1, - }: JsonTextSyntaxErrorOptions = {} - ) { - super(message) - this.name = 'JsonTextSyntaxError' - this.stream = stream - this.child = child - this.line = line - this.column = column - this.pointerLength = pointerLength - - this.originalMessage = message - - if (this.child) { - this.message = `${this.message} at ${this.line}:${this.column}\n${this.child.message}` - return - } - - this.updatePointerMessage() - } - - getOriginErrorMessage(): string { - if (this.child) { - if (this.child instanceof JsonTextSyntaxError) { - return this.child.getOriginErrorMessage() - } - return this.child.message - } - return this.message - } - - updatePointerMessage() { - // Unexpected '}' at 1:5 - // Hello, World!"} - // ↑ - - // Complete the line - const startOfLine = this.stream.lines[this.line - 1].startIndex - const endOfLine = this.stream.seek('\n') - - const lineString = this.stream.string.slice(startOfLine, endOfLine).trimEnd() - - // Get column where tabs count as 4 characters - const actualColumn = lineString.slice(0, this.column - 1).replace(/\t/g, ' ').length + 1 - - const pointer = ' '.repeat(actualColumn - 1) + '↑'.repeat(this.pointerLength) - this.message = `${this.originalMessage} at ${this.line}:${this.column}\n${lineString}\n${pointer}` - } -} - -export namespace CHARS { - export const ALPHA_LOWER = Array.from('abcdefghijklmnopqrstuvwxyz') - export const ALPHA_UPPER = Array.from('ABCDEFGHIJKLMNOPQRSTUVWXYZ') - export const ALPHA = ALPHA_LOWER.concat(ALPHA_UPPER) - export const NUMBER = Array.from('0123456789') - export const INT_START = Array.from('-123456789') - export const NUMBER_START = NUMBER.concat(Array.from('-.')) - export const ALPHANUMERIC = ALPHA.concat(NUMBER) - export const VERTICAL_WHITESPACE = Array.from('\n\r') - export const WHITESPACE = Array.from(' \t').concat(VERTICAL_WHITESPACE) - export const LITERAL = ALPHANUMERIC.concat(Array.from('._-+')) - export const LITERAL_START = ALPHA.concat('_') - export const QUOTES = Array.from(`"'`) - export const BINARY = Array.from('01') - export const HEXADECIMAL = NUMBER.concat(Array.from('abcdef'), Array.from('ABCDEF')) - export const SYNTAX_BOUNDARY = WHITESPACE.concat(QUOTES, Array.from(',:[]{}')) -} - -interface SourcePosition { - index: number - line: number - column: number - equals(other: { line: number; column: number }): boolean -} - -/** - * A multi-version JSON text parser. - */ -export class JsonTextParser { - static maxNestingDepth = 512 - static maxArrayLength = 2 ** 31 - 9 - - // eslint-disable-next-line @typescript-eslint/naming-convention - static FEATURES = FEATURES - - static defaultFeatures = - // Minecraft syntax sugar - FEATURES.LITERAL_KEYS | - FEATURES.LITERAL_STRINGS | - FEATURES.SINGLE_QUOTES | - FEATURES.TRAILING_COMMAS | - // Custom syntax sugar - FEATURES.OPTIONAL_COMMAS | - FEATURES.SHADOW_COLOR_ACCEPTS_STRING | - FEATURES.TEXT_OBJECT_INFERRED_KEYS | - FEATURES.IMPLICIT_TEXT_KEY | - // Mouse events - FEATURES.ALLOW_CLICK_EVENTS | - FEATURES.ALLOW_HOVER_EVENTS - - private s!: StringStream - private currentNestingDepth = 0 - - minecraftVersion: string - enabledFeatures = 0 - - /** - * If {@link featureFlags} is not provided, features will be automatically enabled based on {@link minecraftVersion}. - * - * Individual features can be enabled/disabled post-construction by modifying {@link enabledFeatures}. - * - * By default, the following features are always enabled: - * - {@link FEATURES.LITERAL_KEYS} - * - {@link FEATURES.LITERAL_STRINGS} - * - {@link FEATURES.SINGLE_QUOTES} - * - {@link FEATURES.TRAILING_COMMAS} - * - {@link FEATURES.OPTIONAL_COMMAS} - * - {@link FEATURES.SHADOW_COLOR_ACCEPTS_STRING} - * - {@link FEATURES.TEXT_OBJECT_INFERRED_KEYS} - * - {@link FEATURES.IMPLICIT_TEXT_KEY} - * See {@link FEATURES} for information on each feature. - * - * @example Disable *only* literal strings and enable modern event format: - * ```ts - * const parser = new JsonTextParser('{ text: Hello }') - * parser.enabledFeatures &= ~FEATURES.LITERAL_STRINGS - * parser.enabledFeatures |= FEATURES.MODERN_EVENT_FORMAT - * ``` - * - */ - constructor(options?: { minecraftVersion?: string; featureFlags?: number }) { - const { minecraftVersion = JsonText.defaultMinecraftVersion, featureFlags } = options ?? {} - - this.minecraftVersion = minecraftVersion - this.reset() - - if (typeof featureFlags === 'number') { - this.enabledFeatures = featureFlags - } else { - this.enabledFeatures |= JsonTextParser.defaultFeatures - - if (compareVersions(this.minecraftVersion, '1.21.4') >= 0) { - this.enabledFeatures |= FEATURES.SHADOW_COLOR - } - if (compareVersions(this.minecraftVersion, '1.21.5') >= 0) { - this.enabledFeatures |= - FEATURES.MODERN_EVENT_FORMAT | - FEATURES.SPACE_ESCAPE_SEQUENCE | - FEATURES.HEX_ESCAPE_SEQUENCE | - FEATURES.EIGHT_DIGIT_UNICODE_ESCAPE_SEQUENCE | - FEATURES.NAMED_UNICODE_ESCAPE_SEQUENCE - } - if (compareVersions(this.minecraftVersion, '1.21.6') >= 0) { - this.enabledFeatures |= FEATURES.CLICK_EVENT_ACTION_SHOW_DIALOG - } - if (compareVersions(this.minecraftVersion, '1.21.9') >= 0) { - this.enabledFeatures |= FEATURES.TEXT_OBJECT_TYPE_OBJECT - } - } - } - - parse(text: string): JsonText { - const stopwatch = new Stopwatch('Parse JSON Text').start() - this.s = new StringStream(text) - this.reset() - - try { - this.consumeWhitespace() - const result = this.parseTextElement() - this.consumeWhitespace() - if (this.s.item) { - this.throwSyntax(`Unexpected trailing '${this.s.item}' after JsonTextElement`) - } - stopwatch.debug(result) - return new JsonText(result) - } catch (e: any) { - if (e instanceof JsonTextParserError) { - throw new JsonTextParserError( - `Internal Parser Error:\n\t${e.message}\nThis is a bug, please report it.` - ) - } - throw e - } - } - - throwSyntax(message: string, options?: JsonTextSyntaxErrorOptions): never { - throw new JsonTextSyntaxError(message, this.s, options) - } - - private recordPosition(): SourcePosition { - return { - index: this.s.index, - line: this.s.line, - column: this.s.column, - equals(other: { line: number; column: number }): boolean { - return this.line === other.line && this.column === other.column - }, - } - } - - private reset() { - this.currentNestingDepth = 0 - } - - private consumeWhitespace() { - this.s.consumeWhile(s => !!s.item && CHARS.WHITESPACE.includes(s.item)) - } - - private parseTextElement(): TextElement { - let result: TextElement - if (this.s.item === '{') { - result = this.parseTextObject() - } else if (this.s.item === '[') { - result = this.parseTextElementArray() - } else if ( - !this.s.item || - CHARS.QUOTES.includes(this.s.item) || - CHARS.LITERAL_START.includes(this.s.item) - ) { - result = this.parseString() - } else { - this.throwSyntax(`Unexpected '${this.s.item}' in JsonTextElement`) - } - - return result - } - - private parseObject({ - objectName, - // Defaults to an empty set to avoid having to check for undefined later - keys = new Set(), - required, - parseKey, - parseValue, - validateResult, - }: { - /** Name of the object being parsed, for error messages. */ - objectName: string - /** Keys that are allowed in the object. */ - keys?: Set - /** Keys that are required in the object. */ - required?: Set - /** - * Called to parse a field's key. If not provided, keys will be parsed as strings. - * - * @returns The parsed key, or `undefined` to indicate the default key parser should be used. - * - * Can be used to parse keyless values. - */ - parseKey?: (keys: Set, obj: Partial) => { key: K; value?: T[K] & string } | undefined - /** - * Called to parse a field's value, and set it on the object. - * - * Will never be called for fields not in {@link expectedFields}. - */ - parseValue: (key: K, obj: Partial) => void - /** - * Called with the completed object for extra validation. - * - * Returns a string to indicate an error, or undefined if the object is valid. - */ - validateResult?: (obj: Partial) => string | void - }): T { - this.currentNestingDepth++ - if (this.currentNestingDepth > JsonTextParser.maxNestingDepth) { - this.throwSyntax('Nesting depth limit exceeded') - } - - const startPosition = this.recordPosition() - - try { - this.expect(this.s.item, '{', 'to begin ' + objectName, true) - this.consumeWhitespace() - const obj = {} as Partial - while (this.s.item !== '}') { - const keyPosition = this.recordPosition() - const quoted = CHARS.QUOTES.includes(this.s.item!) - if (quoted) keyPosition.column++ - - let key: K | undefined - const result = parseKey?.(keys, obj) - if (result) { - key = result.key - } else { - // Default key handling - if (this.enabledFeatures & FEATURES.LITERAL_KEYS) { - key = this.parseString() as K - } else { - key = this.parseQuotedString() as K - } - } - if (result?.value !== undefined) { - obj[key] = result.value - this.consumeWhitespace() - // If a colon is found after a keyless value, it was actually an unknown key - if (this.s.item === ':') { - this.throwSyntax(`Unknown key '${result.value}' in ${objectName}`, { - ...keyPosition, - pointerLength: result.value.length, - }) - } - } else { - if (obj[key] !== undefined) { - this.throwSyntax(`Duplicate key '${key}'`, { - ...keyPosition, - pointerLength: key.length, - }) - } - - if (keys.size > 0 && !keys.has(key)) { - this.throwSyntax(`Unknown key '${key}' in ${objectName}`, { - ...keyPosition, - pointerLength: key.length, - }) - } - - this.expectSyntaxBoundaryAfter(`key '${key}'`) - this.consumeWhitespace() - - this.expect(this.s.item, ':', `to follow key '${key}'`, true) - this.consumeWhitespace() - - if (!this.s.item) { - this.throwSyntax(`Unexpected EOF in ` + objectName, this.s) - } - const valuePosition = this.recordPosition() - parseValue(key, obj) - // If the value parser didn't consume anything, assume the value is missing. - if (valuePosition.equals(this.s)) { - this.throwSyntax(`Missing value for '${key}'`, this.s) - } - } - this.consumeWhitespace() - - if (this.s.item === ',') { - this.s.consume() - this.consumeWhitespace() - if (this.s.item === ',') { - this.throwSyntax(`Extra comma`, this.s) - } - if (this.s.item === '}' && !(this.enabledFeatures & FEATURES.TRAILING_COMMAS)) { - this.throwSyntax(`Trailing comma in ` + objectName, this.s) - } - } else if (this.s.item === '}') { - break - } else if (this.s.item === undefined) { - this.throwSyntax('Unexpected EOF in ' + objectName, this.s) - } else if (!(this.enabledFeatures & FEATURES.OPTIONAL_COMMAS)) { - this.throwSyntax(`Expected ',' or '}' after ${objectName} entry`) - } - } - this.s.consume() // } - - if (required) { - for (const key of required) { - if (obj[key] !== undefined) continue - this.throwSyntax( - `Missing required field '${String(key)}' in ` + objectName, - startPosition - ) - } - } - - if (validateResult) { - const error = validateResult(obj) - if (error) { - this.throwSyntax(error, startPosition) - } - } - - this.currentNestingDepth-- - return obj as T - } catch (e: any) { - this.throwSyntax('Invalid ' + objectName, { child: e, ...startPosition }) - } - } - - private normalizeHexColor(color: string): string { - if (color.startsWith('0x')) color = '#' + color.substring(2) - if (!/^#[0-9a-fA-F]{6}$/i.test(color)) { - this.throwSyntax(`Invalid hex color '${color}'`, this.s) - } - return color.toLowerCase() - } - - private normalizeHex8Color(color: string): string { - if (color.startsWith('0x')) color = '#' + color.substring(2) - if (!/^#[0-9a-fA-F]{8}$/i.test(color)) { - this.throwSyntax(`Invalid hex color '${color}'`, this.s) - } - return color.toLowerCase() - } - - private assertTextObjectColorIsValid(color: string): asserts color is TextObjectColor { - if (color.startsWith('#')) { - this.normalizeHexColor(color) - } else if (!(color in COLOR_VALUES)) { - this.throwSyntax(`Unknown color '${color}'`, this.s) - } - } - - private parseTextObjectColor(): TextObjectColor { - const color = this.parseString() - if (color.startsWith('#')) { - this.normalizeHexColor(color) - return color as `#${string}` - } else if (color in COLOR_VALUES) { - return color as keyof typeof COLOR_VALUES - } else { - this.throwSyntax(`Unknown color '${color}'`, this.s) - } - } - - private parseTextObjectShadowColor(): TextObjectShadowColor { - if (!(this.enabledFeatures & FEATURES.SHADOW_COLOR)) { - this.throwSyntax(`'shadow_color' field is only available in Minecraft 1.21.4 and above`) - } - - if (this.s.item === '[') { - const rgba = this.parseFloatArray(4) as [number, number, number, number] - for (const n of rgba) { - if (typeof n !== 'number' || n < 0 || n > 1) { - this.throwSyntax(`'shadow_color' array values must be numbers between 0 and 1`) - } - } - return rgba - } else if (CHARS.NUMBER.includes(this.s.item!)) { - const colorString = this.parseNumber(NUMBER_TYPES.INTEGER) - let color: number - if (colorString.startsWith('0x')) { - color = parseInt(colorString.substring(2), 16) - } else { - color = parseInt(colorString, 10) - } - if (typeof color !== 'number' || color < 0 || color > 0xffffffff) { - this.throwSyntax(`'shadow_color' value must be a number between 0 and 0xffffffff`) - } - return JsonText.intToRgba(color) - } - - if (!(this.enabledFeatures & FEATURES.SHADOW_COLOR_ACCEPTS_STRING)) { - this.throwSyntax(`Expected value of 'shadow_color' to be a float-array or integer.`) - } - - let hexColor = this.parseString() - if (hexColor.startsWith('#')) { - hexColor = this.normalizeHex8Color(hexColor) - } else if (hexColor in COLOR_VALUES) { - hexColor = COLOR_VALUES[hexColor as keyof typeof COLOR_VALUES] - } else { - this.throwSyntax(`Unknown color '${hexColor}'`, this.s) - } - return JsonText.hexToRgba(hexColor) - } - - private parseTextObject() { - return this.parseObject({ - objectName: 'TextObject', - keys: new Set([ - 'type', - 'font', - 'color', - 'bold', - 'italic', - 'underlined', - 'strikethrough', - 'obfuscated', - 'extra', - 'insertion', - 'clickEvent', - 'hoverEvent', - 'shadow_color', - 'click_event', - 'hover_event', - 'text', - 'translate', - 'fallback', - 'with', - 'score', - 'selector', - 'separator', - 'keybind', - 'nbt', - 'block', - 'entity', - 'storage', - 'interpret', - 'object', - 'sprite', - 'atlas', - 'player', - ]), - parseKey: (keys, obj) => { - if (this.enabledFeatures & FEATURES.TEXT_OBJECT_INFERRED_KEYS) { - if (this.s.item === '#') { - if (obj.color !== undefined) { - this.throwSyntax( - `Cannot infer keyless value as 'color' when 'color' is already defined`, - this.s - ) - } - const colorString = this.parseHashedHexColor() - return { key: 'color', value: colorString } - } else if (this.s.look(0, 2) === '0x') { - if (obj.color !== undefined) { - this.throwSyntax( - `Cannot infer keyless value as 'color' when 'color' is already defined`, - this.s - ) - } - // Parse as hex color - const colorString = this.parseNumber(NUMBER_TYPES.HEXADECIMAL) - return { key: 'color', value: this.normalizeHexColor(colorString) } - } - } - - let key: keyof TextObject | undefined - if (this.enabledFeatures & FEATURES.LITERAL_KEYS) { - key = this.parseString() as keyof TextObject - } else { - key = this.parseQuotedString() as keyof TextObject - } - // Let the main parser handle known and duplicate keys - if (keys.has(key) || obj[key] != undefined) return { key } - - if (this.enabledFeatures & FEATURES.TEXT_OBJECT_INFERRED_KEYS) { - // Unknown key, try to infer - if ( - obj.color === undefined && - (obj.text !== undefined || obj.translate !== undefined) - ) { - this.assertTextObjectColorIsValid(key) - return { key: 'color', value: key } - } else if ( - obj.translate === undefined && - (obj.fallback !== undefined || obj.with !== undefined) - ) { - return { key: 'translate', value: key } - } else if (obj.text === undefined) { - return { key: 'text', value: key } - } - } - - return { key } // Let the main parser handle unknown keys - }, - parseValue: (key, obj) => { - switch (key) { - case 'sprite': - case 'atlas': - if (!(this.enabledFeatures & FEATURES.TEXT_OBJECT_TYPE_OBJECT)) { - this.throwSyntax( - `'${key}' field is only available in Minecraft 1.21.9 and above` - ) - } - case 'insertion': - case 'font': - case 'keybind': - case 'selector': - case 'nbt': - case 'block': - case 'entity': - case 'storage': - case 'text': - case 'translate': - case 'fallback': - obj[key] = this.parseString() - break - - case 'bold': - case 'italic': - case 'obfuscated': - case 'strikethrough': - case 'underlined': - case 'interpret': - obj[key] = this.parseBoolean() - break - - case 'source': - obj[key] = this.parseString(['storage', 'block', 'entity']) - break - - case 'separator': - obj[key] = this.parseTextElement() - break - - case 'object': - if (!(this.enabledFeatures & FEATURES.TEXT_OBJECT_TYPE_OBJECT)) { - this.throwSyntax( - `'object' field is only available in Minecraft 1.21.9 and above` - ) - } - obj[key] = this.parseString(['atlas', 'player']) - break - - case 'player': - if (!(this.enabledFeatures & FEATURES.TEXT_OBJECT_TYPE_OBJECT)) { - this.throwSyntax( - `'player' field is only available in Minecraft 1.21.9 and above` - ) - } - obj[key] = this.parsePlayerObject() - break - - case 'type': { - const type = this.parseString(Object.values(CONTENT_TYPES)) - if ( - type === CONTENT_TYPES.OBJECT && - !(this.enabledFeatures & FEATURES.TEXT_OBJECT_TYPE_OBJECT) - ) { - this.throwSyntax( - `Object type '${CONTENT_TYPES.OBJECT}' is only available in Minecraft 1.21.9 and above` - ) - } - obj[key] = type - break - } - - case 'color': - obj[key] = this.parseTextObjectColor() - break - - case 'shadow_color': - obj[key] = this.parseTextObjectShadowColor() - break - - case 'with': - case 'extra': - obj[key] = this.parseTextElementArray() - break - - case 'score': - obj[key] = this.parseScoreObject() - break - - case 'clickEvent': { - if (!(this.enabledFeatures & FEATURES.ALLOW_CLICK_EVENTS)) { - this.throwSyntax(`'clickEvent' field is not allowed`) - } - const event = this.parseLegacyClickEventObject() - if (this.enabledFeatures & FEATURES.MODERN_EVENT_FORMAT) { - if (obj.click_event !== undefined) { - this.throwSyntax( - `Cannot use both 'clickEvent' and 'click_event' fields. For Minecraft versions below 1.21.5, use only 'clickEvent'` - ) - } - obj.click_event = this.transformLegacyClickEventToModern(event) - delete obj.clickEvent - break - } - obj[key] = event - break - } - - case 'click_event': { - if (!(this.enabledFeatures & FEATURES.ALLOW_CLICK_EVENTS)) { - this.throwSyntax(`'click_event' field is not allowed`) - } - const event = this.parseModernClickEventObject() - if (!(this.enabledFeatures & FEATURES.MODERN_EVENT_FORMAT)) { - if (obj.clickEvent !== undefined) { - this.throwSyntax( - `Cannot use both 'clickEvent' and 'click_event' fields. For Minecraft versions 1.21.5 and above, use only 'click_event'` - ) - } - obj.clickEvent = this.transformModernClickEventObjectToLegacy(event) - delete obj.click_event - break - } - obj[key] = event - break - } - - case 'hoverEvent': { - if (!(this.enabledFeatures & FEATURES.ALLOW_HOVER_EVENTS)) { - this.throwSyntax(`'hoverEvent' field is not allowed`) - } - const event = this.parseLegacyHoverEventObject() - if (this.enabledFeatures & FEATURES.MODERN_EVENT_FORMAT) { - if (obj.hover_event !== undefined) { - this.throwSyntax( - `Cannot use both 'hoverEvent' and 'hover_event' fields. For Minecraft versions below 1.21.5, use only 'hoverEvent'` - ) - } - obj.hover_event = this.transformLegacyHoverEventObjectToModern(event) - delete obj.hoverEvent - break - } - obj[key] = event - break - } - - case 'hover_event': - if (!(this.enabledFeatures & FEATURES.ALLOW_HOVER_EVENTS)) { - this.throwSyntax(`'hover_event' field is not allowed`) - } - const event = this.parseModernHoverEventObject() - if (!(this.enabledFeatures & FEATURES.MODERN_EVENT_FORMAT)) { - if (obj.hoverEvent !== undefined) { - this.throwSyntax( - `Cannot use both 'hoverEvent' and 'hover_event' fields. For Minecraft versions 1.21.5 and above, use only 'hover_event'` - ) - } - obj.hoverEvent = this.transformModernHoverEventObjectToLegacy(event) - delete obj.hover_event - break - } - obj[key] = event - break - } - }, - validateResult: obj => { - if (this.enabledFeatures & FEATURES.TEXT_OBJECT_INFERRED_KEYS) { - if ( - obj.text !== undefined && - obj.translate === undefined && - (obj.with !== undefined || obj.fallback !== undefined) - ) { - obj.translate = obj.text - delete obj.text - } - } - - const contentKeys = Object.values(CONTENT_KEYS).filter(k => obj[k] !== undefined) - if (contentKeys.length > 1) { - return `Only one content field may be present, but found ${ - contentKeys.length - }: '${contentKeys.join("', '")}'` - } - - if (Object.values(CONTENT_KEYS).every(k => obj[k] == undefined)) { - if (this.enabledFeatures & FEATURES.IMPLICIT_TEXT_KEY) { - obj.text ??= '' - } else { - return `At least one content field must be present: ${Object.values( - CONTENT_KEYS - ).join(', ')}` - } - } - - switch (obj.type) { - case CONTENT_TYPES.TEXT: - if (obj.text == undefined) { - return `'text' is required when 'type' is '${CONTENT_TYPES.TEXT}'` - } - break - - case CONTENT_TYPES.TRANSLATABLE: - if (obj.translate == undefined) { - return `'translate' is required when 'type' is '${CONTENT_TYPES.TRANSLATABLE}'` - } - break - - case CONTENT_TYPES.SCORE: - if (obj.score == undefined) { - return `'score' is required when 'type' is '${CONTENT_TYPES.SCORE}'` - } - break - - case CONTENT_TYPES.SELECTOR: - if (obj.selector == undefined) { - return `'selector' is required when 'type' is '${CONTENT_TYPES.SELECTOR}'` - } - break - - case CONTENT_TYPES.KEYBIND: - if (obj.keybind == undefined) { - return `'keybind' is required when 'type' is '${CONTENT_TYPES.KEYBIND}'` - } - break - - case CONTENT_TYPES.NBT: - if (obj.nbt == undefined) { - return `'nbt' is required when 'type' is '${CONTENT_TYPES.NBT}'` - } - break - - case CONTENT_TYPES.OBJECT: - if (obj.sprite == undefined) { - return `'sprite' is required when 'type' is '${CONTENT_TYPES.OBJECT}'` - } - break - } - - if (obj.translate == undefined && obj.with != undefined) - return `'with' requires 'translate'` - else if (obj.translate == undefined && obj.fallback != undefined) - return `'fallback' requires 'translate'` - - if (obj.separator != undefined && obj.nbt == undefined && obj.selector == undefined) - return `'separator' requires 'nbt' or 'selector'` - - if (obj.object != undefined) { - if (obj.object === 'player' && obj.player == undefined) - return `player object requires 'player'` - else if (obj.object === 'atlas' && obj.sprite == undefined) - return `atlas object requires 'sprite'` - else if (obj.player == undefined && obj.sprite == undefined) - return `'object' requires 'player' or 'sprite'` - } - - if (obj.atlas != undefined && obj.sprite == undefined) { - return `'atlas' requires 'sprite'` - } - - if (obj.nbt == undefined) { - if (obj.source != undefined) return `'source' requires 'nbt'` - else if (obj.block != undefined) return `'block' requires 'nbt'` - else if (obj.entity != undefined) return `'entity' requires 'nbt'` - else if (obj.storage != undefined) return `'storage' requires 'nbt'` - } - - if (obj.nbt != undefined) { - if ( - obj.block == undefined && - obj.entity == undefined && - obj.storage == undefined - ) - return `'nbt' requires 'block', 'entity', or 'storage'` - - switch (obj.source) { - case 'block': - if (obj.block == undefined) - return `'nbt' with source of 'block' requires 'block'` - break - - case 'entity': - if (obj.entity == undefined) - return `'nbt' with source of 'entity' requires 'entity'` - break - - case 'storage': - if (obj.storage == undefined) - return `'nbt' with source of 'storage' requires 'storage'` - break - } - } - }, - }) - } - - private parsePlayerPropertyObject() { - return this.parseObject< - NonNullable['properties']>[number] - >({ - objectName: 'player property object', - keys: new Set(['name', 'value', 'signature']), - required: new Set(['name', 'value']), - parseValue: (key, obj) => { - switch (key) { - case 'name': - case 'value': - case 'signature': - obj[key] = this.parseString() - break - } - }, - }) - } - - private parsePlayerPropertiesArray() { - return this.parseArray['properties']>>({ - arrayName: 'player properties array', - parseItem: this.parsePlayerPropertyObject.bind(this), - }) - } - - private parsePlayerObject() { - return this.parseObject>({ - objectName: 'player object', - keys: new Set(['name', 'id', 'texture', 'cape', 'model', 'properties', 'hat']), - parseValue: (key, obj) => { - switch (key) { - case 'id': - if (this.s.item === '[') { - obj[key] = this.parseIntArray<[number, number, number, number]>( - false, - 4 - ) - break - } - // fallthrough - case 'name': - case 'texture': - case 'cape': - obj[key] = this.parseString() - break - - case 'hat': - obj[key] = this.parseBoolean() - break - - case 'model': - obj[key] = this.parseString(['wide', 'slim']) - break - - case 'properties': - obj[key] = this.parsePlayerPropertiesArray() - break - } - }, - }) - } - - private parseUnknownArray(arrayName: string) { - return this.parseArray({ - arrayName, - parseItem: this.parseUnknownValue.bind(this), - }) - } - - private parseUnknownValue() { - if (this.s.item === '{') { - return this.parseUnknownObject('object') - } else if (this.s.item === '[') { - return this.parseUnknownArray('array') - } else if (!this.s.item) { - this.throwSyntax('Unexpected EOF', this.s) - } else if (CHARS.QUOTES.includes(this.s.item)) { - return this.parseQuotedString() - } else if (this.s.item === 't' || this.s.item === 'f') { - return this.parseBoolean() - } else if (CHARS.NUMBER_START.includes(this.s.item)) { - return this.parseNumber() - } else if (CHARS.LITERAL_START.includes(this.s.item)) { - return this.parseLiteral() - } else { - this.throwSyntax(`Unexpected '${this.s.item}'`, this.s) - } - } - - private parseUnknownObject(objectName: string) { - return this.parseObject>({ - objectName, - parseValue: (key, obj) => { - obj[key] = this.parseUnknownValue() - }, - }) - } - - private parseScoreObject() { - return this.parseObject>({ - objectName: 'score object', - keys: new Set(['name', 'objective']), - required: new Set(['name', 'objective']), - parseValue: (key, obj) => { - switch (key) { - case 'name': - case 'objective': - obj[key] = this.parseString() - break - } - }, - }) - } - - private parseLegacyClickEventObject() { - return this.parseObject({ - objectName: 'clickEvent', - keys: new Set(['action', 'value']), - required: new Set(['action', 'value']), - parseValue: (key, obj) => { - switch (key) { - case 'action': - const value = this.parseString([ - 'open_url', - 'open_file', - 'run_command', - 'suggest_command', - 'change_page', - 'copy_to_clipboard', - ] as const) - if (value === 'open_file') { - this.throwSyntax(`clickEvent 'open_file' cannot be used by commands`) - } - obj[key] = value - break - - case 'value': - obj[key] = this.parseString() - break - } - }, - }) - } - - private parseModernClickEventObject() { - return this.parseObject>({ - objectName: 'click_event', - keys: new Set([ - 'action', - 'url', - 'path', - 'command', - 'page', - 'value', - 'dialog', - 'id', - 'payload', - ]), - required: new Set(['action']), - parseValue: (key, obj) => { - switch (key) { - case 'action': - const value = this.parseString([ - 'open_url', - 'open_file', - 'run_command', - 'suggest_command', - 'change_page', - 'copy_to_clipboard', - 'show_dialog', - 'custom', - ] as const) - if (value === 'open_file') { - this.throwSyntax(`Click event 'open_file' cannot be used by commands`) - } - if (value === 'show_dialog') { - if (!(this.enabledFeatures & FEATURES.CLICK_EVENT_ACTION_SHOW_DIALOG)) { - this.throwSyntax( - `Click event 'show_dialog' is only available in Minecraft 1.21.6 and above` - ) - } - } - obj[key] = value - break - - case 'url': - const url: string = this.parseString() - let parsedUrl: URL - try { - parsedUrl = new URL(url) - } catch (e: any) { - this.throwSyntax( - `Invalid URL format for 'url' in 'open_url' clickEvent: ${e.message}` - ) - } - - if (parsedUrl.protocol !== 'http:' && parsedUrl.protocol !== 'https:') { - this.throwSyntax(`Invalid URL: Protocol must be 'http:' or 'https:'`) - } - obj[key] = url - break - - case 'path': - obj[key] = this.parseString() - break - - case 'command': - obj[key] = this.parseString() - break - - case 'page': - obj[key] = parseInt(this.parseNumber(NUMBER_TYPES.INTEGER)) - break - - case 'value': - obj[key] = this.parseString() - break - - case 'dialog': - obj[key] = this.parseUnknownObject('click_event.dialog') - break - - case 'id': - obj[key] = this.parseString() - break - - case 'payload': - obj[key] = this.parseUnknownValue() - break - } - }, - validateResult: obj => { - let subkeys = Object.values(MODERN_CLICK_EVENT_SUBKEYS) - switch (obj.action) { - case 'open_url': - if (obj.url === undefined) { - return `Click event of type 'open_url' missing required key 'url'` - } - subkeys = subkeys.filter(k => k !== 'url') - break - - case 'open_file': - if (obj.path === undefined) { - return `Click event of type 'open_file' missing required key 'path'` - } - subkeys = subkeys.filter(k => k !== 'path') - break - - case 'run_command': - if (obj.command === undefined) { - return `Click event of type 'run_command' missing required key 'command'` - } - subkeys = subkeys.filter(k => k !== 'command') - break - - case 'suggest_command': - if (obj.command === undefined) { - return `Click event of type 'suggest_command' missing required key 'command'` - } - subkeys = subkeys.filter(k => k !== 'command') - break - - case 'change_page': - if (obj.page === undefined) { - return `Click event of type 'change_page' missing required key 'page'` - } - subkeys = subkeys.filter(k => k !== 'page') - break - - case 'copy_to_clipboard': - if (obj.value === undefined) { - return `Click event of type 'copy_to_clipboard' missing required key 'value'` - } - subkeys = subkeys.filter(k => k !== 'value') - break - - case 'custom': - if (obj.id === undefined) { - return `Click event of type 'custom' missing required key 'id'` - } - subkeys = subkeys.filter(k => k !== 'id') - subkeys = subkeys.filter(k => k !== 'payload') - break - - case 'show_dialog': - if (obj.dialog === undefined) { - return `Click event of type 'show_dialog' missing required key 'dialog'` - } - subkeys = subkeys.filter(k => k !== 'dialog') - break - } - - if (subkeys.some(k => obj[k] !== undefined)) { - return `Click event of type '${obj.action}' cannot have keys: ${subkeys - .map(k => `'${k}'`) - .join(', ')}` - } - }, - }) as ModernClickEvent - } - - private transformModernClickEventObjectToLegacy(event: ModernClickEvent): LegacyClickEvent { - switch (event.action) { - case 'open_url': - return { - action: 'open_url', - value: event.url, - } - - case 'open_file': - this.throwSyntax(`Click event 'open_file' cannot be used by commands`) - - case 'run_command': - case 'suggest_command': - return { - action: event.action, - value: event.command, - } - - case 'change_page': - return { - action: 'change_page', - value: String(event.page), - } - - case 'copy_to_clipboard': - return { - action: 'copy_to_clipboard', - value: event.value, - } - - case 'show_dialog': - this.throwSyntax( - `Click events of type 'show_dialog' are not supported in versions below 1.21.6` - ) - - case 'custom': - this.throwSyntax( - `Click events of type 'custom' are not supported in versions below 1.21.5` - ) - } - } - - private transformLegacyClickEventToModern(event: LegacyClickEvent): ModernClickEvent { - switch (event.action) { - case 'open_url': { - let url: string - try { - url = new URL(event.value).toString() - } catch { - this.throwSyntax(`Invalid URL format for 'open_url' clickEvent`) - } - if (!/^https?:\/\//.exec(event.value)) { - this.throwSyntax( - `Invalid URL format for 'open_url' clickEvent. URL must start with 'http://' or 'https://'` - ) - } - return { - action: 'open_url', - url: url, - } - } - - case 'open_file': - this.throwSyntax(`Click event 'open_file' cannot be used by commands`) - - case 'run_command': - case 'suggest_command': - return { - action: event.action, - command: event.value, - } - - case 'change_page': - return { - action: 'change_page', - page: Number(event.value), - } - - case 'copy_to_clipboard': - return { - action: 'copy_to_clipboard', - value: event.value, - } - } - } - - private parseLegacyHoverEventObjectShowItemContents() { - return this.parseObject< - Exclude<(LegacyHoverEvent & { action: 'show_item' })['contents'], string> - >({ - objectName: 'hoverEvent.contents', - keys: new Set(['id', 'count', 'tag']), - required: new Set(['id']), - parseValue: (key, obj) => { - switch (key) { - case 'id': - obj[key] = this.parseString() - break - - case 'count': - obj[key] = parseInt(this.parseNumber(NUMBER_TYPES.BYTE)) - break - - case 'tag': - obj[key] = this.parseUnknownValue() - break - } - }, - }) - } - - private parseLegacyHoverEventObjectShowEntityContents() { - return this.parseObject<(LegacyHoverEvent & { action: 'show_entity' })['contents']>({ - objectName: 'hoverEvent.contents', - keys: new Set(['type', 'id', 'name']), - required: new Set(['type', 'id']), - parseValue: (key, obj) => { - switch (key) { - case 'id': - if (this.s.item === '[') { - obj[key] = this.parseIntArray<[number, number, number, number]>( - false, - 4 - ) - break - } - // ID should fallthrough to string parsing if not an int array - case 'type': - case 'name': - obj[key] = this.parseString() - break - } - }, - }) - } - - private parseLegacyHoverEventObject() { - return this.parseObject({ - objectName: 'hoverEvent', - keys: new Set(['action', 'contents']), - required: new Set(['action', 'contents']), - parseValue: (key, obj) => { - switch (key) { - case 'action': - obj[key] = this.parseString(['show_text', 'show_item', 'show_entity']) - break - case 'contents': - switch (obj.action) { - case undefined: { - this.throwSyntax( - `'action' must be defined before 'contents' in hoverEvent` - ) - } - - case 'show_text': { - obj[key] = this.parseTextElement() - break - } - - case 'show_item': { - if (this.s.item === '{') { - obj[key] = this.parseLegacyHoverEventObjectShowItemContents() - break - } - obj[key] = this.parseString() - break - } - - case 'show_entity': { - obj[key] = this.parseLegacyHoverEventObjectShowEntityContents() - break - } - } - break - } - }, - }) - } - - private parseModernHoverEventObject() { - return this.parseObject>({ - objectName: 'hover_event', - keys: new Set(['action', 'value', 'id', 'count', 'components', 'name', 'uuid']), - required: new Set(['action']), - parseValue: (key, obj) => { - switch (key) { - case 'action': - obj[key] = this.parseString(['show_text', 'show_item', 'show_entity']) - break - - case 'uuid': - if (this.s.item === '[') { - obj[key] = this.parseIntArray<[number, number, number, number]>( - false, - 4 - ) - break - } - // UUID should fallthrough to string parsing if not an int array - case 'id': - case 'name': - obj[key] = this.parseString() - break - - case 'value': - obj[key] = this.parseTextElement() - break - - case 'count': - obj[key] = parseInt(this.parseNumber(NUMBER_TYPES.BYTE)) - break - - case 'components': - obj[key] = this.parseUnknownValue() - break - } - }, - validateResult: obj => { - if (obj.action === undefined) { - return `Hover event must include 'action' field` - } - - switch (obj.action) { - case 'show_text': - if (obj.value === undefined) { - return `Hover event 'show_text' missing required field 'value'` - } - break - - case 'show_item': - if (obj.id === undefined) { - return `Hover event 'show_item' missing required field 'id'` - } - break - - case 'show_entity': - if (obj.id === undefined) { - return `Hover event 'show_entity' missing required field 'id'` - } - if (obj.uuid === undefined) { - return `Hover event 'show_entity' missing required field 'uuid'` - } - break - } - - switch (true) { - case obj.value !== undefined && obj.action !== 'show_text': - return `'value' is only valid when hover_event action is 'show_text'` - - case obj.count !== undefined && obj.action !== 'show_item': - return `'count' is only valid when hover_event action is 'show_item'` - - case obj.id !== undefined && - obj.action !== 'show_item' && - obj.action !== 'show_entity': - return `'id' is only valid when hover_event action is 'show_item' or 'show_entity'` - - case obj.components !== undefined && obj.action !== 'show_item': - return `'components' is only valid when hover_event action is 'show_item'` - - case obj.name !== undefined && obj.action !== 'show_entity': - return `'name' is only valid when hover_event action is 'show_entity'` - - case obj.uuid !== undefined && obj.action !== 'show_entity': - return `'uuid' is only valid when hover_event action is 'show_entity'` - } - }, - }) as ModernHoverEvent - } - - private transformLegacyHoverEventObjectToModern(event: LegacyHoverEvent): ModernHoverEvent { - switch (event.action) { - case 'show_text': - return { - action: 'show_text', - value: event.contents, - } - - case 'show_item': - if (typeof event.contents === 'string') { - return { - action: 'show_item', - id: event.contents, - } - } - if (event.contents.tag !== undefined) { - this.throwSyntax( - `Cannot transform 'hoverEvent' with 'tag' into modern 'hover_event'.` + - ` Please use 'hover_event' for Minecraft versions 1.21.5 and above` - ) - } - return { - action: 'show_item', - id: event.contents.id, - count: event.contents.count, - } - - case 'show_entity': - return { - action: 'show_entity', - id: event.contents.type, - uuid: event.contents.id, - name: event.contents.name, - } - } - } - - private transformModernHoverEventObjectToLegacy(event: ModernHoverEvent): LegacyHoverEvent { - switch (event.action) { - case 'show_text': - return { - action: 'show_text', - contents: event.value, - } - - case 'show_item': - if (event.components !== undefined) { - this.throwSyntax( - `Cannot transform 'hover_event' with 'components' into legacy 'hoverEvent'.` + - ` Please use 'hoverEvent' for Minecraft versions below 1.21.5` - ) - } - return { - action: 'show_item', - contents: { - id: event.id, - count: event.count, - }, - } - - case 'show_entity': - if (Array.isArray(event.uuid)) { - this.throwSyntax( - `Cannot transform 'hover_event' with 'uuid' as int-array into legacy 'hoverEvent'.` + - ` Please either use a string UUID, or use 'hoverEvent' for Minecraft versions below 1.21.5` - ) - } - return { - action: 'show_entity', - contents: { - type: event.id, - id: event.uuid, - name: event.name, - }, - } - } - } - - private parseArray({ - arrayName, - parsePrefix, - parseItem, - expectedLength, - }: { - arrayName: string - /** - * Optional function to parse the array prefix (e.g., type identifier). - */ - parsePrefix?: () => void - parseItem: () => T[number] - expectedLength?: number - }): T { - this.currentNestingDepth++ - if (this.currentNestingDepth > JsonTextParser.maxNestingDepth) { - this.throwSyntax('Nesting depth limit exceeded', this.s) - } - - this.expect(this.s.item, '[', 'to begin ' + arrayName, true) - this.consumeWhitespace() - - if (parsePrefix) { - parsePrefix() - this.consumeWhitespace() - } - - const array = [] as unknown as T - while (this.s.item !== ']') { - this.consumeWhitespace() - const itemPosition = this.recordPosition() - const value = parseItem() - if (itemPosition.equals(this.s)) { - throw new JsonTextParserError( - `parseItem function for ${arrayName} did not consume any input` - ) - } - array.push(value) - if (array.length > JsonTextParser.maxArrayLength) { - this.throwSyntax('Array length limit exceeded', this.s) - } - this.expectSyntaxBoundaryAfter('array item') - this.consumeWhitespace() - - if (expectedLength !== undefined && array.length > expectedLength) { - this.throwSyntax( - `Too many items in ` + arrayName + ` (expected ${expectedLength})`, - itemPosition - ) - } - - if (this.s.item === ',') { - this.s.consume() - this.consumeWhitespace() - if (this.s.item === ',') { - this.throwSyntax(`Extra comma`, this.s) - } - if (this.s.item === ']' && !(this.enabledFeatures & FEATURES.TRAILING_COMMAS)) { - this.throwSyntax(`Trailing comma in ` + arrayName, this.s) - } - } else if (this.s.item === ']') { - break - } else if (this.s.item === undefined) { - this.throwSyntax('Unexpected EOF in ' + arrayName, this.s) - } else if (!(this.enabledFeatures & FEATURES.OPTIONAL_COMMAS)) { - this.throwSyntax(`Expected ',' or ']' after ${arrayName} item`, this.s) - } - } - - if (expectedLength !== undefined && array.length < expectedLength) { - this.throwSyntax( - `Not enough items in ` + - arrayName + - ` (expected ${expectedLength}, got ${array.length})` - ) - } - - this.s.consume() // ] - return array - } - - private parseTextElementArray(): TextElement[] { - return this.parseArray({ - arrayName: 'TextElementArray', - parseItem: this.parseTextElement.bind(this), - }) - } - - private parseIntArray(requireTypeIdentifier?: boolean, length?: number): T { - return this.parseArray({ - arrayName: 'int-array', - parsePrefix: () => { - if (this.s.item === 'I') { - this.s.consume() - this.consumeWhitespace() - this.expect(this.s.item, ';', 'to follow array type identifier', true) - } else if (requireTypeIdentifier) { - this.throwSyntax(`Expected explicit int-array`, this.s) - } - }, - parseItem: () => parseInt(this.parseNumber(NUMBER_TYPES.INTEGER)), - expectedLength: length, - }) - } - - private parseFloatArray(length?: number): T { - return this.parseArray({ - arrayName: 'float-array', - parseItem: () => parseFloat(this.parseNumber(NUMBER_TYPES.FLOAT)), - expectedLength: length!, - }) - } - - private collectHexDigits(count: number): string { - let hex = '' - for (let i = 0; i < count; i++) { - if (this.s.item && CHARS.HEXADECIMAL.includes(this.s.item)) { - hex += this.s.item - this.s.consume() - } else { - this.throwSyntax( - `Unexpected '${this.s.item!}' in ${count}-digit hex escape sequence` - ) - } - } - return hex - } - - private parseHashedHexColor(): string { - this.expect(this.s.item, '#', `to begin hex color`, true) - - const digits = this.parseDigits('hex', CHARS.HEXADECIMAL) - - return this.normalizeHexColor('#' + digits) - } - - // Validates and returns a string representation of the escape sequence. - // The renderer, such as Minecraft, will handle the actual escape sequence resolution. - private parseNamedUnicodeEscapeSequence(): string { - this.expect(this.s.look(0, 2), 'N{', `to begin named unicode escape sequence`, true) - - let name = '' - while ( - this.s.item && - this.s.item !== '}' && - !CHARS.VERTICAL_WHITESPACE.includes(this.s.item) - ) { - name += this.s.item - this.s.consume() - } - name = name.trim().toUpperCase() - - if (name.length === 0) { - this.throwSyntax(`Expected name in named unicode escape sequence`, this.s) - } - - this.expect(this.s.item, '}', `to end named unicode escape sequence`, true) - - return `\\N{${name}}` - } - - // Validates and returns a string representation of the escape sequence. - // The renderer, such as Minecraft, will handle the actual escape sequence resolution. - private parseUnicodeEscapeSequence(): string { - this.expect(this.s.item, ['x', 'u', 'U'], `to begin escape sequence`) - const char = this.s.item! - const expectedHexLength = this.s.item === 'x' ? 2 : this.s.item === 'u' ? 4 : 8 - this.s.consume() // u, x, or U - const hex = this.collectHexDigits(expectedHexLength) - return `\\${char}${hex}` - } - - private parseEscapeSequence(): string { - this.expect(this.s.item, '\\', `to begin escape sequence`, true) - - const item = this.s.item - if ( - item === '\\' || - item === "'" || - item === '"' || - item === 'n' || - item === 'b' || - item === 'r' || - item === 't' || - item === 'f' - ) { - this.s.consume() - return '\\' + item - } else if (item === 's') { - if (!(this.enabledFeatures & FEATURES.SPACE_ESCAPE_SEQUENCE)) { - this.throwSyntax( - `Minecraft ${this.minecraftVersion} does not support space escape sequences ('\\s')` - ) - } - - this.s.consume() - return '\\s' - } else if (item === 'u') { - return this.parseUnicodeEscapeSequence() - } else if (item === 'x') { - if (!(this.enabledFeatures & FEATURES.HEX_ESCAPE_SEQUENCE)) { - this.throwSyntax( - `Minecraft ${this.minecraftVersion} does not support hex unicode escape sequences ('\\x00')` - ) - } - - return this.parseUnicodeEscapeSequence() - } else if (item === 'U') { - if (!(this.enabledFeatures & FEATURES.EIGHT_DIGIT_UNICODE_ESCAPE_SEQUENCE)) { - this.throwSyntax( - `Minecraft ${this.minecraftVersion} does not support 8-digit unicode escape sequences ('\\U00000000')` - ) - } - - return this.parseUnicodeEscapeSequence() - } else if (item === 'N') { - if (!(this.enabledFeatures & FEATURES.NAMED_UNICODE_ESCAPE_SEQUENCE)) { - this.throwSyntax( - `Minecraft ${this.minecraftVersion} does not support named unicode escape sequences ('\\${item}{Name}')` - ) - } - - return this.parseNamedUnicodeEscapeSequence() - } else { - this.throwSyntax(`Unknown escape sequence '\\${item!}'`, this.s) - } - } - - private parseQuotedString(): string { - const quote = this.s.item! - this.expect(this.s.item, CHARS.QUOTES, 'to begin string', true) - - if (this.s.item === "'" && !(this.enabledFeatures & FEATURES.SINGLE_QUOTES)) { - this.throwSyntax( - `Single quotes are not supported in Minecraft ${this.minecraftVersion}` - ) - } - - let str = '' - while (this.s.item) { - if (this.s.item === '\\') { - str += this.parseEscapeSequence() - continue - } else if (this.s.item === quote) { - break - } else if (CHARS.VERTICAL_WHITESPACE.includes(this.s.item)) { - this.throwSyntax(`Expected ${quote} to close string`, this.s) - } - str += this.s.item - this.s.consume() - } - if (!this.s.item) { - this.throwSyntax('Unexpected EOF in string', this.s) - } - this.expect(this.s.item, quote, `to close string`, true) - return str - } - - private parseLiteral(): string { - if (!(this.enabledFeatures & FEATURES.LITERAL_STRINGS)) { - this.throwSyntax( - `Literal strings are not supported in Minecraft ${this.minecraftVersion}` - ) - } - if (!this.s.item || !CHARS.LITERAL_START.includes(this.s.item)) { - this.throwSyntax( - `Expected [a-zA-Z0-9_] to start literal string. Found '${this.s.item!}' instead` - ) - } - const str = this.s.collectWhile(s => !!s.item && CHARS.LITERAL.includes(s.item)) - if (str.length === 0) { - throw new JsonTextParserError('Literal string parsing failed unexpectedly') - } - return str - } - - private parseString(): string - private parseString(validStringOptions: T[]): T - private parseString(validStringOptions?: T[]): T { - let str: T - const startPosition = this.recordPosition() - - if (this.s.item && CHARS.QUOTES.includes(this.s.item)) { - str = this.parseQuotedString() as T - } else { - str = this.parseLiteral() as T - } - - if (validStringOptions && !validStringOptions.includes(str)) { - this.throwSyntax(`Expected one of ${validStringOptions.join(', ')}`, startPosition) - } - return str - } - - private parseBoolean(): boolean { - if (this.s.look(0, 4).toLowerCase() === 'true') { - this.s.consumeN(4) - return true - } else if (this.s.look(0, 5).toLowerCase() === 'false') { - this.s.consumeN(5) - return false - } - this.throwSyntax(`Expected boolean`, this.s) - } - - private parseDigits( - name: string, - digitChars = CHARS.NUMBER, - minLength = 0, - maxLength = Infinity - ): string { - let digits = '' - while (this.s.item && digitChars.includes(this.s.item)) { - digits += this.s.item - if (digits.length > maxLength) { - this.throwSyntax(`Too many ${name} digits (max ${maxLength})`, this.s) - } - this.s.consume() - - const beforeWhitespace = this.recordPosition() - const whitespace = CHARS.WHITESPACE.includes(this.s.item) - this.consumeWhitespace() - - if (this.s.item === '_') { - if (whitespace) { - this.throwSyntax(`Underscore must be between ${name} digits`, this.s) - } - this.s.consumeWhile(s => s.item === '_') - if (!(this.s.item && digitChars.includes(this.s.item))) { - this.throwSyntax(`Underscore must be between ${name} digits`, this.s) - } - } else if (whitespace) { - // REVIEW - We should avoid backing up the stream like this. - this.s.index = beforeWhitespace.index - 1 - this.s.consume() - break - } - } - if (digits.length < minLength) { - this.throwSyntax(`Not enough ${name} digits (min ${minLength})`, this.s) - } - return digits - } - - private parseNumber(type = NUMBER_TYPES.ANY): string { - let numberString = '' - let hasDecimal = false - let numberChars = CHARS.NUMBER - - const prefix = this.s.look(0, 2).toLowerCase() - if (prefix === '0x') { - this.s.consumeN(2) - numberString += '0x' - numberChars = CHARS.HEXADECIMAL - type = NUMBER_TYPES.HEXADECIMAL - } else if (prefix === '0b') { - this.s.consumeN(2) - numberString += '0b' - numberChars = CHARS.BINARY - type = NUMBER_TYPES.BINARY - } else if (this.s.item === '-') { - numberString += '-' - this.s.consume() - this.consumeWhitespace() - } - - if (type === NUMBER_TYPES.HEXADECIMAL && prefix !== '0x') { - this.throwSyntax(`Hexadecimal numbers must begin with '0x'`, this.s) - } else if (type === NUMBER_TYPES.BINARY && prefix !== '0b') { - this.throwSyntax(`Binary numbers must begin with '0b'`, this.s) - } - - const expectFloat = type === NUMBER_TYPES.FLOAT || type === NUMBER_TYPES.DOUBLE - - if (this.s.item === '.') { - if (!expectFloat) { - this.throwSyntax(`Decimal points are not permitted in ${type}s`) - } - numberString += '.' - hasDecimal = true - this.s.consume() - this.consumeWhitespace() - } - - this.expect(this.s.item, numberChars, 'to begin ' + type) - - while ( - this.s.item && - (numberChars.includes(this.s.item) || this.s.item === '.' || this.s.item === '_') - ) { - numberString += this.parseDigits(type, numberChars) - this.consumeWhitespace() - - if (this.s.item === 'e' || this.s.item === 'E') { - if (!expectFloat) { - this.throwSyntax(`E notation is not allowed in ${type}s`, this.s) - } - - this.s.consume() // e or E - this.consumeWhitespace() - - const floatValue = parseFloat(numberString) - if (isNaN(floatValue)) { - this.throwSyntax(`Invalid ${type} before exponent`, this.s) - } - - const exponent = parseInt(this.parseNumber(NUMBER_TYPES.INTEGER)) - if (isNaN(exponent)) { - this.throwSyntax(`Invalid exponent`, this.s) - } - - return floatValue.toString() + 'e' + exponent.toString() - } else if ((this.s.item as string) === '.') { - if (hasDecimal) { - this.throwSyntax('Second decimal point in ' + type, this.s) - } - hasDecimal = true - numberString += '.' - this.s.consume() - this.consumeWhitespace() - } - } - - this.expectSyntaxBoundaryAfter(type) - - let value: number - switch (type) { - case NUMBER_TYPES.BYTE: - case NUMBER_TYPES.SHORT: - case NUMBER_TYPES.INTEGER: - case NUMBER_TYPES.LONG: - value = parseInt(numberString) - break - - case NUMBER_TYPES.HEXADECIMAL: - value = parseInt(numberString.substring(2), 16) - break - - case NUMBER_TYPES.BINARY: - value = parseInt(numberString.substring(2), 2) - break - - case NUMBER_TYPES.FLOAT: - case NUMBER_TYPES.DOUBLE: - case NUMBER_TYPES.ANY: - value = parseFloat(numberString) - break - } - - if (isNaN(value)) { - this.throwSyntax(`Invalid ` + type, this.s) - } - - return numberString - } - - private expect( - thing: string | undefined, - toBe: string | string[], - message: string, - consume = false - ): void { - // prettier-ignore - if ( - Array.isArray(toBe) - ? !thing || !toBe.includes(thing) - : thing !== toBe - ) { - if (Array.isArray(toBe)) { - this.throwSyntax( - `Expected one of '${toBe.join("', '")}' ${message}. Found '${thing}' instead`, - ) - } - this.throwSyntax( - `Expected '${toBe}' ${message}. Found '${thing}' instead`, - ) - } - if (consume) { - if (Array.isArray(toBe)) { - this.s.consume() - } else { - this.s.consumeN(toBe.length) - } - } - } - - private expectSyntaxBoundaryAfter(message: string) { - if (this.s.item && !CHARS.SYNTAX_BOUNDARY.includes(this.s.item)) { - const previous = this.s.string.at(this.s.index - 1) - if (previous && CHARS.SYNTAX_BOUNDARY.includes(previous)) return - this.throwSyntax(`Unexpected '${this.s.item}' after ${message}`, this.s) - } - } -} - -// type KeyConstraint = -// | keyof T -// | { -// /** The key that is expected to be present in the object. */ -// key: keyof T -// /** -// * If true, this field is always required. -// */ -// required?: -// | boolean -// | { -// /** Require this field if the {@link dependsOn} field is present in the object. */ -// dependsOn: (keyof T)[] -// } - -// /** Keys that are expected to be present if this key is present. */ -// expects?: (keyof T)[] -// /** At least one of these fields must be present if this key is present. */ -// expectsOneOf?: (keyof T)[] -// /** Keys that are mutually exclusive with this key. */ -// mutuallyExclusiveKeys?: (keyof T)[] -// } - -// interface TestParseObjectOptions { -// name: string -// /** Fields that are allowed in the object. */ -// keys?: KeyConstraint[] -// /** At least one of these fields must be present in the object. */ -// requireOneOf?: (keyof T)[] -// /** -// * Called to parse a field's value in the object. -// * -// * Will never be called for fields not in {@link expectedFields}. -// */ -// parseValue: (ctx: { key: keyof T; obj: Partial; existingKeys: Set }) => void -// /** -// * Called with the completed object for extra validation. -// * -// * Returns a string to indicate an error, or undefined if the object is valid. -// */ -// validateObject?: (obj: Partial) => string | void -// } - -// function test(options: TestParseObjectOptions) {} -// test>({ -// name: 'test', -// keys: [ -// 'type', -// 'text', -// 'font', -// 'color', -// 'bold', -// 'italic', -// 'underlined', -// 'obfuscated', -// 'strikethrough', -// 'shadow_color', -// 'insertion', -// { -// key: 'extra', -// expectsOneOf: Object.values(CONTENT_KEYS), -// }, -// { -// key: 'clickEvent', -// mutuallyExclusiveKeys: ['click_event'], -// }, -// { -// key: 'hoverEvent', -// mutuallyExclusiveKeys: ['hover_event'], -// }, -// { -// key: 'click_event', -// mutuallyExclusiveKeys: ['clickEvent'], -// }, -// { -// key: 'hover_event', -// mutuallyExclusiveKeys: ['hoverEvent'], -// }, -// { -// key: 'translate', -// required: { dependsOn: ['with'] }, -// expects: ['with'], -// }, -// { key: 'with', expects: ['translate'] }, -// { key: 'fallback', expects: ['translate'] }, -// 'score', -// { -// key: 'selector', -// required: { dependsOn: ['separator'] }, -// }, -// { key: 'separator', expects: ['selector'] }, -// 'keybind', -// { -// key: 'nbt', -// required: { dependsOn: ['block', 'entity', 'storage'] }, -// expectsOneOf: ['block', 'entity', 'storage'], -// }, -// { key: 'block', expects: ['nbt'] }, -// { key: 'entity', expects: ['nbt'] }, -// { key: 'storage', expects: ['nbt'] }, -// 'sprite', -// { -// key: 'atlas', -// required: { dependsOn: ['sprite'] }, -// expects: ['sprite'], -// }, -// ], -// parseValue: ({ key, obj }) => {}, -// }) diff --git a/src/systems/jsonText/stringifier.ts b/src/systems/jsonText/stringifier.ts deleted file mode 100644 index 25a5493d..00000000 --- a/src/systems/jsonText/stringifier.ts +++ /dev/null @@ -1,337 +0,0 @@ -import { - type LegacyClickEvent, - type LegacyHoverEvent, - type ModernClickEvent, - type ModernHoverEvent, - type TextElement, - type TextObject, -} from '.' -import { compareVersions } from './parser' - -enum FEATURES { - REQUIRE_DOUBLE_QUOTES = 1 << 0, - RESOLVE_SPACE_ESCAPE_SEQUENCES = 1 << 1, -} - -export class JsonTextStringifier { - enabledFeatures = FEATURES.REQUIRE_DOUBLE_QUOTES | FEATURES.RESOLVE_SPACE_ESCAPE_SEQUENCES - - constructor(private minecraftVersion: string) { - if (compareVersions(this.minecraftVersion, '1.21.5') >= 0) { - this.enabledFeatures &= ~FEATURES.REQUIRE_DOUBLE_QUOTES - this.enabledFeatures &= ~FEATURES.RESOLVE_SPACE_ESCAPE_SEQUENCES - } - } - - stringify(element: TextElement): string { - return this.stringifyTextElement(element) - } - - /** - * Escapes and stringifies a string for SNBT representation. - * - * Reduces escaping by choosing the optimal quote type. - * - * Prefers single quotes. - */ - private stringifyString(str: string): string { - str = str.replaceAll('\n', '\\n') - if (this.enabledFeatures & FEATURES.RESOLVE_SPACE_ESCAPE_SEQUENCES) { - str = str.replaceAll('\\s', ' ') - } - - // Remove escaped quotes for accurate detection - const unescaped = str.replace(/\\'/g, "'").replace(/\\"/g, '"') - const hasSingle = unescaped.includes("'") - const hasDouble = unescaped.includes('"') - - if (this.enabledFeatures & FEATURES.REQUIRE_DOUBLE_QUOTES) { - return `"${unescaped.replace(/"/g, '\\"')}"` - } else if (hasSingle && hasDouble) { - // Both quotes present, fallback to single quotes and escape single quotes - return `'${unescaped.replace(/'/g, "\\'")}'` - } else if (hasSingle) { - // Only single quotes present, use double quotes - return `"${unescaped.replace(/"/g, '\\"')}"` - } else { - // Use single quotes - return `'${unescaped.replace(/'/g, "\\'")}'` - } - } - - private stringifyTextElementArray(arr: TextElement[]): string { - return `[${arr.map(e => this.stringifyTextElement(e)).join(',')}]` - } - - private stringifyScoreObject(score: NonNullable): string { - if (this.enabledFeatures & FEATURES.REQUIRE_DOUBLE_QUOTES) { - return ( - `{"name":${this.stringifyString(score.name)}` + - `,"objective":${this.stringifyString(score.objective)}}` - ) - } - return ( - `{name:${this.stringifyString(score.name)}` + - `,objective:${this.stringifyString(score.objective)}}` - ) - } - - private stringifyPlayerObject(player: NonNullable): string { - const q = this.enabledFeatures & FEATURES.REQUIRE_DOUBLE_QUOTES ? '"' : '' - const result: string[] = [] - if (player.name !== undefined) { - result.push(`${q}name${q}:${this.stringifyString(player.name)}`) - } - if (player.id !== undefined) { - result.push(`${q}id${q}:${JSON.stringify(player.id)}`) - } - if (player.texture !== undefined) { - result.push(`${q}texture${q}:${player.texture}`) - } - if (player.cape !== undefined) { - result.push(`${q}cape${q}:${player.cape}`) - } - if (player.model !== undefined) { - result.push(`${q}model${q}:${this.stringifyString(player.model)}`) - } - if (player.hat !== undefined) { - result.push(`${q}hat${q}:${player.hat}`) - } - if (player.properties !== undefined) { - for (const prop of player.properties) { - result.push( - `{name:${this.stringifyString(prop.name)}` + - `,value:${this.stringifyString(prop.value)}` + - (prop.signature === undefined - ? '' - : `,signature:${this.stringifyString(prop.signature)}`) + - '}' - ) - } - } - return '{' + result.join(',') + '}' - } - - private stringifyLegacyHoverEvent(event: LegacyHoverEvent): string { - switch (event.action) { - case 'show_text': { - return `{"action":"show_text","contents":${this.stringifyTextElement( - event.contents - )}}` - } - - case 'show_item': { - let result = `{"action":"show_item","contents":` - - if (typeof event.contents === 'string') { - result += this.stringifyString(event.contents) - } else { - result += '{"id":' + this.stringifyString(event.contents.id) - - if (event.contents.count !== undefined) { - result += `,"count":${event.contents.count}` - } - - if (event.contents.tag !== undefined) { - result += `,"tag":${this.stringifyTextElement(event.contents.tag)}` - } - } - - return result + `}}` - } - - case 'show_entity': { - let result = `{"action":"show_entity","contents":{"type":${this.stringifyString( - event.contents.type - )}` - - if (Array.isArray(event.contents.id)) { - result += `,"id":[${event.contents.id.join(',')}]` - } else if (typeof event.contents.id === 'string') { - result += `,"id":${this.stringifyString(event.contents.id)}` - } - - if (event.contents.name !== undefined) { - result += `,"name":${this.stringifyTextElement(event.contents.name)}` - } - - return result + `}}` - } - } - } - - private stringifyModernHoverEvent(event: ModernHoverEvent): string { - switch (event.action) { - case 'show_text': { - return `{action:show_text,value:${this.stringifyTextElement(event.value)}}` - } - - case 'show_item': { - let result = `{action:show_item,id:${this.stringifyString(event.id)}` - - if (event.count !== undefined) { - result += `,count:${event.count}` - } - - // `components` is not supported by the parser - - return result + `}` - } - - case 'show_entity': { - let result = `{action:show_entity,id:${this.stringifyString(event.id)}` - - if (event.name !== undefined) { - result += `,name:${this.stringifyTextElement(event.name)}` - } - - if (Array.isArray(event.uuid)) { - result += `,uuid:[I;${event.uuid.join(',')}]` - } else if (typeof event.uuid === 'string') { - result += `,uuid:${this.stringifyString(event.uuid)}` - } - - return result + `}` - } - } - } - - private stringifyLegacyClickEvent(event: LegacyClickEvent): string { - return `{"action":"${event.action}","value":${this.stringifyString(event.value)}}` - } - - private stringifyModernClickEvent(event: ModernClickEvent): string { - switch (event.action) { - case 'open_url': - return `{action:open_url,url:${this.stringifyString(event.url)}}` - - case 'open_file': - return `{action:open_file,path:${this.stringifyString(event.path)}}` - - case 'run_command': - return `{action:run_command,command:${this.stringifyString(event.command)}}` - - case 'suggest_command': - return `{action:suggest_command,command:${this.stringifyString(event.command)}}` - - case 'copy_to_clipboard': - return `{action:copy_to_clipboard,value:${this.stringifyString(event.value)}}` - - case 'change_page': - return `{action:change_page,page:${event.page}}` - - case 'show_dialog': - throw new Error('show_dialog click events are not supported in text displays') - - case 'custom': - let result = `{action:custom,id:${this.stringifyString(event.id)}` - - if (event.payload !== undefined) { - result += `,payload:${this.stringifyTextElement(event.payload)}` - } - - return result + `}` - } - } - - private stringifyTextObject(obj: TextObject): string { - const entries: string[] = [] - - for (const key of Object.keys(obj) as Array) { - if (obj[key] === undefined) continue - - // Quote character to use for keys - const q = this.enabledFeatures & FEATURES.REQUIRE_DOUBLE_QUOTES ? '"' : '' - const quotedKey = q + key + q - - switch (key) { - case 'type': - case 'text': - case 'translate': - case 'fallback': - case 'keybind': - case 'nbt': - case 'source': - case 'block': - case 'entity': - case 'storage': - case 'selector': - case 'font': - case 'insertion': - case 'object': - case 'sprite': - case 'atlas': - case 'color': - // Value is a string - entries.push(`${quotedKey}:${this.stringifyString(obj[key])}`) - break - - case 'shadow_color': - if (Array.isArray(obj[key])) { - entries.push(`${quotedKey}:${JSON.stringify(obj[key])}`) - break - } - // color and shadow_color fall through to number | bool case - case 'bold': - case 'italic': - case 'obfuscated': - case 'strikethrough': - case 'underlined': - case 'interpret': - // Value is a number or boolean - entries.push(`${quotedKey}:${obj[key]}`) - break - - case 'with': - case 'extra': - case 'separator': - // Value is an array of components - entries.push(`${quotedKey}:${this.stringifyTextElement(obj[key]!)}`) - break - - case 'score': - entries.push(`${quotedKey}:${this.stringifyScoreObject(obj[key])}`) - break - - case 'player': - entries.push(`${quotedKey}:${this.stringifyPlayerObject(obj[key])}`) - break - - case 'clickEvent': - entries.push(`${quotedKey}:${this.stringifyLegacyClickEvent(obj[key])}`) - break - - case 'click_event': - entries.push(`${quotedKey}:${this.stringifyModernClickEvent(obj[key])}`) - break - - case 'hoverEvent': - entries.push(`${quotedKey}:${this.stringifyLegacyHoverEvent(obj[key])}`) - break - - case 'hover_event': - entries.push(`${quotedKey}:${this.stringifyModernHoverEvent(obj[key])}`) - break - - default: - console.warn(`Unknown key in TextObject: '${key}'`) - break - } - } - - return `{${entries.join(',')}}` - } - - private stringifyTextElement(element: TextElement): string { - if (typeof element === 'string') { - return this.stringifyString(element) - } else if (Array.isArray(element)) { - return this.stringifyTextElementArray(element) - } else if (typeof element === 'object' && element !== null) { - return this.stringifyTextObject(element) - } else { - console.error(element) - throw new Error('Invalid TextElement') - } - } -} diff --git a/src/systems/jsonText/unicodeString.ts b/src/systems/jsonText/unicodeString.ts deleted file mode 100644 index b9e25a56..00000000 --- a/src/systems/jsonText/unicodeString.ts +++ /dev/null @@ -1,211 +0,0 @@ -import { StringStream } from 'generic-stream' -import { TextDisplay } from 'src/outliner/textDisplay' -import EVENTS from 'src/util/events' - -const ESCAPE_SEQUENCES = { - '\\': '\\', - "'": "'", - '"': '"', - n: '\n', - s: ' ', - t: '\t', - b: '\b', - f: '\f', - r: '\r', -} - -const UNICODE_CHAR_MAP = new Map() - -async function loadUnicodeCharMappings() { - const response = await fetch('https://unicode.org/Public/UNIDATA/UnicodeData.txt') - const text = await response.text() - - UNICODE_CHAR_MAP.clear() - const lines = text.split('\n') - for (const line of lines) { - const parts = line.split(';') - const codePointHex = parts[0] - const name = parts[1] - const codePoint = parseInt(codePointHex, 16) - if (isNaN(codePoint) || name === '' || name === '') continue - UNICODE_CHAR_MAP.set(name, String.fromCodePoint(codePoint)) - } - - console.log(`Loaded ${UNICODE_CHAR_MAP.size} Unicode character mappings`, UNICODE_CHAR_MAP) - - for (const textDisplay of TextDisplay.all) { - void textDisplay.updateTextMesh() - } -} - -EVENTS.NETWORK_CONNECTED.subscribe(() => { - void loadUnicodeCharMappings() -}) - -function collectHexDigits(s: StringStream, count: number): string { - let hex = '' - for (let i = 0; i < count; i++) { - if (s.item && /[0-9a-fA-F]/.test(s.item)) { - hex += s.item - s.consume() - } else { - throw new Error( - `Expected ${count} hex digits in unicode escape sequence, got only ${i}` - ) - } - } - return hex -} - -function resolveNamedUnicodeEscapeSequence(s: StringStream): string { - if (s.next !== '{') { - console.warn(`Expected 'N{' to begin named unicode escape sequence`) - return '\\N' - } - s.consume() // N - s.consume() // { - - let name = '' - while (s.item && s.item !== '}') { - name += s.item - s.consume() - } - name = name.trim().toUpperCase() - - if (name.length === 0) { - console.warn(`Expected name in named unicode escape sequence`) - return '\\N{}' - } - - if (s.item !== '}') { - console.warn(`Expected '}' to end named unicode escape sequence`) - return `\\N{${name}` - } - s.consume() // } - - if (UNICODE_CHAR_MAP.has(name)) { - return UNICODE_CHAR_MAP.get(name)! - } - - return `\\N{${name}}` -} - -function resolveUnicodeEscapeSequence(s: StringStream): string { - if (!'xuU'.includes(s.item!)) { - console.warn(`Expected 'x', 'u', or 'U' to begin unicode escape sequence`) - return '\\' + s.item - } - const char = s.item! - const expectedHexLength = s.item === 'x' ? 2 : s.item === 'u' ? 4 : 8 - s.consume() // u - const hex = collectHexDigits(s, expectedHexLength) - - const codePoint = parseInt(hex, 16) - if (isNaN(codePoint) || codePoint < 0 || codePoint > 0x10ffff) { - console.warn(`Invalid unicode code point: ${hex}`) - return `\\${char}${hex}` - } - return String.fromCodePoint(codePoint) -} - -function resolveEscapeSequences(str: string): string { - let resolved = '' - const s = new StringStream(str) - - while (s.item) { - if (s.item === '\\') { - const escaped = s.look(1) - if ( - (escaped === '\\' || - escaped === "'" || - escaped === '"' || - escaped === 'n' || - escaped === 's' || - escaped === 't' || - escaped === 'b' || - escaped === 'f' || - escaped === 'r') && - ESCAPE_SEQUENCES[escaped] - ) { - if (ESCAPE_SEQUENCES[escaped]) { - s.consume() // Consume the backslash - s.consume() // Consume the escaped character - resolved += ESCAPE_SEQUENCES[escaped] - continue - } - } else if (escaped === 'N') { - s.consume() // Consume the backslash - resolved += resolveNamedUnicodeEscapeSequence(s) - continue - } else if (escaped === 'u' || escaped === 'U' || escaped === 'x') { - s.consume() // Consume the backslash - resolved += resolveUnicodeEscapeSequence(s) - continue - } - // If it's not a recognized escape sequence, keep the backslash - } - resolved += s.item - s.consume() - } - - return resolved -} - -export class UnicodeString { - static regex = /[^]/gmu - - private chars: string[] = [] - - str: string - - constructor(str: string) { - this.str = str - - if (this.str === '') return - - this.str = resolveEscapeSequences(str) - - for (const char of this.str.matchAll(UnicodeString.regex)) { - this.chars.push(char[0]) - } - } - - [Symbol.iterator]() { - return this.chars[Symbol.iterator]() - } - - get length() { - return this.chars.length - } - - includes(search: string) { - return this.chars.includes(search) - } - - indexOf(search: string) { - return this.chars.indexOf(search) - } - - slice(start: number, end?: number) { - const chars = this.chars.slice(start, end) - return UnicodeString.fromChars(chars) - } - - at(index: number) { - if (index < 0 || index >= this.chars.length) return undefined - return this.chars[index] - } - - append(char: string) { - this.chars.push(char) - this.str += char - } - - toString() { - return this.str - } - - static fromChars(chars: string[]) { - return new UnicodeString(chars.join('')) - } -} diff --git a/src/systems/jsonText/wrapping.ts b/src/systems/jsonText/wrapping.ts index b0ca7ceb..c3a2e4f2 100644 --- a/src/systems/jsonText/wrapping.ts +++ b/src/systems/jsonText/wrapping.ts @@ -1,12 +1,71 @@ -import { Stopwatch } from 'src/util/stopwatch' -import { JsonText, type ComponentStyle, type TextElement, type TextObject } from '.' -import { getVanillaFont } from '../minecraft/fontManager' -import { UnicodeString } from './unicodeString' +import { + TextComponent, + UnicodeString, + type TextComponentStyle, + type TextElement, + type TextObject, +} from 'book-and-quill' +import { Stopwatch } from '../../util/stopwatch' +import { MinecraftFont } from '../minecraft/fontManager' // Jumpstarted by @IanSSenne (FetchBot) and refactored by @SnaveSutit to do line wrapping on JSON Text Components. // THANK U IAN <3 - SnaveSutit -function getRawText(element: string | TextObject): UnicodeString { +const KEYBIND_KEY_MAP: Record = { + 'key.advancements': 'L', + 'key.attack': 'key.mouse.left', + 'key.back': 'S', + 'key.chat': 'T', + 'key.command': '/', + 'key.drop': 'Q', + 'key.forward': 'W', + 'key.fullscreen': 'F11', + 'key.hotbar.1': '1', + 'key.hotbar.2': '2', + 'key.hotbar.3': '3', + 'key.hotbar.4': '4', + 'key.hotbar.5': '5', + 'key.hotbar.6': '6', + 'key.hotbar.7': '7', + 'key.hotbar.8': '8', + 'key.hotbar.9': '9', + 'key.inventory': 'E', + 'key.jump': 'Space', + 'key.left': 'A', + 'key.loadToolbarActivator': 'X', + 'key.pickItem': 'key.mouse.middle', + 'key.playerlist': 'Tab', + 'key.quickActions': 'Quick Actions', + 'key.right': 'D', + 'key.saveToolbarActivator': 'G', + 'key.screenshot': 'F2', + 'key.smoothCamera': 'Toggle Cinematic Camera', + 'key.sneak': 'Left Shift', + 'key.socialInteractions': 'P', + 'key.spectatorHotbar': 'key.keyboard.unknown', + 'key.spectatorOutlines': 'key.keyboard.unknown', + 'key.sprint': 'Left Control', + 'key.swapOffhand': 'F', + 'key.toggleGui': 'F1', + 'key.togglePerspective': 'F5', + 'key.toggleSpectatorShaderEffects': 'F4', + 'key.use': 'key.mouse.right', +} + +async function getLangTranslation(key: string): Promise { + const lang = await AnimatedJava.assetManager.getJSONAsset( + Project.animated_java.target_minecraft_version, + 'assets/minecraft/lang/en_us.json' + ) + return lang[key] ?? key +} + +async function getKeybindTranslation(keybind: string): Promise { + const mappedKeybind = KEYBIND_KEY_MAP[keybind] ?? keybind + return getLangTranslation(mappedKeybind) +} + +async function getRawText(element: string | TextObject): Promise { if (typeof element === 'string') { return new UnicodeString(element) } @@ -16,7 +75,10 @@ function getRawText(element: string | TextObject): UnicodeString { return new UnicodeString(element.text) case element.translate !== undefined: - return new UnicodeString(`{${element.translate}}`) + const translation = await getLangTranslation(element.translate) + return new UnicodeString( + translation === element.translate ? `{${element.translate}}` : translation + ) case element.selector !== undefined: return new UnicodeString(`{${element.selector}}`) @@ -25,7 +87,10 @@ function getRawText(element: string | TextObject): UnicodeString { return new UnicodeString(`{${element.score.name}:${element.score.objective}}`) case element.keybind !== undefined: - return new UnicodeString(`{${element.keybind}}`) + const keybindTranslation = await getKeybindTranslation(element.keybind) + return new UnicodeString( + element.keybind === keybindTranslation ? `{${element.keybind}}` : keybindTranslation + ) case element.nbt !== undefined: switch (true) { @@ -55,7 +120,7 @@ function getRawText(element: string | TextObject): UnicodeString { } export interface StyleSpan { - style: ComponentStyle + style: TextComponentStyle start: number end: number } @@ -80,19 +145,22 @@ interface Line { * * WARNING: Word width is ***not calculated*** by this function. */ -export function parseWords(inputElement: TextElement) { +export async function parseWords(inputElement: TextElement) { const stopwatch = new Stopwatch('Parse Words').start() - const flattened = new JsonText(inputElement).flatten(true) - if (!flattened.length) return [] + const optimized = new TextComponent(inputElement).optimized(true) + if (!optimized.length) return [] const words: Word[] = [] let word: Word | undefined - let element = flattened.shift() + let element = optimized.shift() + if (Array.isArray(element)) { + throw new Error('Unexpected array element in optimized JSON Text') + } if (element === undefined) return words - let componentText = getRawText(element) + let componentText = await getRawText(element) let span: StyleSpan = { - style: JsonText.getComponentStyle(element), + style: TextComponent.getComponentStyle(element), start: 0, end: 0, } @@ -146,20 +214,23 @@ export function parseWords(inputElement: TextElement) { span.end++ } - element = flattened.shift() + element = optimized.shift() + if (Array.isArray(element)) { + throw new Error('Unexpected array element in optimized JSON Text') + } if (element !== undefined) { - componentText = getRawText(element) + componentText = await getRawText(element) if (word) { word.styles.push(span) span = { - style: JsonText.getComponentStyle(element), + style: TextComponent.getComponentStyle(element), start: span.end, end: span.end, } } else { span = { - style: JsonText.getComponentStyle(element), + style: TextComponent.getComponentStyle(element), start: 0, end: 0, } @@ -178,18 +249,18 @@ export function parseWords(inputElement: TextElement) { return words } -export async function wrapJsonText(jsonText: JsonText, maxLineWidth = 200) { +export async function wrapJsonText(jsonText: TextComponent, maxLineWidth = 200) { const stopwatch = new Stopwatch('Wrap Json Text').start() - const words = parseWords(jsonText.toJSON()) + const words = await parseWords(jsonText.toJSON()) const lines: Line[] = [] // FIXME - This will not work for custom fonts - const font = await getVanillaFont() + const font = await MinecraftFont.getById('minecraft:default') let backgroundWidth = 0 let currentLine: Line = { words: [], width: 0 } for (const word of words) { - const wordWidth = font.getWordWidth(word) + const wordWidth = await font.getWordWidth(word) const wordStyles = [...word.styles] // If the word is longer than than the max line width, split it into multiple lines if (wordWidth - 1 > maxLineWidth) { @@ -211,7 +282,7 @@ export async function wrapJsonText(jsonText: JsonText, maxLineWidth = 200) { style = wordStyles.shift()! } - const charWidth = font.getTextWidth(new UnicodeString(char), style) + const charWidth = await font.getTextWidth(new UnicodeString(char), style) if (part.length > 0 && partWidth + (charWidth - 1) > maxLineWidth) { // Find all styles that apply to this part // FIXME: Attempt to avoid filtering and maping the styles for each character diff --git a/src/systems/minecraft/assetManager.ts b/src/systems/minecraft/assetManager.ts index 4bc07d1b..1e9043f7 100644 --- a/src/systems/minecraft/assetManager.ts +++ b/src/systems/minecraft/assetManager.ts @@ -1,188 +1,130 @@ -import { PACKAGE } from '../../constants' -import EVENTS from '../../util/events' -import { getCurrentVersion, getLatestVersion } from './versionManager' - -import download from 'download' import type { Unzipped } from 'fflate' -import index from '../../assets/vanillaAssetOverrides/index.json' - -import { - hideLoadingPopup, - showLoadingPopup, - showOfflineError, - updateLoadingProgress, - updateLoadingProgressLabel, -} from '../../interface/popup/animatedJavaLoading' +import ky from 'ky' +import { dirname, join } from 'node:path' +import { getFsModule } from '../../constants' import { unzip } from '../util' -const ASSET_OVERRIDES = index as unknown as Record - -async function downloadJar(url: string, savePath: string) { - updateLoadingProgressLabel('Downloading Minecraft Assets...') - - const data = await download(url, { retry: { retries: 3 } }) - .on('downloadProgress', progress => { - updateLoadingProgress(progress.percent * 100) - }) - .catch((error: any) => { - console.error('Failed to download Minecraft client:', error) - }) - - if (!data) { - showOfflineError() - throw new Error('Failed to download Minecraft client after 3 retries.') - } +import { getVersionById, getVersionDownloadUrl } from './versionManager' - await fs.promises.writeFile(savePath, new Uint8Array(data)) -} +const CLIENT_JAR_FOLDER = join(SystemInfo.user_data_directory, `animated_java/client_jars`) -export async function getLatestVersionClientDownloadUrl() { - let retries = 3 - const version = await getLatestVersion() +const ASSETS_CACHE = new Map() +const FOLDER_CACHE = new Map>() +const ACTIVE_DOWNLOAD_PROMISES = new Map>() - retries = 3 - while (retries-- >= 0) { - let response: Response | undefined - try { - response = await fetch(version.url) - } catch (error) { - console.error('Failed to fetch latest Minecraft version API:', error) - } - if (response?.ok) { - const result = await response.json() - if (!result?.downloads?.client) { - throw new Error(`Failed to find client download for ${version.id}`) - } - return result.downloads.client.url as string - } - } - throw new Error('Failed to fetch latest Minecraft version API after 3 retries.') -} +async function downloadFile(url: string, savePath: string) { + const response = await ky(url, { + method: 'GET', + onDownloadProgress(progress) { + Blockbench.setStatusBarText('Downloading Minecraft Assets...') + Blockbench.setProgress(progress.percent) + }, + }) -function getCachedJarFilePath() { - const userDataPath = electron.app.getPath('userData') - return PathModule.join(userDataPath, `${PACKAGE.name}/latest.jar`) -} + setTimeout(() => { + Blockbench.setStatusBarText() + Blockbench.setProgress(0, 0) + }, 5000) + + if (!response.ok) { + throw new Error(`Failed to download file from ${url}: ${response.statusText}`) + } -export async function updateAssets() { - localStorage.setItem('assetsLoaded', 'false') + const data = new Uint8Array(await response.arrayBuffer()) - const downloadUrl = await getLatestVersionClientDownloadUrl() - console.log('Downloading latest Minecraft client:', downloadUrl) + const { mkdir, writeFile } = getFsModule().promises - const cachedJarFilePath = getCachedJarFilePath() - await fs.promises.mkdir(PathModule.dirname(cachedJarFilePath), { recursive: true }) - await downloadJar(downloadUrl, cachedJarFilePath) - console.log('Downloaded latest Minecraft client:', cachedJarFilePath) + await mkdir(dirname(savePath), { recursive: true }) + await writeFile(savePath, data) } -export async function checkForAssetsUpdate() { - console.log('Checking for Minecraft assets update...') - - const currentVersion = getCurrentVersion() - if (!currentVersion) { - console.log('No current Minecraft version found, updating assets...') - await updateAssets() - } else { - const latestVersion = await getLatestVersion() - if (currentVersion.id !== latestVersion.id) { - console.log('Minecraft assets are outdated, updating...') - await updateAssets() - } +export async function getAssets(versionId: string) { + if (ASSETS_CACHE.has(versionId)) { + return ASSETS_CACHE.get(versionId)! } - const cachedJarFilePath = getCachedJarFilePath() - if (!fs.existsSync(cachedJarFilePath) || !(localStorage.getItem('assetsLoaded') === 'true')) { - console.log('No cached Minecraft client found, updating assets...') - await updateAssets() - } + const manifest = await getVersionById(versionId) - console.log('Does file exist?', fs.existsSync(cachedJarFilePath)) - console.log('Are assets loaded?', localStorage.getItem('assetsLoaded') === 'true') + const jarPath = join(CLIENT_JAR_FOLDER, `${manifest.id}.jar`) - await extractAssets() - console.log('Minecraft assets are up to date!') - localStorage.setItem('assetsLoaded', 'true') - requestAnimationFrame(() => EVENTS.MINECRAFT_ASSETS_LOADED.publish()) -} + const clientDownloadUrl = await getVersionDownloadUrl(manifest.id) + + const { existsSync, promises } = getFsModule() + const { readFile } = promises -let loadedAssets: Unzipped | undefined -export async function extractAssets() { - const cachedJarFilePath = getCachedJarFilePath() + if (ACTIVE_DOWNLOAD_PROMISES.has(manifest.id)) { + await ACTIVE_DOWNLOAD_PROMISES.get(manifest.id)! + } else if (!existsSync(jarPath)) { + const downloadPromise = downloadFile(clientDownloadUrl, jarPath) + ACTIVE_DOWNLOAD_PROMISES.set(manifest.id, downloadPromise) + try { + await downloadPromise + } finally { + ACTIVE_DOWNLOAD_PROMISES.delete(manifest.id) + } + } - const data = await fs.promises.readFile(cachedJarFilePath) + const buffer = await readFile(jarPath) - loadedAssets = await unzip(new Uint8Array(data), { + const loadedAssets = await unzip(new Uint8Array(buffer), { filter: v => v.name.startsWith('assets/'), }) -} -export async function assetsLoaded() { - return new Promise(resolve => { - if (loadedAssets !== undefined) { - resolve() - } else { - EVENTS.MINECRAFT_ASSETS_LOADED.subscribe(() => resolve(), true) - } - }) + ASSETS_CACHE.set(versionId, loadedAssets) + return loadedAssets } -export function hasAsset(path: string) { - if (!loadedAssets) throw new Error('Assets not loaded') - return !!loadedAssets[path] +export async function hasAsset(versionId: string, assetPath: string) { + const assets = await getAssets(versionId) + return assetPath in assets } -export function getRawAsset(path: string): Buffer { - if (!loadedAssets) throw new Error('Assets not loaded') - - if (ASSET_OVERRIDES[path]) { - return Buffer.from(ASSET_OVERRIDES[path]) +export async function getRawAsset(versionId: string, assetPath: string) { + const assets = await getAssets(versionId) + const asset = assets[assetPath] + if (!asset) { + throw new Error(`Asset '${assetPath}' not found in Minecraft ${versionId} client jar!`) } - - const asset = loadedAssets[path] - if (!asset) throw new Error(`Asset not found: ${path}`) return Buffer.from(asset) } -export function getPngAssetAsDataUrl(path: string) { - const asset = getRawAsset(path) - if (!asset) throw new Error(`Asset not found: ${path}`) +/** + * Gets a PNG asset as a data URL for a specific Minecraft version. + */ +export async function getPngAsset(versionId: string, assetPath: string) { + const asset = await getRawAsset(versionId, assetPath) + if (!asset) { + throw new Error(`Asset '${assetPath}' not found in Minecraft ${versionId} client jar!`) + } return `data:image/png;base64,${asset.toString('base64')}` } -export function getJSONAsset(path: string) { - const asset = getRawAsset(path) - if (!asset) throw new Error(`Asset not found: ${path}`) - const assetString = asset.toString('utf-8') - try { - return JSON.parse(assetString) - } catch (error) { - console.error(`Failed to parse JSON asset from ${path}:`, assetString, error) - throw error +export async function getJSONAsset(versionId: string, assetPath: string) { + const asset = await getRawAsset(versionId, assetPath) + if (!asset) { + throw new Error(`Asset '${assetPath}' not found in Minecraft ${versionId} client jar!`) } + return JSON.parse(asset.toString('utf-8')) } -EVENTS.PLUGIN_LOAD.subscribe(() => { - if (!window.navigator.onLine) { - showOfflineError() +export async function getFolder(versionId: string, folderPath: string) { + const cacheKey = `${versionId}:${folderPath}` + if (FOLDER_CACHE.has(cacheKey)) { + return FOLDER_CACHE.get(cacheKey)! + } + + const assets = await getAssets(versionId) + const folderAssets: Record = {} + for (const assetPath in assets) { + if (assetPath.startsWith(folderPath)) { + folderAssets[assetPath] = Buffer.from(assets[assetPath]) + } } - EVENTS.NETWORK_CONNECTED.publish() - - showLoadingPopup() - - void Promise.all([ - new Promise(resolve => EVENTS.MINECRAFT_ASSETS_LOADED.subscribe(resolve)), - new Promise(resolve => EVENTS.MINECRAFT_REGISTRY_LOADED.subscribe(resolve)), - new Promise(resolve => EVENTS.MINECRAFT_FONTS_LOADED.subscribe(resolve)), - new Promise(resolve => EVENTS.BLOCKSTATE_REGISTRY_LOADED.subscribe(resolve)), - ]) - .then(() => { - hideLoadingPopup() - }) - .catch(error => { - console.error(error) - Blockbench.showToastNotification({ - text: 'Animated Java failed to load! Please restart Blockbench', - color: 'var(--color-error)', - }) - }) -}) + + FOLDER_CACHE.set(cacheKey, folderAssets) + return folderAssets +} + +export async function filterAssets(versionId: string, predicate: (assetPath: string) => boolean) { + const assets = await getAssets(versionId) + return Object.keys(assets).filter(predicate) +} diff --git a/src/systems/minecraft/blockModelManager.ts b/src/systems/minecraft/blockModelManager.ts index 82eab15c..7a732327 100644 --- a/src/systems/minecraft/blockModelManager.ts +++ b/src/systems/minecraft/blockModelManager.ts @@ -1,13 +1,13 @@ -import { ItemDisplayMode } from 'src/outliner/vanillaItemDisplay' +import { type ItemDisplayMode } from '../../outliner/vanillaItemDisplay' import { mergeGeometries } from '../../util/bufferGeometryUtils' +import { localize as translate } from '../../util/lang' import { type IParsedBlock, getPathFromResourceLocation, parseBlock, resolveBlockstateValueType, } from '../../util/minecraftUtil' -import { translate } from '../../util/translation' -import { assetsLoaded, getJSONAsset, getPngAssetAsDataUrl, hasAsset } from './assetManager' +import { getJSONAsset, getPngAsset, hasAsset } from './assetManager' import type { BlockStateValue } from './blockstateManager' import { applyModelDisplayTransform } from './itemModelManager' import type { @@ -50,7 +50,6 @@ const BLACKLISTED_BLOCKS = new Map([ ]) export async function getBlockModel(block: string): Promise { - await assetsLoaded() let result = BLOCK_MODEL_CACHE.get(block) if (!result) { const parsed = await parseBlock(block) @@ -83,7 +82,10 @@ export async function parseBlockModel( itemDisplay: ItemDisplayMode = 'none' ): Promise { const modelPath = getPathFromResourceLocation(variant.model, 'models') - const model = getJSONAsset(modelPath + '.json') as IBlockModel + const model = (await getJSONAsset( + Project.animated_java.target_minecraft_version, + modelPath + '.json' + )) as IBlockModel if (childModel) { if (childModel.textures !== undefined) { @@ -233,7 +235,7 @@ async function generateModelMesh( type: 'vec3', value: new THREE.Color() .copy(Canvas.global_light_color) - .multiplyScalar(settings.brightness.value / 50), + .multiplyScalar((settings.brightness.value as number) / 50), }, // @ts-expect-error Uniforms types are wrong LIGHTSIDE: { type: 'int', value: Canvas.global_light_side }, @@ -380,9 +382,9 @@ async function loadTexture(textures: IBlockModel['textures'], key: string): Prom return TEXTURE_CACHE.get(texturePath)! } let texture: THREE.Texture - if (hasAsset(texturePath + '.mcmeta')) { + if (await hasAsset(Project.animated_java.target_minecraft_version, texturePath + '.mcmeta')) { const img = new Image() - img.src = getPngAssetAsDataUrl(texturePath) + img.src = await getPngAsset(Project.animated_java.target_minecraft_version, texturePath) const canvas = document.createElement('canvas') const ctx = canvas.getContext('2d')! await new Promise(resolve => { @@ -395,7 +397,9 @@ async function loadTexture(textures: IBlockModel['textures'], key: string): Prom }) texture = new THREE.CanvasTexture(canvas) } else { - texture = await LOADER.loadAsync(getPngAssetAsDataUrl(texturePath)) + texture = await LOADER.loadAsync( + await getPngAsset(Project.animated_java.target_minecraft_version, texturePath) + ) } texture.magFilter = THREE.NearestFilter @@ -433,7 +437,10 @@ export function validateBlockState(block: IParsedBlock) { export async function parseBlockState(block: IParsedBlock): Promise { const path = getPathFromResourceLocation(block.resourceLocation, 'blockstates') - const blockstate = (await getJSONAsset(path + '.json')) as IBlockState + const blockstate = (await getJSONAsset( + Project.animated_java.target_minecraft_version, + path + '.json' + )) as IBlockState if (!block.blockStateRegistryEntry) { throw new Error(`Block state registry entry not found for '${block.resource.name}'`) } diff --git a/src/systems/minecraft/fontManager.ts b/src/systems/minecraft/fontManager.ts index d2fc74e4..d0292f9b 100644 --- a/src/systems/minecraft/fontManager.ts +++ b/src/systems/minecraft/fontManager.ts @@ -1,14 +1,12 @@ -import { createHash } from 'crypto' -import { Stopwatch } from 'src/util/stopwatch' +import { COLORS, TextComponent, UnicodeString, type TextComponentStyle } from 'book-and-quill' +import { createHash } from 'node:crypto' import MissingCharacter from '../../assets/missing_character.png' import { TextDisplay, type Alignment } from '../../outliner/textDisplay' import { mergeGeometries } from '../../util/bufferGeometryUtils' -import EVENTS from '../../util/events' import { getPathFromResourceLocation } from '../../util/minecraftUtil' -import { COLOR_VALUES, ComponentStyle, JsonText } from '../jsonText' -import { UnicodeString } from '../jsonText/unicodeString' +import { Stopwatch } from '../../util/stopwatch' import { wrapJsonText, type StyleSpan, type Word } from '../jsonText/wrapping' -import * as assets from './assetManager' +import { getJSONAsset, getPngAsset, hasAsset } from './assetManager' namespace MinecraftJson { export interface FontProviderBitmap { @@ -87,9 +85,12 @@ abstract class FontProvider { abstract getChar(char: string): CachedChar | undefined - static fromAssetPath(assetPath: string) { + static async fromAssetPath(assetPath: string) { if (!assetPath.endsWith('.json')) assetPath += '.json' - const providerJSON = assets.getJSONAsset(assetPath) as MinecraftJson.FontProvider + const providerJSON = (await getJSONAsset( + Project.animated_java.target_minecraft_version, + assetPath + )) as MinecraftJson.FontProvider switch (providerJSON.type) { case 'bitmap': return new BitmapFontProvider(providerJSON) @@ -164,28 +165,50 @@ class BitmapFontProvider extends FontProvider { atlas: THREE.Texture = THREE.Texture.DEFAULT_IMAGE canvas: HTMLCanvasElement = document.createElement('canvas') + providerJSON: MinecraftJson.FontProviderBitmap + private charCache = new Map() constructor(providerJSON: MinecraftJson.FontProviderBitmap) { super(providerJSON) + this.providerJSON = providerJSON this.type = providerJSON.type this.bitmapPath = getPathFromResourceLocation(providerJSON.file, 'textures') this.charHeight = providerJSON.height ?? 8 this.charWidth = 8 this.ascent = providerJSON.ascent for (const row of providerJSON.chars) { - this.chars.push(new UnicodeString(row)) + const str = new UnicodeString(row) + console.log({ row, str }) + this.chars.push(str) } } async load() { if (this.loaded) return this - const dataUrl = assets.getPngAssetAsDataUrl(this.bitmapPath) + const dataUrl = await getPngAsset( + Project.animated_java.target_minecraft_version, + this.bitmapPath + ) const texture = await new THREE.TextureLoader().loadAsync(dataUrl) this.atlas = texture this.charHeight = texture.image.height / this.chars.length this.charWidth = texture.image.width / this.chars[0].length + if (!Number.isFinite(this.charWidth)) { + console.log({ + providerJSON: this.providerJSON, + bitmapPath: this.bitmapPath, + imageWidth: texture.image.width, + charsPerRow: this.chars[0].length, + calculatedCharWidth: this.charWidth, + chars: this.chars, + texture, + }) + throw new Error( + `Invalid character width calculated from bitmap font atlas: ${this.charWidth}` + ) + } // Update canvas this.canvas.width = texture.image.width this.canvas.height = texture.image.height @@ -258,22 +281,52 @@ export class MinecraftFont { fallback: MinecraftFont | undefined private loaded = false + private assetPath: string private charCache = new Map() private geoCache = new Map() private materialCache = new Map() constructor(id: string, assetPath: string, fallback?: MinecraftFont) { this.id = id + this.assetPath = assetPath this.fallback = fallback + MinecraftFont.all.push(this) + } + + static async getById(id: string) { + let font = MinecraftFont.all.find(font => font.id === id) + + if (!font) { + const path = getPathFromResourceLocation(id, 'font') + '.json' + font = new MinecraftFont(id, path) + } + + await font.load() + + return font + } + + async load() { + if (this.loaded) return this + + if (!(await hasAsset(Project.animated_java.target_minecraft_version, this.assetPath))) { + throw new Error(`Font ${this.id} does not exist at ${this.assetPath}`) + } + let fontJSON: MinecraftJson.Font try { - fontJSON = assets.getJSONAsset(assetPath) as MinecraftJson.Font + fontJSON = (await getJSONAsset( + Project.animated_java.target_minecraft_version, + this.assetPath + )) as MinecraftJson.Font } catch (error) { - console.error(`Failed to load font JSON from ${assetPath}:`, error) + console.error(`Failed to load font JSON from ${this.assetPath}:`, error) throw error } + console.log(this.assetPath, fontJSON) + for (const providerJSON of fontJSON.providers) { switch (providerJSON.type) { case 'bitmap': @@ -292,16 +345,8 @@ export class MinecraftFont { } } - MinecraftFont.all.push(this) - } - - static getById(id: string) { - return MinecraftFont.all.find(font => font.id === id) - } - - async load() { - if (this.loaded) return this await Promise.all(this.providers.map(provider => provider.load())) + this.loaded = true return this } @@ -321,13 +366,13 @@ export class MinecraftFont { return createMissingCharacter() } - getTextWidth(text: UnicodeString, span?: StyleSpan) { + async getTextWidth(text: UnicodeString, span?: StyleSpan) { let width = 0 const boldExtra = span?.style.bold ? 1 : 0 let font: MinecraftFont = this if (span?.style.font && span.style.font !== this.id) { - const newFont = MinecraftFont.getById(span.style.font) + const newFont = await MinecraftFont.getById(span.style.font) if (newFont) font = newFont } @@ -345,17 +390,17 @@ export class MinecraftFont { return Math.max(width, 0) } - getWordWidth(word: Word) { + async getWordWidth(word: Word) { let width = 0 let font: MinecraftFont = this for (const span of word.styles) { if (span.style.font && span.style.font !== this.id) { - const newFont = MinecraftFont.getById(span.style.font) + const newFont = await MinecraftFont.getById(span.style.font) if (newFont) font = newFont } const text = word.text.slice(span.start, span.end) - const textWidth = font.getTextWidth(text, span) + const textWidth = await font.getTextWidth(text, span) width += textWidth } @@ -389,7 +434,7 @@ export class MinecraftFont { shadow = TextDisplay.properties.shadow.default, alignment = TextDisplay.properties.align.default, }: { - jsonText: JsonText + jsonText: TextComponent maxLineWidth?: number backgroundColor?: tinycolor.Instance /** Whether or not to render any text shadow */ @@ -424,7 +469,7 @@ export class MinecraftFont { const text = word.text.slice(span.start, span.end) for (const char of text) { - const charGeo = this.getCharGeo(char, span.style) + const charGeo = await this.getCharGeo(char, span.style) if (!charGeo) { console.error('Failed to get character geometry:', char) @@ -448,7 +493,7 @@ export class MinecraftFont { if (charGeos.length > 0) { spanGeos.push(mergeGeometries(charGeos)!) - const color = JsonText.getColor(span.style.color ?? COLOR_VALUES.white) + const color = TextComponent.getColor(span.style.color ?? COLORS.white) spanMaterials.push(this.getColorMaterial(color)) if (shadow && shadowGeos.length > 0) { @@ -457,7 +502,7 @@ export class MinecraftFont { if (span.style.shadow_color) { spanMaterials.push( this.getColorMaterial( - JsonText.getColor(span.style.shadow_color) + TextComponent.getColor(span.style.shadow_color) ) ) } else { @@ -526,10 +571,10 @@ export class MinecraftFont { return { mesh, hitbox: backgroundGeo, outline } } - getCharGeo(char: string, style: ComponentStyle): CachedCharGeo { + async getCharGeo(char: string, style: TextComponentStyle): Promise { let font: MinecraftFont = this if (style.font) { - const newFont = MinecraftFont.getById(style.font) + const newFont = await MinecraftFont.getById(style.font) if (newFont) font = newFont } @@ -677,42 +722,36 @@ export class MinecraftFont { } } -let vanillaFont: MinecraftFont -let illagerFont: MinecraftFont -let standardGalacticAlphabetFont: MinecraftFont -function loadMinecraftFonts() { - console.log('Loading Minecraft fonts...') - vanillaFont = new MinecraftFont('minecraft:default', 'assets/minecraft/font/default.json') - illagerFont = new MinecraftFont( - 'minecraft:illageralt', - 'assets/minecraft/font/illageralt.json', - vanillaFont - ) - standardGalacticAlphabetFont = new MinecraftFont( - 'minecraft:alt', - 'assets/minecraft/font/alt.json', - vanillaFont - ) - - void Promise.all([ - vanillaFont.load(), - illagerFont.load(), - standardGalacticAlphabetFont.load(), - ]).then(() => { - console.log('Minecraft fonts loaded!') - requestAnimationFrame(() => EVENTS.MINECRAFT_FONTS_LOADED.publish()) - }) -} - -export async function getVanillaFont() { - if (!vanillaFont) { - await new Promise(resolve => { - EVENTS.MINECRAFT_FONTS_LOADED.subscribe(() => resolve()) - }) - } - return vanillaFont.load() -} - -EVENTS.MINECRAFT_ASSETS_LOADED.subscribe(() => { - loadMinecraftFonts() -}) +// let vanillaFont: MinecraftFont +// let illagerFont: MinecraftFont +// let standardGalacticAlphabetFont: MinecraftFont +// async function loadMinecraftFonts() { +// console.log('Loading Minecraft fonts...') + +// vanillaFont = new MinecraftFont('minecraft:default', 'assets/minecraft/font/default.json') +// illagerFont = new MinecraftFont( +// 'minecraft:illageralt', +// 'assets/minecraft/font/illageralt.json', +// vanillaFont +// ) +// standardGalacticAlphabetFont = new MinecraftFont( +// 'minecraft:alt', +// 'assets/minecraft/font/alt.json', +// vanillaFont +// ) + +// await Promise.all([ +// vanillaFont.load(), +// illagerFont.load(), +// standardGalacticAlphabetFont.load(), +// ]).then(() => { +// console.log('Minecraft fonts loaded!') +// }) +// } + +// export async function getVanillaFont() { +// if (!vanillaFont) { +// await loadMinecraftFonts() +// } +// return vanillaFont.load() +// } diff --git a/src/systems/minecraft/itemModelManager.ts b/src/systems/minecraft/itemModelManager.ts index 4f3bb696..01e8591c 100644 --- a/src/systems/minecraft/itemModelManager.ts +++ b/src/systems/minecraft/itemModelManager.ts @@ -1,7 +1,7 @@ -import { ItemDisplayMode } from 'src/outliner/vanillaItemDisplay' +import { type ItemDisplayMode } from '../../outliner/vanillaItemDisplay' import { mergeGeometries } from '../../util/bufferGeometryUtils' import { getPathFromResourceLocation, parseResourceLocation } from '../../util/minecraftUtil' -import { assetsLoaded, getJSONAsset, getPngAssetAsDataUrl } from './assetManager' +import { getJSONAsset, getPngAsset } from './assetManager' import { parseBlockModel } from './blockModelManager' import type { IItemModel } from './model' import { TEXTURE_FRAG_SHADER, TEXTURE_VERT_SHADER } from './textureShaders' @@ -20,7 +20,6 @@ export async function getItemModel( item: string, itemDisplay: ItemDisplayMode ): Promise { - await assetsLoaded() const cacheKey = item + '|' + itemDisplay let result = ITEM_MODEL_CACHE.get(cacheKey) if (!result) { @@ -119,10 +118,16 @@ async function parseItemModel( const modelPath = getPathFromResourceLocation(location, 'models') let model: IItemModel try { - model = getJSONAsset(modelPath + '.json') + model = await getJSONAsset( + Project.animated_java.target_minecraft_version, + modelPath + '.json' + ) } catch { // Fallback to block model if item model doesn't exist - model = getJSONAsset(modelPath.replace('item/', 'block/') + '.json') + model = await getJSONAsset( + Project.animated_java.target_minecraft_version, + modelPath.replace('item/', 'block/') + '.json' + ) } if (childModel) { @@ -169,7 +174,10 @@ async function generateItemMesh(location: string, model: IItemModel): Promise boolean): string | undefined { return this.items.find(searchFunction) } + + static createRegistry(registry: IRegistryJSON): MinecraftRegistry { + const result = {} as MinecraftRegistry + for (const key in registry) { + result[key as keyof IRegistryJSON] = new MinecraftRegistryEntry( + registry[key as keyof IRegistryJSON] + ) + } + return result + } } type MinecraftRegistry = Record -export const MINECRAFT_REGISTRY = {} as MinecraftRegistry +const REGISTRIES_URL = + 'https://raw.githubusercontent.com/misode/mcmeta/summary/registries/data.json' +const REGISTRY_CACHE_FOLDER = join(SystemInfo.user_data_directory, 'animated_java/registries') -function updateMemoryRegistry() { - const registryString = localStorage.getItem('animated_java:minecraftRegistry') - if (!registryString) { - console.error('Minecraft Registry not found in local storage') - return - } - const registry = JSON.parse(registryString) as IRegistryJSON - for (const key in registry) { - MINECRAFT_REGISTRY[key as keyof IRegistryJSON] = new MinecraftRegistryEntry( - registry[key as keyof IRegistryJSON] - ) +const REGISTRY_CACHE = new Map() + +async function fetchRegistry(versionId: string) { + const response = await ky(REGISTRIES_URL).json() + if (!response) { + throw new Error('Failed to fetch Minecraft registry data!') } + const { mkdir, writeFile } = getFsModule().promises + await mkdir(REGISTRY_CACHE_FOLDER, { recursive: true }) + await writeFile(join(REGISTRY_CACHE_FOLDER, `${versionId}.json`), JSON.stringify(response)) + return MinecraftRegistryEntry.createRegistry(response) } -async function updateLocalRegistry() { - console.log('Updating Minecraft Registry...') - let retries = 3 - while (retries-- >= 0) { - let response - try { - response = await fetch(REGISTRIES_URL) - } catch (error) { - console.error('Failed to fetch latest Minecraft registry:', error) - } - if (response?.ok) { - const newRegistry = (await response.json()) as IRegistryJSON - localStorage.setItem('animated_java:minecraftRegistry', JSON.stringify(newRegistry)) - const latestVersion = await getLatestVersion() - localStorage.setItem( - 'animated_java:minecraftRegistryVersion', - JSON.stringify(latestVersion) - ) - console.log('Minecraft Registry updated!') - return - } - } - throw new Error('Failed to fetch latest Minecraft registry after 3 retries.') +async function loadRegistryFromCache(versionId: string) { + const { readFile } = getFsModule().promises + const registryData = await readFile(join(REGISTRY_CACHE_FOLDER, `${versionId}.json`), 'utf-8') + const registry = JSON.parse(registryData) as IRegistryJSON + const typedRegistry: MinecraftRegistry = MinecraftRegistryEntry.createRegistry(registry) + REGISTRY_CACHE.set(versionId, typedRegistry) + return typedRegistry } -export async function checkForRegistryUpdate() { - console.log('Checking if Minecraft Registry update...') - const currentValueString = localStorage.getItem('animated_java:minecraftRegistry') - if (!currentValueString) { - console.log('No Minecraft Registry found. Updating...') - await updateLocalRegistry() - return - } - const currentVersionString = localStorage.getItem('animated_java:minecraftRegistryVersion') - if (!currentVersionString) { - console.log('No Minecraft Registry version found. Updating...') - await updateLocalRegistry() - return +export async function getRegistry(versionId: string) { + if (REGISTRY_CACHE.has(versionId)) { + return REGISTRY_CACHE.get(versionId)! } - const currentVersion = JSON.parse(currentVersionString) - const latestVersion = await getLatestVersion() - if (currentVersion.id !== latestVersion.id) { - console.log('Minecraft Registry is outdated. Updating...') - await updateLocalRegistry() - return + + const { existsSync } = getFsModule() + + if (existsSync(join(REGISTRY_CACHE_FOLDER, `${versionId}.json`))) { + return await loadRegistryFromCache(versionId) } - console.log('Minecraft Registry is up to date!') - updateMemoryRegistry() - requestAnimationFrame(() => EVENTS.MINECRAFT_REGISTRY_LOADED.publish()) + try { + const registry = await fetchRegistry(versionId) + REGISTRY_CACHE.set(versionId, registry) + return registry + } catch (error) { + console.error('Failed to fetch Minecraft registry from network:', error) + if (existsSync(join(REGISTRY_CACHE_FOLDER, `${versionId}.json`))) { + console.log('Loading Minecraft registry from cache...') + return await loadRegistryFromCache(versionId) + } + throw new Error('Failed to load Minecraft registry from both network and cache!') + } } -EVENTS.NETWORK_CONNECTED.subscribe(() => { - void checkForRegistryUpdate().then(async () => { - await checkForAssetsUpdate() - }) -}) +export async function getRegistryEntry( + versionId: string, + registryName: K +) { + const registry = await getRegistry(versionId) + if (!registry[registryName]) { + throw new Error(`Minecraft registry '${registryName}' not found in memory!`) + } + return registry[registryName] +} diff --git a/src/systems/minecraft/versionManager.ts b/src/systems/minecraft/versionManager.ts index 0cc7ede3..104f17fe 100644 --- a/src/systems/minecraft/versionManager.ts +++ b/src/systems/minecraft/versionManager.ts @@ -1,6 +1,11 @@ +import ky from 'ky' + export const VERSION_MANIFEST_URL = 'https://launchermeta.mojang.com/mc/game/version_manifest_v2.json' +const MISODE_VERSION_URL = + 'https://raw.githubusercontent.com/misode/mcmeta/refs/tags/$$VERSION$$-summary/version.json' + interface IMinecraftVersion { id: string type: 'snapshot' | 'release' @@ -11,6 +16,23 @@ interface IMinecraftVersion { complianceLevel: number } +interface MisodeVersion { + id: string + name: string + release_target: unknown + type: 'release' | 'snapshot' + stable: boolean + data_version: number + protocol_version: number + data_pack_version: number + data_pack_version_minor: number + resource_pack_version: number + resource_pack_version_minor: number + build_time: string + release_time: string + sha1: string +} + export interface IMinecraftVersionManifest { latest: { release: string @@ -19,19 +41,28 @@ export interface IMinecraftVersionManifest { versions: IMinecraftVersion[] } -let latestMinecraftVersion: IMinecraftVersion | undefined +const VERSION_CACHE = new Map() +const CLIENT_JAR_DOWNLOAD_URL_CACHE = new Map() +const MISODE_VERSION_CACHE = new Map() + +export async function getMisodeVersion(versionId: string) { + if (MISODE_VERSION_CACHE.has(versionId)) { + return MISODE_VERSION_CACHE.get(versionId)! + } + const response = await ky( + MISODE_VERSION_URL.replace('$$VERSION$$', versionId) + ).json() + MISODE_VERSION_CACHE.set(versionId, response) + return response +} + export async function getLatestVersion() { - if (latestMinecraftVersion) return latestMinecraftVersion if (!window.navigator.onLine) { - console.warn('Not connected to the internet! Using last known latest version.') - latestMinecraftVersion = getCurrentVersion() - if (!latestMinecraftVersion) - throw new Error('No internet connection, and no previous latest version cached!') - return latestMinecraftVersion + throw new Error('No internet connection, and no previous latest version cached!') } let response: Response | undefined try { - response = await fetch(VERSION_MANIFEST_URL) + response = await ky(VERSION_MANIFEST_URL) } catch (error: any) { throw new Error( `Failed to fetch latest Minecraft version manifest: ${error.message as string}` @@ -45,15 +76,50 @@ export async function getLatestVersion() { if (!version) { throw new Error(`Failed to find version data for '${result.latest.snapshot}'`) } - latestMinecraftVersion = version - localStorage.setItem('animated_java:minecraftVersion', JSON.stringify(version)) return version } throw new Error('Failed to fetch latest Minecraft version manifest.') } -export function getCurrentVersion() { - const stringVersion = localStorage.getItem('animated_java:minecraftVersion') - if (!stringVersion) return undefined - return JSON.parse(stringVersion) as IMinecraftVersion +export async function getVersionById(versionId: string) { + if (VERSION_CACHE.has(versionId)) { + return VERSION_CACHE.get(versionId)! + } + if (!window.navigator.onLine) { + throw new Error('No internet connection, cannot fetch Minecraft version data!') + } + let response: Response | undefined + try { + response = await ky(VERSION_MANIFEST_URL) + } catch (error: any) { + throw new Error( + `Failed to fetch Minecraft ${versionId} version manifest: ${error.message as string}` + ) + } + if (response?.ok) { + const result: IMinecraftVersionManifest = await response.json() + const version = result.versions.find((v: IMinecraftVersion) => v.id === versionId) + if (!version) { + throw new Error(`Unknown Minecraft version '${versionId}'`) + } + return version + } + throw new Error(`Failed to fetch Minecraft ${versionId} version manifest.`) +} + +export async function getVersionDownloadUrl(versionId: string) { + if (CLIENT_JAR_DOWNLOAD_URL_CACHE.has(versionId)) { + return CLIENT_JAR_DOWNLOAD_URL_CACHE.get(versionId)! + } + + const manifest = await getVersionById(versionId) + + const response = await ky<{ downloads: { client: { url: string } } }>(manifest.url).json() + if (!response?.downloads?.client) { + throw new Error(`Failed to find client download for ${manifest.id}`) + } + const clientDownloadUrl = response.downloads.client.url + + CLIENT_JAR_DOWNLOAD_URL_CACHE.set(versionId, clientDownloadUrl) + return clientDownloadUrl } diff --git a/src/systems/pluginCompiler.ts b/src/systems/pluginCompiler.ts index 144d0a7a..0f37c7cd 100644 --- a/src/systems/pluginCompiler.ts +++ b/src/systems/pluginCompiler.ts @@ -1,13 +1,24 @@ /// +import { getFsModule } from '../constants' import type { IBlueprintDisplayEntityConfigJSON } from '../formats/blueprint' import { resolvePath } from '../util/fileUtil' -import { isResourcePackPath, parseResourcePackPath, sanitizeStorageKey } from '../util/minecraftUtil' +import { + isResourcePackPath, + parseResourcePackPath, + sanitizeStorageKey, +} from '../util/minecraftUtil' import { detectCircularReferences, scrubUndefined } from '../util/misc' import { Variant } from '../variants' import type { INodeTransform, IRenderedAnimation } from './animationRenderer' import { IntentionalExportError } from './errors' -import type { AnyRenderedNode, IRenderedElement, IRenderedFace, IRenderedModel, IRenderedRig } from './rigRenderer' +import type { + AnyRenderedNode, + IRenderedElement, + IRenderedFace, + IRenderedModel, + IRenderedRig, +} from './rigRenderer' type TextureAnimationFrame = | number @@ -56,12 +67,21 @@ type BoneElementFaces = Partial< Record<'north' | 'east' | 'south' | 'west' | 'up' | 'down', BoneElementFace> > -interface BoneElementRotation { - angle: number - axis: 'x' | 'y' | 'z' - origin: ArrayVector3 - rescale?: boolean -} +type BoneElementRotation = + | { + x: number + y: number + z: number + origin: ArrayVector3 + rescale?: boolean + } + | { + angle: number + axis: 'y' | 'x' | 'z' + origin: ArrayVector3 + rescale?: boolean + } + | ArrayVector3 interface BoneElement { from: ArrayVector3 @@ -86,7 +106,14 @@ interface NodeTransformation { scale?: ArrayVector3 } -type NodeType = 'bone' | 'item_display' | 'block_display' | 'text_display' | 'structure' | 'camera' | 'locator' +type NodeType = + | 'bone' + | 'item_display' + | 'block_display' + | 'text_display' + | 'structure' + | 'camera' + | 'locator' type PluginNode = | { @@ -187,9 +214,12 @@ function parseDataUrl(dataUrl: string): { mimeType: string; base64: string } { function readTextureAnimation(texture: Texture): TextureAnimation | undefined { if (!texture.path) return undefined const mcmetaPath = texture.path + '.mcmeta' - if (!fs.existsSync(mcmetaPath)) return undefined + + const { existsSync, readFileSync } = getFsModule() + + if (!existsSync(mcmetaPath)) return undefined try { - const parsed = JSON.parse(fs.readFileSync(mcmetaPath, 'utf-8')) as { + const parsed = JSON.parse(readFileSync(mcmetaPath, 'utf-8')) as { animation?: Record } const anim = parsed.animation as any @@ -265,7 +295,8 @@ function serializeTextureProvider(options: { textureKeyToPaletteId: Map }): TextureProvider { const textureKey = options.textureIdToKey.get(options.textureId) - if (!textureKey) throw new Error(`Missing texture mapping for texture id '${options.textureId}'`) + if (!textureKey) + throw new Error(`Missing texture mapping for texture id '${options.textureId}'`) const paletteId = options.textureKeyToPaletteId.get(textureKey) if (paletteId) return { type: 'texture_palette', texture_palette: paletteId } @@ -273,10 +304,13 @@ function serializeTextureProvider(options: { return { type: 'texture', texture: textureKey } } -function serializeFace(face: IRenderedFace, options: { - textureIdToKey: Map - textureKeyToPaletteId: Map -}): BoneElementFace | undefined { +function serializeFace( + face: IRenderedFace, + options: { + textureIdToKey: Map + textureKeyToPaletteId: Map + } +): BoneElementFace | undefined { if (!face.uv) return undefined const textureId = face.texture?.startsWith('#') ? face.texture.slice(1) : face.texture if (!textureId) return undefined @@ -293,10 +327,13 @@ function serializeFace(face: IRenderedFace, options: { } satisfies BoneElementFace) } -function serializeBoneElements(model: IRenderedModel, options: { - textureIdToKey: Map - textureKeyToPaletteId: Map -}): BoneElement[] { +function serializeBoneElements( + model: IRenderedModel, + options: { + textureIdToKey: Map + textureKeyToPaletteId: Map + } +): BoneElement[] { const elements = model.elements ?? [] return elements.map((el: IRenderedElement) => { const faces: BoneElementFaces = {} @@ -306,15 +343,7 @@ function serializeBoneElements(model: IRenderedModel, options: { ;(faces as any)[dir] = serializedFace } - const rotation: BoneElementRotation = - el.rotation && !Array.isArray(el.rotation) - ? { - angle: el.rotation.angle, - axis: el.rotation.axis as BoneElementRotation['axis'], - origin: el.rotation.origin as ArrayVector3, - rescale: (el.rotation as any).rescale, - } - : { angle: 0, axis: 'y', origin: [0, 0, 0] } + const rotation = el.rotation ?? { angle: 0, axis: 'y', origin: [0, 0, 0] } return scrubUndefined({ from: el.from as ArrayVector3, @@ -434,7 +463,7 @@ function buildPalettes(options: { let hasAnyAlternative = false for (const variant of variants) { const mapped = variant.textureMap.getMappedTexture(texture.uuid) - let mappedKey = textureKey + let mappedKey: string = textureKey if (mapped) { const key = options.textureIdToKey.get(mapped.id) if (key) mappedKey = key @@ -484,6 +513,7 @@ function serializeAnimation(options: { }): PluginAnimation { const { animation, nodeUuidToId } = options + // eslint-disable-next-line @typescript-eslint/naming-convention const loop_mode: LoopMode = animation.loop_mode === 'loop' ? { type: 'loop', loop_delay: String(animation.loop_delay ?? 0) } @@ -493,6 +523,7 @@ function serializeAnimation(options: { const maxTime = animation.frames.at(-1)?.time ?? 0 + // eslint-disable-next-line @typescript-eslint/naming-convention const node_keyframes: NonNullable = {} for (const frame of animation.frames) { @@ -538,6 +569,7 @@ function serializeAnimation(options: { } } + // eslint-disable-next-line @typescript-eslint/naming-convention let global_keyframes: NonNullable | undefined // map the baked variant for each frame into the texture keyframes @@ -622,7 +654,7 @@ export function exportPluginBlueprint(options: { const blueprint: PluginBlueprintJson = scrubUndefined({ format_version: 1, settings: { - id: `animated_java:${aj.export_namespace}`, + id: `animated_java:${aj.blueprint_id}`, }, textures, texture_palettes: palettes, @@ -643,12 +675,14 @@ export function exportPluginBlueprint(options: { ) } + const { existsSync, mkdirSync, writeFileSync } = getFsModule() + try { const dir = PathModule.dirname(exportPath) - if (dir && dir !== '.' && !fs.existsSync(dir)) { - fs.mkdirSync(dir, { recursive: true }) + if (dir && dir !== '.' && !existsSync(dir)) { + mkdirSync(dir, { recursive: true }) } - fs.writeFileSync(exportPath, compileJSON(blueprint).toString()) + writeFileSync(exportPath, compileJSON(blueprint).toString()) } catch (e: any) { throw new IntentionalExportError( `Failed to write JSON file ${exportPath}: ${String(e)}` diff --git a/src/systems/resourcepackCompiler/1.20.4.ts b/src/systems/resourcepackCompiler/1.20.4.ts index 8c3ab13c..162fc5a9 100644 --- a/src/systems/resourcepackCompiler/1.20.4.ts +++ b/src/systems/resourcepackCompiler/1.20.4.ts @@ -1,5 +1,6 @@ import type { ResourcePackCompiler } from '.' -import { PROGRESS_DESCRIPTION } from '../../interface/dialog/exportProgress' +import { getFsModule } from '../../constants' +import { PROGRESS_DESCRIPTION } from '../../dialogs/exportProgress/exportProgress' import { isResourcePackPath, sanitizeStorageKey } from '../../util/minecraftUtil' import type { ITextureAtlas } from '../minecraft/textureAtlas' import type { IRenderedNodes } from '../rigRenderer' @@ -42,9 +43,11 @@ class PredicateItemModel { readExisting(path: string) { const aj = Project!.animated_java + const { readFileSync } = getFsModule() + let file: IPredicateItemModel try { - file = JSON.parse(fs.readFileSync(path, 'utf-8')) + file = JSON.parse(readFileSync(path, 'utf-8')) } catch (e) { console.error('Failed to read existing display item model:', e) return @@ -77,11 +80,11 @@ class PredicateItemModel { } } - file.animated_java[aj.export_namespace] ??= [] + file.animated_java[aj.blueprint_id] ??= [] for (const [name, ownedIds] of Object.entries(file.animated_java)) { - const namespace = aj.export_namespace - const lastNamespace = Project!.last_used_export_namespace + const namespace = aj.blueprint_id + const lastNamespace = Project!.last_used_blueprint_id if (name === namespace || name === lastNamespace) { file.overrides = file.overrides.filter( override => !ownedIds.includes(override.predicate.custom_model_data) @@ -103,7 +106,7 @@ class PredicateItemModel { toJSON(): IPredicateItemModel { const [displayItemNamespace, displayItemName] = Project!.animated_java.display_item.split(':') - const exportNamespace = Project!.animated_java.export_namespace + const exportNamespace = Project!.animated_java.blueprint_id return { parent: this.parent, @@ -112,7 +115,7 @@ class PredicateItemModel { ? this.textures : { layer0: `${displayItemNamespace}:item/${displayItemName}`, - }, + }, overrides: [...this.externalOverrides.entries(), ...this.overrides.entries()] .sort((a, b) => a[0] - b[0]) .map(([id, model]) => ({ @@ -137,6 +140,8 @@ const compileResourcePack: ResourcePackCompiler = async ({ modelExportFolder, }) => { const aj = Project!.animated_java + const { existsSync, promises } = getFsModule() + const { readFile } = promises PROGRESS_DESCRIPTION.set('Compiling Resource Pack...') console.log('Compiling resource pack...', { @@ -152,7 +157,7 @@ const compileResourcePack: ResourcePackCompiler = async ({ // Display Item const displayItemModel = new PredicateItemModel() const absoluteDisplayItemPath = PathModule.join(resourcePackPath, displayItemPath) - if (fs.existsSync(absoluteDisplayItemPath)) { + if (existsSync(absoluteDisplayItemPath)) { console.warn('Display item already exists! Attempting to merge...') displayItemModel.readExisting(absoluteDisplayItemPath) } @@ -172,13 +177,15 @@ const compileResourcePack: ResourcePackCompiler = async ({ let optifineEmissive: Buffer | undefined if (texture.source?.startsWith('data:')) { image = Buffer.from(texture.source.split(',')[1], 'base64') - } else if (texture.path && fs.existsSync(texture.path)) { + } else if (texture.path && existsSync(texture.path)) { if (!isResourcePackPath(texture.path)) { - image = fs.readFileSync(texture.path) + image = await readFile(texture.path).catch(() => undefined) const mcmetaPath = texture.path + '.mcmeta' const emissivePath = texture.path.replace('.png', '_e.png') - if (fs.existsSync(mcmetaPath)) mcmeta = fs.readFileSync(mcmetaPath) - if (fs.existsSync(emissivePath)) optifineEmissive = fs.readFileSync(emissivePath) + if (existsSync(mcmetaPath)) + mcmeta = await readFile(mcmetaPath).catch(() => undefined) + if (existsSync(emissivePath)) + optifineEmissive = await readFile(emissivePath).catch(() => undefined) } else { // Don't copy the texture if it's already in a valid resource pack location. continue @@ -207,8 +214,7 @@ const compileResourcePack: ResourcePackCompiler = async ({ // Texture atlas const blockAtlasPath = PathModule.join('assets/minecraft/atlases/blocks.json') - const blockAtlas: ITextureAtlas = await fs.promises - .readFile(blockAtlasPath, 'utf-8') + const blockAtlas: ITextureAtlas = await readFile(blockAtlasPath, 'utf-8') .catch(() => { console.log('Creating new block atlas...') return '{ "sources": [] }' diff --git a/src/systems/resourcepackCompiler/1.21.2.ts b/src/systems/resourcepackCompiler/1.21.2.ts index 12920337..79280607 100644 --- a/src/systems/resourcepackCompiler/1.21.2.ts +++ b/src/systems/resourcepackCompiler/1.21.2.ts @@ -1,6 +1,6 @@ import type { ResourcePackCompiler } from '.' -import { PROGRESS_DESCRIPTION } from '../../interface/dialog/exportProgress' -import { safeReadSync } from '../../util/fileUtil' +import { getFsModule } from '../../constants' +import { PROGRESS_DESCRIPTION } from '../../dialogs/exportProgress/exportProgress' import { isResourcePackPath, sanitizeStorageKey } from '../../util/minecraftUtil' import { type ITextureAtlas } from '../minecraft/textureAtlas' import type { IRenderedNodes } from '../rigRenderer' @@ -24,10 +24,12 @@ const compileResourcePack: ResourcePackCompiler = async ({ modelExportFolder, }) + const { existsSync, promises } = getFsModule() + const { readFile } = promises + // Texture atlas const blockAtlasPath = PathModule.join('assets/minecraft/atlases/blocks.json') - const blockAtlas: ITextureAtlas = await fs.promises - .readFile(blockAtlasPath, 'utf-8') + const blockAtlas: ITextureAtlas = await readFile(blockAtlasPath, 'utf-8') .catch(() => { console.log('Creating new block atlas...') return JSON.stringify({ sources: [] }) @@ -66,14 +68,16 @@ const compileResourcePack: ResourcePackCompiler = async ({ let optifineEmissive: Buffer | undefined if (texture.source?.startsWith('data:')) { image = Buffer.from(texture.source.split(',')[1], 'base64') - } else if (texture.path && fs.existsSync(texture.path)) { + } else if (texture.path && existsSync(texture.path)) { if (!isResourcePackPath(texture.path)) { - image = safeReadSync(texture.path) + image = await readFile(texture.path).catch(() => undefined) if (image == undefined) { throw new Error(`Failed to read texture "${texture.name}" at ${texture.path}`) } - mcmeta = safeReadSync(texture.path + '.mcmeta') - optifineEmissive = safeReadSync(texture.path.replace('.png', '_e.png')) + mcmeta = await readFile(texture.path + '.mcmeta').catch(() => undefined) + optifineEmissive = await readFile(texture.path.replace('.png', '_e.png')).catch( + () => undefined + ) } else { // Don't copy the texture if it's already in a valid resource pack location. continue @@ -111,14 +115,11 @@ const compileResourcePack: ResourcePackCompiler = async ({ // Hacky workaround for this version enforcing the `item` namespace. if (variantModel.model?.parent) { variantModel.model.parent = variantModel.model.parent.replace( - 'animated_java:blueprint/', - 'animated_java:item/' + ':blueprint/', + ':item/' ) } - variantModel.item_model = variantModel.item_model.replace( - 'animated_java:blueprint/', - 'animated_java:' - ) + variantModel.item_model = variantModel.item_model.replace(':blueprint/', ':') console.log('Exporting model', variantModel.model, 'to', exportPath) versionedFiles.set(PathModule.join(exportPath), { content: autoStringify(variantModel.model), diff --git a/src/systems/resourcepackCompiler/1.21.4.ts b/src/systems/resourcepackCompiler/1.21.4.ts index 8c30f00c..9890cb24 100644 --- a/src/systems/resourcepackCompiler/1.21.4.ts +++ b/src/systems/resourcepackCompiler/1.21.4.ts @@ -1,6 +1,11 @@ import type { ResourcePackCompiler } from '.' -import { PROGRESS_DESCRIPTION } from '../../interface/dialog/exportProgress' -import { isResourcePackPath, sanitizeStorageKey } from '../../util/minecraftUtil' +import { getFsModule } from '../../constants' +import { PROGRESS_DESCRIPTION } from '../../dialogs/exportProgress/exportProgress' +import { + isResourcePackPath, + parseResourceLocation, + sanitizeStorageKey, +} from '../../util/minecraftUtil' import { Variant } from '../../variants' import type { IItemDefinition } from '../minecraft/itemDefinitions' import { type ITextureAtlas } from '../minecraft/textureAtlas' @@ -22,15 +27,21 @@ const compileResourcePack: ResourcePackCompiler = async ({ modelExportFolder, }) + const parsed = parseResourceLocation(aj.blueprint_id) const itemModelDefinitionsFolder = PathModule.join( - 'assets/animated_java/items/blueprint/', - aj.export_namespace + 'assets', + parsed.namespace, + 'items', + 'blueprint', + parsed.path ) + const { existsSync, promises } = getFsModule() + const { readFile } = promises + // Texture atlas const blockAtlasPath = PathModule.join('assets/minecraft/atlases/blocks.json') - const blockAtlas: ITextureAtlas = await fs.promises - .readFile(blockAtlasPath, 'utf-8') + const blockAtlas: ITextureAtlas = await readFile(blockAtlasPath, 'utf-8') .catch(() => { console.log('Creating new block atlas...') return '{ "sources": [] }' @@ -65,13 +76,13 @@ const compileResourcePack: ResourcePackCompiler = async ({ let optifineEmissive: Buffer | undefined if (texture.source?.startsWith('data:')) { image = Buffer.from(texture.source.split(',')[1], 'base64') - } else if (texture.path && fs.existsSync(texture.path)) { + } else if (texture.path && existsSync(texture.path)) { if (!isResourcePackPath(texture.path)) { - image = fs.readFileSync(texture.path) + image = await readFile(texture.path) const mcmetaPath = texture.path + '.mcmeta' const emissivePath = texture.path.replace('.png', '_e.png') - if (fs.existsSync(mcmetaPath)) mcmeta = fs.readFileSync(mcmetaPath) - if (fs.existsSync(emissivePath)) optifineEmissive = fs.readFileSync(emissivePath) + if (existsSync(mcmetaPath)) mcmeta = await readFile(mcmetaPath) + if (existsSync(emissivePath)) optifineEmissive = await readFile(emissivePath) } else { // Don't copy the texture if it's already in a valid resource pack location. continue diff --git a/src/systems/resourcepackCompiler/index.ts b/src/systems/resourcepackCompiler/index.ts index 0d914bca..05eb68de 100644 --- a/src/systems/resourcepackCompiler/index.ts +++ b/src/systems/resourcepackCompiler/index.ts @@ -1,27 +1,35 @@ -import { MAX_PROGRESS, PROGRESS, PROGRESS_DESCRIPTION } from '../../interface/dialog/exportProgress' -import { getNextSupportedVersion, getResourcePackFormat } from '../../util/minecraftUtil' +import type { AsyncZippable } from 'fflate/browser' +import { getFsModule } from '../../constants' +import { + MAX_PROGRESS, + PROGRESS, + PROGRESS_DESCRIPTION, +} from '../../dialogs/exportProgress/exportProgress' import { IntentionalExportError } from '../errors' +import { AJMeta, PackMeta } from '../global' +import { getMisodeVersion } from '../minecraft/versionManager' import { type IRenderedRig } from '../rigRenderer' -import type { ExportedFile } from '../util' +import { zip, type ExportedFile } from '../util' -import { AJMeta, PackMeta, SUPPORTED_MINECRAFT_VERSIONS } from '../global' import EXPORT_1_20_4 from './1.20.4' import EXPORT_1_21_2 from './1.21.2' import EXPORT_1_21_4 from './1.21.4' -const VERSIONED_RESOURCE_PACK_COMPILERS: Record< - SUPPORTED_MINECRAFT_VERSIONS, - ResourcePackCompiler -> = { - '1.21.11': EXPORT_1_21_4, - '1.21.9': EXPORT_1_21_4, - '1.21.6': EXPORT_1_21_4, - '1.21.5': EXPORT_1_21_4, - '1.21.4': EXPORT_1_21_4, - '1.21.2': EXPORT_1_21_2, - '1.21.0': EXPORT_1_21_2, - '1.20.5': EXPORT_1_20_4, - '1.20.4': EXPORT_1_20_4, +function getResourcePackCompilerForVersion(version: string): ResourcePackCompiler { + switch (true) { + case VersionUtil.compare(version, '>=', '1.21.4'): + return EXPORT_1_21_4 + case VersionUtil.compare(version, '>=', '1.21.2'): + return EXPORT_1_21_2 + case VersionUtil.compare(version, '>=', '1.21.0'): + return EXPORT_1_21_2 + case VersionUtil.compare(version, '>=', '1.20.5'): + return EXPORT_1_20_4 + case VersionUtil.compare(version, '>=', '1.20.4'): + return EXPORT_1_20_4 + default: + throw new IntentionalExportError(`Unsupported Minecraft version: ${version}`) + } } interface ResourcePackCompilerOptions { @@ -48,15 +56,15 @@ export interface CompileResourcePackOptions { } export default async function compileResourcePack( - targetVersions: SUPPORTED_MINECRAFT_VERSIONS[], + version: string, options: CompileResourcePackOptions ) { const aj = Project!.animated_java const ajmeta = new AJMeta( PathModule.join(options.resourcePackFolder, 'assets.ajmeta'), - aj.export_namespace, - Project!.last_used_export_namespace, + aj.blueprint_id, + Project!.last_used_blueprint_id, options.resourcePackFolder ) @@ -68,45 +76,35 @@ export default async function compileResourcePack( const globalVersionSpecificFiles = new Map() const coreResourcePackFolder = options.resourcePackFolder - for (const version of targetVersions) { - console.groupCollapsed(`Compiling resource pack for Minecraft ${version}`) - const coreFiles = new Map() - const versionedFiles = new Map() - - const versionedResourcePackFolder = - targetVersions.length > 1 - ? PathModule.join( - options.resourcePackFolder, - `animated_java_${version.replaceAll('.', '_')}` - ) - : options.resourcePackFolder - - // Move paths into versioned overlay folders. - await VERSIONED_RESOURCE_PACK_COMPILERS[version]({ - ...options, - resourcePackPath: versionedResourcePackFolder, - ajmeta, - coreFiles, - versionedFiles, - }) - - for (const [path, file] of coreFiles) { - const relative = PathModule.join(coreResourcePackFolder, path) - globalCoreFiles.set(relative, file) - if (file.includeInAJMeta === false) continue - ajmeta.coreFiles.add(relative) - } + console.groupCollapsed(`Compiling resource pack for Minecraft ${version}`) + const coreFiles = new Map() + const versionedFiles = new Map() + + const resourcePackCompiler = getResourcePackCompilerForVersion(version) + await resourcePackCompiler({ + ...options, + resourcePackPath: options.resourcePackFolder, + ajmeta, + coreFiles, + versionedFiles, + }) - for (const [path, file] of versionedFiles) { - const relative = PathModule.join(versionedResourcePackFolder, path) - globalVersionSpecificFiles.set(relative, file) - if (file.includeInAJMeta === false) continue - ajmeta.versionedFiles.add(relative) - } + for (const [path, file] of coreFiles) { + const relative = PathModule.join(coreResourcePackFolder, path) + globalCoreFiles.set(relative, file) + if (file.includeInAJMeta === false) continue + ajmeta.coreFiles.add(relative) + } - console.groupEnd() + for (const [path, file] of versionedFiles) { + const relative = PathModule.join(options.resourcePackFolder, path) + globalVersionSpecificFiles.set(relative, file) + if (file.includeInAJMeta === false) continue + ajmeta.versionedFiles.add(relative) } + console.groupEnd() + console.log('Exported files:', globalCoreFiles.size + globalVersionSpecificFiles.size) // pack.mcmeta @@ -114,51 +112,29 @@ export default async function compileResourcePack( const packMeta = PackMeta.fromFile(packMetaPath) packMeta.content.pack ??= {} - const nextVersion = getNextSupportedVersion(targetVersions[0]) - const format = getResourcePackFormat(targetVersions[0]) - const nextFormat = nextVersion ? getResourcePackFormat(nextVersion) : 10000000 - if (!compareVersions('1.21.9', targetVersions[0]) /* >= 1.21.9 */) { + const misodeVersionData = await getMisodeVersion(version) + + const format = misodeVersionData.resource_pack_version + if (VersionUtil.compare(version, '>=', '1.21.9')) { packMeta.content.pack.min_format = format - packMeta.content.pack.max_format = nextFormat - 1 + packMeta.content.pack.max_format = format } else { packMeta.content.pack.pack_format = format packMeta.content.pack.supported_formats = { min_inclusive: format, - max_inclusive: nextFormat - 1, + max_inclusive: format, } } - packMeta.content.pack.description ??= `Animated Java Resource Pack for ${targetVersions.join( - ', ' - )}` - - // if (targetVersions.length > 1) { - // packMeta.content.pack.supported_formats ??= [] - // packMeta.content.overlays ??= {} - // packMeta.content.overlays.entries ??= [] - - // for (const version of targetVersions) { - // const format: PackMetaFormats = getResourcePackFormat(version) - // packMeta.content.pack.supported_formats.push(format) - - // const existingOverlay = packMeta.content.overlays.entries.find( - // e => e.directory === `animated_java_${version.replaceAll('.', '_')}` - // ) - // if (!existingOverlay) { - // packMeta.content.overlays.entries.push({ - // directory: `animated_java_${version.replaceAll('.', '_')}`, - // formats: format, - // }) - // } else { - // existingOverlay.formats = format - // } - // } - // } + packMeta.content.pack.description ??= `Animated Java Resource Pack for ${version}` globalCoreFiles.set(PathModule.join(options.resourcePackFolder, 'pack.mcmeta'), { content: autoStringify(packMeta.toJSON()), }) + const { existsSync, promises } = getFsModule() + const { writeFile, mkdir, rm, readdir, unlink } = promises + if (aj.enable_plugin_mode) { // Do nothing console.log('Plugin mode enabled. Skipping resource pack export.') @@ -170,14 +146,14 @@ export default async function compileResourcePack( const removedFolders = new Set() for (const file of ajmeta.previousVersionedFiles) { - if (fs.existsSync(file)) await fs.promises.unlink(file) + if (existsSync(file)) await unlink(file) let folder = PathModule.dirname(file) while ( !removedFolders.has(folder) && - fs.existsSync(folder) && - (await fs.promises.readdir(folder)).length === 0 + existsSync(folder) && + (await readdir(folder)).length === 0 ) { - await fs.promises.rm(folder, { recursive: true }) + await rm(folder, { recursive: true }) removedFolders.add(folder) folder = PathModule.dirname(folder) } @@ -202,13 +178,13 @@ export default async function compileResourcePack( for (const [path, file] of exportedFiles) { const folder = PathModule.dirname(path) if (!createdFolderCache.has(folder)) { - await fs.promises.mkdir(folder, { recursive: true }) + await mkdir(folder, { recursive: true }) createdFolderCache.add(folder) } if (file.writeHandler) { await file.writeHandler(path, file.content) } else { - await fs.promises.writeFile( + await writeFile( path, new Uint8Array( Buffer.isBuffer(file.content) ? file.content : Buffer.from(file.content) @@ -217,7 +193,29 @@ export default async function compileResourcePack( } PROGRESS.set(PROGRESS.get() + 1) } - } else if (aj.resource_pack_export_mode === 'zip') { - throw new IntentionalExportError('ZIP export is not yet implemented.') + } else if (aj.data_pack_export_mode === 'zip') { + const data: AsyncZippable = {} + + for (const [path, file] of coreFiles.entries()) { + const content = Uint8Array.from( + typeof file.content === 'string' ? Buffer.from(file.content) : file.content + ) + data[path] = content + } + + for (const [path, file] of versionedFiles.entries()) { + const content = Uint8Array.from( + typeof file.content === 'string' ? Buffer.from(file.content) : file.content + ) + data[path] = content + } + + data['pack.mcmeta'] = Uint8Array.from( + Buffer.from(autoStringify(packMeta.toJSON()), 'utf-8') + ) + + await rm(options.resourcePackFolder, { recursive: true, force: true }) + const zipped = await zip(data, {}) + await writeFile(options.resourcePackFolder, zipped) } } diff --git a/src/systems/rigRenderer.ts b/src/systems/rigRenderer.ts index 95b8924b..c1154e0f 100644 --- a/src/systems/rigRenderer.ts +++ b/src/systems/rigRenderer.ts @@ -1,4 +1,6 @@ -import * as crypto from 'crypto' +import { TextComponent } from 'book-and-quill' +import * as crypto from 'node:crypto' +import { getFsModule } from '../constants' import type { IBlueprintDisplayEntityConfigJSON, IBlueprintLocatorConfigJSON, @@ -21,7 +23,6 @@ import { updatePreview, } from './animationRenderer' import { IntentionalExportError } from './errors' -import { JsonText } from './jsonText' export interface IRenderedFace { uv: number[] @@ -36,13 +37,20 @@ export interface IRenderedElement { to: number[] shade?: boolean rotation?: + | { + x: number + y: number + z: number + origin: ArrayVector3 + rescale?: boolean + } | { angle: number - axis: string - origin: number[] + axis: 'y' | 'x' | 'z' + origin: ArrayVector3 rescale?: boolean } - | number[] + | ArrayVector3 faces?: Record light_emission?: number } @@ -190,6 +198,10 @@ export interface IRenderedRig { * Whether or not this rig includes Cubes */ includes_custom_models: boolean + /** + * The target Minecraft version for this rig, which may affect how the rig is rendered. + */ + target_minecraft_version: string } function renderCube(cube: Cube, rig: IRenderedRig, model: IRenderedModel) { @@ -207,12 +219,23 @@ function renderCube(cube: Cube, rig: IRenderedRig, model: IRenderedModel) { if (cube.shade === false) element.shade = false - if (!(cube.rotation.allEqual(0) && cube.origin.allEqual(0))) { - const axis = cube.rotationAxis() || 'y' + // If target version is 1.21.9 or higher, we can use free rotation + if (!compareVersions('1.21.9', rig.target_minecraft_version)) { + element.rotation = { + x: cube.rotation[0], + y: cube.rotation[1], + z: cube.rotation[2], + origin: cube.origin.slice() as ArrayVector3, + } + if (cube.rescale) { + element.rotation.rescale = true + } + } else if (!(cube.rotation.allEqual(0) && cube.origin.allEqual(0))) { + const axis = (cube.rotationAxis() || 'y') as 'y' | 'x' | 'z' element.rotation = { angle: cube.rotation[getAxisNumber(axis)], axis, - origin: cube.origin, + origin: cube.origin.slice() as ArrayVector3, } if (cube.rescale) { element.rotation.rescale = true @@ -220,8 +243,8 @@ function renderCube(cube: Cube, rig: IRenderedRig, model: IRenderedModel) { } else if (cube.rescale) { element.rotation = { angle: 0, - axis: cube.rotation_axis || 'y', - origin: cube.origin, + axis: (cube.rotation_axis || 'y') as 'y' | 'x' | 'z', + origin: cube.origin.slice() as ArrayVector3, rescale: true, } } @@ -231,7 +254,9 @@ function renderCube(cube: Cube, rig: IRenderedRig, model: IRenderedModel) { element.from = element.from.map((v, i) => v - parent.origin[i]) element.to = element.to.map((v, i) => v - parent.origin[i]) if (element.rotation && !Array.isArray(element.rotation)) { - element.rotation.origin = element.rotation.origin.map((v, i) => v - parent.origin[i]) + element.rotation.origin = element.rotation.origin.map( + (v, i) => v - parent.origin[i] + ) as ArrayVector3 } } @@ -260,7 +285,9 @@ function renderCube(cube: Cube, rig: IRenderedRig, model: IRenderedModel) { if (Object.keys(element.faces).length === 0) return + // @ts-expect-error - Broken BB types if (cube.light_emission) { + // @ts-expect-error - Broken BB types element.light_emission = cube.light_emission } @@ -270,6 +297,8 @@ function renderCube(cube: Cube, rig: IRenderedRig, model: IRenderedModel) { const TEXTURE_RESOURCE_LOCATION_CACHE = new Map() export function getTextureResourceLocation(texture: Texture, rig: IRenderedRig) { + const { existsSync, statSync } = getFsModule() + if (TEXTURE_RESOURCE_LOCATION_CACHE.has(texture.uuid)) { return TEXTURE_RESOURCE_LOCATION_CACHE.get(texture.uuid)! } @@ -277,7 +306,7 @@ export function getTextureResourceLocation(texture: Texture, rig: IRenderedRig) let textureName = texture.name.replace(/\.png$/, '') textureName = sanitizeStorageKey(textureName) + '.png' - if (texture.path && fs.existsSync(texture.path) && fs.statSync(texture.path).isFile()) { + if (texture.path && existsSync(texture.path) && statSync(texture.path).isFile()) { const parsed = parseResourcePackPath(texture.path) if (parsed) { TEXTURE_RESOURCE_LOCATION_CACHE.set(texture.uuid, parsed) @@ -437,7 +466,9 @@ function renderGroup( element.from = element.from.map(v => v * scale + 8) element.to = element.to.map(v => v * scale + 8) if (element.rotation && !Array.isArray(element.rotation)) { - element.rotation.origin = element.rotation.origin.map(v => v * scale + 8) + element.rotation.origin = element.rotation.origin.map( + v => v * scale + 8 + ) as ArrayVector3 } } @@ -525,7 +556,7 @@ function renderTextDisplay(display: TextDisplay, rig: IRenderedRig): INodeStruct parent: parentId, text: display.text, line_width: display.lineWidth, - background_color: JsonText.moveHex8AlphaToStart(backgroundColor.toHex8String()), + background_color: TextComponent.moveHex8AlphaToStart(backgroundColor.toHex8String()), background_alpha: backgroundColor.getAlpha(), align: display.align, shadow: display.shadow, @@ -546,7 +577,7 @@ function renderTextDisplay(display: TextDisplay, rig: IRenderedRig): INodeStruct function renderLocator(locator: Locator, rig: IRenderedRig) { if (!locator.export) return - const parentId = (locator.parent instanceof Group ? locator.parent.uuid : locator.parent)! + const parentId = typeof locator.parent === 'string' ? locator.parent : locator.parent.uuid const renderedLocator: IRenderedNodes['Locator'] = { type: 'locator', @@ -564,7 +595,7 @@ function renderLocator(locator: Locator, rig: IRenderedRig) { function renderCamera(camera: ICamera, rig: IRenderedRig) { if (!camera.export) return - const parentId = (camera.parent instanceof Group ? camera.parent.uuid : camera.parent)! + const parentId = typeof camera.parent === 'string' ? camera.parent : camera.parent.uuid const renderedCamera: IRenderedNodes['Camera'] = { type: 'camera', @@ -715,6 +746,7 @@ export function renderRig(modelExportFolder: string, textureExportFolder: string model_export_folder: modelExportFolder, texture_export_folder: textureExportFolder, includes_custom_models: false, + target_minecraft_version: Project!.animated_java.target_minecraft_version, } const defaultVariant = Variant.getDefault() diff --git a/src/systems/util.ts b/src/systems/util.ts index 3fc03434..d075bd2b 100644 --- a/src/systems/util.ts +++ b/src/systems/util.ts @@ -7,7 +7,7 @@ import { type AsyncZippable, type Unzipped, } from 'fflate/browser' -import { projectTargetVersionIsAtLeast } from 'src/formats/blueprint' +import { projectTargetVersionIsAtLeast } from '../formats/blueprint' import { roundTo } from '../util/misc' import type { INodeTransform } from './animationRenderer' diff --git a/src/tests/jsonText.test.ts b/src/tests/jsonText.test.ts deleted file mode 100644 index c737e1f6..00000000 --- a/src/tests/jsonText.test.ts +++ /dev/null @@ -1,1013 +0,0 @@ -import { COLOR_VALUES, JsonText, type TextElement } from 'src/systems/jsonText' -import { describe, expect, test } from 'vitest' -import { JsonTextParser, JsonTextSyntaxError } from '../systems/jsonText/parser' - -type ErrorPattern = string | RegExp | (new (...args: any[]) => Error) -type InputOutputMap = Array<{ input: TInput | TInput[]; expect: TOutput }> - -function text(text: TextElement) { - return new JsonText(text) -} - -function expectParsingResults( - parser: JsonTextParser['parse'], - map: InputOutputMap -) { - for (const { input, expect: expectedResult } of map) { - if (Array.isArray(input)) { - for (const inputItem of input) { - expect(parser(inputItem)).toEqual(text(expectedResult)) - } - } else { - expect(parser(input)).toEqual(text(expectedResult)) - } - } -} - -function expectErrorResults( - parser: JsonTextParser['parse'], - map: InputOutputMap -) { - for (const { input, expect: error } of map) { - if (Array.isArray(input)) { - for (const inputItem of input) { - expect(() => parser(inputItem)).toThrowError(error) - } - } else { - expect(() => parser(input)).toThrowError(error) - } - } -} - -describe('JsonTextParser', () => { - const modernParser = new JsonTextParser() - const modernParse = modernParser.parse.bind(modernParser) - const legacyParser = new JsonTextParser({ minecraftVersion: '1.20.4' }) - const legacyParse = legacyParser.parse.bind(legacyParser) - - describe('parses TextObjects', () => { - describe('text field', () => { - test('basic', () => { - expectParsingResults(modernParse, [ - { - input: [ - `{"text":"Hello, World!"}`, - `{'text':'Hello, World!'}`, - `{text:"Hello, World!"}`, - ` { text: "Hello, World!" } `, - `{\n\ttext: "Hello, World!"\n}`, - ], - expect: { text: 'Hello, World!' }, - }, - ]) - }) - - test('optional commas', () => { - expectParsingResults(modernParse, [ - { - input: [`{"text":"Hello, World!" color:red bold:true}`], - expect: { text: 'Hello, World!', color: 'red', bold: true }, - }, - ]) - }) - - test('inferred', () => { - expectParsingResults(modernParse, [ - { - input: [ - `{"Hello, World!"}`, - ` { "Hello, World!" } `, - `{\n\t'Hello, World!'\n}`, - ], - expect: { text: 'Hello, World!' }, - }, - ]) - expectErrorResults(modernParse, [ - { - input: `{Hello, World}`, - expect: /Unknown color 'World'/, - }, - { - input: `{color: red, Hello, World}`, - expect: /Unknown key 'World'/, - }, - ]) - }) - - test('implicit', () => { - expect(modernParse(`{}`)).toEqual(text({ text: '' })) - }) - }) - - describe('color field', () => { - test('named colors', () => { - for (const color of Object.keys(COLOR_VALUES)) { - const result = modernParse(`{color:${color}}`) - const expected = text({ color: color as keyof typeof COLOR_VALUES, text: '' }) - expect(result).toEqual(expected) - } - }) - - test('hex colors', () => { - const validCases: Array<[string, TextElement]> = [ - ['{color:"#00aced"}', { color: '#00aced', text: '' }], - ['{color:"#FF5555"}', { color: '#FF5555', text: '' }], - ] - for (const [input, expected] of validCases) { - expect(modernParse(input)).toEqual(text(expected)) - } - - expectErrorResults(modernParse, [ - { - input: ['{color:"#FF55550"}', '{color:"#FF555"}'], - expect: /Invalid hex color/, - }, - { - input: '{color:#FF5555}', - expect: /Expected \[a\-zA\-Z0\-9_\] to start literal string/, - }, - ]) - }) - - test('inferred', () => { - expectParsingResults(modernParse, [ - { input: '{#00aced}', expect: { color: '#00aced', text: '' } }, - { input: '{0xFF5555}', expect: { color: '#ff5555', text: '' } }, - { - input: '{"Hello, World!" #00aced}', - expect: { color: '#00aced', text: 'Hello, World!' }, - }, - { - input: '{"Hello, World!" 0xFF5555}', - expect: { color: '#ff5555', text: 'Hello, World!' }, - }, - { - input: '{#00aced "Hello, World!"}', - expect: { color: '#00aced', text: 'Hello, World!' }, - }, - { - input: '{0xFF5555 "Hello, World!"}', - expect: { color: '#ff5555', text: 'Hello, World!' }, - }, - { - input: '{"Hello, World!" "#00aced"}', - expect: { color: '#00aced', text: 'Hello, World!' }, - }, - { - input: '{"Hello, World!" red}', - expect: { color: 'red', text: 'Hello, World!' }, - }, - ]) - - expectErrorResults(modernParse, [ - { - input: [ - '{#FF55550}', - '{#FF555}', - '{0xFF555}', - '{color:red, #FF5555}', - '{color:red, 0xFF5555}', - '{"#FF5555", "Hello, World!"}', - '{red, "Hello, World!"}', - ], - expect: JsonTextSyntaxError, - }, - ]) - }) - }) - - test('shadow_color field', () => { - expectParsingResults(modernParse, [ - { - input: `{shadow_color:"#ff00aced"}`, - expect: { shadow_color: JsonText.hexToRgba('#ff00aced'), text: '' }, - }, - { - input: `{shadow_color:0xff00aced}`, - expect: { shadow_color: JsonText.hexToRgba('#ff00aced'), text: '' }, - }, - { - input: `{shadow_color:[${JsonText.hexToRgba('#ff00aced')}]}`, - expect: { shadow_color: JsonText.hexToRgba('#ff00aced'), text: '' }, - }, - { - input: `{shadow_color:${JsonText.hexToInt('#ff00aced')}}`, - expect: { shadow_color: JsonText.hexToRgba('#ff00aced'), text: '' }, - }, - ]) - }) - - test('boolean style fields', () => { - const fields = ['bold', 'italic', 'underlined', 'strikethrough', 'obfuscated'] as const - - const cases = [ - { value: true, variants: ['true', 'TRUE'] }, - { value: false, variants: ['false', 'FALSE'] }, - ] - - for (const field of fields) { - for (const { value, variants } of cases) { - for (const variant of variants) { - const input = `{${field}:${variant}}` - const expected = text({ [field]: value, text: '' }) - expect(modernParse(input)).toEqual(expected) - } - } - } - - // Test invalid values - expectErrorResults(modernParse, [ - { - input: [ - '{bold:yes}', - '{italic:no}', - '{underlined:1}', - '{strikethrough:0}', - '{obfuscated:null}', - '{bold:"true"}', - ], - expect: JsonTextSyntaxError, - }, - ]) - }) - - test('font field', () => { - expectParsingResults(modernParse, [ - { - input: `{font:"minecraft:illager"}`, - expect: { font: 'minecraft:illager', text: '' }, - }, - ]) - }) - - test('keybind field', () => { - expectParsingResults(modernParse, [ - { - input: `{keybind:"key.jump"}`, - expect: { keybind: 'key.jump' }, - }, - ]) - }) - - test('extra field', () => { - expectParsingResults(modernParse, [ - { - input: `{extra:["some_extra_text", {"and a text object"}]}`, - expect: { extra: ['some_extra_text', { text: 'and a text object' }], text: '' }, - }, - { - input: `{extra:[{extra:["some_extra_text", {"and a text object"}]}]}`, - expect: { - extra: [ - { extra: ['some_extra_text', { text: 'and a text object' }], text: '' }, - ], - text: '', - }, - }, - ]) - expectErrorResults(modernParse, [ - { - input: `{extra:"not-an-array"}`, - expect: /Expected '\[' to begin TextElementArray/, - }, - ]) - }) - - test('insertion field', () => { - expectParsingResults(modernParse, [ - { - input: `{insertion:'some_text'}`, - expect: { insertion: 'some_text', text: '' }, - }, - ]) - }) - - test('translate field', () => { - expectParsingResults(modernParse, [ - { - input: `{translate:'my.translation.key'}`, - expect: { translate: 'my.translation.key' }, - }, - { - input: [ - `{translate:'my.translation.key', with:['arg1','arg2']}`, - `{'my.translation.key', with:['arg1','arg2']}`, - ], - expect: { translate: 'my.translation.key', with: ['arg1', 'arg2'] }, - }, - { - input: [ - `{translate:'my.translation.key', fallback:'fallback text'}`, - `{'my.translation.key', fallback:'fallback text'}`, - ], - expect: { translate: 'my.translation.key', fallback: 'fallback text' }, - }, - ]) - expectErrorResults(modernParse, [ - { - input: `{with:['arg1','arg2']}`, - expect: /'with' requires 'translate'/, - }, - { - input: `{fallback:'fallback text'}`, - expect: /'fallback' requires 'translate'/, - }, - ]) - }) - - test('score field', () => { - expectParsingResults(modernParse, [ - { - input: `{score:{name:'Player',objective:'obj1'}}`, - expect: { score: { name: 'Player', objective: 'obj1' } }, - }, - ]) - }) - - test('selector field', () => { - expectParsingResults(modernParse, [ - { - input: `{selector:'@e'}`, - expect: { selector: '@e' }, - }, - { - input: `{selector:'@e',separator:{', '}}`, - expect: { selector: '@e', separator: { text: ', ' } }, - }, - { - input: `{selector:'@e',separator:', '}`, - expect: { selector: '@e', separator: ', ' }, - }, - ]) - }) - - test('nbt field', () => { - expectParsingResults(modernParse, [ - { - input: `{nbt:'Items[]',block:'0 0 0', interpret:true,separator:', '}`, - expect: { nbt: 'Items[]', block: '0 0 0', interpret: true, separator: ', ' }, - }, - { - input: `{nbt:'SelectedItem',entity:'@s', interpret:false,separator:', '}`, - expect: { - nbt: 'SelectedItem', - entity: '@s', - interpret: false, - separator: ', ', - }, - }, - { - input: `{nbt:'temp[{id:2}]',storage:'animated_java:test'}`, - expect: { nbt: 'temp[{id:2}]', storage: 'animated_java:test' }, - }, - ]) - expectErrorResults(modernParse, [ - { - input: `{nbt:'Items[]'}`, - expect: /'nbt' requires 'block', 'entity', or 'storage'/, - }, - { - input: `{block:'~ ~ ~'}`, - expect: /'block' requires 'nbt'/, - }, - { - input: `{entity:'@s'}`, - expect: /'entity' requires 'nbt'/, - }, - { - input: `{storage:'animated_java:test'}`, - expect: /'storage' requires 'nbt'/, - }, - ]) - }) - - test('separator field', () => { - expectErrorResults(modernParse, [ - { - input: `{separator:', '}`, - expect: /'separator' requires 'nbt' or 'selector'/, - }, - ]) - }) - - test('object field', () => { - expectErrorResults(modernParse, [ - { - input: `{object:'atlas'}`, - expect: /atlas object requires 'sprite'/, - }, - { - input: `{object:'player'}`, - expect: /player object requires 'player'/, - }, - ]) - }) - - test('sprite field', () => { - expectParsingResults(modernParse, [ - { - input: `{sprite:'minecraft:stone'}`, - expect: { sprite: 'minecraft:stone' }, - }, - { - input: `{sprite:'minecraft:diamond'}`, - expect: { sprite: 'minecraft:diamond' }, - }, - ]) - }) - - test('atlas object field', () => { - expectErrorResults(modernParse, [ - { - input: `{atlas:'minecraft:items'}`, - expect: /'atlas' requires 'sprite'/, - }, - ]) - }) - - test('player object field', () => { - expectParsingResults(modernParse, [ - { - input: `{player:{}}`, - expect: { player: {} as any }, - }, - { - input: `{player:{name:'SnaveSutit',id:'0-0-0-0-0',texture:'some:texture/path',cape:'some:cape/path',model:'wide',hat:true}}`, - expect: { - player: { - name: 'SnaveSutit', - id: '0-0-0-0-0', - texture: 'some:texture/path', - cape: 'some:cape/path', - model: 'wide', - hat: true, - properties: undefined, - }, - }, - }, - { - input: `{player:{name:'SnaveSutit',properties:[{name:'textures',value:'some_base64_value',signature:'some_base64_signature'}]}}`, - expect: { - player: { - name: 'SnaveSutit', - properties: [ - { - name: 'textures', - value: 'some_base64_value', - signature: 'some_base64_signature', - }, - ], - }, - }, - }, - ]) - }) - - test('legacy clickEvent field', () => { - expectParsingResults(legacyParse, [ - { - input: `{clickEvent:{action:'open_url',value:'https://example.com'}}`, - expect: { - clickEvent: { action: 'open_url', value: 'https://example.com' }, - text: '', - }, - }, - { - input: `{clickEvent:{action:'run_command',value:'say hi'}}`, - expect: { - clickEvent: { action: 'run_command', value: 'say hi' }, - text: '', - }, - }, - { - input: `{clickEvent:{action:'suggest_command',value:'say hi'}}`, - expect: { - clickEvent: { action: 'suggest_command', value: 'say hi' }, - text: '', - }, - }, - { - input: `{clickEvent:{action:'change_page',value:'5'}}`, - expect: { - clickEvent: { action: 'change_page', value: '5' }, - text: '', - }, - }, - { - input: `{clickEvent:{action:'copy_to_clipboard',value:'Hello, Clipboardy World!'}}`, - expect: { - clickEvent: { - action: 'copy_to_clipboard', - value: 'Hello, Clipboardy World!', - }, - text: '', - }, - }, - { - input: `{clickEvent:{action:'copy_to_clipboard',value:'Hello, Clipboardy World!'}}`, - expect: { - clickEvent: { - action: 'copy_to_clipboard', - value: 'Hello, Clipboardy World!', - }, - text: '', - }, - }, - ]) - expectErrorResults(legacyParse, [ - { - input: [ - // Cannot use `open_file` in legacy clickEvent - `{clickEvent:{action:'open_file',value:'file:///example/path'}}`, - // Unknown action - `{clickEvent:{action:'unknown_action',value:'test'}}`, - // Missing value - `{clickEvent:{action:'open_url'}}`, - // Missing action - `{clickEvent:{value:'test'}}`, - // Non-object clickEvent - `{clickEvent:'not-an-object'}`, - ], - expect: JsonTextSyntaxError, - }, - ]) - }) - - test('modern click_event field', () => { - expectParsingResults(modernParse, [ - { - input: `{click_event:{action:'open_url',url:'https://example.com'}}`, - expect: { - click_event: { action: 'open_url', url: 'https://example.com' }, - text: '', - }, - }, - { - input: `{click_event:{action:'run_command',command:'say hi'}}`, - expect: { - click_event: { action: 'run_command', command: 'say hi' }, - text: '', - }, - }, - { - input: `{click_event:{action:'suggest_command',command:'say hi'}}`, - expect: { - click_event: { action: 'suggest_command', command: 'say hi' }, - text: '', - }, - }, - { - input: `{click_event:{action:'run_command',command:'say hi'}}`, - expect: { - click_event: { action: 'run_command', command: 'say hi' }, - text: '', - }, - }, - { - input: `{click_event:{action:'suggest_command',command:'say hi'}}`, - expect: { - click_event: { action: 'suggest_command', command: 'say hi' }, - text: '', - }, - }, - { - input: `{click_event:{action:'suggest_command',command:'say hi'}}`, - expect: { - click_event: { action: 'suggest_command', command: 'say hi' }, - text: '', - }, - }, - { - input: `{click_event:{action:'change_page',page:5}}`, - expect: { - click_event: { action: 'change_page', page: 5 }, - text: '', - }, - }, - { - input: `{click_event:{action:'copy_to_clipboard',value:'Hello, Clipboardy World!'}}`, - expect: { - click_event: { - action: 'copy_to_clipboard', - value: 'Hello, Clipboardy World!', - }, - text: '', - }, - }, - { - input: `{click_event:{action:'copy_to_clipboard',value:'Hello, Clipboardy World!'}}`, - expect: { - click_event: { - action: 'copy_to_clipboard', - value: 'Hello, Clipboardy World!', - }, - text: '', - }, - }, - { - input: `{click_event:{action:'show_dialog',dialog:{type:'minecraft:notice',title:'test',body:[{type:'plain_message',contents:{text:'test'}}]}}}`, - expect: { - click_event: { - action: 'show_dialog', - dialog: { - type: 'minecraft:notice', - title: 'test', - body: [{ type: 'plain_message', contents: { text: 'test' } }], - }, - }, - text: '', - }, - }, - { - input: `{click_event:{action:'custom',id:'my_custom_action'}}`, - expect: { - click_event: { action: 'custom', id: 'my_custom_action' }, - text: '', - }, - }, - { - input: `{click_event:{action:'custom',id:'my_custom_action',payload:{some:'data'}}}`, - expect: { - click_event: { - action: 'custom', - id: 'my_custom_action', - payload: { some: 'data' }, - }, - text: '', - }, - }, - ]) - expectErrorResults(modernParse, [ - { - input: [ - // Cannot use `open_file` in commands - `{click_event:{action:'open_file',path:'file:///example/path'}}`, - // Unknown action - `{click_event:{action:'unknown_action',foo:'bar'}}`, - // Missing required field for open_url - `{click_event:{action:'open_url'}}`, - // Missing required field for run_command - `{click_event:{action:'run_command'}}`, - // Missing required field for suggest_command - `{click_event:{action:'suggest_command'}}`, - // Missing required field for change_page - `{click_event:{action:'change_page'}}`, - // Missing required field for copy_to_clipboard - `{click_event:{action:'copy_to_clipboard'}}`, - // Non-object click_event - `{click_event:'not-an-object'}`, - // Invalid dialog structure - `{click_event:{action:'show_dialog',dialog:'not-an-object'}}`, - // Custom action missing id - `{click_event:{action:'custom'}}`, - ], - expect: JsonTextSyntaxError, - }, - ]) - }) - - test('legacy hoverEvent field', () => { - expectParsingResults(legacyParse, [ - { - input: `{hoverEvent:{action:'show_text',contents:'Hello!'}}`, - expect: { - hoverEvent: { action: 'show_text', contents: 'Hello!' }, - text: '', - }, - }, - { - input: `{hoverEvent:{action:'show_text',contents:{text:'Hello!'}}}`, - expect: { - hoverEvent: { action: 'show_text', contents: { text: 'Hello!' } }, - text: '', - }, - }, - { - input: `{hoverEvent:{action:'show_item',contents:{id:'minecraft:stone',count:1}}}`, - expect: { - hoverEvent: { - action: 'show_item', - contents: { id: 'minecraft:stone', count: 1 }, - }, - text: '', - }, - }, - { - input: `{hoverEvent:{action:'show_item',contents:{id:'minecraft:stone',count:1,tag:{some:'data'}}}}`, - expect: { - hoverEvent: { - action: 'show_item', - contents: { id: 'minecraft:stone', count: 1, tag: { some: 'data' } }, - }, - text: '', - }, - }, - { - input: `{hoverEvent:{action:'show_entity',contents:{type:'minecraft:player',id:'0-0-0-0-0',name:'Player'}}}`, - expect: { - hoverEvent: { - action: 'show_entity', - contents: { - type: 'minecraft:player', - id: '0-0-0-0-0', - name: 'Player', - }, - }, - text: '', - }, - }, - { - input: [ - `{hoverEvent:{action:'show_entity',contents:{type:'minecraft:player',id:[0,0,0,0],name:'Player'}}}`, - `{hoverEvent:{action:'show_entity',contents:{type:'minecraft:player',id:[I;0,0,0,0],name:'Player'}}}`, - ], - expect: { - hoverEvent: { - action: 'show_entity', - contents: { - type: 'minecraft:player', - id: [0, 0, 0, 0], - name: 'Player', - }, - }, - text: '', - }, - }, - // Transforms modern hover_event into legacy hoverEvent - { - input: `{hover_event:{action:'show_text',value:'Hello!'}}`, - expect: { - hoverEvent: { action: 'show_text', contents: 'Hello!' }, - text: '', - }, - }, - { - input: `{hover_event:{action:'show_text',value:{text:'Hello!'}}}`, - expect: { - hoverEvent: { action: 'show_text', contents: { text: 'Hello!' } }, - text: '', - }, - }, - { - input: `{hover_event:{action:'show_item',id:'minecraft:stone',count:1}}`, - expect: { - hoverEvent: { - action: 'show_item', - contents: { - id: 'minecraft:stone', - count: 1, - }, - }, - text: '', - }, - }, - { - input: `{hover_event:{action:'show_entity',id:'minecraft:player',uuid:'0-0-0-0-0',name:'Player'}}`, - expect: { - hoverEvent: { - action: 'show_entity', - contents: { - type: 'minecraft:player', - id: '0-0-0-0-0', - name: 'Player', - }, - }, - text: '', - }, - }, - ]) - expectErrorResults(legacyParse, [ - { - input: [ - // Unknown action - `{hoverEvent:{action:'unknown_action',value:'test'}}`, - // Missing value for show_text - `{hoverEvent:{action:'show_text'}}`, - // Missing id for show_item - `{hoverEvent:{action:'show_item',count:1}}`, - // Missing type for show_entity - `{hoverEvent:{action:'show_entity',id:'1234',name:'Player'}}`, - // Non-object hoverEvent - `{hoverEvent:'not-an-object'}`, - ], - expect: JsonTextSyntaxError, - }, - { - input: `{hover_event:{action:'show_item',id:'minecraft:stone',count:1,components:{'minecraft:custom_data':{some:'data'}}}}`, - expect: /Cannot transform 'hover_event' with 'components' into legacy 'hoverEvent'/, - }, - { - input: [ - `{hover_event:{action:'show_entity',id:'minecraft:player',uuid:[0,0,0,0],name:'Player'}}`, - `{hover_event:{action:'show_entity',id:'minecraft:player',uuid:[I;0,0,0,0],name:'Player'}}`, - ], - expect: /Cannot transform 'hover_event' with 'uuid' as int-array into legacy 'hoverEvent'/, - }, - ]) - }) - - test('modern hover_event field', () => { - expectParsingResults(modernParse, [ - { - input: `{hover_event:{action:'show_text',value:'Hello!'}}`, - expect: { - hover_event: { action: 'show_text', value: 'Hello!' }, - text: '', - }, - }, - { - input: `{hover_event:{action:'show_text',value:{text:'Hello!'}}}`, - expect: { - hover_event: { action: 'show_text', value: { text: 'Hello!' } }, - text: '', - }, - }, - { - input: `{hover_event:{action:'show_item',id:'minecraft:stone',count:1}}`, - expect: { - hover_event: { - action: 'show_item', - id: 'minecraft:stone', - count: 1, - }, - text: '', - }, - }, - { - input: `{hover_event:{action:'show_item',id:'minecraft:stone',count:1,components:{'minecraft:custom_data':{some:'data'}}}}`, - expect: { - hover_event: { - action: 'show_item', - id: 'minecraft:stone', - count: 1, - components: { 'minecraft:custom_data': { some: 'data' } }, - }, - text: '', - }, - }, - { - input: `{hover_event:{action:'show_entity',id:'minecraft:player',uuid:'0-0-0-0-0',name:'Player'}}`, - expect: { - hover_event: { - action: 'show_entity', - id: 'minecraft:player', - uuid: '0-0-0-0-0', - name: 'Player', - }, - text: '', - }, - }, - { - input: [ - `{hover_event:{action:'show_entity',id:'minecraft:player',uuid:[0,0,0,0],name:'Player'}}`, - `{hover_event:{action:'show_entity',id:'minecraft:player',uuid:[I;0,0,0,0],name:'Player'}}`, - ], - expect: { - hover_event: { - action: 'show_entity', - id: 'minecraft:player', - uuid: [0, 0, 0, 0], - name: 'Player', - }, - text: '', - }, - }, - // Transforms legacy hoverEvent into modern hover_event - { - input: `{hoverEvent:{action:'show_text',contents:'Hello!'}}`, - expect: { - hover_event: { action: 'show_text', value: 'Hello!' }, - text: '', - }, - }, - { - input: `{hoverEvent:{action:'show_text',contents:{text:'Hello!'}}}`, - expect: { - hover_event: { action: 'show_text', value: { text: 'Hello!' } }, - text: '', - }, - }, - { - input: `{hoverEvent:{action:'show_item',contents:{id:'minecraft:stone',count:1}}}`, - expect: { - hover_event: { - action: 'show_item', - id: 'minecraft:stone', - count: 1, - }, - text: '', - }, - }, - { - input: `{hoverEvent:{action:'show_item',contents:{id:'minecraft:stone',count:1}}}`, - expect: { - hover_event: { - action: 'show_item', - id: 'minecraft:stone', - count: 1, - }, - text: '', - }, - }, - { - input: `{hoverEvent:{action:'show_entity',contents:{type:'minecraft:player',id:'0-0-0-0-0',name:'Player'}}}`, - expect: { - hover_event: { - action: 'show_entity', - id: 'minecraft:player', - uuid: '0-0-0-0-0', - name: 'Player', - }, - text: '', - }, - }, - { - input: [ - `{hoverEvent:{action:'show_entity',contents:{type:'minecraft:player',id:[0,0,0,0],name:'Player'}}}`, - `{hoverEvent:{action:'show_entity',contents:{type:'minecraft:player',id:[I;0,0,0,0],name:'Player'}}}`, - ], - expect: { - hover_event: { - action: 'show_entity', - id: 'minecraft:player', - uuid: [0, 0, 0, 0], - name: 'Player', - }, - text: '', - }, - }, - ]) - expectErrorResults(modernParse, [ - { - input: [ - // Unknown action - `{hover_event:{action:'unknown_action',value:'test'}}`, - // Missing value for show_text - `{hover_event:{action:'show_text'}}`, - // Missing id for show_item - `{hover_event:{action:'show_item',count:1}}`, - // Missing id for show_entity - `{hover_event:{action:'show_entity',uuid:'0-0-0-0-0',name:'Player'}}`, - // Non-object hover_event - `{hover_event:'not-an-object'}`, - ], - expect: JsonTextSyntaxError, - }, - { - input: `{hoverEvent:{action:'show_item',contents:{id:'minecraft:stone',count:1,tag:{some:'data'}}}}`, - expect: /Cannot transform 'hoverEvent' with 'tag' into modern 'hover_event'/, - }, - ]) - }) - }) - - test('parses TextElement arrays', () => { - expectParsingResults(modernParse, [ - // Simple object arrays - { - input: [ - '[{"text":"Hello, "},{"text":"World!"}]', - '[{text:"Hello, "},{text:"World!"}]', - ' [ { text: "Hello, " }, { text: "World!" } ] ', - `[\n\t{\n\t\ttext: "Hello, "\n\t},\n\t{\n\t\ttext: "World!"\n\t}\n]`, - '[{"Hello, "},{"World!"}]', - ], - expect: [{ text: 'Hello, ' }, { text: 'World!' }], - }, - // Simple string arrays - { - input: [ - '["Hello, ", "World!"]', - '["Hello, " "World!"]', - ' [ "Hello, " "World!" ] ', - `[\n\t"Hello, "\n\t,\n\t"World!"\n]`, - ], - expect: ['Hello, ', 'World!'], - }, - // Nested string arrays - { - input: [ - '["Hello, ", ["Recursive"], "World!"]', - '["Hello, " ["Recursive"] "World!"]', - ' [ "Hello, " ["Recursive"] "World!" ] ', - `[\n\t"Hello, "\n\t,\n\t["Recursive"]\n\t,\n\t"World!"\n]`, - ], - expect: ['Hello, ', ['Recursive'], 'World!'], - }, - // Nested object arrays - { - input: [ - '[{"text":"Hello, "}, [{"text":"Recursive"}], {"text":"World!"}]', - '[{text:"Hello, "}, [{text:"Recursive"}], {text:"World!"}]', - ' [ { text: "Hello, " }, [ { text: "Recursive" } ], { text: "World!" } ] ', - `[\n\t{\n\t\ttext: "Hello, "\n\t},\n\t[\n\t\t{\n\t\t\ttext: "Recursive"\n\t\t}\n\t],\n\t{\n\t\ttext: "World!"\n\t}\n]`, - ], - expect: [{ text: 'Hello, ' }, [{ text: 'Recursive' }], { text: 'World!' }], - }, - // Additional edge cases - { input: [`[]`], expect: [] }, - { input: [`[{}]`], expect: [{ text: '' }] }, - { input: [`[{"text":""}]`], expect: [{ text: '' }] }, - ]) - }) -}) diff --git a/src/util/easing.ts b/src/util/easing.ts index 54c26c4a..4b045e74 100644 --- a/src/util/easing.ts +++ b/src/util/easing.ts @@ -286,8 +286,8 @@ export const EASING_OPTIONS = Object.fromEntries( Object.freeze(EASING_OPTIONS) export const EASING_DEFAULT = 'linear' -export const getEasingArgDefault = (kf: _Keyframe) => { - switch (kf.easing) { +export const getEasingArgDefault = (easing: EasingKey) => { + switch (easing) { case EASING_OPTIONS.easeInBack: case EASING_OPTIONS.easeOutBack: case EASING_OPTIONS.easeInOutBack: @@ -302,12 +302,12 @@ export const getEasingArgDefault = (kf: _Keyframe) => { case EASING_OPTIONS.step: return 5 default: - return null + return undefined } } -export const parseEasingArg = (kf: _Keyframe, value: string) => { - switch (kf.easing) { +export const parseEasingArg = (easing: EasingKey, value: string) => { + switch (easing) { case EASING_OPTIONS.easeInBack: case EASING_OPTIONS.easeOutBack: case EASING_OPTIONS.easeInOutBack: diff --git a/src/util/events.ts b/src/util/events.ts index 6765420b..c6148e05 100644 --- a/src/util/events.ts +++ b/src/util/events.ts @@ -1,5 +1,5 @@ +import { subscribable } from 'simple-subpub' import { Variant } from '../variants' -import { subscribable } from './subscribable' // Plugin Events const EVENTS = { @@ -25,8 +25,6 @@ const EVENTS = { MINECRAFT_FONTS_LOADED: subscribable(), BLOCKSTATE_REGISTRY_LOADED: subscribable(), - PRE_SELECT_PROJECT: subscribable(), - POST_SELECT_PROJECT: subscribable(), SELECT_PROJECT: subscribable(), UNSELECT_PROJECT: subscribable(), CLOSE_PROJECT: subscribable(), @@ -43,22 +41,22 @@ const EVENTS = { UPDATE_SELECTION: subscribable(), - UPDATE_VIEW: subscribable(), + UPDATE_VIEW: subscribable(), - UNDO: subscribable(), - REDO: subscribable(), + UNDO: subscribable<{ entry: UndoEntry }>(), + REDO: subscribable<{ entry: UndoEntry }>(), } export default EVENTS -Blockbench.on('select_project', ({ project }: { project: ModelProject }) => { +Blockbench.on('select_project', ({ project }: { project: ModelProject }) => { EVENTS.SELECT_PROJECT.publish(project) }) -Blockbench.on('unselect_project', ({ project }: { project: ModelProject }) => { +Blockbench.on('unselect_project', ({ project }: { project: ModelProject }) => { EVENTS.UNSELECT_PROJECT.publish(project) }) -Blockbench.on('close_project', () => EVENTS.CLOSE_PROJECT.publish(Project!)) -Blockbench.on('update_keyframe_selection', EVENTS.UPDATE_KEYFRAME_SELECTION.publish) -Blockbench.on('update_selection', EVENTS.UPDATE_SELECTION.publish) -Blockbench.on('update_view', EVENTS.UPDATE_VIEW.publish) -Blockbench.on('undo', EVENTS.UNDO.publish) -Blockbench.on('redo', EVENTS.REDO.publish) +Blockbench.on('close_project', () => EVENTS.CLOSE_PROJECT.publish(Project!)) +Blockbench.on('update_keyframe_selection', EVENTS.UPDATE_KEYFRAME_SELECTION.publish) +Blockbench.on('update_selection', EVENTS.UPDATE_SELECTION.publish) +Blockbench.on('update_view', EVENTS.UPDATE_VIEW.publish) +Blockbench.on('undo', EVENTS.UNDO.publish) +Blockbench.on('redo', EVENTS.REDO.publish) diff --git a/src/util/excludedNodes.ts b/src/util/excludedNodes.ts index c1c71761..831418fd 100644 --- a/src/util/excludedNodes.ts +++ b/src/util/excludedNodes.ts @@ -24,7 +24,8 @@ export function getAvailableNodes( ...TextDisplay.all, ...VanillaItemDisplay.all, ...VanillaBlockDisplay.all, - ...(OutlinerElement.types.camera?.all || []) + // @ts-expect-error - Broken BB types + ...(OutlinerElement.types.camera?.all ?? []) ) } const availableNodes = allNodes.map(node => { diff --git a/src/util/fileUtil.ts b/src/util/fileUtil.ts index cf1a4571..43ff4877 100644 --- a/src/util/fileUtil.ts +++ b/src/util/fileUtil.ts @@ -1,3 +1,5 @@ +import { getFsModule } from '../constants' + export function normalizePath(path: string): string { return path.replace(/\\/g, '/') } @@ -63,13 +65,15 @@ export function swapPathRoot(path: string, oldRoot: string, newRoot: string) { } export function safeReadSync(path: string): Buffer | undefined { + const { readFileSync } = getFsModule() try { - return fs.readFileSync(path) + return readFileSync(path) } catch { return undefined } } export async function safeRead(path: string) { - return fs.promises.readFile(path).catch(() => undefined) + const { readFile } = getFsModule().promises + return readFile(path).catch(() => undefined) } diff --git a/src/util/lang.ts b/src/util/lang.ts new file mode 100644 index 00000000..300d41e2 --- /dev/null +++ b/src/util/lang.ts @@ -0,0 +1,64 @@ +/// + +import { LANGUAGES } from 'LANGUAGES' + +function getCurrentLanguage() { + const langName = settings.language.value as string + let lang = LANGUAGES[langName] + if (!lang) { + console.warn(`Unknown language '${langName}'`) + lang = LANGUAGES.en + } + return lang +} + +function replaceLocalizationPlaceholders(template: string, ...args: string[]) { + return template.replace(/%s/g, () => args.shift() ?? '') +} + +/** + * Translates a key using the current language, formatting it with any additional arguments. + * + * Localization placeholders in the form of `%s` are replaced with the provided arguments. + * + * If the localized text starts with `[Markdown]`, it will be parsed as Markdown. + * + * @returns The localized string, or the key itself if no translation is found. + */ +export function localize(key: string, ...args: string[]): string { + const lang = getCurrentLanguage() + + let localizedText = lang.flattened[key] + localizedText ??= lang.flattened['animated_java.' + key] + localizedText ??= LANGUAGES.en.flattened[key] + localizedText ??= LANGUAGES.en.flattened['animated_java.' + key] + + if (!localizedText) { + console.warn(`Could not find translation for '${key}' in language '${lang.name}'`) + return key + } + + if (args.length > 0) { + localizedText = replaceLocalizationPlaceholders(localizedText, ...args) + } + + if (localizedText.startsWith('[Markdown]')) { + return pureMarked(localizedText.replace('[Markdown]', '').trim()) + } + + return localizedText +} + +/** + * Creates a scoped translator function that prefixes all keys with {@link prefix}. + * @example + * const localize = createScopedTranslator('panel.arm_rotation') + * localize('title') // Translates 'panel.arm_rotation.title' + */ +export function createScopedTranslator(prefix: string): typeof localize { + if (!prefix || prefix.endsWith('.') || prefix.startsWith('.')) { + throw new Error(`Invalid translation key prefix '${prefix}'`) + } + + return (key, ...args) => localize(prefix + '.' + key, ...args) +} diff --git a/src/util/minecraftUtil.ts b/src/util/minecraftUtil.ts index 19048791..11e53084 100644 --- a/src/util/minecraftUtil.ts +++ b/src/util/minecraftUtil.ts @@ -1,14 +1,12 @@ -import * as pathjs from 'path' -import { assetsLoaded } from 'src/systems/minecraft/assetManager' -import { validateBlockState } from 'src/systems/minecraft/blockModelManager' -import { MINECRAFT_REGISTRY } from 'src/systems/minecraft/registryManager' -import { getCurrentVersion } from 'src/systems/minecraft/versionManager' -import { SUPPORTED_MINECRAFT_VERSIONS } from '../systems/global' +import * as pathjs from 'node:path' +import { getFsModule } from '../constants' +import { validateBlockState } from '../systems/minecraft/blockModelManager' import { BlockStateRegistryEntry, type BlockStateValue, getBlockState, } from '../systems/minecraft/blockstateManager' +import { getRegistryEntry } from '../systems/minecraft/registryManager' export interface IMinecraftResourceLocation { packRoot: string @@ -266,34 +264,38 @@ export interface IParsedBlock { } export async function validateItem(item: string) { - if (!MINECRAFT_REGISTRY.item) { - await assetsLoaded() - return - } + const itemRegistry = await getRegistryEntry( + Project.animated_java.target_minecraft_version, + 'item' + ) + let [namespace, id] = item.split(':') if (!id) { id = namespace namespace = 'minecraft' } - if ((namespace === 'minecraft' || namespace === '') && MINECRAFT_REGISTRY.item.has(id)) { + if ((namespace === 'minecraft' || namespace === '') && itemRegistry.has(id)) { return '' } else { - return `This item does not exist in Minecraft ${getCurrentVersion()!.id}.` + return `This item does not exist in Minecraft ${Project.animated_java.target_minecraft_version}.` } } export async function validateBlock(block: string) { - if (!MINECRAFT_REGISTRY.block) await assetsLoaded() + const blockRegistry = await getRegistryEntry( + Project.animated_java.target_minecraft_version, + 'block' + ) const parsed = await parseBlock(block) if (!parsed) { return 'Invalid block ID.' } else if ( (parsed.resource.namespace === 'minecraft' || parsed.resource.namespace === '') && - MINECRAFT_REGISTRY.block.has(parsed.resource.name) + blockRegistry.has(parsed.resource.name) ) { return validateBlockState(parsed) } else { - return `This block does not exist in Minecraft ${getCurrentVersion()!.id}.` + return `This block does not exist in Minecraft ${Project.animated_java.target_minecraft_version}.` } } @@ -321,81 +323,26 @@ export async function parseBlock(block: string): Promise { return compareVersions(a, b) ? -1 : 1 }) } -export function getDataPackFormat(version: SUPPORTED_MINECRAFT_VERSIONS): number { - switch (version) { - case SUPPORTED_MINECRAFT_VERSIONS['1.20.4']: - return 26 - case SUPPORTED_MINECRAFT_VERSIONS['1.20.5']: - return 41 - case SUPPORTED_MINECRAFT_VERSIONS['1.21.0']: - return 48 - case SUPPORTED_MINECRAFT_VERSIONS['1.21.2']: - return 57 - case SUPPORTED_MINECRAFT_VERSIONS['1.21.4']: - return 61 - case SUPPORTED_MINECRAFT_VERSIONS['1.21.5']: - return 71 - case SUPPORTED_MINECRAFT_VERSIONS['1.21.6']: - return 80 - case SUPPORTED_MINECRAFT_VERSIONS['1.21.9']: - return 88.0 - case SUPPORTED_MINECRAFT_VERSIONS['1.21.11']: - return 93.1 - } -} - -export function getResourcePackFormat(version: SUPPORTED_MINECRAFT_VERSIONS): number { - switch (version) { - case SUPPORTED_MINECRAFT_VERSIONS['1.20.4']: - return 22 - case SUPPORTED_MINECRAFT_VERSIONS['1.20.5']: - return 32 - case SUPPORTED_MINECRAFT_VERSIONS['1.21.0']: - return 34 - case SUPPORTED_MINECRAFT_VERSIONS['1.21.2']: - return 42 - case SUPPORTED_MINECRAFT_VERSIONS['1.21.4']: - return 46 - case SUPPORTED_MINECRAFT_VERSIONS['1.21.5']: - return 55 - case SUPPORTED_MINECRAFT_VERSIONS['1.21.6']: - return 63 - case SUPPORTED_MINECRAFT_VERSIONS['1.21.9']: - return 69.0 - case SUPPORTED_MINECRAFT_VERSIONS['1.21.11']: - return 74.0 - } -} - -export function getNextSupportedVersion( - version: SUPPORTED_MINECRAFT_VERSIONS -): SUPPORTED_MINECRAFT_VERSIONS | undefined { - const versions = Object.values(SUPPORTED_MINECRAFT_VERSIONS) - const index = versions.indexOf(version) - if (index === -1 || index === versions.length - 1) return undefined - return versions[index + 1] -} - export function functionReferenceExists(dataPackRoot: string, resourceLocation: string): boolean { const parsed = parseResourceLocation(resourceLocation) if (!parsed) return false if (parsed.type !== 'tags' && parsed.type !== 'function' && parsed.type !== 'functions') return false - for (const folder of fs.readdirSync(dataPackRoot)) { + const { readdirSync, statSync, existsSync } = getFsModule() + + for (const folder of readdirSync(dataPackRoot)) { const dataFolder = PathModule.join(dataPackRoot, folder) - if (!fs.statSync(dataFolder).isDirectory()) continue + if (!statSync(dataFolder).isDirectory()) continue const path = PathModule.join(dataFolder, parsed.fullPath) - if (!fs.existsSync(path)) continue + if (!existsSync(path)) continue return true } diff --git a/src/util/moddingTools.ts b/src/util/moddingTools.ts deleted file mode 100644 index 2d621d4a..00000000 --- a/src/util/moddingTools.ts +++ /dev/null @@ -1,622 +0,0 @@ -import { PACKAGE } from 'src/constants' -import EVENTS from './events' -import type { ResourceLocation } from './resourceLocation' -import { subscribable, type Subscribable } from './subscribable' - -class ModInstallError extends Error { - constructor(id: string, err: Error) { - super(`'${id}' failed to install: ${err.message}` + (err.stack ? '\n' + err.stack : '')) - } -} - -class ModUninstallError extends Error { - constructor(id: string, err: Error) { - super(`'${id}' failed to uninstall: ${err.message}` + (err.stack ? '\n' + err.stack : '')) - } -} - -interface ModHandle { - id: string - dependencies?: string[] - priority: number - isInstalled(): boolean - install: () => Promise - uninstall: () => Promise -} - -const REGISTERED_MODS = new Map() -const MOD_INSTALL_ORDER: string[] = [] - -EVENTS.PLUGIN_LOAD.subscribe(async () => { - console.groupCollapsed(`Installing Mods...`) - - try { - for (const modId of MOD_INSTALL_ORDER) { - const mod = REGISTERED_MODS.get(modId)! - if (mod.isInstalled()) continue - await mod.install() - } - } catch (e) { - console.groupEnd() - throw e - } - - // Emit fake plugin load events for all already loaded plugins, so mods can hook into them - for (const plugin of Object.values(Plugins.registered)) { - if (plugin.id === PACKAGE.name) continue - EVENTS.EXTERNAL_PLUGIN_LOAD.publish(plugin) - } - - console.groupEnd() - EVENTS.PLUGIN_FINISHED_LOADING.publish() -}) - -EVENTS.PLUGIN_UNLOAD.subscribe(async () => { - console.groupCollapsed(`Uninstalling Mods...`) - - try { - for (const modId of [...MOD_INSTALL_ORDER].reverse()) { - const mod = REGISTERED_MODS.get(modId)! - if (!mod.isInstalled()) continue - await mod.uninstall() - } - } catch (e) { - console.groupEnd() - throw e - } - - for (const plugin of Object.values(Plugins.registered)) { - if (plugin.id === PACKAGE.name) continue - EVENTS.EXTERNAL_PLUGIN_UNLOAD.publish(plugin) - } - - console.groupEnd() - EVENTS.PLUGIN_FINISHED_UNLOADING.publish() -}) - -export interface BaseModOptions { - id: ResourceLocation.Validate - /** A list of mod IDs that this mod depends on */ - dependencies?: string[] - /** The priority of the mod. Higher priority mods will be installed first. */ - priority?: number -} - -interface ModOptions - extends BaseModOptions { - /** A function that applies the mod. This function should return a context object that will be passed to the revert function. */ - apply: () => Promise | RevertContext - /** - * A function that reverts the mod - * @param ctx The context object returned by the apply function - */ - revert: (ctx: RevertContext) => Promise | void -} - -function updateModInstallOrder() { - MOD_INSTALL_ORDER.sort((a, b) => { - const modA = REGISTERED_MODS.get(a)! - const modB = REGISTERED_MODS.get(b)! - return modB.priority - modA.priority - }) - - // Ensure dependencies are installed before the mod that depends on them - for (const modId of MOD_INSTALL_ORDER) { - const mod = REGISTERED_MODS.get(modId)! - if (mod.dependencies === undefined) continue - for (const dependencyId of mod.dependencies) { - const dependencyIndex = MOD_INSTALL_ORDER.indexOf(dependencyId) - if (dependencyIndex === -1) { - throw new Error(`Mod '${modId}' depends on unknown mod '${dependencyId}'`) - } - const modIndex = MOD_INSTALL_ORDER.indexOf(modId) - if (dependencyIndex > modIndex) { - // Move the dependency before the mod - MOD_INSTALL_ORDER.splice(dependencyIndex, 1) - MOD_INSTALL_ORDER.splice(modIndex, 0, dependencyId) - } - } - } -} - -/** - * Registers a new mod. Mods are changes that need to be applied when the plugin is loaded, and reverted when the plugin is unloaded. - * - * Mods can depend on other mods, and will be installed in the correct order. - * - * If a mod fails to install, an error will be thrown, and the plugin will fail to load. - */ -export function registerMod( - options: ModOptions -) { - let applyContext: RevertContext - let installed = false - - if (REGISTERED_MODS.has(options.id)) { - throw new Error(`A Mod with the ID '${options.id}' is already registered!`) - } - - const handle: ModHandle = { - id: options.id, - dependencies: options.dependencies, - priority: options.priority ?? 0, - isInstalled() { - return installed - }, - async install() { - console.log(`Installing '${options.id}'`) - try { - if (installed) - throw new Error( - `Attempted to install '${options.id}' while it was already installed.` - ) - applyContext = await options.apply() - installed = true - } catch (err) { - throw new ModInstallError(options.id, err as Error) - } - }, - async uninstall() { - console.log(`Uninstalling '${options.id}'`) - try { - if (!installed) - throw new Error( - `Attempted to uninstall '${options.id}' before it was installed.` - ) - await options.revert(applyContext) - installed = false - } catch (err) { - throw new ModUninstallError(options.id, err as Error) - } - }, - } - - REGISTERED_MODS.set(options.id, handle) - MOD_INSTALL_ORDER.push(options.id) - updateModInstallOrder() - - return handle -} - -interface RegisterProjectModOptions - extends ModOptions { - apply: () => RevertContext - revert: (ctx: RevertContext) => void - /** A function that checks if the mod should be applied when switching projects */ - condition: (project: ModelProject) => boolean -} - -/** - * Registers a mod that is applied / reverted when a project is selected / unselected that meets the provided condition. - */ -export function registerProjectMod( - options: RegisterProjectModOptions -) { - let revertContext: RevertContext | null = null - - return registerMod({ - ...options, - - apply: () => { - return [ - EVENTS.PRE_SELECT_PROJECT.subscribe(project => { - // Effectively using revertContext as a boolean to check if the mod is applied - if (revertContext !== null) return - if (!options.condition(project)) return - console.log(`Applying project mod '${options.id}'`) - revertContext = options.apply() - }), - - EVENTS.UNSELECT_PROJECT.subscribe(() => { - // Effectively using revertContext as a boolean to check if the mod is applied - if (revertContext === null) return - console.log(`Reverting project mod '${options.id}'`) - options.revert(revertContext) - revertContext = null - }), - ] - }, - - revert: ctx => { - ctx.forEach(unsub => unsub()) - }, - }) -} - -interface RegisterPluginModOptions - extends ModOptions { - apply: () => RevertContext - revert: (ctx: RevertContext) => void - /** A function that checks if the mod should be applied when the plugin is loaded */ - condition: (plugin: BBPlugin) => boolean -} - -/** - * Registers a mod that is applied / reverted when a plugin is loaded / unloaded that meets the provided condition. - */ -export function registerPluginMod( - options: RegisterPluginModOptions -) { - let revertContext: RevertContext | undefined - - return registerMod({ - ...options, - - apply: () => { - return [ - EVENTS.EXTERNAL_PLUGIN_LOAD.subscribe(plugin => { - if (!Condition(options.condition, plugin)) return - console.log(`Applying plugin mod '${options.id}'`) - revertContext = options.apply() - }), - - EVENTS.EXTERNAL_PLUGIN_UNLOAD.subscribe(() => { - // Effectively using revertContext as a boolean to check if the mod is applied - if (revertContext !== undefined) { - console.log(`Reverting plugin mod '${options.id}'`) - options.revert(revertContext) - revertContext = undefined - } - }), - ] - }, - - revert: ctx => { - ctx.forEach(unsub => unsub()) - }, - }) -} - -interface DeletableEventHandler { - /** The current instance of this deletable */ - get(): T | null - onCreated: Subscribable['subscribe'] - onDeleted: Subscribable['subscribe'] -} - -interface RegisterDeletableOptions extends BaseModOptions {} - -/** - * Defines a new deletable register function, that handles the creation and deletion of deletables on the appropriate Blockbench events. - */ -function registerDeletableFactory( - createInstance: (id: string, ...args: A) => T, - deleteInstance: (instance: T) => void -) { - return function handler( - { id, priority, dependencies }: RegisterDeletableOptions, - ...args: A - ) { - let activeInstance: T | null - const created = subscribable() - const deleted = subscribable() - - const handle: DeletableEventHandler = { - get: () => activeInstance, - onCreated: created.subscribe, - onDeleted: deleted.subscribe, - } - - registerMod({ - id, - priority, - dependencies, - apply: () => { - activeInstance = createInstance(id, ...args) - created.publish(activeInstance) - return activeInstance - }, - revert: lastInstance => { - deleteInstance(lastInstance) - activeInstance = null - deleted.publish(lastInstance) - }, - }) - - return handle - } -} - -/** - * Defines a new Blockbench.Action, and handles it's creation and deletion on the appropriate Blockbench events. - * - * See https://www.blockbench.net/wiki/api/action for more information on the Blockbench.Action class. - */ -export const registerAction = registerDeletableFactory( - (id, options: ActionOptions) => new Action(id, options), - action => action.delete() -) - -/** - * Defines a new Blockbench.ModelFormat, and handles it's creation and deletion on the appropriate Blockbench events. - * - * See https://www.blockbench.net/wiki/api/modelformat for more information on the Blockbench.ModelFormat class. - */ -export const registerModelFormat = registerDeletableFactory( - (id, options: Omit) => new ModelFormat({ ...options, id }), - format => format.delete() -) - -/** - * Defines a new Blockbench.Codec, and handles it's creation and deletion on the appropriate Blockbench events. - * - * See https://www.blockbench.net/wiki/api/codec for more information on the Blockbench.Codec class. - */ -export const registerCodec = registerDeletableFactory( - (id, options: CodecOptions) => new Codec(id, { ...options }), - codec => codec.delete() -) - -export const registerBarMenu = registerDeletableFactory( - (id, structure: MenuItem[], options?: BarMenuOptions) => new BarMenu(id, structure, options), - menubar => { - // Swap over to this when Blockbench updates to 5.0 - // menubar.delete() - // Temporary implementation of `menubar.delete()` from Blockbench 5.0 - // @ts-expect-error No types - menubar.node.remove() - menubar.label.remove() - delete MenuBar.menus[menubar.id] - } -) - -export const registerModelLoader = registerDeletableFactory( - (id, options: Omit) => new ModelLoader(id, options), - loader => loader.delete() -) - -export const registerMenu = registerDeletableFactory( - (id, template: MenuItem[] | ((context?: any) => MenuItem[]), options: MenuOptions) => - new Menu(id, template, options), - menu => { - // Swap over to this when Blockbench updates to 5.0 - // menu.delete() - // Temporary implementation of `menu.delete()` from Blockbench 5.0 - // @ts-expect-error No types - menu.node.remove() - } -) - -interface PropertyOverrideModOptions< - ID extends string, - T extends Object, - K extends keyof T, - O extends T[K] -> extends BaseModOptions { - object: T - key: K - get: (this: T, original: T[K]) => O - set?: (this: T, value: O) => void -} - -export function registerPropertyOverrideMod< - ID extends string, - T extends Object, - K extends keyof T, - O extends T[K] ->(options: PropertyOverrideModOptions) { - registerMod({ - ...options, - - apply: () => { - if (options.object == undefined) { - throw new Error(`Cannot override property on undefined object.`) - } - - const original = { - value: undefined as O, - descriptor: undefined as unknown as PropertyDescriptor, - } - - original.value = options.object[options.key] as O - - original.descriptor = Object.getOwnPropertyDescriptor(options.object, options.key) ?? { - value: original.value, - writable: true, - configurable: true, - } - - if (original.descriptor.configurable === false) { - throw new Error( - `Cannot override property '${String( - options.key - )}' on object because it is not configurable.` - ) - } - - Object.defineProperty(options.object, options.key, { - configurable: true, - get() { - return options.get.call(this, original.value) - }, - set(value) { - original.value = value - }, - }) - - return { original } - }, - - revert: ({ original }) => { - Object.defineProperty(options.object, options.key, original.descriptor) - }, - }) -} - -interface ConditionalPropertyOverrideModOptions< - ID extends string, - T extends Object, - K extends keyof T, - O extends T[K] -> extends BaseModOptions { - object: T - key: K - condition: ConditionResolvable - get: (this: T, original: T[K]) => O - set?: (this: T, value: O) => void -} - -export function registerConditionalPropertyOverrideMod< - ID extends string, - T extends Object, - K extends keyof T, - O extends T[K] ->(options: ConditionalPropertyOverrideModOptions) { - registerMod({ - ...options, - - apply: () => { - if (options.object == undefined) { - throw new Error(`Cannot override property on undefined object.`) - } - - const original = { - value: undefined as O, - descriptor: undefined as unknown as PropertyDescriptor, - } - - original.value = options.object[options.key] as O - - original.descriptor = Object.getOwnPropertyDescriptor(options.object, options.key) ?? { - value: original.value, - writable: true, - configurable: true, - } - - if (original.descriptor.configurable === false) { - throw new Error( - `Cannot override property '${String( - options.key - )}' on object because it is not configurable.` - ) - } - - Object.defineProperty(options.object, options.key, { - configurable: true, - enumerable: original.descriptor.enumerable, - get: function (this: T) { - if (Condition(options.condition, this)) { - return options.get.call(this, original.value) - } - return original.value - }, - set: options.set - ? function (this: T, value) { - if (Condition(options.condition, this)) { - options.set!.call(this, value) - } else { - original.value = value - } - } - : value => { - original.value = value - }, - }) - - return { original } - }, - - revert: ({ original }) => { - Object.defineProperty(options.object, options.key, original.descriptor) - }, - }) -} - -interface Storage { - value: Value -} -const SUBSCRIBABLES = new Map< - any, - [ - Subscribable<{ storage: Storage; value: any }>, - Subscribable<{ storage: Storage; newValue: any }> - ] ->() - -/** - * Creates a subscribable for a property on an object. - * @param object The object to create the subscribable for. - * @param key The key of the property on the object. - * @returns A tuple of {@link Subscribable | Subscribables} [onGet, onSet] - * @example - * Using the subscribables as simple EVENTS. - * ```ts - * const [onGet, onSet] = createPropertySubscribable(Blockbench, 'version') - * onGet.subscribe(({ value }) => console.log('Blockbench version:', value)) - * onSet.subscribe(({ newValue }) => console.log('Blockbench version changed to:', newValue)) - * ``` - * @example - * Using the subscribables to change the value of a Property. - * ```ts - * const [, onSet] = createPropertySubscribable(Blockbench, 'version') - * onSet.subscribe(({ storage, newValue }) => { - * if (newValue === '1.0.0') storage.value = '1.0.1' - * }) - * ``` - * Note that `storage.value` can be modified by other subscribers, but `newValue` is the value that was set. - * You decide if you want to operate on `newValue` or the possibly modified `storage.value`. - - * The Getter can also modify `storage.value`, but this is not recommended. - */ -export function createPropertySubscribable(object: any, key: string) { - let subscribables = SUBSCRIBABLES.get(object) - const storage: Storage = { value: object[key] } - - if (subscribables === undefined) { - const onGet = subscribable<{ - storage: Storage - value: Value - }>() - const onSet = subscribable<{ storage: Storage; newValue: Value }>() - subscribables = [onGet, onSet] - SUBSCRIBABLES.set(object, subscribables) - - Object.defineProperty(object, key, { - get() { - onGet.publish({ storage, value: storage.value }) - return storage.value - }, - set(newValue: Value) { - storage.value = newValue - onSet.publish({ storage, newValue }) - }, - configurable: true, - }) - - EVENTS.PLUGIN_UNLOAD.subscribe(() => { - const value = object[key] - delete object[key] - Object.defineProperty(object, key, { - value, - configurable: true, - }) - }, true) - } - - return subscribables -} - -/** - * A wrapper for the Blockbench.Property class that deep-clones the property value when copying or merging. - */ -export class ObjectProperty extends Property<'object'> { - constructor(target: any, name: string, options: PropertyOptions) { - super(target, 'object', name, options) - } - - copy(instance: any, target: any) { - if (instance[this.name] == undefined) { - target[this.name] = instance[this.name] - } else { - target[this.name] = JSON.parse(JSON.stringify(instance[this.name])) - } - } - - merge(instance: any, data: any) { - if (data[this.name] == undefined) { - instance[this.name] = this.default - } else { - instance[this.name] = JSON.parse(JSON.stringify(data[this.name])) - } - } -} diff --git a/src/util/mountSvelteComponent.ts b/src/util/mountSvelteComponent.ts deleted file mode 100644 index 446d7318..00000000 --- a/src/util/mountSvelteComponent.ts +++ /dev/null @@ -1,151 +0,0 @@ -import { ComponentProps, SvelteComponent } from 'svelte' -import { BaseModOptions, registerMod } from './moddingTools' -import { PollingCancelledError, pollUntilResult } from './promises' -import { SvelteComponentOptions } from './svelteUtil' - -type ElementSelector = string | (() => Element | undefined | null) - -type MountSvelteComponentOptions = SvelteComponentOptions & { - /** - * A selector string, function returning an element, or the element itself to mount the component to. - */ - target: Element | ElementSelector - /** - * If this condition returns true, mounting process will be cancelled. - */ - cancelCondition?: () => boolean - /** - * Whether to hide the target element's children when mounting the component. - * - * Useful when other code is relying on the children being present, but you want to hide them. - */ - hideTargetChildren?: boolean - /** - * Whether to replace all children of the target element with the component. - */ - replaceChildren?: boolean - /** - * A function to call after the component has been mounted - */ - onMount?: (component: T, target: Element) => void - /** - * A function to call before the component is destroyed - */ - onDestroy?: (component: T) => void - /** - * Whether to prepend the component to the element's children. - * - * Overrides `injectIndex` if true. - */ - prepend?: boolean - /** - * The index to inject the component at in the element's children. - */ - injectIndex?: number -} - -/** - * Mounts a Svelte component to a target element. - */ -export function mountSvelteComponent( - options: MountSvelteComponentOptions -) { - let target: Element | undefined | null - if (typeof options.target === 'string') { - target = document.querySelector(options.target) - } else if (typeof options.target === 'function') { - target = options.target() - } else { - target = options.target - } - - if (!target) throw new Error('Target element not found') - - let anchor: Element | undefined - if (options.replaceChildren) { - target.replaceChildren() - } else { - if (options.hideTargetChildren) { - for (const child of Array.from(target.children)) { - if (child instanceof HTMLElement) { - child.style.display = 'none' - } - } - } - - if (options.prepend) { - anchor = target.children[0] - } else if (options.injectIndex !== undefined) { - anchor = target.children[options.injectIndex] - } - } - - const mounted = new options.component({ target: target, anchor, props: options.props }) - options.onMount?.(mounted, target) - - mounted.$on('destroy', () => { - options.onDestroy?.(mounted) - }) - - return mounted -} - -type MountSvelteComponentModOptions< - ID extends string, - T extends SvelteComponent -> = BaseModOptions & - Omit, 'target'> & { - target: ElementSelector - } - -export function registerMountSvelteComponentMod( - options: MountSvelteComponentModOptions -) { - const mountSelector = - typeof options.target === 'string' - ? document.querySelector.bind(document, options.target) - : options.target - - let mounted: T | undefined - - const destroy = () => { - if (mounted != undefined) { - options.onDestroy?.(mounted) - mounted?.$destroy() - mounted = undefined - } - } - - const modHandle = registerMod({ - ...options, - - apply: () => { - destroy() - - void pollUntilResult( - () => mountSelector(), - // Prioritize cancelling if the mod is uninstalled while waiting. - () => !modHandle.isInstalled() || !!options.cancelCondition?.() - ) - .catch(e => { - if (e instanceof PollingCancelledError) { - console.error('Mounting Svelte component cancelled for mod', options.id) - return undefined - } else { - console.error('Error mounting Svelte component for mod', options.id, e) - } - }) - .then(target => { - if (!target) return - mounted = mountSvelteComponent({ - ...(options as typeof options & { props: ComponentProps }), - target, - }) - }) - }, - - revert: destroy, - }) - - return modHandle -} diff --git a/src/util/resourceLocation.d.ts b/src/util/resourceLocation.d.ts index 38cb9d86..bf7ac867 100644 --- a/src/util/resourceLocation.d.ts +++ b/src/util/resourceLocation.d.ts @@ -10,7 +10,7 @@ export namespace ResourceLocation { : `Invalid characters in path: ${Exclude}` export type ValidateNamespace = [N] extends [ - RestrictString + RestrictString, ] ? N : `Invalid characters in namespace: ${Exclude}` @@ -23,7 +23,7 @@ export namespace ResourceLocation { * * ``` * // Valid - * 'namespace:path', 'name-space:foo/bar.json', 'snavesutit.animated-java:blueprint-settings-dialog' + * 'namespace:path', 'name-space:foo/bar.json', 'snavesutit.animated_java:blueprint-settings-dialog' * * // Invalid * 'Namespace:Path', 'namespace:path:extra', 'namespacepath' diff --git a/src/util/stores.ts b/src/util/stores.ts deleted file mode 100644 index 6e9407c5..00000000 --- a/src/util/stores.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { get, type Subscriber, type Unsubscriber, type Writable, writable } from 'svelte/store' - -export class Valuable implements Writable { - static all: Array> = [] - - private store: Writable - private valueValidator: (value: T) => T - - constructor(value: T, valueValidator?: Valuable['valueValidator']) { - this.store = writable(value) - this.valueValidator = valueValidator ?? ((value: T) => value) - Valuable.all.push(this) - } - - get() { - return this.valueValidator(get(this.store)) - } - - set(value: T) { - return this.store.set(this.valueValidator(value)) - } - - update(fn: (value: T) => T) { - return this.store.update((value: T) => this.valueValidator(fn(value))) - } - - subscribe(run: Subscriber, invalidate?: (value?: T) => void): Unsubscriber { - return this.store.subscribe(run, invalidate) - } -} - -export class SetStore extends Valuable> { - constructor(value: Set) { - super(value, (value: Set) => new Set(value)) - } - - add(value: T) { - const set = this.get() - set.add(value) - this.set(set) - } - - delete(value: T) { - const set = this.get() - set.delete(value) - this.set(set) - } -} diff --git a/src/util/subscribable.ts b/src/util/subscribable.ts deleted file mode 100644 index b4aeff6e..00000000 --- a/src/util/subscribable.ts +++ /dev/null @@ -1,42 +0,0 @@ -export interface Subscribable { - subscribe: (callback: (value: T) => void, oneShot?: boolean) => () => void - publish: (value: T) => void -} - -/** - * Creates a simple subscribable object. - * @template T The type of the value that is passed to the subscribers. - */ -export function subscribable(): Subscribable { - const subscribers = new Set<(value: T) => void>() - // Used to prevent recursive publishing - let publishing = false - return { - /** - * Subscribe to this subscribable. - * @param callback The callback to be called when the subscribable is published. - * @param oneShot If true, the callback will be removed after it is called once. - * @returns A function that can be called to unsubscribe the callback. - */ - subscribe: (callback: (value: T) => void, oneShot = false) => { - if (oneShot) { - const wrappedCallback = (value: T) => { - callback(value) - subscribers.delete(wrappedCallback) - } - subscribers.add(wrappedCallback) - } else subscribers.add(callback) - return () => subscribers.delete(callback) - }, - /** - * Publish a value to all subscribers. - * @param value The value to be passed to the subscribers. - */ - publish: (value: T) => { - if (publishing) return - publishing = true - subscribers.forEach(callback => callback(value)) - publishing = false - }, - } -} diff --git a/src/util/svelteDialog.ts b/src/util/svelteDialog.ts deleted file mode 100644 index 7fa539ed..00000000 --- a/src/util/svelteDialog.ts +++ /dev/null @@ -1,157 +0,0 @@ -import type { SvelteComponent } from 'svelte' -import type { SvelteComponentOptions } from './svelteUtil' - -const DIALOG_STACK: SvelteDialog[] = [] - -export type CssStyleObject = { - [K in keyof CSSStyleDeclaration as K extends string - ? CSSStyleDeclaration[K] extends string - ? K - : never - : never]?: CSSStyleDeclaration[K] -} - -type SvelteDialogOptions< - DialogContent extends SvelteComponent, - DialogExtra extends SvelteComponent -> = Omit & { - id: string - content: SvelteComponentOptions - /** A svelte component to be appended directly to the dialog.dialog element. */ - extra?: SvelteComponentOptions - - /** Styles to be applied to the default content element */ - contentStyle?: CssStyleObject - /** Styles to be applied to the default wrapper element */ - wrapperStyle?: CssStyleObject - /** Styles to be applied to the dialog element */ - dialogStyle?: CssStyleObject - - preventKeybinds?: boolean - preventKeybindConfirm?: boolean - preventKeybindCancel?: boolean - onClose?: () => void - stackable?: boolean -} - -function applyStyleObject(element: HTMLElement, style: CssStyleObject) { - for (const [key, value] of Object.entries(style)) { - // @ts-expect-error - Index type of CSSStyleDeclaration is number for some reason - element.style[key] = value ?? '' - } -} - -export class SvelteDialog< - DialogContent extends SvelteComponent = any, - DialogExtra extends SvelteComponent = any -> extends Dialog { - wrapperElement: HTMLDivElement | null = null - contentElement: HTMLDivElement | null = null - - contentComponent: SvelteComponent | null = null - extraComponent: SvelteComponent | null = null - - constructor(options: SvelteDialogOptions) { - const mount = document.createComment(`svelte-dialog-` + guid()) - - const dialogOptions = { ...options } - // @ts-expect-error Not in DialogOptions - delete dialogOptions.component - - super(options.id, { - ...dialogOptions, - lines: [mount], - }) - - this.onOpen = () => { - if (this.contentComponent) return - - this.contentElement = mount.parentElement! as HTMLDivElement - if (!this.contentElement) { - console.error('Failed to find dialog content element') - return - } - - this.wrapperElement = this.contentElement.parentElement! as HTMLDivElement - if (!this.wrapperElement) { - console.error('Failed to find dialog wrapper element') - return - } - - if (options.contentStyle) applyStyleObject(this.contentElement, options.contentStyle) - if (options.wrapperStyle) applyStyleObject(this.wrapperElement, options.wrapperStyle) - if (options.dialogStyle) applyStyleObject(this.object!, options.dialogStyle) - - this.contentComponent = new options.content.component({ - target: this.contentElement, - props: options.content.props!, - }) - - if (options.extra) { - this.extraComponent = new options.extra.component({ - target: this.object!, - props: options.extra.props!, - }) - } - - if (options.onOpen) options.onOpen() - if (!options.stackable) { - DIALOG_STACK.forEach(v => v.cancel()) - DIALOG_STACK.empty() - } - DIALOG_STACK.push(this) - - requestAnimationFrame(() => { - // Center the dialog vertically, but shifted a bit upwards - const jqObject = $(this.object!) - const height = jqObject.height()! - const diff = Math.max(window.innerHeight - height, 0) - const offset = diff * 0.25 - this.object!.style.top = Math.clamp(diff / 2 - offset, 26, 2000) + 'px' - }) - } - - this.confirm = (e: Event) => { - if (e instanceof KeyboardEvent) { - if (options.preventKeybinds) { - e.preventDefault() - e.stopPropagation() - return - } else if ( - options.preventKeybindConfirm && - e.key === Keybinds.extra.confirm.keybind.getCode() - ) { - e.preventDefault() - e.stopPropagation() - return - } else if ( - options.preventKeybindCancel && - e.key === Keybinds.extra.cancel.keybind.getCode() - ) { - e.preventDefault() - e.stopPropagation() - return - } - } - this.close(this.confirmIndex, e) - } - - this.onButton = (...args) => { - if (!this.contentComponent) return - this.extraComponent?.$destroy() - this.contentComponent.$destroy() - this.contentComponent = null - if (options.onButton) options.onButton(...args) - if (options.onClose) options.onClose() - } - - this.onCancel = (...args) => { - if (!this.contentComponent) return - this.extraComponent?.$destroy() - this.contentComponent.$destroy() - this.contentComponent = null - if (options.onCancel) options.onCancel(...args) - if (options.onClose) options.onClose() - } - } -} diff --git a/src/util/sveltePanel.ts b/src/util/sveltePanel.ts deleted file mode 100644 index c400b0c7..00000000 --- a/src/util/sveltePanel.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { type ComponentConstructorOptions, SvelteComponent } from 'svelte' -import { PACKAGE } from '../constants' -import { pollUntilResult } from '../util/promises' -import { type SvelteComponentConstructor } from './misc' - -type SveltePanelOptions = Omit< - PanelOptions, - 'component' -> & { - id: string - component: SvelteComponentConstructor - props: Record -} - -export class SveltePanel extends Panel { - instance?: SvelteComponent | undefined - constructor(options: SveltePanelOptions) { - const mountId = `${PACKAGE.name}-svelte-panel-` + guid() - - super(options.id, { - ...options, - component: { - name: options.id, - template: `
`, - }, - }) - - void pollUntilResult( - () => document.querySelector(`#${mountId}`), - () => false - ).then(el => { - this.instance = new options.component({ - target: el.parentElement, - props: options.props, - }) - }) - } -} diff --git a/src/util/svelteUtil.d.ts b/src/util/svelteUtil.d.ts deleted file mode 100644 index 51c92ce3..00000000 --- a/src/util/svelteUtil.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { ComponentProps, ComponentType, SvelteComponent } from 'svelte' - -export type SvelteComponentOptions = ComponentProps extends Record< - string, - never -> - ? { - component: ComponentType - props?: ComponentProps - } - : { - component: ComponentType - props: ComponentProps - } diff --git a/src/util/translation.ts b/src/util/translation.ts deleted file mode 100644 index cd75b5ae..00000000 --- a/src/util/translation.ts +++ /dev/null @@ -1,36 +0,0 @@ -// @ts-expect-error No types -import { default as LANGUAGES, filenames as filepaths } from '../lang/*.yml' - -const FILE_NAMES = filepaths.map((path: string) => PathModule.basename(path, '.yml')) - -export function translate(key: string, ...args: string[]) { - let languageIndex = FILE_NAMES.indexOf(settings.language.value) - if (languageIndex === -1) { - console.warn(`Could not find language '${settings.language.value as string}'`) - languageIndex = FILE_NAMES.indexOf('en') - } - const lang = LANGUAGES[languageIndex] as Record - if (!key.startsWith('animated_java.')) { - key = `animated_java.${key}` - } - const translation = lang[key] - if (translation) { - return translation.replace(/\{(\d+)\}/g, (str, index) => args[index] || '') - } else { - const enIndex = FILE_NAMES.indexOf('en') - if (languageIndex !== enIndex) { - const langEn = LANGUAGES[enIndex] as Record - const translationEn = langEn[key] - if (translationEn) { - console.warn( - `Missing translation for '${key}' in '${ - settings.language.value as string - }', falling back to English` - ) - return langEn[key].replace(/\{(\d+)\}/g, (str, index) => args[index] || '') - } - } - console.warn(`Could not find translation for '${key}'`) - return key - } -} diff --git a/svelte.config.ts b/svelte.config.ts deleted file mode 100644 index 8d9e5be8..00000000 --- a/svelte.config.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { resolve } from 'path' -import prep from 'svelte-preprocess' -import { typescript } from 'svelte-preprocess-esbuild' - -export const compilerOptions = { - dev: process.env.NODE_ENV === 'development', - css: true, -} - -export const preprocess = [ - typescript({ - target: 'es2022', - define: { - 'process.browser': 'true', - }, - }), - prep({ typescript: false }), -] - -const IMPORT_PATH = resolve(__dirname, '../src/util/', 'events.ts').replace(/\\/g, '/') - -export const transformCssToJs = (css: string) => - `import SVELTE_EVENTS from '${IMPORT_PATH}'; - (() => { - var css; - SVELTE_EVENTS.PLUGIN_LOAD.subscribe(() => css = Blockbench.addCSS(${JSON.stringify(css)})); - SVELTE_EVENTS.PLUGIN_UNLOAD.subscribe(() => css?.delete()); - })()`.replace(/[\t\n]/g, '') - -export default { preprocess, transformCssToJs } diff --git a/test-packs/1.20.4/blueprints/armor_stand_1.20.4.ajblueprint b/test-packs/1.20.4/blueprints/armor_stand_1.20.4.ajblueprint index ae9cf654..81c84e95 100644 --- a/test-packs/1.20.4/blueprints/armor_stand_1.20.4.ajblueprint +++ b/test-packs/1.20.4/blueprints/armor_stand_1.20.4.ajblueprint @@ -1,9 +1,9 @@ { "meta": { "format": "animated-java:format/blueprint", - "format_version": "1.8.1", + "format_version": "1.10.0-beta.1", "uuid": "167b27cd-b559-3f13-a97c-0841fe21f1d1", - "save_location": "D:\\github-repos\\animated-java\\old-animated-java\\test-packs\\1.20.4\\blueprints\\armor_stand_1.20.4.ajblueprint", + "save_location": "/var/mnt/ssd2/repos/animated-java/animated-java/test-packs/1.20.4/blueprints/armor_stand_1.20.4.ajblueprint", "last_used_export_namespace": "armor_stand" }, "resolution": { @@ -25,10 +25,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-6, 0, -6], "to": [6, 1, 6], @@ -38,27 +41,27 @@ "faces": { "north": { "uv": [12, 44, 24, 45], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [0, 44, 12, 45], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [36, 44, 48, 45], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [24, 44, 36, 45], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [12, 32, 24, 44], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [24, 32, 36, 44], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -67,10 +70,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-4, 12, -1], "to": [4, 14, 1], @@ -80,27 +86,27 @@ "faces": { "north": { "uv": [2, 50, 10, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [0, 50, 2, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [12, 50, 20, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [10, 50, 12, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [2, 50, 10, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [10, 48, 18, 50], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -109,10 +115,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [1, 1, -1], "to": [3, 12, 1], @@ -122,27 +131,27 @@ "faces": { "north": { "uv": [10, 2, 12, 13], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [12, 2, 14, 13], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [14, 2, 16, 13], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [8, 2, 10, 13], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [10, 0, 12, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [12, 0, 14, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -151,10 +160,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-3, 1, -1], "to": [-1, 12, 1], @@ -164,27 +176,27 @@ "faces": { "north": { "uv": [44, 18, 42, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [46, 18, 44, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [48, 18, 46, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [42, 18, 40, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [42, 16, 44, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [44, 16, 46, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -193,10 +205,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-6, 21, -1.5], "to": [6, 24, 1.5], @@ -206,27 +221,27 @@ "faces": { "north": { "uv": [3, 29, 15, 32], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [0, 29, 3, 32], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [18, 29, 30, 32], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [15, 29, 18, 32], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [3, 26, 15, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [15, 26, 27, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -235,10 +250,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [1, 14, -1], "to": [3, 21, 1], @@ -248,27 +266,27 @@ "faces": { "north": { "uv": [18, 2, 20, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [16, 2, 18, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [22, 2, 24, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [20, 2, 22, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [18, 0, 20, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [20, 0, 22, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -277,10 +295,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-3, 14, -1], "to": [-1, 21, 1], @@ -290,27 +311,27 @@ "faces": { "north": { "uv": [50, 18, 52, 25], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [48, 18, 50, 25], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [54, 18, 56, 25], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [52, 18, 54, 25], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [50, 16, 52, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [52, 16, 54, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -319,10 +340,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-7, 12, -1], "to": [-5, 24, 1], @@ -332,27 +356,27 @@ "faces": { "north": { "uv": [36, 18, 34, 30], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [34, 18, 32, 30], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [40, 18, 38, 30], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [38, 18, 36, 30], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [34, 18, 36, 16], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [36, 16, 38, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -361,10 +385,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [5, 12, -1], "to": [7, 24, 1], @@ -374,27 +401,27 @@ "faces": { "north": { "uv": [26, 2, 28, 14], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [24, 2, 26, 14], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [30, 2, 32, 14], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [28, 2, 30, 14], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [26, 0, 28, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [30, 0, 28, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -403,10 +430,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-1, 23, -1], "to": [1, 30, 1], @@ -416,27 +446,27 @@ "faces": { "north": { "uv": [2, 2, 4, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [0, 2, 2, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [6, 2, 8, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [4, 2, 6, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [2, 0, 4, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [4, 0, 6, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -445,10 +475,13 @@ { "name": "helmet", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-5, 22, -5], "to": [5, 32, 5], @@ -458,27 +491,27 @@ "faces": { "north": { "uv": [8, 16, 16, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [0, 16, 8, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [24, 16, 32, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [16, 16, 24, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [8, 0, 16, 16], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [16, 0, 24, 16], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -487,10 +520,13 @@ { "name": "chestplate", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 15, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-5, 11.25, -3], "to": [5, 23.75, 3], @@ -500,27 +536,27 @@ "faces": { "north": { "uv": [20, 40, 28, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [16, 40, 20, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [32, 40, 40, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [28, 40, 32, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [20, 32, 28, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [28, 32, 36, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -529,10 +565,13 @@ { "name": "left_chestplate", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-9, 19.25, -3], "to": [-3, 25, 3], @@ -542,27 +581,27 @@ "faces": { "north": { "uv": [48, 40, 44, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [44, 40, 40, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [56, 40, 52, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [52, 40, 48, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [44, 39.75, 48, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [52, 32, 48, 39.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -571,10 +610,13 @@ { "name": "left_chestplate", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [3, 19.25, -3], "to": [9, 25, 3], @@ -584,27 +626,27 @@ "faces": { "north": { "uv": [44, 40, 48, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [48, 40, 52, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [52, 40, 56, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [40, 40, 44, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [48, 39.75, 44, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [48, 32, 52, 39.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -613,10 +655,13 @@ { "name": "pants", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-4.5, 11.5, -2.5], "to": [4.5, 17, 2.5], @@ -626,27 +671,27 @@ "faces": { "north": { "uv": [20, 54, 28, 64], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "east": { "uv": [16, 54, 20, 64], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "south": { "uv": [32, 54, 40, 64], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "west": { "uv": [28, 54, 32, 64], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "up": { "uv": [20, 48, 28, 54], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "down": { "uv": [28, 48, 36, 54], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" } }, "type": "cube", @@ -655,10 +700,13 @@ { "name": "right_pants", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-0.5, 2.75, -2.375], "to": [4.25, 12, 2.375], @@ -668,27 +716,27 @@ "faces": { "north": { "uv": [4, 40, 8, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "east": { "uv": [0, 40, 4, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "south": { "uv": [12, 40, 16, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "west": { "uv": [8, 40, 12, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "up": { "uv": [4, 32, 8, 40], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "down": { "uv": [8, 32, 12, 40], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" } }, "type": "cube", @@ -697,10 +745,13 @@ { "name": "left_pants", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-4.25, 2.75, -2.375], "to": [0.5, 12, 2.375], @@ -710,27 +761,27 @@ "faces": { "north": { "uv": [8, 40, 4, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "east": { "uv": [12, 40, 8, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "south": { "uv": [16, 40, 12, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "west": { "uv": [4, 40, 0, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "up": { "uv": [8, 32, 4, 40], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "down": { "uv": [12, 32, 8, 40], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" } }, "type": "cube", @@ -739,10 +790,13 @@ { "name": "right_shoe", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-1, -1, -3], "to": [4.75, 6, 3], @@ -752,27 +806,27 @@ "faces": { "north": { "uv": [4, 52, 8, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [0, 52, 4, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [12, 52, 16, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [8, 52, 12, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [4, 32, 8, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [8, 32, 12, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -781,10 +835,13 @@ { "name": "left_shoe", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-4.75, -1, -3], "to": [1, 6, 3], @@ -794,27 +851,27 @@ "faces": { "north": { "uv": [8, 52, 4, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [12, 52, 8, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [16, 52, 12, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [4, 52, 0, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [8, 32, 4, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [12, 32, 8, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -827,6 +884,7 @@ "ignore_inherited_scale": false, "visibility": true, "locked": false, + "scope": 0, "config": { "use_entity": true, "entity_type": "minecraft:item_display", @@ -845,6 +903,7 @@ "ignore_inherited_scale": false, "visibility": true, "locked": false, + "scope": 0, "config": { "use_entity": true, "entity_type": "minecraft:item_display", @@ -857,11 +916,10 @@ "type": "locator" }, { - "uuid": "c2e217f1-b50a-5c9a-b342-71a35e984046", - "type": "animated_java:text_display", - "name": "text_display", + "name": "message", "position": [0, 38, 0], "rotation": [0, 0, 0], + "pivotOffset": [0, 0, 0], "scale": [1, 1, 1], "visibility": true, "locked": false, @@ -902,7 +960,10 @@ "shadow_strength": 1 } } - } + }, + "scope": 0, + "uuid": "c2e217f1-b50a-5c9a-b342-71a35e984046", + "type": "animated_java:text_display" }, { "name": "camera", @@ -913,15 +974,17 @@ "linked_preview": "", "camera_linked": false, "visibility": true, + "export": true, + "locked": false, + "scope": 0, "type": "camera", "uuid": "3ffeee76-901e-f8a2-c29a-82f90e16fd1e" }, { - "uuid": "bc141119-7f51-9690-7e21-e119b34fb3a2", - "type": "animated_java:vanilla_item_display", - "name": "item_display", + "name": "diamond", "position": [6, 12, -4], "rotation": [-90, 0, 0], + "pivotOffset": [0, 0, 0], "scale": [0.5, 0.5, 0.5], "visibility": true, "locked": false, @@ -952,19 +1015,870 @@ "enchanted": true, "glowing": true, "override_glow_color": true, - "glow_color": "#99ff00", + "glow_color": "#99ff00", + "invisible": false, + "shadow_radius": 0, + "shadow_strength": 1 + } + } + }, + "scope": 0, + "uuid": "bc141119-7f51-9690-7e21-e119b34fb3a2", + "type": "animated_java:vanilla_item_display" + }, + { + "name": "stone", + "position": [-9, 11, -3], + "rotation": [-22.5, 45, 0], + "pivotOffset": [0, 0, 0], + "scale": [0.25, 0.25, 0.25], + "visibility": true, + "locked": false, + "export": true, + "block": "minecraft:stone", + "onSummonFunction": "", + "configs": { + "default": {}, + "variants": {} + }, + "scope": 0, + "uuid": "789cb8f5-f460-97a7-bda7-6a45419fb71c", + "type": "animated_java:vanilla_block_display" + }, + { + "name": "helmet inverted", + "box_uv": false, + "render_order": "default", + "rescale": false, + "locked": false, + "shade": true, + "light_emission": 0, + "export": true, + "scope": 0, + "allow_mirror_modeling": true, + "from": [5, 32, 5], + "to": [-5, 22, -5], + "autouv": 0, + "color": 9, + "origin": [0, 27, 0], + "faces": { + "north": { + "uv": [24, 32, 32, 16], + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" + }, + "east": { + "uv": [16, 32, 24, 16], + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" + }, + "south": { + "uv": [8, 32, 16, 16], + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" + }, + "west": { + "uv": [0, 32, 8, 16], + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" + }, + "up": { + "uv": [24, 0, 16, 16], + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" + }, + "down": { + "uv": [16, 0, 8, 16], + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" + } + }, + "type": "cube", + "uuid": "09727278-d2b6-46cd-b8f5-091638e54b81" + }, + { + "name": "right_chestplate inverted", + "box_uv": false, + "render_order": "default", + "rescale": false, + "locked": false, + "shade": true, + "light_emission": 0, + "export": true, + "scope": 0, + "allow_mirror_modeling": true, + "from": [9, 25, 3], + "to": [3, 19.25, -3], + "autouv": 0, + "color": 9, + "origin": [6, 22.125, 0], + "faces": { + "north": { + "uv": [52, 49.75, 56, 40], + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" + }, + "east": { + "uv": [40, 49.75, 44, 40], + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" + }, + "south": { + "uv": [44, 49.75, 48, 40], + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" + }, + "west": { + "uv": [48, 49.75, 52, 40], + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" + }, + "up": { + "uv": [52, 32, 48, 39.75], + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" + }, + "down": { + "uv": [44, 39.75, 48, 32], + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" + } + }, + "type": "cube", + "uuid": "a1689fd0-3e04-2ab6-026f-e9f32aa2e565" + }, + { + "name": "right_chestplate inverted", + "box_uv": false, + "render_order": "default", + "rescale": false, + "locked": false, + "shade": true, + "light_emission": 0, + "export": true, + "scope": 0, + "allow_mirror_modeling": true, + "from": [-3, 25, 3], + "to": [-9, 19.25, -3], + "autouv": 0, + "color": 9, + "origin": [-6, 22.125, 0], + "faces": { + "north": { + "uv": [56, 49.75, 52, 40], + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" + }, + "east": { + "uv": [52, 49.75, 48, 40], + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" + }, + "south": { + "uv": [48, 49.75, 44, 40], + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" + }, + "west": { + "uv": [44, 49.75, 40, 40], + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" + }, + "up": { + "uv": [48, 32, 52, 39.75], + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" + }, + "down": { + "uv": [48, 39.75, 44, 32], + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" + } + }, + "type": "cube", + "uuid": "d81e975b-3926-ec86-b69b-3aa6a8fbe8de" + }, + { + "name": "chestplate inverted", + "box_uv": false, + "render_order": "default", + "rescale": false, + "locked": false, + "shade": true, + "light_emission": 15, + "export": true, + "scope": 0, + "allow_mirror_modeling": true, + "from": [5, 23.75, 3], + "to": [-5, 11.25, -3], + "autouv": 0, + "color": 9, + "origin": [0, 17.5, 0], + "faces": { + "north": { + "uv": [32, 64, 40, 40], + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" + }, + "east": { + "uv": [28, 64, 32, 40], + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" + }, + "south": { + "uv": [20, 64, 28, 40], + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" + }, + "west": { + "uv": [16, 64, 20, 40], + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" + }, + "up": { + "uv": [36, 32, 28, 40], + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" + }, + "down": { + "uv": [28, 32, 20, 40], + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" + } + }, + "type": "cube", + "uuid": "6e369392-37b8-17de-043e-d0603a8ebbb6" + }, + { + "name": "right_shoe inverted", + "box_uv": false, + "render_order": "default", + "rescale": false, + "locked": false, + "shade": true, + "light_emission": 0, + "export": true, + "scope": 0, + "allow_mirror_modeling": true, + "from": [1, 6, 3], + "to": [-4.75, -1, -3], + "autouv": 0, + "color": 9, + "origin": [-1.875, 2.5, 0], + "faces": { + "north": { + "uv": [16, 64, 12, 52], + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" + }, + "east": { + "uv": [4, 64, 0, 52], + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" + }, + "south": { + "uv": [8, 64, 4, 52], + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" + }, + "west": { + "uv": [12, 64, 8, 52], + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" + }, + "up": { + "uv": [8, 32, 12, 40], + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" + }, + "down": { + "uv": [4, 32, 8, 40], + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" + } + }, + "type": "cube", + "uuid": "fb93269a-e910-9683-a32b-1f59b47d9ebe" + }, + { + "name": "left_shoe inverted", + "box_uv": false, + "render_order": "default", + "rescale": false, + "locked": false, + "shade": true, + "light_emission": 0, + "export": true, + "scope": 0, + "allow_mirror_modeling": true, + "from": [4.75, 6, 3], + "to": [-1, -1, -3], + "autouv": 0, + "color": 9, + "origin": [1.875, 2.5, 0], + "faces": { + "north": { + "uv": [12, 64, 16, 52], + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" + }, + "east": { + "uv": [8, 64, 12, 52], + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" + }, + "south": { + "uv": [4, 64, 8, 52], + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" + }, + "west": { + "uv": [0, 64, 4, 52], + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" + }, + "up": { + "uv": [12, 32, 8, 40], + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" + }, + "down": { + "uv": [8, 32, 4, 40], + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" + } + }, + "type": "cube", + "uuid": "05ecbb82-3049-d3fd-3846-9b96863636d1" + } + ], + "groups": [ + { + "name": "root", + "uuid": "98795982-9c43-6e3e-eed9-2c776a957938", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 0, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glow_color": "#ffffff", + "glowing": false, + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": {} + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "baseplate_root", + "uuid": "102db36a-eeda-0e6f-d5cc-c186ecda8165", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 0, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glow_color": "#ffffff", + "glowing": false, + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": {} + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "baseplate_pivot_a", + "uuid": "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 1, 6], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glow_color": "#ffffff", + "glowing": false, + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": {} + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "armor_stand_root", + "uuid": "5e08acae-d6ca-0dfd-9360-8cdb13c7a824", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 1, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": {} + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "waist_pivot", + "uuid": "98a28100-07e8-849a-38b7-f56abc2c2e56", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 12, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "5417306e-2c69-3f36-1e3c-edd904034a36": {} + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "body_waist_pivot", + "uuid": "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 12, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "5417306e-2c69-3f36-1e3c-edd904034a36": {} + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "body", + "uuid": "6c53311f-ffc8-e567-ff1b-65840698e9ba", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 24, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "5417306e-2c69-3f36-1e3c-edd904034a36": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": false, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#00ff06", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "head", + "uuid": "808e3c26-7285-af3f-a079-d8b899176dd3", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 23, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#c400ff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "left_arm", + "uuid": "b5b52d2c-097c-08df-6457-372fbae12445", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [-6, 23, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#00ff9f", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "right_arm", + "uuid": "215d1b02-0e64-a794-1b88-a9c5a6d7541c", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [6, 23, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#ff0000", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "left_leg", + "uuid": "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [2, 12, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glow_color": "#ffffff", + "glowing": false, + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#ffee00", + "inherit_settings": true, "invisible": false, + "nbt": "{}", "shadow_radius": 0, - "shadow_strength": 1 + "shadow_strength": 1, + "use_nbt": false } } - } - } - ], - "outliner": [ + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, { - "name": "root", - "origin": [0, 0, 0], + "name": "right_leg", + "uuid": "60d50d30-a018-429d-ba78-c5fb5804dd8a", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [-2, 12, 0], + "rotation": [0, 0, 0], "color": 0, "onSummonFunction": "", "configs": { @@ -981,238 +1895,65 @@ "shadow_strength": 1, "use_nbt": false }, - "variants": {} + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#6e00ff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } }, - "uuid": "98795982-9c43-6e3e-eed9-2c776a957938", - "export": true, + "children": [], + "reset": false, + "shade": true, "mirror_uv": false, - "isOpen": true, - "locked": false, "visibility": true, "autouv": 0, - "selected": false, + "isOpen": true, + "primary_selected": false + } + ], + "outliner": [ + { + "uuid": "98795982-9c43-6e3e-eed9-2c776a957938", + "isOpen": true, "children": [ { - "name": "baseplate_root", - "origin": [0, 0, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glow_color": "#ffffff", - "glowing": false, - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": {} - }, "uuid": "102db36a-eeda-0e6f-d5cc-c186ecda8165", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ { - "name": "baseplate_pivot_a", - "origin": [0, 1, 6], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glow_color": "#ffffff", - "glowing": false, - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": {} - }, "uuid": "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["46624743-e0ef-5e97-e6d8-ba5dc100baf4"] } ] }, { - "name": "armor_stand_root", - "origin": [0, 1, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": {} - }, "uuid": "5e08acae-d6ca-0dfd-9360-8cdb13c7a824", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ { - "name": "waist_pivot", - "origin": [0, 12, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "5417306e-2c69-3f36-1e3c-edd904034a36": {} - } - }, "uuid": "98a28100-07e8-849a-38b7-f56abc2c2e56", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ { - "name": "body_waist_pivot", - "origin": [0, 12, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "5417306e-2c69-3f36-1e3c-edd904034a36": {} - } - }, "uuid": "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ { - "name": "body", - "origin": [0, 24, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "5417306e-2c69-3f36-1e3c-edd904034a36": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": false, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#00ff06", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "6c53311f-ffc8-e567-ff1b-65840698e9ba", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ "55829f3d-26dc-8f49-39b8-5ba2c0159a24", "9d16df18-0574-58bb-e0f9-f799946257c9", @@ -1221,254 +1962,61 @@ "6dd668dd-27bd-631d-5e44-a94f7a35ddbb", "d5e974ae-a732-db7a-59a1-c16ff717e426", { - "name": "head", - "origin": [0, 23, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#c400ff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "808e3c26-7285-af3f-a079-d8b899176dd3", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, - "children": ["a23d9259-0d9a-4e16-1b42-47e5bedba00f", "a302b268-1699-4013-011f-211bd85806d4", "3ffeee76-901e-f8a2-c29a-82f90e16fd1e"] + "children": [ + "a23d9259-0d9a-4e16-1b42-47e5bedba00f", + "a302b268-1699-4013-011f-211bd85806d4", + "3ffeee76-901e-f8a2-c29a-82f90e16fd1e", + "09727278-d2b6-46cd-b8f5-091638e54b81" + ] }, { - "name": "left_arm", - "origin": [-6, 23, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#00ff9f", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "b5b52d2c-097c-08df-6457-372fbae12445", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, - "children": ["c219cb9b-53a7-6a5b-7b47-dce0a1e6ec14", "967c77d0-2607-0ecb-8093-416d237cdb85", "7de415a2-9fdd-e4b2-3455-c3bed72eb896"] + "children": [ + "c219cb9b-53a7-6a5b-7b47-dce0a1e6ec14", + "967c77d0-2607-0ecb-8093-416d237cdb85", + "7de415a2-9fdd-e4b2-3455-c3bed72eb896", + "789cb8f5-f460-97a7-bda7-6a45419fb71c", + "d81e975b-3926-ec86-b69b-3aa6a8fbe8de" + ] }, { - "name": "right_arm", - "origin": [6, 23, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#ff0000", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "215d1b02-0e64-a794-1b88-a9c5a6d7541c", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ "13293700-7f42-2279-6a1f-4e0a6a4d89b3", "98475898-cfc8-f67b-3145-abaf659deb3e", "7747736f-85e2-338f-207e-53f8d3d2fa39", - "bc141119-7f51-9690-7e21-e119b34fb3a2" + "bc141119-7f51-9690-7e21-e119b34fb3a2", + "a1689fd0-3e04-2ab6-026f-e9f32aa2e565" ] - } + }, + "6e369392-37b8-17de-043e-d0603a8ebbb6" ] } ] }, { - "name": "left_leg", - "origin": [2, 12, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glow_color": "#ffffff", - "glowing": false, - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#ffee00", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, - "children": ["d29efa52-def5-a311-7438-1fc73aac804c", "71bfec99-5014-21d3-739b-6512074212db", "41413d23-edf5-3fdc-2ddb-5fd45ea99a89"] + "children": [ + "d29efa52-def5-a311-7438-1fc73aac804c", + "71bfec99-5014-21d3-739b-6512074212db", + "41413d23-edf5-3fdc-2ddb-5fd45ea99a89", + "05ecbb82-3049-d3fd-3846-9b96863636d1" + ] }, { - "name": "right_leg", - "origin": [-2, 12, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glow_color": "#ffffff", - "glowing": false, - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#6e00ff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "60d50d30-a018-429d-ba78-c5fb5804dd8a", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, - "children": ["60766231-bd45-cb3f-0a4f-c6c066e86f54", "4dd0c5f1-828f-d559-6496-16e2fbe6276d", "11976d8b-3994-df35-0fb9-b92ac5012141"] + "children": [ + "60766231-bd45-cb3f-0a4f-c6c066e86f54", + "4dd0c5f1-828f-d559-6496-16e2fbe6276d", + "11976d8b-3994-df35-0fb9-b92ac5012141", + "fb93269a-e910-9683-a32b-1f59b47d9ebe" + ] } ] } @@ -1480,12 +2028,13 @@ ], "textures": [ { - "path": "", "name": "wood.png", + "path": "", "folder": "", "namespace": "", "id": "0", "group": "", + "scope": 0, "width": 64, "height": 64, "uv_width": 64, @@ -1494,9 +2043,12 @@ "use_as_default": false, "layers_enabled": false, "sync_to_project": "", + "file_format": "png", "render_mode": "default", "render_sides": "auto", + "wrap_mode": "limited", "pbr_channel": "color", + "fps": 7, "frame_time": 1, "frame_order_type": "loop", "frame_order": "", @@ -1508,12 +2060,13 @@ "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAB6xJREFUeF7tW01oXUUUnmebkjZNCU1bjSnVtAUNVks0VK1gEbLowmK6EIOKP3VRKBYNBldqiLoMRIkUurAq+PPEhUpduAiIgkVLMDy1qGCtDY3RmsRH07SxSb3yzfW7OW9y75u5uS/v3WBnc+fnzN8353wzc+a9jPovHHtzv4foRH5S59z79LsZluH7xev7vJOjf6otDesVvo8/dzR2+a8jf6nLV83qNu5+4khBfdlXOePBIGwAPPPInd59u5rVx5//oPA1J2Ar/+SVB72pv/9Rx0+cDq1fzknLvjKfvvaoXnmEizMXVH5qOiivq6nW8dGRMbWybrVCemXVqqAc8kivWrlMawVWVgYz78LFy7oPBPTTULdW7X7yrYpqQubDvvs9OWkMjhNHHBPkRE2AKEtQWI76aPNi/nwAHNuSAEF+b+cHlQXgUNc9WgN+n7ig/piYCsZ39doadc3audWW5ShDgPwdrU06Tu3gClNzNl+/qUBjuPrMNLmk3KaQAbmhU6inHnR+Yp4qF1Prd44e18UEBaCZYMpyxKXM4Y++r6wGgAMwaa4izQH2ieCi1uAAgkgNqF9TW3QxATj6rbgGgANo57Rbqq20fc4GhCjVmiBJcpTAsR55gV8tkz+vDvR+VlkN2N++TZtAlM0zP0qt2+66SZuPZHe59JJQpf1Dw1KhATbSgYkUU2vJASTNKEJFPoIk24pzgAsAlAk7J9i2MZIs2uC5ABpD3qj0idBqf7Zzgg2AN17e40lCJd8QVFt92wIlLbcCYDsn2EiMJ82wQxQGX/FdICmCtvoAkJwAQpX2j7qp5wDbBJd6udUElvoEbeMvAACEZatQrDyJPbv4G4r5E2z1o8adGgCS+hNs9VMLAA9a9CuYAx0/Nxn4IMLuJdua/duoGVzvGvo2iANKqQKcIujc1dEht0mMwXS+yIuaeYagLOot9K5RUgB4vo/j6eFlTJ425eXsq8FTuijqur17V3PB2snbrMtdI/AHlEIL6AGKAwDPCZhF2F1ib9ttwbFZXrp43cZdRF7Y0E6cu0bFt0GYQDGfIsDktVwuNflA+iEXctfQALyw73avafMG3T5tmLZ36pezOl+WI02S4aAgBxl8XzzytTOw0gSiSK7YdRv9J7lrZDh5NMKV4GTYOG9uYRNn5wBsISDw7BHlU8z97BO09FfI6zZMBGGhdw3nlSrVLmG2Ix0y5AE5wYf27NDXaC4QF0HvGPkJ7VVKcteY97rDAbr4+Sm7fFmV+unMb+qGjdeq2cszCmkE5lFu52OH5wFODuDETOcLzgEIdLmZ/sskp0+0WzAgvA5hArRvqjcngM6ZJx2hXI0oecgClCgAipGc9CFKM6H/0nYdt2nuPABYQa4eV1Wustmwi8aEeX9wECtGcjgHyHcIkw8SAyDfBdasrtYqjEC7m52dUcuX+yoNDVi/2nd3r6mt1pqCcpkmGUGO9WRd5EEjCEaYU1ZywGL7CwreBjEwTur4tydVy82bCs7hQ98NB3mQPTc5HUzSrLvjli0aGEwYoKDuzltv1IABvEr7AqnBGXkF5lEWhVA9PntRWOZJWZTHret6V7DZcNLy2Ntgd3e3NzU1pWpq/PdBxBEaGxvVyMiIjqOsrq5O5fP5QMZVvqenJ/aYkoAQu7Ouri6vtbVVVVf7T+dmGB8fD8AZHR3VoMSR7+zsjD2msgPQ3NysVqxYofu9dOmSjldV+USJAHCmp6fV4OCgTseR7+3tTTcAMIGWlhY9QQaYAQGRqzE2NqbNII586jWgr6/Pa2ryvTCTk/4pDaG2dv5r8NDQkOaCOPKp5wBowNatWwtUfmZmJkgjTtMYHh7W8TjyqQdAkiA1wFx9mgc5gCToIr8kOACkxiBXX5Ig4jABkqCrfOo1ABywbt06yXWRcZAgQhz51JMgdwGoM1Sf+z53Am6H2AqpAdgFXOVTrwHkAKwsCU/uArB/5udyOa0B4ABX+SXBAfIojG0OAfs9j8XFjsI2+bJrQDab1e+BcjWlUfOkZ+73UP36+nqt2uYpUNaXZwWZjzoSSPaPfJiPuWMgzbHIXae9vT3RyTFRZScmTLnQFQBSvkCLPrxAA+ibk45PxuntoUfWHFWcp7BFn1HMDq4AwD9K0Bk68OUJhV9/Isg4ff02ubT4+lwVIXCKUt2PffOjdl4iMB5mFlFySR8qXAdeKrkru0AYkngwNf88EefFt1SrU452QjWAvIABwObD/iVWjsGVo49QAOTvezEIl5+alGOwi9FHKADyXyTsdKmRmytYoQBIDuDD5P+KA1zRK5Ncol+v2sZIDWAnSMsOF5JWqr7bb2O8J6Pj5pejcinHeOq71cjbPbpW48NzcabxRTnKGJdlZh7bQr40AQyaE174d0O/p84enGuXaZkfFo8qV8rLvafU9qf6g8XMvXowNM38qC8bkPVLD0BD1lOjHXPtIs3AfCnDeFieX89TDVk18HyHanspqzMQRzDTzAsrhyzbkOVRK80hxzeBjQOeOtM2BwDTMt+MszfWK2zDUxsHtET2QJvqODQQfFnNzHdN0wTCbD4MGPZHUzHTc/nX5fw2T2/PKMTNL2u6lCvl9T/rVzj4vu9k7X9ge6BUyEO62Jd1wur/C4S4j3y2CFhdAAAAAElFTkSuQmCC" }, { - "path": "", "name": "iron_layer_1.png", + "path": "", "folder": "", "namespace": "", "id": "1", "group": "", + "scope": 0, "width": 64, "height": 32, "uv_width": 64, @@ -1522,9 +2075,12 @@ "use_as_default": false, "layers_enabled": false, "sync_to_project": "", + "file_format": "png", "render_mode": "default", "render_sides": "auto", + "wrap_mode": "limited", "pbr_channel": "color", + "fps": 7, "frame_time": 1, "frame_order_type": "loop", "frame_order": "", @@ -1536,12 +2092,13 @@ "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAAAXNSR0IArs4c6QAAA6VJREFUaEPlmb9qMkEUxVcIKCikUBCSTot0yROYwkqf2FQK8Qm0U0g6hYAWAYUEhP34DZzlOqzORqNu/KZJZufuOPfMvef+2UIUGK+vr/F6vXZS5XI5kdazbrdbCO2R5/Xg4QGg1Wo5Hebzufu7Wq3c34+Pj+j5+Tm4x1UAMBgMomq1muhSKpX+DwB6vV78+PgYLRaLaLlcJgAAxufn5/VbgA/A/f19AsL7+3t09RwAAI1GI/r6+nIWIAAqlUr09vZ2/RYACdbrdXfrgIDvozxjPB5fvwUAAMruCoV/3gV2KYjCNu7L8XcBIdm0dRsG7b78f2kAC4rzxHjFd5k7LM8hO51ONJ1OnQtowAff398OpNvbW+caGrjI3d1dNBwO3SObRxBNJJuHPKKQFuYIcbVazfm4MkCAgAxns1miuG7bD5P2fQACAO2lUAqZ5gYAbksHu7m5cUpbU1a2F8dxTELUbrdd9gd4unW5wGazcY8AQZkjAE0mk62EUOu5cAGr8L4D9ft9p7AASEtxBYrlBAFsM0ksLA9h9OR5vIopQLAhFOVzQYLnKlSwDGsVlzZ96X1yCzgXwIf+ThCA0WgUiyDx4aenp+A7hx4my3vKW8Rbx1pSUJnJZBKrDsgLAIRVIsxvkGgQgNlsFitBAohLW4DyFsIqIfvYhkwQAJsqQ2LH/mAWM98nY3MP5E7uAqED76olfKCs7/qJFvN98n79oOw0bZ+f1hpBC8gCAD5JrUBqy2g2m1v+qZ6C1tPkSZVtmKT+eHl5cc+sz2t/v9aAE7SH5LOU60cDYGsJWzzpQBxYxRQAcEOqHZBn6MDiGoopiib2AAAAtXPS7YeHh0RhijGG5JkTubJwxNEAYNr+AXTDHAplpBgtNFWPOrAFSNamqIMCAMZtMwSwPy8Wi6728NcBJMQRvwKAOkbWBbgxO9RF5llIXq03WQygqTiz/r+PA7J+tzgaAFxAxY5ujLI5bUghK28B8d85R7ns+gE/YVXdhiUsNU1lgpqnWYD6Cpi5b7LI26wziwmHSDq0vtURUoUGaSnTsiSVxrLyab9DxHvq/KiT5JMUHSWGtRjJnuvDiwMAn9SNyCSZ68B23b9BIWzjLyxta3/drJot8l1ZkUj0Eh9enAvAorSoLEsrjIiFdSPMJb/LR7WnQJB17GLktGTqXL2CxAL0oYPbIe4SukRamKhdxyKY70s0fjtlDfnyoevOAtJa2jbsiCTTQtGla4NDFdd7/wAIfE5OhlGtmAAAAABJRU5ErkJggg==" }, { - "path": "", "name": "iron_layer_2.png", + "path": "", "folder": "", "namespace": "", "id": "2", "group": "", + "scope": 0, "width": 64, "height": 32, "uv_width": 64, @@ -1550,9 +2107,12 @@ "use_as_default": false, "layers_enabled": false, "sync_to_project": "", + "file_format": "png", "render_mode": "default", "render_sides": "auto", + "wrap_mode": "limited", "pbr_channel": "color", + "fps": 7, "frame_time": 1, "frame_order_type": "loop", "frame_order": "", @@ -1564,12 +2124,13 @@ "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAAAXNSR0IArs4c6QAAAZZJREFUaEPtVruqhDAQjZ1gYSlY+gH+gfZ+sb2fYWEpCDaCgt1eTrhHhlldLsgVNkkajZldmJPzmMh4viLP+zcBgMAAzxEIEvCcAMEEgwSCBDxHIEjAcwKEFAgSCBJQCHRd98KnbdtMkiSmrmunWfLWHACoqsr0fW+GYTBN0/gFQNu2r6IobPNYXgIgVeE8ANQ8dY8ntC994OrMBYZEAACGl+e5GcfRNp+mqQVA75dlsd9xjjMnAIDm0QgAYINZltnmpmmyaQBPwKIvYL/vu63/9pSwDOCNoyGy4YoBEhAA5AQAvHHcMCVA+pPycRxbRnCPpxMMkBJg07xlSkD6g/QAFwalQwK6eeqdjAADyBBpmt8ek28eoCMPzWqT1CnxKSZ1pHLE5v/yXMYuz55ImSMGz7L/L42hhqMzPQJ7mui6rvadqSLrySjW6988YbK353w5OgNE3F5Zlmae5wMEMogyg+lKOV3VP2GytwE4G6TYIG8eJsrU0JKSfqLrAdh/e8xtAJgiB89/hyrdsDzX72cAoeaJlPkBm2JOMHlI974AAAAASUVORK5CYII=" }, { - "path": "", "name": "transparent.png", + "path": "", "folder": "", "namespace": "", "id": "3", "group": "", + "scope": 0, "width": 16, "height": 16, "uv_width": 16, @@ -1578,9 +2139,12 @@ "use_as_default": false, "layers_enabled": false, "sync_to_project": "", + "file_format": "png", "render_mode": "default", "render_sides": "auto", + "wrap_mode": "limited", "pbr_channel": "color", + "fps": 7, "frame_time": 1, "frame_order_type": "loop", "frame_order": "", @@ -1653,6 +2217,7 @@ "selected": false, "saved": true, "path": "", + "scope": 0, "anim_time_update": "", "blend_weight": "", "start_delay": "", @@ -1667,6 +2232,8 @@ "5e08acae-d6ca-0dfd-9360-8cdb13c7a824": { "name": "armor_stand_root", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "position", @@ -1689,13 +2256,15 @@ "6c53311f-ffc8-e567-ff1b-65840698e9ba": { "name": "body", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { "x": "0", - "y": "1 - math.sin(q.life_time * v.walk_speed + 90) * 12.25\n", + "y": "-1 + math.sin(q.life_time * v.walk_speed + 90) * 12.25\n", "z": "0" } ], @@ -1727,13 +2296,15 @@ "808e3c26-7285-af3f-a079-d8b899176dd3": { "name": "head", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { "x": "0", - "y": "1 + math.sin(q.life_time * v.walk_speed + 90) * 12.25", + "y": "-1 - math.sin(q.life_time * v.walk_speed + 90) * 12.25", "z": "0" } ], @@ -1749,12 +2320,14 @@ "b5b52d2c-097c-08df-6457-372fbae12445": { "name": "left_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "math.sin(q.life_time * v.walk_speed) * 8", + "x": "-math.sin(q.life_time * v.walk_speed) * 8", "y": "0", "z": "22.5" } @@ -1770,7 +2343,7 @@ "channel": "position", "data_points": [ { - "x": "2", + "x": "-2", "y": "0", "z": "-math.sin(q.life_time * v.walk_speed) * 2" } @@ -1787,13 +2360,15 @@ "215d1b02-0e64-a794-1b88-a9c5a6d7541c": { "name": "right_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "math.sin(q.life_time * v.walk_speed) * 22.5", - "y": "math.sin(q.life_time * v.walk_speed) * 12.25", + "x": "-math.sin(q.life_time * v.walk_speed) * 22.5", + "y": "-math.sin(q.life_time * v.walk_speed) * 12.25", "z": "math.cos(q.life_time * v.walk_speed * 2) * 6 + 6" } ], @@ -1809,12 +2384,14 @@ "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69": { "name": "left_leg", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-math.sin(q.life_time * v.walk_speed) * 22.5", + "x": "math.sin(q.life_time * v.walk_speed) * 22.5", "y": "0", "z": "0" } @@ -1847,12 +2424,14 @@ "60d50d30-a018-429d-ba78-c5fb5804dd8a": { "name": "right_leg", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "math.sin(q.life_time * v.walk_speed) * 22.5", + "x": "-math.sin(q.life_time * v.walk_speed) * 22.5", "y": "0", "z": "0" } @@ -1885,6 +2464,8 @@ "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0": { "name": "body_waist_pivot", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", @@ -1903,6 +2484,66 @@ "easingArgs": [] } ] + }, + "98795982-9c43-6e3e-eed9-2c776a957938": { + "name": "root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "102db36a-eeda-0e6f-d5cc-c186ecda8165": { + "name": "baseplate_root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c": { + "name": "baseplate_pivot_a", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "98a28100-07e8-849a-38b7-f56abc2c2e56": { + "name": "waist_pivot", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "7de415a2-9fdd-e4b2-3455-c3bed72eb896": { + "name": "left_hand", + "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false + }, + "7747736f-85e2-338f-207e-53f8d3d2fa39": { + "name": "right_hand", + "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false + }, + "c2e217f1-b50a-5c9a-b342-71a35e984046": { + "name": "message", + "type": "animated_java:text_display", + "rotation_global": false, + "quaternion_interpolation": false + }, + "3ffeee76-901e-f8a2-c29a-82f90e16fd1e": { + "name": "camera", + "type": "camera", + "rotation_global": false, + "quaternion_interpolation": false + }, + "bc141119-7f51-9690-7e21-e119b34fb3a2": { + "name": "diamond", + "type": "animated_java:vanilla_item_display", + "rotation_global": false, + "quaternion_interpolation": false + }, + "789cb8f5-f460-97a7-bda7-6a45419fb71c": { + "name": "stone", + "type": "animated_java:vanilla_block_display", + "rotation_global": false, + "quaternion_interpolation": false } } }, @@ -1916,6 +2557,7 @@ "selected": false, "saved": true, "path": "", + "scope": 0, "anim_time_update": "", "blend_weight": "", "start_delay": "", @@ -1925,13 +2567,15 @@ "b5b52d2c-097c-08df-6457-372fbae12445": { "name": "left_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-90\n+ math.sin(q.life_time * 360) * 30", - "y": "-22.5\n+ math.cos(q.life_time * 360) * 30", + "x": "90\n- math.sin(q.life_time * 360) * 30", + "y": "22.5\n- math.cos(q.life_time * 360) * 30", "z": "0" } ], @@ -1947,13 +2591,15 @@ "215d1b02-0e64-a794-1b88-a9c5a6d7541c": { "name": "right_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-90\n+ math.sin(q.life_time * 360) * 30", - "y": "22.5\n- math.cos(q.life_time * 360) * 30", + "x": "90\n- math.sin(q.life_time * 360) * 30", + "y": "-22.5\n+ math.cos(q.life_time * 360) * 30", "z": "0" } ], @@ -1969,6 +2615,8 @@ "7de415a2-9fdd-e4b2-3455-c3bed72eb896": { "name": "left_hand", "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "function", @@ -1995,6 +2643,8 @@ "7747736f-85e2-338f-207e-53f8d3d2fa39": { "name": "right_hand", "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "function", @@ -2021,12 +2671,14 @@ "3b35d1a9-befe-066e-60df-e1f3a5ec5a78": { "name": "pig", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "position", "data_points": [ { - "x": "16 - math.cos(q.life_time * 180) * 16", + "x": "-16 + math.cos(q.life_time * 180) * 16", "y": "16 + math.sin(q.life_time * 360) * 8", "z": "-32" } @@ -2079,6 +2731,90 @@ "easingArgs": [] } ] + }, + "98795982-9c43-6e3e-eed9-2c776a957938": { + "name": "root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "102db36a-eeda-0e6f-d5cc-c186ecda8165": { + "name": "baseplate_root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c": { + "name": "baseplate_pivot_a", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "5e08acae-d6ca-0dfd-9360-8cdb13c7a824": { + "name": "armor_stand_root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "98a28100-07e8-849a-38b7-f56abc2c2e56": { + "name": "waist_pivot", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0": { + "name": "body_waist_pivot", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "6c53311f-ffc8-e567-ff1b-65840698e9ba": { + "name": "body", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "808e3c26-7285-af3f-a079-d8b899176dd3": { + "name": "head", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69": { + "name": "left_leg", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "60d50d30-a018-429d-ba78-c5fb5804dd8a": { + "name": "right_leg", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "c2e217f1-b50a-5c9a-b342-71a35e984046": { + "name": "message", + "type": "animated_java:text_display", + "rotation_global": false, + "quaternion_interpolation": false + }, + "3ffeee76-901e-f8a2-c29a-82f90e16fd1e": { + "name": "camera", + "type": "camera", + "rotation_global": false, + "quaternion_interpolation": false + }, + "bc141119-7f51-9690-7e21-e119b34fb3a2": { + "name": "diamond", + "type": "animated_java:vanilla_item_display", + "rotation_global": false, + "quaternion_interpolation": false + }, + "789cb8f5-f460-97a7-bda7-6a45419fb71c": { + "name": "stone", + "type": "animated_java:vanilla_block_display", + "rotation_global": false, + "quaternion_interpolation": false } } }, @@ -2092,6 +2828,7 @@ "selected": false, "saved": true, "path": "", + "scope": 0, "anim_time_update": "", "blend_weight": "", "start_delay": "", @@ -2099,14 +2836,16 @@ "excluded_nodes": [], "animators": { "bc141119-7f51-9690-7e21-e119b34fb3a2": { - "name": "item_display", + "name": "diamond", "type": "animated_java:vanilla_item_display", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "position", "data_points": [ { - "x": "math.sin(q.life_time * 360 * 8) * 32", + "x": "-math.sin(q.life_time * 360 * 8) * 32", "y": "0", "z": "math.cos(q.life_time * 360 * 8) * 32" } @@ -2121,15 +2860,17 @@ ] }, "c2e217f1-b50a-5c9a-b342-71a35e984046": { - "name": "text_display", + "name": "message", "type": "animated_java:text_display", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "math.sin(q.life_time * 360) * 2", - "y": "math.cos(q.life_time * 360) * 2", + "x": "-math.sin(q.life_time * 360) * 2", + "y": "-math.cos(q.life_time * 360) * 2", "z": "0" } ], @@ -2178,6 +2919,8 @@ "808e3c26-7285-af3f-a079-d8b899176dd3": { "name": "head", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "position", @@ -2296,6 +3039,96 @@ "easingArgs": [1] } ] + }, + "98795982-9c43-6e3e-eed9-2c776a957938": { + "name": "root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "102db36a-eeda-0e6f-d5cc-c186ecda8165": { + "name": "baseplate_root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c": { + "name": "baseplate_pivot_a", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "5e08acae-d6ca-0dfd-9360-8cdb13c7a824": { + "name": "armor_stand_root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "98a28100-07e8-849a-38b7-f56abc2c2e56": { + "name": "waist_pivot", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0": { + "name": "body_waist_pivot", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "6c53311f-ffc8-e567-ff1b-65840698e9ba": { + "name": "body", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "b5b52d2c-097c-08df-6457-372fbae12445": { + "name": "left_arm", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "215d1b02-0e64-a794-1b88-a9c5a6d7541c": { + "name": "right_arm", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69": { + "name": "left_leg", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "60d50d30-a018-429d-ba78-c5fb5804dd8a": { + "name": "right_leg", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "7de415a2-9fdd-e4b2-3455-c3bed72eb896": { + "name": "left_hand", + "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false + }, + "7747736f-85e2-338f-207e-53f8d3d2fa39": { + "name": "right_hand", + "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false + }, + "3ffeee76-901e-f8a2-c29a-82f90e16fd1e": { + "name": "camera", + "type": "camera", + "rotation_global": false, + "quaternion_interpolation": false + }, + "789cb8f5-f460-97a7-bda7-6a45419fb71c": { + "name": "stone", + "type": "animated_java:vanilla_block_display", + "rotation_global": false, + "quaternion_interpolation": false } } }, @@ -2304,11 +3137,12 @@ "name": "camera_test", "loop": "loop", "override": false, - "length": 120, + "length": 20, "snapping": 20, - "selected": true, + "selected": false, "saved": true, "path": "", + "scope": 0, "anim_time_update": "", "blend_weight": "", "start_delay": "", @@ -2318,6 +3152,8 @@ "808e3c26-7285-af3f-a079-d8b899176dd3": { "name": "head", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", @@ -2340,17 +3176,124 @@ "data_points": [ { "x": "0", - "y": "360", + "y": "-360", "z": "0" } ], "uuid": "414a86e8-4127-88a3-551c-ec015f01ba8a", - "time": 120, + "time": 20, "color": -1, "interpolation": "linear", - "easing": "linear" + "easing": "linear", + "easingArgs": [] } ] + }, + "98795982-9c43-6e3e-eed9-2c776a957938": { + "name": "root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "102db36a-eeda-0e6f-d5cc-c186ecda8165": { + "name": "baseplate_root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c": { + "name": "baseplate_pivot_a", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "5e08acae-d6ca-0dfd-9360-8cdb13c7a824": { + "name": "armor_stand_root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "98a28100-07e8-849a-38b7-f56abc2c2e56": { + "name": "waist_pivot", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0": { + "name": "body_waist_pivot", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "6c53311f-ffc8-e567-ff1b-65840698e9ba": { + "name": "body", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "b5b52d2c-097c-08df-6457-372fbae12445": { + "name": "left_arm", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "215d1b02-0e64-a794-1b88-a9c5a6d7541c": { + "name": "right_arm", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69": { + "name": "left_leg", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "60d50d30-a018-429d-ba78-c5fb5804dd8a": { + "name": "right_leg", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "7de415a2-9fdd-e4b2-3455-c3bed72eb896": { + "name": "left_hand", + "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false + }, + "7747736f-85e2-338f-207e-53f8d3d2fa39": { + "name": "right_hand", + "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false + }, + "c2e217f1-b50a-5c9a-b342-71a35e984046": { + "name": "message", + "type": "animated_java:text_display", + "rotation_global": false, + "quaternion_interpolation": false + }, + "3ffeee76-901e-f8a2-c29a-82f90e16fd1e": { + "name": "camera", + "type": "camera", + "rotation_global": false, + "quaternion_interpolation": false + }, + "bc141119-7f51-9690-7e21-e119b34fb3a2": { + "name": "diamond", + "type": "animated_java:vanilla_item_display", + "rotation_global": false, + "quaternion_interpolation": false + }, + "789cb8f5-f460-97a7-bda7-6a45419fb71c": { + "name": "stone", + "type": "animated_java:vanilla_block_display", + "rotation_global": false, + "quaternion_interpolation": false + }, + "effects": { + "name": "Effects", + "type": "effect" } } } diff --git a/test-packs/1.20.4/blueprints/armor_stand_minimal_1.20.4.ajblueprint b/test-packs/1.20.4/blueprints/armor_stand_minimal_1.20.4.ajblueprint index 33aa6a15..63375370 100644 --- a/test-packs/1.20.4/blueprints/armor_stand_minimal_1.20.4.ajblueprint +++ b/test-packs/1.20.4/blueprints/armor_stand_minimal_1.20.4.ajblueprint @@ -1,9 +1,9 @@ { "meta": { "format": "animated-java:format/blueprint", - "format_version": "1.8.1", + "format_version": "1.10.0-beta.1", "uuid": "173aa82f-fb4f-c354-ad34-a34d7fbce647", - "save_location": "D:\\github-repos\\animated-java\\old-animated-java\\test-packs\\1.20.4\\blueprints\\armor_stand_minimal_1.20.4.ajblueprint", + "save_location": "/var/mnt/ssd2/repos/animated-java/animated-java/test-packs/1.20.4/blueprints/armor_stand_minimal_1.20.4.ajblueprint", "last_used_export_namespace": "armor_stand_minimal" }, "resolution": { @@ -24,10 +24,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-6, 0, -6], "to": [6, 1, 6], @@ -37,27 +40,27 @@ "faces": { "north": { "uv": [12, 44, 24, 45], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [0, 44, 12, 45], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [36, 44, 48, 45], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [24, 44, 36, 45], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [12, 32, 24, 44], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [24, 32, 36, 44], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -66,10 +69,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-4, 12, -1], "to": [4, 14, 1], @@ -79,27 +85,27 @@ "faces": { "north": { "uv": [2, 50, 10, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [0, 50, 2, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [12, 50, 20, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [10, 50, 12, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [2, 50, 10, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [10, 48, 18, 50], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -108,10 +114,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [1, 1, -1], "to": [3, 12, 1], @@ -121,27 +130,27 @@ "faces": { "north": { "uv": [10, 2, 12, 13], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [12, 2, 14, 13], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [14, 2, 16, 13], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [8, 2, 10, 13], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [10, 0, 12, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [12, 0, 14, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -150,10 +159,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-3, 1, -1], "to": [-1, 12, 1], @@ -163,27 +175,27 @@ "faces": { "north": { "uv": [44, 18, 42, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [46, 18, 44, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [48, 18, 46, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [42, 18, 40, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [42, 16, 44, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [44, 16, 46, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -192,10 +204,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-6, 21, -1.5], "to": [6, 24, 1.5], @@ -205,27 +220,27 @@ "faces": { "north": { "uv": [3, 29, 15, 32], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [0, 29, 3, 32], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [18, 29, 30, 32], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [15, 29, 18, 32], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [3, 26, 15, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [15, 26, 27, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -234,10 +249,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [1, 14, -1], "to": [3, 21, 1], @@ -247,27 +265,27 @@ "faces": { "north": { "uv": [18, 2, 20, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [16, 2, 18, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [22, 2, 24, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [20, 2, 22, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [18, 0, 20, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [20, 0, 22, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -276,10 +294,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-3, 14, -1], "to": [-1, 21, 1], @@ -289,27 +310,27 @@ "faces": { "north": { "uv": [50, 18, 52, 25], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [48, 18, 50, 25], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [54, 18, 56, 25], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [52, 18, 54, 25], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [50, 16, 52, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [52, 16, 54, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -318,10 +339,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-7, 12, -1], "to": [-5, 24, 1], @@ -331,27 +355,27 @@ "faces": { "north": { "uv": [36, 18, 34, 30], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [34, 18, 32, 30], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [40, 18, 38, 30], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [38, 18, 36, 30], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [34, 18, 36, 16], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [36, 16, 38, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -360,10 +384,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [5, 12, -1], "to": [7, 24, 1], @@ -373,27 +400,27 @@ "faces": { "north": { "uv": [26, 2, 28, 14], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [24, 2, 26, 14], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [30, 2, 32, 14], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [28, 2, 30, 14], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [26, 0, 28, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [30, 0, 28, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -402,10 +429,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-1, 23, -1], "to": [1, 30, 1], @@ -415,37 +445,47 @@ "faces": { "north": { "uv": [2, 2, 4, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [0, 2, 2, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [6, 2, 8, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [4, 2, 6, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [2, 0, 4, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [4, 0, 6, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", "uuid": "a23d9259-0d9a-4e16-1b42-47e5bedba00f" } ], - "outliner": [ + "groups": [ { "name": "root", + "uuid": "98795982-9c43-6e3e-eed9-2c776a957938", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, "origin": [0, 0, 0], + "rotation": [0, 0, 0], "color": 0, "onSummonFunction": "", "configs": { @@ -464,386 +504,630 @@ }, "variants": {} }, - "uuid": "98795982-9c43-6e3e-eed9-2c776a957938", + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "baseplate_root", + "uuid": "102db36a-eeda-0e6f-d5cc-c186ecda8165", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 0, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glow_color": "#ffffff", + "glowing": false, + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": {} + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "baseplate_pivot_a", + "uuid": "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 1, 6], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glow_color": "#ffffff", + "glowing": false, + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": {} + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "armor_stand_root", + "uuid": "5e08acae-d6ca-0dfd-9360-8cdb13c7a824", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 1, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": {} + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "waist_pivot", + "uuid": "98a28100-07e8-849a-38b7-f56abc2c2e56", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 12, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "5417306e-2c69-3f36-1e3c-edd904034a36": {} + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "body_waist_pivot", + "uuid": "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 12, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "5417306e-2c69-3f36-1e3c-edd904034a36": {} + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "body", + "uuid": "6c53311f-ffc8-e567-ff1b-65840698e9ba", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 24, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "5417306e-2c69-3f36-1e3c-edd904034a36": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": false, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#00ff06", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "head", + "uuid": "808e3c26-7285-af3f-a079-d8b899176dd3", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 23, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#c400ff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "left_arm", + "uuid": "b5b52d2c-097c-08df-6457-372fbae12445", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [-6, 23, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#00ff9f", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "right_arm", + "uuid": "215d1b02-0e64-a794-1b88-a9c5a6d7541c", "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [6, 23, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#ff0000", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } + }, + "children": [], + "reset": false, + "shade": true, "mirror_uv": false, + "visibility": true, + "autouv": 0, "isOpen": true, + "primary_selected": false + }, + { + "name": "left_leg", + "uuid": "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69", + "export": true, "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [2, 12, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glow_color": "#ffffff", + "glowing": false, + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#ffee00", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, "visibility": true, "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "right_leg", + "uuid": "60d50d30-a018-429d-ba78-c5fb5804dd8a", + "export": true, + "locked": false, + "scope": 0, "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [-2, 12, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glow_color": "#ffffff", + "glowing": false, + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#6e00ff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + } + ], + "outliner": [ + { + "uuid": "98795982-9c43-6e3e-eed9-2c776a957938", + "isOpen": true, "children": [ { - "name": "baseplate_root", - "origin": [0, 0, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glow_color": "#ffffff", - "glowing": false, - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": {} - }, "uuid": "102db36a-eeda-0e6f-d5cc-c186ecda8165", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ { - "name": "baseplate_pivot_a", - "origin": [0, 1, 6], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glow_color": "#ffffff", - "glowing": false, - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": {} - }, "uuid": "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["46624743-e0ef-5e97-e6d8-ba5dc100baf4"] } ] }, { - "name": "armor_stand_root", - "origin": [0, 1, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": {} - }, "uuid": "5e08acae-d6ca-0dfd-9360-8cdb13c7a824", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ { - "name": "waist_pivot", - "origin": [0, 12, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "5417306e-2c69-3f36-1e3c-edd904034a36": {} - } - }, "uuid": "98a28100-07e8-849a-38b7-f56abc2c2e56", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ { - "name": "body_waist_pivot", - "origin": [0, 12, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "5417306e-2c69-3f36-1e3c-edd904034a36": {} - } - }, "uuid": "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ { - "name": "body", - "origin": [0, 24, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "5417306e-2c69-3f36-1e3c-edd904034a36": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": false, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#00ff06", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "6c53311f-ffc8-e567-ff1b-65840698e9ba", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ "55829f3d-26dc-8f49-39b8-5ba2c0159a24", "9d16df18-0574-58bb-e0f9-f799946257c9", "f26e6144-8dab-547a-16e8-adaa6fa2c45d", "9b73ebc3-aca6-b85c-d022-b0a811ab38f8", { - "name": "head", - "origin": [0, 23, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#c400ff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "808e3c26-7285-af3f-a079-d8b899176dd3", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["a23d9259-0d9a-4e16-1b42-47e5bedba00f"] }, { - "name": "left_arm", - "origin": [-6, 23, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#00ff9f", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "b5b52d2c-097c-08df-6457-372fbae12445", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["c219cb9b-53a7-6a5b-7b47-dce0a1e6ec14"] }, { - "name": "right_arm", - "origin": [6, 23, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#ff0000", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "215d1b02-0e64-a794-1b88-a9c5a6d7541c", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["13293700-7f42-2279-6a1f-4e0a6a4d89b3"] } ] @@ -851,97 +1135,13 @@ ] }, { - "name": "left_leg", - "origin": [2, 12, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glow_color": "#ffffff", - "glowing": false, - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#ffee00", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["d29efa52-def5-a311-7438-1fc73aac804c"] }, { - "name": "right_leg", - "origin": [-2, 12, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glow_color": "#ffffff", - "glowing": false, - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#6e00ff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "60d50d30-a018-429d-ba78-c5fb5804dd8a", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["60766231-bd45-cb3f-0a4f-c6c066e86f54"] } ] @@ -953,12 +1153,13 @@ ], "textures": [ { - "path": "", "name": "wood.png", + "path": "", "folder": "", "namespace": "", "id": "0", "group": "", + "scope": 0, "width": 64, "height": 64, "uv_width": 64, @@ -967,9 +1168,12 @@ "use_as_default": false, "layers_enabled": false, "sync_to_project": "", + "file_format": "png", "render_mode": "default", "render_sides": "auto", + "wrap_mode": "limited", "pbr_channel": "color", + "fps": 7, "frame_time": 1, "frame_order_type": "loop", "frame_order": "", @@ -981,12 +1185,13 @@ "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAB6xJREFUeF7tW01oXUUUnmebkjZNCU1bjSnVtAUNVks0VK1gEbLowmK6EIOKP3VRKBYNBldqiLoMRIkUurAq+PPEhUpduAiIgkVLMDy1qGCtDY3RmsRH07SxSb3yzfW7OW9y75u5uS/v3WBnc+fnzN8353wzc+a9jPovHHtzv4foRH5S59z79LsZluH7xev7vJOjf6otDesVvo8/dzR2+a8jf6nLV83qNu5+4khBfdlXOePBIGwAPPPInd59u5rVx5//oPA1J2Ar/+SVB72pv/9Rx0+cDq1fzknLvjKfvvaoXnmEizMXVH5qOiivq6nW8dGRMbWybrVCemXVqqAc8kivWrlMawVWVgYz78LFy7oPBPTTULdW7X7yrYpqQubDvvs9OWkMjhNHHBPkRE2AKEtQWI76aPNi/nwAHNuSAEF+b+cHlQXgUNc9WgN+n7ig/piYCsZ39doadc3audWW5ShDgPwdrU06Tu3gClNzNl+/qUBjuPrMNLmk3KaQAbmhU6inHnR+Yp4qF1Prd44e18UEBaCZYMpyxKXM4Y++r6wGgAMwaa4izQH2ieCi1uAAgkgNqF9TW3QxATj6rbgGgANo57Rbqq20fc4GhCjVmiBJcpTAsR55gV8tkz+vDvR+VlkN2N++TZtAlM0zP0qt2+66SZuPZHe59JJQpf1Dw1KhATbSgYkUU2vJASTNKEJFPoIk24pzgAsAlAk7J9i2MZIs2uC5ABpD3qj0idBqf7Zzgg2AN17e40lCJd8QVFt92wIlLbcCYDsn2EiMJ82wQxQGX/FdICmCtvoAkJwAQpX2j7qp5wDbBJd6udUElvoEbeMvAACEZatQrDyJPbv4G4r5E2z1o8adGgCS+hNs9VMLAA9a9CuYAx0/Nxn4IMLuJdua/duoGVzvGvo2iANKqQKcIujc1dEht0mMwXS+yIuaeYagLOot9K5RUgB4vo/j6eFlTJ425eXsq8FTuijqur17V3PB2snbrMtdI/AHlEIL6AGKAwDPCZhF2F1ib9ttwbFZXrp43cZdRF7Y0E6cu0bFt0GYQDGfIsDktVwuNflA+iEXctfQALyw73avafMG3T5tmLZ36pezOl+WI02S4aAgBxl8XzzytTOw0gSiSK7YdRv9J7lrZDh5NMKV4GTYOG9uYRNn5wBsISDw7BHlU8z97BO09FfI6zZMBGGhdw3nlSrVLmG2Ix0y5AE5wYf27NDXaC4QF0HvGPkJ7VVKcteY97rDAbr4+Sm7fFmV+unMb+qGjdeq2cszCmkE5lFu52OH5wFODuDETOcLzgEIdLmZ/sskp0+0WzAgvA5hArRvqjcngM6ZJx2hXI0oecgClCgAipGc9CFKM6H/0nYdt2nuPABYQa4eV1Wustmwi8aEeX9wECtGcjgHyHcIkw8SAyDfBdasrtYqjEC7m52dUcuX+yoNDVi/2nd3r6mt1pqCcpkmGUGO9WRd5EEjCEaYU1ZywGL7CwreBjEwTur4tydVy82bCs7hQ98NB3mQPTc5HUzSrLvjli0aGEwYoKDuzltv1IABvEr7AqnBGXkF5lEWhVA9PntRWOZJWZTHret6V7DZcNLy2Ntgd3e3NzU1pWpq/PdBxBEaGxvVyMiIjqOsrq5O5fP5QMZVvqenJ/aYkoAQu7Ouri6vtbVVVVf7T+dmGB8fD8AZHR3VoMSR7+zsjD2msgPQ3NysVqxYofu9dOmSjldV+USJAHCmp6fV4OCgTseR7+3tTTcAMIGWlhY9QQaYAQGRqzE2NqbNII586jWgr6/Pa2ryvTCTk/4pDaG2dv5r8NDQkOaCOPKp5wBowNatWwtUfmZmJkgjTtMYHh7W8TjyqQdAkiA1wFx9mgc5gCToIr8kOACkxiBXX5Ig4jABkqCrfOo1ABywbt06yXWRcZAgQhz51JMgdwGoM1Sf+z53Am6H2AqpAdgFXOVTrwHkAKwsCU/uArB/5udyOa0B4ABX+SXBAfIojG0OAfs9j8XFjsI2+bJrQDab1e+BcjWlUfOkZ+73UP36+nqt2uYpUNaXZwWZjzoSSPaPfJiPuWMgzbHIXae9vT3RyTFRZScmTLnQFQBSvkCLPrxAA+ibk45PxuntoUfWHFWcp7BFn1HMDq4AwD9K0Bk68OUJhV9/Isg4ff02ubT4+lwVIXCKUt2PffOjdl4iMB5mFlFySR8qXAdeKrkru0AYkngwNf88EefFt1SrU452QjWAvIABwObD/iVWjsGVo49QAOTvezEIl5+alGOwi9FHKADyXyTsdKmRmytYoQBIDuDD5P+KA1zRK5Ncol+v2sZIDWAnSMsOF5JWqr7bb2O8J6Pj5pejcinHeOq71cjbPbpW48NzcabxRTnKGJdlZh7bQr40AQyaE174d0O/p84enGuXaZkfFo8qV8rLvafU9qf6g8XMvXowNM38qC8bkPVLD0BD1lOjHXPtIs3AfCnDeFieX89TDVk18HyHanspqzMQRzDTzAsrhyzbkOVRK80hxzeBjQOeOtM2BwDTMt+MszfWK2zDUxsHtET2QJvqODQQfFnNzHdN0wTCbD4MGPZHUzHTc/nX5fw2T2/PKMTNL2u6lCvl9T/rVzj4vu9k7X9ge6BUyEO62Jd1wur/C4S4j3y2CFhdAAAAAElFTkSuQmCC" }, { - "path": "", "name": "transparent.png", + "path": "", "folder": "", "namespace": "", "id": "1", "group": "", + "scope": 0, "width": 16, "height": 16, "uv_width": 16, @@ -995,9 +1200,12 @@ "use_as_default": false, "layers_enabled": false, "sync_to_project": "", + "file_format": "png", "render_mode": "default", "render_sides": "auto", + "wrap_mode": "limited", "pbr_channel": "color", + "fps": 7, "frame_time": 1, "frame_order_type": "loop", "frame_order": "", @@ -1031,6 +1239,7 @@ "selected": true, "saved": true, "path": "", + "scope": 0, "anim_time_update": "", "blend_weight": "", "start_delay": "", @@ -1045,6 +1254,8 @@ "5e08acae-d6ca-0dfd-9360-8cdb13c7a824": { "name": "armor_stand_root", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "position", @@ -1067,13 +1278,15 @@ "6c53311f-ffc8-e567-ff1b-65840698e9ba": { "name": "body", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { "x": "0", - "y": "1 - math.sin(q.life_time * v.walk_speed + 90) * 12.25\n", + "y": "-1 + math.sin(q.life_time * v.walk_speed + 90) * 12.25\n", "z": "0" } ], @@ -1105,13 +1318,15 @@ "808e3c26-7285-af3f-a079-d8b899176dd3": { "name": "head", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { "x": "0", - "y": "1 + math.sin(q.life_time * v.walk_speed + 90) * 12.25", + "y": "-1 - math.sin(q.life_time * v.walk_speed + 90) * 12.25", "z": "0" } ], @@ -1127,12 +1342,14 @@ "b5b52d2c-097c-08df-6457-372fbae12445": { "name": "left_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "math.sin(q.life_time * v.walk_speed) * 8", + "x": "-math.sin(q.life_time * v.walk_speed) * 8", "y": "0", "z": "22.5" } @@ -1148,7 +1365,7 @@ "channel": "position", "data_points": [ { - "x": "2", + "x": "-2", "y": "0", "z": "-math.sin(q.life_time * v.walk_speed) * 2" } @@ -1165,13 +1382,15 @@ "215d1b02-0e64-a794-1b88-a9c5a6d7541c": { "name": "right_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "math.sin(q.life_time * v.walk_speed) * 22.5", - "y": "math.sin(q.life_time * v.walk_speed) * 12.25", + "x": "-math.sin(q.life_time * v.walk_speed) * 22.5", + "y": "-math.sin(q.life_time * v.walk_speed) * 12.25", "z": "math.cos(q.life_time * v.walk_speed * 2) * 6 + 6" } ], @@ -1187,12 +1406,14 @@ "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69": { "name": "left_leg", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-math.sin(q.life_time * v.walk_speed) * 22.5", + "x": "math.sin(q.life_time * v.walk_speed) * 22.5", "y": "0", "z": "0" } @@ -1225,12 +1446,14 @@ "60d50d30-a018-429d-ba78-c5fb5804dd8a": { "name": "right_leg", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "math.sin(q.life_time * v.walk_speed) * 22.5", + "x": "-math.sin(q.life_time * v.walk_speed) * 22.5", "y": "0", "z": "0" } @@ -1263,6 +1486,8 @@ "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0": { "name": "body_waist_pivot", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", @@ -1281,6 +1506,30 @@ "easingArgs": [] } ] + }, + "98795982-9c43-6e3e-eed9-2c776a957938": { + "name": "root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "102db36a-eeda-0e6f-d5cc-c186ecda8165": { + "name": "baseplate_root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c": { + "name": "baseplate_pivot_a", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "98a28100-07e8-849a-38b7-f56abc2c2e56": { + "name": "waist_pivot", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false } } } diff --git a/test-packs/1.20.4/datapacks/test-framework/src/test.mcb b/test-packs/1.20.4/datapacks/test-framework/src/test.mcb index 18a11393..e738ea44 100644 --- a/test-packs/1.20.4/datapacks/test-framework/src/test.mcb +++ b/test-packs/1.20.4/datapacks/test-framework/src/test.mcb @@ -2,12 +2,81 @@ function on_load minecraft:load { tellraw @a {"text":"Test Framework loaded!", "color":"green"} } -clock 1s 1t { - execute store result score #count aj.i if entity @e[type=item_display,tag=aj.global.root] - title @a actionbar [{"text":"Rig Count: "}, {"score":{"name":"#count","objective":"aj.i"}}] -} +# clock 1s 1t { +# execute store result score #count aj.i if entity @e[type=item_display,tag=aj.global.root] +# title @a actionbar [{"text":"Rig Count: "}, {"score":{"name":"#count","objective":"aj.i"}}] +# } dir armor_stand { + function test { + scoreboard players set #failed_tests aj.i 0 + execute as @e[tag=aj.armor_stand.root] run { + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_locator {name:'left_hand',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"as_locator test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/at_locator {name:'left_hand',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"at_locator test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_at_locator {name:'left_hand',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"as_at_locator test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_all_locators {command:'scoreboard players add #test aj.i 1'} + execute unless score #test aj.i matches 2 run { + tellraw @a {"text":"as_all_locators test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/at_all_locators {command:'scoreboard players add #test aj.i 1'} + execute unless score #test aj.i matches 2 run { + tellraw @a {"text":"at_all_locators test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_at_all_locators {command:'scoreboard players add #test aj.i 1'} + execute unless score #test aj.i matches 2 run { + tellraw @a {"text":"as_at_all_locators test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_camera {name:'camera',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"as_camera test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_node {name:'head',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"as_node test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + } + + execute if score #failed_tests aj.i matches 0 run { + tellraw @a {"text":"All tests passed!","color":"green"} + } + + execute if score #failed_tests aj.i matches 1.. run { + tellraw @a [{"score":{"name":"#failed_tests","objective":"aj.i"}}, {"text":" tests failed!","color":"red"}] + } + } + function summon { #ARGS: {args:{...}} function animated_java:global/remove/everything @@ -40,3 +109,14 @@ dir armor_stand { } } } + +clock debug 1t { + title @a actionbar [ \ + "p:", {"score":{"name":"#aj.data_manager.preps_this_tick","objective":"aj.i"}}, \ + " r:", {"score":{"name":"#aj.data_manager.reads_this_tick","objective":"aj.i"}}, \ + " w:", {"score":{"name":"#aj.data_manager.writes_this_tick","objective":"aj.i"}} \ + ] + scoreboard players set #aj.data_manager.preps_this_tick aj.i 0 + scoreboard players set #aj.data_manager.reads_this_tick aj.i 0 + scoreboard players set #aj.data_manager.writes_this_tick aj.i 0 +} \ No newline at end of file diff --git a/test-packs/1.20.5/blueprints/armor_stand_1.20.5.ajblueprint b/test-packs/1.20.5/blueprints/armor_stand_1.20.5.ajblueprint index 216dfef2..ff5018a3 100644 --- a/test-packs/1.20.5/blueprints/armor_stand_1.20.5.ajblueprint +++ b/test-packs/1.20.5/blueprints/armor_stand_1.20.5.ajblueprint @@ -1,9 +1,9 @@ { "meta": { "format": "animated-java:format/blueprint", - "format_version": "1.8.0-beta.2", + "format_version": "1.10.0-beta.1", "uuid": "167b27cd-b559-3f13-a97c-0841fe21f1d1", - "save_location": "D:\\github-repos\\animated-java\\old-animated-java\\test-packs\\1.20.5\\blueprints\\armor_stand_1.20.5.ajblueprint", + "save_location": "/var/mnt/ssd2/repos/animated-java/animated-java/test-packs/1.20.5/blueprints/armor_stand_1.20.5.ajblueprint", "last_used_export_namespace": "armor_stand" }, "resolution": { @@ -25,10 +25,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-6, 0, -6], "to": [6, 1, 6], @@ -38,27 +41,27 @@ "faces": { "north": { "uv": [12, 44, 24, 45], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [0, 44, 12, 45], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [36, 44, 48, 45], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [24, 44, 36, 45], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [12, 32, 24, 44], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [24, 32, 36, 44], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -67,10 +70,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-4, 12, -1], "to": [4, 14, 1], @@ -80,27 +86,27 @@ "faces": { "north": { "uv": [2, 50, 10, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [0, 50, 2, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [12, 50, 20, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [10, 50, 12, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [2, 50, 10, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [10, 48, 18, 50], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -109,10 +115,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [1, 1, -1], "to": [3, 12, 1], @@ -122,27 +131,27 @@ "faces": { "north": { "uv": [10, 2, 12, 13], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [12, 2, 14, 13], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [14, 2, 16, 13], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [8, 2, 10, 13], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [10, 0, 12, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [12, 0, 14, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -151,10 +160,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-3, 1, -1], "to": [-1, 12, 1], @@ -164,27 +176,27 @@ "faces": { "north": { "uv": [44, 18, 42, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [46, 18, 44, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [48, 18, 46, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [42, 18, 40, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [42, 16, 44, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [44, 16, 46, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -193,10 +205,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-6, 21, -1.5], "to": [6, 24, 1.5], @@ -206,27 +221,27 @@ "faces": { "north": { "uv": [3, 29, 15, 32], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [0, 29, 3, 32], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [18, 29, 30, 32], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [15, 29, 18, 32], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [3, 26, 15, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [15, 26, 27, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -235,10 +250,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [1, 14, -1], "to": [3, 21, 1], @@ -248,27 +266,27 @@ "faces": { "north": { "uv": [18, 2, 20, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [16, 2, 18, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [22, 2, 24, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [20, 2, 22, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [18, 0, 20, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [20, 0, 22, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -277,10 +295,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-3, 14, -1], "to": [-1, 21, 1], @@ -290,27 +311,27 @@ "faces": { "north": { "uv": [50, 18, 52, 25], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [48, 18, 50, 25], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [54, 18, 56, 25], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [52, 18, 54, 25], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [50, 16, 52, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [52, 16, 54, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -319,10 +340,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-7, 12, -1], "to": [-5, 24, 1], @@ -332,27 +356,27 @@ "faces": { "north": { "uv": [36, 18, 34, 30], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [34, 18, 32, 30], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [40, 18, 38, 30], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [38, 18, 36, 30], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [34, 18, 36, 16], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [36, 16, 38, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -361,10 +385,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [5, 12, -1], "to": [7, 24, 1], @@ -374,27 +401,27 @@ "faces": { "north": { "uv": [26, 2, 28, 14], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [24, 2, 26, 14], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [30, 2, 32, 14], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [28, 2, 30, 14], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [26, 0, 28, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [30, 0, 28, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -403,10 +430,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-1, 23, -1], "to": [1, 30, 1], @@ -416,27 +446,27 @@ "faces": { "north": { "uv": [2, 2, 4, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [0, 2, 2, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [6, 2, 8, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [4, 2, 6, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [2, 0, 4, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [4, 0, 6, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -445,10 +475,13 @@ { "name": "helmet", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-5, 22, -5], "to": [5, 32, 5], @@ -458,27 +491,27 @@ "faces": { "north": { "uv": [8, 16, 16, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [0, 16, 8, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [24, 16, 32, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [16, 16, 24, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [8, 0, 16, 16], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [16, 0, 24, 16], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -487,10 +520,13 @@ { "name": "chestplate", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 15, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-5, 11.25, -3], "to": [5, 23.75, 3], @@ -500,27 +536,27 @@ "faces": { "north": { "uv": [20, 40, 28, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [16, 40, 20, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [32, 40, 40, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [28, 40, 32, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [20, 32, 28, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [28, 32, 36, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -529,10 +565,13 @@ { "name": "left_chestplate", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-9, 19.25, -3], "to": [-3, 25, 3], @@ -542,27 +581,27 @@ "faces": { "north": { "uv": [48, 40, 44, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [44, 40, 40, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [56, 40, 52, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [52, 40, 48, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [44, 39.75, 48, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [52, 32, 48, 39.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -571,10 +610,13 @@ { "name": "left_chestplate", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [3, 19.25, -3], "to": [9, 25, 3], @@ -584,27 +626,27 @@ "faces": { "north": { "uv": [44, 40, 48, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [48, 40, 52, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [52, 40, 56, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [40, 40, 44, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [48, 39.75, 44, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [48, 32, 52, 39.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -613,10 +655,13 @@ { "name": "pants", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-4.5, 11.5, -2.5], "to": [4.5, 17, 2.5], @@ -626,27 +671,27 @@ "faces": { "north": { "uv": [20, 54, 28, 64], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "east": { "uv": [16, 54, 20, 64], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "south": { "uv": [32, 54, 40, 64], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "west": { "uv": [28, 54, 32, 64], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "up": { "uv": [20, 48, 28, 54], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "down": { "uv": [28, 48, 36, 54], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" } }, "type": "cube", @@ -655,10 +700,13 @@ { "name": "right_pants", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-0.5, 2.75, -2.375], "to": [4.25, 12, 2.375], @@ -668,27 +716,27 @@ "faces": { "north": { "uv": [4, 40, 8, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "east": { "uv": [0, 40, 4, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "south": { "uv": [12, 40, 16, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "west": { "uv": [8, 40, 12, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "up": { "uv": [4, 32, 8, 40], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "down": { "uv": [8, 32, 12, 40], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" } }, "type": "cube", @@ -697,10 +745,13 @@ { "name": "left_pants", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-4.25, 2.75, -2.375], "to": [0.5, 12, 2.375], @@ -710,27 +761,27 @@ "faces": { "north": { "uv": [8, 40, 4, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "east": { "uv": [12, 40, 8, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "south": { "uv": [16, 40, 12, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "west": { "uv": [4, 40, 0, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "up": { "uv": [8, 32, 4, 40], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "down": { "uv": [12, 32, 8, 40], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" } }, "type": "cube", @@ -739,10 +790,13 @@ { "name": "right_shoe", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-1, -1, -3], "to": [4.75, 6, 3], @@ -752,27 +806,27 @@ "faces": { "north": { "uv": [4, 52, 8, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [0, 52, 4, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [12, 52, 16, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [8, 52, 12, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [4, 32, 8, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [8, 32, 12, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -781,10 +835,13 @@ { "name": "left_shoe", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-4.75, -1, -3], "to": [1, 6, 3], @@ -794,27 +851,27 @@ "faces": { "north": { "uv": [8, 52, 4, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [12, 52, 8, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [16, 52, 12, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [4, 52, 0, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [8, 32, 4, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [12, 32, 8, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -827,6 +884,7 @@ "ignore_inherited_scale": false, "visibility": true, "locked": false, + "scope": 0, "config": { "use_entity": true, "entity_type": "minecraft:item_display", @@ -845,6 +903,7 @@ "ignore_inherited_scale": false, "visibility": true, "locked": false, + "scope": 0, "config": { "use_entity": true, "entity_type": "minecraft:item_display", @@ -857,11 +916,10 @@ "type": "locator" }, { - "uuid": "c2e217f1-b50a-5c9a-b342-71a35e984046", - "type": "animated_java:text_display", "name": "text_display", "position": [0, 38, 0], "rotation": [0, 0, 0], + "pivotOffset": [0, 0, 0], "scale": [1, 1, 1], "visibility": true, "locked": false, @@ -875,96 +933,663 @@ "onSummonFunction": "", "configs": { "default": { - "on_apply_function": "", + "on_apply_function": "", + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": false, + "glow_color": "#6f114b", + "invisible": false, + "shadow_radius": 0, + "shadow_strength": 1 + }, + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "on_apply_function": "", + "billboard": "vertical", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#6f114b", + "invisible": false, + "shadow_radius": 0, + "shadow_strength": 1 + } + } + }, + "scope": 0, + "uuid": "c2e217f1-b50a-5c9a-b342-71a35e984046", + "type": "animated_java:text_display" + }, + { + "name": "camera", + "position": [0, 27, 0], + "rotation": [0, 0, 0], + "fov": 70, + "aspect_ratio": [16, 9], + "linked_preview": "", + "camera_linked": false, + "visibility": true, + "export": true, + "locked": false, + "scope": 0, + "type": "camera", + "uuid": "3ffeee76-901e-f8a2-c29a-82f90e16fd1e" + }, + { + "name": "item_display", + "position": [6, 12, -4], + "rotation": [-90, 0, 0], + "pivotOffset": [0, 0, 0], + "scale": [0.5, 0.5, 0.5], + "visibility": true, + "locked": false, + "export": true, + "item": "minecraft:diamond", + "itemDisplay": "none", + "onSummonFunction": "", + "configs": { + "default": { + "on_apply_function": "", + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": false, + "glow_color": "#ffffff", + "invisible": false, + "shadow_radius": 0, + "shadow_strength": 1 + }, + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "on_apply_function": "", + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": true, + "glowing": true, + "override_glow_color": true, + "glow_color": "#99ff00", + "invisible": false, + "shadow_radius": 0, + "shadow_strength": 1 + } + } + }, + "scope": 0, + "uuid": "bc141119-7f51-9690-7e21-e119b34fb3a2", + "type": "animated_java:vanilla_item_display" + } + ], + "groups": [ + { + "name": "root", + "uuid": "98795982-9c43-6e3e-eed9-2c776a957938", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 0, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glow_color": "#ffffff", + "glowing": false, + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": {} + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "baseplate_root", + "uuid": "102db36a-eeda-0e6f-d5cc-c186ecda8165", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 0, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glow_color": "#ffffff", + "glowing": false, + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": {} + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "baseplate_pivot_a", + "uuid": "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 1, 6], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glow_color": "#ffffff", + "glowing": false, + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": {} + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "armor_stand_root", + "uuid": "5e08acae-d6ca-0dfd-9360-8cdb13c7a824", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 1, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": {} + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "waist_pivot", + "uuid": "98a28100-07e8-849a-38b7-f56abc2c2e56", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 12, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "5417306e-2c69-3f36-1e3c-edd904034a36": {} + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "body_waist_pivot", + "uuid": "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 12, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "5417306e-2c69-3f36-1e3c-edd904034a36": {} + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "body", + "uuid": "6c53311f-ffc8-e567-ff1b-65840698e9ba", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 24, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "5417306e-2c69-3f36-1e3c-edd904034a36": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": false, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#00ff06", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "head", + "uuid": "808e3c26-7285-af3f-a079-d8b899176dd3", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 23, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#c400ff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "left_arm", + "uuid": "b5b52d2c-097c-08df-6457-372fbae12445", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [-6, 23, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#00ff9f", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "right_arm", + "uuid": "215d1b02-0e64-a794-1b88-a9c5a6d7541c", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [6, 23, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { "billboard": "fixed", "override_brightness": false, "brightness_override": 0, "enchanted": false, "glowing": false, - "override_glow_color": false, - "glow_color": "#6f114b", + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, "invisible": false, + "nbt": "{}", "shadow_radius": 0, - "shadow_strength": 1 + "shadow_strength": 1, + "use_nbt": false }, "variants": { "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "on_apply_function": "", - "billboard": "vertical", + "billboard": "fixed", "override_brightness": false, "brightness_override": 0, "enchanted": false, "glowing": true, "override_glow_color": true, - "glow_color": "#6f114b", + "glow_color": "#ff0000", + "inherit_settings": true, "invisible": false, + "nbt": "{}", "shadow_radius": 0, - "shadow_strength": 1 + "shadow_strength": 1, + "use_nbt": false } } - } - }, - { - "name": "camera", - "position": [0, 27, 0], - "rotation": [0, 0, 0], - "fov": 70, - "aspect_ratio": [16, 9], - "linked_preview": "", - "camera_linked": false, + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, "visibility": true, - "type": "camera", - "uuid": "3ffeee76-901e-f8a2-c29a-82f90e16fd1e" + "autouv": 0, + "isOpen": true, + "primary_selected": false }, { - "uuid": "bc141119-7f51-9690-7e21-e119b34fb3a2", - "type": "animated_java:vanilla_item_display", - "name": "item_display", - "position": [6, 12, -4], - "rotation": [-90, 0, 0], - "scale": [0.5, 0.5, 0.5], - "visibility": true, - "locked": false, + "name": "left_leg", + "uuid": "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69", "export": true, - "item": "minecraft:diamond", - "itemDisplay": "none", + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [2, 12, 0], + "rotation": [0, 0, 0], + "color": 0, "onSummonFunction": "", "configs": { "default": { - "on_apply_function": "", "billboard": "fixed", - "override_brightness": false, "brightness_override": 0, "enchanted": false, - "glowing": false, - "override_glow_color": false, "glow_color": "#ffffff", + "glowing": false, + "inherit_settings": true, "invisible": false, + "nbt": "{}", "shadow_radius": 0, - "shadow_strength": 1 + "shadow_strength": 1, + "use_nbt": false }, "variants": { "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "on_apply_function": "", "billboard": "fixed", "override_brightness": false, "brightness_override": 0, - "enchanted": true, + "enchanted": false, "glowing": true, "override_glow_color": true, - "glow_color": "#99ff00", + "glow_color": "#ffee00", + "inherit_settings": true, "invisible": false, + "nbt": "{}", "shadow_radius": 0, - "shadow_strength": 1 + "shadow_strength": 1, + "use_nbt": false } } - } - } - ], - "outliner": [ + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, { - "name": "root", - "origin": [0, 0, 0], + "name": "right_leg", + "uuid": "60d50d30-a018-429d-ba78-c5fb5804dd8a", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [-2, 12, 0], + "rotation": [0, 0, 0], "color": 0, "onSummonFunction": "", "configs": { @@ -981,238 +1606,65 @@ "shadow_strength": 1, "use_nbt": false }, - "variants": {} + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#6e00ff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } }, - "uuid": "98795982-9c43-6e3e-eed9-2c776a957938", - "export": true, + "children": [], + "reset": false, + "shade": true, "mirror_uv": false, - "isOpen": true, - "locked": false, "visibility": true, "autouv": 0, - "selected": false, + "isOpen": true, + "primary_selected": false + } + ], + "outliner": [ + { + "uuid": "98795982-9c43-6e3e-eed9-2c776a957938", + "isOpen": true, "children": [ { - "name": "baseplate_root", - "origin": [0, 0, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glow_color": "#ffffff", - "glowing": false, - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": {} - }, "uuid": "102db36a-eeda-0e6f-d5cc-c186ecda8165", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ { - "name": "baseplate_pivot_a", - "origin": [0, 1, 6], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glow_color": "#ffffff", - "glowing": false, - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": {} - }, "uuid": "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["46624743-e0ef-5e97-e6d8-ba5dc100baf4"] } ] }, { - "name": "armor_stand_root", - "origin": [0, 1, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": {} - }, "uuid": "5e08acae-d6ca-0dfd-9360-8cdb13c7a824", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ { - "name": "waist_pivot", - "origin": [0, 12, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "5417306e-2c69-3f36-1e3c-edd904034a36": {} - } - }, "uuid": "98a28100-07e8-849a-38b7-f56abc2c2e56", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ { - "name": "body_waist_pivot", - "origin": [0, 12, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "5417306e-2c69-3f36-1e3c-edd904034a36": {} - } - }, "uuid": "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ { - "name": "body", - "origin": [0, 24, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "5417306e-2c69-3f36-1e3c-edd904034a36": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": false, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#00ff06", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "6c53311f-ffc8-e567-ff1b-65840698e9ba", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ "55829f3d-26dc-8f49-39b8-5ba2c0159a24", "9d16df18-0574-58bb-e0f9-f799946257c9", @@ -1221,150 +1673,18 @@ "6dd668dd-27bd-631d-5e44-a94f7a35ddbb", "d5e974ae-a732-db7a-59a1-c16ff717e426", { - "name": "head", - "origin": [0, 23, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#c400ff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "808e3c26-7285-af3f-a079-d8b899176dd3", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["a23d9259-0d9a-4e16-1b42-47e5bedba00f", "a302b268-1699-4013-011f-211bd85806d4", "3ffeee76-901e-f8a2-c29a-82f90e16fd1e"] }, { - "name": "left_arm", - "origin": [-6, 23, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#00ff9f", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "b5b52d2c-097c-08df-6457-372fbae12445", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["c219cb9b-53a7-6a5b-7b47-dce0a1e6ec14", "967c77d0-2607-0ecb-8093-416d237cdb85", "7de415a2-9fdd-e4b2-3455-c3bed72eb896"] }, { - "name": "right_arm", - "origin": [6, 23, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#ff0000", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "215d1b02-0e64-a794-1b88-a9c5a6d7541c", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ "13293700-7f42-2279-6a1f-4e0a6a4d89b3", "98475898-cfc8-f67b-3145-abaf659deb3e", @@ -1377,97 +1697,13 @@ ] }, { - "name": "left_leg", - "origin": [2, 12, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glow_color": "#ffffff", - "glowing": false, - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#ffee00", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["d29efa52-def5-a311-7438-1fc73aac804c", "71bfec99-5014-21d3-739b-6512074212db", "41413d23-edf5-3fdc-2ddb-5fd45ea99a89"] }, { - "name": "right_leg", - "origin": [-2, 12, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glow_color": "#ffffff", - "glowing": false, - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#6e00ff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "60d50d30-a018-429d-ba78-c5fb5804dd8a", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["60766231-bd45-cb3f-0a4f-c6c066e86f54", "4dd0c5f1-828f-d559-6496-16e2fbe6276d", "11976d8b-3994-df35-0fb9-b92ac5012141"] } ] @@ -1480,12 +1716,13 @@ ], "textures": [ { - "path": "", "name": "wood.png", + "path": "", "folder": "", "namespace": "", "id": "0", "group": "", + "scope": 0, "width": 64, "height": 64, "uv_width": 64, @@ -1494,9 +1731,12 @@ "use_as_default": false, "layers_enabled": false, "sync_to_project": "", + "file_format": "png", "render_mode": "default", "render_sides": "auto", + "wrap_mode": "limited", "pbr_channel": "color", + "fps": 7, "frame_time": 1, "frame_order_type": "loop", "frame_order": "", @@ -1508,12 +1748,13 @@ "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAB6xJREFUeF7tW01oXUUUnmebkjZNCU1bjSnVtAUNVks0VK1gEbLowmK6EIOKP3VRKBYNBldqiLoMRIkUurAq+PPEhUpduAiIgkVLMDy1qGCtDY3RmsRH07SxSb3yzfW7OW9y75u5uS/v3WBnc+fnzN8353wzc+a9jPovHHtzv4foRH5S59z79LsZluH7xev7vJOjf6otDesVvo8/dzR2+a8jf6nLV83qNu5+4khBfdlXOePBIGwAPPPInd59u5rVx5//oPA1J2Ar/+SVB72pv/9Rx0+cDq1fzknLvjKfvvaoXnmEizMXVH5qOiivq6nW8dGRMbWybrVCemXVqqAc8kivWrlMawVWVgYz78LFy7oPBPTTULdW7X7yrYpqQubDvvs9OWkMjhNHHBPkRE2AKEtQWI76aPNi/nwAHNuSAEF+b+cHlQXgUNc9WgN+n7ig/piYCsZ39doadc3audWW5ShDgPwdrU06Tu3gClNzNl+/qUBjuPrMNLmk3KaQAbmhU6inHnR+Yp4qF1Prd44e18UEBaCZYMpyxKXM4Y++r6wGgAMwaa4izQH2ieCi1uAAgkgNqF9TW3QxATj6rbgGgANo57Rbqq20fc4GhCjVmiBJcpTAsR55gV8tkz+vDvR+VlkN2N++TZtAlM0zP0qt2+66SZuPZHe59JJQpf1Dw1KhATbSgYkUU2vJASTNKEJFPoIk24pzgAsAlAk7J9i2MZIs2uC5ABpD3qj0idBqf7Zzgg2AN17e40lCJd8QVFt92wIlLbcCYDsn2EiMJ82wQxQGX/FdICmCtvoAkJwAQpX2j7qp5wDbBJd6udUElvoEbeMvAACEZatQrDyJPbv4G4r5E2z1o8adGgCS+hNs9VMLAA9a9CuYAx0/Nxn4IMLuJdua/duoGVzvGvo2iANKqQKcIujc1dEht0mMwXS+yIuaeYagLOot9K5RUgB4vo/j6eFlTJ425eXsq8FTuijqur17V3PB2snbrMtdI/AHlEIL6AGKAwDPCZhF2F1ib9ttwbFZXrp43cZdRF7Y0E6cu0bFt0GYQDGfIsDktVwuNflA+iEXctfQALyw73avafMG3T5tmLZ36pezOl+WI02S4aAgBxl8XzzytTOw0gSiSK7YdRv9J7lrZDh5NMKV4GTYOG9uYRNn5wBsISDw7BHlU8z97BO09FfI6zZMBGGhdw3nlSrVLmG2Ix0y5AE5wYf27NDXaC4QF0HvGPkJ7VVKcteY97rDAbr4+Sm7fFmV+unMb+qGjdeq2cszCmkE5lFu52OH5wFODuDETOcLzgEIdLmZ/sskp0+0WzAgvA5hArRvqjcngM6ZJx2hXI0oecgClCgAipGc9CFKM6H/0nYdt2nuPABYQa4eV1Wustmwi8aEeX9wECtGcjgHyHcIkw8SAyDfBdasrtYqjEC7m52dUcuX+yoNDVi/2nd3r6mt1pqCcpkmGUGO9WRd5EEjCEaYU1ZywGL7CwreBjEwTur4tydVy82bCs7hQ98NB3mQPTc5HUzSrLvjli0aGEwYoKDuzltv1IABvEr7AqnBGXkF5lEWhVA9PntRWOZJWZTHret6V7DZcNLy2Ntgd3e3NzU1pWpq/PdBxBEaGxvVyMiIjqOsrq5O5fP5QMZVvqenJ/aYkoAQu7Ouri6vtbVVVVf7T+dmGB8fD8AZHR3VoMSR7+zsjD2msgPQ3NysVqxYofu9dOmSjldV+USJAHCmp6fV4OCgTseR7+3tTTcAMIGWlhY9QQaYAQGRqzE2NqbNII586jWgr6/Pa2ryvTCTk/4pDaG2dv5r8NDQkOaCOPKp5wBowNatWwtUfmZmJkgjTtMYHh7W8TjyqQdAkiA1wFx9mgc5gCToIr8kOACkxiBXX5Ig4jABkqCrfOo1ABywbt06yXWRcZAgQhz51JMgdwGoM1Sf+z53Am6H2AqpAdgFXOVTrwHkAKwsCU/uArB/5udyOa0B4ABX+SXBAfIojG0OAfs9j8XFjsI2+bJrQDab1e+BcjWlUfOkZ+73UP36+nqt2uYpUNaXZwWZjzoSSPaPfJiPuWMgzbHIXae9vT3RyTFRZScmTLnQFQBSvkCLPrxAA+ibk45PxuntoUfWHFWcp7BFn1HMDq4AwD9K0Bk68OUJhV9/Isg4ff02ubT4+lwVIXCKUt2PffOjdl4iMB5mFlFySR8qXAdeKrkru0AYkngwNf88EefFt1SrU452QjWAvIABwObD/iVWjsGVo49QAOTvezEIl5+alGOwi9FHKADyXyTsdKmRmytYoQBIDuDD5P+KA1zRK5Ncol+v2sZIDWAnSMsOF5JWqr7bb2O8J6Pj5pejcinHeOq71cjbPbpW48NzcabxRTnKGJdlZh7bQr40AQyaE174d0O/p84enGuXaZkfFo8qV8rLvafU9qf6g8XMvXowNM38qC8bkPVLD0BD1lOjHXPtIs3AfCnDeFieX89TDVk18HyHanspqzMQRzDTzAsrhyzbkOVRK80hxzeBjQOeOtM2BwDTMt+MszfWK2zDUxsHtET2QJvqODQQfFnNzHdN0wTCbD4MGPZHUzHTc/nX5fw2T2/PKMTNL2u6lCvl9T/rVzj4vu9k7X9ge6BUyEO62Jd1wur/C4S4j3y2CFhdAAAAAElFTkSuQmCC" }, { - "path": "", "name": "iron_layer_1.png", + "path": "", "folder": "", "namespace": "", "id": "1", "group": "", + "scope": 0, "width": 64, "height": 32, "uv_width": 64, @@ -1522,9 +1763,12 @@ "use_as_default": false, "layers_enabled": false, "sync_to_project": "", + "file_format": "png", "render_mode": "default", "render_sides": "auto", + "wrap_mode": "limited", "pbr_channel": "color", + "fps": 7, "frame_time": 1, "frame_order_type": "loop", "frame_order": "", @@ -1536,12 +1780,13 @@ "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAAAXNSR0IArs4c6QAAA6VJREFUaEPlmb9qMkEUxVcIKCikUBCSTot0yROYwkqf2FQK8Qm0U0g6hYAWAYUEhP34DZzlOqzORqNu/KZJZufuOPfMvef+2UIUGK+vr/F6vXZS5XI5kdazbrdbCO2R5/Xg4QGg1Wo5Hebzufu7Wq3c34+Pj+j5+Tm4x1UAMBgMomq1muhSKpX+DwB6vV78+PgYLRaLaLlcJgAAxufn5/VbgA/A/f19AsL7+3t09RwAAI1GI/r6+nIWIAAqlUr09vZ2/RYACdbrdXfrgIDvozxjPB5fvwUAAMruCoV/3gV2KYjCNu7L8XcBIdm0dRsG7b78f2kAC4rzxHjFd5k7LM8hO51ONJ1OnQtowAff398OpNvbW+caGrjI3d1dNBwO3SObRxBNJJuHPKKQFuYIcbVazfm4MkCAgAxns1miuG7bD5P2fQACAO2lUAqZ5gYAbksHu7m5cUpbU1a2F8dxTELUbrdd9gd4unW5wGazcY8AQZkjAE0mk62EUOu5cAGr8L4D9ft9p7AASEtxBYrlBAFsM0ksLA9h9OR5vIopQLAhFOVzQYLnKlSwDGsVlzZ96X1yCzgXwIf+ThCA0WgUiyDx4aenp+A7hx4my3vKW8Rbx1pSUJnJZBKrDsgLAIRVIsxvkGgQgNlsFitBAohLW4DyFsIqIfvYhkwQAJsqQ2LH/mAWM98nY3MP5E7uAqED76olfKCs7/qJFvN98n79oOw0bZ+f1hpBC8gCAD5JrUBqy2g2m1v+qZ6C1tPkSZVtmKT+eHl5cc+sz2t/v9aAE7SH5LOU60cDYGsJWzzpQBxYxRQAcEOqHZBn6MDiGoopiib2AAAAtXPS7YeHh0RhijGG5JkTubJwxNEAYNr+AXTDHAplpBgtNFWPOrAFSNamqIMCAMZtMwSwPy8Wi6728NcBJMQRvwKAOkbWBbgxO9RF5llIXq03WQygqTiz/r+PA7J+tzgaAFxAxY5ujLI5bUghK28B8d85R7ns+gE/YVXdhiUsNU1lgpqnWYD6Cpi5b7LI26wziwmHSDq0vtURUoUGaSnTsiSVxrLyab9DxHvq/KiT5JMUHSWGtRjJnuvDiwMAn9SNyCSZ68B23b9BIWzjLyxta3/drJot8l1ZkUj0Eh9enAvAorSoLEsrjIiFdSPMJb/LR7WnQJB17GLktGTqXL2CxAL0oYPbIe4SukRamKhdxyKY70s0fjtlDfnyoevOAtJa2jbsiCTTQtGla4NDFdd7/wAIfE5OhlGtmAAAAABJRU5ErkJggg==" }, { - "path": "", "name": "iron_layer_2.png", + "path": "", "folder": "", "namespace": "", "id": "2", "group": "", + "scope": 0, "width": 64, "height": 32, "uv_width": 64, @@ -1550,9 +1795,12 @@ "use_as_default": false, "layers_enabled": false, "sync_to_project": "", + "file_format": "png", "render_mode": "default", "render_sides": "auto", + "wrap_mode": "limited", "pbr_channel": "color", + "fps": 7, "frame_time": 1, "frame_order_type": "loop", "frame_order": "", @@ -1564,12 +1812,13 @@ "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAAAXNSR0IArs4c6QAAAZZJREFUaEPtVruqhDAQjZ1gYSlY+gH+gfZ+sb2fYWEpCDaCgt1eTrhHhlldLsgVNkkajZldmJPzmMh4viLP+zcBgMAAzxEIEvCcAMEEgwSCBDxHIEjAcwKEFAgSCBJQCHRd98KnbdtMkiSmrmunWfLWHACoqsr0fW+GYTBN0/gFQNu2r6IobPNYXgIgVeE8ANQ8dY8ntC994OrMBYZEAACGl+e5GcfRNp+mqQVA75dlsd9xjjMnAIDm0QgAYINZltnmpmmyaQBPwKIvYL/vu63/9pSwDOCNoyGy4YoBEhAA5AQAvHHcMCVA+pPycRxbRnCPpxMMkBJg07xlSkD6g/QAFwalQwK6eeqdjAADyBBpmt8ek28eoCMPzWqT1CnxKSZ1pHLE5v/yXMYuz55ImSMGz7L/L42hhqMzPQJ7mui6rvadqSLrySjW6988YbK353w5OgNE3F5Zlmae5wMEMogyg+lKOV3VP2GytwE4G6TYIG8eJsrU0JKSfqLrAdh/e8xtAJgiB89/hyrdsDzX72cAoeaJlPkBm2JOMHlI974AAAAASUVORK5CYII=" }, { - "path": "", "name": "transparent.png", + "path": "", "folder": "", "namespace": "", "id": "3", "group": "", + "scope": 0, "width": 16, "height": 16, "uv_width": 16, @@ -1578,9 +1827,12 @@ "use_as_default": false, "layers_enabled": false, "sync_to_project": "", + "file_format": "png", "render_mode": "default", "render_sides": "auto", + "wrap_mode": "limited", "pbr_channel": "color", + "fps": 7, "frame_time": 1, "frame_order_type": "loop", "frame_order": "", @@ -1653,6 +1905,7 @@ "selected": false, "saved": true, "path": "", + "scope": 0, "anim_time_update": "", "blend_weight": "", "start_delay": "", @@ -1667,6 +1920,8 @@ "5e08acae-d6ca-0dfd-9360-8cdb13c7a824": { "name": "armor_stand_root", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "position", @@ -1689,13 +1944,15 @@ "6c53311f-ffc8-e567-ff1b-65840698e9ba": { "name": "body", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { "x": "0", - "y": "1 - math.sin(q.life_time * v.walk_speed + 90) * 12.25\n", + "y": "-1 + math.sin(q.life_time * v.walk_speed + 90) * 12.25\n", "z": "0" } ], @@ -1727,13 +1984,15 @@ "808e3c26-7285-af3f-a079-d8b899176dd3": { "name": "head", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { "x": "0", - "y": "1 + math.sin(q.life_time * v.walk_speed + 90) * 12.25", + "y": "-1 - math.sin(q.life_time * v.walk_speed + 90) * 12.25", "z": "0" } ], @@ -1749,12 +2008,14 @@ "b5b52d2c-097c-08df-6457-372fbae12445": { "name": "left_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "math.sin(q.life_time * v.walk_speed) * 8", + "x": "-math.sin(q.life_time * v.walk_speed) * 8", "y": "0", "z": "22.5" } @@ -1770,7 +2031,7 @@ "channel": "position", "data_points": [ { - "x": "2", + "x": "-2", "y": "0", "z": "-math.sin(q.life_time * v.walk_speed) * 2" } @@ -1787,13 +2048,15 @@ "215d1b02-0e64-a794-1b88-a9c5a6d7541c": { "name": "right_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "math.sin(q.life_time * v.walk_speed) * 22.5", - "y": "math.sin(q.life_time * v.walk_speed) * 12.25", + "x": "-math.sin(q.life_time * v.walk_speed) * 22.5", + "y": "-math.sin(q.life_time * v.walk_speed) * 12.25", "z": "math.cos(q.life_time * v.walk_speed * 2) * 6 + 6" } ], @@ -1809,12 +2072,14 @@ "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69": { "name": "left_leg", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-math.sin(q.life_time * v.walk_speed) * 22.5", + "x": "math.sin(q.life_time * v.walk_speed) * 22.5", "y": "0", "z": "0" } @@ -1847,12 +2112,14 @@ "60d50d30-a018-429d-ba78-c5fb5804dd8a": { "name": "right_leg", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "math.sin(q.life_time * v.walk_speed) * 22.5", + "x": "-math.sin(q.life_time * v.walk_speed) * 22.5", "y": "0", "z": "0" } @@ -1885,6 +2152,8 @@ "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0": { "name": "body_waist_pivot", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", @@ -1903,6 +2172,60 @@ "easingArgs": [] } ] + }, + "98795982-9c43-6e3e-eed9-2c776a957938": { + "name": "root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "102db36a-eeda-0e6f-d5cc-c186ecda8165": { + "name": "baseplate_root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c": { + "name": "baseplate_pivot_a", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "98a28100-07e8-849a-38b7-f56abc2c2e56": { + "name": "waist_pivot", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "7de415a2-9fdd-e4b2-3455-c3bed72eb896": { + "name": "left_hand", + "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false + }, + "7747736f-85e2-338f-207e-53f8d3d2fa39": { + "name": "right_hand", + "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false + }, + "c2e217f1-b50a-5c9a-b342-71a35e984046": { + "name": "text_display", + "type": "animated_java:text_display", + "rotation_global": false, + "quaternion_interpolation": false + }, + "3ffeee76-901e-f8a2-c29a-82f90e16fd1e": { + "name": "camera", + "type": "camera", + "rotation_global": false, + "quaternion_interpolation": false + }, + "bc141119-7f51-9690-7e21-e119b34fb3a2": { + "name": "item_display", + "type": "animated_java:vanilla_item_display", + "rotation_global": false, + "quaternion_interpolation": false } } }, @@ -1916,6 +2239,7 @@ "selected": false, "saved": true, "path": "", + "scope": 0, "anim_time_update": "", "blend_weight": "", "start_delay": "", @@ -1925,13 +2249,15 @@ "b5b52d2c-097c-08df-6457-372fbae12445": { "name": "left_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-90\n+ math.sin(q.life_time * 360) * 30", - "y": "-22.5\n+ math.cos(q.life_time * 360) * 30", + "x": "90\n- math.sin(q.life_time * 360) * 30", + "y": "22.5\n- math.cos(q.life_time * 360) * 30", "z": "0" } ], @@ -1947,13 +2273,15 @@ "215d1b02-0e64-a794-1b88-a9c5a6d7541c": { "name": "right_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-90\n+ math.sin(q.life_time * 360) * 30", - "y": "22.5\n- math.cos(q.life_time * 360) * 30", + "x": "90\n- math.sin(q.life_time * 360) * 30", + "y": "-22.5\n+ math.cos(q.life_time * 360) * 30", "z": "0" } ], @@ -1969,6 +2297,8 @@ "7de415a2-9fdd-e4b2-3455-c3bed72eb896": { "name": "left_hand", "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "function", @@ -1995,6 +2325,8 @@ "7747736f-85e2-338f-207e-53f8d3d2fa39": { "name": "right_hand", "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "function", @@ -2021,12 +2353,14 @@ "3b35d1a9-befe-066e-60df-e1f3a5ec5a78": { "name": "pig", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "position", "data_points": [ { - "x": "16 - math.cos(q.life_time * 180) * 16", + "x": "-16 + math.cos(q.life_time * 180) * 16", "y": "16 + math.sin(q.life_time * 360) * 8", "z": "-32" } @@ -2079,6 +2413,84 @@ "easingArgs": [] } ] + }, + "98795982-9c43-6e3e-eed9-2c776a957938": { + "name": "root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "102db36a-eeda-0e6f-d5cc-c186ecda8165": { + "name": "baseplate_root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c": { + "name": "baseplate_pivot_a", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "5e08acae-d6ca-0dfd-9360-8cdb13c7a824": { + "name": "armor_stand_root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "98a28100-07e8-849a-38b7-f56abc2c2e56": { + "name": "waist_pivot", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0": { + "name": "body_waist_pivot", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "6c53311f-ffc8-e567-ff1b-65840698e9ba": { + "name": "body", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "808e3c26-7285-af3f-a079-d8b899176dd3": { + "name": "head", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69": { + "name": "left_leg", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "60d50d30-a018-429d-ba78-c5fb5804dd8a": { + "name": "right_leg", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "c2e217f1-b50a-5c9a-b342-71a35e984046": { + "name": "text_display", + "type": "animated_java:text_display", + "rotation_global": false, + "quaternion_interpolation": false + }, + "3ffeee76-901e-f8a2-c29a-82f90e16fd1e": { + "name": "camera", + "type": "camera", + "rotation_global": false, + "quaternion_interpolation": false + }, + "bc141119-7f51-9690-7e21-e119b34fb3a2": { + "name": "item_display", + "type": "animated_java:vanilla_item_display", + "rotation_global": false, + "quaternion_interpolation": false } } }, @@ -2092,6 +2504,7 @@ "selected": true, "saved": true, "path": "", + "scope": 0, "anim_time_update": "", "blend_weight": "", "start_delay": "", @@ -2101,12 +2514,14 @@ "bc141119-7f51-9690-7e21-e119b34fb3a2": { "name": "item_display", "type": "animated_java:vanilla_item_display", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "position", "data_points": [ { - "x": "math.sin(q.life_time * 360 * 8) * 32", + "x": "-math.sin(q.life_time * 360 * 8) * 32", "y": "0", "z": "math.cos(q.life_time * 360 * 8) * 32" } @@ -2123,13 +2538,15 @@ "c2e217f1-b50a-5c9a-b342-71a35e984046": { "name": "text_display", "type": "animated_java:text_display", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "math.sin(q.life_time * 360) * 2", - "y": "math.cos(q.life_time * 360) * 2", + "x": "-math.sin(q.life_time * 360) * 2", + "y": "-math.cos(q.life_time * 360) * 2", "z": "0" } ], @@ -2178,6 +2595,8 @@ "808e3c26-7285-af3f-a079-d8b899176dd3": { "name": "head", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "position", @@ -2296,6 +2715,90 @@ "easingArgs": [1] } ] + }, + "98795982-9c43-6e3e-eed9-2c776a957938": { + "name": "root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "102db36a-eeda-0e6f-d5cc-c186ecda8165": { + "name": "baseplate_root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c": { + "name": "baseplate_pivot_a", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "5e08acae-d6ca-0dfd-9360-8cdb13c7a824": { + "name": "armor_stand_root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "98a28100-07e8-849a-38b7-f56abc2c2e56": { + "name": "waist_pivot", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0": { + "name": "body_waist_pivot", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "6c53311f-ffc8-e567-ff1b-65840698e9ba": { + "name": "body", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "b5b52d2c-097c-08df-6457-372fbae12445": { + "name": "left_arm", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "215d1b02-0e64-a794-1b88-a9c5a6d7541c": { + "name": "right_arm", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69": { + "name": "left_leg", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "60d50d30-a018-429d-ba78-c5fb5804dd8a": { + "name": "right_leg", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "7de415a2-9fdd-e4b2-3455-c3bed72eb896": { + "name": "left_hand", + "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false + }, + "7747736f-85e2-338f-207e-53f8d3d2fa39": { + "name": "right_hand", + "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false + }, + "3ffeee76-901e-f8a2-c29a-82f90e16fd1e": { + "name": "camera", + "type": "camera", + "rotation_global": false, + "quaternion_interpolation": false } } } diff --git a/test-packs/1.20.5/datapacks/animated_java/pack.mcmeta b/test-packs/1.20.5/datapacks/animated_java/pack.mcmeta index 98042a67..baa0ac08 100644 --- a/test-packs/1.20.5/datapacks/animated_java/pack.mcmeta +++ b/test-packs/1.20.5/datapacks/animated_java/pack.mcmeta @@ -4,7 +4,7 @@ "description": "AJ Testing DP", "supported_formats": { "min_inclusive": 41, - "max_inclusive": 56 + "max_inclusive": 47 } } } \ No newline at end of file diff --git a/test-packs/1.20.5/datapacks/test-framework/src/test.mcb b/test-packs/1.20.5/datapacks/test-framework/src/test.mcb index 18a11393..e738ea44 100644 --- a/test-packs/1.20.5/datapacks/test-framework/src/test.mcb +++ b/test-packs/1.20.5/datapacks/test-framework/src/test.mcb @@ -2,12 +2,81 @@ function on_load minecraft:load { tellraw @a {"text":"Test Framework loaded!", "color":"green"} } -clock 1s 1t { - execute store result score #count aj.i if entity @e[type=item_display,tag=aj.global.root] - title @a actionbar [{"text":"Rig Count: "}, {"score":{"name":"#count","objective":"aj.i"}}] -} +# clock 1s 1t { +# execute store result score #count aj.i if entity @e[type=item_display,tag=aj.global.root] +# title @a actionbar [{"text":"Rig Count: "}, {"score":{"name":"#count","objective":"aj.i"}}] +# } dir armor_stand { + function test { + scoreboard players set #failed_tests aj.i 0 + execute as @e[tag=aj.armor_stand.root] run { + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_locator {name:'left_hand',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"as_locator test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/at_locator {name:'left_hand',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"at_locator test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_at_locator {name:'left_hand',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"as_at_locator test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_all_locators {command:'scoreboard players add #test aj.i 1'} + execute unless score #test aj.i matches 2 run { + tellraw @a {"text":"as_all_locators test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/at_all_locators {command:'scoreboard players add #test aj.i 1'} + execute unless score #test aj.i matches 2 run { + tellraw @a {"text":"at_all_locators test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_at_all_locators {command:'scoreboard players add #test aj.i 1'} + execute unless score #test aj.i matches 2 run { + tellraw @a {"text":"as_at_all_locators test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_camera {name:'camera',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"as_camera test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_node {name:'head',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"as_node test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + } + + execute if score #failed_tests aj.i matches 0 run { + tellraw @a {"text":"All tests passed!","color":"green"} + } + + execute if score #failed_tests aj.i matches 1.. run { + tellraw @a [{"score":{"name":"#failed_tests","objective":"aj.i"}}, {"text":" tests failed!","color":"red"}] + } + } + function summon { #ARGS: {args:{...}} function animated_java:global/remove/everything @@ -40,3 +109,14 @@ dir armor_stand { } } } + +clock debug 1t { + title @a actionbar [ \ + "p:", {"score":{"name":"#aj.data_manager.preps_this_tick","objective":"aj.i"}}, \ + " r:", {"score":{"name":"#aj.data_manager.reads_this_tick","objective":"aj.i"}}, \ + " w:", {"score":{"name":"#aj.data_manager.writes_this_tick","objective":"aj.i"}} \ + ] + scoreboard players set #aj.data_manager.preps_this_tick aj.i 0 + scoreboard players set #aj.data_manager.reads_this_tick aj.i 0 + scoreboard players set #aj.data_manager.writes_this_tick aj.i 0 +} \ No newline at end of file diff --git a/test-packs/1.20.5/resources/pack.mcmeta b/test-packs/1.20.5/resources/pack.mcmeta index f1216214..be1840ab 100644 --- a/test-packs/1.20.5/resources/pack.mcmeta +++ b/test-packs/1.20.5/resources/pack.mcmeta @@ -4,7 +4,7 @@ "description": "AJ Testing RP", "supported_formats": { "min_inclusive": 32, - "max_inclusive": 41 + "max_inclusive": 33 } } } \ No newline at end of file diff --git a/test-packs/1.21.2/blueprints/armor_stand_1.21.2.ajblueprint b/test-packs/1.21.2/blueprints/armor_stand_1.21.2.ajblueprint index 1d15cf52..5b741652 100644 --- a/test-packs/1.21.2/blueprints/armor_stand_1.21.2.ajblueprint +++ b/test-packs/1.21.2/blueprints/armor_stand_1.21.2.ajblueprint @@ -1,9 +1,9 @@ { "meta": { "format": "animated-java:format/blueprint", - "format_version": "1.8.0-beta.2", + "format_version": "1.10.0-beta.1", "uuid": "167b27cd-b559-3f13-a97c-0841fe21f1d1", - "save_location": "D:\\github-repos\\animated-java\\old-animated-java\\test-packs\\1.21.2\\blueprints\\armor_stand_1.21.2.ajblueprint", + "save_location": "/var/mnt/ssd2/repos/animated-java/animated-java/test-packs/1.21.2/blueprints/armor_stand_1.21.2.ajblueprint", "last_used_export_namespace": "armor_stand" }, "resolution": { @@ -25,10 +25,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-6, 0, -6], "to": [6, 1, 6], @@ -38,27 +41,27 @@ "faces": { "north": { "uv": [12, 44, 24, 45], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [0, 44, 12, 45], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [36, 44, 48, 45], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [24, 44, 36, 45], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [12, 32, 24, 44], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [24, 32, 36, 44], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -67,10 +70,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-4, 12, -1], "to": [4, 14, 1], @@ -80,27 +86,27 @@ "faces": { "north": { "uv": [2, 50, 10, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [0, 50, 2, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [12, 50, 20, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [10, 50, 12, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [2, 50, 10, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [10, 48, 18, 50], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -109,10 +115,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [1, 1, -1], "to": [3, 12, 1], @@ -122,27 +131,27 @@ "faces": { "north": { "uv": [10, 2, 12, 13], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [12, 2, 14, 13], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [14, 2, 16, 13], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [8, 2, 10, 13], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [10, 0, 12, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [12, 0, 14, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -151,10 +160,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-3, 1, -1], "to": [-1, 12, 1], @@ -164,27 +176,27 @@ "faces": { "north": { "uv": [44, 18, 42, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [46, 18, 44, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [48, 18, 46, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [42, 18, 40, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [42, 16, 44, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [44, 16, 46, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -193,10 +205,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-6, 21, -1.5], "to": [6, 24, 1.5], @@ -206,27 +221,27 @@ "faces": { "north": { "uv": [3, 29, 15, 32], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [0, 29, 3, 32], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [18, 29, 30, 32], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [15, 29, 18, 32], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [3, 26, 15, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [15, 26, 27, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -235,10 +250,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [1, 14, -1], "to": [3, 21, 1], @@ -248,27 +266,27 @@ "faces": { "north": { "uv": [18, 2, 20, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [16, 2, 18, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [22, 2, 24, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [20, 2, 22, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [18, 0, 20, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [20, 0, 22, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -277,10 +295,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-3, 14, -1], "to": [-1, 21, 1], @@ -290,27 +311,27 @@ "faces": { "north": { "uv": [50, 18, 52, 25], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [48, 18, 50, 25], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [54, 18, 56, 25], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [52, 18, 54, 25], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [50, 16, 52, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [52, 16, 54, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -319,10 +340,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-7, 12, -1], "to": [-5, 24, 1], @@ -332,27 +356,27 @@ "faces": { "north": { "uv": [36, 18, 34, 30], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [34, 18, 32, 30], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [40, 18, 38, 30], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [38, 18, 36, 30], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [34, 18, 36, 16], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [36, 16, 38, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -361,10 +385,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [5, 12, -1], "to": [7, 24, 1], @@ -374,27 +401,27 @@ "faces": { "north": { "uv": [26, 2, 28, 14], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [24, 2, 26, 14], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [30, 2, 32, 14], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [28, 2, 30, 14], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [26, 0, 28, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [30, 0, 28, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -403,10 +430,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-1, 23, -1], "to": [1, 30, 1], @@ -416,27 +446,27 @@ "faces": { "north": { "uv": [2, 2, 4, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [0, 2, 2, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [6, 2, 8, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [4, 2, 6, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [2, 0, 4, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [4, 0, 6, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -445,10 +475,13 @@ { "name": "helmet", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-5, 22, -5], "to": [5, 32, 5], @@ -458,27 +491,27 @@ "faces": { "north": { "uv": [8, 16, 16, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [0, 16, 8, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [24, 16, 32, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [16, 16, 24, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [8, 0, 16, 16], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [16, 0, 24, 16], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -487,10 +520,13 @@ { "name": "chestplate", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 15, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-5, 11.25, -3], "to": [5, 23.75, 3], @@ -500,27 +536,27 @@ "faces": { "north": { "uv": [20, 40, 28, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [16, 40, 20, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [32, 40, 40, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [28, 40, 32, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [20, 32, 28, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [28, 32, 36, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -529,10 +565,13 @@ { "name": "left_chestplate", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-9, 19.25, -3], "to": [-3, 25, 3], @@ -542,27 +581,27 @@ "faces": { "north": { "uv": [48, 40, 44, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [44, 40, 40, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [56, 40, 52, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [52, 40, 48, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [44, 39.75, 48, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [52, 32, 48, 39.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -571,10 +610,13 @@ { "name": "left_chestplate", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [3, 19.25, -3], "to": [9, 25, 3], @@ -584,27 +626,27 @@ "faces": { "north": { "uv": [44, 40, 48, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [48, 40, 52, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [52, 40, 56, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [40, 40, 44, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [48, 39.75, 44, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [48, 32, 52, 39.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -613,10 +655,13 @@ { "name": "pants", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-4.5, 11.5, -2.5], "to": [4.5, 17, 2.5], @@ -626,27 +671,27 @@ "faces": { "north": { "uv": [20, 54, 28, 64], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "east": { "uv": [16, 54, 20, 64], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "south": { "uv": [32, 54, 40, 64], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "west": { "uv": [28, 54, 32, 64], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "up": { "uv": [20, 48, 28, 54], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "down": { "uv": [28, 48, 36, 54], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" } }, "type": "cube", @@ -655,10 +700,13 @@ { "name": "right_pants", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-0.5, 2.75, -2.375], "to": [4.25, 12, 2.375], @@ -668,27 +716,27 @@ "faces": { "north": { "uv": [4, 40, 8, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "east": { "uv": [0, 40, 4, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "south": { "uv": [12, 40, 16, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "west": { "uv": [8, 40, 12, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "up": { "uv": [4, 32, 8, 40], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "down": { "uv": [8, 32, 12, 40], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" } }, "type": "cube", @@ -697,10 +745,13 @@ { "name": "left_pants", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-4.25, 2.75, -2.375], "to": [0.5, 12, 2.375], @@ -710,27 +761,27 @@ "faces": { "north": { "uv": [8, 40, 4, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "east": { "uv": [12, 40, 8, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "south": { "uv": [16, 40, 12, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "west": { "uv": [4, 40, 0, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "up": { "uv": [8, 32, 4, 40], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "down": { "uv": [12, 32, 8, 40], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" } }, "type": "cube", @@ -739,10 +790,13 @@ { "name": "right_shoe", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-1, -1, -3], "to": [4.75, 6, 3], @@ -752,27 +806,27 @@ "faces": { "north": { "uv": [4, 52, 8, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [0, 52, 4, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [12, 52, 16, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [8, 52, 12, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [4, 32, 8, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [8, 32, 12, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -781,10 +835,13 @@ { "name": "left_shoe", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-4.75, -1, -3], "to": [1, 6, 3], @@ -794,27 +851,27 @@ "faces": { "north": { "uv": [8, 52, 4, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [12, 52, 8, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [16, 52, 12, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [4, 52, 0, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [8, 32, 4, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [12, 32, 8, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -827,6 +884,7 @@ "ignore_inherited_scale": false, "visibility": true, "locked": false, + "scope": 0, "config": { "use_entity": true, "entity_type": "minecraft:item_display", @@ -845,6 +903,7 @@ "ignore_inherited_scale": false, "visibility": true, "locked": false, + "scope": 0, "config": { "use_entity": true, "entity_type": "minecraft:item_display", @@ -857,11 +916,10 @@ "type": "locator" }, { - "uuid": "c2e217f1-b50a-5c9a-b342-71a35e984046", - "type": "animated_java:text_display", "name": "text_display", "position": [0, 38, 0], "rotation": [0, 0, 0], + "pivotOffset": [0, 0, 0], "scale": [1, 1, 1], "visibility": true, "locked": false, @@ -875,96 +933,663 @@ "onSummonFunction": "", "configs": { "default": { - "on_apply_function": "", + "on_apply_function": "", + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": false, + "glow_color": "#6f114b", + "invisible": false, + "shadow_radius": 0, + "shadow_strength": 1 + }, + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "on_apply_function": "", + "billboard": "vertical", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#6f114b", + "invisible": false, + "shadow_radius": 0, + "shadow_strength": 1 + } + } + }, + "scope": 0, + "uuid": "c2e217f1-b50a-5c9a-b342-71a35e984046", + "type": "animated_java:text_display" + }, + { + "name": "camera", + "position": [0, 27, 0], + "rotation": [0, 0, 0], + "fov": 70, + "aspect_ratio": [16, 9], + "linked_preview": "", + "camera_linked": false, + "visibility": true, + "export": true, + "locked": false, + "scope": 0, + "type": "camera", + "uuid": "3ffeee76-901e-f8a2-c29a-82f90e16fd1e" + }, + { + "name": "item_display", + "position": [6, 12, -4], + "rotation": [-90, 0, 0], + "pivotOffset": [0, 0, 0], + "scale": [0.5, 0.5, 0.5], + "visibility": true, + "locked": false, + "export": true, + "item": "minecraft:diamond", + "itemDisplay": "none", + "onSummonFunction": "", + "configs": { + "default": { + "on_apply_function": "", + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": false, + "glow_color": "#ffffff", + "invisible": false, + "shadow_radius": 0, + "shadow_strength": 1 + }, + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "on_apply_function": "", + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": true, + "glowing": true, + "override_glow_color": true, + "glow_color": "#99ff00", + "invisible": false, + "shadow_radius": 0, + "shadow_strength": 1 + } + } + }, + "scope": 0, + "uuid": "bc141119-7f51-9690-7e21-e119b34fb3a2", + "type": "animated_java:vanilla_item_display" + } + ], + "groups": [ + { + "name": "root", + "uuid": "98795982-9c43-6e3e-eed9-2c776a957938", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 0, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glow_color": "#ffffff", + "glowing": false, + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": {} + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "baseplate_root", + "uuid": "102db36a-eeda-0e6f-d5cc-c186ecda8165", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 0, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glow_color": "#ffffff", + "glowing": false, + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": {} + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "baseplate_pivot_a", + "uuid": "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 1, 6], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glow_color": "#ffffff", + "glowing": false, + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": {} + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "armor_stand_root", + "uuid": "5e08acae-d6ca-0dfd-9360-8cdb13c7a824", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 1, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": {} + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "waist_pivot", + "uuid": "98a28100-07e8-849a-38b7-f56abc2c2e56", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 12, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "5417306e-2c69-3f36-1e3c-edd904034a36": {} + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "body_waist_pivot", + "uuid": "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 12, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "5417306e-2c69-3f36-1e3c-edd904034a36": {} + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "body", + "uuid": "6c53311f-ffc8-e567-ff1b-65840698e9ba", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 24, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "5417306e-2c69-3f36-1e3c-edd904034a36": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": false, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#00ff06", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "head", + "uuid": "808e3c26-7285-af3f-a079-d8b899176dd3", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 23, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#c400ff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "left_arm", + "uuid": "b5b52d2c-097c-08df-6457-372fbae12445", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [-6, 23, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#00ff9f", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "right_arm", + "uuid": "215d1b02-0e64-a794-1b88-a9c5a6d7541c", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [6, 23, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { "billboard": "fixed", "override_brightness": false, "brightness_override": 0, "enchanted": false, "glowing": false, - "override_glow_color": false, - "glow_color": "#6f114b", + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, "invisible": false, + "nbt": "{}", "shadow_radius": 0, - "shadow_strength": 1 + "shadow_strength": 1, + "use_nbt": false }, "variants": { "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "on_apply_function": "", - "billboard": "vertical", + "billboard": "fixed", "override_brightness": false, "brightness_override": 0, "enchanted": false, "glowing": true, "override_glow_color": true, - "glow_color": "#6f114b", + "glow_color": "#ff0000", + "inherit_settings": true, "invisible": false, + "nbt": "{}", "shadow_radius": 0, - "shadow_strength": 1 + "shadow_strength": 1, + "use_nbt": false } } - } - }, - { - "name": "camera", - "position": [0, 27, 0], - "rotation": [0, 0, 0], - "fov": 70, - "aspect_ratio": [16, 9], - "linked_preview": "", - "camera_linked": false, + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, "visibility": true, - "type": "camera", - "uuid": "3ffeee76-901e-f8a2-c29a-82f90e16fd1e" + "autouv": 0, + "isOpen": true, + "primary_selected": false }, { - "uuid": "bc141119-7f51-9690-7e21-e119b34fb3a2", - "type": "animated_java:vanilla_item_display", - "name": "item_display", - "position": [6, 12, -4], - "rotation": [-90, 0, 0], - "scale": [0.5, 0.5, 0.5], - "visibility": true, - "locked": false, + "name": "left_leg", + "uuid": "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69", "export": true, - "item": "minecraft:diamond", - "itemDisplay": "none", + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [2, 12, 0], + "rotation": [0, 0, 0], + "color": 0, "onSummonFunction": "", "configs": { "default": { - "on_apply_function": "", "billboard": "fixed", - "override_brightness": false, "brightness_override": 0, "enchanted": false, - "glowing": false, - "override_glow_color": false, "glow_color": "#ffffff", + "glowing": false, + "inherit_settings": true, "invisible": false, + "nbt": "{}", "shadow_radius": 0, - "shadow_strength": 1 + "shadow_strength": 1, + "use_nbt": false }, "variants": { "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "on_apply_function": "", "billboard": "fixed", "override_brightness": false, "brightness_override": 0, - "enchanted": true, + "enchanted": false, "glowing": true, "override_glow_color": true, - "glow_color": "#99ff00", + "glow_color": "#ffee00", + "inherit_settings": true, "invisible": false, + "nbt": "{}", "shadow_radius": 0, - "shadow_strength": 1 + "shadow_strength": 1, + "use_nbt": false } } - } - } - ], - "outliner": [ + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, { - "name": "root", - "origin": [0, 0, 0], + "name": "right_leg", + "uuid": "60d50d30-a018-429d-ba78-c5fb5804dd8a", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [-2, 12, 0], + "rotation": [0, 0, 0], "color": 0, "onSummonFunction": "", "configs": { @@ -981,238 +1606,65 @@ "shadow_strength": 1, "use_nbt": false }, - "variants": {} + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#6e00ff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } }, - "uuid": "98795982-9c43-6e3e-eed9-2c776a957938", - "export": true, + "children": [], + "reset": false, + "shade": true, "mirror_uv": false, - "isOpen": true, - "locked": false, "visibility": true, "autouv": 0, - "selected": false, + "isOpen": true, + "primary_selected": false + } + ], + "outliner": [ + { + "uuid": "98795982-9c43-6e3e-eed9-2c776a957938", + "isOpen": true, "children": [ { - "name": "baseplate_root", - "origin": [0, 0, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glow_color": "#ffffff", - "glowing": false, - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": {} - }, "uuid": "102db36a-eeda-0e6f-d5cc-c186ecda8165", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ { - "name": "baseplate_pivot_a", - "origin": [0, 1, 6], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glow_color": "#ffffff", - "glowing": false, - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": {} - }, "uuid": "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["46624743-e0ef-5e97-e6d8-ba5dc100baf4"] } ] }, { - "name": "armor_stand_root", - "origin": [0, 1, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": {} - }, "uuid": "5e08acae-d6ca-0dfd-9360-8cdb13c7a824", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ { - "name": "waist_pivot", - "origin": [0, 12, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "5417306e-2c69-3f36-1e3c-edd904034a36": {} - } - }, "uuid": "98a28100-07e8-849a-38b7-f56abc2c2e56", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ { - "name": "body_waist_pivot", - "origin": [0, 12, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "5417306e-2c69-3f36-1e3c-edd904034a36": {} - } - }, "uuid": "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ { - "name": "body", - "origin": [0, 24, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "5417306e-2c69-3f36-1e3c-edd904034a36": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": false, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#00ff06", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "6c53311f-ffc8-e567-ff1b-65840698e9ba", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ "55829f3d-26dc-8f49-39b8-5ba2c0159a24", "9d16df18-0574-58bb-e0f9-f799946257c9", @@ -1221,150 +1673,18 @@ "6dd668dd-27bd-631d-5e44-a94f7a35ddbb", "d5e974ae-a732-db7a-59a1-c16ff717e426", { - "name": "head", - "origin": [0, 23, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#c400ff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "808e3c26-7285-af3f-a079-d8b899176dd3", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["a23d9259-0d9a-4e16-1b42-47e5bedba00f", "a302b268-1699-4013-011f-211bd85806d4", "3ffeee76-901e-f8a2-c29a-82f90e16fd1e"] }, { - "name": "left_arm", - "origin": [-6, 23, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#00ff9f", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "b5b52d2c-097c-08df-6457-372fbae12445", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["c219cb9b-53a7-6a5b-7b47-dce0a1e6ec14", "967c77d0-2607-0ecb-8093-416d237cdb85", "7de415a2-9fdd-e4b2-3455-c3bed72eb896"] }, { - "name": "right_arm", - "origin": [6, 23, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#ff0000", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "215d1b02-0e64-a794-1b88-a9c5a6d7541c", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ "13293700-7f42-2279-6a1f-4e0a6a4d89b3", "98475898-cfc8-f67b-3145-abaf659deb3e", @@ -1377,97 +1697,13 @@ ] }, { - "name": "left_leg", - "origin": [2, 12, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glow_color": "#ffffff", - "glowing": false, - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#ffee00", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["d29efa52-def5-a311-7438-1fc73aac804c", "71bfec99-5014-21d3-739b-6512074212db", "41413d23-edf5-3fdc-2ddb-5fd45ea99a89"] }, { - "name": "right_leg", - "origin": [-2, 12, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glow_color": "#ffffff", - "glowing": false, - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#6e00ff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "60d50d30-a018-429d-ba78-c5fb5804dd8a", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["60766231-bd45-cb3f-0a4f-c6c066e86f54", "4dd0c5f1-828f-d559-6496-16e2fbe6276d", "11976d8b-3994-df35-0fb9-b92ac5012141"] } ] @@ -1480,12 +1716,13 @@ ], "textures": [ { - "path": "", "name": "wood.png", + "path": "", "folder": "", "namespace": "", "id": "0", "group": "", + "scope": 0, "width": 64, "height": 64, "uv_width": 64, @@ -1494,9 +1731,12 @@ "use_as_default": false, "layers_enabled": false, "sync_to_project": "", + "file_format": "png", "render_mode": "default", "render_sides": "auto", + "wrap_mode": "limited", "pbr_channel": "color", + "fps": 7, "frame_time": 1, "frame_order_type": "loop", "frame_order": "", @@ -1508,12 +1748,13 @@ "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAB6xJREFUeF7tW01oXUUUnmebkjZNCU1bjSnVtAUNVks0VK1gEbLowmK6EIOKP3VRKBYNBldqiLoMRIkUurAq+PPEhUpduAiIgkVLMDy1qGCtDY3RmsRH07SxSb3yzfW7OW9y75u5uS/v3WBnc+fnzN8353wzc+a9jPovHHtzv4foRH5S59z79LsZluH7xev7vJOjf6otDesVvo8/dzR2+a8jf6nLV83qNu5+4khBfdlXOePBIGwAPPPInd59u5rVx5//oPA1J2Ar/+SVB72pv/9Rx0+cDq1fzknLvjKfvvaoXnmEizMXVH5qOiivq6nW8dGRMbWybrVCemXVqqAc8kivWrlMawVWVgYz78LFy7oPBPTTULdW7X7yrYpqQubDvvs9OWkMjhNHHBPkRE2AKEtQWI76aPNi/nwAHNuSAEF+b+cHlQXgUNc9WgN+n7ig/piYCsZ39doadc3audWW5ShDgPwdrU06Tu3gClNzNl+/qUBjuPrMNLmk3KaQAbmhU6inHnR+Yp4qF1Prd44e18UEBaCZYMpyxKXM4Y++r6wGgAMwaa4izQH2ieCi1uAAgkgNqF9TW3QxATj6rbgGgANo57Rbqq20fc4GhCjVmiBJcpTAsR55gV8tkz+vDvR+VlkN2N++TZtAlM0zP0qt2+66SZuPZHe59JJQpf1Dw1KhATbSgYkUU2vJASTNKEJFPoIk24pzgAsAlAk7J9i2MZIs2uC5ABpD3qj0idBqf7Zzgg2AN17e40lCJd8QVFt92wIlLbcCYDsn2EiMJ82wQxQGX/FdICmCtvoAkJwAQpX2j7qp5wDbBJd6udUElvoEbeMvAACEZatQrDyJPbv4G4r5E2z1o8adGgCS+hNs9VMLAA9a9CuYAx0/Nxn4IMLuJdua/duoGVzvGvo2iANKqQKcIujc1dEht0mMwXS+yIuaeYagLOot9K5RUgB4vo/j6eFlTJ425eXsq8FTuijqur17V3PB2snbrMtdI/AHlEIL6AGKAwDPCZhF2F1ib9ttwbFZXrp43cZdRF7Y0E6cu0bFt0GYQDGfIsDktVwuNflA+iEXctfQALyw73avafMG3T5tmLZ36pezOl+WI02S4aAgBxl8XzzytTOw0gSiSK7YdRv9J7lrZDh5NMKV4GTYOG9uYRNn5wBsISDw7BHlU8z97BO09FfI6zZMBGGhdw3nlSrVLmG2Ix0y5AE5wYf27NDXaC4QF0HvGPkJ7VVKcteY97rDAbr4+Sm7fFmV+unMb+qGjdeq2cszCmkE5lFu52OH5wFODuDETOcLzgEIdLmZ/sskp0+0WzAgvA5hArRvqjcngM6ZJx2hXI0oecgClCgAipGc9CFKM6H/0nYdt2nuPABYQa4eV1Wustmwi8aEeX9wECtGcjgHyHcIkw8SAyDfBdasrtYqjEC7m52dUcuX+yoNDVi/2nd3r6mt1pqCcpkmGUGO9WRd5EEjCEaYU1ZywGL7CwreBjEwTur4tydVy82bCs7hQ98NB3mQPTc5HUzSrLvjli0aGEwYoKDuzltv1IABvEr7AqnBGXkF5lEWhVA9PntRWOZJWZTHret6V7DZcNLy2Ntgd3e3NzU1pWpq/PdBxBEaGxvVyMiIjqOsrq5O5fP5QMZVvqenJ/aYkoAQu7Ouri6vtbVVVVf7T+dmGB8fD8AZHR3VoMSR7+zsjD2msgPQ3NysVqxYofu9dOmSjldV+USJAHCmp6fV4OCgTseR7+3tTTcAMIGWlhY9QQaYAQGRqzE2NqbNII586jWgr6/Pa2ryvTCTk/4pDaG2dv5r8NDQkOaCOPKp5wBowNatWwtUfmZmJkgjTtMYHh7W8TjyqQdAkiA1wFx9mgc5gCToIr8kOACkxiBXX5Ig4jABkqCrfOo1ABywbt06yXWRcZAgQhz51JMgdwGoM1Sf+z53Am6H2AqpAdgFXOVTrwHkAKwsCU/uArB/5udyOa0B4ABX+SXBAfIojG0OAfs9j8XFjsI2+bJrQDab1e+BcjWlUfOkZ+73UP36+nqt2uYpUNaXZwWZjzoSSPaPfJiPuWMgzbHIXae9vT3RyTFRZScmTLnQFQBSvkCLPrxAA+ibk45PxuntoUfWHFWcp7BFn1HMDq4AwD9K0Bk68OUJhV9/Isg4ff02ubT4+lwVIXCKUt2PffOjdl4iMB5mFlFySR8qXAdeKrkru0AYkngwNf88EefFt1SrU452QjWAvIABwObD/iVWjsGVo49QAOTvezEIl5+alGOwi9FHKADyXyTsdKmRmytYoQBIDuDD5P+KA1zRK5Ncol+v2sZIDWAnSMsOF5JWqr7bb2O8J6Pj5pejcinHeOq71cjbPbpW48NzcabxRTnKGJdlZh7bQr40AQyaE174d0O/p84enGuXaZkfFo8qV8rLvafU9qf6g8XMvXowNM38qC8bkPVLD0BD1lOjHXPtIs3AfCnDeFieX89TDVk18HyHanspqzMQRzDTzAsrhyzbkOVRK80hxzeBjQOeOtM2BwDTMt+MszfWK2zDUxsHtET2QJvqODQQfFnNzHdN0wTCbD4MGPZHUzHTc/nX5fw2T2/PKMTNL2u6lCvl9T/rVzj4vu9k7X9ge6BUyEO62Jd1wur/C4S4j3y2CFhdAAAAAElFTkSuQmCC" }, { - "path": "", "name": "iron_layer_1.png", + "path": "", "folder": "", "namespace": "", "id": "1", "group": "", + "scope": 0, "width": 64, "height": 32, "uv_width": 64, @@ -1522,9 +1763,12 @@ "use_as_default": false, "layers_enabled": false, "sync_to_project": "", + "file_format": "png", "render_mode": "default", "render_sides": "auto", + "wrap_mode": "limited", "pbr_channel": "color", + "fps": 7, "frame_time": 1, "frame_order_type": "loop", "frame_order": "", @@ -1536,12 +1780,13 @@ "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAAAXNSR0IArs4c6QAAA6VJREFUaEPlmb9qMkEUxVcIKCikUBCSTot0yROYwkqf2FQK8Qm0U0g6hYAWAYUEhP34DZzlOqzORqNu/KZJZufuOPfMvef+2UIUGK+vr/F6vXZS5XI5kdazbrdbCO2R5/Xg4QGg1Wo5Hebzufu7Wq3c34+Pj+j5+Tm4x1UAMBgMomq1muhSKpX+DwB6vV78+PgYLRaLaLlcJgAAxufn5/VbgA/A/f19AsL7+3t09RwAAI1GI/r6+nIWIAAqlUr09vZ2/RYACdbrdXfrgIDvozxjPB5fvwUAAMruCoV/3gV2KYjCNu7L8XcBIdm0dRsG7b78f2kAC4rzxHjFd5k7LM8hO51ONJ1OnQtowAff398OpNvbW+caGrjI3d1dNBwO3SObRxBNJJuHPKKQFuYIcbVazfm4MkCAgAxns1miuG7bD5P2fQACAO2lUAqZ5gYAbksHu7m5cUpbU1a2F8dxTELUbrdd9gd4unW5wGazcY8AQZkjAE0mk62EUOu5cAGr8L4D9ft9p7AASEtxBYrlBAFsM0ksLA9h9OR5vIopQLAhFOVzQYLnKlSwDGsVlzZ96X1yCzgXwIf+ThCA0WgUiyDx4aenp+A7hx4my3vKW8Rbx1pSUJnJZBKrDsgLAIRVIsxvkGgQgNlsFitBAohLW4DyFsIqIfvYhkwQAJsqQ2LH/mAWM98nY3MP5E7uAqED76olfKCs7/qJFvN98n79oOw0bZ+f1hpBC8gCAD5JrUBqy2g2m1v+qZ6C1tPkSZVtmKT+eHl5cc+sz2t/v9aAE7SH5LOU60cDYGsJWzzpQBxYxRQAcEOqHZBn6MDiGoopiib2AAAAtXPS7YeHh0RhijGG5JkTubJwxNEAYNr+AXTDHAplpBgtNFWPOrAFSNamqIMCAMZtMwSwPy8Wi6728NcBJMQRvwKAOkbWBbgxO9RF5llIXq03WQygqTiz/r+PA7J+tzgaAFxAxY5ujLI5bUghK28B8d85R7ns+gE/YVXdhiUsNU1lgpqnWYD6Cpi5b7LI26wziwmHSDq0vtURUoUGaSnTsiSVxrLyab9DxHvq/KiT5JMUHSWGtRjJnuvDiwMAn9SNyCSZ68B23b9BIWzjLyxta3/drJot8l1ZkUj0Eh9enAvAorSoLEsrjIiFdSPMJb/LR7WnQJB17GLktGTqXL2CxAL0oYPbIe4SukRamKhdxyKY70s0fjtlDfnyoevOAtJa2jbsiCTTQtGla4NDFdd7/wAIfE5OhlGtmAAAAABJRU5ErkJggg==" }, { - "path": "", "name": "iron_layer_2.png", + "path": "", "folder": "", "namespace": "", "id": "2", "group": "", + "scope": 0, "width": 64, "height": 32, "uv_width": 64, @@ -1550,9 +1795,12 @@ "use_as_default": false, "layers_enabled": false, "sync_to_project": "", + "file_format": "png", "render_mode": "default", "render_sides": "auto", + "wrap_mode": "limited", "pbr_channel": "color", + "fps": 7, "frame_time": 1, "frame_order_type": "loop", "frame_order": "", @@ -1564,12 +1812,13 @@ "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAAAXNSR0IArs4c6QAAAZZJREFUaEPtVruqhDAQjZ1gYSlY+gH+gfZ+sb2fYWEpCDaCgt1eTrhHhlldLsgVNkkajZldmJPzmMh4viLP+zcBgMAAzxEIEvCcAMEEgwSCBDxHIEjAcwKEFAgSCBJQCHRd98KnbdtMkiSmrmunWfLWHACoqsr0fW+GYTBN0/gFQNu2r6IobPNYXgIgVeE8ANQ8dY8ntC994OrMBYZEAACGl+e5GcfRNp+mqQVA75dlsd9xjjMnAIDm0QgAYINZltnmpmmyaQBPwKIvYL/vu63/9pSwDOCNoyGy4YoBEhAA5AQAvHHcMCVA+pPycRxbRnCPpxMMkBJg07xlSkD6g/QAFwalQwK6eeqdjAADyBBpmt8ek28eoCMPzWqT1CnxKSZ1pHLE5v/yXMYuz55ImSMGz7L/L42hhqMzPQJ7mui6rvadqSLrySjW6988YbK353w5OgNE3F5Zlmae5wMEMogyg+lKOV3VP2GytwE4G6TYIG8eJsrU0JKSfqLrAdh/e8xtAJgiB89/hyrdsDzX72cAoeaJlPkBm2JOMHlI974AAAAASUVORK5CYII=" }, { - "path": "", "name": "transparent.png", + "path": "", "folder": "", "namespace": "", "id": "3", "group": "", + "scope": 0, "width": 16, "height": 16, "uv_width": 16, @@ -1578,9 +1827,12 @@ "use_as_default": false, "layers_enabled": false, "sync_to_project": "", + "file_format": "png", "render_mode": "default", "render_sides": "auto", + "wrap_mode": "limited", "pbr_channel": "color", + "fps": 7, "frame_time": 1, "frame_order_type": "loop", "frame_order": "", @@ -1653,6 +1905,7 @@ "selected": false, "saved": true, "path": "", + "scope": 0, "anim_time_update": "", "blend_weight": "", "start_delay": "", @@ -1667,6 +1920,8 @@ "5e08acae-d6ca-0dfd-9360-8cdb13c7a824": { "name": "armor_stand_root", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "position", @@ -1689,13 +1944,15 @@ "6c53311f-ffc8-e567-ff1b-65840698e9ba": { "name": "body", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { "x": "0", - "y": "1 - math.sin(q.life_time * v.walk_speed + 90) * 12.25\n", + "y": "-1 + math.sin(q.life_time * v.walk_speed + 90) * 12.25\n", "z": "0" } ], @@ -1727,13 +1984,15 @@ "808e3c26-7285-af3f-a079-d8b899176dd3": { "name": "head", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { "x": "0", - "y": "1 + math.sin(q.life_time * v.walk_speed + 90) * 12.25", + "y": "-1 - math.sin(q.life_time * v.walk_speed + 90) * 12.25", "z": "0" } ], @@ -1749,12 +2008,14 @@ "b5b52d2c-097c-08df-6457-372fbae12445": { "name": "left_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "math.sin(q.life_time * v.walk_speed) * 8", + "x": "-math.sin(q.life_time * v.walk_speed) * 8", "y": "0", "z": "22.5" } @@ -1770,7 +2031,7 @@ "channel": "position", "data_points": [ { - "x": "2", + "x": "-2", "y": "0", "z": "-math.sin(q.life_time * v.walk_speed) * 2" } @@ -1787,13 +2048,15 @@ "215d1b02-0e64-a794-1b88-a9c5a6d7541c": { "name": "right_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "math.sin(q.life_time * v.walk_speed) * 22.5", - "y": "math.sin(q.life_time * v.walk_speed) * 12.25", + "x": "-math.sin(q.life_time * v.walk_speed) * 22.5", + "y": "-math.sin(q.life_time * v.walk_speed) * 12.25", "z": "math.cos(q.life_time * v.walk_speed * 2) * 6 + 6" } ], @@ -1809,12 +2072,14 @@ "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69": { "name": "left_leg", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-math.sin(q.life_time * v.walk_speed) * 22.5", + "x": "math.sin(q.life_time * v.walk_speed) * 22.5", "y": "0", "z": "0" } @@ -1847,12 +2112,14 @@ "60d50d30-a018-429d-ba78-c5fb5804dd8a": { "name": "right_leg", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "math.sin(q.life_time * v.walk_speed) * 22.5", + "x": "-math.sin(q.life_time * v.walk_speed) * 22.5", "y": "0", "z": "0" } @@ -1885,6 +2152,8 @@ "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0": { "name": "body_waist_pivot", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", @@ -1903,6 +2172,60 @@ "easingArgs": [] } ] + }, + "98795982-9c43-6e3e-eed9-2c776a957938": { + "name": "root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "102db36a-eeda-0e6f-d5cc-c186ecda8165": { + "name": "baseplate_root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c": { + "name": "baseplate_pivot_a", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "98a28100-07e8-849a-38b7-f56abc2c2e56": { + "name": "waist_pivot", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "7de415a2-9fdd-e4b2-3455-c3bed72eb896": { + "name": "left_hand", + "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false + }, + "7747736f-85e2-338f-207e-53f8d3d2fa39": { + "name": "right_hand", + "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false + }, + "c2e217f1-b50a-5c9a-b342-71a35e984046": { + "name": "text_display", + "type": "animated_java:text_display", + "rotation_global": false, + "quaternion_interpolation": false + }, + "3ffeee76-901e-f8a2-c29a-82f90e16fd1e": { + "name": "camera", + "type": "camera", + "rotation_global": false, + "quaternion_interpolation": false + }, + "bc141119-7f51-9690-7e21-e119b34fb3a2": { + "name": "item_display", + "type": "animated_java:vanilla_item_display", + "rotation_global": false, + "quaternion_interpolation": false } } }, @@ -1916,6 +2239,7 @@ "selected": false, "saved": true, "path": "", + "scope": 0, "anim_time_update": "", "blend_weight": "", "start_delay": "", @@ -1925,13 +2249,15 @@ "b5b52d2c-097c-08df-6457-372fbae12445": { "name": "left_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-90\n+ math.sin(q.life_time * 360) * 30", - "y": "-22.5\n+ math.cos(q.life_time * 360) * 30", + "x": "90\n- math.sin(q.life_time * 360) * 30", + "y": "22.5\n- math.cos(q.life_time * 360) * 30", "z": "0" } ], @@ -1947,13 +2273,15 @@ "215d1b02-0e64-a794-1b88-a9c5a6d7541c": { "name": "right_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-90\n+ math.sin(q.life_time * 360) * 30", - "y": "22.5\n- math.cos(q.life_time * 360) * 30", + "x": "90\n- math.sin(q.life_time * 360) * 30", + "y": "-22.5\n+ math.cos(q.life_time * 360) * 30", "z": "0" } ], @@ -1969,6 +2297,8 @@ "7de415a2-9fdd-e4b2-3455-c3bed72eb896": { "name": "left_hand", "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "function", @@ -1995,6 +2325,8 @@ "7747736f-85e2-338f-207e-53f8d3d2fa39": { "name": "right_hand", "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "function", @@ -2021,12 +2353,14 @@ "3b35d1a9-befe-066e-60df-e1f3a5ec5a78": { "name": "pig", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "position", "data_points": [ { - "x": "16 - math.cos(q.life_time * 180) * 16", + "x": "-16 + math.cos(q.life_time * 180) * 16", "y": "16 + math.sin(q.life_time * 360) * 8", "z": "-32" } @@ -2079,6 +2413,84 @@ "easingArgs": [] } ] + }, + "98795982-9c43-6e3e-eed9-2c776a957938": { + "name": "root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "102db36a-eeda-0e6f-d5cc-c186ecda8165": { + "name": "baseplate_root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c": { + "name": "baseplate_pivot_a", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "5e08acae-d6ca-0dfd-9360-8cdb13c7a824": { + "name": "armor_stand_root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "98a28100-07e8-849a-38b7-f56abc2c2e56": { + "name": "waist_pivot", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0": { + "name": "body_waist_pivot", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "6c53311f-ffc8-e567-ff1b-65840698e9ba": { + "name": "body", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "808e3c26-7285-af3f-a079-d8b899176dd3": { + "name": "head", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69": { + "name": "left_leg", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "60d50d30-a018-429d-ba78-c5fb5804dd8a": { + "name": "right_leg", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "c2e217f1-b50a-5c9a-b342-71a35e984046": { + "name": "text_display", + "type": "animated_java:text_display", + "rotation_global": false, + "quaternion_interpolation": false + }, + "3ffeee76-901e-f8a2-c29a-82f90e16fd1e": { + "name": "camera", + "type": "camera", + "rotation_global": false, + "quaternion_interpolation": false + }, + "bc141119-7f51-9690-7e21-e119b34fb3a2": { + "name": "item_display", + "type": "animated_java:vanilla_item_display", + "rotation_global": false, + "quaternion_interpolation": false } } }, @@ -2092,6 +2504,7 @@ "selected": true, "saved": true, "path": "", + "scope": 0, "anim_time_update": "", "blend_weight": "", "start_delay": "", @@ -2101,12 +2514,14 @@ "bc141119-7f51-9690-7e21-e119b34fb3a2": { "name": "item_display", "type": "animated_java:vanilla_item_display", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "position", "data_points": [ { - "x": "math.sin(q.life_time * 360 * 8) * 32", + "x": "-math.sin(q.life_time * 360 * 8) * 32", "y": "0", "z": "math.cos(q.life_time * 360 * 8) * 32" } @@ -2123,13 +2538,15 @@ "c2e217f1-b50a-5c9a-b342-71a35e984046": { "name": "text_display", "type": "animated_java:text_display", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "math.sin(q.life_time * 360) * 2", - "y": "math.cos(q.life_time * 360) * 2", + "x": "-math.sin(q.life_time * 360) * 2", + "y": "-math.cos(q.life_time * 360) * 2", "z": "0" } ], @@ -2178,6 +2595,8 @@ "808e3c26-7285-af3f-a079-d8b899176dd3": { "name": "head", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "position", @@ -2296,6 +2715,90 @@ "easingArgs": [1] } ] + }, + "98795982-9c43-6e3e-eed9-2c776a957938": { + "name": "root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "102db36a-eeda-0e6f-d5cc-c186ecda8165": { + "name": "baseplate_root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c": { + "name": "baseplate_pivot_a", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "5e08acae-d6ca-0dfd-9360-8cdb13c7a824": { + "name": "armor_stand_root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "98a28100-07e8-849a-38b7-f56abc2c2e56": { + "name": "waist_pivot", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0": { + "name": "body_waist_pivot", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "6c53311f-ffc8-e567-ff1b-65840698e9ba": { + "name": "body", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "b5b52d2c-097c-08df-6457-372fbae12445": { + "name": "left_arm", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "215d1b02-0e64-a794-1b88-a9c5a6d7541c": { + "name": "right_arm", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69": { + "name": "left_leg", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "60d50d30-a018-429d-ba78-c5fb5804dd8a": { + "name": "right_leg", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "7de415a2-9fdd-e4b2-3455-c3bed72eb896": { + "name": "left_hand", + "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false + }, + "7747736f-85e2-338f-207e-53f8d3d2fa39": { + "name": "right_hand", + "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false + }, + "3ffeee76-901e-f8a2-c29a-82f90e16fd1e": { + "name": "camera", + "type": "camera", + "rotation_global": false, + "quaternion_interpolation": false } } } diff --git a/test-packs/1.21.2/datapacks/test-framework/src/test.mcb b/test-packs/1.21.2/datapacks/test-framework/src/test.mcb index 57cbd78c..e738ea44 100644 --- a/test-packs/1.21.2/datapacks/test-framework/src/test.mcb +++ b/test-packs/1.21.2/datapacks/test-framework/src/test.mcb @@ -1,9 +1,122 @@ function on_load minecraft:load { - tellraw @a {text:'Test Framework loaded!', color:green} + tellraw @a {"text":"Test Framework loaded!", "color":"green"} } -function summon { - #ARGS: {args:{...}} - function animated_java:armor_stand/remove/all - $execute positioned 0 -63 0 rotated 0 0 run function animated_java:armor_stand/summon {args:$(args)} +# clock 1s 1t { +# execute store result score #count aj.i if entity @e[type=item_display,tag=aj.global.root] +# title @a actionbar [{"text":"Rig Count: "}, {"score":{"name":"#count","objective":"aj.i"}}] +# } + +dir armor_stand { + function test { + scoreboard players set #failed_tests aj.i 0 + execute as @e[tag=aj.armor_stand.root] run { + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_locator {name:'left_hand',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"as_locator test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/at_locator {name:'left_hand',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"at_locator test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_at_locator {name:'left_hand',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"as_at_locator test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_all_locators {command:'scoreboard players add #test aj.i 1'} + execute unless score #test aj.i matches 2 run { + tellraw @a {"text":"as_all_locators test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/at_all_locators {command:'scoreboard players add #test aj.i 1'} + execute unless score #test aj.i matches 2 run { + tellraw @a {"text":"at_all_locators test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_at_all_locators {command:'scoreboard players add #test aj.i 1'} + execute unless score #test aj.i matches 2 run { + tellraw @a {"text":"as_at_all_locators test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_camera {name:'camera',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"as_camera test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_node {name:'head',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"as_node test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + } + + execute if score #failed_tests aj.i matches 0 run { + tellraw @a {"text":"All tests passed!","color":"green"} + } + + execute if score #failed_tests aj.i matches 1.. run { + tellraw @a [{"score":{"name":"#failed_tests","objective":"aj.i"}}, {"text":" tests failed!","color":"red"}] + } + } + + function summon { + #ARGS: {args:{...}} + function animated_java:global/remove/everything + $execute positioned 0 1 0 rotated 0 0 run function animated_java:armor_stand/summon {args:$(args)} + } + + function summon_minimal { + #ARGS: {args:{...}} + function animated_java:global/remove/everything + $execute positioned 0 1 0 rotated 0 0 run function animated_java:armor_stand_minimal/summon {args:$(args)} + } + + function summon_many { + data remove storage test:temp args + $data modify storage test:temp args set value {args:$(args)} + REPEAT (0, 199) as i { + schedule 1t { + execute positioned <%i % 16%> 1 <%Math.floor(i / 16)%> rotated 0 0 run function animated_java:armor_stand/summon with storage test:temp args + } + } + } + + function summon_many_minimal { + data remove storage test:temp args + $data modify storage test:temp args set value {args:$(args)} + REPEAT (0, 199) as i { + schedule 1t { + execute positioned <%i % 16%> 1 <%Math.floor(i / 16)%> rotated 0 0 run function animated_java:armor_stand_minimal/summon with storage test:temp args + } + } + } } + +clock debug 1t { + title @a actionbar [ \ + "p:", {"score":{"name":"#aj.data_manager.preps_this_tick","objective":"aj.i"}}, \ + " r:", {"score":{"name":"#aj.data_manager.reads_this_tick","objective":"aj.i"}}, \ + " w:", {"score":{"name":"#aj.data_manager.writes_this_tick","objective":"aj.i"}} \ + ] + scoreboard players set #aj.data_manager.preps_this_tick aj.i 0 + scoreboard players set #aj.data_manager.reads_this_tick aj.i 0 + scoreboard players set #aj.data_manager.writes_this_tick aj.i 0 +} \ No newline at end of file diff --git a/test-packs/1.21.4/blueprints/armor_stand_1.21.4.ajblueprint b/test-packs/1.21.4/blueprints/armor_stand_1.21.4.ajblueprint index c658225d..f435f9a9 100644 --- a/test-packs/1.21.4/blueprints/armor_stand_1.21.4.ajblueprint +++ b/test-packs/1.21.4/blueprints/armor_stand_1.21.4.ajblueprint @@ -1,9 +1,9 @@ { "meta": { "format": "animated-java:format/blueprint", - "format_version": "1.8.0-beta.2", + "format_version": "1.10.0-beta.1", "uuid": "167b27cd-b559-3f13-a97c-0841fe21f1d1", - "save_location": "D:\\github-repos\\animated-java\\old-animated-java\\test-packs\\1.21.4\\blueprints\\armor_stand_1.21.4.ajblueprint", + "save_location": "/var/mnt/ssd2/repos/animated-java/animated-java/test-packs/1.21.4/blueprints/armor_stand_1.21.4.ajblueprint", "last_used_export_namespace": "armor_stand" }, "resolution": { @@ -25,10 +25,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-6, 0, -6], "to": [6, 1, 6], @@ -38,27 +41,27 @@ "faces": { "north": { "uv": [12, 44, 24, 45], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [0, 44, 12, 45], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [36, 44, 48, 45], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [24, 44, 36, 45], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [12, 32, 24, 44], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [24, 32, 36, 44], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -67,10 +70,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-4, 12, -1], "to": [4, 14, 1], @@ -80,27 +86,27 @@ "faces": { "north": { "uv": [2, 50, 10, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [0, 50, 2, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [12, 50, 20, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [10, 50, 12, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [2, 50, 10, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [10, 48, 18, 50], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -109,10 +115,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [1, 1, -1], "to": [3, 12, 1], @@ -122,27 +131,27 @@ "faces": { "north": { "uv": [10, 2, 12, 13], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [12, 2, 14, 13], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [14, 2, 16, 13], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [8, 2, 10, 13], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [10, 0, 12, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [12, 0, 14, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -151,10 +160,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-3, 1, -1], "to": [-1, 12, 1], @@ -164,27 +176,27 @@ "faces": { "north": { "uv": [44, 18, 42, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [46, 18, 44, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [48, 18, 46, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [42, 18, 40, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [42, 16, 44, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [44, 16, 46, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -193,10 +205,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-6, 21, -1.5], "to": [6, 24, 1.5], @@ -206,27 +221,27 @@ "faces": { "north": { "uv": [3, 29, 15, 32], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [0, 29, 3, 32], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [18, 29, 30, 32], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [15, 29, 18, 32], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [3, 26, 15, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [15, 26, 27, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -235,10 +250,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [1, 14, -1], "to": [3, 21, 1], @@ -248,27 +266,27 @@ "faces": { "north": { "uv": [18, 2, 20, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [16, 2, 18, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [22, 2, 24, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [20, 2, 22, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [18, 0, 20, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [20, 0, 22, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -277,10 +295,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-3, 14, -1], "to": [-1, 21, 1], @@ -290,27 +311,27 @@ "faces": { "north": { "uv": [50, 18, 52, 25], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [48, 18, 50, 25], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [54, 18, 56, 25], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [52, 18, 54, 25], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [50, 16, 52, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [52, 16, 54, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -319,10 +340,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-7, 12, -1], "to": [-5, 24, 1], @@ -332,27 +356,27 @@ "faces": { "north": { "uv": [36, 18, 34, 30], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [34, 18, 32, 30], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [40, 18, 38, 30], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [38, 18, 36, 30], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [34, 18, 36, 16], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [36, 16, 38, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -361,10 +385,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [5, 12, -1], "to": [7, 24, 1], @@ -374,27 +401,27 @@ "faces": { "north": { "uv": [26, 2, 28, 14], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [24, 2, 26, 14], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [30, 2, 32, 14], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [28, 2, 30, 14], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [26, 0, 28, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [30, 0, 28, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -403,10 +430,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-1, 23, -1], "to": [1, 30, 1], @@ -416,27 +446,27 @@ "faces": { "north": { "uv": [2, 2, 4, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [0, 2, 2, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [6, 2, 8, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [4, 2, 6, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [2, 0, 4, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [4, 0, 6, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -445,10 +475,13 @@ { "name": "helmet", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-5, 22, -5], "to": [5, 32, 5], @@ -458,27 +491,27 @@ "faces": { "north": { "uv": [8, 16, 16, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [0, 16, 8, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [24, 16, 32, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [16, 16, 24, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [8, 0, 16, 16], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [16, 0, 24, 16], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -487,10 +520,13 @@ { "name": "chestplate", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 15, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-5, 11.25, -3], "to": [5, 23.75, 3], @@ -500,27 +536,27 @@ "faces": { "north": { "uv": [20, 40, 28, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [16, 40, 20, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [32, 40, 40, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [28, 40, 32, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [20, 32, 28, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [28, 32, 36, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -529,10 +565,13 @@ { "name": "left_chestplate", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-9, 19.25, -3], "to": [-3, 25, 3], @@ -542,27 +581,27 @@ "faces": { "north": { "uv": [48, 40, 44, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [44, 40, 40, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [56, 40, 52, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [52, 40, 48, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [44, 39.75, 48, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [52, 32, 48, 39.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -571,10 +610,13 @@ { "name": "left_chestplate", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [3, 19.25, -3], "to": [9, 25, 3], @@ -584,27 +626,27 @@ "faces": { "north": { "uv": [44, 40, 48, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [48, 40, 52, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [52, 40, 56, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [40, 40, 44, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [48, 39.75, 44, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [48, 32, 52, 39.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -613,10 +655,13 @@ { "name": "pants", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-4.5, 11.5, -2.5], "to": [4.5, 17, 2.5], @@ -626,27 +671,27 @@ "faces": { "north": { "uv": [20, 54, 28, 64], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "east": { "uv": [16, 54, 20, 64], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "south": { "uv": [32, 54, 40, 64], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "west": { "uv": [28, 54, 32, 64], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "up": { "uv": [20, 48, 28, 54], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "down": { "uv": [28, 48, 36, 54], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" } }, "type": "cube", @@ -655,10 +700,13 @@ { "name": "right_pants", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-0.5, 2.75, -2.375], "to": [4.25, 12, 2.375], @@ -668,27 +716,27 @@ "faces": { "north": { "uv": [4, 40, 8, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "east": { "uv": [0, 40, 4, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "south": { "uv": [12, 40, 16, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "west": { "uv": [8, 40, 12, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "up": { "uv": [4, 32, 8, 40], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "down": { "uv": [8, 32, 12, 40], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" } }, "type": "cube", @@ -697,10 +745,13 @@ { "name": "left_pants", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-4.25, 2.75, -2.375], "to": [0.5, 12, 2.375], @@ -710,27 +761,27 @@ "faces": { "north": { "uv": [8, 40, 4, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "east": { "uv": [12, 40, 8, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "south": { "uv": [16, 40, 12, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "west": { "uv": [4, 40, 0, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "up": { "uv": [8, 32, 4, 40], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "down": { "uv": [12, 32, 8, 40], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" } }, "type": "cube", @@ -739,10 +790,13 @@ { "name": "right_shoe", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-1, -1, -3], "to": [4.75, 6, 3], @@ -752,27 +806,27 @@ "faces": { "north": { "uv": [4, 52, 8, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [0, 52, 4, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [12, 52, 16, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [8, 52, 12, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [4, 32, 8, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [8, 32, 12, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -781,10 +835,13 @@ { "name": "left_shoe", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-4.75, -1, -3], "to": [1, 6, 3], @@ -794,27 +851,27 @@ "faces": { "north": { "uv": [8, 52, 4, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [12, 52, 8, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [16, 52, 12, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [4, 52, 0, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [8, 32, 4, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [12, 32, 8, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -827,6 +884,7 @@ "ignore_inherited_scale": false, "visibility": true, "locked": false, + "scope": 0, "config": { "use_entity": true, "entity_type": "minecraft:item_display", @@ -845,6 +903,7 @@ "ignore_inherited_scale": false, "visibility": true, "locked": false, + "scope": 0, "config": { "use_entity": true, "entity_type": "minecraft:item_display", @@ -857,11 +916,10 @@ "type": "locator" }, { - "uuid": "c2e217f1-b50a-5c9a-b342-71a35e984046", - "type": "animated_java:text_display", "name": "text_display", "position": [0, 38, 0], "rotation": [0, 0, 0], + "pivotOffset": [0, 0, 0], "scale": [1, 1, 1], "visibility": true, "locked": false, @@ -875,96 +933,663 @@ "onSummonFunction": "", "configs": { "default": { - "on_apply_function": "", + "on_apply_function": "", + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": false, + "glow_color": "#6f114b", + "invisible": false, + "shadow_radius": 0, + "shadow_strength": 1 + }, + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "on_apply_function": "", + "billboard": "vertical", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#6f114b", + "invisible": false, + "shadow_radius": 0, + "shadow_strength": 1 + } + } + }, + "scope": 0, + "uuid": "c2e217f1-b50a-5c9a-b342-71a35e984046", + "type": "animated_java:text_display" + }, + { + "name": "camera", + "position": [0, 27, 0], + "rotation": [0, 0, 0], + "fov": 70, + "aspect_ratio": [16, 9], + "linked_preview": "", + "camera_linked": false, + "visibility": true, + "export": true, + "locked": false, + "scope": 0, + "type": "camera", + "uuid": "3ffeee76-901e-f8a2-c29a-82f90e16fd1e" + }, + { + "name": "item_display", + "position": [6, 12, -4], + "rotation": [-90, 0, 0], + "pivotOffset": [0, 0, 0], + "scale": [0.5, 0.5, 0.5], + "visibility": true, + "locked": false, + "export": true, + "item": "minecraft:diamond", + "itemDisplay": "none", + "onSummonFunction": "", + "configs": { + "default": { + "on_apply_function": "", + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": false, + "glow_color": "#ffffff", + "invisible": false, + "shadow_radius": 0, + "shadow_strength": 1 + }, + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "on_apply_function": "", + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": true, + "glowing": true, + "override_glow_color": true, + "glow_color": "#99ff00", + "invisible": false, + "shadow_radius": 0, + "shadow_strength": 1 + } + } + }, + "scope": 0, + "uuid": "bc141119-7f51-9690-7e21-e119b34fb3a2", + "type": "animated_java:vanilla_item_display" + } + ], + "groups": [ + { + "name": "root", + "uuid": "98795982-9c43-6e3e-eed9-2c776a957938", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 0, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glow_color": "#ffffff", + "glowing": false, + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": {} + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "baseplate_root", + "uuid": "102db36a-eeda-0e6f-d5cc-c186ecda8165", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 0, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glow_color": "#ffffff", + "glowing": false, + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": {} + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "baseplate_pivot_a", + "uuid": "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 1, 6], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glow_color": "#ffffff", + "glowing": false, + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": {} + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "armor_stand_root", + "uuid": "5e08acae-d6ca-0dfd-9360-8cdb13c7a824", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 1, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": {} + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "waist_pivot", + "uuid": "98a28100-07e8-849a-38b7-f56abc2c2e56", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 12, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "5417306e-2c69-3f36-1e3c-edd904034a36": {} + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "body_waist_pivot", + "uuid": "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 12, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "5417306e-2c69-3f36-1e3c-edd904034a36": {} + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "body", + "uuid": "6c53311f-ffc8-e567-ff1b-65840698e9ba", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 24, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "5417306e-2c69-3f36-1e3c-edd904034a36": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": false, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#00ff06", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "head", + "uuid": "808e3c26-7285-af3f-a079-d8b899176dd3", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 23, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#c400ff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "left_arm", + "uuid": "b5b52d2c-097c-08df-6457-372fbae12445", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [-6, 23, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#00ff9f", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "right_arm", + "uuid": "215d1b02-0e64-a794-1b88-a9c5a6d7541c", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [6, 23, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { "billboard": "fixed", "override_brightness": false, "brightness_override": 0, "enchanted": false, "glowing": false, - "override_glow_color": false, - "glow_color": "#6f114b", + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, "invisible": false, + "nbt": "{}", "shadow_radius": 0, - "shadow_strength": 1 + "shadow_strength": 1, + "use_nbt": false }, "variants": { "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "on_apply_function": "", - "billboard": "vertical", + "billboard": "fixed", "override_brightness": false, "brightness_override": 0, "enchanted": false, "glowing": true, "override_glow_color": true, - "glow_color": "#6f114b", + "glow_color": "#ff0000", + "inherit_settings": true, "invisible": false, + "nbt": "{}", "shadow_radius": 0, - "shadow_strength": 1 + "shadow_strength": 1, + "use_nbt": false } } - } - }, - { - "name": "camera", - "position": [0, 27, 0], - "rotation": [0, 0, 0], - "fov": 70, - "aspect_ratio": [16, 9], - "linked_preview": "", - "camera_linked": false, + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, "visibility": true, - "type": "camera", - "uuid": "3ffeee76-901e-f8a2-c29a-82f90e16fd1e" + "autouv": 0, + "isOpen": true, + "primary_selected": false }, { - "uuid": "bc141119-7f51-9690-7e21-e119b34fb3a2", - "type": "animated_java:vanilla_item_display", - "name": "item_display", - "position": [6, 12, -4], - "rotation": [-90, 0, 0], - "scale": [0.5, 0.5, 0.5], - "visibility": true, - "locked": false, + "name": "left_leg", + "uuid": "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69", "export": true, - "item": "minecraft:diamond", - "itemDisplay": "none", + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [2, 12, 0], + "rotation": [0, 0, 0], + "color": 0, "onSummonFunction": "", "configs": { "default": { - "on_apply_function": "", "billboard": "fixed", - "override_brightness": false, "brightness_override": 0, "enchanted": false, - "glowing": false, - "override_glow_color": false, "glow_color": "#ffffff", + "glowing": false, + "inherit_settings": true, "invisible": false, + "nbt": "{}", "shadow_radius": 0, - "shadow_strength": 1 + "shadow_strength": 1, + "use_nbt": false }, "variants": { "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "on_apply_function": "", "billboard": "fixed", "override_brightness": false, "brightness_override": 0, - "enchanted": true, + "enchanted": false, "glowing": true, "override_glow_color": true, - "glow_color": "#99ff00", + "glow_color": "#ffee00", + "inherit_settings": true, "invisible": false, + "nbt": "{}", "shadow_radius": 0, - "shadow_strength": 1 + "shadow_strength": 1, + "use_nbt": false } } - } - } - ], - "outliner": [ + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, { - "name": "root", - "origin": [0, 0, 0], + "name": "right_leg", + "uuid": "60d50d30-a018-429d-ba78-c5fb5804dd8a", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [-2, 12, 0], + "rotation": [0, 0, 0], "color": 0, "onSummonFunction": "", "configs": { @@ -981,238 +1606,65 @@ "shadow_strength": 1, "use_nbt": false }, - "variants": {} + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#6e00ff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } }, - "uuid": "98795982-9c43-6e3e-eed9-2c776a957938", - "export": true, + "children": [], + "reset": false, + "shade": true, "mirror_uv": false, - "isOpen": true, - "locked": false, "visibility": true, "autouv": 0, - "selected": false, + "isOpen": true, + "primary_selected": false + } + ], + "outliner": [ + { + "uuid": "98795982-9c43-6e3e-eed9-2c776a957938", + "isOpen": true, "children": [ { - "name": "baseplate_root", - "origin": [0, 0, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glow_color": "#ffffff", - "glowing": false, - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": {} - }, "uuid": "102db36a-eeda-0e6f-d5cc-c186ecda8165", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ { - "name": "baseplate_pivot_a", - "origin": [0, 1, 6], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glow_color": "#ffffff", - "glowing": false, - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": {} - }, "uuid": "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["46624743-e0ef-5e97-e6d8-ba5dc100baf4"] } ] }, { - "name": "armor_stand_root", - "origin": [0, 1, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": {} - }, "uuid": "5e08acae-d6ca-0dfd-9360-8cdb13c7a824", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ { - "name": "waist_pivot", - "origin": [0, 12, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "5417306e-2c69-3f36-1e3c-edd904034a36": {} - } - }, "uuid": "98a28100-07e8-849a-38b7-f56abc2c2e56", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ { - "name": "body_waist_pivot", - "origin": [0, 12, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "5417306e-2c69-3f36-1e3c-edd904034a36": {} - } - }, "uuid": "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ { - "name": "body", - "origin": [0, 24, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "5417306e-2c69-3f36-1e3c-edd904034a36": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": false, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#00ff06", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "6c53311f-ffc8-e567-ff1b-65840698e9ba", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ "55829f3d-26dc-8f49-39b8-5ba2c0159a24", "9d16df18-0574-58bb-e0f9-f799946257c9", @@ -1221,150 +1673,18 @@ "6dd668dd-27bd-631d-5e44-a94f7a35ddbb", "d5e974ae-a732-db7a-59a1-c16ff717e426", { - "name": "head", - "origin": [0, 23, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#c400ff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "808e3c26-7285-af3f-a079-d8b899176dd3", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["a23d9259-0d9a-4e16-1b42-47e5bedba00f", "a302b268-1699-4013-011f-211bd85806d4", "3ffeee76-901e-f8a2-c29a-82f90e16fd1e"] }, { - "name": "left_arm", - "origin": [-6, 23, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#00ff9f", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "b5b52d2c-097c-08df-6457-372fbae12445", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["c219cb9b-53a7-6a5b-7b47-dce0a1e6ec14", "967c77d0-2607-0ecb-8093-416d237cdb85", "7de415a2-9fdd-e4b2-3455-c3bed72eb896"] }, { - "name": "right_arm", - "origin": [6, 23, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#ff0000", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "215d1b02-0e64-a794-1b88-a9c5a6d7541c", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ "13293700-7f42-2279-6a1f-4e0a6a4d89b3", "98475898-cfc8-f67b-3145-abaf659deb3e", @@ -1377,97 +1697,13 @@ ] }, { - "name": "left_leg", - "origin": [2, 12, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glow_color": "#ffffff", - "glowing": false, - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#ffee00", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["d29efa52-def5-a311-7438-1fc73aac804c", "71bfec99-5014-21d3-739b-6512074212db", "41413d23-edf5-3fdc-2ddb-5fd45ea99a89"] }, { - "name": "right_leg", - "origin": [-2, 12, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glow_color": "#ffffff", - "glowing": false, - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#6e00ff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "60d50d30-a018-429d-ba78-c5fb5804dd8a", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["60766231-bd45-cb3f-0a4f-c6c066e86f54", "4dd0c5f1-828f-d559-6496-16e2fbe6276d", "11976d8b-3994-df35-0fb9-b92ac5012141"] } ] @@ -1480,12 +1716,13 @@ ], "textures": [ { - "path": "", "name": "wood.png", + "path": "", "folder": "", "namespace": "", "id": "0", "group": "", + "scope": 0, "width": 64, "height": 64, "uv_width": 64, @@ -1494,9 +1731,12 @@ "use_as_default": false, "layers_enabled": false, "sync_to_project": "", + "file_format": "png", "render_mode": "default", "render_sides": "auto", + "wrap_mode": "limited", "pbr_channel": "color", + "fps": 7, "frame_time": 1, "frame_order_type": "loop", "frame_order": "", @@ -1508,12 +1748,13 @@ "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAB6xJREFUeF7tW01oXUUUnmebkjZNCU1bjSnVtAUNVks0VK1gEbLowmK6EIOKP3VRKBYNBldqiLoMRIkUurAq+PPEhUpduAiIgkVLMDy1qGCtDY3RmsRH07SxSb3yzfW7OW9y75u5uS/v3WBnc+fnzN8353wzc+a9jPovHHtzv4foRH5S59z79LsZluH7xev7vJOjf6otDesVvo8/dzR2+a8jf6nLV83qNu5+4khBfdlXOePBIGwAPPPInd59u5rVx5//oPA1J2Ar/+SVB72pv/9Rx0+cDq1fzknLvjKfvvaoXnmEizMXVH5qOiivq6nW8dGRMbWybrVCemXVqqAc8kivWrlMawVWVgYz78LFy7oPBPTTULdW7X7yrYpqQubDvvs9OWkMjhNHHBPkRE2AKEtQWI76aPNi/nwAHNuSAEF+b+cHlQXgUNc9WgN+n7ig/piYCsZ39doadc3audWW5ShDgPwdrU06Tu3gClNzNl+/qUBjuPrMNLmk3KaQAbmhU6inHnR+Yp4qF1Prd44e18UEBaCZYMpyxKXM4Y++r6wGgAMwaa4izQH2ieCi1uAAgkgNqF9TW3QxATj6rbgGgANo57Rbqq20fc4GhCjVmiBJcpTAsR55gV8tkz+vDvR+VlkN2N++TZtAlM0zP0qt2+66SZuPZHe59JJQpf1Dw1KhATbSgYkUU2vJASTNKEJFPoIk24pzgAsAlAk7J9i2MZIs2uC5ABpD3qj0idBqf7Zzgg2AN17e40lCJd8QVFt92wIlLbcCYDsn2EiMJ82wQxQGX/FdICmCtvoAkJwAQpX2j7qp5wDbBJd6udUElvoEbeMvAACEZatQrDyJPbv4G4r5E2z1o8adGgCS+hNs9VMLAA9a9CuYAx0/Nxn4IMLuJdua/duoGVzvGvo2iANKqQKcIujc1dEht0mMwXS+yIuaeYagLOot9K5RUgB4vo/j6eFlTJ425eXsq8FTuijqur17V3PB2snbrMtdI/AHlEIL6AGKAwDPCZhF2F1ib9ttwbFZXrp43cZdRF7Y0E6cu0bFt0GYQDGfIsDktVwuNflA+iEXctfQALyw73avafMG3T5tmLZ36pezOl+WI02S4aAgBxl8XzzytTOw0gSiSK7YdRv9J7lrZDh5NMKV4GTYOG9uYRNn5wBsISDw7BHlU8z97BO09FfI6zZMBGGhdw3nlSrVLmG2Ix0y5AE5wYf27NDXaC4QF0HvGPkJ7VVKcteY97rDAbr4+Sm7fFmV+unMb+qGjdeq2cszCmkE5lFu52OH5wFODuDETOcLzgEIdLmZ/sskp0+0WzAgvA5hArRvqjcngM6ZJx2hXI0oecgClCgAipGc9CFKM6H/0nYdt2nuPABYQa4eV1Wustmwi8aEeX9wECtGcjgHyHcIkw8SAyDfBdasrtYqjEC7m52dUcuX+yoNDVi/2nd3r6mt1pqCcpkmGUGO9WRd5EEjCEaYU1ZywGL7CwreBjEwTur4tydVy82bCs7hQ98NB3mQPTc5HUzSrLvjli0aGEwYoKDuzltv1IABvEr7AqnBGXkF5lEWhVA9PntRWOZJWZTHret6V7DZcNLy2Ntgd3e3NzU1pWpq/PdBxBEaGxvVyMiIjqOsrq5O5fP5QMZVvqenJ/aYkoAQu7Ouri6vtbVVVVf7T+dmGB8fD8AZHR3VoMSR7+zsjD2msgPQ3NysVqxYofu9dOmSjldV+USJAHCmp6fV4OCgTseR7+3tTTcAMIGWlhY9QQaYAQGRqzE2NqbNII586jWgr6/Pa2ryvTCTk/4pDaG2dv5r8NDQkOaCOPKp5wBowNatWwtUfmZmJkgjTtMYHh7W8TjyqQdAkiA1wFx9mgc5gCToIr8kOACkxiBXX5Ig4jABkqCrfOo1ABywbt06yXWRcZAgQhz51JMgdwGoM1Sf+z53Am6H2AqpAdgFXOVTrwHkAKwsCU/uArB/5udyOa0B4ABX+SXBAfIojG0OAfs9j8XFjsI2+bJrQDab1e+BcjWlUfOkZ+73UP36+nqt2uYpUNaXZwWZjzoSSPaPfJiPuWMgzbHIXae9vT3RyTFRZScmTLnQFQBSvkCLPrxAA+ibk45PxuntoUfWHFWcp7BFn1HMDq4AwD9K0Bk68OUJhV9/Isg4ff02ubT4+lwVIXCKUt2PffOjdl4iMB5mFlFySR8qXAdeKrkru0AYkngwNf88EefFt1SrU452QjWAvIABwObD/iVWjsGVo49QAOTvezEIl5+alGOwi9FHKADyXyTsdKmRmytYoQBIDuDD5P+KA1zRK5Ncol+v2sZIDWAnSMsOF5JWqr7bb2O8J6Pj5pejcinHeOq71cjbPbpW48NzcabxRTnKGJdlZh7bQr40AQyaE174d0O/p84enGuXaZkfFo8qV8rLvafU9qf6g8XMvXowNM38qC8bkPVLD0BD1lOjHXPtIs3AfCnDeFieX89TDVk18HyHanspqzMQRzDTzAsrhyzbkOVRK80hxzeBjQOeOtM2BwDTMt+MszfWK2zDUxsHtET2QJvqODQQfFnNzHdN0wTCbD4MGPZHUzHTc/nX5fw2T2/PKMTNL2u6lCvl9T/rVzj4vu9k7X9ge6BUyEO62Jd1wur/C4S4j3y2CFhdAAAAAElFTkSuQmCC" }, { - "path": "", "name": "iron_layer_1.png", + "path": "", "folder": "", "namespace": "", "id": "1", "group": "", + "scope": 0, "width": 64, "height": 32, "uv_width": 64, @@ -1522,9 +1763,12 @@ "use_as_default": false, "layers_enabled": false, "sync_to_project": "", + "file_format": "png", "render_mode": "default", "render_sides": "auto", + "wrap_mode": "limited", "pbr_channel": "color", + "fps": 7, "frame_time": 1, "frame_order_type": "loop", "frame_order": "", @@ -1536,12 +1780,13 @@ "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAAAXNSR0IArs4c6QAAA6VJREFUaEPlmb9qMkEUxVcIKCikUBCSTot0yROYwkqf2FQK8Qm0U0g6hYAWAYUEhP34DZzlOqzORqNu/KZJZufuOPfMvef+2UIUGK+vr/F6vXZS5XI5kdazbrdbCO2R5/Xg4QGg1Wo5Hebzufu7Wq3c34+Pj+j5+Tm4x1UAMBgMomq1muhSKpX+DwB6vV78+PgYLRaLaLlcJgAAxufn5/VbgA/A/f19AsL7+3t09RwAAI1GI/r6+nIWIAAqlUr09vZ2/RYACdbrdXfrgIDvozxjPB5fvwUAAMruCoV/3gV2KYjCNu7L8XcBIdm0dRsG7b78f2kAC4rzxHjFd5k7LM8hO51ONJ1OnQtowAff398OpNvbW+caGrjI3d1dNBwO3SObRxBNJJuHPKKQFuYIcbVazfm4MkCAgAxns1miuG7bD5P2fQACAO2lUAqZ5gYAbksHu7m5cUpbU1a2F8dxTELUbrdd9gd4unW5wGazcY8AQZkjAE0mk62EUOu5cAGr8L4D9ft9p7AASEtxBYrlBAFsM0ksLA9h9OR5vIopQLAhFOVzQYLnKlSwDGsVlzZ96X1yCzgXwIf+ThCA0WgUiyDx4aenp+A7hx4my3vKW8Rbx1pSUJnJZBKrDsgLAIRVIsxvkGgQgNlsFitBAohLW4DyFsIqIfvYhkwQAJsqQ2LH/mAWM98nY3MP5E7uAqED76olfKCs7/qJFvN98n79oOw0bZ+f1hpBC8gCAD5JrUBqy2g2m1v+qZ6C1tPkSZVtmKT+eHl5cc+sz2t/v9aAE7SH5LOU60cDYGsJWzzpQBxYxRQAcEOqHZBn6MDiGoopiib2AAAAtXPS7YeHh0RhijGG5JkTubJwxNEAYNr+AXTDHAplpBgtNFWPOrAFSNamqIMCAMZtMwSwPy8Wi6728NcBJMQRvwKAOkbWBbgxO9RF5llIXq03WQygqTiz/r+PA7J+tzgaAFxAxY5ujLI5bUghK28B8d85R7ns+gE/YVXdhiUsNU1lgpqnWYD6Cpi5b7LI26wziwmHSDq0vtURUoUGaSnTsiSVxrLyab9DxHvq/KiT5JMUHSWGtRjJnuvDiwMAn9SNyCSZ68B23b9BIWzjLyxta3/drJot8l1ZkUj0Eh9enAvAorSoLEsrjIiFdSPMJb/LR7WnQJB17GLktGTqXL2CxAL0oYPbIe4SukRamKhdxyKY70s0fjtlDfnyoevOAtJa2jbsiCTTQtGla4NDFdd7/wAIfE5OhlGtmAAAAABJRU5ErkJggg==" }, { - "path": "", "name": "iron_layer_2.png", + "path": "", "folder": "", "namespace": "", "id": "2", "group": "", + "scope": 0, "width": 64, "height": 32, "uv_width": 64, @@ -1550,9 +1795,12 @@ "use_as_default": false, "layers_enabled": false, "sync_to_project": "", + "file_format": "png", "render_mode": "default", "render_sides": "auto", + "wrap_mode": "limited", "pbr_channel": "color", + "fps": 7, "frame_time": 1, "frame_order_type": "loop", "frame_order": "", @@ -1564,12 +1812,13 @@ "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAAAXNSR0IArs4c6QAAAZZJREFUaEPtVruqhDAQjZ1gYSlY+gH+gfZ+sb2fYWEpCDaCgt1eTrhHhlldLsgVNkkajZldmJPzmMh4viLP+zcBgMAAzxEIEvCcAMEEgwSCBDxHIEjAcwKEFAgSCBJQCHRd98KnbdtMkiSmrmunWfLWHACoqsr0fW+GYTBN0/gFQNu2r6IobPNYXgIgVeE8ANQ8dY8ntC994OrMBYZEAACGl+e5GcfRNp+mqQVA75dlsd9xjjMnAIDm0QgAYINZltnmpmmyaQBPwKIvYL/vu63/9pSwDOCNoyGy4YoBEhAA5AQAvHHcMCVA+pPycRxbRnCPpxMMkBJg07xlSkD6g/QAFwalQwK6eeqdjAADyBBpmt8ek28eoCMPzWqT1CnxKSZ1pHLE5v/yXMYuz55ImSMGz7L/L42hhqMzPQJ7mui6rvadqSLrySjW6988YbK353w5OgNE3F5Zlmae5wMEMogyg+lKOV3VP2GytwE4G6TYIG8eJsrU0JKSfqLrAdh/e8xtAJgiB89/hyrdsDzX72cAoeaJlPkBm2JOMHlI974AAAAASUVORK5CYII=" }, { - "path": "", "name": "transparent.png", + "path": "", "folder": "", "namespace": "", "id": "3", "group": "", + "scope": 0, "width": 16, "height": 16, "uv_width": 16, @@ -1578,9 +1827,12 @@ "use_as_default": false, "layers_enabled": false, "sync_to_project": "", + "file_format": "png", "render_mode": "default", "render_sides": "auto", + "wrap_mode": "limited", "pbr_channel": "color", + "fps": 7, "frame_time": 1, "frame_order_type": "loop", "frame_order": "", @@ -1653,6 +1905,7 @@ "selected": false, "saved": true, "path": "", + "scope": 0, "anim_time_update": "", "blend_weight": "", "start_delay": "", @@ -1667,6 +1920,8 @@ "5e08acae-d6ca-0dfd-9360-8cdb13c7a824": { "name": "armor_stand_root", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "position", @@ -1689,13 +1944,15 @@ "6c53311f-ffc8-e567-ff1b-65840698e9ba": { "name": "body", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { "x": "0", - "y": "1 - math.sin(q.life_time * v.walk_speed + 90) * 12.25\n", + "y": "-1 + math.sin(q.life_time * v.walk_speed + 90) * 12.25\n", "z": "0" } ], @@ -1727,13 +1984,15 @@ "808e3c26-7285-af3f-a079-d8b899176dd3": { "name": "head", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { "x": "0", - "y": "1 + math.sin(q.life_time * v.walk_speed + 90) * 12.25", + "y": "-1 - math.sin(q.life_time * v.walk_speed + 90) * 12.25", "z": "0" } ], @@ -1749,12 +2008,14 @@ "b5b52d2c-097c-08df-6457-372fbae12445": { "name": "left_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "math.sin(q.life_time * v.walk_speed) * 8", + "x": "-math.sin(q.life_time * v.walk_speed) * 8", "y": "0", "z": "22.5" } @@ -1770,7 +2031,7 @@ "channel": "position", "data_points": [ { - "x": "2", + "x": "-2", "y": "0", "z": "-math.sin(q.life_time * v.walk_speed) * 2" } @@ -1787,13 +2048,15 @@ "215d1b02-0e64-a794-1b88-a9c5a6d7541c": { "name": "right_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "math.sin(q.life_time * v.walk_speed) * 22.5", - "y": "math.sin(q.life_time * v.walk_speed) * 12.25", + "x": "-math.sin(q.life_time * v.walk_speed) * 22.5", + "y": "-math.sin(q.life_time * v.walk_speed) * 12.25", "z": "math.cos(q.life_time * v.walk_speed * 2) * 6 + 6" } ], @@ -1809,12 +2072,14 @@ "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69": { "name": "left_leg", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-math.sin(q.life_time * v.walk_speed) * 22.5", + "x": "math.sin(q.life_time * v.walk_speed) * 22.5", "y": "0", "z": "0" } @@ -1847,12 +2112,14 @@ "60d50d30-a018-429d-ba78-c5fb5804dd8a": { "name": "right_leg", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "math.sin(q.life_time * v.walk_speed) * 22.5", + "x": "-math.sin(q.life_time * v.walk_speed) * 22.5", "y": "0", "z": "0" } @@ -1885,6 +2152,8 @@ "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0": { "name": "body_waist_pivot", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", @@ -1903,6 +2172,60 @@ "easingArgs": [] } ] + }, + "98795982-9c43-6e3e-eed9-2c776a957938": { + "name": "root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "102db36a-eeda-0e6f-d5cc-c186ecda8165": { + "name": "baseplate_root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c": { + "name": "baseplate_pivot_a", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "98a28100-07e8-849a-38b7-f56abc2c2e56": { + "name": "waist_pivot", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "7de415a2-9fdd-e4b2-3455-c3bed72eb896": { + "name": "left_hand", + "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false + }, + "7747736f-85e2-338f-207e-53f8d3d2fa39": { + "name": "right_hand", + "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false + }, + "c2e217f1-b50a-5c9a-b342-71a35e984046": { + "name": "text_display", + "type": "animated_java:text_display", + "rotation_global": false, + "quaternion_interpolation": false + }, + "3ffeee76-901e-f8a2-c29a-82f90e16fd1e": { + "name": "camera", + "type": "camera", + "rotation_global": false, + "quaternion_interpolation": false + }, + "bc141119-7f51-9690-7e21-e119b34fb3a2": { + "name": "item_display", + "type": "animated_java:vanilla_item_display", + "rotation_global": false, + "quaternion_interpolation": false } } }, @@ -1916,6 +2239,7 @@ "selected": false, "saved": true, "path": "", + "scope": 0, "anim_time_update": "", "blend_weight": "", "start_delay": "", @@ -1925,13 +2249,15 @@ "b5b52d2c-097c-08df-6457-372fbae12445": { "name": "left_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-90\n+ math.sin(q.life_time * 360) * 30", - "y": "-22.5\n+ math.cos(q.life_time * 360) * 30", + "x": "90\n- math.sin(q.life_time * 360) * 30", + "y": "22.5\n- math.cos(q.life_time * 360) * 30", "z": "0" } ], @@ -1947,13 +2273,15 @@ "215d1b02-0e64-a794-1b88-a9c5a6d7541c": { "name": "right_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-90\n+ math.sin(q.life_time * 360) * 30", - "y": "22.5\n- math.cos(q.life_time * 360) * 30", + "x": "90\n- math.sin(q.life_time * 360) * 30", + "y": "-22.5\n+ math.cos(q.life_time * 360) * 30", "z": "0" } ], @@ -1969,6 +2297,8 @@ "7de415a2-9fdd-e4b2-3455-c3bed72eb896": { "name": "left_hand", "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "function", @@ -1995,6 +2325,8 @@ "7747736f-85e2-338f-207e-53f8d3d2fa39": { "name": "right_hand", "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "function", @@ -2021,12 +2353,14 @@ "3b35d1a9-befe-066e-60df-e1f3a5ec5a78": { "name": "pig", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "position", "data_points": [ { - "x": "16 - math.cos(q.life_time * 180) * 16", + "x": "-16 + math.cos(q.life_time * 180) * 16", "y": "16 + math.sin(q.life_time * 360) * 8", "z": "-32" } @@ -2079,6 +2413,84 @@ "easingArgs": [] } ] + }, + "98795982-9c43-6e3e-eed9-2c776a957938": { + "name": "root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "102db36a-eeda-0e6f-d5cc-c186ecda8165": { + "name": "baseplate_root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c": { + "name": "baseplate_pivot_a", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "5e08acae-d6ca-0dfd-9360-8cdb13c7a824": { + "name": "armor_stand_root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "98a28100-07e8-849a-38b7-f56abc2c2e56": { + "name": "waist_pivot", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0": { + "name": "body_waist_pivot", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "6c53311f-ffc8-e567-ff1b-65840698e9ba": { + "name": "body", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "808e3c26-7285-af3f-a079-d8b899176dd3": { + "name": "head", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69": { + "name": "left_leg", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "60d50d30-a018-429d-ba78-c5fb5804dd8a": { + "name": "right_leg", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "c2e217f1-b50a-5c9a-b342-71a35e984046": { + "name": "text_display", + "type": "animated_java:text_display", + "rotation_global": false, + "quaternion_interpolation": false + }, + "3ffeee76-901e-f8a2-c29a-82f90e16fd1e": { + "name": "camera", + "type": "camera", + "rotation_global": false, + "quaternion_interpolation": false + }, + "bc141119-7f51-9690-7e21-e119b34fb3a2": { + "name": "item_display", + "type": "animated_java:vanilla_item_display", + "rotation_global": false, + "quaternion_interpolation": false } } }, @@ -2092,6 +2504,7 @@ "selected": true, "saved": true, "path": "", + "scope": 0, "anim_time_update": "", "blend_weight": "", "start_delay": "", @@ -2101,12 +2514,14 @@ "bc141119-7f51-9690-7e21-e119b34fb3a2": { "name": "item_display", "type": "animated_java:vanilla_item_display", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "position", "data_points": [ { - "x": "math.sin(q.life_time * 360 * 8) * 32", + "x": "-math.sin(q.life_time * 360 * 8) * 32", "y": "0", "z": "math.cos(q.life_time * 360 * 8) * 32" } @@ -2123,13 +2538,15 @@ "c2e217f1-b50a-5c9a-b342-71a35e984046": { "name": "text_display", "type": "animated_java:text_display", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "math.sin(q.life_time * 360) * 2", - "y": "math.cos(q.life_time * 360) * 2", + "x": "-math.sin(q.life_time * 360) * 2", + "y": "-math.cos(q.life_time * 360) * 2", "z": "0" } ], @@ -2178,6 +2595,8 @@ "808e3c26-7285-af3f-a079-d8b899176dd3": { "name": "head", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "position", @@ -2296,6 +2715,90 @@ "easingArgs": [1] } ] + }, + "98795982-9c43-6e3e-eed9-2c776a957938": { + "name": "root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "102db36a-eeda-0e6f-d5cc-c186ecda8165": { + "name": "baseplate_root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c": { + "name": "baseplate_pivot_a", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "5e08acae-d6ca-0dfd-9360-8cdb13c7a824": { + "name": "armor_stand_root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "98a28100-07e8-849a-38b7-f56abc2c2e56": { + "name": "waist_pivot", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0": { + "name": "body_waist_pivot", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "6c53311f-ffc8-e567-ff1b-65840698e9ba": { + "name": "body", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "b5b52d2c-097c-08df-6457-372fbae12445": { + "name": "left_arm", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "215d1b02-0e64-a794-1b88-a9c5a6d7541c": { + "name": "right_arm", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69": { + "name": "left_leg", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "60d50d30-a018-429d-ba78-c5fb5804dd8a": { + "name": "right_leg", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "7de415a2-9fdd-e4b2-3455-c3bed72eb896": { + "name": "left_hand", + "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false + }, + "7747736f-85e2-338f-207e-53f8d3d2fa39": { + "name": "right_hand", + "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false + }, + "3ffeee76-901e-f8a2-c29a-82f90e16fd1e": { + "name": "camera", + "type": "camera", + "rotation_global": false, + "quaternion_interpolation": false } } } diff --git a/test-packs/1.21.4/datapacks/test-framework/src/test.mcb b/test-packs/1.21.4/datapacks/test-framework/src/test.mcb index 57cbd78c..e738ea44 100644 --- a/test-packs/1.21.4/datapacks/test-framework/src/test.mcb +++ b/test-packs/1.21.4/datapacks/test-framework/src/test.mcb @@ -1,9 +1,122 @@ function on_load minecraft:load { - tellraw @a {text:'Test Framework loaded!', color:green} + tellraw @a {"text":"Test Framework loaded!", "color":"green"} } -function summon { - #ARGS: {args:{...}} - function animated_java:armor_stand/remove/all - $execute positioned 0 -63 0 rotated 0 0 run function animated_java:armor_stand/summon {args:$(args)} +# clock 1s 1t { +# execute store result score #count aj.i if entity @e[type=item_display,tag=aj.global.root] +# title @a actionbar [{"text":"Rig Count: "}, {"score":{"name":"#count","objective":"aj.i"}}] +# } + +dir armor_stand { + function test { + scoreboard players set #failed_tests aj.i 0 + execute as @e[tag=aj.armor_stand.root] run { + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_locator {name:'left_hand',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"as_locator test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/at_locator {name:'left_hand',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"at_locator test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_at_locator {name:'left_hand',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"as_at_locator test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_all_locators {command:'scoreboard players add #test aj.i 1'} + execute unless score #test aj.i matches 2 run { + tellraw @a {"text":"as_all_locators test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/at_all_locators {command:'scoreboard players add #test aj.i 1'} + execute unless score #test aj.i matches 2 run { + tellraw @a {"text":"at_all_locators test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_at_all_locators {command:'scoreboard players add #test aj.i 1'} + execute unless score #test aj.i matches 2 run { + tellraw @a {"text":"as_at_all_locators test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_camera {name:'camera',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"as_camera test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_node {name:'head',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"as_node test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + } + + execute if score #failed_tests aj.i matches 0 run { + tellraw @a {"text":"All tests passed!","color":"green"} + } + + execute if score #failed_tests aj.i matches 1.. run { + tellraw @a [{"score":{"name":"#failed_tests","objective":"aj.i"}}, {"text":" tests failed!","color":"red"}] + } + } + + function summon { + #ARGS: {args:{...}} + function animated_java:global/remove/everything + $execute positioned 0 1 0 rotated 0 0 run function animated_java:armor_stand/summon {args:$(args)} + } + + function summon_minimal { + #ARGS: {args:{...}} + function animated_java:global/remove/everything + $execute positioned 0 1 0 rotated 0 0 run function animated_java:armor_stand_minimal/summon {args:$(args)} + } + + function summon_many { + data remove storage test:temp args + $data modify storage test:temp args set value {args:$(args)} + REPEAT (0, 199) as i { + schedule 1t { + execute positioned <%i % 16%> 1 <%Math.floor(i / 16)%> rotated 0 0 run function animated_java:armor_stand/summon with storage test:temp args + } + } + } + + function summon_many_minimal { + data remove storage test:temp args + $data modify storage test:temp args set value {args:$(args)} + REPEAT (0, 199) as i { + schedule 1t { + execute positioned <%i % 16%> 1 <%Math.floor(i / 16)%> rotated 0 0 run function animated_java:armor_stand_minimal/summon with storage test:temp args + } + } + } } + +clock debug 1t { + title @a actionbar [ \ + "p:", {"score":{"name":"#aj.data_manager.preps_this_tick","objective":"aj.i"}}, \ + " r:", {"score":{"name":"#aj.data_manager.reads_this_tick","objective":"aj.i"}}, \ + " w:", {"score":{"name":"#aj.data_manager.writes_this_tick","objective":"aj.i"}} \ + ] + scoreboard players set #aj.data_manager.preps_this_tick aj.i 0 + scoreboard players set #aj.data_manager.reads_this_tick aj.i 0 + scoreboard players set #aj.data_manager.writes_this_tick aj.i 0 +} \ No newline at end of file diff --git a/test-packs/1.21.5/blueprints/armor_stand_1.21.5.ajblueprint b/test-packs/1.21.5/blueprints/armor_stand_1.21.5.ajblueprint index 3e22b15b..eb411e4b 100644 --- a/test-packs/1.21.5/blueprints/armor_stand_1.21.5.ajblueprint +++ b/test-packs/1.21.5/blueprints/armor_stand_1.21.5.ajblueprint @@ -1,9 +1,9 @@ { "meta": { "format": "animated-java:format/blueprint", - "format_version": "1.8.0-beta.2", + "format_version": "1.10.0-beta.1", "uuid": "167b27cd-b559-3f13-a97c-0841fe21f1d1", - "save_location": "D:\\github-repos\\animated-java\\old-animated-java\\test-packs\\1.21.5\\blueprints\\armor_stand_1.21.5.ajblueprint", + "save_location": "/var/mnt/ssd2/repos/animated-java/animated-java/test-packs/1.21.5/blueprints/armor_stand_1.21.5.ajblueprint", "last_used_export_namespace": "armor_stand" }, "resolution": { @@ -25,10 +25,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-6, 0, -6], "to": [6, 1, 6], @@ -38,27 +41,27 @@ "faces": { "north": { "uv": [12, 44, 24, 45], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [0, 44, 12, 45], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [36, 44, 48, 45], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [24, 44, 36, 45], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [12, 32, 24, 44], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [24, 32, 36, 44], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -67,10 +70,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-4, 12, -1], "to": [4, 14, 1], @@ -80,27 +86,27 @@ "faces": { "north": { "uv": [2, 50, 10, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [0, 50, 2, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [12, 50, 20, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [10, 50, 12, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [2, 50, 10, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [10, 48, 18, 50], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -109,10 +115,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [1, 1, -1], "to": [3, 12, 1], @@ -122,27 +131,27 @@ "faces": { "north": { "uv": [10, 2, 12, 13], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [12, 2, 14, 13], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [14, 2, 16, 13], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [8, 2, 10, 13], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [10, 0, 12, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [12, 0, 14, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -151,10 +160,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-3, 1, -1], "to": [-1, 12, 1], @@ -164,27 +176,27 @@ "faces": { "north": { "uv": [44, 18, 42, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [46, 18, 44, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [48, 18, 46, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [42, 18, 40, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [42, 16, 44, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [44, 16, 46, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -193,10 +205,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-6, 21, -1.5], "to": [6, 24, 1.5], @@ -206,27 +221,27 @@ "faces": { "north": { "uv": [3, 29, 15, 32], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [0, 29, 3, 32], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [18, 29, 30, 32], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [15, 29, 18, 32], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [3, 26, 15, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [15, 26, 27, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -235,10 +250,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [1, 14, -1], "to": [3, 21, 1], @@ -248,27 +266,27 @@ "faces": { "north": { "uv": [18, 2, 20, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [16, 2, 18, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [22, 2, 24, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [20, 2, 22, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [18, 0, 20, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [20, 0, 22, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -277,10 +295,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-3, 14, -1], "to": [-1, 21, 1], @@ -290,27 +311,27 @@ "faces": { "north": { "uv": [50, 18, 52, 25], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [48, 18, 50, 25], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [54, 18, 56, 25], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [52, 18, 54, 25], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [50, 16, 52, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [52, 16, 54, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -319,10 +340,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-7, 12, -1], "to": [-5, 24, 1], @@ -332,27 +356,27 @@ "faces": { "north": { "uv": [36, 18, 34, 30], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [34, 18, 32, 30], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [40, 18, 38, 30], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [38, 18, 36, 30], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [34, 18, 36, 16], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [36, 16, 38, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -361,10 +385,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [5, 12, -1], "to": [7, 24, 1], @@ -374,27 +401,27 @@ "faces": { "north": { "uv": [26, 2, 28, 14], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [24, 2, 26, 14], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [30, 2, 32, 14], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [28, 2, 30, 14], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [26, 0, 28, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [30, 0, 28, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -403,10 +430,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-1, 23, -1], "to": [1, 30, 1], @@ -416,27 +446,27 @@ "faces": { "north": { "uv": [2, 2, 4, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [0, 2, 2, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [6, 2, 8, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [4, 2, 6, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [2, 0, 4, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [4, 0, 6, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -445,10 +475,13 @@ { "name": "helmet", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-5, 22, -5], "to": [5, 32, 5], @@ -458,27 +491,27 @@ "faces": { "north": { "uv": [8, 16, 16, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [0, 16, 8, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [24, 16, 32, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [16, 16, 24, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [8, 0, 16, 16], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [16, 0, 24, 16], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -487,10 +520,13 @@ { "name": "chestplate", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 15, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-5, 11.25, -3], "to": [5, 23.75, 3], @@ -500,27 +536,27 @@ "faces": { "north": { "uv": [20, 40, 28, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [16, 40, 20, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [32, 40, 40, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [28, 40, 32, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [20, 32, 28, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [28, 32, 36, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -529,10 +565,13 @@ { "name": "left_chestplate", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-9, 19.25, -3], "to": [-3, 25, 3], @@ -542,27 +581,27 @@ "faces": { "north": { "uv": [48, 40, 44, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [44, 40, 40, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [56, 40, 52, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [52, 40, 48, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [44, 39.75, 48, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [52, 32, 48, 39.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -571,10 +610,13 @@ { "name": "left_chestplate", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [3, 19.25, -3], "to": [9, 25, 3], @@ -584,27 +626,27 @@ "faces": { "north": { "uv": [44, 40, 48, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [48, 40, 52, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [52, 40, 56, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [40, 40, 44, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [48, 39.75, 44, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [48, 32, 52, 39.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -613,10 +655,13 @@ { "name": "pants", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-4.5, 11.5, -2.5], "to": [4.5, 17, 2.5], @@ -626,27 +671,27 @@ "faces": { "north": { "uv": [20, 54, 28, 64], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "east": { "uv": [16, 54, 20, 64], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "south": { "uv": [32, 54, 40, 64], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "west": { "uv": [28, 54, 32, 64], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "up": { "uv": [20, 48, 28, 54], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "down": { "uv": [28, 48, 36, 54], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" } }, "type": "cube", @@ -655,10 +700,13 @@ { "name": "right_pants", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-0.5, 2.75, -2.375], "to": [4.25, 12, 2.375], @@ -668,27 +716,27 @@ "faces": { "north": { "uv": [4, 40, 8, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "east": { "uv": [0, 40, 4, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "south": { "uv": [12, 40, 16, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "west": { "uv": [8, 40, 12, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "up": { "uv": [4, 32, 8, 40], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "down": { "uv": [8, 32, 12, 40], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" } }, "type": "cube", @@ -697,10 +745,13 @@ { "name": "left_pants", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-4.25, 2.75, -2.375], "to": [0.5, 12, 2.375], @@ -710,27 +761,27 @@ "faces": { "north": { "uv": [8, 40, 4, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "east": { "uv": [12, 40, 8, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "south": { "uv": [16, 40, 12, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "west": { "uv": [4, 40, 0, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "up": { "uv": [8, 32, 4, 40], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "down": { "uv": [12, 32, 8, 40], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" } }, "type": "cube", @@ -739,10 +790,13 @@ { "name": "right_shoe", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-1, -1, -3], "to": [4.75, 6, 3], @@ -752,27 +806,27 @@ "faces": { "north": { "uv": [4, 52, 8, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [0, 52, 4, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [12, 52, 16, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [8, 52, 12, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [4, 32, 8, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [8, 32, 12, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -781,10 +835,13 @@ { "name": "left_shoe", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-4.75, -1, -3], "to": [1, 6, 3], @@ -794,27 +851,27 @@ "faces": { "north": { "uv": [8, 52, 4, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [12, 52, 8, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [16, 52, 12, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [4, 52, 0, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [8, 32, 4, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [12, 32, 8, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -827,6 +884,7 @@ "ignore_inherited_scale": false, "visibility": true, "locked": false, + "scope": 0, "config": { "use_entity": true, "entity_type": "minecraft:item_display", @@ -845,6 +903,7 @@ "ignore_inherited_scale": false, "visibility": true, "locked": false, + "scope": 0, "config": { "use_entity": true, "entity_type": "minecraft:item_display", @@ -857,11 +916,10 @@ "type": "locator" }, { - "uuid": "c2e217f1-b50a-5c9a-b342-71a35e984046", - "type": "animated_java:text_display", "name": "text_display", "position": [0, 38, 0], "rotation": [0, 0, 0], + "pivotOffset": [0, 0, 0], "scale": [1, 1, 1], "visibility": true, "locked": false, @@ -875,96 +933,663 @@ "onSummonFunction": "", "configs": { "default": { - "on_apply_function": "", + "on_apply_function": "", + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": false, + "glow_color": "#6f114b", + "invisible": false, + "shadow_radius": 0, + "shadow_strength": 1 + }, + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "on_apply_function": "", + "billboard": "vertical", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#6f114b", + "invisible": false, + "shadow_radius": 0, + "shadow_strength": 1 + } + } + }, + "scope": 0, + "uuid": "c2e217f1-b50a-5c9a-b342-71a35e984046", + "type": "animated_java:text_display" + }, + { + "name": "camera", + "position": [0, 27, 0], + "rotation": [0, 0, 0], + "fov": 70, + "aspect_ratio": [16, 9], + "linked_preview": "", + "camera_linked": false, + "visibility": true, + "export": true, + "locked": false, + "scope": 0, + "type": "camera", + "uuid": "3ffeee76-901e-f8a2-c29a-82f90e16fd1e" + }, + { + "name": "item_display", + "position": [6, 12, -4], + "rotation": [-90, 0, 0], + "pivotOffset": [0, 0, 0], + "scale": [0.5, 0.5, 0.5], + "visibility": true, + "locked": false, + "export": true, + "item": "minecraft:diamond", + "itemDisplay": "none", + "onSummonFunction": "", + "configs": { + "default": { + "on_apply_function": "", + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": false, + "glow_color": "#ffffff", + "invisible": false, + "shadow_radius": 0, + "shadow_strength": 1 + }, + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "on_apply_function": "", + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": true, + "glowing": true, + "override_glow_color": true, + "glow_color": "#99ff00", + "invisible": false, + "shadow_radius": 0, + "shadow_strength": 1 + } + } + }, + "scope": 0, + "uuid": "bc141119-7f51-9690-7e21-e119b34fb3a2", + "type": "animated_java:vanilla_item_display" + } + ], + "groups": [ + { + "name": "root", + "uuid": "98795982-9c43-6e3e-eed9-2c776a957938", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 0, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glow_color": "#ffffff", + "glowing": false, + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": {} + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "baseplate_root", + "uuid": "102db36a-eeda-0e6f-d5cc-c186ecda8165", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 0, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glow_color": "#ffffff", + "glowing": false, + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": {} + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "baseplate_pivot_a", + "uuid": "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 1, 6], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glow_color": "#ffffff", + "glowing": false, + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": {} + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "armor_stand_root", + "uuid": "5e08acae-d6ca-0dfd-9360-8cdb13c7a824", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 1, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": {} + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "waist_pivot", + "uuid": "98a28100-07e8-849a-38b7-f56abc2c2e56", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 12, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "5417306e-2c69-3f36-1e3c-edd904034a36": {} + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "body_waist_pivot", + "uuid": "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 12, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "5417306e-2c69-3f36-1e3c-edd904034a36": {} + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "body", + "uuid": "6c53311f-ffc8-e567-ff1b-65840698e9ba", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 24, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "5417306e-2c69-3f36-1e3c-edd904034a36": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": false, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#00ff06", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "head", + "uuid": "808e3c26-7285-af3f-a079-d8b899176dd3", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 23, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#c400ff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "left_arm", + "uuid": "b5b52d2c-097c-08df-6457-372fbae12445", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [-6, 23, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#00ff9f", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "right_arm", + "uuid": "215d1b02-0e64-a794-1b88-a9c5a6d7541c", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [6, 23, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { "billboard": "fixed", "override_brightness": false, "brightness_override": 0, "enchanted": false, "glowing": false, - "override_glow_color": false, - "glow_color": "#6f114b", + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, "invisible": false, + "nbt": "{}", "shadow_radius": 0, - "shadow_strength": 1 + "shadow_strength": 1, + "use_nbt": false }, "variants": { "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "on_apply_function": "", - "billboard": "vertical", + "billboard": "fixed", "override_brightness": false, "brightness_override": 0, "enchanted": false, "glowing": true, "override_glow_color": true, - "glow_color": "#6f114b", + "glow_color": "#ff0000", + "inherit_settings": true, "invisible": false, + "nbt": "{}", "shadow_radius": 0, - "shadow_strength": 1 + "shadow_strength": 1, + "use_nbt": false } } - } - }, - { - "name": "camera", - "position": [0, 27, 0], - "rotation": [0, 0, 0], - "fov": 70, - "aspect_ratio": [16, 9], - "linked_preview": "", - "camera_linked": false, + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, "visibility": true, - "type": "camera", - "uuid": "3ffeee76-901e-f8a2-c29a-82f90e16fd1e" + "autouv": 0, + "isOpen": true, + "primary_selected": false }, { - "uuid": "bc141119-7f51-9690-7e21-e119b34fb3a2", - "type": "animated_java:vanilla_item_display", - "name": "item_display", - "position": [6, 12, -4], - "rotation": [-90, 0, 0], - "scale": [0.5, 0.5, 0.5], - "visibility": true, - "locked": false, + "name": "left_leg", + "uuid": "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69", "export": true, - "item": "minecraft:diamond", - "itemDisplay": "none", + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [2, 12, 0], + "rotation": [0, 0, 0], + "color": 0, "onSummonFunction": "", "configs": { "default": { - "on_apply_function": "", "billboard": "fixed", - "override_brightness": false, "brightness_override": 0, "enchanted": false, - "glowing": false, - "override_glow_color": false, "glow_color": "#ffffff", + "glowing": false, + "inherit_settings": true, "invisible": false, + "nbt": "{}", "shadow_radius": 0, - "shadow_strength": 1 + "shadow_strength": 1, + "use_nbt": false }, "variants": { "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "on_apply_function": "", "billboard": "fixed", "override_brightness": false, "brightness_override": 0, - "enchanted": true, + "enchanted": false, "glowing": true, "override_glow_color": true, - "glow_color": "#99ff00", + "glow_color": "#ffee00", + "inherit_settings": true, "invisible": false, + "nbt": "{}", "shadow_radius": 0, - "shadow_strength": 1 + "shadow_strength": 1, + "use_nbt": false } } - } - } - ], - "outliner": [ + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, { - "name": "root", - "origin": [0, 0, 0], + "name": "right_leg", + "uuid": "60d50d30-a018-429d-ba78-c5fb5804dd8a", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [-2, 12, 0], + "rotation": [0, 0, 0], "color": 0, "onSummonFunction": "", "configs": { @@ -981,238 +1606,65 @@ "shadow_strength": 1, "use_nbt": false }, - "variants": {} + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#6e00ff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } }, - "uuid": "98795982-9c43-6e3e-eed9-2c776a957938", - "export": true, + "children": [], + "reset": false, + "shade": true, "mirror_uv": false, - "isOpen": true, - "locked": false, "visibility": true, "autouv": 0, - "selected": false, + "isOpen": true, + "primary_selected": false + } + ], + "outliner": [ + { + "uuid": "98795982-9c43-6e3e-eed9-2c776a957938", + "isOpen": true, "children": [ { - "name": "baseplate_root", - "origin": [0, 0, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glow_color": "#ffffff", - "glowing": false, - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": {} - }, "uuid": "102db36a-eeda-0e6f-d5cc-c186ecda8165", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ { - "name": "baseplate_pivot_a", - "origin": [0, 1, 6], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glow_color": "#ffffff", - "glowing": false, - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": {} - }, "uuid": "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["46624743-e0ef-5e97-e6d8-ba5dc100baf4"] } ] }, { - "name": "armor_stand_root", - "origin": [0, 1, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": {} - }, "uuid": "5e08acae-d6ca-0dfd-9360-8cdb13c7a824", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ { - "name": "waist_pivot", - "origin": [0, 12, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "5417306e-2c69-3f36-1e3c-edd904034a36": {} - } - }, "uuid": "98a28100-07e8-849a-38b7-f56abc2c2e56", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ { - "name": "body_waist_pivot", - "origin": [0, 12, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "5417306e-2c69-3f36-1e3c-edd904034a36": {} - } - }, "uuid": "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ { - "name": "body", - "origin": [0, 24, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "5417306e-2c69-3f36-1e3c-edd904034a36": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": false, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#00ff06", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "6c53311f-ffc8-e567-ff1b-65840698e9ba", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ "55829f3d-26dc-8f49-39b8-5ba2c0159a24", "9d16df18-0574-58bb-e0f9-f799946257c9", @@ -1221,150 +1673,18 @@ "6dd668dd-27bd-631d-5e44-a94f7a35ddbb", "d5e974ae-a732-db7a-59a1-c16ff717e426", { - "name": "head", - "origin": [0, 23, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#c400ff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "808e3c26-7285-af3f-a079-d8b899176dd3", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["a23d9259-0d9a-4e16-1b42-47e5bedba00f", "a302b268-1699-4013-011f-211bd85806d4", "3ffeee76-901e-f8a2-c29a-82f90e16fd1e"] }, { - "name": "left_arm", - "origin": [-6, 23, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#00ff9f", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "b5b52d2c-097c-08df-6457-372fbae12445", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["c219cb9b-53a7-6a5b-7b47-dce0a1e6ec14", "967c77d0-2607-0ecb-8093-416d237cdb85", "7de415a2-9fdd-e4b2-3455-c3bed72eb896"] }, { - "name": "right_arm", - "origin": [6, 23, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#ff0000", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "215d1b02-0e64-a794-1b88-a9c5a6d7541c", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ "13293700-7f42-2279-6a1f-4e0a6a4d89b3", "98475898-cfc8-f67b-3145-abaf659deb3e", @@ -1377,97 +1697,13 @@ ] }, { - "name": "left_leg", - "origin": [2, 12, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glow_color": "#ffffff", - "glowing": false, - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#ffee00", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["d29efa52-def5-a311-7438-1fc73aac804c", "71bfec99-5014-21d3-739b-6512074212db", "41413d23-edf5-3fdc-2ddb-5fd45ea99a89"] }, { - "name": "right_leg", - "origin": [-2, 12, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glow_color": "#ffffff", - "glowing": false, - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#6e00ff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "60d50d30-a018-429d-ba78-c5fb5804dd8a", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["60766231-bd45-cb3f-0a4f-c6c066e86f54", "4dd0c5f1-828f-d559-6496-16e2fbe6276d", "11976d8b-3994-df35-0fb9-b92ac5012141"] } ] @@ -1480,12 +1716,13 @@ ], "textures": [ { - "path": "", "name": "wood.png", + "path": "", "folder": "", "namespace": "", "id": "0", "group": "", + "scope": 0, "width": 64, "height": 64, "uv_width": 64, @@ -1494,9 +1731,12 @@ "use_as_default": false, "layers_enabled": false, "sync_to_project": "", + "file_format": "png", "render_mode": "default", "render_sides": "auto", + "wrap_mode": "limited", "pbr_channel": "color", + "fps": 7, "frame_time": 1, "frame_order_type": "loop", "frame_order": "", @@ -1508,12 +1748,13 @@ "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAB6xJREFUeF7tW01oXUUUnmebkjZNCU1bjSnVtAUNVks0VK1gEbLowmK6EIOKP3VRKBYNBldqiLoMRIkUurAq+PPEhUpduAiIgkVLMDy1qGCtDY3RmsRH07SxSb3yzfW7OW9y75u5uS/v3WBnc+fnzN8353wzc+a9jPovHHtzv4foRH5S59z79LsZluH7xev7vJOjf6otDesVvo8/dzR2+a8jf6nLV83qNu5+4khBfdlXOePBIGwAPPPInd59u5rVx5//oPA1J2Ar/+SVB72pv/9Rx0+cDq1fzknLvjKfvvaoXnmEizMXVH5qOiivq6nW8dGRMbWybrVCemXVqqAc8kivWrlMawVWVgYz78LFy7oPBPTTULdW7X7yrYpqQubDvvs9OWkMjhNHHBPkRE2AKEtQWI76aPNi/nwAHNuSAEF+b+cHlQXgUNc9WgN+n7ig/piYCsZ39doadc3audWW5ShDgPwdrU06Tu3gClNzNl+/qUBjuPrMNLmk3KaQAbmhU6inHnR+Yp4qF1Prd44e18UEBaCZYMpyxKXM4Y++r6wGgAMwaa4izQH2ieCi1uAAgkgNqF9TW3QxATj6rbgGgANo57Rbqq20fc4GhCjVmiBJcpTAsR55gV8tkz+vDvR+VlkN2N++TZtAlM0zP0qt2+66SZuPZHe59JJQpf1Dw1KhATbSgYkUU2vJASTNKEJFPoIk24pzgAsAlAk7J9i2MZIs2uC5ABpD3qj0idBqf7Zzgg2AN17e40lCJd8QVFt92wIlLbcCYDsn2EiMJ82wQxQGX/FdICmCtvoAkJwAQpX2j7qp5wDbBJd6udUElvoEbeMvAACEZatQrDyJPbv4G4r5E2z1o8adGgCS+hNs9VMLAA9a9CuYAx0/Nxn4IMLuJdua/duoGVzvGvo2iANKqQKcIujc1dEht0mMwXS+yIuaeYagLOot9K5RUgB4vo/j6eFlTJ425eXsq8FTuijqur17V3PB2snbrMtdI/AHlEIL6AGKAwDPCZhF2F1ib9ttwbFZXrp43cZdRF7Y0E6cu0bFt0GYQDGfIsDktVwuNflA+iEXctfQALyw73avafMG3T5tmLZ36pezOl+WI02S4aAgBxl8XzzytTOw0gSiSK7YdRv9J7lrZDh5NMKV4GTYOG9uYRNn5wBsISDw7BHlU8z97BO09FfI6zZMBGGhdw3nlSrVLmG2Ix0y5AE5wYf27NDXaC4QF0HvGPkJ7VVKcteY97rDAbr4+Sm7fFmV+unMb+qGjdeq2cszCmkE5lFu52OH5wFODuDETOcLzgEIdLmZ/sskp0+0WzAgvA5hArRvqjcngM6ZJx2hXI0oecgClCgAipGc9CFKM6H/0nYdt2nuPABYQa4eV1Wustmwi8aEeX9wECtGcjgHyHcIkw8SAyDfBdasrtYqjEC7m52dUcuX+yoNDVi/2nd3r6mt1pqCcpkmGUGO9WRd5EEjCEaYU1ZywGL7CwreBjEwTur4tydVy82bCs7hQ98NB3mQPTc5HUzSrLvjli0aGEwYoKDuzltv1IABvEr7AqnBGXkF5lEWhVA9PntRWOZJWZTHret6V7DZcNLy2Ntgd3e3NzU1pWpq/PdBxBEaGxvVyMiIjqOsrq5O5fP5QMZVvqenJ/aYkoAQu7Ouri6vtbVVVVf7T+dmGB8fD8AZHR3VoMSR7+zsjD2msgPQ3NysVqxYofu9dOmSjldV+USJAHCmp6fV4OCgTseR7+3tTTcAMIGWlhY9QQaYAQGRqzE2NqbNII586jWgr6/Pa2ryvTCTk/4pDaG2dv5r8NDQkOaCOPKp5wBowNatWwtUfmZmJkgjTtMYHh7W8TjyqQdAkiA1wFx9mgc5gCToIr8kOACkxiBXX5Ig4jABkqCrfOo1ABywbt06yXWRcZAgQhz51JMgdwGoM1Sf+z53Am6H2AqpAdgFXOVTrwHkAKwsCU/uArB/5udyOa0B4ABX+SXBAfIojG0OAfs9j8XFjsI2+bJrQDab1e+BcjWlUfOkZ+73UP36+nqt2uYpUNaXZwWZjzoSSPaPfJiPuWMgzbHIXae9vT3RyTFRZScmTLnQFQBSvkCLPrxAA+ibk45PxuntoUfWHFWcp7BFn1HMDq4AwD9K0Bk68OUJhV9/Isg4ff02ubT4+lwVIXCKUt2PffOjdl4iMB5mFlFySR8qXAdeKrkru0AYkngwNf88EefFt1SrU452QjWAvIABwObD/iVWjsGVo49QAOTvezEIl5+alGOwi9FHKADyXyTsdKmRmytYoQBIDuDD5P+KA1zRK5Ncol+v2sZIDWAnSMsOF5JWqr7bb2O8J6Pj5pejcinHeOq71cjbPbpW48NzcabxRTnKGJdlZh7bQr40AQyaE174d0O/p84enGuXaZkfFo8qV8rLvafU9qf6g8XMvXowNM38qC8bkPVLD0BD1lOjHXPtIs3AfCnDeFieX89TDVk18HyHanspqzMQRzDTzAsrhyzbkOVRK80hxzeBjQOeOtM2BwDTMt+MszfWK2zDUxsHtET2QJvqODQQfFnNzHdN0wTCbD4MGPZHUzHTc/nX5fw2T2/PKMTNL2u6lCvl9T/rVzj4vu9k7X9ge6BUyEO62Jd1wur/C4S4j3y2CFhdAAAAAElFTkSuQmCC" }, { - "path": "", "name": "iron_layer_1.png", + "path": "", "folder": "", "namespace": "", "id": "1", "group": "", + "scope": 0, "width": 64, "height": 32, "uv_width": 64, @@ -1522,9 +1763,12 @@ "use_as_default": false, "layers_enabled": false, "sync_to_project": "", + "file_format": "png", "render_mode": "default", "render_sides": "auto", + "wrap_mode": "limited", "pbr_channel": "color", + "fps": 7, "frame_time": 1, "frame_order_type": "loop", "frame_order": "", @@ -1536,12 +1780,13 @@ "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAAAXNSR0IArs4c6QAAA6VJREFUaEPlmb9qMkEUxVcIKCikUBCSTot0yROYwkqf2FQK8Qm0U0g6hYAWAYUEhP34DZzlOqzORqNu/KZJZufuOPfMvef+2UIUGK+vr/F6vXZS5XI5kdazbrdbCO2R5/Xg4QGg1Wo5Hebzufu7Wq3c34+Pj+j5+Tm4x1UAMBgMomq1muhSKpX+DwB6vV78+PgYLRaLaLlcJgAAxufn5/VbgA/A/f19AsL7+3t09RwAAI1GI/r6+nIWIAAqlUr09vZ2/RYACdbrdXfrgIDvozxjPB5fvwUAAMruCoV/3gV2KYjCNu7L8XcBIdm0dRsG7b78f2kAC4rzxHjFd5k7LM8hO51ONJ1OnQtowAff398OpNvbW+caGrjI3d1dNBwO3SObRxBNJJuHPKKQFuYIcbVazfm4MkCAgAxns1miuG7bD5P2fQACAO2lUAqZ5gYAbksHu7m5cUpbU1a2F8dxTELUbrdd9gd4unW5wGazcY8AQZkjAE0mk62EUOu5cAGr8L4D9ft9p7AASEtxBYrlBAFsM0ksLA9h9OR5vIopQLAhFOVzQYLnKlSwDGsVlzZ96X1yCzgXwIf+ThCA0WgUiyDx4aenp+A7hx4my3vKW8Rbx1pSUJnJZBKrDsgLAIRVIsxvkGgQgNlsFitBAohLW4DyFsIqIfvYhkwQAJsqQ2LH/mAWM98nY3MP5E7uAqED76olfKCs7/qJFvN98n79oOw0bZ+f1hpBC8gCAD5JrUBqy2g2m1v+qZ6C1tPkSZVtmKT+eHl5cc+sz2t/v9aAE7SH5LOU60cDYGsJWzzpQBxYxRQAcEOqHZBn6MDiGoopiib2AAAAtXPS7YeHh0RhijGG5JkTubJwxNEAYNr+AXTDHAplpBgtNFWPOrAFSNamqIMCAMZtMwSwPy8Wi6728NcBJMQRvwKAOkbWBbgxO9RF5llIXq03WQygqTiz/r+PA7J+tzgaAFxAxY5ujLI5bUghK28B8d85R7ns+gE/YVXdhiUsNU1lgpqnWYD6Cpi5b7LI26wziwmHSDq0vtURUoUGaSnTsiSVxrLyab9DxHvq/KiT5JMUHSWGtRjJnuvDiwMAn9SNyCSZ68B23b9BIWzjLyxta3/drJot8l1ZkUj0Eh9enAvAorSoLEsrjIiFdSPMJb/LR7WnQJB17GLktGTqXL2CxAL0oYPbIe4SukRamKhdxyKY70s0fjtlDfnyoevOAtJa2jbsiCTTQtGla4NDFdd7/wAIfE5OhlGtmAAAAABJRU5ErkJggg==" }, { - "path": "", "name": "iron_layer_2.png", + "path": "", "folder": "", "namespace": "", "id": "2", "group": "", + "scope": 0, "width": 64, "height": 32, "uv_width": 64, @@ -1550,9 +1795,12 @@ "use_as_default": false, "layers_enabled": false, "sync_to_project": "", + "file_format": "png", "render_mode": "default", "render_sides": "auto", + "wrap_mode": "limited", "pbr_channel": "color", + "fps": 7, "frame_time": 1, "frame_order_type": "loop", "frame_order": "", @@ -1564,12 +1812,13 @@ "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAAAXNSR0IArs4c6QAAAZZJREFUaEPtVruqhDAQjZ1gYSlY+gH+gfZ+sb2fYWEpCDaCgt1eTrhHhlldLsgVNkkajZldmJPzmMh4viLP+zcBgMAAzxEIEvCcAMEEgwSCBDxHIEjAcwKEFAgSCBJQCHRd98KnbdtMkiSmrmunWfLWHACoqsr0fW+GYTBN0/gFQNu2r6IobPNYXgIgVeE8ANQ8dY8ntC994OrMBYZEAACGl+e5GcfRNp+mqQVA75dlsd9xjjMnAIDm0QgAYINZltnmpmmyaQBPwKIvYL/vu63/9pSwDOCNoyGy4YoBEhAA5AQAvHHcMCVA+pPycRxbRnCPpxMMkBJg07xlSkD6g/QAFwalQwK6eeqdjAADyBBpmt8ek28eoCMPzWqT1CnxKSZ1pHLE5v/yXMYuz55ImSMGz7L/L42hhqMzPQJ7mui6rvadqSLrySjW6988YbK353w5OgNE3F5Zlmae5wMEMogyg+lKOV3VP2GytwE4G6TYIG8eJsrU0JKSfqLrAdh/e8xtAJgiB89/hyrdsDzX72cAoeaJlPkBm2JOMHlI974AAAAASUVORK5CYII=" }, { - "path": "", "name": "transparent.png", + "path": "", "folder": "", "namespace": "", "id": "3", "group": "", + "scope": 0, "width": 16, "height": 16, "uv_width": 16, @@ -1578,9 +1827,12 @@ "use_as_default": false, "layers_enabled": false, "sync_to_project": "", + "file_format": "png", "render_mode": "default", "render_sides": "auto", + "wrap_mode": "limited", "pbr_channel": "color", + "fps": 7, "frame_time": 1, "frame_order_type": "loop", "frame_order": "", @@ -1653,6 +1905,7 @@ "selected": false, "saved": true, "path": "", + "scope": 0, "anim_time_update": "", "blend_weight": "", "start_delay": "", @@ -1667,6 +1920,8 @@ "5e08acae-d6ca-0dfd-9360-8cdb13c7a824": { "name": "armor_stand_root", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "position", @@ -1689,13 +1944,15 @@ "6c53311f-ffc8-e567-ff1b-65840698e9ba": { "name": "body", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { "x": "0", - "y": "1 - math.sin(q.life_time * v.walk_speed + 90) * 12.25\n", + "y": "-1 + math.sin(q.life_time * v.walk_speed + 90) * 12.25\n", "z": "0" } ], @@ -1727,13 +1984,15 @@ "808e3c26-7285-af3f-a079-d8b899176dd3": { "name": "head", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { "x": "0", - "y": "1 + math.sin(q.life_time * v.walk_speed + 90) * 12.25", + "y": "-1 - math.sin(q.life_time * v.walk_speed + 90) * 12.25", "z": "0" } ], @@ -1749,12 +2008,14 @@ "b5b52d2c-097c-08df-6457-372fbae12445": { "name": "left_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "math.sin(q.life_time * v.walk_speed) * 8", + "x": "-math.sin(q.life_time * v.walk_speed) * 8", "y": "0", "z": "22.5" } @@ -1770,7 +2031,7 @@ "channel": "position", "data_points": [ { - "x": "2", + "x": "-2", "y": "0", "z": "-math.sin(q.life_time * v.walk_speed) * 2" } @@ -1787,13 +2048,15 @@ "215d1b02-0e64-a794-1b88-a9c5a6d7541c": { "name": "right_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "math.sin(q.life_time * v.walk_speed) * 22.5", - "y": "math.sin(q.life_time * v.walk_speed) * 12.25", + "x": "-math.sin(q.life_time * v.walk_speed) * 22.5", + "y": "-math.sin(q.life_time * v.walk_speed) * 12.25", "z": "math.cos(q.life_time * v.walk_speed * 2) * 6 + 6" } ], @@ -1809,12 +2072,14 @@ "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69": { "name": "left_leg", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-math.sin(q.life_time * v.walk_speed) * 22.5", + "x": "math.sin(q.life_time * v.walk_speed) * 22.5", "y": "0", "z": "0" } @@ -1847,12 +2112,14 @@ "60d50d30-a018-429d-ba78-c5fb5804dd8a": { "name": "right_leg", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "math.sin(q.life_time * v.walk_speed) * 22.5", + "x": "-math.sin(q.life_time * v.walk_speed) * 22.5", "y": "0", "z": "0" } @@ -1885,6 +2152,8 @@ "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0": { "name": "body_waist_pivot", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", @@ -1903,6 +2172,60 @@ "easingArgs": [] } ] + }, + "98795982-9c43-6e3e-eed9-2c776a957938": { + "name": "root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "102db36a-eeda-0e6f-d5cc-c186ecda8165": { + "name": "baseplate_root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c": { + "name": "baseplate_pivot_a", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "98a28100-07e8-849a-38b7-f56abc2c2e56": { + "name": "waist_pivot", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "7de415a2-9fdd-e4b2-3455-c3bed72eb896": { + "name": "left_hand", + "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false + }, + "7747736f-85e2-338f-207e-53f8d3d2fa39": { + "name": "right_hand", + "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false + }, + "c2e217f1-b50a-5c9a-b342-71a35e984046": { + "name": "text_display", + "type": "animated_java:text_display", + "rotation_global": false, + "quaternion_interpolation": false + }, + "3ffeee76-901e-f8a2-c29a-82f90e16fd1e": { + "name": "camera", + "type": "camera", + "rotation_global": false, + "quaternion_interpolation": false + }, + "bc141119-7f51-9690-7e21-e119b34fb3a2": { + "name": "item_display", + "type": "animated_java:vanilla_item_display", + "rotation_global": false, + "quaternion_interpolation": false } } }, @@ -1916,6 +2239,7 @@ "selected": false, "saved": true, "path": "", + "scope": 0, "anim_time_update": "", "blend_weight": "", "start_delay": "", @@ -1925,13 +2249,15 @@ "b5b52d2c-097c-08df-6457-372fbae12445": { "name": "left_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-90\n+ math.sin(q.life_time * 360) * 30", - "y": "-22.5\n+ math.cos(q.life_time * 360) * 30", + "x": "90\n- math.sin(q.life_time * 360) * 30", + "y": "22.5\n- math.cos(q.life_time * 360) * 30", "z": "0" } ], @@ -1947,13 +2273,15 @@ "215d1b02-0e64-a794-1b88-a9c5a6d7541c": { "name": "right_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-90\n+ math.sin(q.life_time * 360) * 30", - "y": "22.5\n- math.cos(q.life_time * 360) * 30", + "x": "90\n- math.sin(q.life_time * 360) * 30", + "y": "-22.5\n+ math.cos(q.life_time * 360) * 30", "z": "0" } ], @@ -1969,6 +2297,8 @@ "7de415a2-9fdd-e4b2-3455-c3bed72eb896": { "name": "left_hand", "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "function", @@ -1995,6 +2325,8 @@ "7747736f-85e2-338f-207e-53f8d3d2fa39": { "name": "right_hand", "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "function", @@ -2021,12 +2353,14 @@ "3b35d1a9-befe-066e-60df-e1f3a5ec5a78": { "name": "pig", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "position", "data_points": [ { - "x": "16 - math.cos(q.life_time * 180) * 16", + "x": "-16 + math.cos(q.life_time * 180) * 16", "y": "16 + math.sin(q.life_time * 360) * 8", "z": "-32" } @@ -2079,6 +2413,84 @@ "easingArgs": [] } ] + }, + "98795982-9c43-6e3e-eed9-2c776a957938": { + "name": "root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "102db36a-eeda-0e6f-d5cc-c186ecda8165": { + "name": "baseplate_root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c": { + "name": "baseplate_pivot_a", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "5e08acae-d6ca-0dfd-9360-8cdb13c7a824": { + "name": "armor_stand_root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "98a28100-07e8-849a-38b7-f56abc2c2e56": { + "name": "waist_pivot", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0": { + "name": "body_waist_pivot", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "6c53311f-ffc8-e567-ff1b-65840698e9ba": { + "name": "body", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "808e3c26-7285-af3f-a079-d8b899176dd3": { + "name": "head", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69": { + "name": "left_leg", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "60d50d30-a018-429d-ba78-c5fb5804dd8a": { + "name": "right_leg", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "c2e217f1-b50a-5c9a-b342-71a35e984046": { + "name": "text_display", + "type": "animated_java:text_display", + "rotation_global": false, + "quaternion_interpolation": false + }, + "3ffeee76-901e-f8a2-c29a-82f90e16fd1e": { + "name": "camera", + "type": "camera", + "rotation_global": false, + "quaternion_interpolation": false + }, + "bc141119-7f51-9690-7e21-e119b34fb3a2": { + "name": "item_display", + "type": "animated_java:vanilla_item_display", + "rotation_global": false, + "quaternion_interpolation": false } } }, @@ -2092,6 +2504,7 @@ "selected": true, "saved": true, "path": "", + "scope": 0, "anim_time_update": "", "blend_weight": "", "start_delay": "", @@ -2101,12 +2514,14 @@ "bc141119-7f51-9690-7e21-e119b34fb3a2": { "name": "item_display", "type": "animated_java:vanilla_item_display", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "position", "data_points": [ { - "x": "math.sin(q.life_time * 360 * 8) * 32", + "x": "-math.sin(q.life_time * 360 * 8) * 32", "y": "0", "z": "math.cos(q.life_time * 360 * 8) * 32" } @@ -2123,13 +2538,15 @@ "c2e217f1-b50a-5c9a-b342-71a35e984046": { "name": "text_display", "type": "animated_java:text_display", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "math.sin(q.life_time * 360) * 2", - "y": "math.cos(q.life_time * 360) * 2", + "x": "-math.sin(q.life_time * 360) * 2", + "y": "-math.cos(q.life_time * 360) * 2", "z": "0" } ], @@ -2178,6 +2595,8 @@ "808e3c26-7285-af3f-a079-d8b899176dd3": { "name": "head", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "position", @@ -2296,6 +2715,90 @@ "easingArgs": [1] } ] + }, + "98795982-9c43-6e3e-eed9-2c776a957938": { + "name": "root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "102db36a-eeda-0e6f-d5cc-c186ecda8165": { + "name": "baseplate_root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c": { + "name": "baseplate_pivot_a", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "5e08acae-d6ca-0dfd-9360-8cdb13c7a824": { + "name": "armor_stand_root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "98a28100-07e8-849a-38b7-f56abc2c2e56": { + "name": "waist_pivot", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0": { + "name": "body_waist_pivot", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "6c53311f-ffc8-e567-ff1b-65840698e9ba": { + "name": "body", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "b5b52d2c-097c-08df-6457-372fbae12445": { + "name": "left_arm", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "215d1b02-0e64-a794-1b88-a9c5a6d7541c": { + "name": "right_arm", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69": { + "name": "left_leg", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "60d50d30-a018-429d-ba78-c5fb5804dd8a": { + "name": "right_leg", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "7de415a2-9fdd-e4b2-3455-c3bed72eb896": { + "name": "left_hand", + "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false + }, + "7747736f-85e2-338f-207e-53f8d3d2fa39": { + "name": "right_hand", + "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false + }, + "3ffeee76-901e-f8a2-c29a-82f90e16fd1e": { + "name": "camera", + "type": "camera", + "rotation_global": false, + "quaternion_interpolation": false } } } diff --git a/test-packs/1.21.5/datapacks/test-framework/package.json b/test-packs/1.21.5/datapacks/test-framework/package.json deleted file mode 100644 index a0df0c86..00000000 --- a/test-packs/1.21.5/datapacks/test-framework/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "commonjs" -} diff --git a/test-packs/1.21.5/datapacks/test-framework/src/test.mcb b/test-packs/1.21.5/datapacks/test-framework/src/test.mcb index 57cbd78c..e738ea44 100644 --- a/test-packs/1.21.5/datapacks/test-framework/src/test.mcb +++ b/test-packs/1.21.5/datapacks/test-framework/src/test.mcb @@ -1,9 +1,122 @@ function on_load minecraft:load { - tellraw @a {text:'Test Framework loaded!', color:green} + tellraw @a {"text":"Test Framework loaded!", "color":"green"} } -function summon { - #ARGS: {args:{...}} - function animated_java:armor_stand/remove/all - $execute positioned 0 -63 0 rotated 0 0 run function animated_java:armor_stand/summon {args:$(args)} +# clock 1s 1t { +# execute store result score #count aj.i if entity @e[type=item_display,tag=aj.global.root] +# title @a actionbar [{"text":"Rig Count: "}, {"score":{"name":"#count","objective":"aj.i"}}] +# } + +dir armor_stand { + function test { + scoreboard players set #failed_tests aj.i 0 + execute as @e[tag=aj.armor_stand.root] run { + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_locator {name:'left_hand',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"as_locator test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/at_locator {name:'left_hand',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"at_locator test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_at_locator {name:'left_hand',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"as_at_locator test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_all_locators {command:'scoreboard players add #test aj.i 1'} + execute unless score #test aj.i matches 2 run { + tellraw @a {"text":"as_all_locators test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/at_all_locators {command:'scoreboard players add #test aj.i 1'} + execute unless score #test aj.i matches 2 run { + tellraw @a {"text":"at_all_locators test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_at_all_locators {command:'scoreboard players add #test aj.i 1'} + execute unless score #test aj.i matches 2 run { + tellraw @a {"text":"as_at_all_locators test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_camera {name:'camera',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"as_camera test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_node {name:'head',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"as_node test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + } + + execute if score #failed_tests aj.i matches 0 run { + tellraw @a {"text":"All tests passed!","color":"green"} + } + + execute if score #failed_tests aj.i matches 1.. run { + tellraw @a [{"score":{"name":"#failed_tests","objective":"aj.i"}}, {"text":" tests failed!","color":"red"}] + } + } + + function summon { + #ARGS: {args:{...}} + function animated_java:global/remove/everything + $execute positioned 0 1 0 rotated 0 0 run function animated_java:armor_stand/summon {args:$(args)} + } + + function summon_minimal { + #ARGS: {args:{...}} + function animated_java:global/remove/everything + $execute positioned 0 1 0 rotated 0 0 run function animated_java:armor_stand_minimal/summon {args:$(args)} + } + + function summon_many { + data remove storage test:temp args + $data modify storage test:temp args set value {args:$(args)} + REPEAT (0, 199) as i { + schedule 1t { + execute positioned <%i % 16%> 1 <%Math.floor(i / 16)%> rotated 0 0 run function animated_java:armor_stand/summon with storage test:temp args + } + } + } + + function summon_many_minimal { + data remove storage test:temp args + $data modify storage test:temp args set value {args:$(args)} + REPEAT (0, 199) as i { + schedule 1t { + execute positioned <%i % 16%> 1 <%Math.floor(i / 16)%> rotated 0 0 run function animated_java:armor_stand_minimal/summon with storage test:temp args + } + } + } } + +clock debug 1t { + title @a actionbar [ \ + "p:", {"score":{"name":"#aj.data_manager.preps_this_tick","objective":"aj.i"}}, \ + " r:", {"score":{"name":"#aj.data_manager.reads_this_tick","objective":"aj.i"}}, \ + " w:", {"score":{"name":"#aj.data_manager.writes_this_tick","objective":"aj.i"}} \ + ] + scoreboard players set #aj.data_manager.preps_this_tick aj.i 0 + scoreboard players set #aj.data_manager.reads_this_tick aj.i 0 + scoreboard players set #aj.data_manager.writes_this_tick aj.i 0 +} \ No newline at end of file diff --git a/test-packs/1.21.6/datapacks/test-framework/src/test.mcb b/test-packs/1.21.6/datapacks/test-framework/src/test.mcb index 57cbd78c..e738ea44 100644 --- a/test-packs/1.21.6/datapacks/test-framework/src/test.mcb +++ b/test-packs/1.21.6/datapacks/test-framework/src/test.mcb @@ -1,9 +1,122 @@ function on_load minecraft:load { - tellraw @a {text:'Test Framework loaded!', color:green} + tellraw @a {"text":"Test Framework loaded!", "color":"green"} } -function summon { - #ARGS: {args:{...}} - function animated_java:armor_stand/remove/all - $execute positioned 0 -63 0 rotated 0 0 run function animated_java:armor_stand/summon {args:$(args)} +# clock 1s 1t { +# execute store result score #count aj.i if entity @e[type=item_display,tag=aj.global.root] +# title @a actionbar [{"text":"Rig Count: "}, {"score":{"name":"#count","objective":"aj.i"}}] +# } + +dir armor_stand { + function test { + scoreboard players set #failed_tests aj.i 0 + execute as @e[tag=aj.armor_stand.root] run { + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_locator {name:'left_hand',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"as_locator test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/at_locator {name:'left_hand',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"at_locator test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_at_locator {name:'left_hand',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"as_at_locator test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_all_locators {command:'scoreboard players add #test aj.i 1'} + execute unless score #test aj.i matches 2 run { + tellraw @a {"text":"as_all_locators test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/at_all_locators {command:'scoreboard players add #test aj.i 1'} + execute unless score #test aj.i matches 2 run { + tellraw @a {"text":"at_all_locators test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_at_all_locators {command:'scoreboard players add #test aj.i 1'} + execute unless score #test aj.i matches 2 run { + tellraw @a {"text":"as_at_all_locators test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_camera {name:'camera',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"as_camera test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_node {name:'head',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"as_node test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + } + + execute if score #failed_tests aj.i matches 0 run { + tellraw @a {"text":"All tests passed!","color":"green"} + } + + execute if score #failed_tests aj.i matches 1.. run { + tellraw @a [{"score":{"name":"#failed_tests","objective":"aj.i"}}, {"text":" tests failed!","color":"red"}] + } + } + + function summon { + #ARGS: {args:{...}} + function animated_java:global/remove/everything + $execute positioned 0 1 0 rotated 0 0 run function animated_java:armor_stand/summon {args:$(args)} + } + + function summon_minimal { + #ARGS: {args:{...}} + function animated_java:global/remove/everything + $execute positioned 0 1 0 rotated 0 0 run function animated_java:armor_stand_minimal/summon {args:$(args)} + } + + function summon_many { + data remove storage test:temp args + $data modify storage test:temp args set value {args:$(args)} + REPEAT (0, 199) as i { + schedule 1t { + execute positioned <%i % 16%> 1 <%Math.floor(i / 16)%> rotated 0 0 run function animated_java:armor_stand/summon with storage test:temp args + } + } + } + + function summon_many_minimal { + data remove storage test:temp args + $data modify storage test:temp args set value {args:$(args)} + REPEAT (0, 199) as i { + schedule 1t { + execute positioned <%i % 16%> 1 <%Math.floor(i / 16)%> rotated 0 0 run function animated_java:armor_stand_minimal/summon with storage test:temp args + } + } + } } + +clock debug 1t { + title @a actionbar [ \ + "p:", {"score":{"name":"#aj.data_manager.preps_this_tick","objective":"aj.i"}}, \ + " r:", {"score":{"name":"#aj.data_manager.reads_this_tick","objective":"aj.i"}}, \ + " w:", {"score":{"name":"#aj.data_manager.writes_this_tick","objective":"aj.i"}} \ + ] + scoreboard players set #aj.data_manager.preps_this_tick aj.i 0 + scoreboard players set #aj.data_manager.reads_this_tick aj.i 0 + scoreboard players set #aj.data_manager.writes_this_tick aj.i 0 +} \ No newline at end of file diff --git a/test-packs/1.21.9/datapacks/test-framework/src/test.mcb b/test-packs/1.21.9/datapacks/test-framework/src/test.mcb index 57cbd78c..e738ea44 100644 --- a/test-packs/1.21.9/datapacks/test-framework/src/test.mcb +++ b/test-packs/1.21.9/datapacks/test-framework/src/test.mcb @@ -1,9 +1,122 @@ function on_load minecraft:load { - tellraw @a {text:'Test Framework loaded!', color:green} + tellraw @a {"text":"Test Framework loaded!", "color":"green"} } -function summon { - #ARGS: {args:{...}} - function animated_java:armor_stand/remove/all - $execute positioned 0 -63 0 rotated 0 0 run function animated_java:armor_stand/summon {args:$(args)} +# clock 1s 1t { +# execute store result score #count aj.i if entity @e[type=item_display,tag=aj.global.root] +# title @a actionbar [{"text":"Rig Count: "}, {"score":{"name":"#count","objective":"aj.i"}}] +# } + +dir armor_stand { + function test { + scoreboard players set #failed_tests aj.i 0 + execute as @e[tag=aj.armor_stand.root] run { + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_locator {name:'left_hand',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"as_locator test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/at_locator {name:'left_hand',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"at_locator test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_at_locator {name:'left_hand',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"as_at_locator test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_all_locators {command:'scoreboard players add #test aj.i 1'} + execute unless score #test aj.i matches 2 run { + tellraw @a {"text":"as_all_locators test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/at_all_locators {command:'scoreboard players add #test aj.i 1'} + execute unless score #test aj.i matches 2 run { + tellraw @a {"text":"at_all_locators test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_at_all_locators {command:'scoreboard players add #test aj.i 1'} + execute unless score #test aj.i matches 2 run { + tellraw @a {"text":"as_at_all_locators test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_camera {name:'camera',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"as_camera test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_node {name:'head',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"as_node test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + } + + execute if score #failed_tests aj.i matches 0 run { + tellraw @a {"text":"All tests passed!","color":"green"} + } + + execute if score #failed_tests aj.i matches 1.. run { + tellraw @a [{"score":{"name":"#failed_tests","objective":"aj.i"}}, {"text":" tests failed!","color":"red"}] + } + } + + function summon { + #ARGS: {args:{...}} + function animated_java:global/remove/everything + $execute positioned 0 1 0 rotated 0 0 run function animated_java:armor_stand/summon {args:$(args)} + } + + function summon_minimal { + #ARGS: {args:{...}} + function animated_java:global/remove/everything + $execute positioned 0 1 0 rotated 0 0 run function animated_java:armor_stand_minimal/summon {args:$(args)} + } + + function summon_many { + data remove storage test:temp args + $data modify storage test:temp args set value {args:$(args)} + REPEAT (0, 199) as i { + schedule 1t { + execute positioned <%i % 16%> 1 <%Math.floor(i / 16)%> rotated 0 0 run function animated_java:armor_stand/summon with storage test:temp args + } + } + } + + function summon_many_minimal { + data remove storage test:temp args + $data modify storage test:temp args set value {args:$(args)} + REPEAT (0, 199) as i { + schedule 1t { + execute positioned <%i % 16%> 1 <%Math.floor(i / 16)%> rotated 0 0 run function animated_java:armor_stand_minimal/summon with storage test:temp args + } + } + } } + +clock debug 1t { + title @a actionbar [ \ + "p:", {"score":{"name":"#aj.data_manager.preps_this_tick","objective":"aj.i"}}, \ + " r:", {"score":{"name":"#aj.data_manager.reads_this_tick","objective":"aj.i"}}, \ + " w:", {"score":{"name":"#aj.data_manager.writes_this_tick","objective":"aj.i"}} \ + ] + scoreboard players set #aj.data_manager.preps_this_tick aj.i 0 + scoreboard players set #aj.data_manager.reads_this_tick aj.i 0 + scoreboard players set #aj.data_manager.writes_this_tick aj.i 0 +} \ No newline at end of file diff --git a/test-packs/latest/blueprints/armor_stand_latest.ajblueprint b/test-packs/latest/blueprints/armor_stand_latest.ajblueprint index e33c3a71..3dd599cd 100644 --- a/test-packs/latest/blueprints/armor_stand_latest.ajblueprint +++ b/test-packs/latest/blueprints/armor_stand_latest.ajblueprint @@ -1,23 +1,24 @@ { "meta": { "format": "animated-java:format/blueprint", - "format_version": "1.8.1", + "format_version": "1.10.0-beta.4", "uuid": "167b27cd-b559-3f13-a97c-0841fe21f1d1", "save_location": "/var/mnt/ssd2/repos/animated-java/animated-java/test-packs/latest/blueprints/armor_stand_latest.ajblueprint", - "last_used_export_namespace": "armor_stand" + "last_used_blueprint_id": "aj_booth:rigs/armor_stand" }, "resolution": { "width": 64, "height": 64 }, "blueprint_settings": { - "export_namespace": "armor_stand", + "blueprint_id": "aj_booth:rigs/armor_stand", "render_box": [95, 32], - "resource_pack": "../resources", - "data_pack": "../datapacks/animated_java", + "resource_pack_export_mode": "zip", + "data_pack_export_mode": "zip", + "resource_pack": "/home/snavesutit/Prism Launcher Instances/AJ Testing 1.21.11/minecraft/resourcepacks/resources.zip", + "data_pack": "../datapacks/animated_java.zip", "on_summon_function": "say On-Summon!", "on_remove_function": "say On-Remove!", - "auto_update_rig_orientation": false, "baked_animations": false, "json_file": "../testPluginExport.json" }, @@ -25,10 +26,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-6, 0, -6], "to": [6, 1, 6], @@ -38,27 +42,27 @@ "faces": { "north": { "uv": [12, 44, 24, 45], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [0, 44, 12, 45], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [36, 44, 48, 45], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [24, 44, 36, 45], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [12, 32, 24, 44], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [24, 32, 36, 44], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -67,10 +71,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-4, 12, -1], "to": [4, 14, 1], @@ -80,27 +87,27 @@ "faces": { "north": { "uv": [2, 50, 10, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [0, 50, 2, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [12, 50, 20, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [10, 50, 12, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [2, 50, 10, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [10, 48, 18, 50], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -109,10 +116,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [1, 1, -1], "to": [3, 12, 1], @@ -122,27 +132,27 @@ "faces": { "north": { "uv": [10, 2, 12, 13], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [12, 2, 14, 13], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [14, 2, 16, 13], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [8, 2, 10, 13], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [10, 0, 12, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [12, 0, 14, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -151,10 +161,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-3, 1, -1], "to": [-1, 12, 1], @@ -164,27 +177,27 @@ "faces": { "north": { "uv": [44, 18, 42, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [46, 18, 44, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [48, 18, 46, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [42, 18, 40, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [42, 16, 44, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [44, 16, 46, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -193,10 +206,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-6, 21, -1.5], "to": [6, 24, 1.5], @@ -206,27 +222,27 @@ "faces": { "north": { "uv": [3, 29, 15, 32], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [0, 29, 3, 32], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [18, 29, 30, 32], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [15, 29, 18, 32], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [3, 26, 15, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [15, 26, 27, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -235,10 +251,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [1, 14, -1], "to": [3, 21, 1], @@ -248,27 +267,27 @@ "faces": { "north": { "uv": [18, 2, 20, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [16, 2, 18, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [22, 2, 24, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [20, 2, 22, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [18, 0, 20, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [20, 0, 22, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -277,10 +296,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-3, 14, -1], "to": [-1, 21, 1], @@ -290,27 +312,27 @@ "faces": { "north": { "uv": [50, 18, 52, 25], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [48, 18, 50, 25], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [54, 18, 56, 25], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [52, 18, 54, 25], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [50, 16, 52, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [52, 16, 54, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -319,10 +341,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-7, 12, -1], "to": [-5, 24, 1], @@ -332,27 +357,27 @@ "faces": { "north": { "uv": [36, 18, 34, 30], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [34, 18, 32, 30], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [40, 18, 38, 30], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [38, 18, 36, 30], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [34, 18, 36, 16], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [36, 16, 38, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -361,10 +386,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [5, 12, -1], "to": [7, 24, 1], @@ -374,27 +402,27 @@ "faces": { "north": { "uv": [26, 2, 28, 14], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [24, 2, 26, 14], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [30, 2, 32, 14], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [28, 2, 30, 14], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [26, 0, 28, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [30, 0, 28, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -403,10 +431,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-1, 23, -1], "to": [1, 30, 1], @@ -416,27 +447,27 @@ "faces": { "north": { "uv": [2, 2, 4, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [0, 2, 2, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [6, 2, 8, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [4, 2, 6, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [2, 0, 4, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [4, 0, 6, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -445,10 +476,13 @@ { "name": "helmet", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-5, 22, -5], "to": [5, 32, 5], @@ -458,27 +492,27 @@ "faces": { "north": { "uv": [8, 16, 16, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [0, 16, 8, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [24, 16, 32, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [16, 16, 24, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [8, 0, 16, 16], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [16, 0, 24, 16], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -487,10 +521,13 @@ { "name": "chestplate", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 15, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-5, 11.25, -3], "to": [5, 23.75, 3], @@ -500,27 +537,27 @@ "faces": { "north": { "uv": [20, 40, 28, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [16, 40, 20, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [32, 40, 40, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [28, 40, 32, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [20, 32, 28, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [28, 32, 36, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -529,10 +566,13 @@ { "name": "left_chestplate", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, - "light_emission": 0, - "render_order": "default", + "shade": true, + "light_emission": 5, + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-9, 19.25, -3], "to": [-3, 25, 3], @@ -542,27 +582,27 @@ "faces": { "north": { "uv": [48, 40, 44, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [44, 40, 40, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [56, 40, 52, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [52, 40, 48, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [44, 39.75, 48, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [52, 32, 48, 39.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -571,10 +611,13 @@ { "name": "left_chestplate", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, - "light_emission": 0, - "render_order": "default", + "shade": true, + "light_emission": 10, + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [3, 19.25, -3], "to": [9, 25, 3], @@ -584,27 +627,27 @@ "faces": { "north": { "uv": [44, 40, 48, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [48, 40, 52, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [52, 40, 56, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [40, 40, 44, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [48, 39.75, 44, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [48, 32, 52, 39.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -613,10 +656,13 @@ { "name": "pants", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-4.5, 11.5, -2.5], "to": [4.5, 17, 2.5], @@ -626,27 +672,27 @@ "faces": { "north": { "uv": [20, 54, 28, 64], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "east": { "uv": [16, 54, 20, 64], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "south": { "uv": [32, 54, 40, 64], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "west": { "uv": [28, 54, 32, 64], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "up": { "uv": [20, 48, 28, 54], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "down": { "uv": [28, 48, 36, 54], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" } }, "type": "cube", @@ -655,10 +701,13 @@ { "name": "right_pants", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-0.5, 2.75, -2.375], "to": [4.25, 12, 2.375], @@ -668,27 +717,27 @@ "faces": { "north": { "uv": [4, 40, 8, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "east": { "uv": [0, 40, 4, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "south": { "uv": [12, 40, 16, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "west": { "uv": [8, 40, 12, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "up": { "uv": [4, 32, 8, 40], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "down": { "uv": [8, 32, 12, 40], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" } }, "type": "cube", @@ -697,10 +746,13 @@ { "name": "left_pants", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-4.25, 2.75, -2.375], "to": [0.5, 12, 2.375], @@ -710,27 +762,27 @@ "faces": { "north": { "uv": [8, 40, 4, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "east": { "uv": [12, 40, 8, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "south": { "uv": [16, 40, 12, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "west": { "uv": [4, 40, 0, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "up": { "uv": [8, 32, 4, 40], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "down": { "uv": [12, 32, 8, 40], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" } }, "type": "cube", @@ -739,10 +791,13 @@ { "name": "right_shoe", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-1, -1, -3], "to": [4.75, 6, 3], @@ -752,27 +807,27 @@ "faces": { "north": { "uv": [4, 52, 8, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [0, 52, 4, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [12, 52, 16, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [8, 52, 12, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [4, 32, 8, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [8, 32, 12, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -781,10 +836,13 @@ { "name": "left_shoe", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-4.75, -1, -3], "to": [1, 6, 3], @@ -794,27 +852,27 @@ "faces": { "north": { "uv": [8, 52, 4, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [12, 52, 8, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [16, 52, 12, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [4, 52, 0, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [8, 32, 4, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [12, 32, 8, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -827,13 +885,14 @@ "ignore_inherited_scale": false, "visibility": true, "locked": false, + "scope": 0, "config": { "use_entity": true, "entity_type": "minecraft:item_display", "sync_passenger_rotation": true, "on_summon_function": "say Summon Left Hand!", "on_remove_function": "say Remove Left Hand!", - "on_tick_function": "" + "on_tick_function": "particle minecraft:bubble ^ ^ ^1\ntp @e[tag=test3,limit=1] ~ ~ ~ ~ ~" }, "uuid": "7de415a2-9fdd-e4b2-3455-c3bed72eb896", "type": "locator" @@ -845,23 +904,23 @@ "ignore_inherited_scale": false, "visibility": true, "locked": false, + "scope": 0, "config": { "use_entity": true, "entity_type": "minecraft:item_display", "sync_passenger_rotation": false, "on_summon_function": "say Summon Right Hand!", "on_remove_function": "say Remove Right Hand!", - "on_tick_function": "" + "on_tick_function": "particle minecraft:bubble ^ ^ ^1\ntp @e[tag=test2,limit=1] ~ ~ ~ ~ ~" }, "uuid": "7747736f-85e2-338f-207e-53f8d3d2fa39", "type": "locator" }, { - "uuid": "c2e217f1-b50a-5c9a-b342-71a35e984046", - "type": "animated_java:text_display", "name": "text_display", "position": [0, 38, 0], "rotation": [0, 0, 0], + "pivotOffset": [0, 0, 0], "scale": [1, 1, 1], "visibility": true, "locked": false, @@ -902,99 +961,660 @@ "shadow_strength": 1 } } - } + }, + "scope": 0, + "uuid": "c2e217f1-b50a-5c9a-b342-71a35e984046", + "type": "animated_java:text_display" }, { "name": "camera", - "box_uv": false, - "rescale": false, + "position": [0, 27, 0], + "rotation": [0, 0, 0], + "fov": 70, + "aspect_ratio": [16, 9], + "linked_preview": "", + "camera_linked": false, + "visibility": true, + "export": true, "locked": false, - "light_emission": 0, - "render_order": "default", - "allow_mirror_modeling": true, - "from": [0, 0, 0], - "to": [1, 1, 1], + "scope": 0, + "type": "camera", + "uuid": "3ffeee76-901e-f8a2-c29a-82f90e16fd1e" + }, + { + "name": "item_display", + "position": [6, 12, -4], + "rotation": [-90, 0, 0], + "pivotOffset": [0, 0, 0], + "scale": [0.5, 0.5, 0.5], + "visibility": true, + "locked": false, + "export": true, + "item": "minecraft:diamond", + "itemDisplay": "none", + "onSummonFunction": "", + "configs": { + "default": { + "on_apply_function": "", + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": false, + "glow_color": "#ffffff", + "invisible": false, + "shadow_radius": 0, + "shadow_strength": 1 + }, + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "on_apply_function": "", + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": true, + "glowing": true, + "override_glow_color": true, + "glow_color": "#99ff00", + "invisible": false, + "shadow_radius": 0, + "shadow_strength": 1 + } + } + }, + "scope": 0, + "uuid": "bc141119-7f51-9690-7e21-e119b34fb3a2", + "type": "animated_java:vanilla_item_display" + }, + { + "name": "keybinds", + "position": [0, 56, 0], + "rotation": [0, 0, 0], + "pivotOffset": [0, 0, 0], + "scale": [1, 1, 1], + "visibility": true, + "locked": false, + "export": true, + "text": "{keybind:'key.use'}", + "lineWidth": 200, + "backgroundColor": "#00000040", + "align": "center", + "shadow": false, + "seeThrough": false, + "onSummonFunction": "", + "configs": { + "default": {}, + "variants": {} + }, + "scope": 0, + "uuid": "29d6057b-8ee5-0e57-405d-f2d71c816a43", + "type": "animated_java:text_display" + } + ], + "groups": [ + { + "name": "root", + "uuid": "98795982-9c43-6e3e-eed9-2c776a957938", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 0, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glow_color": "#ffffff", + "glowing": false, + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": {} + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, "autouv": 0, - "color": 3, + "isOpen": true, + "primary_selected": false + }, + { + "name": "baseplate_root", + "uuid": "102db36a-eeda-0e6f-d5cc-c186ecda8165", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, "origin": [0, 0, 0], - "faces": { - "north": { - "uv": [0, 0, 1, 1], - "texture": 0 + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glow_color": "#ffffff", + "glowing": false, + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false }, - "east": { - "uv": [0, 0, 1, 1], - "texture": 0 + "variants": {} + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "baseplate_pivot_a", + "uuid": "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 1, 6], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glow_color": "#ffffff", + "glowing": false, + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false }, - "south": { - "uv": [0, 0, 1, 1], - "texture": 0 + "variants": {} + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "armor_stand_root", + "uuid": "5e08acae-d6ca-0dfd-9360-8cdb13c7a824", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 1, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false }, - "west": { - "uv": [0, 0, 1, 1], - "texture": 0 + "variants": {} + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "waist_pivot", + "uuid": "98a28100-07e8-849a-38b7-f56abc2c2e56", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 12, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false }, - "up": { - "uv": [0, 0, 1, 1], - "texture": 0 + "variants": { + "5417306e-2c69-3f36-1e3c-edd904034a36": {} + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "body_waist_pivot", + "uuid": "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 12, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false }, - "down": { - "uv": [0, 0, 1, 1], - "texture": 0 + "variants": { + "5417306e-2c69-3f36-1e3c-edd904034a36": {} + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "body", + "uuid": "6c53311f-ffc8-e567-ff1b-65840698e9ba", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 24, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "5417306e-2c69-3f36-1e3c-edd904034a36": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": false, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#00ff06", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "head", + "uuid": "808e3c26-7285-af3f-a079-d8b899176dd3", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 23, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#c400ff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "left_arm", + "uuid": "b5b52d2c-097c-08df-6457-372fbae12445", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [-6, 23, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#00ff9f", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "right_arm", + "uuid": "215d1b02-0e64-a794-1b88-a9c5a6d7541c", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [6, 23, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#ff0000", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } } }, - "type": "cube", - "uuid": "3ffeee76-901e-f8a2-c29a-82f90e16fd1e" + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false }, { - "uuid": "bc141119-7f51-9690-7e21-e119b34fb3a2", - "type": "animated_java:vanilla_item_display", - "name": "item_display", - "position": [6, 12, -4], - "rotation": [-90, 0, 0], - "scale": [0.5, 0.5, 0.5], - "visibility": true, - "locked": false, + "name": "left_leg", + "uuid": "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69", "export": true, - "item": "minecraft:diamond", - "itemDisplay": "none", - "onSummonFunction": "say I'm a Diamond!", + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [2, 12, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", "configs": { "default": { - "on_apply_function": "", "billboard": "fixed", - "override_brightness": false, "brightness_override": 0, "enchanted": false, - "glowing": false, - "override_glow_color": false, "glow_color": "#ffffff", + "glowing": false, + "inherit_settings": true, "invisible": false, + "nbt": "{}", "shadow_radius": 0, - "shadow_strength": 1 + "shadow_strength": 1, + "use_nbt": false }, "variants": { "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "on_apply_function": "say I'm now a very colorful diamond!", "billboard": "fixed", "override_brightness": false, "brightness_override": 0, - "enchanted": true, + "enchanted": false, "glowing": true, "override_glow_color": true, - "glow_color": "#99ff00", + "glow_color": "#ffee00", + "inherit_settings": true, "invisible": false, + "nbt": "{}", "shadow_radius": 0, - "shadow_strength": 1 + "shadow_strength": 1, + "use_nbt": false } } - } - } - ], - "outliner": [ + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, { - "name": "root", - "origin": [0, 0, 0], + "name": "right_leg", + "uuid": "60d50d30-a018-429d-ba78-c5fb5804dd8a", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [-2, 12, 0], + "rotation": [0, 0, 0], "color": 0, "onSummonFunction": "", "configs": { @@ -1011,238 +1631,65 @@ "shadow_strength": 1, "use_nbt": false }, - "variants": {} + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#6e00ff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } }, - "uuid": "98795982-9c43-6e3e-eed9-2c776a957938", - "export": true, + "children": [], + "reset": false, + "shade": true, "mirror_uv": false, - "isOpen": true, - "locked": false, "visibility": true, "autouv": 0, - "selected": false, + "isOpen": true, + "primary_selected": false + } + ], + "outliner": [ + { + "uuid": "98795982-9c43-6e3e-eed9-2c776a957938", + "isOpen": true, "children": [ { - "name": "baseplate_root", - "origin": [0, 0, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glow_color": "#ffffff", - "glowing": false, - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": {} - }, "uuid": "102db36a-eeda-0e6f-d5cc-c186ecda8165", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ { - "name": "baseplate_pivot_a", - "origin": [0, 1, 6], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "on_apply_function": "", - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": false, - "glow_color": "#ffffff", - "invisible": false, - "shadow_radius": 0, - "shadow_strength": 1 - }, - "variants": {} - }, "uuid": "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["46624743-e0ef-5e97-e6d8-ba5dc100baf4"] } ] }, { - "name": "armor_stand_root", - "origin": [0, 1, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": {} - }, "uuid": "5e08acae-d6ca-0dfd-9360-8cdb13c7a824", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ { - "name": "waist_pivot", - "origin": [0, 12, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "5417306e-2c69-3f36-1e3c-edd904034a36": {} - } - }, "uuid": "98a28100-07e8-849a-38b7-f56abc2c2e56", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ { - "name": "body_waist_pivot", - "origin": [0, 12, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "5417306e-2c69-3f36-1e3c-edd904034a36": {} - } - }, "uuid": "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ { - "name": "body", - "origin": [0, 24, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "5417306e-2c69-3f36-1e3c-edd904034a36": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": false, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#00ff06", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "6c53311f-ffc8-e567-ff1b-65840698e9ba", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ "55829f3d-26dc-8f49-39b8-5ba2c0159a24", "9d16df18-0574-58bb-e0f9-f799946257c9", @@ -1251,150 +1698,18 @@ "6dd668dd-27bd-631d-5e44-a94f7a35ddbb", "d5e974ae-a732-db7a-59a1-c16ff717e426", { - "name": "head", - "origin": [0, 23, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#c400ff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "808e3c26-7285-af3f-a079-d8b899176dd3", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["a23d9259-0d9a-4e16-1b42-47e5bedba00f", "a302b268-1699-4013-011f-211bd85806d4", "3ffeee76-901e-f8a2-c29a-82f90e16fd1e"] }, { - "name": "left_arm", - "origin": [-6, 23, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#00ff9f", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "b5b52d2c-097c-08df-6457-372fbae12445", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["c219cb9b-53a7-6a5b-7b47-dce0a1e6ec14", "967c77d0-2607-0ecb-8093-416d237cdb85", "7de415a2-9fdd-e4b2-3455-c3bed72eb896"] }, { - "name": "right_arm", - "origin": [6, 23, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#ff0000", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "215d1b02-0e64-a794-1b88-a9c5a6d7541c", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ "13293700-7f42-2279-6a1f-4e0a6a4d89b3", "98475898-cfc8-f67b-3145-abaf659deb3e", @@ -1407,97 +1722,13 @@ ] }, { - "name": "left_leg", - "origin": [2, 12, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glow_color": "#ffffff", - "glowing": false, - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#ffee00", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["d29efa52-def5-a311-7438-1fc73aac804c", "71bfec99-5014-21d3-739b-6512074212db", "41413d23-edf5-3fdc-2ddb-5fd45ea99a89"] }, { - "name": "right_leg", - "origin": [-2, 12, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glow_color": "#ffffff", - "glowing": false, - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#6e00ff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "60d50d30-a018-429d-ba78-c5fb5804dd8a", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["60766231-bd45-cb3f-0a4f-c6c066e86f54", "4dd0c5f1-828f-d559-6496-16e2fbe6276d", "11976d8b-3994-df35-0fb9-b92ac5012141"] } ] @@ -1506,16 +1737,18 @@ } ] }, - "c2e217f1-b50a-5c9a-b342-71a35e984046" + "c2e217f1-b50a-5c9a-b342-71a35e984046", + "29d6057b-8ee5-0e57-405d-f2d71c816a43" ], "textures": [ { - "path": "", "name": "wood.png", + "path": "", "folder": "", "namespace": "", "id": "0", "group": "", + "scope": 0, "width": 64, "height": 64, "uv_width": 64, @@ -1524,9 +1757,12 @@ "use_as_default": false, "layers_enabled": false, "sync_to_project": "", + "file_format": "png", "render_mode": "default", "render_sides": "auto", + "wrap_mode": "limited", "pbr_channel": "color", + "fps": 7, "frame_time": 1, "frame_order_type": "loop", "frame_order": "", @@ -1538,12 +1774,13 @@ "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAB6xJREFUeF7tW01oXUUUnmebkjZNCU1bjSnVtAUNVks0VK1gEbLowmK6EIOKP3VRKBYNBldqiLoMRIkUurAq+PPEhUpduAiIgkVLMDy1qGCtDY3RmsRH07SxSb3yzfW7OW9y75u5uS/v3WBnc+fnzN8353wzc+a9jPovHHtzv4foRH5S59z79LsZluH7xev7vJOjf6otDesVvo8/dzR2+a8jf6nLV83qNu5+4khBfdlXOePBIGwAPPPInd59u5rVx5//oPA1J2Ar/+SVB72pv/9Rx0+cDq1fzknLvjKfvvaoXnmEizMXVH5qOiivq6nW8dGRMbWybrVCemXVqqAc8kivWrlMawVWVgYz78LFy7oPBPTTULdW7X7yrYpqQubDvvs9OWkMjhNHHBPkRE2AKEtQWI76aPNi/nwAHNuSAEF+b+cHlQXgUNc9WgN+n7ig/piYCsZ39doadc3audWW5ShDgPwdrU06Tu3gClNzNl+/qUBjuPrMNLmk3KaQAbmhU6inHnR+Yp4qF1Prd44e18UEBaCZYMpyxKXM4Y++r6wGgAMwaa4izQH2ieCi1uAAgkgNqF9TW3QxATj6rbgGgANo57Rbqq20fc4GhCjVmiBJcpTAsR55gV8tkz+vDvR+VlkN2N++TZtAlM0zP0qt2+66SZuPZHe59JJQpf1Dw1KhATbSgYkUU2vJASTNKEJFPoIk24pzgAsAlAk7J9i2MZIs2uC5ABpD3qj0idBqf7Zzgg2AN17e40lCJd8QVFt92wIlLbcCYDsn2EiMJ82wQxQGX/FdICmCtvoAkJwAQpX2j7qp5wDbBJd6udUElvoEbeMvAACEZatQrDyJPbv4G4r5E2z1o8adGgCS+hNs9VMLAA9a9CuYAx0/Nxn4IMLuJdua/duoGVzvGvo2iANKqQKcIujc1dEht0mMwXS+yIuaeYagLOot9K5RUgB4vo/j6eFlTJ425eXsq8FTuijqur17V3PB2snbrMtdI/AHlEIL6AGKAwDPCZhF2F1ib9ttwbFZXrp43cZdRF7Y0E6cu0bFt0GYQDGfIsDktVwuNflA+iEXctfQALyw73avafMG3T5tmLZ36pezOl+WI02S4aAgBxl8XzzytTOw0gSiSK7YdRv9J7lrZDh5NMKV4GTYOG9uYRNn5wBsISDw7BHlU8z97BO09FfI6zZMBGGhdw3nlSrVLmG2Ix0y5AE5wYf27NDXaC4QF0HvGPkJ7VVKcteY97rDAbr4+Sm7fFmV+unMb+qGjdeq2cszCmkE5lFu52OH5wFODuDETOcLzgEIdLmZ/sskp0+0WzAgvA5hArRvqjcngM6ZJx2hXI0oecgClCgAipGc9CFKM6H/0nYdt2nuPABYQa4eV1Wustmwi8aEeX9wECtGcjgHyHcIkw8SAyDfBdasrtYqjEC7m52dUcuX+yoNDVi/2nd3r6mt1pqCcpkmGUGO9WRd5EEjCEaYU1ZywGL7CwreBjEwTur4tydVy82bCs7hQ98NB3mQPTc5HUzSrLvjli0aGEwYoKDuzltv1IABvEr7AqnBGXkF5lEWhVA9PntRWOZJWZTHret6V7DZcNLy2Ntgd3e3NzU1pWpq/PdBxBEaGxvVyMiIjqOsrq5O5fP5QMZVvqenJ/aYkoAQu7Ouri6vtbVVVVf7T+dmGB8fD8AZHR3VoMSR7+zsjD2msgPQ3NysVqxYofu9dOmSjldV+USJAHCmp6fV4OCgTseR7+3tTTcAMIGWlhY9QQaYAQGRqzE2NqbNII586jWgr6/Pa2ryvTCTk/4pDaG2dv5r8NDQkOaCOPKp5wBowNatWwtUfmZmJkgjTtMYHh7W8TjyqQdAkiA1wFx9mgc5gCToIr8kOACkxiBXX5Ig4jABkqCrfOo1ABywbt06yXWRcZAgQhz51JMgdwGoM1Sf+z53Am6H2AqpAdgFXOVTrwHkAKwsCU/uArB/5udyOa0B4ABX+SXBAfIojG0OAfs9j8XFjsI2+bJrQDab1e+BcjWlUfOkZ+73UP36+nqt2uYpUNaXZwWZjzoSSPaPfJiPuWMgzbHIXae9vT3RyTFRZScmTLnQFQBSvkCLPrxAA+ibk45PxuntoUfWHFWcp7BFn1HMDq4AwD9K0Bk68OUJhV9/Isg4ff02ubT4+lwVIXCKUt2PffOjdl4iMB5mFlFySR8qXAdeKrkru0AYkngwNf88EefFt1SrU452QjWAvIABwObD/iVWjsGVo49QAOTvezEIl5+alGOwi9FHKADyXyTsdKmRmytYoQBIDuDD5P+KA1zRK5Ncol+v2sZIDWAnSMsOF5JWqr7bb2O8J6Pj5pejcinHeOq71cjbPbpW48NzcabxRTnKGJdlZh7bQr40AQyaE174d0O/p84enGuXaZkfFo8qV8rLvafU9qf6g8XMvXowNM38qC8bkPVLD0BD1lOjHXPtIs3AfCnDeFieX89TDVk18HyHanspqzMQRzDTzAsrhyzbkOVRK80hxzeBjQOeOtM2BwDTMt+MszfWK2zDUxsHtET2QJvqODQQfFnNzHdN0wTCbD4MGPZHUzHTc/nX5fw2T2/PKMTNL2u6lCvl9T/rVzj4vu9k7X9ge6BUyEO62Jd1wur/C4S4j3y2CFhdAAAAAElFTkSuQmCC" }, { - "path": "", "name": "iron_layer_1.png", + "path": "", "folder": "", "namespace": "", "id": "1", "group": "", + "scope": 0, "width": 64, "height": 32, "uv_width": 64, @@ -1552,9 +1789,12 @@ "use_as_default": false, "layers_enabled": false, "sync_to_project": "", + "file_format": "png", "render_mode": "default", "render_sides": "auto", + "wrap_mode": "limited", "pbr_channel": "color", + "fps": 7, "frame_time": 1, "frame_order_type": "loop", "frame_order": "", @@ -1566,12 +1806,13 @@ "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAAAXNSR0IArs4c6QAAA6VJREFUaEPlmb9qMkEUxVcIKCikUBCSTot0yROYwkqf2FQK8Qm0U0g6hYAWAYUEhP34DZzlOqzORqNu/KZJZufuOPfMvef+2UIUGK+vr/F6vXZS5XI5kdazbrdbCO2R5/Xg4QGg1Wo5Hebzufu7Wq3c34+Pj+j5+Tm4x1UAMBgMomq1muhSKpX+DwB6vV78+PgYLRaLaLlcJgAAxufn5/VbgA/A/f19AsL7+3t09RwAAI1GI/r6+nIWIAAqlUr09vZ2/RYACdbrdXfrgIDvozxjPB5fvwUAAMruCoV/3gV2KYjCNu7L8XcBIdm0dRsG7b78f2kAC4rzxHjFd5k7LM8hO51ONJ1OnQtowAff398OpNvbW+caGrjI3d1dNBwO3SObRxBNJJuHPKKQFuYIcbVazfm4MkCAgAxns1miuG7bD5P2fQACAO2lUAqZ5gYAbksHu7m5cUpbU1a2F8dxTELUbrdd9gd4unW5wGazcY8AQZkjAE0mk62EUOu5cAGr8L4D9ft9p7AASEtxBYrlBAFsM0ksLA9h9OR5vIopQLAhFOVzQYLnKlSwDGsVlzZ96X1yCzgXwIf+ThCA0WgUiyDx4aenp+A7hx4my3vKW8Rbx1pSUJnJZBKrDsgLAIRVIsxvkGgQgNlsFitBAohLW4DyFsIqIfvYhkwQAJsqQ2LH/mAWM98nY3MP5E7uAqED76olfKCs7/qJFvN98n79oOw0bZ+f1hpBC8gCAD5JrUBqy2g2m1v+qZ6C1tPkSZVtmKT+eHl5cc+sz2t/v9aAE7SH5LOU60cDYGsJWzzpQBxYxRQAcEOqHZBn6MDiGoopiib2AAAAtXPS7YeHh0RhijGG5JkTubJwxNEAYNr+AXTDHAplpBgtNFWPOrAFSNamqIMCAMZtMwSwPy8Wi6728NcBJMQRvwKAOkbWBbgxO9RF5llIXq03WQygqTiz/r+PA7J+tzgaAFxAxY5ujLI5bUghK28B8d85R7ns+gE/YVXdhiUsNU1lgpqnWYD6Cpi5b7LI26wziwmHSDq0vtURUoUGaSnTsiSVxrLyab9DxHvq/KiT5JMUHSWGtRjJnuvDiwMAn9SNyCSZ68B23b9BIWzjLyxta3/drJot8l1ZkUj0Eh9enAvAorSoLEsrjIiFdSPMJb/LR7WnQJB17GLktGTqXL2CxAL0oYPbIe4SukRamKhdxyKY70s0fjtlDfnyoevOAtJa2jbsiCTTQtGla4NDFdd7/wAIfE5OhlGtmAAAAABJRU5ErkJggg==" }, { - "path": "", "name": "iron_layer_2.png", + "path": "", "folder": "", "namespace": "", "id": "2", "group": "", + "scope": 0, "width": 64, "height": 32, "uv_width": 64, @@ -1580,9 +1821,12 @@ "use_as_default": false, "layers_enabled": false, "sync_to_project": "", + "file_format": "png", "render_mode": "default", "render_sides": "auto", + "wrap_mode": "limited", "pbr_channel": "color", + "fps": 7, "frame_time": 1, "frame_order_type": "loop", "frame_order": "", @@ -1594,12 +1838,13 @@ "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAAAXNSR0IArs4c6QAAAZZJREFUaEPtVruqhDAQjZ1gYSlY+gH+gfZ+sb2fYWEpCDaCgt1eTrhHhlldLsgVNkkajZldmJPzmMh4viLP+zcBgMAAzxEIEvCcAMEEgwSCBDxHIEjAcwKEFAgSCBJQCHRd98KnbdtMkiSmrmunWfLWHACoqsr0fW+GYTBN0/gFQNu2r6IobPNYXgIgVeE8ANQ8dY8ntC994OrMBYZEAACGl+e5GcfRNp+mqQVA75dlsd9xjjMnAIDm0QgAYINZltnmpmmyaQBPwKIvYL/vu63/9pSwDOCNoyGy4YoBEhAA5AQAvHHcMCVA+pPycRxbRnCPpxMMkBJg07xlSkD6g/QAFwalQwK6eeqdjAADyBBpmt8ek28eoCMPzWqT1CnxKSZ1pHLE5v/yXMYuz55ImSMGz7L/L42hhqMzPQJ7mui6rvadqSLrySjW6988YbK353w5OgNE3F5Zlmae5wMEMogyg+lKOV3VP2GytwE4G6TYIG8eJsrU0JKSfqLrAdh/e8xtAJgiB89/hyrdsDzX72cAoeaJlPkBm2JOMHlI974AAAAASUVORK5CYII=" }, { - "path": "", "name": "transparent.png", + "path": "", "folder": "", "namespace": "", "id": "3", "group": "", + "scope": 0, "width": 16, "height": 16, "uv_width": 16, @@ -1608,9 +1853,12 @@ "use_as_default": false, "layers_enabled": false, "sync_to_project": "", + "file_format": "png", "render_mode": "default", "render_sides": "auto", + "wrap_mode": "limited", "pbr_channel": "color", + "fps": 7, "frame_time": 1, "frame_order_type": "loop", "frame_order": "", @@ -1683,6 +1931,7 @@ "selected": false, "saved": true, "path": "", + "scope": 0, "anim_time_update": "", "blend_weight": "", "start_delay": "", @@ -1697,6 +1946,8 @@ "5e08acae-d6ca-0dfd-9360-8cdb13c7a824": { "name": "armor_stand_root", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "position", @@ -1719,13 +1970,15 @@ "6c53311f-ffc8-e567-ff1b-65840698e9ba": { "name": "body", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { "x": "0", - "y": "1 - math.sin(q.life_time * v.walk_speed + 90) * 12.25\n", + "y": "-1 + math.sin(q.life_time * v.walk_speed + 90) * 12.25\n", "z": "0" } ], @@ -1757,13 +2010,15 @@ "808e3c26-7285-af3f-a079-d8b899176dd3": { "name": "head", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { "x": "0", - "y": "1 + math.sin(q.life_time * v.walk_speed + 90) * 12.25", + "y": "-1 - math.sin(q.life_time * v.walk_speed + 90) * 12.25", "z": "0" } ], @@ -1779,12 +2034,14 @@ "b5b52d2c-097c-08df-6457-372fbae12445": { "name": "left_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "math.sin(q.life_time * v.walk_speed) * 8", + "x": "-math.sin(q.life_time * v.walk_speed) * 8", "y": "0", "z": "22.5" } @@ -1800,7 +2057,7 @@ "channel": "position", "data_points": [ { - "x": "2", + "x": "-2", "y": "0", "z": "-math.sin(q.life_time * v.walk_speed) * 2" } @@ -1817,13 +2074,15 @@ "215d1b02-0e64-a794-1b88-a9c5a6d7541c": { "name": "right_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "math.sin(q.life_time * v.walk_speed) * 22.5", - "y": "math.sin(q.life_time * v.walk_speed) * 12.25", + "x": "-math.sin(q.life_time * v.walk_speed) * 22.5", + "y": "-math.sin(q.life_time * v.walk_speed) * 12.25", "z": "math.cos(q.life_time * v.walk_speed * 2) * 6 + 6" } ], @@ -1839,12 +2098,14 @@ "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69": { "name": "left_leg", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-math.sin(q.life_time * v.walk_speed) * 22.5", + "x": "math.sin(q.life_time * v.walk_speed) * 22.5", "y": "0", "z": "0" } @@ -1877,12 +2138,14 @@ "60d50d30-a018-429d-ba78-c5fb5804dd8a": { "name": "right_leg", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "math.sin(q.life_time * v.walk_speed) * 22.5", + "x": "-math.sin(q.life_time * v.walk_speed) * 22.5", "y": "0", "z": "0" } @@ -1915,6 +2178,8 @@ "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0": { "name": "body_waist_pivot", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", @@ -1933,6 +2198,66 @@ "easingArgs": [] } ] + }, + "98795982-9c43-6e3e-eed9-2c776a957938": { + "name": "root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "102db36a-eeda-0e6f-d5cc-c186ecda8165": { + "name": "baseplate_root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c": { + "name": "baseplate_pivot_a", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "98a28100-07e8-849a-38b7-f56abc2c2e56": { + "name": "waist_pivot", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "7de415a2-9fdd-e4b2-3455-c3bed72eb896": { + "name": "left_hand", + "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false + }, + "7747736f-85e2-338f-207e-53f8d3d2fa39": { + "name": "right_hand", + "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false + }, + "c2e217f1-b50a-5c9a-b342-71a35e984046": { + "name": "text_display", + "type": "animated_java:text_display", + "rotation_global": false, + "quaternion_interpolation": false + }, + "3ffeee76-901e-f8a2-c29a-82f90e16fd1e": { + "name": "camera", + "type": "camera", + "rotation_global": false, + "quaternion_interpolation": false + }, + "bc141119-7f51-9690-7e21-e119b34fb3a2": { + "name": "item_display", + "type": "animated_java:vanilla_item_display", + "rotation_global": false, + "quaternion_interpolation": false + }, + "29d6057b-8ee5-0e57-405d-f2d71c816a43": { + "name": "keybinds", + "type": "animated_java:text_display", + "rotation_global": false, + "quaternion_interpolation": false } } }, @@ -1946,6 +2271,7 @@ "selected": false, "saved": true, "path": "", + "scope": 0, "anim_time_update": "", "blend_weight": "", "start_delay": "", @@ -1955,13 +2281,15 @@ "b5b52d2c-097c-08df-6457-372fbae12445": { "name": "left_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-90\n+ math.sin(q.life_time * 360) * 30", - "y": "-22.5\n+ math.cos(q.life_time * 360) * 30", + "x": "90\n- math.sin(q.life_time * 360) * 30", + "y": "22.5\n- math.cos(q.life_time * 360) * 30", "z": "0" } ], @@ -1977,13 +2305,15 @@ "215d1b02-0e64-a794-1b88-a9c5a6d7541c": { "name": "right_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-90\n+ math.sin(q.life_time * 360) * 30", - "y": "22.5\n- math.cos(q.life_time * 360) * 30", + "x": "90\n- math.sin(q.life_time * 360) * 30", + "y": "-22.5\n+ math.cos(q.life_time * 360) * 30", "z": "0" } ], @@ -1999,6 +2329,8 @@ "7de415a2-9fdd-e4b2-3455-c3bed72eb896": { "name": "left_hand", "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "function", @@ -2025,6 +2357,8 @@ "7747736f-85e2-338f-207e-53f8d3d2fa39": { "name": "right_hand", "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "function", @@ -2051,12 +2385,14 @@ "3b35d1a9-befe-066e-60df-e1f3a5ec5a78": { "name": "pig", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "position", "data_points": [ { - "x": "16 - math.cos(q.life_time * 180) * 16", + "x": "-16 + math.cos(q.life_time * 180) * 16", "y": "16 + math.sin(q.life_time * 360) * 8", "z": "-32" } @@ -2109,6 +2445,90 @@ "easingArgs": [] } ] + }, + "98795982-9c43-6e3e-eed9-2c776a957938": { + "name": "root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "102db36a-eeda-0e6f-d5cc-c186ecda8165": { + "name": "baseplate_root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c": { + "name": "baseplate_pivot_a", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "5e08acae-d6ca-0dfd-9360-8cdb13c7a824": { + "name": "armor_stand_root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "98a28100-07e8-849a-38b7-f56abc2c2e56": { + "name": "waist_pivot", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0": { + "name": "body_waist_pivot", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "6c53311f-ffc8-e567-ff1b-65840698e9ba": { + "name": "body", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "808e3c26-7285-af3f-a079-d8b899176dd3": { + "name": "head", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69": { + "name": "left_leg", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "60d50d30-a018-429d-ba78-c5fb5804dd8a": { + "name": "right_leg", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "c2e217f1-b50a-5c9a-b342-71a35e984046": { + "name": "text_display", + "type": "animated_java:text_display", + "rotation_global": false, + "quaternion_interpolation": false + }, + "3ffeee76-901e-f8a2-c29a-82f90e16fd1e": { + "name": "camera", + "type": "camera", + "rotation_global": false, + "quaternion_interpolation": false + }, + "bc141119-7f51-9690-7e21-e119b34fb3a2": { + "name": "item_display", + "type": "animated_java:vanilla_item_display", + "rotation_global": false, + "quaternion_interpolation": false + }, + "29d6057b-8ee5-0e57-405d-f2d71c816a43": { + "name": "keybinds", + "type": "animated_java:text_display", + "rotation_global": false, + "quaternion_interpolation": false } } }, @@ -2119,9 +2539,10 @@ "override": false, "length": 1, "snapping": 20, - "selected": false, + "selected": true, "saved": true, "path": "", + "scope": 0, "anim_time_update": "", "blend_weight": "", "start_delay": "", @@ -2131,12 +2552,14 @@ "bc141119-7f51-9690-7e21-e119b34fb3a2": { "name": "item_display", "type": "animated_java:vanilla_item_display", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "position", "data_points": [ { - "x": "math.sin(q.life_time * 360 * 8) * 32", + "x": "-math.sin(q.life_time * 360 * 8) * 32", "y": "0", "z": "math.cos(q.life_time * 360 * 8) * 32" } @@ -2153,13 +2576,15 @@ "c2e217f1-b50a-5c9a-b342-71a35e984046": { "name": "text_display", "type": "animated_java:text_display", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "math.sin(q.life_time * 360) * 2", - "y": "math.cos(q.life_time * 360) * 2", + "x": "-math.sin(q.life_time * 360) * 2", + "y": "-math.cos(q.life_time * 360) * 2", "z": "0" } ], @@ -2208,6 +2633,8 @@ "808e3c26-7285-af3f-a079-d8b899176dd3": { "name": "head", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "position", @@ -2326,25 +2753,98 @@ "easingArgs": [1] } ] + }, + "98795982-9c43-6e3e-eed9-2c776a957938": { + "name": "root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "102db36a-eeda-0e6f-d5cc-c186ecda8165": { + "name": "baseplate_root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c": { + "name": "baseplate_pivot_a", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "5e08acae-d6ca-0dfd-9360-8cdb13c7a824": { + "name": "armor_stand_root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "98a28100-07e8-849a-38b7-f56abc2c2e56": { + "name": "waist_pivot", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0": { + "name": "body_waist_pivot", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "6c53311f-ffc8-e567-ff1b-65840698e9ba": { + "name": "body", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "b5b52d2c-097c-08df-6457-372fbae12445": { + "name": "left_arm", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "215d1b02-0e64-a794-1b88-a9c5a6d7541c": { + "name": "right_arm", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69": { + "name": "left_leg", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "60d50d30-a018-429d-ba78-c5fb5804dd8a": { + "name": "right_leg", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "7de415a2-9fdd-e4b2-3455-c3bed72eb896": { + "name": "left_hand", + "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false + }, + "7747736f-85e2-338f-207e-53f8d3d2fa39": { + "name": "right_hand", + "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false + }, + "3ffeee76-901e-f8a2-c29a-82f90e16fd1e": { + "name": "camera", + "type": "camera", + "rotation_global": false, + "quaternion_interpolation": false + }, + "29d6057b-8ee5-0e57-405d-f2d71c816a43": { + "name": "keybinds", + "type": "animated_java:text_display", + "rotation_global": false, + "quaternion_interpolation": false } } - }, - { - "uuid": "8b5ebbc6-1189-bb9a-00f6-6ef68e212fc1", - "name": "camera_test", - "loop": "loop", - "override": false, - "length": 90, - "snapping": 20, - "selected": true, - "saved": true, - "path": "", - "anim_time_update": "", - "blend_weight": "", - "start_delay": "", - "loop_delay": "0", - "excluded_nodes": [], - "animators": {} } ], "animation_variable_placeholders": "v.walk_speed = 360 * 1;\nv.run_speed = 360 * 1.5;\nv.stickbug_speed = 360 * 1.25;\n" diff --git a/test-packs/latest/blueprints/armor_stand_minimal_latest.ajblueprint b/test-packs/latest/blueprints/armor_stand_minimal_latest.ajblueprint index da922ca5..9df38c90 100644 --- a/test-packs/latest/blueprints/armor_stand_minimal_latest.ajblueprint +++ b/test-packs/latest/blueprints/armor_stand_minimal_latest.ajblueprint @@ -1,9 +1,9 @@ { "meta": { "format": "animated-java:format/blueprint", - "format_version": "1.8.0-beta.3", + "format_version": "1.10.0-beta.1", "uuid": "173aa82f-fb4f-c354-ad34-a34d7fbce647", - "save_location": "D:\\github-repos\\animated-java\\old-animated-java\\test-packs\\latest\\blueprints\\armor_stand_minimal_latest.ajblueprint", + "save_location": "/var/mnt/ssd2/repos/animated-java/animated-java/test-packs/latest/blueprints/armor_stand_minimal_latest.ajblueprint", "last_used_export_namespace": "armor_stand_minimal" }, "resolution": { @@ -23,10 +23,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-6, 0, -6], "to": [6, 1, 6], @@ -36,27 +39,27 @@ "faces": { "north": { "uv": [12, 44, 24, 45], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [0, 44, 12, 45], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [36, 44, 48, 45], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [24, 44, 36, 45], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [12, 32, 24, 44], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [24, 32, 36, 44], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -65,10 +68,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-4, 12, -1], "to": [4, 14, 1], @@ -78,27 +84,27 @@ "faces": { "north": { "uv": [2, 50, 10, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [0, 50, 2, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [12, 50, 20, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [10, 50, 12, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [2, 50, 10, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [10, 48, 18, 50], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -107,10 +113,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [1, 1, -1], "to": [3, 12, 1], @@ -120,27 +129,27 @@ "faces": { "north": { "uv": [10, 2, 12, 13], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [12, 2, 14, 13], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [14, 2, 16, 13], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [8, 2, 10, 13], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [10, 0, 12, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [12, 0, 14, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -149,10 +158,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-3, 1, -1], "to": [-1, 12, 1], @@ -162,27 +174,27 @@ "faces": { "north": { "uv": [44, 18, 42, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [46, 18, 44, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [48, 18, 46, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [42, 18, 40, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [42, 16, 44, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [44, 16, 46, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -191,10 +203,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-6, 21, -1.5], "to": [6, 24, 1.5], @@ -204,27 +219,27 @@ "faces": { "north": { "uv": [3, 29, 15, 32], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [0, 29, 3, 32], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [18, 29, 30, 32], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [15, 29, 18, 32], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [3, 26, 15, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [15, 26, 27, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -233,10 +248,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [1, 14, -1], "to": [3, 21, 1], @@ -246,27 +264,27 @@ "faces": { "north": { "uv": [18, 2, 20, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [16, 2, 18, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [22, 2, 24, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [20, 2, 22, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [18, 0, 20, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [20, 0, 22, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -275,10 +293,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-3, 14, -1], "to": [-1, 21, 1], @@ -288,27 +309,27 @@ "faces": { "north": { "uv": [50, 18, 52, 25], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [48, 18, 50, 25], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [54, 18, 56, 25], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [52, 18, 54, 25], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [50, 16, 52, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [52, 16, 54, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -317,10 +338,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-7, 12, -1], "to": [-5, 24, 1], @@ -330,27 +354,27 @@ "faces": { "north": { "uv": [36, 18, 34, 30], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [34, 18, 32, 30], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [40, 18, 38, 30], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [38, 18, 36, 30], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [34, 18, 36, 16], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [36, 16, 38, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -359,10 +383,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [5, 12, -1], "to": [7, 24, 1], @@ -372,27 +399,27 @@ "faces": { "north": { "uv": [26, 2, 28, 14], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [24, 2, 26, 14], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [30, 2, 32, 14], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [28, 2, 30, 14], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [26, 0, 28, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [30, 0, 28, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -401,10 +428,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-1, 23, -1], "to": [1, 30, 1], @@ -414,37 +444,47 @@ "faces": { "north": { "uv": [2, 2, 4, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [0, 2, 2, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [6, 2, 8, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [4, 2, 6, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [2, 0, 4, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [4, 0, 6, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", "uuid": "a23d9259-0d9a-4e16-1b42-47e5bedba00f" } ], - "outliner": [ + "groups": [ { "name": "root", + "uuid": "98795982-9c43-6e3e-eed9-2c776a957938", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, "origin": [0, 0, 0], + "rotation": [0, 0, 0], "color": 0, "onSummonFunction": "", "configs": { @@ -463,386 +503,630 @@ }, "variants": {} }, - "uuid": "98795982-9c43-6e3e-eed9-2c776a957938", + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "baseplate_root", + "uuid": "102db36a-eeda-0e6f-d5cc-c186ecda8165", "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 0, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glow_color": "#ffffff", + "glowing": false, + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": {} + }, + "children": [], + "reset": false, + "shade": true, "mirror_uv": false, + "visibility": true, + "autouv": 0, "isOpen": true, + "primary_selected": false + }, + { + "name": "baseplate_pivot_a", + "uuid": "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c", + "export": true, "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 1, 6], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glow_color": "#ffffff", + "glowing": false, + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": {} + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, "visibility": true, "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "armor_stand_root", + "uuid": "5e08acae-d6ca-0dfd-9360-8cdb13c7a824", + "export": true, + "locked": false, + "scope": 0, "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 1, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": {} + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "waist_pivot", + "uuid": "98a28100-07e8-849a-38b7-f56abc2c2e56", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 12, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "5417306e-2c69-3f36-1e3c-edd904034a36": {} + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "body_waist_pivot", + "uuid": "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 12, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "5417306e-2c69-3f36-1e3c-edd904034a36": {} + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "body", + "uuid": "6c53311f-ffc8-e567-ff1b-65840698e9ba", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 24, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "5417306e-2c69-3f36-1e3c-edd904034a36": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": false, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#00ff06", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "head", + "uuid": "808e3c26-7285-af3f-a079-d8b899176dd3", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 23, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#c400ff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "left_arm", + "uuid": "b5b52d2c-097c-08df-6457-372fbae12445", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [-6, 23, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#00ff9f", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "right_arm", + "uuid": "215d1b02-0e64-a794-1b88-a9c5a6d7541c", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [6, 23, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#ff0000", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "left_leg", + "uuid": "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [2, 12, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glow_color": "#ffffff", + "glowing": false, + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#ffee00", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "right_leg", + "uuid": "60d50d30-a018-429d-ba78-c5fb5804dd8a", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [-2, 12, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glow_color": "#ffffff", + "glowing": false, + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#6e00ff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + } + ], + "outliner": [ + { + "uuid": "98795982-9c43-6e3e-eed9-2c776a957938", + "isOpen": true, "children": [ { - "name": "baseplate_root", - "origin": [0, 0, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glow_color": "#ffffff", - "glowing": false, - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": {} - }, "uuid": "102db36a-eeda-0e6f-d5cc-c186ecda8165", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ { - "name": "baseplate_pivot_a", - "origin": [0, 1, 6], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glow_color": "#ffffff", - "glowing": false, - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": {} - }, "uuid": "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["46624743-e0ef-5e97-e6d8-ba5dc100baf4"] } ] }, { - "name": "armor_stand_root", - "origin": [0, 1, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": {} - }, "uuid": "5e08acae-d6ca-0dfd-9360-8cdb13c7a824", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ { - "name": "waist_pivot", - "origin": [0, 12, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "5417306e-2c69-3f36-1e3c-edd904034a36": {} - } - }, "uuid": "98a28100-07e8-849a-38b7-f56abc2c2e56", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ { - "name": "body_waist_pivot", - "origin": [0, 12, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "5417306e-2c69-3f36-1e3c-edd904034a36": {} - } - }, "uuid": "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ { - "name": "body", - "origin": [0, 24, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "5417306e-2c69-3f36-1e3c-edd904034a36": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": false, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#00ff06", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "6c53311f-ffc8-e567-ff1b-65840698e9ba", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ "55829f3d-26dc-8f49-39b8-5ba2c0159a24", "9d16df18-0574-58bb-e0f9-f799946257c9", "f26e6144-8dab-547a-16e8-adaa6fa2c45d", "9b73ebc3-aca6-b85c-d022-b0a811ab38f8", { - "name": "head", - "origin": [0, 23, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#c400ff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "808e3c26-7285-af3f-a079-d8b899176dd3", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["a23d9259-0d9a-4e16-1b42-47e5bedba00f"] }, { - "name": "left_arm", - "origin": [-6, 23, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#00ff9f", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "b5b52d2c-097c-08df-6457-372fbae12445", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["c219cb9b-53a7-6a5b-7b47-dce0a1e6ec14"] }, { - "name": "right_arm", - "origin": [6, 23, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#ff0000", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "215d1b02-0e64-a794-1b88-a9c5a6d7541c", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["13293700-7f42-2279-6a1f-4e0a6a4d89b3"] } ] @@ -850,97 +1134,13 @@ ] }, { - "name": "left_leg", - "origin": [2, 12, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glow_color": "#ffffff", - "glowing": false, - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#ffee00", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["d29efa52-def5-a311-7438-1fc73aac804c"] }, { - "name": "right_leg", - "origin": [-2, 12, 0], - "color": 0, - "onSummonFunction": "", - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glow_color": "#ffffff", - "glowing": false, - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#6e00ff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "60d50d30-a018-429d-ba78-c5fb5804dd8a", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["60766231-bd45-cb3f-0a4f-c6c066e86f54"] } ] @@ -952,12 +1152,13 @@ ], "textures": [ { - "path": "", "name": "wood.png", + "path": "", "folder": "", "namespace": "", "id": "0", "group": "", + "scope": 0, "width": 64, "height": 64, "uv_width": 64, @@ -966,9 +1167,12 @@ "use_as_default": false, "layers_enabled": false, "sync_to_project": "", + "file_format": "png", "render_mode": "default", "render_sides": "auto", + "wrap_mode": "limited", "pbr_channel": "color", + "fps": 7, "frame_time": 1, "frame_order_type": "loop", "frame_order": "", @@ -980,12 +1184,13 @@ "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAB6xJREFUeF7tW01oXUUUnmebkjZNCU1bjSnVtAUNVks0VK1gEbLowmK6EIOKP3VRKBYNBldqiLoMRIkUurAq+PPEhUpduAiIgkVLMDy1qGCtDY3RmsRH07SxSb3yzfW7OW9y75u5uS/v3WBnc+fnzN8353wzc+a9jPovHHtzv4foRH5S59z79LsZluH7xev7vJOjf6otDesVvo8/dzR2+a8jf6nLV83qNu5+4khBfdlXOePBIGwAPPPInd59u5rVx5//oPA1J2Ar/+SVB72pv/9Rx0+cDq1fzknLvjKfvvaoXnmEizMXVH5qOiivq6nW8dGRMbWybrVCemXVqqAc8kivWrlMawVWVgYz78LFy7oPBPTTULdW7X7yrYpqQubDvvs9OWkMjhNHHBPkRE2AKEtQWI76aPNi/nwAHNuSAEF+b+cHlQXgUNc9WgN+n7ig/piYCsZ39doadc3audWW5ShDgPwdrU06Tu3gClNzNl+/qUBjuPrMNLmk3KaQAbmhU6inHnR+Yp4qF1Prd44e18UEBaCZYMpyxKXM4Y++r6wGgAMwaa4izQH2ieCi1uAAgkgNqF9TW3QxATj6rbgGgANo57Rbqq20fc4GhCjVmiBJcpTAsR55gV8tkz+vDvR+VlkN2N++TZtAlM0zP0qt2+66SZuPZHe59JJQpf1Dw1KhATbSgYkUU2vJASTNKEJFPoIk24pzgAsAlAk7J9i2MZIs2uC5ABpD3qj0idBqf7Zzgg2AN17e40lCJd8QVFt92wIlLbcCYDsn2EiMJ82wQxQGX/FdICmCtvoAkJwAQpX2j7qp5wDbBJd6udUElvoEbeMvAACEZatQrDyJPbv4G4r5E2z1o8adGgCS+hNs9VMLAA9a9CuYAx0/Nxn4IMLuJdua/duoGVzvGvo2iANKqQKcIujc1dEht0mMwXS+yIuaeYagLOot9K5RUgB4vo/j6eFlTJ425eXsq8FTuijqur17V3PB2snbrMtdI/AHlEIL6AGKAwDPCZhF2F1ib9ttwbFZXrp43cZdRF7Y0E6cu0bFt0GYQDGfIsDktVwuNflA+iEXctfQALyw73avafMG3T5tmLZ36pezOl+WI02S4aAgBxl8XzzytTOw0gSiSK7YdRv9J7lrZDh5NMKV4GTYOG9uYRNn5wBsISDw7BHlU8z97BO09FfI6zZMBGGhdw3nlSrVLmG2Ix0y5AE5wYf27NDXaC4QF0HvGPkJ7VVKcteY97rDAbr4+Sm7fFmV+unMb+qGjdeq2cszCmkE5lFu52OH5wFODuDETOcLzgEIdLmZ/sskp0+0WzAgvA5hArRvqjcngM6ZJx2hXI0oecgClCgAipGc9CFKM6H/0nYdt2nuPABYQa4eV1Wustmwi8aEeX9wECtGcjgHyHcIkw8SAyDfBdasrtYqjEC7m52dUcuX+yoNDVi/2nd3r6mt1pqCcpkmGUGO9WRd5EEjCEaYU1ZywGL7CwreBjEwTur4tydVy82bCs7hQ98NB3mQPTc5HUzSrLvjli0aGEwYoKDuzltv1IABvEr7AqnBGXkF5lEWhVA9PntRWOZJWZTHret6V7DZcNLy2Ntgd3e3NzU1pWpq/PdBxBEaGxvVyMiIjqOsrq5O5fP5QMZVvqenJ/aYkoAQu7Ouri6vtbVVVVf7T+dmGB8fD8AZHR3VoMSR7+zsjD2msgPQ3NysVqxYofu9dOmSjldV+USJAHCmp6fV4OCgTseR7+3tTTcAMIGWlhY9QQaYAQGRqzE2NqbNII586jWgr6/Pa2ryvTCTk/4pDaG2dv5r8NDQkOaCOPKp5wBowNatWwtUfmZmJkgjTtMYHh7W8TjyqQdAkiA1wFx9mgc5gCToIr8kOACkxiBXX5Ig4jABkqCrfOo1ABywbt06yXWRcZAgQhz51JMgdwGoM1Sf+z53Am6H2AqpAdgFXOVTrwHkAKwsCU/uArB/5udyOa0B4ABX+SXBAfIojG0OAfs9j8XFjsI2+bJrQDab1e+BcjWlUfOkZ+73UP36+nqt2uYpUNaXZwWZjzoSSPaPfJiPuWMgzbHIXae9vT3RyTFRZScmTLnQFQBSvkCLPrxAA+ibk45PxuntoUfWHFWcp7BFn1HMDq4AwD9K0Bk68OUJhV9/Isg4ff02ubT4+lwVIXCKUt2PffOjdl4iMB5mFlFySR8qXAdeKrkru0AYkngwNf88EefFt1SrU452QjWAvIABwObD/iVWjsGVo49QAOTvezEIl5+alGOwi9FHKADyXyTsdKmRmytYoQBIDuDD5P+KA1zRK5Ncol+v2sZIDWAnSMsOF5JWqr7bb2O8J6Pj5pejcinHeOq71cjbPbpW48NzcabxRTnKGJdlZh7bQr40AQyaE174d0O/p84enGuXaZkfFo8qV8rLvafU9qf6g8XMvXowNM38qC8bkPVLD0BD1lOjHXPtIs3AfCnDeFieX89TDVk18HyHanspqzMQRzDTzAsrhyzbkOVRK80hxzeBjQOeOtM2BwDTMt+MszfWK2zDUxsHtET2QJvqODQQfFnNzHdN0wTCbD4MGPZHUzHTc/nX5fw2T2/PKMTNL2u6lCvl9T/rVzj4vu9k7X9ge6BUyEO62Jd1wur/C4S4j3y2CFhdAAAAAElFTkSuQmCC" }, { - "path": "", "name": "transparent.png", + "path": "", "folder": "", "namespace": "", "id": "1", "group": "", + "scope": 0, "width": 16, "height": 16, "uv_width": 16, @@ -994,9 +1199,12 @@ "use_as_default": false, "layers_enabled": false, "sync_to_project": "", + "file_format": "png", "render_mode": "default", "render_sides": "auto", + "wrap_mode": "limited", "pbr_channel": "color", + "fps": 7, "frame_time": 1, "frame_order_type": "loop", "frame_order": "", @@ -1030,6 +1238,7 @@ "selected": true, "saved": true, "path": "", + "scope": 0, "anim_time_update": "", "blend_weight": "", "start_delay": "", @@ -1044,6 +1253,8 @@ "5e08acae-d6ca-0dfd-9360-8cdb13c7a824": { "name": "armor_stand_root", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "position", @@ -1066,13 +1277,15 @@ "6c53311f-ffc8-e567-ff1b-65840698e9ba": { "name": "body", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { "x": "0", - "y": "1 - math.sin(q.life_time * v.walk_speed + 90) * 12.25\n", + "y": "-1 + math.sin(q.life_time * v.walk_speed + 90) * 12.25\n", "z": "0" } ], @@ -1104,13 +1317,15 @@ "808e3c26-7285-af3f-a079-d8b899176dd3": { "name": "head", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { "x": "0", - "y": "1 + math.sin(q.life_time * v.walk_speed + 90) * 12.25", + "y": "-1 - math.sin(q.life_time * v.walk_speed + 90) * 12.25", "z": "0" } ], @@ -1126,12 +1341,14 @@ "b5b52d2c-097c-08df-6457-372fbae12445": { "name": "left_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "math.sin(q.life_time * v.walk_speed) * 8", + "x": "-math.sin(q.life_time * v.walk_speed) * 8", "y": "0", "z": "22.5" } @@ -1147,7 +1364,7 @@ "channel": "position", "data_points": [ { - "x": "2", + "x": "-2", "y": "0", "z": "-math.sin(q.life_time * v.walk_speed) * 2" } @@ -1164,13 +1381,15 @@ "215d1b02-0e64-a794-1b88-a9c5a6d7541c": { "name": "right_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "math.sin(q.life_time * v.walk_speed) * 22.5", - "y": "math.sin(q.life_time * v.walk_speed) * 12.25", + "x": "-math.sin(q.life_time * v.walk_speed) * 22.5", + "y": "-math.sin(q.life_time * v.walk_speed) * 12.25", "z": "math.cos(q.life_time * v.walk_speed * 2) * 6 + 6" } ], @@ -1186,12 +1405,14 @@ "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69": { "name": "left_leg", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-math.sin(q.life_time * v.walk_speed) * 22.5", + "x": "math.sin(q.life_time * v.walk_speed) * 22.5", "y": "0", "z": "0" } @@ -1224,12 +1445,14 @@ "60d50d30-a018-429d-ba78-c5fb5804dd8a": { "name": "right_leg", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "math.sin(q.life_time * v.walk_speed) * 22.5", + "x": "-math.sin(q.life_time * v.walk_speed) * 22.5", "y": "0", "z": "0" } @@ -1262,6 +1485,8 @@ "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0": { "name": "body_waist_pivot", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", @@ -1280,6 +1505,34 @@ "easingArgs": [] } ] + }, + "98795982-9c43-6e3e-eed9-2c776a957938": { + "name": "root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "102db36a-eeda-0e6f-d5cc-c186ecda8165": { + "name": "baseplate_root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c": { + "name": "baseplate_pivot_a", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "98a28100-07e8-849a-38b7-f56abc2c2e56": { + "name": "waist_pivot", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "effects": { + "name": "Effects", + "type": "effect" } } } diff --git a/test-packs/latest/datapacks/animated_java/pack.mcmeta b/test-packs/latest/datapacks/animated_java/pack.mcmeta index 5810daaa..e18f2bf4 100644 --- a/test-packs/latest/datapacks/animated_java/pack.mcmeta +++ b/test-packs/latest/datapacks/animated_java/pack.mcmeta @@ -1,7 +1,7 @@ { "pack": { "description": "AJ Testing DP", - "min_format": 93.1, - "max_format": 9999999 + "min_format": 101, + "max_format": 101 } } \ No newline at end of file diff --git a/test-packs/latest/datapacks/test-framework/src/test.mcb b/test-packs/latest/datapacks/test-framework/src/test.mcb index 51156f90..e738ea44 100644 --- a/test-packs/latest/datapacks/test-framework/src/test.mcb +++ b/test-packs/latest/datapacks/test-framework/src/test.mcb @@ -2,12 +2,81 @@ function on_load minecraft:load { tellraw @a {"text":"Test Framework loaded!", "color":"green"} } -clock 1s 1t { - execute store result score #count aj.i if entity @e[type=item_display,tag=aj.global.root] - title @a actionbar [{"text":"Rig Count: "}, {"score":{"name":"#count","objective":"aj.i"}}] -} +# clock 1s 1t { +# execute store result score #count aj.i if entity @e[type=item_display,tag=aj.global.root] +# title @a actionbar [{"text":"Rig Count: "}, {"score":{"name":"#count","objective":"aj.i"}}] +# } dir armor_stand { + function test { + scoreboard players set #failed_tests aj.i 0 + execute as @e[tag=aj.armor_stand.root] run { + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_locator {name:'left_hand',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"as_locator test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/at_locator {name:'left_hand',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"at_locator test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_at_locator {name:'left_hand',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"as_at_locator test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_all_locators {command:'scoreboard players add #test aj.i 1'} + execute unless score #test aj.i matches 2 run { + tellraw @a {"text":"as_all_locators test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/at_all_locators {command:'scoreboard players add #test aj.i 1'} + execute unless score #test aj.i matches 2 run { + tellraw @a {"text":"at_all_locators test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_at_all_locators {command:'scoreboard players add #test aj.i 1'} + execute unless score #test aj.i matches 2 run { + tellraw @a {"text":"as_at_all_locators test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_camera {name:'camera',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"as_camera test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + + scoreboard players set #test aj.i 0 + function animated_java:armor_stand/as_node {name:'head',command:'scoreboard players set #test aj.i 1'} + execute if score #test aj.i matches 0 run { + tellraw @a {"text":"as_node test failed!","color":"red"} + scoreboard players add #failed_tests aj.i 1 + } + } + + execute if score #failed_tests aj.i matches 0 run { + tellraw @a {"text":"All tests passed!","color":"green"} + } + + execute if score #failed_tests aj.i matches 1.. run { + tellraw @a [{"score":{"name":"#failed_tests","objective":"aj.i"}}, {"text":" tests failed!","color":"red"}] + } + } + function summon { #ARGS: {args:{...}} function animated_java:global/remove/everything @@ -21,7 +90,6 @@ dir armor_stand { } function summon_many { - function animated_java:global/remove/everything data remove storage test:temp args $data modify storage test:temp args set value {args:$(args)} REPEAT (0, 199) as i { @@ -32,79 +100,23 @@ dir armor_stand { } function summon_many_minimal { - function animated_java:global/remove/everything data remove storage test:temp args $data modify storage test:temp args set value {args:$(args)} - REPEAT (0, 999) as i { + REPEAT (0, 199) as i { schedule 1t { execute positioned <%i % 16%> 1 <%Math.floor(i / 16)%> rotated 0 0 run function animated_java:armor_stand_minimal/summon with storage test:temp args } } } - - function test_dismounted { - function animated_java:global/remove/everything - execute positioned 0 1 0 rotated 0 0 run function animated_java:armor_stand/summon {args:{animation:'test',start_animation:true}} - # execute as @e[tag=aj.global.node] run ride @s dismount - } - - function test_precise_camera_rotation { - function animated_java:global/remove/everything - execute positioned 0 1 0 rotated 0 0 run function animated_java:armor_stand/summon {args:{animation:'camera_test',start_animation:true}} - gamemode spectator @s - execute as @n[tag=aj.global.root] run function animated_java:armor_stand/as_camera {name:'camera',command:'spectate @s @p'} - } - - dir test { - function at_all_locators { - function animated_java:global/remove/everything - execute positioned 0 1 0 rotated 0 0 run function animated_java:armor_stand/summon {args:{}} - - scoreboard players set #test aj.i 0 - execute as @e[tag=aj.armor_stand.root] run function animated_java:armor_stand/at_all_locators {command:'scoreboard players add #test aj.i 1'} - execute if score #test aj.i matches 0 run return run tellraw @a {text: 'TEST FAILED: No locators executed the command', color: 'red'} - - tellraw @a {text: '\nThe following message should be an error warning about an empty command string', color: 'green'} - execute as @e[tag=aj.armor_stand.root] run function animated_java:armor_stand/at_all_locators {command:''} - tellraw @a {text: 'end of message', color: 'green'} - - tellraw @a {text: '\nThe following message(s) should be error(s) warning about an invalid command', color: 'green'} - execute as @e[tag=aj.armor_stand.root] run function animated_java:armor_stand/at_all_locators {command:'someone did an oopsie'} - tellraw @a {text: 'end of message(s)', color: 'green'} - } - - function as_all_locators { - function animated_java:global/remove/everything - execute positioned 0 1 0 rotated 0 0 run function animated_java:armor_stand/summon {args:{}} - - scoreboard players set #test aj.i 0 - execute as @e[tag=aj.armor_stand.root] run function animated_java:armor_stand/as_all_locators {command:'scoreboard players add #test aj.i 1'} - execute if score #test aj.i matches 0 run return run tellraw @a {text: 'TEST FAILED: No locators executed the command', color: 'red'} - - tellraw @a {text: '\nThe following message should be an error warning about an empty command string', color: 'green'} - execute as @e[tag=aj.armor_stand.root] run function animated_java:armor_stand/as_all_locators {command:''} - tellraw @a {text: 'end of message', color: 'green'} - - tellraw @a {text: '\nThe following message(s) should be error(s) warning about an invalid command', color: 'green'} - execute as @e[tag=aj.armor_stand.root] run function animated_java:armor_stand/as_all_locators {command:'someone did an oopsie'} - tellraw @a {text: 'end of message(s)', color: 'green'} - } - - function as_at_all_locators { - function animated_java:global/remove/everything - execute positioned 0 1 0 rotated 0 0 run function animated_java:armor_stand/summon {args:{}} - - scoreboard players set #test aj.i 0 - execute as @e[tag=aj.armor_stand.root] run function animated_java:armor_stand/as_at_all_locators {command:'scoreboard players add #test aj.i 1'} - execute if score #test aj.i matches 0 run return run tellraw @a {text: 'TEST FAILED: No locators executed the command', color: 'red'} - - tellraw @a {text: '\nThe following message should be an error warning about an empty command string', color: 'green'} - execute as @e[tag=aj.armor_stand.root] run function animated_java:armor_stand/as_at_all_locators {command:''} - tellraw @a {text: 'end of message', color: 'green'} - - tellraw @a {text: '\nThe following message(s) should be error(s) warning about an invalid command', color: 'green'} - execute as @e[tag=aj.armor_stand.root] run function animated_java:armor_stand/as_at_all_locators {command:'someone did an oopsie'} - tellraw @a {text: 'end of message(s)', color: 'green'} - } - } } + +clock debug 1t { + title @a actionbar [ \ + "p:", {"score":{"name":"#aj.data_manager.preps_this_tick","objective":"aj.i"}}, \ + " r:", {"score":{"name":"#aj.data_manager.reads_this_tick","objective":"aj.i"}}, \ + " w:", {"score":{"name":"#aj.data_manager.writes_this_tick","objective":"aj.i"}} \ + ] + scoreboard players set #aj.data_manager.preps_this_tick aj.i 0 + scoreboard players set #aj.data_manager.reads_this_tick aj.i 0 + scoreboard players set #aj.data_manager.writes_this_tick aj.i 0 +} \ No newline at end of file diff --git a/test-packs/latest/resources/pack.mcmeta b/test-packs/latest/resources/pack.mcmeta index b33969cb..95e4d0bf 100644 --- a/test-packs/latest/resources/pack.mcmeta +++ b/test-packs/latest/resources/pack.mcmeta @@ -1,7 +1,7 @@ { "pack": { - "min_format": 74, - "max_format": 9999999, + "min_format": 101, + "max_format": 101, "description": "AJ Testing RP" } } \ No newline at end of file diff --git a/test_blueprints/armor_stand.ajblueprint b/test_blueprints/armor_stand.ajblueprint index 5e5a37a7..4e20978e 100644 --- a/test_blueprints/armor_stand.ajblueprint +++ b/test_blueprints/armor_stand.ajblueprint @@ -1,55 +1,35 @@ { "meta": { - "format": "animated_java_blueprint", - "format_version": "1.6.5", + "format": "animated-java:format/blueprint", + "format_version": "1.9.0-beta.3", "uuid": "167b27cd-b559-3f13-a97c-0841fe21f1d1", - "save_location": "D:\\github-repos\\animated-java\\animated-java\\test_blueprints\\armor_stand.ajblueprint", + "save_location": "/var/mnt/ssd2/repos/animated-java/animated-java/test_blueprints/armor_stand.ajblueprint", "last_used_export_namespace": "armor_stand" }, + "resolution": { + "width": 64, + "height": 64 + }, "blueprint_settings": { "export_namespace": "armor_stand", - "show_bounding_box": false, - "auto_bounding_box": true, - "bounding_box": [95, 32], - "enable_plugin_mode": false, - "resource_pack_export_mode": "raw", - "data_pack_export_mode": "raw", - "target_minecraft_versions": ["1.21.5"], - "display_item": "minecraft:white_dye", - "custom_model_data_offset": 0, - "enable_advanced_resource_pack_settings": false, + "render_box": [95, 32], + "target_minecraft_version": "1.21.5", "resource_pack": "C:\\Users\\SnaveSutit\\AppData\\Roaming\\ModrinthApp\\profiles\\Animated Java Dev\\resourcepacks\\resourcepack", - "enable_advanced_data_pack_settings": false, "data_pack": "C:\\Users\\SnaveSutit\\AppData\\Roaming\\ModrinthApp\\profiles\\Animated Java Dev\\saves\\Animated Java Dev\\datapacks\\datapack", - "summon_commands": "", - "ticking_commands": "", - "interpolation_duration": 1, - "teleportation_duration": 1, - "use_storage_for_animation": false, - "show_function_errors": true, - "show_outdated_warning": true, "baked_animations": false, - "json_file": "../testPluginExport.json", - "target_minecraft_version": "1.21.4", - "enable_advanced_resource_pack_folders": false, - "display_item_path": "", - "model_folder": "", - "texture_folder": "", - "customModelDataOffset": 0, - "custom_summon_commands": "" - }, - "resolution": { - "width": 64, - "height": 64 + "json_file": "../testPluginExport.json" }, "elements": [ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-6, 0, -6], "to": [6, 1, 6], @@ -59,27 +39,27 @@ "faces": { "north": { "uv": [12, 44, 24, 45], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [0, 44, 12, 45], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [36, 44, 48, 45], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [24, 44, 36, 45], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [12, 32, 24, 44], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [24, 32, 36, 44], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -88,10 +68,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-4, 12, -1], "to": [4, 14, 1], @@ -101,27 +84,27 @@ "faces": { "north": { "uv": [2, 50, 10, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [0, 50, 2, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [12, 50, 20, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [10, 50, 12, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [2, 50, 10, 52], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [10, 48, 18, 50], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -130,10 +113,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [1, 1, -1], "to": [3, 12, 1], @@ -143,27 +129,27 @@ "faces": { "north": { "uv": [10, 2, 12, 13], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [12, 2, 14, 13], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [14, 2, 16, 13], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [8, 2, 10, 13], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [10, 0, 12, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [12, 0, 14, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -172,10 +158,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-3, 1, -1], "to": [-1, 12, 1], @@ -185,27 +174,27 @@ "faces": { "north": { "uv": [44, 18, 42, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [46, 18, 44, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [48, 18, 46, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [42, 18, 40, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [42, 16, 44, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [44, 16, 46, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -214,10 +203,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-6, 21, -1.5], "to": [6, 24, 1.5], @@ -227,27 +219,27 @@ "faces": { "north": { "uv": [3, 29, 15, 32], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [0, 29, 3, 32], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [18, 29, 30, 32], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [15, 29, 18, 32], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [3, 26, 15, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [15, 26, 27, 29], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -256,10 +248,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [1, 14, -1], "to": [3, 21, 1], @@ -269,27 +264,27 @@ "faces": { "north": { "uv": [18, 2, 20, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [16, 2, 18, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [22, 2, 24, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [20, 2, 22, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [18, 0, 20, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [20, 0, 22, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -298,10 +293,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-3, 14, -1], "to": [-1, 21, 1], @@ -311,27 +309,27 @@ "faces": { "north": { "uv": [50, 18, 52, 25], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [48, 18, 50, 25], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [54, 18, 56, 25], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [52, 18, 54, 25], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [50, 16, 52, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [52, 16, 54, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -340,10 +338,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-7, 12, -1], "to": [-5, 24, 1], @@ -353,27 +354,27 @@ "faces": { "north": { "uv": [36, 18, 34, 30], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [34, 18, 32, 30], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [40, 18, 38, 30], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [38, 18, 36, 30], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [34, 18, 36, 16], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [36, 16, 38, 18], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -382,10 +383,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [5, 12, -1], "to": [7, 24, 1], @@ -395,27 +399,27 @@ "faces": { "north": { "uv": [26, 2, 28, 14], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [24, 2, 26, 14], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [30, 2, 32, 14], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [28, 2, 30, 14], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [26, 0, 28, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [30, 0, 28, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -424,10 +428,13 @@ { "name": "cube", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-1, 23, -1], "to": [1, 30, 1], @@ -437,27 +444,27 @@ "faces": { "north": { "uv": [2, 2, 4, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "east": { "uv": [0, 2, 2, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "south": { "uv": [6, 2, 8, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "west": { "uv": [4, 2, 6, 9], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "up": { "uv": [2, 0, 4, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" }, "down": { "uv": [4, 0, 6, 2], - "texture": 0 + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" } }, "type": "cube", @@ -466,10 +473,13 @@ { "name": "helmet", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-5, 22, -5], "to": [5, 32, 5], @@ -479,27 +489,27 @@ "faces": { "north": { "uv": [8, 16, 16, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [0, 16, 8, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [24, 16, 32, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [16, 16, 24, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [8, 0, 16, 16], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [16, 0, 24, 16], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -508,10 +518,13 @@ { "name": "chestplate", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-5, 11.25, -3], "to": [5, 23.75, 3], @@ -521,27 +534,27 @@ "faces": { "north": { "uv": [20, 40, 28, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [16, 40, 20, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [32, 40, 40, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [28, 40, 32, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [20, 32, 28, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [28, 32, 36, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -550,10 +563,13 @@ { "name": "left_chestplate", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-9, 19.25, -3], "to": [-3, 25, 3], @@ -563,27 +579,27 @@ "faces": { "north": { "uv": [48, 40, 44, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [44, 40, 40, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [56, 40, 52, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [52, 40, 48, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [44, 39.75, 48, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [52, 32, 48, 39.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -592,10 +608,13 @@ { "name": "left_chestplate", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [3, 19.25, -3], "to": [9, 25, 3], @@ -605,27 +624,27 @@ "faces": { "north": { "uv": [44, 40, 48, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [48, 40, 52, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [52, 40, 56, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [40, 40, 44, 49.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [48, 39.75, 44, 32], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [48, 32, 52, 39.75], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -634,10 +653,13 @@ { "name": "pants", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-4.5, 11.5, -2.5], "to": [4.5, 17, 2.5], @@ -647,27 +669,27 @@ "faces": { "north": { "uv": [20, 54, 28, 64], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "east": { "uv": [16, 54, 20, 64], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "south": { "uv": [32, 54, 40, 64], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "west": { "uv": [28, 54, 32, 64], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "up": { "uv": [20, 48, 28, 54], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "down": { "uv": [28, 48, 36, 54], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" } }, "type": "cube", @@ -676,10 +698,13 @@ { "name": "right_pants", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-0.5, 2.75, -2.375], "to": [4.25, 12, 2.375], @@ -689,27 +714,27 @@ "faces": { "north": { "uv": [4, 40, 8, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "east": { "uv": [0, 40, 4, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "south": { "uv": [12, 40, 16, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "west": { "uv": [8, 40, 12, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "up": { "uv": [4, 32, 8, 40], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "down": { "uv": [8, 32, 12, 40], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" } }, "type": "cube", @@ -718,10 +743,13 @@ { "name": "left_pants", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-4.25, 2.75, -2.375], "to": [0.5, 12, 2.375], @@ -731,27 +759,27 @@ "faces": { "north": { "uv": [8, 40, 4, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "east": { "uv": [12, 40, 8, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "south": { "uv": [16, 40, 12, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "west": { "uv": [4, 40, 0, 58], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "up": { "uv": [8, 32, 4, 40], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" }, "down": { "uv": [12, 32, 8, 40], - "texture": 2 + "texture": "34528a28-3a31-8b47-65bb-ef2b60b02401" } }, "type": "cube", @@ -760,10 +788,13 @@ { "name": "right_shoe", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-1, -1, -3], "to": [4.75, 6, 3], @@ -773,27 +804,27 @@ "faces": { "north": { "uv": [4, 52, 8, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [0, 52, 4, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [12, 52, 16, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [8, 52, 12, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [4, 32, 8, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [8, 32, 12, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -802,10 +833,13 @@ { "name": "left_shoe", "box_uv": false, + "render_order": "default", "rescale": false, "locked": false, + "shade": true, "light_emission": 0, - "render_order": "default", + "export": true, + "scope": 0, "allow_mirror_modeling": true, "from": [-4.75, -1, -3], "to": [1, 6, 3], @@ -815,27 +849,27 @@ "faces": { "north": { "uv": [8, 52, 4, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "east": { "uv": [12, 52, 8, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "south": { "uv": [16, 52, 12, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "west": { "uv": [4, 52, 0, 64], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "up": { "uv": [8, 32, 4, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" }, "down": { "uv": [12, 32, 8, 40], - "texture": 1 + "texture": "240844f3-f615-fe51-0ada-d208791fbdc0" } }, "type": "cube", @@ -848,12 +882,13 @@ "ignore_inherited_scale": false, "visibility": true, "locked": false, + "scope": 0, "config": { "use_entity": true, "entity_type": "minecraft:pig", "sync_passenger_rotation": true, "summon_commands": "", - "ticking_commands": "particle minecraft:bubble ^ ^ ^1\ntp @e[tag=test3,limit=1] ~ ~ ~ ~ ~" + "on_tick_function": "particle minecraft:bubble ^ ^ ^1\ntp @e[tag=test3,limit=1] ~ ~ ~ ~ ~" }, "uuid": "7de415a2-9fdd-e4b2-3455-c3bed72eb896", "type": "locator" @@ -865,83 +900,651 @@ "ignore_inherited_scale": false, "visibility": true, "locked": false, + "scope": 0, "config": { "use_entity": true, "entity_type": "minecraft:pig", "summon_commands": "", - "ticking_commands": "particle minecraft:bubble ^ ^ ^1\ntp @e[tag=test2,limit=1] ~ ~ ~ ~ ~" + "on_tick_function": "particle minecraft:bubble ^ ^ ^1\ntp @e[tag=test2,limit=1] ~ ~ ~ ~ ~" }, "uuid": "7747736f-85e2-338f-207e-53f8d3d2fa39", "type": "locator" }, { - "name": "text_display", - "position": [0, 38, 0], - "rotation": [45, 0, 0], - "scale": [1, 1, 1], + "name": "text_display", + "position": [0, 38, 0], + "rotation": [45, 0, 0], + "pivotOffset": [0, 0, 0], + "scale": [1, 1, 1], + "visibility": true, + "locked": false, + "export": true, + "text": "{\n\t\"text\": \"Hello, World!\",\n\t\"color\": \"green\",\n\t\"shadow_color\": \"red\",\n}\n", + "lineWidth": 200, + "backgroundColor": "#ffffff40", + "align": "center", + "shadow": true, + "seeThrough": true, + "onSummonFunction": "", + "configs": { + "default": {}, + "variants": {} + }, + "scope": 0, + "uuid": "c2e217f1-b50a-5c9a-b342-71a35e984046", + "type": "animated_java:text_display" + }, + { + "name": "camera", + "box_uv": false, + "render_order": "default", + "rescale": false, + "locked": false, + "shade": true, + "light_emission": 0, + "export": true, + "scope": 0, + "allow_mirror_modeling": true, + "from": [0, 0, 0], + "to": [1, 1, 1], + "autouv": 0, + "color": 0, + "origin": [0, 0, 0], + "faces": { + "north": { + "uv": [0, 0, 1, 1], + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" + }, + "east": { + "uv": [0, 0, 1, 1], + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" + }, + "south": { + "uv": [0, 0, 1, 1], + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" + }, + "west": { + "uv": [0, 0, 1, 1], + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" + }, + "up": { + "uv": [0, 0, 1, 1], + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" + }, + "down": { + "uv": [0, 0, 1, 1], + "texture": "eb6c49b8-8e8e-a039-9a6f-ef6a06bc7924" + } + }, + "type": "cube", + "uuid": "3f916352-b0e1-f1e4-0e09-308cc68f96e6" + } + ], + "groups": [ + { + "name": "root", + "uuid": "98795982-9c43-6e3e-eed9-2c776a957938", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 0, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glow_color": "#ffffff", + "glowing": false, + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": {} + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "baseplate_root", + "uuid": "102db36a-eeda-0e6f-d5cc-c186ecda8165", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 0, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glow_color": "#ffffff", + "glowing": false, + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": {} + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": false, + "primary_selected": false + }, + { + "name": "baseplate_pivot_a", + "uuid": "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 1, 6], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glow_color": "#ffffff", + "glowing": false, + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": {} + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "armor_stand_root", + "uuid": "5e08acae-d6ca-0dfd-9360-8cdb13c7a824", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 1, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": {} + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "waist_pivot", + "uuid": "98a28100-07e8-849a-38b7-f56abc2c2e56", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 12, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "5417306e-2c69-3f36-1e3c-edd904034a36": {} + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "body_waist_pivot", + "uuid": "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 12, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "5417306e-2c69-3f36-1e3c-edd904034a36": {} + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "body", + "uuid": "6c53311f-ffc8-e567-ff1b-65840698e9ba", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 24, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "5417306e-2c69-3f36-1e3c-edd904034a36": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": false, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#00ff06", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "head", + "uuid": "808e3c26-7285-af3f-a079-d8b899176dd3", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [0, 23, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#c400ff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "left_arm", + "uuid": "b5b52d2c-097c-08df-6457-372fbae12445", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [-6, 23, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#00ff9f", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, + { + "name": "right_arm", + "uuid": "215d1b02-0e64-a794-1b88-a9c5a6d7541c", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [6, 23, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": false, + "override_glow_color": true, + "glow_color": "#ffffff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + }, + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#ff0000", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, "visibility": true, - "block": "minecraft:stone", - "config": {}, - "item": "minecraft:diamond", - "itemDisplay": "none", - "text": "{\n\t\"text\": \"Hello, World!\",\n\t\"color\": \"green\",\n\t\"shadow_color\": \"red\",\n}\n", - "lineWidth": 200, - "backgroundColor": "#ffffff", - "backgroundAlpha": 0.25098, - "align": "center", - "shadow": true, - "seeThrough": true, - "uuid": "c2e217f1-b50a-5c9a-b342-71a35e984046", - "type": "animated_java:text_display" + "autouv": 0, + "isOpen": true, + "primary_selected": false }, { - "name": "camera", - "box_uv": false, - "rescale": false, + "name": "left_leg", + "uuid": "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69", + "export": true, "locked": false, - "light_emission": 0, - "render_order": "default", - "allow_mirror_modeling": true, - "from": [0, 0, 0], - "to": [1, 1, 1], - "autouv": 0, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [2, 12, 0], + "rotation": [0, 0, 0], "color": 0, - "origin": [0, 0, 0], - "faces": { - "north": { - "uv": [0, 0, 1, 1], - "texture": 0 - }, - "east": { - "uv": [0, 0, 1, 1], - "texture": 0 - }, - "south": { - "uv": [0, 0, 1, 1], - "texture": 0 - }, - "west": { - "uv": [0, 0, 1, 1], - "texture": 0 - }, - "up": { - "uv": [0, 0, 1, 1], - "texture": 0 + "onSummonFunction": "", + "configs": { + "default": { + "billboard": "fixed", + "brightness_override": 0, + "enchanted": false, + "glow_color": "#ffffff", + "glowing": false, + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false }, - "down": { - "uv": [0, 0, 1, 1], - "texture": 0 + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#ffee00", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } } }, - "type": "cube", - "uuid": "3f916352-b0e1-f1e4-0e09-308cc68f96e6" - } - ], - "outliner": [ + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, + "visibility": true, + "autouv": 0, + "isOpen": true, + "primary_selected": false + }, { - "name": "root", - "origin": [0, 0, 0], + "name": "right_leg", + "uuid": "60d50d30-a018-429d-ba78-c5fb5804dd8a", + "export": true, + "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [-2, 12, 0], + "rotation": [0, 0, 0], "color": 0, + "onSummonFunction": "", "configs": { "default": { "billboard": "fixed", @@ -956,232 +1559,92 @@ "shadow_strength": 1, "use_nbt": false }, - "variants": {} + "variants": { + "49521f4b-b970-e4bd-b594-2e05d2d46027": { + "billboard": "fixed", + "override_brightness": false, + "brightness_override": 0, + "enchanted": false, + "glowing": true, + "override_glow_color": true, + "glow_color": "#6e00ff", + "inherit_settings": true, + "invisible": false, + "nbt": "{}", + "shadow_radius": 0, + "shadow_strength": 1, + "use_nbt": false + } + } }, - "uuid": "98795982-9c43-6e3e-eed9-2c776a957938", - "export": true, + "children": [], + "reset": false, + "shade": true, "mirror_uv": false, + "visibility": true, + "autouv": 0, "isOpen": true, + "primary_selected": false + }, + { + "name": "pig", + "uuid": "3b35d1a9-befe-066e-60df-e1f3a5ec5a78", + "export": true, "locked": false, + "scope": 0, + "selected": false, + "_static": { + "properties": {}, + "temp_data": {} + }, + "origin": [16, 7, 0], + "rotation": [0, 0, 0], + "color": 0, + "onSummonFunction": "", + "configs": { + "variants": {} + }, + "children": [], + "reset": false, + "shade": true, + "mirror_uv": false, "visibility": true, "autouv": 0, - "selected": false, + "isOpen": true, + "primary_selected": false + } + ], + "outliner": [ + { + "uuid": "98795982-9c43-6e3e-eed9-2c776a957938", + "isOpen": true, "children": [ { - "name": "baseplate_root", - "origin": [0, 0, 0], - "color": 0, - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glow_color": "#ffffff", - "glowing": false, - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": {} - }, "uuid": "102db36a-eeda-0e6f-d5cc-c186ecda8165", - "export": true, - "mirror_uv": false, "isOpen": false, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ { - "name": "baseplate_pivot_a", - "origin": [0, 1, 6], - "color": 0, - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glow_color": "#ffffff", - "glowing": false, - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": {} - }, "uuid": "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["46624743-e0ef-5e97-e6d8-ba5dc100baf4"] } ] }, { - "name": "armor_stand_root", - "origin": [0, 1, 0], - "color": 0, - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": {} - }, "uuid": "5e08acae-d6ca-0dfd-9360-8cdb13c7a824", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ { - "name": "waist_pivot", - "origin": [0, 12, 0], - "color": 0, - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "5417306e-2c69-3f36-1e3c-edd904034a36": {} - } - }, "uuid": "98a28100-07e8-849a-38b7-f56abc2c2e56", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ { - "name": "body_waist_pivot", - "origin": [0, 12, 0], - "color": 0, - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "5417306e-2c69-3f36-1e3c-edd904034a36": {} - } - }, "uuid": "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ { - "name": "body", - "origin": [0, 24, 0], - "color": 0, - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "5417306e-2c69-3f36-1e3c-edd904034a36": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": false, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#00ff06", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "6c53311f-ffc8-e567-ff1b-65840698e9ba", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [ "55829f3d-26dc-8f49-39b8-5ba2c0159a24", "9d16df18-0574-58bb-e0f9-f799946257c9", @@ -1190,147 +1653,18 @@ "6dd668dd-27bd-631d-5e44-a94f7a35ddbb", "d5e974ae-a732-db7a-59a1-c16ff717e426", { - "name": "head", - "origin": [0, 23, 0], - "color": 0, - "configs": { - "default": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#c400ff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "808e3c26-7285-af3f-a079-d8b899176dd3", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["a23d9259-0d9a-4e16-1b42-47e5bedba00f", "a302b268-1699-4013-011f-211bd85806d4"] }, { - "name": "left_arm", - "origin": [-6, 23, 0], - "color": 0, - "configs": { - "default": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#00ff9f", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "b5b52d2c-097c-08df-6457-372fbae12445", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["c219cb9b-53a7-6a5b-7b47-dce0a1e6ec14", "967c77d0-2607-0ecb-8093-416d237cdb85", "7de415a2-9fdd-e4b2-3455-c3bed72eb896"] }, { - "name": "right_arm", - "origin": [6, 23, 0], - "color": 0, - "configs": { - "default": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": false, - "override_glow_color": true, - "glow_color": "#ffffff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#ff0000", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "215d1b02-0e64-a794-1b88-a9c5a6d7541c", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["13293700-7f42-2279-6a1f-4e0a6a4d89b3", "98475898-cfc8-f67b-3145-abaf659deb3e", "7747736f-85e2-338f-207e-53f8d3d2fa39"] } ] @@ -1338,95 +1672,13 @@ ] }, { - "name": "left_leg", - "origin": [2, 12, 0], - "color": 0, - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glow_color": "#ffffff", - "glowing": false, - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#ffee00", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["d29efa52-def5-a311-7438-1fc73aac804c", "71bfec99-5014-21d3-739b-6512074212db", "41413d23-edf5-3fdc-2ddb-5fd45ea99a89"] }, { - "name": "right_leg", - "origin": [-2, 12, 0], - "color": 0, - "configs": { - "default": { - "billboard": "fixed", - "brightness_override": 0, - "enchanted": false, - "glow_color": "#ffffff", - "glowing": false, - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - }, - "variants": { - "49521f4b-b970-e4bd-b594-2e05d2d46027": { - "billboard": "fixed", - "override_brightness": false, - "brightness_override": 0, - "enchanted": false, - "glowing": true, - "override_glow_color": true, - "glow_color": "#6e00ff", - "inherit_settings": true, - "invisible": false, - "nbt": "{}", - "shadow_radius": 0, - "shadow_strength": 1, - "use_nbt": false - } - } - }, "uuid": "60d50d30-a018-429d-ba78-c5fb5804dd8a", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": ["60766231-bd45-cb3f-0a4f-c6c066e86f54", "4dd0c5f1-828f-d559-6496-16e2fbe6276d", "11976d8b-3994-df35-0fb9-b92ac5012141"] } ] @@ -1437,32 +1689,21 @@ ] }, { - "name": "pig", - "origin": [16, 7, 0], - "color": 0, - "configs": { - "variants": {} - }, "uuid": "3b35d1a9-befe-066e-60df-e1f3a5ec5a78", - "export": true, - "mirror_uv": false, "isOpen": true, - "locked": false, - "visibility": true, - "autouv": 0, - "selected": false, "children": [] }, "c2e217f1-b50a-5c9a-b342-71a35e984046" ], "textures": [ { - "path": "", "name": "wood.png", + "path": "", "folder": "", "namespace": "", "id": "0", "group": "", + "scope": 0, "width": 64, "height": 64, "uv_width": 64, @@ -1471,9 +1712,12 @@ "use_as_default": false, "layers_enabled": false, "sync_to_project": "", + "file_format": "png", "render_mode": "default", "render_sides": "auto", + "wrap_mode": "limited", "pbr_channel": "color", + "fps": 7, "frame_time": 1, "frame_order_type": "loop", "frame_order": "", @@ -1485,12 +1729,13 @@ "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAB6xJREFUeF7tW01oXUUUnmebkjZNCU1bjSnVtAUNVks0VK1gEbLowmK6EIOKP3VRKBYNBldqiLoMRIkUurAq+PPEhUpduAiIgkVLMDy1qGCtDY3RmsRH07SxSb3yzfW7OW9y75u5uS/v3WBnc+fnzN8353wzc+a9jPovHHtzv4foRH5S59z79LsZluH7xev7vJOjf6otDesVvo8/dzR2+a8jf6nLV83qNu5+4khBfdlXOePBIGwAPPPInd59u5rVx5//oPA1J2Ar/+SVB72pv/9Rx0+cDq1fzknLvjKfvvaoXnmEizMXVH5qOiivq6nW8dGRMbWybrVCemXVqqAc8kivWrlMawVWVgYz78LFy7oPBPTTULdW7X7yrYpqQubDvvs9OWkMjhNHHBPkRE2AKEtQWI76aPNi/nwAHNuSAEF+b+cHlQXgUNc9WgN+n7ig/piYCsZ39doadc3audWW5ShDgPwdrU06Tu3gClNzNl+/qUBjuPrMNLmk3KaQAbmhU6inHnR+Yp4qF1Prd44e18UEBaCZYMpyxKXM4Y++r6wGgAMwaa4izQH2ieCi1uAAgkgNqF9TW3QxATj6rbgGgANo57Rbqq20fc4GhCjVmiBJcpTAsR55gV8tkz+vDvR+VlkN2N++TZtAlM0zP0qt2+66SZuPZHe59JJQpf1Dw1KhATbSgYkUU2vJASTNKEJFPoIk24pzgAsAlAk7J9i2MZIs2uC5ABpD3qj0idBqf7Zzgg2AN17e40lCJd8QVFt92wIlLbcCYDsn2EiMJ82wQxQGX/FdICmCtvoAkJwAQpX2j7qp5wDbBJd6udUElvoEbeMvAACEZatQrDyJPbv4G4r5E2z1o8adGgCS+hNs9VMLAA9a9CuYAx0/Nxn4IMLuJdua/duoGVzvGvo2iANKqQKcIujc1dEht0mMwXS+yIuaeYagLOot9K5RUgB4vo/j6eFlTJ425eXsq8FTuijqur17V3PB2snbrMtdI/AHlEIL6AGKAwDPCZhF2F1ib9ttwbFZXrp43cZdRF7Y0E6cu0bFt0GYQDGfIsDktVwuNflA+iEXctfQALyw73avafMG3T5tmLZ36pezOl+WI02S4aAgBxl8XzzytTOw0gSiSK7YdRv9J7lrZDh5NMKV4GTYOG9uYRNn5wBsISDw7BHlU8z97BO09FfI6zZMBGGhdw3nlSrVLmG2Ix0y5AE5wYf27NDXaC4QF0HvGPkJ7VVKcteY97rDAbr4+Sm7fFmV+unMb+qGjdeq2cszCmkE5lFu52OH5wFODuDETOcLzgEIdLmZ/sskp0+0WzAgvA5hArRvqjcngM6ZJx2hXI0oecgClCgAipGc9CFKM6H/0nYdt2nuPABYQa4eV1Wustmwi8aEeX9wECtGcjgHyHcIkw8SAyDfBdasrtYqjEC7m52dUcuX+yoNDVi/2nd3r6mt1pqCcpkmGUGO9WRd5EEjCEaYU1ZywGL7CwreBjEwTur4tydVy82bCs7hQ98NB3mQPTc5HUzSrLvjli0aGEwYoKDuzltv1IABvEr7AqnBGXkF5lEWhVA9PntRWOZJWZTHret6V7DZcNLy2Ntgd3e3NzU1pWpq/PdBxBEaGxvVyMiIjqOsrq5O5fP5QMZVvqenJ/aYkoAQu7Ouri6vtbVVVVf7T+dmGB8fD8AZHR3VoMSR7+zsjD2msgPQ3NysVqxYofu9dOmSjldV+USJAHCmp6fV4OCgTseR7+3tTTcAMIGWlhY9QQaYAQGRqzE2NqbNII586jWgr6/Pa2ryvTCTk/4pDaG2dv5r8NDQkOaCOPKp5wBowNatWwtUfmZmJkgjTtMYHh7W8TjyqQdAkiA1wFx9mgc5gCToIr8kOACkxiBXX5Ig4jABkqCrfOo1ABywbt06yXWRcZAgQhz51JMgdwGoM1Sf+z53Am6H2AqpAdgFXOVTrwHkAKwsCU/uArB/5udyOa0B4ABX+SXBAfIojG0OAfs9j8XFjsI2+bJrQDab1e+BcjWlUfOkZ+73UP36+nqt2uYpUNaXZwWZjzoSSPaPfJiPuWMgzbHIXae9vT3RyTFRZScmTLnQFQBSvkCLPrxAA+ibk45PxuntoUfWHFWcp7BFn1HMDq4AwD9K0Bk68OUJhV9/Isg4ff02ubT4+lwVIXCKUt2PffOjdl4iMB5mFlFySR8qXAdeKrkru0AYkngwNf88EefFt1SrU452QjWAvIABwObD/iVWjsGVo49QAOTvezEIl5+alGOwi9FHKADyXyTsdKmRmytYoQBIDuDD5P+KA1zRK5Ncol+v2sZIDWAnSMsOF5JWqr7bb2O8J6Pj5pejcinHeOq71cjbPbpW48NzcabxRTnKGJdlZh7bQr40AQyaE174d0O/p84enGuXaZkfFo8qV8rLvafU9qf6g8XMvXowNM38qC8bkPVLD0BD1lOjHXPtIs3AfCnDeFieX89TDVk18HyHanspqzMQRzDTzAsrhyzbkOVRK80hxzeBjQOeOtM2BwDTMt+MszfWK2zDUxsHtET2QJvqODQQfFnNzHdN0wTCbD4MGPZHUzHTc/nX5fw2T2/PKMTNL2u6lCvl9T/rVzj4vu9k7X9ge6BUyEO62Jd1wur/C4S4j3y2CFhdAAAAAElFTkSuQmCC" }, { - "path": "", "name": "iron_layer_1.png", + "path": "", "folder": "", "namespace": "", "id": "1", "group": "", + "scope": 0, "width": 64, "height": 32, "uv_width": 64, @@ -1499,9 +1744,12 @@ "use_as_default": false, "layers_enabled": false, "sync_to_project": "", + "file_format": "png", "render_mode": "default", "render_sides": "auto", + "wrap_mode": "limited", "pbr_channel": "color", + "fps": 7, "frame_time": 1, "frame_order_type": "loop", "frame_order": "", @@ -1513,12 +1761,13 @@ "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAAAXNSR0IArs4c6QAAA6VJREFUaEPlmb9qMkEUxVcIKCikUBCSTot0yROYwkqf2FQK8Qm0U0g6hYAWAYUEhP34DZzlOqzORqNu/KZJZufuOPfMvef+2UIUGK+vr/F6vXZS5XI5kdazbrdbCO2R5/Xg4QGg1Wo5Hebzufu7Wq3c34+Pj+j5+Tm4x1UAMBgMomq1muhSKpX+DwB6vV78+PgYLRaLaLlcJgAAxufn5/VbgA/A/f19AsL7+3t09RwAAI1GI/r6+nIWIAAqlUr09vZ2/RYACdbrdXfrgIDvozxjPB5fvwUAAMruCoV/3gV2KYjCNu7L8XcBIdm0dRsG7b78f2kAC4rzxHjFd5k7LM8hO51ONJ1OnQtowAff398OpNvbW+caGrjI3d1dNBwO3SObRxBNJJuHPKKQFuYIcbVazfm4MkCAgAxns1miuG7bD5P2fQACAO2lUAqZ5gYAbksHu7m5cUpbU1a2F8dxTELUbrdd9gd4unW5wGazcY8AQZkjAE0mk62EUOu5cAGr8L4D9ft9p7AASEtxBYrlBAFsM0ksLA9h9OR5vIopQLAhFOVzQYLnKlSwDGsVlzZ96X1yCzgXwIf+ThCA0WgUiyDx4aenp+A7hx4my3vKW8Rbx1pSUJnJZBKrDsgLAIRVIsxvkGgQgNlsFitBAohLW4DyFsIqIfvYhkwQAJsqQ2LH/mAWM98nY3MP5E7uAqED76olfKCs7/qJFvN98n79oOw0bZ+f1hpBC8gCAD5JrUBqy2g2m1v+qZ6C1tPkSZVtmKT+eHl5cc+sz2t/v9aAE7SH5LOU60cDYGsJWzzpQBxYxRQAcEOqHZBn6MDiGoopiib2AAAAtXPS7YeHh0RhijGG5JkTubJwxNEAYNr+AXTDHAplpBgtNFWPOrAFSNamqIMCAMZtMwSwPy8Wi6728NcBJMQRvwKAOkbWBbgxO9RF5llIXq03WQygqTiz/r+PA7J+tzgaAFxAxY5ujLI5bUghK28B8d85R7ns+gE/YVXdhiUsNU1lgpqnWYD6Cpi5b7LI26wziwmHSDq0vtURUoUGaSnTsiSVxrLyab9DxHvq/KiT5JMUHSWGtRjJnuvDiwMAn9SNyCSZ68B23b9BIWzjLyxta3/drJot8l1ZkUj0Eh9enAvAorSoLEsrjIiFdSPMJb/LR7WnQJB17GLktGTqXL2CxAL0oYPbIe4SukRamKhdxyKY70s0fjtlDfnyoevOAtJa2jbsiCTTQtGla4NDFdd7/wAIfE5OhlGtmAAAAABJRU5ErkJggg==" }, { - "path": "", "name": "iron_layer_2.png", + "path": "", "folder": "", "namespace": "", "id": "2", "group": "", + "scope": 0, "width": 64, "height": 32, "uv_width": 64, @@ -1527,9 +1776,12 @@ "use_as_default": false, "layers_enabled": false, "sync_to_project": "", + "file_format": "png", "render_mode": "default", "render_sides": "auto", + "wrap_mode": "limited", "pbr_channel": "color", + "fps": 7, "frame_time": 1, "frame_order_type": "loop", "frame_order": "", @@ -1541,12 +1793,13 @@ "source": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAAAXNSR0IArs4c6QAAAZZJREFUaEPtVruqhDAQjZ1gYSlY+gH+gfZ+sb2fYWEpCDaCgt1eTrhHhlldLsgVNkkajZldmJPzmMh4viLP+zcBgMAAzxEIEvCcAMEEgwSCBDxHIEjAcwKEFAgSCBJQCHRd98KnbdtMkiSmrmunWfLWHACoqsr0fW+GYTBN0/gFQNu2r6IobPNYXgIgVeE8ANQ8dY8ntC994OrMBYZEAACGl+e5GcfRNp+mqQVA75dlsd9xjjMnAIDm0QgAYINZltnmpmmyaQBPwKIvYL/vu63/9pSwDOCNoyGy4YoBEhAA5AQAvHHcMCVA+pPycRxbRnCPpxMMkBJg07xlSkD6g/QAFwalQwK6eeqdjAADyBBpmt8ek28eoCMPzWqT1CnxKSZ1pHLE5v/yXMYuz55ImSMGz7L/L42hhqMzPQJ7mui6rvadqSLrySjW6988YbK353w5OgNE3F5Zlmae5wMEMogyg+lKOV3VP2GytwE4G6TYIG8eJsrU0JKSfqLrAdh/e8xtAJgiB89/hyrdsDzX72cAoeaJlPkBm2JOMHlI974AAAAASUVORK5CYII=" }, { - "path": "", "name": "transparent.png", + "path": "", "folder": "", "namespace": "", "id": "3", "group": "", + "scope": 0, "width": 16, "height": 16, "uv_width": 16, @@ -1555,9 +1808,12 @@ "use_as_default": false, "layers_enabled": false, "sync_to_project": "", + "file_format": "png", "render_mode": "default", "render_sides": "auto", + "wrap_mode": "limited", "pbr_channel": "color", + "fps": 7, "frame_time": 1, "frame_order_type": "loop", "frame_order": "", @@ -1627,9 +1883,10 @@ "override": false, "length": 2, "snapping": 20, - "selected": false, - "saved": false, + "selected": true, + "saved": true, "path": "", + "scope": 0, "anim_time_update": "", "blend_weight": "", "start_delay": "", @@ -1639,13 +1896,15 @@ "b5b52d2c-097c-08df-6457-372fbae12445": { "name": "left_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-90\n+ math.sin(q.life_time * 360) * 30", - "y": "-22.5\n+ math.cos(q.life_time * 360) * 30", + "x": "90\n- math.sin(q.life_time * 360) * 30", + "y": "22.5\n- math.cos(q.life_time * 360) * 30", "z": "0" } ], @@ -1661,13 +1920,15 @@ "215d1b02-0e64-a794-1b88-a9c5a6d7541c": { "name": "right_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-90\n+ math.sin(q.life_time * 360) * 30", - "y": "22.5\n- math.cos(q.life_time * 360) * 30", + "x": "90\n- math.sin(q.life_time * 360) * 30", + "y": "-22.5\n+ math.cos(q.life_time * 360) * 30", "z": "0" } ], @@ -1683,15 +1944,17 @@ "7de415a2-9fdd-e4b2-3455-c3bed72eb896": { "name": "left_hand", "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { - "channel": "commands", + "channel": "function", "data_points": [ { "x": "0", "y": "0", "z": "0", - "commands": "particle minecraft:flame ^ ^ ^", + "function": "particle minecraft:flame ^ ^ ^", "execute_condition": "", "repeat": true, "repeat_frequency": 5 @@ -1709,15 +1972,17 @@ "7747736f-85e2-338f-207e-53f8d3d2fa39": { "name": "right_hand", "type": "locator", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { - "channel": "commands", + "channel": "function", "data_points": [ { "x": "0", "y": "0", "z": "0", - "commands": "particle minecraft:flame ^ ^ ^", + "function": "particle minecraft:flame ^ ^ ^", "execute_condition": "", "repeat": true, "repeat_frequency": 1 @@ -1735,12 +2000,14 @@ "3b35d1a9-befe-066e-60df-e1f3a5ec5a78": { "name": "pig", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "position", "data_points": [ { - "x": "16 - math.cos(q.life_time * 180) * 16", + "x": "-16 + math.cos(q.life_time * 180) * 16", "y": "16 + math.sin(q.life_time * 360) * 8", "z": "-32" } @@ -1759,10 +2026,10 @@ "type": "effect", "keyframes": [ { - "channel": "commands", + "channel": "function", "data_points": [ { - "commands": "say hi", + "function": "say hi", "execute_condition": "", "repeat": false, "repeat_frequency": 1 @@ -1776,10 +2043,10 @@ "easingArgs": [] }, { - "channel": "commands", + "channel": "function", "data_points": [ { - "commands": "say bye", + "function": "say bye", "execute_condition": "", "repeat": false, "repeat_frequency": 1 @@ -1793,6 +2060,72 @@ "easingArgs": [] } ] + }, + "98795982-9c43-6e3e-eed9-2c776a957938": { + "name": "root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "102db36a-eeda-0e6f-d5cc-c186ecda8165": { + "name": "baseplate_root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c": { + "name": "baseplate_pivot_a", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "5e08acae-d6ca-0dfd-9360-8cdb13c7a824": { + "name": "armor_stand_root", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "98a28100-07e8-849a-38b7-f56abc2c2e56": { + "name": "waist_pivot", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0": { + "name": "body_waist_pivot", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "6c53311f-ffc8-e567-ff1b-65840698e9ba": { + "name": "body", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "808e3c26-7285-af3f-a079-d8b899176dd3": { + "name": "head", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69": { + "name": "left_leg", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "60d50d30-a018-429d-ba78-c5fb5804dd8a": { + "name": "right_leg", + "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false + }, + "c2e217f1-b50a-5c9a-b342-71a35e984046": { + "name": "text_display", + "type": "animated_java:text_display", + "rotation_global": false, + "quaternion_interpolation": false } } }, @@ -1804,8 +2137,9 @@ "length": 1, "snapping": 20, "selected": false, - "saved": false, + "saved": true, "path": "", + "scope": 0, "anim_time_update": "", "blend_weight": "", "start_delay": "", @@ -1815,12 +2149,14 @@ "5e08acae-d6ca-0dfd-9360-8cdb13c7a824": { "name": "armor_stand_root", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "90", + "x": "-90", "y": "0", "z": "0" } @@ -1853,12 +2189,14 @@ "98a28100-07e8-849a-38b7-f56abc2c2e56": { "name": "waist_pivot", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "math.cos(q.life_time * 360) * 22.5", + "x": "-math.cos(q.life_time * 360) * 22.5", "y": "0", "z": "0" } @@ -1891,12 +2229,14 @@ "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0": { "name": "body_waist_pivot", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-6\n+ math.sin(q.life_time * 360) * 22.5", + "x": "6\n- math.sin(q.life_time * 360) * 22.5", "y": "0", "z": "0" } @@ -1913,12 +2253,14 @@ "808e3c26-7285-af3f-a079-d8b899176dd3": { "name": "head", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-math.cos(q.life_time * 360) * 22.5", + "x": "math.cos(q.life_time * 360) * 22.5", "y": "0", "z": "0" } @@ -1935,12 +2277,14 @@ "b5b52d2c-097c-08df-6457-372fbae12445": { "name": "left_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-math.cos(q.life_time * 360) * 12.25", + "x": "math.cos(q.life_time * 360) * 12.25", "y": "0", "z": "0" } @@ -1957,12 +2301,14 @@ "215d1b02-0e64-a794-1b88-a9c5a6d7541c": { "name": "right_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-math.cos(q.life_time * 360) * 12.25", + "x": "math.cos(q.life_time * 360) * 12.25", "y": "0", "z": "0" } @@ -1979,12 +2325,14 @@ "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69": { "name": "left_leg", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-math.sin(q.life_time * 360) * 22.5", + "x": "math.sin(q.life_time * 360) * 22.5", "y": "0", "z": "0" } @@ -2001,12 +2349,14 @@ "60d50d30-a018-429d-ba78-c5fb5804dd8a": { "name": "right_leg", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-math.sin(q.life_time * 360) * 22.5", + "x": "math.sin(q.life_time * 360) * 22.5", "y": "0", "z": "0" } @@ -2030,8 +2380,9 @@ "length": 1, "snapping": 20, "selected": false, - "saved": false, + "saved": true, "path": "", + "scope": 0, "anim_time_update": "", "blend_weight": "", "start_delay": "", @@ -2046,6 +2397,8 @@ "5e08acae-d6ca-0dfd-9360-8cdb13c7a824": { "name": "armor_stand_root", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "position", @@ -2068,13 +2421,15 @@ "6c53311f-ffc8-e567-ff1b-65840698e9ba": { "name": "body", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { "x": "0", - "y": "1 - math.sin(q.life_time * v.walk_speed + 90) * 12.25\n", + "y": "-1 + math.sin(q.life_time * v.walk_speed + 90) * 12.25\n", "z": "0" } ], @@ -2106,13 +2461,15 @@ "808e3c26-7285-af3f-a079-d8b899176dd3": { "name": "head", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { "x": "0", - "y": "1 + math.sin(q.life_time * v.walk_speed + 90) * 12.25", + "y": "-1 - math.sin(q.life_time * v.walk_speed + 90) * 12.25", "z": "0" } ], @@ -2128,12 +2485,14 @@ "b5b52d2c-097c-08df-6457-372fbae12445": { "name": "left_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "math.sin(q.life_time * v.walk_speed) * 8", + "x": "-math.sin(q.life_time * v.walk_speed) * 8", "y": "0", "z": "22.5" } @@ -2149,7 +2508,7 @@ "channel": "position", "data_points": [ { - "x": "2", + "x": "-2", "y": "0", "z": "-math.sin(q.life_time * v.walk_speed) * 2" } @@ -2166,13 +2525,15 @@ "215d1b02-0e64-a794-1b88-a9c5a6d7541c": { "name": "right_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "math.sin(q.life_time * v.walk_speed) * 22.5", - "y": "math.sin(q.life_time * v.walk_speed) * 12.25", + "x": "-math.sin(q.life_time * v.walk_speed) * 22.5", + "y": "-math.sin(q.life_time * v.walk_speed) * 12.25", "z": "math.cos(q.life_time * v.walk_speed * 2) * 6 + 6" } ], @@ -2188,12 +2549,14 @@ "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69": { "name": "left_leg", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-math.sin(q.life_time * v.walk_speed) * 22.5", + "x": "math.sin(q.life_time * v.walk_speed) * 22.5", "y": "0", "z": "0" } @@ -2226,12 +2589,14 @@ "60d50d30-a018-429d-ba78-c5fb5804dd8a": { "name": "right_leg", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "math.sin(q.life_time * v.walk_speed) * 22.5", + "x": "-math.sin(q.life_time * v.walk_speed) * 22.5", "y": "0", "z": "0" } @@ -2264,6 +2629,8 @@ "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0": { "name": "body_waist_pivot", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", @@ -2292,9 +2659,7 @@ "data_points": [ { "variant": "5417306e-2c69-3f36-1e3c-edd904034a36", - "execute_condition": "", - "repeat": false, - "repeat_frequency": 1 + "execute_condition": "" } ], "uuid": "1baa095b-e941-62df-a215-698b50c93524", @@ -2316,8 +2681,9 @@ "length": 0.65, "snapping": 20, "selected": false, - "saved": false, + "saved": true, "path": "", + "scope": 0, "anim_time_update": "", "blend_weight": "", "start_delay": "", @@ -2327,6 +2693,8 @@ "5e08acae-d6ca-0dfd-9360-8cdb13c7a824": { "name": "armor_stand_root", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "position", @@ -2349,13 +2717,15 @@ "60d50d30-a018-429d-ba78-c5fb5804dd8a": { "name": "right_leg", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "lopsided_wave(q.life_time * v.run_speed, 10) * 45 + 22.5", - "y": "3", + "x": "-lopsided_wave(q.life_time * v.run_speed, 10) * 45 - 22.5", + "y": "-3", "z": "0" } ], @@ -2387,13 +2757,15 @@ "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0": { "name": "body_waist_pivot", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "12.25", - "y": "math.sin(q.life_time * v.run_speed) * 12.25", + "x": "-12.25", + "y": "-math.sin(q.life_time * v.run_speed) * 12.25", "z": "-math.sin(q.life_time * v.run_speed) * 2" } ], @@ -2425,13 +2797,15 @@ "808e3c26-7285-af3f-a079-d8b899176dd3": { "name": "head", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-6", - "y": "-math.sin(q.life_time * v.run_speed) * 12.25", + "x": "6", + "y": "math.sin(q.life_time * v.run_speed) * 12.25", "z": "math.sin(q.life_time * v.run_speed) * 2" } ], @@ -2447,13 +2821,15 @@ "b5b52d2c-097c-08df-6457-372fbae12445": { "name": "left_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "lopsided_wave(q.life_time * v.run_speed + 180, 20) * 45 - 12.25", - "y": "6", + "x": "-lopsided_wave(q.life_time * v.run_speed + 180, 20) * 45 + 12.25", + "y": "-6", "z": "-12.25" } ], @@ -2469,13 +2845,15 @@ "215d1b02-0e64-a794-1b88-a9c5a6d7541c": { "name": "right_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "lopsided_wave(q.life_time * v.run_speed, 20) * 45 - 12.25", - "y": "-6", + "x": "-lopsided_wave(q.life_time * v.run_speed, 20) * 45 + 12.25", + "y": "6", "z": "12.25" } ], @@ -2491,13 +2869,15 @@ "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69": { "name": "left_leg", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "lopsided_wave(q.life_time * v.run_speed + 180, 10) * 45 + 22.5", - "y": "3", + "x": "-lopsided_wave(q.life_time * v.run_speed + 180, 10) * 45 - 22.5", + "y": "-3", "z": "0" } ], @@ -2536,8 +2916,9 @@ "length": 1, "snapping": 20, "selected": false, - "saved": false, + "saved": true, "path": "", + "scope": 0, "anim_time_update": "", "blend_weight": "", "start_delay": "", @@ -2547,6 +2928,8 @@ "5e08acae-d6ca-0dfd-9360-8cdb13c7a824": { "name": "armor_stand_root", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "position", @@ -2569,12 +2952,14 @@ "6c53311f-ffc8-e567-ff1b-65840698e9ba": { "name": "body", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "math.clamp(-math.cos(q.life_time * 360 * 2 - 45) * 1, -2, 0) * -2", + "x": "-math.clamp(-math.cos(q.life_time * 360 * 2 - 45) * 1, -2, 0) * -2", "y": "0", "z": "0" } @@ -2607,12 +2992,14 @@ "808e3c26-7285-af3f-a079-d8b899176dd3": { "name": "head", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "math.clamp(-math.cos(q.life_time * 360 * 2 - 90) * 1, -2, 0) * -5", + "x": "-math.clamp(-math.cos(q.life_time * 360 * 2 - 90) * 1, -2, 0) * -5", "y": "0", "z": "0" } @@ -2629,6 +3016,8 @@ "b5b52d2c-097c-08df-6457-372fbae12445": { "name": "left_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", @@ -2651,6 +3040,8 @@ "215d1b02-0e64-a794-1b88-a9c5a6d7541c": { "name": "right_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", @@ -2673,13 +3064,15 @@ "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69": { "name": "left_leg", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { "x": "0", - "y": "v.progress = math.cos(q.life_time * 360 - 22.5) * 0.5 + 0.5;\nv.ease = v.progress < 0.5\n ? 4 * v.progress * v.progress * v.progress\n : 1 - math.pow(-2 * v.progress + 2, 3) / 2;\n\nreturn math.lerp(10, 22.5, v.ease)", + "y": "v.progress = math.cos(q.life_time * 360 - 22.5) * 0.5 + 0.5;\nv.ease = v.progress < 0.5\n ? 4 * v.progress * v.progress * v.progress\n : 1 - math.pow(-2 * v.progress + 2, 3) / 2;\n\nreturn -math.lerp(10, 22.5, v.ease)", "z": "v.progress = math.cos(q.life_time * 360 - 22.5) * 0.5 + 0.5;\nv.ease = v.progress < 0.5\n ? 4 * v.progress * v.progress * v.progress\n : 1 - math.pow(-2 * v.progress + 2, 3) / 2;\n\nreturn math.lerp(0, 12.25, v.ease)" } ], @@ -2694,7 +3087,7 @@ "channel": "position", "data_points": [ { - "x": "v.progress = math.cos(q.life_time * 360 - 22.5) * 0.5 + 0.5;\nv.ease = v.progress < 0.5\n ? 4 * v.progress * v.progress * v.progress\n : 1 - math.pow(-2 * v.progress + 2, 3) / 2;\n\nreturn math.lerp(0, -0.5, v.ease)", + "x": "v.progress = math.cos(q.life_time * 360 - 22.5) * 0.5 + 0.5;\nv.ease = v.progress < 0.5\n ? 4 * v.progress * v.progress * v.progress\n : 1 - math.pow(-2 * v.progress + 2, 3) / 2;\n\nreturn -math.lerp(0, -0.5, v.ease)", "y": "0", "z": "0" } @@ -2711,6 +3104,8 @@ "60d50d30-a018-429d-ba78-c5fb5804dd8a": { "name": "right_leg", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", @@ -2732,7 +3127,7 @@ "channel": "position", "data_points": [ { - "x": "v.progress = math.cos(q.life_time * 360 - 22.5) * 0.5 + 0.5;\nv.ease = v.progress < 0.5\n ? 4 * v.progress * v.progress * v.progress\n : 1 - math.pow(-2 * v.progress + 2, 3) / 2;\n\nreturn math.lerp(0, 0.5, v.ease)", + "x": "v.progress = math.cos(q.life_time * 360 - 22.5) * 0.5 + 0.5;\nv.ease = v.progress < 0.5\n ? 4 * v.progress * v.progress * v.progress\n : 1 - math.pow(-2 * v.progress + 2, 3) / 2;\n\nreturn -math.lerp(0, 0.5, v.ease)", "y": "0", "z": "0" } @@ -2756,8 +3151,9 @@ "length": 4, "snapping": 20, "selected": false, - "saved": false, + "saved": true, "path": "", + "scope": 0, "anim_time_update": "", "blend_weight": "", "start_delay": "", @@ -2767,12 +3163,14 @@ "49e67c2a-3d1d-792d-9c75-72ecbc0f92e0": { "name": "body_waist_pivot", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-10", + "x": "10", "y": "0", "z": "0" } @@ -2805,12 +3203,14 @@ "6c53311f-ffc8-e567-ff1b-65840698e9ba": { "name": "body", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "22.5", + "x": "-22.5", "y": "0", "z": "0" } @@ -2843,12 +3243,14 @@ "808e3c26-7285-af3f-a079-d8b899176dd3": { "name": "head", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-5", + "x": "5", "y": "0", "z": "0" } @@ -2865,13 +3267,15 @@ "b5b52d2c-097c-08df-6457-372fbae12445": { "name": "left_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "v.value = q.life_time * 360;\nv.lopside_mag = -30;\n\n14.6772\n+ (math.sin(v.value + math.cos(v.value) * v.lopside_mag)) * 6;", - "y": "24.92619", + "x": "-v.value = q.life_time * 360;\nv.lopside_mag = +30;\n\n14.6772\n- (math.sin(v.value + math.cos(v.value) * v.lopside_mag)) * 6;", + "y": "-24.92619", "z": "166.58275" } ], @@ -2903,13 +3307,15 @@ "215d1b02-0e64-a794-1b88-a9c5a6d7541c": { "name": "right_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "\nv.value = q.life_time * 90;\nv.lopside_mag = -30;\n\n-67.1224\n+ (math.sin(v.value + math.cos(v.value) * v.lopside_mag)) * 2;\n", - "y": "-66.97934", + "x": "\n-v.value = q.life_time * 90;\nv.lopside_mag = +30;\n\n+67.1224\n- (math.sin(v.value + math.cos(v.value) * v.lopside_mag)) * 2;\n", + "y": "66.97934", "z": "-11.88242" } ], @@ -2924,7 +3330,7 @@ "channel": "position", "data_points": [ { - "x": "-1", + "x": "1", "y": "-1", "z": "-1" } @@ -2941,12 +3347,14 @@ "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69": { "name": "left_leg", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "90", + "x": "-90", "y": "0", "z": "0" } @@ -2979,6 +3387,8 @@ "60d50d30-a018-429d-ba78-c5fb5804dd8a": { "name": "right_leg", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "position", @@ -3001,6 +3411,8 @@ "4f000ffc-11d6-3a4b-7c8d-6b5ba483228c": { "name": "baseplate_pivot_a", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "position", @@ -3030,8 +3442,9 @@ "length": 2, "snapping": 20, "selected": false, - "saved": false, + "saved": true, "path": "", + "scope": 0, "anim_time_update": "", "blend_weight": "", "start_delay": "", @@ -3041,6 +3454,8 @@ "5e08acae-d6ca-0dfd-9360-8cdb13c7a824": { "name": "armor_stand_root", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "position", @@ -3063,6 +3478,8 @@ "98a28100-07e8-849a-38b7-f56abc2c2e56": { "name": "waist_pivot", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "position", @@ -3085,13 +3502,15 @@ "b5b52d2c-097c-08df-6457-372fbae12445": { "name": "left_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-22.01816", - "y": "4.75113", + "x": "22.01816", + "y": "-4.75113", "z": "11.57518" } ], @@ -3107,13 +3526,15 @@ "215d1b02-0e64-a794-1b88-a9c5a6d7541c": { "name": "right_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-22.01816", - "y": "-4.75113", + "x": "22.01816", + "y": "4.75113", "z": "-11.57518" } ], @@ -3129,13 +3550,15 @@ "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69": { "name": "left_leg", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-90", - "y": "22.5", + "x": "90", + "y": "-22.5", "z": "0" } ], @@ -3151,13 +3574,15 @@ "60d50d30-a018-429d-ba78-c5fb5804dd8a": { "name": "right_leg", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-90", - "y": "-22.5", + "x": "90", + "y": "22.5", "z": "0" } ], @@ -3179,9 +3604,10 @@ "override": false, "length": 0.8, "snapping": 20, - "selected": true, - "saved": false, + "selected": false, + "saved": true, "path": "", + "scope": 0, "anim_time_update": "", "blend_weight": "", "start_delay": "", @@ -3191,12 +3617,14 @@ "5e08acae-d6ca-0dfd-9360-8cdb13c7a824": { "name": "armor_stand_root", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "position", "data_points": [ { - "x": "math.sin(q.life_time * v.stickbug_speed) * 3", + "x": "-math.sin(q.life_time * v.stickbug_speed) * 3", "y": "math.cos(q.life_time * v.stickbug_speed * 2)", "z": "0" } @@ -3213,12 +3641,14 @@ "98a28100-07e8-849a-38b7-f56abc2c2e56": { "name": "waist_pivot", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "90", + "x": "-90", "y": "0", "z": "0" } @@ -3251,13 +3681,15 @@ "6c53311f-ffc8-e567-ff1b-65840698e9ba": { "name": "body", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { "x": "0", - "y": "-math.sin(q.life_time * v.stickbug_speed) * 12.25", + "y": "math.sin(q.life_time * v.stickbug_speed) * 12.25", "z": "0" } ], @@ -3273,12 +3705,14 @@ "808e3c26-7285-af3f-a079-d8b899176dd3": { "name": "head", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-67.5", + "x": "67.5", "y": "0", "z": "0" } @@ -3295,13 +3729,15 @@ "b5b52d2c-097c-08df-6457-372fbae12445": { "name": "left_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-112.5\n", - "y": "-12.25\n+ math.sin(q.life_time * v.stickbug_speed) * 33\n", + "x": "112.5\n", + "y": "12.25\n- math.sin(q.life_time * v.stickbug_speed) * 33\n", "z": "0" } ], @@ -3316,7 +3752,7 @@ "channel": "position", "data_points": [ { - "x": "1 + math.sin(q.life_time * v.stickbug_speed) * 1", + "x": "-1 - math.sin(q.life_time * v.stickbug_speed) * 1", "y": "0", "z": "-math.sin(q.life_time * v.stickbug_speed) * 1\n- math.cos(q.life_time * v.stickbug_speed * 2) * 1" } @@ -3333,13 +3769,15 @@ "215d1b02-0e64-a794-1b88-a9c5a6d7541c": { "name": "right_arm", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-112.5\n", - "y": "12.25\n+ math.sin(q.life_time * v.stickbug_speed) * 33\n", + "x": "112.5\n", + "y": "-12.25\n- math.sin(q.life_time * v.stickbug_speed) * 33\n", "z": "0" } ], @@ -3354,7 +3792,7 @@ "channel": "position", "data_points": [ { - "x": "-1 + math.sin(q.life_time * v.stickbug_speed) * 1", + "x": "1 - math.sin(q.life_time * v.stickbug_speed) * 1", "y": "0", "z": "math.sin(q.life_time * v.stickbug_speed) * 1\n- math.cos(q.life_time * v.stickbug_speed * 2) * 1" } @@ -3371,13 +3809,15 @@ "55b812fe-7e4c-b2a5-da5b-3a8c82f9fc69": { "name": "left_leg", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-72\n", - "y": "12.25\n+ math.sin(q.life_time * v.stickbug_speed) * 22.5\n", + "x": "72\n", + "y": "-12.25\n- math.sin(q.life_time * v.stickbug_speed) * 22.5\n", "z": "0" } ], @@ -3392,7 +3832,7 @@ "channel": "position", "data_points": [ { - "x": "-1 + math.sin(q.life_time * v.stickbug_speed) * 0.25", + "x": "1 - math.sin(q.life_time * v.stickbug_speed) * 0.25", "y": "0", "z": "-math.sin(q.life_time * v.stickbug_speed) * 0.5\n- math.cos(q.life_time * v.stickbug_speed * 2) * 0.75" } @@ -3409,13 +3849,15 @@ "60d50d30-a018-429d-ba78-c5fb5804dd8a": { "name": "right_leg", "type": "bone", + "rotation_global": false, + "quaternion_interpolation": false, "keyframes": [ { "channel": "rotation", "data_points": [ { - "x": "-72\n", - "y": "-12.25\n+ math.sin(q.life_time * v.stickbug_speed) * 22.5\n", + "x": "72\n", + "y": "12.25\n- math.sin(q.life_time * v.stickbug_speed) * 22.5\n", "z": "0" } ], @@ -3430,7 +3872,7 @@ "channel": "position", "data_points": [ { - "x": "1 + math.sin(q.life_time * v.stickbug_speed) * 0.25", + "x": "-1 - math.sin(q.life_time * v.stickbug_speed) * 0.25", "y": "0", "z": "math.sin(q.life_time * v.stickbug_speed) * 0.5\n- math.cos(q.life_time * v.stickbug_speed * 2) * 0.75" } @@ -3446,7 +3888,7 @@ "channel": "position", "data_points": [ { - "x": "easeinoutquart(\n linear_wave(q.life_time * v.stickbug_speed + 90 + 45)\n)", + "x": "-easeinoutquart(\n linear_wave(q.life_time * v.stickbug_speed + 90 + 45)\n)", "y": "0", "z": "0" } @@ -3462,7 +3904,7 @@ "channel": "position", "data_points": [ { - "x": "-1 + easeinoutquart(\n linear_wave(q.life_time * v.stickbug_speed + 90 + 45)\n)", + "x": "1 - easeinoutquart(\n linear_wave(q.life_time * v.stickbug_speed + 90 + 45)\n)", "y": "0", "z": "0" } @@ -3479,6 +3921,5 @@ } } ], - "animation_controllers": [], "animation_variable_placeholders": "v.walk_speed = 360 * 1;\nv.run_speed = 360 * 1.5;\nv.stickbug_speed = 360 * 1.25;\n" } \ No newline at end of file diff --git a/tools/plugins/importFolder.ts b/tools/plugins/importFolder.ts deleted file mode 100644 index f7dac778..00000000 --- a/tools/plugins/importFolder.ts +++ /dev/null @@ -1,150 +0,0 @@ -import type { Plugin } from 'esbuild' -import { existsSync, readdirSync, statSync, type ObjectEncodingOptions } from 'fs' -import { dirname, extname, join, posix, relative, resolve, sep } from 'path' - -interface IRecursiveDirEntry { - // The file's name with extension - name: string - // The file's extension - ext: string - // The file's absolute path - path: string - // The parent directory's absolute path - parentPath: string - // The file's path relative to the directory being recursed - localPath: string -} - -interface IRecursiveReadDirSyncOptions { - encoding?: ObjectEncodingOptions['encoding'] - maxDepth?: number - filter?: (file: IRecursiveDirEntry) => boolean -} - -/** - * Recursively reads a directory and returns an array of file information. - * @param dir The directory to read. - * @param encoding The encoding to use when reading file names. - * @param maxDepth The maximum depth to recurse into subdirectories. - * @returns An array of file information objects. - */ -function recursiveReadDirSync( - dir: string, - { encoding = 'utf-8', maxDepth = 200, filter }: IRecursiveReadDirSyncOptions -): IRecursiveDirEntry[] { - const files: IRecursiveDirEntry[] = [] - - function recurse(localDir: string, depth = 0) { - // If a local index is found, it is imported and the rest of the directory is ignored. - const indexPath = join(localDir, 'index.ts') - if (existsSync(indexPath)) { - const absolutePath = resolve(localDir, 'index.ts') - files.push({ - name: 'index', - ext: '.ts', - path: absolutePath, - parentPath: localDir, - localPath: relative(dir, absolutePath), - }) - return - } - - readdirSync(localDir, { encoding, withFileTypes: true }).forEach(dirEntry => { - const absolutePath = join(localDir, dirEntry.name) - if (dirEntry.isDirectory() && depth <= maxDepth) { - recurse(absolutePath, depth + 1) - } else { - const fileEntry: IRecursiveDirEntry = { - name: dirEntry.name, - ext: extname(dirEntry.name), - path: absolutePath, - parentPath: dirname(absolutePath), - localPath: relative(dir, absolutePath), - } - if (!!filter && !filter(fileEntry)) return - files.push(fileEntry) - } - }) - } - recurse(dir) - - return files -} - -function normalizePathToPosix(path: string) { - return path.replaceAll(sep, posix.sep) -} - -/** - * A plugin for importing all files in a folder without manually updating an index file. - * - * Use the `/*` suffix to import a folder. - * - * Use the `/**` suffix to recurse into subdirectories. - * - * NOTE - If you're using a glob plugin, this plugin should be executed first. - */ -const plugin: Plugin = { - name: 'import-folder', - setup: build => { - build.onResolve({ filter: /.+\/\*\*?$/, namespace: 'file' }, args => { - const fullPath = normalizePathToPosix(join(args.resolveDir, args.path)).replace( - /\/\*\*?$/, - '' - ) - - const stat = statSync(fullPath) - if (!stat.isDirectory()) { - return { - errors: [ - { - text: `"${fullPath}" is not a directory, but is being imported as a folder.`, - location: { file: args.importer }, - }, - ], - } - } - - return { - namespace: 'import-folder', - path: fullPath, - pluginData: { recursive: args.path.endsWith('/**'), importer: args.importer }, - } - }) - - build.onLoad({ filter: /.+/, namespace: 'import-folder' }, args => { - let files: IRecursiveDirEntry[] - - const filter: IRecursiveReadDirSyncOptions['filter'] = file => { - return file.ext === '.js' || file.ext === '.ts' - } - - if (args.pluginData.recursive) { - files = recursiveReadDirSync(args.path, { encoding: 'utf-8', filter }) - } else { - files = recursiveReadDirSync(args.path, { encoding: 'utf-8', filter, maxDepth: 0 }) - } - - const contents = files - .map(file => `import './${normalizePathToPosix(file.localPath)}';`) - .join('\n') - - console.log( - `📃 ${normalizePathToPosix( - relative(process.cwd(), args.pluginData.importer) - )} imports folder ${normalizePathToPosix(relative(process.cwd(), args.path))}${ - args.pluginData.recursive ? ' recursively' : '' - }.` - ) - - return { - loader: 'js', - contents, - watchFiles: files.map(file => join(file.parentPath, file.name)), - resolveDir: args.path, - } - }) - }, -} - -export default plugin diff --git a/tools/plugins/sveltePlugin.ts b/tools/plugins/sveltePlugin.ts deleted file mode 100644 index 6f785046..00000000 --- a/tools/plugins/sveltePlugin.ts +++ /dev/null @@ -1,92 +0,0 @@ -// A MODIFIED VERSION OF THE SVELTE PLUGIN FOR ESBUILD (esbuild-plugin-svelte) - -// CHANGELOG: - -// made it so that css can be emmitted directly as js instead of as an import - -'use strict' -Object.defineProperty(exports, '__esModule', { value: true }) -import type { Plugin } from 'esbuild' -import { readFile } from 'fs/promises' -import { relative } from 'path' -import { compile, preprocess } from 'svelte/compiler' -/** - * Convert a warning or error emitted from the svelte compiler for esbuild. - */ -function convertWarning(source: any, { message, filename, start, end }: any) { - if (!start || !end) { - return { text: message } - } - const lines = source.split(/\r\n|\r|\n/) - const lineText = lines[start.line - 1] - const location = { - file: filename, - line: start.line, - column: start.column, - length: (start.line === end.line ? end.column : lineText.length) - start.column, - lineText, - } - return { text: message, location } -} -function esbuildPluginSvelte( - opts: any = { - transformCssToJs: (css: string) => css, - } -): Plugin { - return { - name: 'esbuild-plugin-svelte', - setup(build) { - /** A cache of the compiled CSS. */ - const cache = new Map() - // Register loader for the 'fake' CSS files that we import from - // the compiled Javascript. - build.onLoad({ filter: /\.svelte\.css$/ }, ({ path }) => { - const contents = cache.get(path) - return contents ? { contents, loader: 'css' } : null - }) - // Register loader for all .svelte files. - // - build.onLoad({ filter: /\.svelte$/ }, async ({ path }) => { - let source = await readFile(path, 'utf-8') - const filename = relative(process.cwd(), path) - let sourcemap: any - if (opts.preprocess) { - const processed = await preprocess(source, opts.preprocess, { - filename, - }) - source = processed.code - sourcemap = processed.map - } - const compilerOptions = { - css: false, - ...opts.compilerOptions, - sourcemap, - } - let res - try { - res = compile(source, { ...compilerOptions, filename }) - } catch (err) { - return { errors: [convertWarning(source, err as any)] } - } - const { js, css, warnings } = res - let code = `${js.code as string}\n//# sourceMappingURL=${js.map.toUrl() as string}` - // Emit CSS, otherwise it will be included in the JS and injected at runtime. - if (css.code && opts.transformCssToJs) { - code = `${code}\n${opts.transformCssToJs(css.code) as string}` - } else if (css.code && !compilerOptions.css) { - const cssPath = `${path}.css` - cache.set( - cssPath, - `${css.code as string}/*# sourceMappingURL=${css.map.toUrl() as string}*/` - ) - code = `${code}\nimport ${JSON.stringify(cssPath)}` - } - return { - contents: code, - warnings: warnings.map(w => convertWarning(source, w)), - } - }) - }, - } -} -export default esbuildPluginSvelte diff --git a/tsconfig.json b/tsconfig.json index 49186bf5..3b37fbd8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,8 @@ { + "files": ["src/index.ts"], "include": [ "src/**/*", - "tools/**/*", + ".scripts/**/**/*", "./eslint.config.ts", "./vitest.config.ts", "./svelte.config.ts" @@ -10,11 +11,11 @@ "compilerOptions": { "outDir": "./dist/", "noImplicitAny": true, - "module": "ES2022", + "module": "preserve", "target": "ES2022", - "moduleResolution": "node", + "moduleResolution": "bundler", "strict": true, - "types": ["node"], + "types": ["node", "/mnt/ssd2/repos/snavesutit/blockbench/types/index.d.ts"], "resolveJsonModule": true, "allowSyntheticDefaultImports": true, "allowUmdGlobalAccess": true, @@ -23,6 +24,9 @@ "noEmit": true, "isolatedModules": true, "alwaysStrict": true, - "baseUrl": "." + "verbatimModuleSyntax": true, + "paths": { + "@blockbench-types/*": ["/mnt/ssd2/repos/snavesutit/blockbench/types/*"] + } } } diff --git a/types/blockbench-types.d.ts b/types/blockbench-types.d.ts deleted file mode 100644 index 912af031..00000000 --- a/types/blockbench-types.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -//// -/// diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index c2ccc35e..00000000 --- a/yarn.lock +++ /dev/null @@ -1,5241 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@ampproject/remapping@^2.2.1": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" - integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.24" - -"@babel/helper-string-parser@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" - integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== - -"@babel/helper-validator-identifier@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62" - integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA== - -"@babel/parser@^7.24.4": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790" - integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg== - -"@babel/types@^7.20.7": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.5.tgz#7661930afc638a5383eb0c4aee59b74f38db84d7" - integrity sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ== - dependencies: - "@babel/helper-string-parser" "^7.24.1" - "@babel/helper-validator-identifier" "^7.24.5" - to-fast-properties "^2.0.0" - -"@electron/get@^2.0.0": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@electron/get/-/get-2.0.3.tgz#fba552683d387aebd9f3fcadbcafc8e12ee4f960" - integrity sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ== - dependencies: - debug "^4.1.1" - env-paths "^2.2.0" - fs-extra "^8.1.0" - got "^11.8.5" - progress "^2.0.3" - semver "^6.2.0" - sumchecker "^3.0.1" - optionalDependencies: - global-agent "^3.0.0" - -"@esbuild/aix-ppc64@0.21.3": - version "0.21.3" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.3.tgz#78d3e6dcd19c1cb91f3940143e86dad1094aee81" - integrity sha512-yTgnwQpFVYfvvo4SvRFB0SwrW8YjOxEoT7wfMT7Ol5v7v5LDNvSGo67aExmxOb87nQNeWPVvaGBNfQ7BXcrZ9w== - -"@esbuild/aix-ppc64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz#ee6b7163a13528e099ecf562b972f2bcebe0aa97" - integrity sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw== - -"@esbuild/android-arm64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz#bafb75234a5d3d1b690e7c2956a599345e84a2fd" - integrity sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA== - -"@esbuild/android-arm64@0.21.3": - version "0.21.3" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.3.tgz#5eea56c21d61734942e050840d881eb7bedc3993" - integrity sha512-c+ty9necz3zB1Y+d/N+mC6KVVkGUUOcm4ZmT5i/Fk5arOaY3i6CA3P5wo/7+XzV8cb4GrI/Zjp8NuOQ9Lfsosw== - -"@esbuild/android-arm64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz#115fc76631e82dd06811bfaf2db0d4979c16e2cb" - integrity sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg== - -"@esbuild/android-arm@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.19.tgz#5898f7832c2298bc7d0ab53701c57beb74d78b4d" - integrity sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A== - -"@esbuild/android-arm@0.21.3": - version "0.21.3" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.3.tgz#7fda92e3231043c071ea6aa76c92accea86439fd" - integrity sha512-bviJOLMgurLJtF1/mAoJLxDZDL6oU5/ztMHnJQRejbJrSc9FFu0QoUoFhvi6qSKJEw9y5oGyvr9fuDtzJ30rNQ== - -"@esbuild/android-arm@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.10.tgz#8d5811912da77f615398611e5bbc1333fe321aa9" - integrity sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w== - -"@esbuild/android-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.19.tgz#658368ef92067866d95fb268719f98f363d13ae1" - integrity sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww== - -"@esbuild/android-x64@0.21.3": - version "0.21.3" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.3.tgz#625d139bde81b81f54ff493b1381ca0f540200f3" - integrity sha512-JReHfYCRK3FVX4Ra+y5EBH1b9e16TV2OxrPAvzMsGeES0X2Ndm9ImQRI4Ket757vhc5XBOuGperw63upesclRw== - -"@esbuild/android-x64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.10.tgz#e3e96516b2d50d74105bb92594c473e30ddc16b1" - integrity sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg== - -"@esbuild/darwin-arm64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz#584c34c5991b95d4d48d333300b1a4e2ff7be276" - integrity sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg== - -"@esbuild/darwin-arm64@0.21.3": - version "0.21.3" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.3.tgz#fa25f38a43ff4c469589d1dc93448d534d7f313b" - integrity sha512-U3fuQ0xNiAkXOmQ6w5dKpEvXQRSpHOnbw7gEfHCRXPeTKW9sBzVck6C5Yneb8LfJm0l6le4NQfkNPnWMSlTFUQ== - -"@esbuild/darwin-arm64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz#6af6bb1d05887dac515de1b162b59dc71212ed76" - integrity sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA== - -"@esbuild/darwin-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz#7751d236dfe6ce136cce343dce69f52d76b7f6cb" - integrity sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw== - -"@esbuild/darwin-x64@0.21.3": - version "0.21.3" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.3.tgz#2e450b8214f179a56b4559b2f107060e2b792c7e" - integrity sha512-3m1CEB7F07s19wmaMNI2KANLcnaqryJxO1fXHUV5j1rWn+wMxdUYoPyO2TnAbfRZdi7ADRwJClmOwgT13qlP3Q== - -"@esbuild/darwin-x64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz#99ae82347fbd336fc2d28ffd4f05694e6e5b723d" - integrity sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg== - -"@esbuild/freebsd-arm64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz#cacd171665dd1d500f45c167d50c6b7e539d5fd2" - integrity sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ== - -"@esbuild/freebsd-arm64@0.21.3": - version "0.21.3" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.3.tgz#f6b29e07bce25c545f6f7bb031d3be6a6ea1dc50" - integrity sha512-fsNAAl5pU6wmKHq91cHWQT0Fz0vtyE1JauMzKotrwqIKAswwP5cpHUCxZNSTuA/JlqtScq20/5KZ+TxQdovU/g== - -"@esbuild/freebsd-arm64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz#0c6d5558a6322b0bdb17f7025c19bd7d2359437d" - integrity sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg== - -"@esbuild/freebsd-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz#0769456eee2a08b8d925d7c00b79e861cb3162e4" - integrity sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ== - -"@esbuild/freebsd-x64@0.21.3": - version "0.21.3" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.3.tgz#1a5da2bf89f8d67102820d893d271a270ae55751" - integrity sha512-tci+UJ4zP5EGF4rp8XlZIdq1q1a/1h9XuronfxTMCNBslpCtmk97Q/5qqy1Mu4zIc0yswN/yP/BLX+NTUC1bXA== - -"@esbuild/freebsd-x64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz#8c35873fab8c0857a75300a3dcce4324ca0b9844" - integrity sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA== - -"@esbuild/linux-arm64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz#38e162ecb723862c6be1c27d6389f48960b68edb" - integrity sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg== - -"@esbuild/linux-arm64@0.21.3": - version "0.21.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.3.tgz#355f6624c1ac6f5f68841a327ac90b98c679626c" - integrity sha512-vvG6R5g5ieB4eCJBQevyDMb31LMHthLpXTc2IGkFnPWS/GzIFDnaYFp558O+XybTmYrVjxnryru7QRleJvmZ6Q== - -"@esbuild/linux-arm64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz#3edc2f87b889a15b4cedaf65f498c2bed7b16b90" - integrity sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ== - -"@esbuild/linux-arm@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz#1a2cd399c50040184a805174a6d89097d9d1559a" - integrity sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA== - -"@esbuild/linux-arm@0.21.3": - version "0.21.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.3.tgz#872a476ca18a962a98700024c447a79279db1d45" - integrity sha512-f6kz2QpSuyHHg01cDawj0vkyMwuIvN62UAguQfnNVzbge2uWLhA7TCXOn83DT0ZvyJmBI943MItgTovUob36SQ== - -"@esbuild/linux-arm@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz#86501cfdfb3d110176d80c41b27ed4611471cde7" - integrity sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg== - -"@esbuild/linux-ia32@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz#e28c25266b036ce1cabca3c30155222841dc035a" - integrity sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ== - -"@esbuild/linux-ia32@0.21.3": - version "0.21.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.3.tgz#da713eb80ff6c011ed01aa4deebb5fc758906046" - integrity sha512-HjCWhH7K96Na+66TacDLJmOI9R8iDWDDiqe17C7znGvvE4sW1ECt9ly0AJ3dJH62jHyVqW9xpxZEU1jKdt+29A== - -"@esbuild/linux-ia32@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz#e6589877876142537c6864680cd5d26a622b9d97" - integrity sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ== - -"@esbuild/linux-loong64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz#0f887b8bb3f90658d1a0117283e55dbd4c9dcf72" - integrity sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ== - -"@esbuild/linux-loong64@0.21.3": - version "0.21.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.3.tgz#a7c5dc9e961009018d23ec53a43baa8c03c5a1d5" - integrity sha512-BGpimEccmHBZRcAhdlRIxMp7x9PyJxUtj7apL2IuoG9VxvU/l/v1z015nFs7Si7tXUwEsvjc1rOJdZCn4QTU+Q== - -"@esbuild/linux-loong64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz#11119e18781f136d8083ea10eb6be73db7532de8" - integrity sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg== - -"@esbuild/linux-mips64el@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz#f5d2a0b8047ea9a5d9f592a178ea054053a70289" - integrity sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A== - -"@esbuild/linux-mips64el@0.21.3": - version "0.21.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.3.tgz#b97543f3d8655365729f3702ed07f6e41be5e48e" - integrity sha512-5rMOWkp7FQGtAH3QJddP4w3s47iT20hwftqdm7b+loe95o8JU8ro3qZbhgMRy0VuFU0DizymF1pBKkn3YHWtsw== - -"@esbuild/linux-mips64el@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz#3052f5436b0c0c67a25658d5fc87f045e7def9e6" - integrity sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA== - -"@esbuild/linux-ppc64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz#876590e3acbd9fa7f57a2c7d86f83717dbbac8c7" - integrity sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg== - -"@esbuild/linux-ppc64@0.21.3": - version "0.21.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.3.tgz#23b9064d5bc0bf28a115a2f9cf69f3b01cdfe01c" - integrity sha512-h0zj1ldel89V5sjPLo5H1SyMzp4VrgN1tPkN29TmjvO1/r0MuMRwJxL8QY05SmfsZRs6TF0c/IDH3u7XYYmbAg== - -"@esbuild/linux-ppc64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz#2f098920ee5be2ce799f35e367b28709925a8744" - integrity sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA== - -"@esbuild/linux-riscv64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz#7f49373df463cd9f41dc34f9b2262d771688bf09" - integrity sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA== - -"@esbuild/linux-riscv64@0.21.3": - version "0.21.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.3.tgz#4f2536327f6d444c0573bd35bbd3a67897dbd5da" - integrity sha512-dkAKcTsTJ+CRX6bnO17qDJbLoW37npd5gSNtSzjYQr0svghLJYGYB0NF1SNcU1vDcjXLYS5pO4qOW4YbFama4A== - -"@esbuild/linux-riscv64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz#fa51d7fd0a22a62b51b4b94b405a3198cf7405dd" - integrity sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA== - -"@esbuild/linux-s390x@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz#e2afd1afcaf63afe2c7d9ceacd28ec57c77f8829" - integrity sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q== - -"@esbuild/linux-s390x@0.21.3": - version "0.21.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.3.tgz#05e6f3a12a0dcd60672f25e8789a83cd3affa487" - integrity sha512-vnD1YUkovEdnZWEuMmy2X2JmzsHQqPpZElXx6dxENcIwTu+Cu5ERax6+Ke1QsE814Zf3c6rxCfwQdCTQ7tPuXA== - -"@esbuild/linux-s390x@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz#a27642e36fc282748fdb38954bd3ef4f85791e8a" - integrity sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew== - -"@esbuild/linux-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz#8a0e9738b1635f0c53389e515ae83826dec22aa4" - integrity sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw== - -"@esbuild/linux-x64@0.21.3": - version "0.21.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.3.tgz#994d347e7f530c33628e35e48ccde8f299adbcb6" - integrity sha512-IOXOIm9WaK7plL2gMhsWJd+l2bfrhfilv0uPTptoRoSb2p09RghhQQp9YY6ZJhk/kqmeRt6siRdMSLLwzuT0KQ== - -"@esbuild/linux-x64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz#9d9b09c0033d17529570ced6d813f98315dfe4e9" - integrity sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA== - -"@esbuild/netbsd-arm64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz#25c09a659c97e8af19e3f2afd1c9190435802151" - integrity sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A== - -"@esbuild/netbsd-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz#c29fb2453c6b7ddef9a35e2c18b37bda1ae5c462" - integrity sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q== - -"@esbuild/netbsd-x64@0.21.3": - version "0.21.3" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.3.tgz#309d8c323632e9c70ee92cf5414fa65b5eb7e00e" - integrity sha512-uTgCwsvQ5+vCQnqM//EfDSuomo2LhdWhFPS8VL8xKf+PKTCrcT/2kPPoWMTs22aB63MLdGMJiE3f1PHvCDmUOw== - -"@esbuild/netbsd-x64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz#7fa5f6ffc19be3a0f6f5fd32c90df3dc2506937a" - integrity sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig== - -"@esbuild/openbsd-arm64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz#8faa6aa1afca0c6d024398321d6cb1c18e72a1c3" - integrity sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw== - -"@esbuild/openbsd-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz#95e75a391403cb10297280d524d66ce04c920691" - integrity sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g== - -"@esbuild/openbsd-x64@0.21.3": - version "0.21.3" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.3.tgz#28820f9431fe00f2b04aac57511754213ff060eb" - integrity sha512-vNAkR17Ub2MgEud2Wag/OE4HTSI6zlb291UYzHez/psiKarp0J8PKGDnAhMBcHFoOHMXHfExzmjMojJNbAStrQ== - -"@esbuild/openbsd-x64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz#a42979b016f29559a8453d32440d3c8cd420af5e" - integrity sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw== - -"@esbuild/openharmony-arm64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz#fd87bfeadd7eeb3aa384bbba907459ffa3197cb1" - integrity sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag== - -"@esbuild/sunos-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz#722eaf057b83c2575937d3ffe5aeb16540da7273" - integrity sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg== - -"@esbuild/sunos-x64@0.21.3": - version "0.21.3" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.3.tgz#a1f7f98b85bd221fe0f545d01abc0e6123ae60dc" - integrity sha512-W8H9jlGiSBomkgmouaRoTXo49j4w4Kfbl6I1bIdO/vT0+0u4f20ko3ELzV3hPI6XV6JNBVX+8BC+ajHkvffIJA== - -"@esbuild/sunos-x64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz#3a18f590e36cb78ae7397976b760b2b8c74407f4" - integrity sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ== - -"@esbuild/win32-arm64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz#9aa9dc074399288bdcdd283443e9aeb6b9552b6f" - integrity sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag== - -"@esbuild/win32-arm64@0.21.3": - version "0.21.3" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.3.tgz#c6c3c0b1a1dfc6327ef4db6aa4fb6efd9df531f7" - integrity sha512-EjEomwyLSCg8Ag3LDILIqYCZAq/y3diJ04PnqGRgq8/4O3VNlXyMd54j/saShaN4h5o5mivOjAzmU6C3X4v0xw== - -"@esbuild/win32-arm64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz#e71741a251e3fd971408827a529d2325551f530c" - integrity sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw== - -"@esbuild/win32-ia32@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz#95ad43c62ad62485e210f6299c7b2571e48d2b03" - integrity sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw== - -"@esbuild/win32-ia32@0.21.3": - version "0.21.3" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.3.tgz#471b8d2cad1bd6479eee5acf04bba2c0e4d37e24" - integrity sha512-WGiE/GgbsEwR33++5rzjiYsKyHywE8QSZPF7Rfx9EBfK3Qn3xyR6IjyCr5Uk38Kg8fG4/2phN7sXp4NPWd3fcw== - -"@esbuild/win32-ia32@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz#c6f010b5d3b943d8901a0c87ea55f93b8b54bf94" - integrity sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw== - -"@esbuild/win32-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz#8cfaf2ff603e9aabb910e9c0558c26cf32744061" - integrity sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA== - -"@esbuild/win32-x64@0.21.3": - version "0.21.3" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.3.tgz#899c03576c4c28c83228f0e64dfa10edae99c9a2" - integrity sha512-xRxC0jaJWDLYvcUvjQmHCJSfMrgmUuvsoXgDeU/wTorQ1ngDdUBuFtgY3W1Pc5sprGAvZBtWdJX7RPg/iZZUqA== - -"@esbuild/win32-x64@0.25.10": - version "0.25.10" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz#e4b3e255a1b4aea84f6e1d2ae0b73f826c3785bd" - integrity sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw== - -"@eslint-community/eslint-utils@^4.2.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== - dependencies: - eslint-visitor-keys "^3.3.0" - -"@eslint-community/eslint-utils@^4.6.1", "@eslint-community/eslint-utils@^4.7.0", "@eslint-community/eslint-utils@^4.8.0": - version "4.9.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz#7308df158e064f0dd8b8fdb58aa14fa2a7f913b3" - integrity sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g== - dependencies: - eslint-visitor-keys "^3.4.3" - -"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.12.1": - version "4.12.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" - integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== - -"@eslint-community/regexpp@^4.4.0": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" - integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== - -"@eslint/config-array@^0.21.0": - version "0.21.0" - resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.21.0.tgz#abdbcbd16b124c638081766392a4d6b509f72636" - integrity sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ== - dependencies: - "@eslint/object-schema" "^2.1.6" - debug "^4.3.1" - minimatch "^3.1.2" - -"@eslint/config-helpers@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.4.0.tgz#e9f94ba3b5b875e32205cb83fece18e64486e9e6" - integrity sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog== - dependencies: - "@eslint/core" "^0.16.0" - -"@eslint/core@^0.16.0": - version "0.16.0" - resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.16.0.tgz#490254f275ba9667ddbab344f4f0a6b7a7bd7209" - integrity sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q== - dependencies: - "@types/json-schema" "^7.0.15" - -"@eslint/eslintrc@^3.3.1": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.1.tgz#e55f7f1dd400600dd066dbba349c4c0bac916964" - integrity sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^10.0.1" - globals "^14.0.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@9.37.0": - version "9.37.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.37.0.tgz#0cfd5aa763fe5d1ee60bedf84cd14f54bcf9e21b" - integrity sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg== - -"@eslint/object-schema@^2.1.6": - version "2.1.6" - resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.6.tgz#58369ab5b5b3ca117880c0f6c0b0f32f6950f24f" - integrity sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA== - -"@eslint/plugin-kit@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz#f6a245b42886abf6fc9c7ab7744a932250335ab2" - integrity sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A== - dependencies: - "@eslint/core" "^0.16.0" - levn "^0.4.1" - -"@firebase/analytics-compat@0.2.6": - version "0.2.6" - resolved "https://registry.yarnpkg.com/@firebase/analytics-compat/-/analytics-compat-0.2.6.tgz#50063978c42f13eb800e037e96ac4b17236841f4" - integrity sha512-4MqpVLFkGK7NJf/5wPEEP7ePBJatwYpyjgJ+wQHQGHfzaCDgntOnl9rL2vbVGGKCnRqWtZDIWhctB86UWXaX2Q== - dependencies: - "@firebase/analytics" "0.10.0" - "@firebase/analytics-types" "0.8.0" - "@firebase/component" "0.6.4" - "@firebase/util" "1.9.3" - tslib "^2.1.0" - -"@firebase/analytics-types@0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@firebase/analytics-types/-/analytics-types-0.8.0.tgz#551e744a29adbc07f557306530a2ec86add6d410" - integrity sha512-iRP+QKI2+oz3UAh4nPEq14CsEjrjD6a5+fuypjScisAh9kXKFvdJOZJDwk7kikLvWVLGEs9+kIUS4LPQV7VZVw== - -"@firebase/analytics@0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@firebase/analytics/-/analytics-0.10.0.tgz#9c6986acd573c6c6189ffb52d0fd63c775db26d7" - integrity sha512-Locv8gAqx0e+GX/0SI3dzmBY5e9kjVDtD+3zCFLJ0tH2hJwuCAiL+5WkHuxKj92rqQj/rvkBUCfA1ewlX2hehg== - dependencies: - "@firebase/component" "0.6.4" - "@firebase/installations" "0.6.4" - "@firebase/logger" "0.4.0" - "@firebase/util" "1.9.3" - tslib "^2.1.0" - -"@firebase/app-check-compat@0.3.7": - version "0.3.7" - resolved "https://registry.yarnpkg.com/@firebase/app-check-compat/-/app-check-compat-0.3.7.tgz#e150f61d653a0f2043a34dcb995616a717161839" - integrity sha512-cW682AxsyP1G+Z0/P7pO/WT2CzYlNxoNe5QejVarW2o5ZxeWSSPAiVEwpEpQR/bUlUmdeWThYTMvBWaopdBsqw== - dependencies: - "@firebase/app-check" "0.8.0" - "@firebase/app-check-types" "0.5.0" - "@firebase/component" "0.6.4" - "@firebase/logger" "0.4.0" - "@firebase/util" "1.9.3" - tslib "^2.1.0" - -"@firebase/app-check-interop-types@0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.0.tgz#b27ea1397cb80427f729e4bbf3a562f2052955c4" - integrity sha512-xAxHPZPIgFXnI+vb4sbBjZcde7ZluzPPaSK7Lx3/nmuVk4TjZvnL8ONnkd4ERQKL8WePQySU+pRcWkh8rDf5Sg== - -"@firebase/app-check-types@0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@firebase/app-check-types/-/app-check-types-0.5.0.tgz#1b02826213d7ce6a1cf773c329b46ea1c67064f4" - integrity sha512-uwSUj32Mlubybw7tedRzR24RP8M8JUVR3NPiMk3/Z4bCmgEKTlQBwMXrehDAZ2wF+TsBq0SN1c6ema71U/JPyQ== - -"@firebase/app-check@0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@firebase/app-check/-/app-check-0.8.0.tgz#b531ec40900af9c3cf1ec63de9094a0ddd733d6a" - integrity sha512-dRDnhkcaC2FspMiRK/Vbp+PfsOAEP6ZElGm9iGFJ9fDqHoPs0HOPn7dwpJ51lCFi1+2/7n5pRPGhqF/F03I97g== - dependencies: - "@firebase/component" "0.6.4" - "@firebase/logger" "0.4.0" - "@firebase/util" "1.9.3" - tslib "^2.1.0" - -"@firebase/app-compat@0.2.13": - version "0.2.13" - resolved "https://registry.yarnpkg.com/@firebase/app-compat/-/app-compat-0.2.13.tgz#c42d392f45f2c9fef1631cb3ae36d53296aa6407" - integrity sha512-j6ANZaWjeVy5zg6X7uiqh6lM6o3n3LD1+/SJFNs9V781xyryyZWXe+tmnWNWPkP086QfJoNkWN9pMQRqSG4vMg== - dependencies: - "@firebase/app" "0.9.13" - "@firebase/component" "0.6.4" - "@firebase/logger" "0.4.0" - "@firebase/util" "1.9.3" - tslib "^2.1.0" - -"@firebase/app-types@0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@firebase/app-types/-/app-types-0.9.0.tgz#35b5c568341e9e263b29b3d2ba0e9cfc9ec7f01e" - integrity sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q== - -"@firebase/app@0.9.13": - version "0.9.13" - resolved "https://registry.yarnpkg.com/@firebase/app/-/app-0.9.13.tgz#b1d3ad63d52f235a0d70a9b4261cabb3a24690d7" - integrity sha512-GfiI1JxJ7ecluEmDjPzseRXk/PX31hS7+tjgBopL7XjB2hLUdR+0FTMXy2Q3/hXezypDvU6or7gVFizDESrkXw== - dependencies: - "@firebase/component" "0.6.4" - "@firebase/logger" "0.4.0" - "@firebase/util" "1.9.3" - idb "7.1.1" - tslib "^2.1.0" - -"@firebase/auth-compat@0.4.2": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@firebase/auth-compat/-/auth-compat-0.4.2.tgz#cb65edc2fbd5f72fff32310409f2fd702b5145e7" - integrity sha512-Q30e77DWXFmXEt5dg5JbqEDpjw9y3/PcP9LslDPR7fARmAOTIY9MM6HXzm9KC+dlrKH/+p6l8g9ifJiam9mc4A== - dependencies: - "@firebase/auth" "0.23.2" - "@firebase/auth-types" "0.12.0" - "@firebase/component" "0.6.4" - "@firebase/util" "1.9.3" - node-fetch "2.6.7" - tslib "^2.1.0" - -"@firebase/auth-interop-types@0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@firebase/auth-interop-types/-/auth-interop-types-0.2.1.tgz#78884f24fa539e34a06c03612c75f222fcc33742" - integrity sha512-VOaGzKp65MY6P5FI84TfYKBXEPi6LmOCSMMzys6o2BN2LOsqy7pCuZCup7NYnfbk5OkkQKzvIfHOzTm0UDpkyg== - -"@firebase/auth-types@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@firebase/auth-types/-/auth-types-0.12.0.tgz#f28e1b68ac3b208ad02a15854c585be6da3e8e79" - integrity sha512-pPwaZt+SPOshK8xNoiQlK5XIrS97kFYc3Rc7xmy373QsOJ9MmqXxLaYssP5Kcds4wd2qK//amx/c+A8O2fVeZA== - -"@firebase/auth@0.23.2": - version "0.23.2" - resolved "https://registry.yarnpkg.com/@firebase/auth/-/auth-0.23.2.tgz#9e6d8dd550a28053c1825fb98c7dc9b37119254d" - integrity sha512-dM9iJ0R6tI1JczuGSxXmQbXAgtYie0K4WvKcuyuSTCu9V8eEDiz4tfa1sO3txsfvwg7nOY3AjoCyMYEdqZ8hdg== - dependencies: - "@firebase/component" "0.6.4" - "@firebase/logger" "0.4.0" - "@firebase/util" "1.9.3" - node-fetch "2.6.7" - tslib "^2.1.0" - -"@firebase/component@0.6.4": - version "0.6.4" - resolved "https://registry.yarnpkg.com/@firebase/component/-/component-0.6.4.tgz#8981a6818bd730a7554aa5e0516ffc9b1ae3f33d" - integrity sha512-rLMyrXuO9jcAUCaQXCMjCMUsWrba5fzHlNK24xz5j2W6A/SRmK8mZJ/hn7V0fViLbxC0lPMtrK1eYzk6Fg03jA== - dependencies: - "@firebase/util" "1.9.3" - tslib "^2.1.0" - -"@firebase/database-compat@0.3.4": - version "0.3.4" - resolved "https://registry.yarnpkg.com/@firebase/database-compat/-/database-compat-0.3.4.tgz#4e57932f7a5ba761cd5ac946ab6b6ab3f660522c" - integrity sha512-kuAW+l+sLMUKBThnvxvUZ+Q1ZrF/vFJ58iUY9kAcbX48U03nVzIF6Tmkf0p3WVQwMqiXguSgtOPIB6ZCeF+5Gg== - dependencies: - "@firebase/component" "0.6.4" - "@firebase/database" "0.14.4" - "@firebase/database-types" "0.10.4" - "@firebase/logger" "0.4.0" - "@firebase/util" "1.9.3" - tslib "^2.1.0" - -"@firebase/database-types@0.10.4": - version "0.10.4" - resolved "https://registry.yarnpkg.com/@firebase/database-types/-/database-types-0.10.4.tgz#47ba81113512dab637abace61cfb65f63d645ca7" - integrity sha512-dPySn0vJ/89ZeBac70T+2tWWPiJXWbmRygYv0smT5TfE3hDrQ09eKMF3Y+vMlTdrMWq7mUdYW5REWPSGH4kAZQ== - dependencies: - "@firebase/app-types" "0.9.0" - "@firebase/util" "1.9.3" - -"@firebase/database@0.14.4": - version "0.14.4" - resolved "https://registry.yarnpkg.com/@firebase/database/-/database-0.14.4.tgz#9e7435a16a540ddfdeb5d99d45618e6ede179aa6" - integrity sha512-+Ea/IKGwh42jwdjCyzTmeZeLM3oy1h0mFPsTy6OqCWzcu/KFqRAr5Tt1HRCOBlNOdbh84JPZC47WLU18n2VbxQ== - dependencies: - "@firebase/auth-interop-types" "0.2.1" - "@firebase/component" "0.6.4" - "@firebase/logger" "0.4.0" - "@firebase/util" "1.9.3" - faye-websocket "0.11.4" - tslib "^2.1.0" - -"@firebase/firestore-compat@0.3.12": - version "0.3.12" - resolved "https://registry.yarnpkg.com/@firebase/firestore-compat/-/firestore-compat-0.3.12.tgz#c08b24c76da7af75598f3c28432b6eb22f959b56" - integrity sha512-mazuNGAx5Kt9Nph0pm6ULJFp/+j7GSsx+Ncw1GrnKl+ft1CQ4q2LcUssXnjqkX2Ry0fNGqUzC1mfIUrk9bYtjQ== - dependencies: - "@firebase/component" "0.6.4" - "@firebase/firestore" "3.13.0" - "@firebase/firestore-types" "2.5.1" - "@firebase/util" "1.9.3" - tslib "^2.1.0" - -"@firebase/firestore-types@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@firebase/firestore-types/-/firestore-types-2.5.1.tgz#464b2ee057956599ca34de50eae957c30fdbabb7" - integrity sha512-xG0CA6EMfYo8YeUxC8FeDzf6W3FX1cLlcAGBYV6Cku12sZRI81oWcu61RSKM66K6kUENP+78Qm8mvroBcm1whw== - -"@firebase/firestore@3.13.0": - version "3.13.0" - resolved "https://registry.yarnpkg.com/@firebase/firestore/-/firestore-3.13.0.tgz#f924a3bb462bc3ac666dc5d375f3f8c4e1a72345" - integrity sha512-NwcnU+madJXQ4fbLkGx1bWvL612IJN/qO6bZ6dlPmyf7QRyu5azUosijdAN675r+bOOJxMtP1Bv981bHBXAbUg== - dependencies: - "@firebase/component" "0.6.4" - "@firebase/logger" "0.4.0" - "@firebase/util" "1.9.3" - "@firebase/webchannel-wrapper" "0.10.1" - "@grpc/grpc-js" "~1.7.0" - "@grpc/proto-loader" "^0.6.13" - node-fetch "2.6.7" - tslib "^2.1.0" - -"@firebase/functions-compat@0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@firebase/functions-compat/-/functions-compat-0.3.5.tgz#7a532d3a9764c6d5fbc1ec5541a989a704326647" - integrity sha512-uD4jwgwVqdWf6uc3NRKF8cSZ0JwGqSlyhPgackyUPe+GAtnERpS4+Vr66g0b3Gge0ezG4iyHo/EXW/Hjx7QhHw== - dependencies: - "@firebase/component" "0.6.4" - "@firebase/functions" "0.10.0" - "@firebase/functions-types" "0.6.0" - "@firebase/util" "1.9.3" - tslib "^2.1.0" - -"@firebase/functions-types@0.6.0": - version "0.6.0" - resolved "https://registry.yarnpkg.com/@firebase/functions-types/-/functions-types-0.6.0.tgz#ccd7000dc6fc668f5acb4e6a6a042a877a555ef2" - integrity sha512-hfEw5VJtgWXIRf92ImLkgENqpL6IWpYaXVYiRkFY1jJ9+6tIhWM7IzzwbevwIIud/jaxKVdRzD7QBWfPmkwCYw== - -"@firebase/functions@0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@firebase/functions/-/functions-0.10.0.tgz#c630ddf12cdf941c25bc8d554e30c3226cd560f6" - integrity sha512-2U+fMNxTYhtwSpkkR6WbBcuNMOVaI7MaH3cZ6UAeNfj7AgEwHwMIFLPpC13YNZhno219F0lfxzTAA0N62ndWzA== - dependencies: - "@firebase/app-check-interop-types" "0.3.0" - "@firebase/auth-interop-types" "0.2.1" - "@firebase/component" "0.6.4" - "@firebase/messaging-interop-types" "0.2.0" - "@firebase/util" "1.9.3" - node-fetch "2.6.7" - tslib "^2.1.0" - -"@firebase/installations-compat@0.2.4": - version "0.2.4" - resolved "https://registry.yarnpkg.com/@firebase/installations-compat/-/installations-compat-0.2.4.tgz#b5557c897b4cd3635a59887a8bf69c3731aaa952" - integrity sha512-LI9dYjp0aT9Njkn9U4JRrDqQ6KXeAmFbRC0E7jI7+hxl5YmRWysq5qgQl22hcWpTk+cm3es66d/apoDU/A9n6Q== - dependencies: - "@firebase/component" "0.6.4" - "@firebase/installations" "0.6.4" - "@firebase/installations-types" "0.5.0" - "@firebase/util" "1.9.3" - tslib "^2.1.0" - -"@firebase/installations-types@0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@firebase/installations-types/-/installations-types-0.5.0.tgz#2adad64755cd33648519b573ec7ec30f21fb5354" - integrity sha512-9DP+RGfzoI2jH7gY4SlzqvZ+hr7gYzPODrbzVD82Y12kScZ6ZpRg/i3j6rleto8vTFC8n6Len4560FnV1w2IRg== - -"@firebase/installations@0.6.4": - version "0.6.4" - resolved "https://registry.yarnpkg.com/@firebase/installations/-/installations-0.6.4.tgz#20382e33e6062ac5eff4bede8e468ed4c367609e" - integrity sha512-u5y88rtsp7NYkCHC3ElbFBrPtieUybZluXyzl7+4BsIz4sqb4vSAuwHEUgCgCeaQhvsnxDEU6icly8U9zsJigA== - dependencies: - "@firebase/component" "0.6.4" - "@firebase/util" "1.9.3" - idb "7.0.1" - tslib "^2.1.0" - -"@firebase/logger@0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@firebase/logger/-/logger-0.4.0.tgz#15ecc03c452525f9d47318ad9491b81d1810f113" - integrity sha512-eRKSeykumZ5+cJPdxxJRgAC3G5NknY2GwEbKfymdnXtnT0Ucm4pspfR6GT4MUQEDuJwRVbVcSx85kgJulMoFFA== - dependencies: - tslib "^2.1.0" - -"@firebase/messaging-compat@0.2.4": - version "0.2.4" - resolved "https://registry.yarnpkg.com/@firebase/messaging-compat/-/messaging-compat-0.2.4.tgz#323ca48deef77065b4fcda3cfd662c4337dffcfd" - integrity sha512-lyFjeUhIsPRYDPNIkYX1LcZMpoVbBWXX4rPl7c/rqc7G+EUea7IEtSt4MxTvh6fDfPuzLn7+FZADfscC+tNMfg== - dependencies: - "@firebase/component" "0.6.4" - "@firebase/messaging" "0.12.4" - "@firebase/util" "1.9.3" - tslib "^2.1.0" - -"@firebase/messaging-interop-types@0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.0.tgz#6056f8904a696bf0f7fdcf5f2ca8f008e8f6b064" - integrity sha512-ujA8dcRuVeBixGR9CtegfpU4YmZf3Lt7QYkcj693FFannwNuZgfAYaTmbJ40dtjB81SAu6tbFPL9YLNT15KmOQ== - -"@firebase/messaging@0.12.4": - version "0.12.4" - resolved "https://registry.yarnpkg.com/@firebase/messaging/-/messaging-0.12.4.tgz#ccb49df5ab97d5650c9cf5b8c77ddc34daafcfe0" - integrity sha512-6JLZct6zUaex4g7HI3QbzeUrg9xcnmDAPTWpkoMpd/GoSVWH98zDoWXMGrcvHeCAIsLpFMe4MPoZkJbrPhaASw== - dependencies: - "@firebase/component" "0.6.4" - "@firebase/installations" "0.6.4" - "@firebase/messaging-interop-types" "0.2.0" - "@firebase/util" "1.9.3" - idb "7.0.1" - tslib "^2.1.0" - -"@firebase/performance-compat@0.2.4": - version "0.2.4" - resolved "https://registry.yarnpkg.com/@firebase/performance-compat/-/performance-compat-0.2.4.tgz#95cbf32057b5d9f0c75d804bc50e6ed3ba486274" - integrity sha512-nnHUb8uP9G8islzcld/k6Bg5RhX62VpbAb/Anj7IXs/hp32Eb2LqFPZK4sy3pKkBUO5wcrlRWQa6wKOxqlUqsg== - dependencies: - "@firebase/component" "0.6.4" - "@firebase/logger" "0.4.0" - "@firebase/performance" "0.6.4" - "@firebase/performance-types" "0.2.0" - "@firebase/util" "1.9.3" - tslib "^2.1.0" - -"@firebase/performance-types@0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@firebase/performance-types/-/performance-types-0.2.0.tgz#400685f7a3455970817136d9b48ce07a4b9562ff" - integrity sha512-kYrbr8e/CYr1KLrLYZZt2noNnf+pRwDq2KK9Au9jHrBMnb0/C9X9yWSXmZkFt4UIdsQknBq8uBB7fsybZdOBTA== - -"@firebase/performance@0.6.4": - version "0.6.4" - resolved "https://registry.yarnpkg.com/@firebase/performance/-/performance-0.6.4.tgz#0ad766bfcfab4f386f4fe0bef43bbcf505015069" - integrity sha512-HfTn/bd8mfy/61vEqaBelNiNnvAbUtME2S25A67Nb34zVuCSCRIX4SseXY6zBnOFj3oLisaEqhVcJmVPAej67g== - dependencies: - "@firebase/component" "0.6.4" - "@firebase/installations" "0.6.4" - "@firebase/logger" "0.4.0" - "@firebase/util" "1.9.3" - tslib "^2.1.0" - -"@firebase/remote-config-compat@0.2.4": - version "0.2.4" - resolved "https://registry.yarnpkg.com/@firebase/remote-config-compat/-/remote-config-compat-0.2.4.tgz#1f494c81a6c9560b1f9ca1b4fbd4bbbe47cf4776" - integrity sha512-FKiki53jZirrDFkBHglB3C07j5wBpitAaj8kLME6g8Mx+aq7u9P7qfmuSRytiOItADhWUj7O1JIv7n9q87SuwA== - dependencies: - "@firebase/component" "0.6.4" - "@firebase/logger" "0.4.0" - "@firebase/remote-config" "0.4.4" - "@firebase/remote-config-types" "0.3.0" - "@firebase/util" "1.9.3" - tslib "^2.1.0" - -"@firebase/remote-config-types@0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@firebase/remote-config-types/-/remote-config-types-0.3.0.tgz#689900dcdb3e5c059e8499b29db393e4e51314b4" - integrity sha512-RtEH4vdcbXZuZWRZbIRmQVBNsE7VDQpet2qFvq6vwKLBIQRQR5Kh58M4ok3A3US8Sr3rubYnaGqZSurCwI8uMA== - -"@firebase/remote-config@0.4.4": - version "0.4.4" - resolved "https://registry.yarnpkg.com/@firebase/remote-config/-/remote-config-0.4.4.tgz#6a496117054de58744bc9f382d2a6d1e14060c65" - integrity sha512-x1ioTHGX8ZwDSTOVp8PBLv2/wfwKzb4pxi0gFezS5GCJwbLlloUH4YYZHHS83IPxnua8b6l0IXUaWd0RgbWwzQ== - dependencies: - "@firebase/component" "0.6.4" - "@firebase/installations" "0.6.4" - "@firebase/logger" "0.4.0" - "@firebase/util" "1.9.3" - tslib "^2.1.0" - -"@firebase/storage-compat@0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@firebase/storage-compat/-/storage-compat-0.3.2.tgz#51a97170fd652a516f729f82b97af369e5a2f8d7" - integrity sha512-wvsXlLa9DVOMQJckbDNhXKKxRNNewyUhhbXev3t8kSgoCotd1v3MmqhKKz93ePhDnhHnDs7bYHy+Qa8dRY6BXw== - dependencies: - "@firebase/component" "0.6.4" - "@firebase/storage" "0.11.2" - "@firebase/storage-types" "0.8.0" - "@firebase/util" "1.9.3" - tslib "^2.1.0" - -"@firebase/storage-types@0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@firebase/storage-types/-/storage-types-0.8.0.tgz#f1e40a5361d59240b6e84fac7fbbbb622bfaf707" - integrity sha512-isRHcGrTs9kITJC0AVehHfpraWFui39MPaU7Eo8QfWlqW7YPymBmRgjDrlOgFdURh6Cdeg07zmkLP5tzTKRSpg== - -"@firebase/storage@0.11.2": - version "0.11.2" - resolved "https://registry.yarnpkg.com/@firebase/storage/-/storage-0.11.2.tgz#c5e0316543fe1c4026b8e3910f85ad73f5b77571" - integrity sha512-CtvoFaBI4hGXlXbaCHf8humajkbXhs39Nbh6MbNxtwJiCqxPy9iH3D3CCfXAvP0QvAAwmJUTK3+z9a++Kc4nkA== - dependencies: - "@firebase/component" "0.6.4" - "@firebase/util" "1.9.3" - node-fetch "2.6.7" - tslib "^2.1.0" - -"@firebase/util@1.9.3": - version "1.9.3" - resolved "https://registry.yarnpkg.com/@firebase/util/-/util-1.9.3.tgz#45458dd5cd02d90e55c656e84adf6f3decf4b7ed" - integrity sha512-DY02CRhOZwpzO36fHpuVysz6JZrscPiBXD0fXp6qSrL9oNOx5KWICKdR95C0lSITzxp0TZosVyHqzatE8JbcjA== - dependencies: - tslib "^2.1.0" - -"@firebase/webchannel-wrapper@0.10.1": - version "0.10.1" - resolved "https://registry.yarnpkg.com/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.10.1.tgz#60bb2aaf129f9e00621f8d698722ddba6ee1f8ac" - integrity sha512-Dq5rYfEpdeel0bLVN+nfD1VWmzCkK+pJbSjIawGE+RY4+NIJqhbUDDQjvV0NUK84fMfwxvtFoCtEe70HfZjFcw== - -"@grpc/grpc-js@~1.7.0": - version "1.7.3" - resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.7.3.tgz#f2ea79f65e31622d7f86d4b4c9ae38f13ccab99a" - integrity sha512-H9l79u4kJ2PVSxUNA08HMYAnUBLj9v6KjYQ7SQ71hOZcEXhShE/y5iQCesP8+6/Ik/7i2O0a10bPquIcYfufog== - dependencies: - "@grpc/proto-loader" "^0.7.0" - "@types/node" ">=12.12.47" - -"@grpc/proto-loader@^0.6.13": - version "0.6.13" - resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.6.13.tgz#008f989b72a40c60c96cd4088522f09b05ac66bc" - integrity sha512-FjxPYDRTn6Ec3V0arm1FtSpmP6V50wuph2yILpyvTKzjc76oDdoihXqM1DzOW5ubvCC8GivfCnNtfaRE8myJ7g== - dependencies: - "@types/long" "^4.0.1" - lodash.camelcase "^4.3.0" - long "^4.0.0" - protobufjs "^6.11.3" - yargs "^16.2.0" - -"@grpc/proto-loader@^0.7.0": - version "0.7.13" - resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.13.tgz#f6a44b2b7c9f7b609f5748c6eac2d420e37670cf" - integrity sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw== - dependencies: - lodash.camelcase "^4.3.0" - long "^5.0.0" - protobufjs "^7.2.5" - yargs "^17.7.2" - -"@humanfs/core@^0.19.1": - version "0.19.1" - resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" - integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== - -"@humanfs/node@^0.16.6": - version "0.16.7" - resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.7.tgz#822cb7b3a12c5a240a24f621b5a2413e27a45f26" - integrity sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ== - dependencies: - "@humanfs/core" "^0.19.1" - "@humanwhocodes/retry" "^0.4.0" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/retry@^0.4.0", "@humanwhocodes/retry@^0.4.2": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba" - integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== - -"@isaacs/balanced-match@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz#3081dadbc3460661b751e7591d7faea5df39dd29" - integrity sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ== - -"@isaacs/brace-expansion@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz#4b3dabab7d8e75a429414a96bd67bf4c1d13e0f3" - integrity sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA== - dependencies: - "@isaacs/balanced-match" "^4.0.1" - -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" - integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== - dependencies: - string-width "^5.1.2" - string-width-cjs "npm:string-width@^4.2.0" - strip-ansi "^7.0.1" - strip-ansi-cjs "npm:strip-ansi@^6.0.1" - wrap-ansi "^8.1.0" - wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" - -"@jridgewell/gen-mapping@^0.3.5": - version "0.3.8" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" - integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== - dependencies: - "@jridgewell/set-array" "^1.2.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/set-array@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" - integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" - integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== - -"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/sourcemap-codec@^1.5.5": - version "1.5.5" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" - integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== - -"@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24": - version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" - integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@novacbn/svelte-codejar@^0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@novacbn/svelte-codejar/-/svelte-codejar-0.1.2.tgz#cda42d542cb7c44c3a296178bfc6097300abf2d4" - integrity sha512-lZd6r+dbdU+zN8d4QW005QEmTT6WDKjpTXvbPIcqIWGSnbWBVoEMFPOwJ0C3PYM4hHAjb2GHF4DBywlWQogNLw== - dependencies: - codejar "^3.5.0" - svelte "^3.42.3" - -"@octokit/app@^16.0.1": - version "16.1.0" - resolved "https://registry.yarnpkg.com/@octokit/app/-/app-16.1.0.tgz#e0d7472fc2e7ae7b0ab3f1e4cca8c2aba5f052ad" - integrity sha512-OdKHnm0CYLk8Setr47CATT4YnRTvWkpTYvE+B/l2B0mjszlfOIit3wqPHVslD2jfc1bD4UbO7Mzh6gjCuMZKsA== - dependencies: - "@octokit/auth-app" "^8.1.0" - "@octokit/auth-unauthenticated" "^7.0.1" - "@octokit/core" "^7.0.2" - "@octokit/oauth-app" "^8.0.1" - "@octokit/plugin-paginate-rest" "^13.0.0" - "@octokit/types" "^14.0.0" - "@octokit/webhooks" "^14.0.0" - -"@octokit/auth-app@^8.1.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@octokit/auth-app/-/auth-app-8.1.0.tgz#19dacfe49ea62a1f40189ac222925e8a757b6a7c" - integrity sha512-6bWhyvLXqCSfHiqlwzn9pScLZ+Qnvh/681GR/UEEPCMIVwfpRDBw0cCzy3/t2Dq8B7W2X/8pBgmw6MOiyE0DXQ== - dependencies: - "@octokit/auth-oauth-app" "^9.0.1" - "@octokit/auth-oauth-user" "^6.0.0" - "@octokit/request" "^10.0.2" - "@octokit/request-error" "^7.0.0" - "@octokit/types" "^14.0.0" - toad-cache "^3.7.0" - universal-github-app-jwt "^2.2.0" - universal-user-agent "^7.0.0" - -"@octokit/auth-oauth-app@^9.0.1": - version "9.0.1" - resolved "https://registry.yarnpkg.com/@octokit/auth-oauth-app/-/auth-oauth-app-9.0.1.tgz#d8d2e950c95e9fcbe6f2fb98d4539ee8c9871766" - integrity sha512-TthWzYxuHKLAbmxdFZwFlmwVyvynpyPmjwc+2/cI3cvbT7mHtsAW9b1LvQaNnAuWL+pFnqtxdmrU8QpF633i1g== - dependencies: - "@octokit/auth-oauth-device" "^8.0.1" - "@octokit/auth-oauth-user" "^6.0.0" - "@octokit/request" "^10.0.2" - "@octokit/types" "^14.0.0" - universal-user-agent "^7.0.0" - -"@octokit/auth-oauth-device@^8.0.1": - version "8.0.1" - resolved "https://registry.yarnpkg.com/@octokit/auth-oauth-device/-/auth-oauth-device-8.0.1.tgz#232ec13e299dd6bf199fe237527d04ec12decffb" - integrity sha512-TOqId/+am5yk9zor0RGibmlqn4V0h8vzjxlw/wYr3qzkQxl8aBPur384D1EyHtqvfz0syeXji4OUvKkHvxk/Gw== - dependencies: - "@octokit/oauth-methods" "^6.0.0" - "@octokit/request" "^10.0.2" - "@octokit/types" "^14.0.0" - universal-user-agent "^7.0.0" - -"@octokit/auth-oauth-user@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@octokit/auth-oauth-user/-/auth-oauth-user-6.0.0.tgz#ba643060824536cd848c72d835061b1c00007286" - integrity sha512-GV9IW134PHsLhtUad21WIeP9mlJ+QNpFd6V9vuPWmaiN25HEJeEQUcS4y5oRuqCm9iWDLtfIs+9K8uczBXKr6A== - dependencies: - "@octokit/auth-oauth-device" "^8.0.1" - "@octokit/oauth-methods" "^6.0.0" - "@octokit/request" "^10.0.2" - "@octokit/types" "^14.0.0" - universal-user-agent "^7.0.0" - -"@octokit/auth-token@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-6.0.0.tgz#b02e9c08a2d8937df09a2a981f226ad219174c53" - integrity sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w== - -"@octokit/auth-unauthenticated@^7.0.1": - version "7.0.1" - resolved "https://registry.yarnpkg.com/@octokit/auth-unauthenticated/-/auth-unauthenticated-7.0.1.tgz#427b8a52e672318f84757307e766a448c741116b" - integrity sha512-qVq1vdjLLZdE8kH2vDycNNjuJRCD1q2oet1nA/GXWaYlpDxlR7rdVhX/K/oszXslXiQIiqrQf+rdhDlA99JdTQ== - dependencies: - "@octokit/request-error" "^7.0.0" - "@octokit/types" "^14.0.0" - -"@octokit/core@^7.0.2": - version "7.0.4" - resolved "https://registry.yarnpkg.com/@octokit/core/-/core-7.0.4.tgz#91efe208b52bbb47f997d634cdc95fc839a75e38" - integrity sha512-jOT8V1Ba5BdC79sKrRWDdMT5l1R+XNHTPR6CPWzUP2EcfAcvIHZWF0eAbmRcpOOP5gVIwnqNg0C4nvh6Abc3OA== - dependencies: - "@octokit/auth-token" "^6.0.0" - "@octokit/graphql" "^9.0.1" - "@octokit/request" "^10.0.2" - "@octokit/request-error" "^7.0.0" - "@octokit/types" "^15.0.0" - before-after-hook "^4.0.0" - universal-user-agent "^7.0.0" - -"@octokit/endpoint@^11.0.0": - version "11.0.0" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-11.0.0.tgz#189fcc022721b4c49d0307eea6be3de1cfb53026" - integrity sha512-hoYicJZaqISMAI3JfaDr1qMNi48OctWuOih1m80bkYow/ayPw6Jj52tqWJ6GEoFTk1gBqfanSoI1iY99Z5+ekQ== - dependencies: - "@octokit/types" "^14.0.0" - universal-user-agent "^7.0.2" - -"@octokit/graphql@^9.0.1": - version "9.0.1" - resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-9.0.1.tgz#eb258fc9981403d2d751720832652c385b6c1613" - integrity sha512-j1nQNU1ZxNFx2ZtKmL4sMrs4egy5h65OMDmSbVyuCzjOcwsHq6EaYjOTGXPQxgfiN8dJ4CriYHk6zF050WEULg== - dependencies: - "@octokit/request" "^10.0.2" - "@octokit/types" "^14.0.0" - universal-user-agent "^7.0.0" - -"@octokit/oauth-app@^8.0.1": - version "8.0.1" - resolved "https://registry.yarnpkg.com/@octokit/oauth-app/-/oauth-app-8.0.1.tgz#7cb889945c3ccacfd0ff9aa9f05e9748b439f7f3" - integrity sha512-QnhMYEQpnYbEPn9cae+wXL2LuPMFglmfeuDJXXsyxIXdoORwkLK8y0cHhd/5du9MbO/zdG/BXixzB7EEwU63eQ== - dependencies: - "@octokit/auth-oauth-app" "^9.0.1" - "@octokit/auth-oauth-user" "^6.0.0" - "@octokit/auth-unauthenticated" "^7.0.1" - "@octokit/core" "^7.0.2" - "@octokit/oauth-authorization-url" "^8.0.0" - "@octokit/oauth-methods" "^6.0.0" - "@types/aws-lambda" "^8.10.83" - universal-user-agent "^7.0.0" - -"@octokit/oauth-authorization-url@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@octokit/oauth-authorization-url/-/oauth-authorization-url-8.0.0.tgz#fdbab39a07d38faaad8621a5fdf04bc0c36d63e7" - integrity sha512-7QoLPRh/ssEA/HuHBHdVdSgF8xNLz/Bc5m9fZkArJE5bb6NmVkDm3anKxXPmN1zh6b5WKZPRr3697xKT/yM3qQ== - -"@octokit/oauth-methods@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@octokit/oauth-methods/-/oauth-methods-6.0.0.tgz#a138bbbec6762b52249f7c47d0c548fc1cf6ad7b" - integrity sha512-Q8nFIagNLIZgM2odAraelMcDssapc+lF+y3OlcIPxyAU+knefO8KmozGqfnma1xegRDP4z5M73ABsamn72bOcA== - dependencies: - "@octokit/oauth-authorization-url" "^8.0.0" - "@octokit/request" "^10.0.2" - "@octokit/request-error" "^7.0.0" - "@octokit/types" "^14.0.0" - -"@octokit/openapi-types@^25.1.0": - version "25.1.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-25.1.0.tgz#5a72a9dfaaba72b5b7db375fd05e90ca90dc9682" - integrity sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA== - -"@octokit/openapi-types@^26.0.0": - version "26.0.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-26.0.0.tgz#a528b560dbc4f02040dc08d19575498d57fff19d" - integrity sha512-7AtcfKtpo77j7Ts73b4OWhOZHTKo/gGY8bB3bNBQz4H+GRSWqx2yvj8TXRsbdTE0eRmYmXOEY66jM7mJ7LzfsA== - -"@octokit/openapi-webhooks-types@12.0.3": - version "12.0.3" - resolved "https://registry.yarnpkg.com/@octokit/openapi-webhooks-types/-/openapi-webhooks-types-12.0.3.tgz#fa44fb31fbb4c444c5fd640dbbf537f00c20617c" - integrity sha512-90MF5LVHjBedwoHyJsgmaFhEN1uzXyBDRLEBe7jlTYx/fEhPAk3P3DAJsfZwC54m8hAIryosJOL+UuZHB3K3yA== - -"@octokit/plugin-paginate-graphql@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-graphql/-/plugin-paginate-graphql-6.0.0.tgz#acdefd7e85ce24716e7ad7352f2df4d29d0e273b" - integrity sha512-crfpnIoFiBtRkvPqOyLOsw12XsveYuY2ieP6uYDosoUegBJpSVxGwut9sxUgFFcll3VTOTqpUf8yGd8x1OmAkQ== - -"@octokit/plugin-paginate-rest@^13.0.0": - version "13.1.1" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-13.1.1.tgz#ca5bb1c7b85a583691263c1f788f607e9bcb74b3" - integrity sha512-q9iQGlZlxAVNRN2jDNskJW/Cafy7/XE52wjZ5TTvyhyOD904Cvx//DNyoO3J/MXJ0ve3rPoNWKEg5iZrisQSuw== - dependencies: - "@octokit/types" "^14.1.0" - -"@octokit/plugin-rest-endpoint-methods@^16.0.0": - version "16.1.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-16.1.0.tgz#eb17ce9e37327dcf7b15f4b31244d7f0b58491d1" - integrity sha512-nCsyiKoGRnhH5LkH8hJEZb9swpqOcsW+VXv1QoyUNQXJeVODG4+xM6UICEqyqe9XFr6LkL8BIiFCPev8zMDXPw== - dependencies: - "@octokit/types" "^15.0.0" - -"@octokit/plugin-retry@^8.0.1": - version "8.0.1" - resolved "https://registry.yarnpkg.com/@octokit/plugin-retry/-/plugin-retry-8.0.1.tgz#ee4a0487d31b97ad3deaf737faad68abeca3c227" - integrity sha512-KUoYR77BjF5O3zcwDQHRRZsUvJwepobeqiSSdCJ8lWt27FZExzb0GgVxrhhfuyF6z2B2zpO0hN5pteni1sqWiw== - dependencies: - "@octokit/request-error" "^7.0.0" - "@octokit/types" "^14.0.0" - bottleneck "^2.15.3" - -"@octokit/plugin-throttling@^11.0.1": - version "11.0.1" - resolved "https://registry.yarnpkg.com/@octokit/plugin-throttling/-/plugin-throttling-11.0.1.tgz#31a0b5e759f0313514d9522a4103360f17ffc2e4" - integrity sha512-S+EVhy52D/272L7up58dr3FNSMXWuNZolkL4zMJBNIfIxyZuUcczsQAU4b5w6dewJXnKYVgSHSV5wxitMSW1kw== - dependencies: - "@octokit/types" "^14.0.0" - bottleneck "^2.15.3" - -"@octokit/request-error@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-7.0.0.tgz#48ae2cd79008315605d00e83664891a10a5ddb97" - integrity sha512-KRA7VTGdVyJlh0cP5Tf94hTiYVVqmt2f3I6mnimmaVz4UG3gQV/k4mDJlJv3X67iX6rmN7gSHCF8ssqeMnmhZg== - dependencies: - "@octokit/types" "^14.0.0" - -"@octokit/request@^10.0.2": - version "10.0.3" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-10.0.3.tgz#2ffdb88105ce20d25dcab8a592a7040ea48306c7" - integrity sha512-V6jhKokg35vk098iBqp2FBKunk3kMTXlmq+PtbV9Gl3TfskWlebSofU9uunVKhUN7xl+0+i5vt0TGTG8/p/7HA== - dependencies: - "@octokit/endpoint" "^11.0.0" - "@octokit/request-error" "^7.0.0" - "@octokit/types" "^14.0.0" - fast-content-type-parse "^3.0.0" - universal-user-agent "^7.0.2" - -"@octokit/types@^14.0.0", "@octokit/types@^14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-14.1.0.tgz#3bf9b3a3e3b5270964a57cc9d98592ed44f840f2" - integrity sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g== - dependencies: - "@octokit/openapi-types" "^25.1.0" - -"@octokit/types@^15.0.0": - version "15.0.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-15.0.0.tgz#6afe9b012115284ded9bf779e90d04081e0eadd3" - integrity sha512-8o6yDfmoGJUIeR9OfYU0/TUJTnMPG2r68+1yEdUeG2Fdqpj8Qetg0ziKIgcBm0RW/j29H41WP37CYCEhp6GoHQ== - dependencies: - "@octokit/openapi-types" "^26.0.0" - -"@octokit/webhooks-methods@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@octokit/webhooks-methods/-/webhooks-methods-6.0.0.tgz#34abf78aec6f826fe561cfe79d2ebb1950d1d25f" - integrity sha512-MFlzzoDJVw/GcbfzVC1RLR36QqkTLUf79vLVO3D+xn7r0QgxnFoLZgtrzxiQErAjFUOdH6fas2KeQJ1yr/qaXQ== - -"@octokit/webhooks@^14.0.0": - version "14.1.3" - resolved "https://registry.yarnpkg.com/@octokit/webhooks/-/webhooks-14.1.3.tgz#2d0bed71b07745c0b33363d69e0ae0e440469a18" - integrity sha512-gcK4FNaROM9NjA0mvyfXl0KPusk7a1BeA8ITlYEZVQCXF5gcETTd4yhAU0Kjzd8mXwYHppzJBWgdBVpIR9wUcQ== - dependencies: - "@octokit/openapi-webhooks-types" "12.0.3" - "@octokit/request-error" "^7.0.0" - "@octokit/webhooks-methods" "^6.0.0" - -"@polka/url@^1.0.0-next.20": - version "1.0.0-next.25" - resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.25.tgz#f077fdc0b5d0078d30893396ff4827a13f99e817" - integrity sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ== - -"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" - integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== - -"@protobufjs/base64@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" - integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== - -"@protobufjs/codegen@^2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" - integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== - -"@protobufjs/eventemitter@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" - integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== - -"@protobufjs/fetch@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" - integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== - dependencies: - "@protobufjs/aspromise" "^1.1.1" - "@protobufjs/inquire" "^1.1.0" - -"@protobufjs/float@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" - integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== - -"@protobufjs/inquire@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" - integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== - -"@protobufjs/path@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" - integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== - -"@protobufjs/pool@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" - integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== - -"@protobufjs/utf8@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" - integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== - -"@rollup/rollup-android-arm-eabi@4.52.4": - version "4.52.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.4.tgz#59e7478d310f7e6a7c72453978f562483828112f" - integrity sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA== - -"@rollup/rollup-android-arm64@4.52.4": - version "4.52.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.4.tgz#a825192a0b1b2f27a5c950c439e7e37a33c5d056" - integrity sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w== - -"@rollup/rollup-darwin-arm64@4.52.4": - version "4.52.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.4.tgz#4ee37078bccd725ae3c5f30ef92efc8e1bf886f3" - integrity sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg== - -"@rollup/rollup-darwin-x64@4.52.4": - version "4.52.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.4.tgz#43cc08bd05bf9f388f125e7210a544e62d368d90" - integrity sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw== - -"@rollup/rollup-freebsd-arm64@4.52.4": - version "4.52.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.4.tgz#bc8e640e28abe52450baf3fc80d9b26d9bb6587d" - integrity sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ== - -"@rollup/rollup-freebsd-x64@4.52.4": - version "4.52.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.4.tgz#e981a22e057cc8c65bb523019d344d3a66b15bbc" - integrity sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw== - -"@rollup/rollup-linux-arm-gnueabihf@4.52.4": - version "4.52.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.4.tgz#4036b68904f392a20f3499d63b33e055b67eb274" - integrity sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ== - -"@rollup/rollup-linux-arm-musleabihf@4.52.4": - version "4.52.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.4.tgz#d3b1b9589606e0ff916801c855b1ace9e733427a" - integrity sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q== - -"@rollup/rollup-linux-arm64-gnu@4.52.4": - version "4.52.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.4.tgz#cbf0943c477e3b96340136dd3448eaf144378cf2" - integrity sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg== - -"@rollup/rollup-linux-arm64-musl@4.52.4": - version "4.52.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.4.tgz#837f5a428020d5dce1c3b4cc049876075402cf78" - integrity sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g== - -"@rollup/rollup-linux-loong64-gnu@4.52.4": - version "4.52.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.4.tgz#532c214ababb32ab4bc21b4054278b9a8979e516" - integrity sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ== - -"@rollup/rollup-linux-ppc64-gnu@4.52.4": - version "4.52.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.4.tgz#93900163b61b49cee666d10ee38257a8b1dd161a" - integrity sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g== - -"@rollup/rollup-linux-riscv64-gnu@4.52.4": - version "4.52.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.4.tgz#f0ffdcc7066ca04bc972370c74289f35c7a7dc42" - integrity sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg== - -"@rollup/rollup-linux-riscv64-musl@4.52.4": - version "4.52.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.4.tgz#361695c39dbe96773509745d77a870a32a9f8e48" - integrity sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA== - -"@rollup/rollup-linux-s390x-gnu@4.52.4": - version "4.52.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.4.tgz#09fc6cc2e266a2324e366486ae5d1bca48c43a6a" - integrity sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA== - -"@rollup/rollup-linux-x64-gnu@4.52.4": - version "4.52.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.4.tgz#aa9d5b307c08f05d3454225bb0a2b4cc87eeb2e1" - integrity sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg== - -"@rollup/rollup-linux-x64-musl@4.52.4": - version "4.52.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.4.tgz#26949e5b4645502a61daba2f7a8416bd17cb5382" - integrity sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw== - -"@rollup/rollup-openharmony-arm64@4.52.4": - version "4.52.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.4.tgz#ef493c072f9dac7e0edb6c72d63366846b6ffcd9" - integrity sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA== - -"@rollup/rollup-win32-arm64-msvc@4.52.4": - version "4.52.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.4.tgz#56e1aaa6a630d2202ee7ec0adddd05cf384ffd44" - integrity sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ== - -"@rollup/rollup-win32-ia32-msvc@4.52.4": - version "4.52.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.4.tgz#0a44bbf933a9651c7da2b8569fa448dec0de7480" - integrity sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw== - -"@rollup/rollup-win32-x64-gnu@4.52.4": - version "4.52.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.4.tgz#730e12f0b60b234a7c02d5d3179ca3ec7972033d" - integrity sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ== - -"@rollup/rollup-win32-x64-msvc@4.52.4": - version "4.52.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.4.tgz#5b2dd648a960b8fa00d76f2cc4eea2f03daa80f4" - integrity sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w== - -"@sindresorhus/is@^0.7.0": - version "0.7.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" - integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow== - -"@sindresorhus/is@^4.0.0": - version "4.6.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" - integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== - -"@szmarczak/http-timer@^4.0.5": - version "4.0.6" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" - integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== - dependencies: - defer-to-connect "^2.0.0" - -"@types/aws-lambda@^8.10.83": - version "8.10.152" - resolved "https://registry.yarnpkg.com/@types/aws-lambda/-/aws-lambda-8.10.152.tgz#f68424a8175f0a54a2a941e65b76c3f51f3bd89d" - integrity sha512-soT/c2gYBnT5ygwiHPmd9a1bftj462NWVk2tKCc1PYHSIacB2UwbTS2zYG4jzag1mRDuzg/OjtxQjQ2NKRB6Rw== - -"@types/cacheable-request@^6.0.1": - version "6.0.3" - resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183" - integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== - dependencies: - "@types/http-cache-semantics" "*" - "@types/keyv" "^3.1.4" - "@types/node" "*" - "@types/responselike" "^1.0.0" - -"@types/chai@^5.2.2": - version "5.2.2" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-5.2.2.tgz#6f14cea18180ffc4416bc0fd12be05fdd73bdd6b" - integrity sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg== - dependencies: - "@types/deep-eql" "*" - -"@types/decompress@*": - version "4.2.7" - resolved "https://registry.yarnpkg.com/@types/decompress/-/decompress-4.2.7.tgz#604f69b69d519ecb74dea1ea0829f159b85e1332" - integrity sha512-9z+8yjKr5Wn73Pt17/ldnmQToaFHZxK0N1GHysuk/JIPT8RIdQeoInM01wWPgypRcvb6VH1drjuFpQ4zmY437g== - dependencies: - "@types/node" "*" - -"@types/deep-eql@*": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/deep-eql/-/deep-eql-4.0.2.tgz#334311971d3a07121e7eb91b684a605e7eea9cbd" - integrity sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw== - -"@types/dompurify@^3.0.5": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/dompurify/-/dompurify-3.0.5.tgz#02069a2fcb89a163bacf1a788f73cb415dd75cb7" - integrity sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg== - dependencies: - "@types/trusted-types" "*" - -"@types/download@^8.0.5": - version "8.0.5" - resolved "https://registry.yarnpkg.com/@types/download/-/download-8.0.5.tgz#5d800d1268343b43189f5cd0c92cc914a7786ed3" - integrity sha512-Ad68goc/BsL3atP3OP/lWKAKhiC6FduN1mC5yg9lZuGYmUY7vyoWBcXgt8GE9OzVWRq5IBXwm4o/QiE+gipZAg== - dependencies: - "@types/decompress" "*" - "@types/got" "^9" - "@types/node" "*" - -"@types/eslint@^8.21.1": - version "8.56.10" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.10.tgz#eb2370a73bf04a901eeba8f22595c7ee0f7eb58d" - integrity sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" - integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== - -"@types/estree@1.0.8": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" - integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== - -"@types/estree@^1.0.0", "@types/estree@^1.0.1", "@types/estree@^1.0.6": - version "1.0.6" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" - integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== - -"@types/got@^9": - version "9.6.12" - resolved "https://registry.yarnpkg.com/@types/got/-/got-9.6.12.tgz#fd42a6e1f5f64cd6bb422279b08c30bb5a15a56f" - integrity sha512-X4pj/HGHbXVLqTpKjA2ahI4rV/nNBc9mGO2I/0CgAra+F2dKgMXnENv2SRpemScBzBAI4vMelIVYViQxlSE6xA== - dependencies: - "@types/node" "*" - "@types/tough-cookie" "*" - form-data "^2.5.0" - -"@types/http-cache-semantics@*": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4" - integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== - -"@types/jquery@^3.5.4": - version "3.5.30" - resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.5.30.tgz#888d584cbf844d3df56834b69925085038fd80f7" - integrity sha512-nbWKkkyb919DOUxjmRVk8vwtDb0/k8FKncmUKFi+NY+QXqWltooxTrswvz4LspQwxvLdvzBN1TImr6cw3aQx2A== - dependencies: - "@types/sizzle" "*" - -"@types/js-yaml@^4.0.5": - version "4.0.9" - resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.9.tgz#cd82382c4f902fed9691a2ed79ec68c5898af4c2" - integrity sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg== - -"@types/json-schema@*", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.9": - version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - -"@types/keyv@^3.1.4": - version "3.1.4" - resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" - integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== - dependencies: - "@types/node" "*" - -"@types/long@^4.0.1": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" - integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== - -"@types/node@*", "@types/node@>=12.12.47", "@types/node@>=13.7.0", "@types/node@^20.9.0": - version "20.12.12" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.12.tgz#7cbecdf902085cec634fdb362172dfe12b8f2050" - integrity sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw== - dependencies: - undici-types "~5.26.4" - -"@types/node@^17.0.21": - version "17.0.45" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" - integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== - -"@types/prismjs@^1.26.0": - version "1.26.4" - resolved "https://registry.yarnpkg.com/@types/prismjs/-/prismjs-1.26.4.tgz#1a9e1074619ce1d7322669e5b46fbe823925103a" - integrity sha512-rlAnzkW2sZOjbqZ743IHUhFcvzaGbqijwOu8QZnZCjfQzBqFE3s4lOTJEsxikImav9uzz/42I+O7YUs1mWgMlg== - -"@types/pug@^2.0.6": - version "2.0.10" - resolved "https://registry.yarnpkg.com/@types/pug/-/pug-2.0.10.tgz#52f8dbd6113517aef901db20b4f3fca543b88c1f" - integrity sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA== - -"@types/responselike@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.3.tgz#cc29706f0a397cfe6df89debfe4bf5cea159db50" - integrity sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw== - dependencies: - "@types/node" "*" - -"@types/semver@^7.3.12": - version "7.5.8" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" - integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== - -"@types/sizzle@*": - version "2.3.8" - resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.8.tgz#518609aefb797da19bf222feb199e8f653ff7627" - integrity sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg== - -"@types/three@^0.129.2": - version "0.129.2" - resolved "https://registry.yarnpkg.com/@types/three/-/three-0.129.2.tgz#26d9e4ecffc8e31becfb119c494123f343f31f8f" - integrity sha512-fZDNRtUFnq3baNjDiAzi4QoHYcczWtEdsduH/tpiwk91fbVk8COJiT/iLoN3tIOjLKMySoYsjUfP0VTmUfZKLw== - -"@types/tinycolor2@^1.4.6": - version "1.4.6" - resolved "https://registry.yarnpkg.com/@types/tinycolor2/-/tinycolor2-1.4.6.tgz#670cbc0caf4e58dd61d1e3a6f26386e473087f06" - integrity sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw== - -"@types/tough-cookie@*": - version "4.0.5" - resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz#cb6e2a691b70cb177c6e3ae9c1d2e8b2ea8cd304" - integrity sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA== - -"@types/trusted-types@*": - version "2.0.7" - resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" - integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== - -"@types/websocket@^1.0.10": - version "1.0.10" - resolved "https://registry.yarnpkg.com/@types/websocket/-/websocket-1.0.10.tgz#804b1a02780da522f5742bc184a6d16a2eb78c7c" - integrity sha512-svjGZvPB7EzuYS94cI7a+qhwgGU1y89wUgjT6E2wVUfmAGIvRfT7obBvRtnhXCSsoMdlG4gBFGE7MfkIXZLoww== - dependencies: - "@types/node" "*" - -"@types/yauzl@^2.9.1": - version "2.10.3" - resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999" - integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== - dependencies: - "@types/node" "*" - -"@typescript-eslint/eslint-plugin@8.45.0": - version "8.45.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.45.0.tgz#9f251d4e85ec5089e7cccb09257ce93dbf0d7744" - integrity sha512-HC3y9CVuevvWCl/oyZuI47dOeDF9ztdMEfMH8/DW/Mhwa9cCLnK1oD7JoTVGW/u7kFzNZUKUoyJEqkaJh5y3Wg== - dependencies: - "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "8.45.0" - "@typescript-eslint/type-utils" "8.45.0" - "@typescript-eslint/utils" "8.45.0" - "@typescript-eslint/visitor-keys" "8.45.0" - graphemer "^1.4.0" - ignore "^7.0.0" - natural-compare "^1.4.0" - ts-api-utils "^2.1.0" - -"@typescript-eslint/eslint-plugin@^5.54.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" - integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== - dependencies: - "@eslint-community/regexpp" "^4.4.0" - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/type-utils" "5.62.0" - "@typescript-eslint/utils" "5.62.0" - debug "^4.3.4" - graphemer "^1.4.0" - ignore "^5.2.0" - natural-compare-lite "^1.4.0" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/parser@8.45.0": - version "8.45.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.45.0.tgz#571660c98824aefb4a6ec3b3766655d1348520a4" - integrity sha512-TGf22kon8KW+DeKaUmOibKWktRY8b2NSAZNdtWh798COm1NWx8+xJ6iFBtk3IvLdv6+LGLJLRlyhrhEDZWargQ== - dependencies: - "@typescript-eslint/scope-manager" "8.45.0" - "@typescript-eslint/types" "8.45.0" - "@typescript-eslint/typescript-estree" "8.45.0" - "@typescript-eslint/visitor-keys" "8.45.0" - debug "^4.3.4" - -"@typescript-eslint/parser@^5.54.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" - integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== - dependencies: - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/typescript-estree" "5.62.0" - debug "^4.3.4" - -"@typescript-eslint/project-service@8.45.0": - version "8.45.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.45.0.tgz#f83dda1bca31dae2fd6821f9131daf1edebfd46c" - integrity sha512-3pcVHwMG/iA8afdGLMuTibGR7pDsn9RjDev6CCB+naRsSYs2pns5QbinF4Xqw6YC/Sj3lMrm/Im0eMfaa61WUg== - dependencies: - "@typescript-eslint/tsconfig-utils" "^8.45.0" - "@typescript-eslint/types" "^8.45.0" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" - integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== - dependencies: - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/visitor-keys" "5.62.0" - -"@typescript-eslint/scope-manager@8.45.0": - version "8.45.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.45.0.tgz#59615ba506a9e3479d1efb0d09d6ab52f2a19142" - integrity sha512-clmm8XSNj/1dGvJeO6VGH7EUSeA0FMs+5au/u3lrA3KfG8iJ4u8ym9/j2tTEoacAffdW1TVUzXO30W1JTJS7dA== - dependencies: - "@typescript-eslint/types" "8.45.0" - "@typescript-eslint/visitor-keys" "8.45.0" - -"@typescript-eslint/tsconfig-utils@8.45.0", "@typescript-eslint/tsconfig-utils@^8.45.0": - version "8.45.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.45.0.tgz#63d38282790a2566c571bad423e7c1cad1f3d64c" - integrity sha512-aFdr+c37sc+jqNMGhH+ajxPXwjv9UtFZk79k8pLoJ6p4y0snmYpPA52GuWHgt2ZF4gRRW6odsEj41uZLojDt5w== - -"@typescript-eslint/type-utils@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" - integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== - dependencies: - "@typescript-eslint/typescript-estree" "5.62.0" - "@typescript-eslint/utils" "5.62.0" - debug "^4.3.4" - tsutils "^3.21.0" - -"@typescript-eslint/type-utils@8.45.0": - version "8.45.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.45.0.tgz#04004bdf2598844faa29fb936fb6b0ee10d6d3f3" - integrity sha512-bpjepLlHceKgyMEPglAeULX1vixJDgaKocp0RVJ5u4wLJIMNuKtUXIczpJCPcn2waII0yuvks/5m5/h3ZQKs0A== - dependencies: - "@typescript-eslint/types" "8.45.0" - "@typescript-eslint/typescript-estree" "8.45.0" - "@typescript-eslint/utils" "8.45.0" - debug "^4.3.4" - ts-api-utils "^2.1.0" - -"@typescript-eslint/types@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" - integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== - -"@typescript-eslint/types@8.45.0", "@typescript-eslint/types@^8.45.0": - version "8.45.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.45.0.tgz#fc01cd2a4690b9713b02f895e82fb43f7d960684" - integrity sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA== - -"@typescript-eslint/typescript-estree@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" - integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== - dependencies: - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/visitor-keys" "5.62.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/typescript-estree@8.45.0": - version "8.45.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.45.0.tgz#3498500f109a89b104d2770497c707e56dfe062d" - integrity sha512-GfE1NfVbLam6XQ0LcERKwdTTPlLvHvXXhOeUGC1OXi4eQBoyy1iVsW+uzJ/J9jtCz6/7GCQ9MtrQ0fml/jWCnA== - dependencies: - "@typescript-eslint/project-service" "8.45.0" - "@typescript-eslint/tsconfig-utils" "8.45.0" - "@typescript-eslint/types" "8.45.0" - "@typescript-eslint/visitor-keys" "8.45.0" - debug "^4.3.4" - fast-glob "^3.3.2" - is-glob "^4.0.3" - minimatch "^9.0.4" - semver "^7.6.0" - ts-api-utils "^2.1.0" - -"@typescript-eslint/utils@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" - integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@types/json-schema" "^7.0.9" - "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/typescript-estree" "5.62.0" - eslint-scope "^5.1.1" - semver "^7.3.7" - -"@typescript-eslint/utils@8.45.0": - version "8.45.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.45.0.tgz#6e68e92d99019fdf56018d0e6664c76a70470c95" - integrity sha512-bxi1ht+tLYg4+XV2knz/F7RVhU0k6VrSMc9sb8DQ6fyCTrGQLHfo7lDtN0QJjZjKkLA2ThrKuCdHEvLReqtIGg== - dependencies: - "@eslint-community/eslint-utils" "^4.7.0" - "@typescript-eslint/scope-manager" "8.45.0" - "@typescript-eslint/types" "8.45.0" - "@typescript-eslint/typescript-estree" "8.45.0" - -"@typescript-eslint/visitor-keys@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" - integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== - dependencies: - "@typescript-eslint/types" "5.62.0" - eslint-visitor-keys "^3.3.0" - -"@typescript-eslint/visitor-keys@8.45.0": - version "8.45.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.45.0.tgz#4e3bcc55da64ac61069ebfe62ca240567ac7d784" - integrity sha512-qsaFBA3e09MIDAGFUrTk+dzqtfv1XPVz8t8d1f0ybTzrCY7BKiMC5cjrl1O/P7UmHsNyW90EYSkU/ZWpmXelag== - dependencies: - "@typescript-eslint/types" "8.45.0" - eslint-visitor-keys "^4.2.1" - -"@vitest/expect@3.2.4": - version "3.2.4" - resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-3.2.4.tgz#8362124cd811a5ee11c5768207b9df53d34f2433" - integrity sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig== - dependencies: - "@types/chai" "^5.2.2" - "@vitest/spy" "3.2.4" - "@vitest/utils" "3.2.4" - chai "^5.2.0" - tinyrainbow "^2.0.0" - -"@vitest/mocker@3.2.4": - version "3.2.4" - resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-3.2.4.tgz#4471c4efbd62db0d4fa203e65cc6b058a85cabd3" - integrity sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ== - dependencies: - "@vitest/spy" "3.2.4" - estree-walker "^3.0.3" - magic-string "^0.30.17" - -"@vitest/pretty-format@3.2.4", "@vitest/pretty-format@^3.2.4": - version "3.2.4" - resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-3.2.4.tgz#3c102f79e82b204a26c7a5921bf47d534919d3b4" - integrity sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA== - dependencies: - tinyrainbow "^2.0.0" - -"@vitest/runner@3.2.4": - version "3.2.4" - resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-3.2.4.tgz#5ce0274f24a971f6500f6fc166d53d8382430766" - integrity sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ== - dependencies: - "@vitest/utils" "3.2.4" - pathe "^2.0.3" - strip-literal "^3.0.0" - -"@vitest/snapshot@3.2.4": - version "3.2.4" - resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-3.2.4.tgz#40a8bc0346ac0aee923c0eefc2dc005d90bc987c" - integrity sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ== - dependencies: - "@vitest/pretty-format" "3.2.4" - magic-string "^0.30.17" - pathe "^2.0.3" - -"@vitest/spy@3.2.4": - version "3.2.4" - resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-3.2.4.tgz#cc18f26f40f3f028da6620046881f4e4518c2599" - integrity sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw== - dependencies: - tinyspy "^4.0.3" - -"@vitest/utils@3.2.4": - version "3.2.4" - resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-3.2.4.tgz#c0813bc42d99527fb8c5b138c7a88516bca46fea" - integrity sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA== - dependencies: - "@vitest/pretty-format" "3.2.4" - loupe "^3.1.4" - tinyrainbow "^2.0.0" - -"@vue/compiler-core@3.4.27": - version "3.4.27" - resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.4.27.tgz#e69060f4b61429fe57976aa5872cfa21389e4d91" - integrity sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg== - dependencies: - "@babel/parser" "^7.24.4" - "@vue/shared" "3.4.27" - entities "^4.5.0" - estree-walker "^2.0.2" - source-map-js "^1.2.0" - -"@vue/compiler-dom@3.4.27": - version "3.4.27" - resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.4.27.tgz#d51d35f40d00ce235d7afc6ad8b09dfd92b1cc1c" - integrity sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw== - dependencies: - "@vue/compiler-core" "3.4.27" - "@vue/shared" "3.4.27" - -"@vue/compiler-sfc@3.4.27": - version "3.4.27" - resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.4.27.tgz#399cac1b75c6737bf5440dc9cf3c385bb2959701" - integrity sha512-nDwntUEADssW8e0rrmE0+OrONwmRlegDA1pD6QhVeXxjIytV03yDqTey9SBDiALsvAd5U4ZrEKbMyVXhX6mCGA== - dependencies: - "@babel/parser" "^7.24.4" - "@vue/compiler-core" "3.4.27" - "@vue/compiler-dom" "3.4.27" - "@vue/compiler-ssr" "3.4.27" - "@vue/shared" "3.4.27" - estree-walker "^2.0.2" - magic-string "^0.30.10" - postcss "^8.4.38" - source-map-js "^1.2.0" - -"@vue/compiler-ssr@3.4.27": - version "3.4.27" - resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.4.27.tgz#2a8ecfef1cf448b09be633901a9c020360472e3d" - integrity sha512-CVRzSJIltzMG5FcidsW0jKNQnNRYC8bT21VegyMMtHmhW3UOI7knmUehzswXLrExDLE6lQCZdrhD4ogI7c+vuw== - dependencies: - "@vue/compiler-dom" "3.4.27" - "@vue/shared" "3.4.27" - -"@vue/reactivity@3.4.27": - version "3.4.27" - resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.4.27.tgz#6ece72331bf719953f5eaa95ec60b2b8d49e3791" - integrity sha512-kK0g4NknW6JX2yySLpsm2jlunZJl2/RJGZ0H9ddHdfBVHcNzxmQ0sS0b09ipmBoQpY8JM2KmUw+a6sO8Zo+zIA== - dependencies: - "@vue/shared" "3.4.27" - -"@vue/runtime-core@3.4.27": - version "3.4.27" - resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.4.27.tgz#1b6e1d71e4604ba7442dd25ed22e4a1fc6adbbda" - integrity sha512-7aYA9GEbOOdviqVvcuweTLe5Za4qBZkUY7SvET6vE8kyypxVgaT1ixHLg4urtOlrApdgcdgHoTZCUuTGap/5WA== - dependencies: - "@vue/reactivity" "3.4.27" - "@vue/shared" "3.4.27" - -"@vue/runtime-dom@3.4.27": - version "3.4.27" - resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.4.27.tgz#fe8d1ce9bbe8921d5dd0ad5c10df0e04ef7a5ee7" - integrity sha512-ScOmP70/3NPM+TW9hvVAz6VWWtZJqkbdf7w6ySsws+EsqtHvkhxaWLecrTorFxsawelM5Ys9FnDEMt6BPBDS0Q== - dependencies: - "@vue/runtime-core" "3.4.27" - "@vue/shared" "3.4.27" - csstype "^3.1.3" - -"@vue/server-renderer@3.4.27": - version "3.4.27" - resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.4.27.tgz#3306176f37e648ba665f97dda3ce705687be63d2" - integrity sha512-dlAMEuvmeA3rJsOMJ2J1kXU7o7pOxgsNHVr9K8hB3ImIkSuBrIdy0vF66h8gf8Tuinf1TK3mPAz2+2sqyf3KzA== - dependencies: - "@vue/compiler-ssr" "3.4.27" - "@vue/shared" "3.4.27" - -"@vue/shared@3.4.27": - version "3.4.27" - resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.4.27.tgz#f05e3cd107d157354bb4ae7a7b5fc9cf73c63b50" - integrity sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA== - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn@^8.10.0: - version "8.14.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.1.tgz#721d5dc10f7d5b5609a891773d47731796935dfb" - integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg== - -acorn@^8.15.0: - version "8.15.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" - integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== - -acorn@^8.9.0: - version "8.11.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" - integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== - -ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.2.2" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz#60216eea464d864597ce2832000738a0589650c1" - integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^6.1.0: - version "6.2.3" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041" - integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== - -archive-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/archive-type/-/archive-type-4.0.0.tgz#f92e72233056dfc6969472749c267bdb046b1d70" - integrity sha512-zV4Ky0v1F8dBrdYElwTvQhweQ0P7Kwc1aluqJsYtOBP01jXcWCyW2IEfI1YiqsG+Iy7ZR+o5LF1N+PGECBxHWA== - dependencies: - file-type "^4.2.0" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -aria-query@^5.3.0: - version "5.3.2" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.2.tgz#93f81a43480e33a338f19163a3d10a50c01dcd59" - integrity sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw== - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -assertion-error@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" - integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -axobject-query@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-4.1.0.tgz#28768c76d0e3cff21bc62a9e2d0b6ac30042a1ee" - integrity sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -before-after-hook@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-4.0.0.tgz#cf1447ab9160df6a40f3621da64d6ffc36050cb9" - integrity sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ== - -bl@^1.0.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.3.tgz#1e8dd80142eac80d7158c9dccc047fb620e035e7" - integrity sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww== - dependencies: - readable-stream "^2.3.5" - safe-buffer "^5.1.1" - -"blockbench-types@https://github.com/SnaveSutit/blockbench-types.git": - version "4.10.0" - resolved "https://github.com/SnaveSutit/blockbench-types.git#364526ee701a41ef147ee5f1d6c9b9003e8135ef" - dependencies: - "@babel/types" "^7.20.7" - "@types/dompurify" "^3.0.5" - "@types/jquery" "^3.5.4" - "@types/prismjs" "^1.26.0" - "@types/three" "^0.129.2" - "@types/tinycolor2" "^1.4.6" - dompurify "^3.0.1" - electron "^30.0.2" - prismjs "^1.29.0" - tinycolor2 "^1.6.0" - typescript "^4.9.5" - vue "^3.2.45" - wintersky "^1.3.0" - -boolean@^3.0.1: - version "3.2.0" - resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b" - integrity sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw== - -bottleneck@^2.15.3: - version "2.19.5" - resolved "https://registry.yarnpkg.com/bottleneck/-/bottleneck-2.19.5.tgz#5df0b90f59fd47656ebe63c78a98419205cadd91" - integrity sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7" - integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== - dependencies: - balanced-match "^1.0.0" - -brace@^0.11.1: - version "0.11.1" - resolved "https://registry.yarnpkg.com/brace/-/brace-0.11.1.tgz#4896fcc9d544eef45f4bb7660db320d3b379fe58" - integrity sha512-Fc8Ne62jJlKHiG/ajlonC4Sd66Pq68fFwK4ihJGNZpGqboc324SQk+lRvMzpPRuJOmfrJefdG8/7JdWX4bzJ2Q== - -braces@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -braces@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -buffer-alloc-unsafe@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" - integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== - -buffer-alloc@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" - integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== - dependencies: - buffer-alloc-unsafe "^1.1.0" - buffer-fill "^1.0.0" - -buffer-crc32@^0.2.5, buffer-crc32@~0.2.3: - version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== - -buffer-fill@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" - integrity sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ== - -buffer@^5.2.1: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -cac@^6.7.14: - version "6.7.14" - resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" - integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== - -cacheable-lookup@^5.0.3: - version "5.0.4" - resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" - integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== - -cacheable-request@^2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d" - integrity sha512-vag0O2LKZ/najSoUwDbVlnlCFvhBE/7mGTY2B5FgCBDcRD+oVV1HYTOwM6JZfMg/hIcM6IwnTZ1uQQL5/X3xIQ== - dependencies: - clone-response "1.0.2" - get-stream "3.0.0" - http-cache-semantics "3.8.1" - keyv "3.0.0" - lowercase-keys "1.0.0" - normalize-url "2.0.1" - responselike "1.0.2" - -cacheable-request@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.4.tgz#7a33ebf08613178b403635be7b899d3e69bbe817" - integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^4.0.0" - lowercase-keys "^2.0.0" - normalize-url "^6.0.1" - responselike "^2.0.0" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -chai@^5.2.0: - version "5.3.3" - resolved "https://registry.yarnpkg.com/chai/-/chai-5.3.3.tgz#dd3da955e270916a4bd3f625f4b919996ada7e06" - integrity sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw== - dependencies: - assertion-error "^2.0.1" - check-error "^2.1.1" - deep-eql "^5.0.1" - loupe "^3.1.0" - pathval "^2.0.0" - -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -charenc@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" - integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== - -check-error@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.1.tgz#87eb876ae71ee388fa0471fe423f494be1d96ccc" - integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -clone-response@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" - integrity sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q== - dependencies: - mimic-response "^1.0.0" - -clone-response@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" - integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== - dependencies: - mimic-response "^1.0.0" - -code-red@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/code-red/-/code-red-1.0.4.tgz#59ba5c9d1d320a4ef795bc10a28bd42bfebe3e35" - integrity sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw== - dependencies: - "@jridgewell/sourcemap-codec" "^1.4.15" - "@types/estree" "^1.0.1" - acorn "^8.10.0" - estree-walker "^3.0.3" - periscopic "^3.1.0" - -codejar@^3.5.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/codejar/-/codejar-3.7.0.tgz#135913e26957c0a0c6a3a99305cfe8492c7b5c2b" - integrity sha512-rqyDu2zNwfu1EhXI++LEMQDzhykS+V0BV52RemtCj5lczgTgWSufyEa+tS7RP7qCXH/WXOkU0eIthmFUzvG78Q== - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -colord@^2.9.3: - version "2.9.3" - resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" - integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== - -combined-stream@^1.0.6: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@^2.8.1: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -console-clear@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/console-clear/-/console-clear-1.1.1.tgz#995e20cbfbf14dd792b672cde387bd128d674bf7" - integrity sha512-pMD+MVR538ipqkG5JXeOEbKWS5um1H4LUUccUQG68qpeqBYbzYy79Gh55jkd2TtPdRfUaLWdv6LPP//5Zt0aPQ== - -content-disposition@^0.5.2: - version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cross-spawn@^7.0.6: - version "7.0.6" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" - integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -crypt@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" - integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== - -css-tree@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.3.1.tgz#10264ce1e5442e8572fc82fbe490644ff54b5c20" - integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw== - dependencies: - mdn-data "2.0.30" - source-map-js "^1.0.1" - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -csstype@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" - integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== - -debug@^4.1.0, debug@^4.1.1, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^4.3.1, debug@^4.3.2, debug@^4.4.1: - version "4.4.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" - integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== - dependencies: - ms "^2.1.3" - -decode-uri-component@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" - integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== - -decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== - dependencies: - mimic-response "^1.0.0" - -decompress-response@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" - integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== - dependencies: - mimic-response "^3.1.0" - -decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1" - integrity sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ== - dependencies: - file-type "^5.2.0" - is-stream "^1.1.0" - tar-stream "^1.5.2" - -decompress-tarbz2@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz#3082a5b880ea4043816349f378b56c516be1a39b" - integrity sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A== - dependencies: - decompress-tar "^4.1.0" - file-type "^6.1.0" - is-stream "^1.1.0" - seek-bzip "^1.0.5" - unbzip2-stream "^1.0.9" - -decompress-targz@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-4.1.1.tgz#c09bc35c4d11f3de09f2d2da53e9de23e7ce1eee" - integrity sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w== - dependencies: - decompress-tar "^4.1.1" - file-type "^5.2.0" - is-stream "^1.1.0" - -decompress-unzip@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69" - integrity sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw== - dependencies: - file-type "^3.8.0" - get-stream "^2.2.0" - pify "^2.3.0" - yauzl "^2.4.2" - -decompress@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.1.tgz#007f55cc6a62c055afa37c07eb6a4ee1b773f118" - integrity sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ== - dependencies: - decompress-tar "^4.0.0" - decompress-tarbz2 "^4.0.0" - decompress-targz "^4.0.0" - decompress-unzip "^4.0.1" - graceful-fs "^4.1.10" - make-dir "^1.0.0" - pify "^2.3.0" - strip-dirs "^2.0.0" - -deep-eql@^5.0.1: - version "5.0.2" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" - integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -deepslate@^0.19.2: - version "0.19.2" - resolved "https://registry.yarnpkg.com/deepslate/-/deepslate-0.19.2.tgz#858c44d0bbde0e172d9144bcb7b21b57f4224b3a" - integrity sha512-sDOjpBXv5WBMmtsquJGNhOoZJKm4ra7pzzQP7FjNJHbZwoL+qlzrsfId4OU3C9WtfC6e0+2mcH+kd3KL5mjrSg== - dependencies: - gl-matrix "^3.3.0" - md5 "^2.3.0" - pako "^2.0.3" - -defer-to-connect@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" - integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== - -define-data-property@^1.0.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -detect-indent@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" - integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== - -detect-node@^2.0.4: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" - integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -dompurify@^3.0.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.1.3.tgz#cfe3ce4232c216d923832f68f2aa18b2fb9bd223" - integrity sha512-5sOWYSNPaxz6o2MUPvtyxTTqR4D3L77pr5rUQoWgD5ROQtVIZQgJkXbo1DLlK3vj11YGw5+LnF4SYti4gZmwng== - -download@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/download/-/download-8.0.0.tgz#afc0b309730811731aae9f5371c9f46be73e51b1" - integrity sha512-ASRY5QhDk7FK+XrQtQyvhpDKanLluEEQtWl/J7Lxuf/b+i8RYh997QeXvL85xitrmRKVlx9c7eTrcRdq2GS4eA== - dependencies: - archive-type "^4.0.0" - content-disposition "^0.5.2" - decompress "^4.2.1" - ext-name "^5.0.0" - file-type "^11.1.0" - filenamify "^3.0.0" - get-stream "^4.1.0" - got "^8.3.1" - make-dir "^2.1.0" - p-event "^2.1.0" - pify "^4.0.1" - -duplexer3@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" - integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -electron@^30.0.2: - version "30.0.6" - resolved "https://registry.yarnpkg.com/electron/-/electron-30.0.6.tgz#9ddea5f68396ecca88ad7c2c466a30fc9c16144b" - integrity sha512-PkhEPFdpYcTzjAO3gMHZ+map7g2+xCrMDedo/L1i0ir2BRXvAB93IkTJX497U6Srb/09r2cFt+k20VPNVCdw3Q== - dependencies: - "@electron/get" "^2.0.0" - "@types/node" "^20.9.0" - extract-zip "^2.0.1" - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -end-of-stream@^1.0.0, end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -entities@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" - integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== - -env-paths@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" - integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== - -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" - -es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-module-lexer@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.7.0.tgz#9159601561880a85f2734560a9099b2c31e5372a" - integrity sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA== - -es6-error@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" - integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== - -es6-promise@^3.1.2: - version "3.3.1" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" - integrity sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg== - -esbuild-plugin-import-glob@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/esbuild-plugin-import-glob/-/esbuild-plugin-import-glob-0.1.1.tgz#6ab5ad992aa67ba9b1aa80c0759d5617960cd5c3" - integrity sha512-yAFH+9AoIcsQkODSx0KUPRv1FeJUN6Tef8vkPQMcuVkc2vXYneYKsHhOiFS/yIsg5bQ70HHtAlXVA1uTjgoJXg== - dependencies: - fast-glob "^3.2.5" - -esbuild-plugin-inline-image@^0.0.9: - version "0.0.9" - resolved "https://registry.yarnpkg.com/esbuild-plugin-inline-image/-/esbuild-plugin-inline-image-0.0.9.tgz#b645ddd258c013e9f7c96fddf4e06e66f44618ae" - integrity sha512-pw3ZgN2phh32Z7BpKrhRDtmI+iVCl+Gc0BLOT9croXg1MnMjRuN7aXhIQirhLeK39erkIwfFlhy6xieroBGc1Q== - -esbuild-plugin-inline-worker@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/esbuild-plugin-inline-worker/-/esbuild-plugin-inline-worker-0.1.1.tgz#f21a610ad7410972a408272e0d254654381eac58" - integrity sha512-VmFqsQKxUlbM51C1y5bRiMeyc1x2yTdMXhKB6S//++g9aCBg8TfGsbKxl5ZDkCGquqLY+RmEk93TBNd0i35dPA== - dependencies: - esbuild latest - find-cache-dir "^3.3.1" - -esbuild-plugin-svelte@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/esbuild-plugin-svelte/-/esbuild-plugin-svelte-0.1.1.tgz#5f2765d250de3074c6994b9cf9233bfb884801d0" - integrity sha512-/52fCH5sbztdFI7lsp+jyiiI7HuXlOW+ebXmiwAlwYYCXJ4gbBtVOHP2c2bG0cgb65fGCa2HL0I0gInQy19jtw== - -esbuild@^0.17.10: - version "0.17.19" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.17.19.tgz#087a727e98299f0462a3d0bcdd9cd7ff100bd955" - integrity sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw== - optionalDependencies: - "@esbuild/android-arm" "0.17.19" - "@esbuild/android-arm64" "0.17.19" - "@esbuild/android-x64" "0.17.19" - "@esbuild/darwin-arm64" "0.17.19" - "@esbuild/darwin-x64" "0.17.19" - "@esbuild/freebsd-arm64" "0.17.19" - "@esbuild/freebsd-x64" "0.17.19" - "@esbuild/linux-arm" "0.17.19" - "@esbuild/linux-arm64" "0.17.19" - "@esbuild/linux-ia32" "0.17.19" - "@esbuild/linux-loong64" "0.17.19" - "@esbuild/linux-mips64el" "0.17.19" - "@esbuild/linux-ppc64" "0.17.19" - "@esbuild/linux-riscv64" "0.17.19" - "@esbuild/linux-s390x" "0.17.19" - "@esbuild/linux-x64" "0.17.19" - "@esbuild/netbsd-x64" "0.17.19" - "@esbuild/openbsd-x64" "0.17.19" - "@esbuild/sunos-x64" "0.17.19" - "@esbuild/win32-arm64" "0.17.19" - "@esbuild/win32-ia32" "0.17.19" - "@esbuild/win32-x64" "0.17.19" - -esbuild@^0.25.0: - version "0.25.10" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.10.tgz#37f5aa5cd14500f141be121c01b096ca83ac34a9" - integrity sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ== - optionalDependencies: - "@esbuild/aix-ppc64" "0.25.10" - "@esbuild/android-arm" "0.25.10" - "@esbuild/android-arm64" "0.25.10" - "@esbuild/android-x64" "0.25.10" - "@esbuild/darwin-arm64" "0.25.10" - "@esbuild/darwin-x64" "0.25.10" - "@esbuild/freebsd-arm64" "0.25.10" - "@esbuild/freebsd-x64" "0.25.10" - "@esbuild/linux-arm" "0.25.10" - "@esbuild/linux-arm64" "0.25.10" - "@esbuild/linux-ia32" "0.25.10" - "@esbuild/linux-loong64" "0.25.10" - "@esbuild/linux-mips64el" "0.25.10" - "@esbuild/linux-ppc64" "0.25.10" - "@esbuild/linux-riscv64" "0.25.10" - "@esbuild/linux-s390x" "0.25.10" - "@esbuild/linux-x64" "0.25.10" - "@esbuild/netbsd-arm64" "0.25.10" - "@esbuild/netbsd-x64" "0.25.10" - "@esbuild/openbsd-arm64" "0.25.10" - "@esbuild/openbsd-x64" "0.25.10" - "@esbuild/openharmony-arm64" "0.25.10" - "@esbuild/sunos-x64" "0.25.10" - "@esbuild/win32-arm64" "0.25.10" - "@esbuild/win32-ia32" "0.25.10" - "@esbuild/win32-x64" "0.25.10" - -esbuild@latest: - version "0.21.3" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.3.tgz#cbb10b100c768b0cfb35d61d9e70324553437c38" - integrity sha512-Kgq0/ZsAPzKrbOjCQcjoSmPoWhlcVnGAUo7jvaLHoxW1Drto0KGkR1xBNg2Cp43b9ImvxmPEJZ9xkfcnqPsfBw== - optionalDependencies: - "@esbuild/aix-ppc64" "0.21.3" - "@esbuild/android-arm" "0.21.3" - "@esbuild/android-arm64" "0.21.3" - "@esbuild/android-x64" "0.21.3" - "@esbuild/darwin-arm64" "0.21.3" - "@esbuild/darwin-x64" "0.21.3" - "@esbuild/freebsd-arm64" "0.21.3" - "@esbuild/freebsd-x64" "0.21.3" - "@esbuild/linux-arm" "0.21.3" - "@esbuild/linux-arm64" "0.21.3" - "@esbuild/linux-ia32" "0.21.3" - "@esbuild/linux-loong64" "0.21.3" - "@esbuild/linux-mips64el" "0.21.3" - "@esbuild/linux-ppc64" "0.21.3" - "@esbuild/linux-riscv64" "0.21.3" - "@esbuild/linux-s390x" "0.21.3" - "@esbuild/linux-x64" "0.21.3" - "@esbuild/netbsd-x64" "0.21.3" - "@esbuild/openbsd-x64" "0.21.3" - "@esbuild/sunos-x64" "0.21.3" - "@esbuild/win32-arm64" "0.21.3" - "@esbuild/win32-ia32" "0.21.3" - "@esbuild/win32-x64" "0.21.3" - -escalade@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" - integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== - -escape-string-regexp@^1.0.2: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-plugin-svelte@^3.12.4: - version "3.12.4" - resolved "https://registry.yarnpkg.com/eslint-plugin-svelte/-/eslint-plugin-svelte-3.12.4.tgz#a6b540b4d5e9045303e3d38eb5f4171472dae828" - integrity sha512-hD7wPe+vrPgx3U2X2b/wyTMtWobm660PygMGKrWWYTc9lvtY8DpNFDaU2CJQn1szLjGbn/aJ3g8WiXuKakrEkw== - dependencies: - "@eslint-community/eslint-utils" "^4.6.1" - "@jridgewell/sourcemap-codec" "^1.5.0" - esutils "^2.0.3" - globals "^16.0.0" - known-css-properties "^0.37.0" - postcss "^8.4.49" - postcss-load-config "^3.1.4" - postcss-safe-parser "^7.0.0" - semver "^7.6.3" - svelte-eslint-parser "^1.3.0" - -eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-scope@^8.2.0, eslint-scope@^8.4.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.4.0.tgz#88e646a207fad61436ffa39eb505147200655c82" - integrity sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint-visitor-keys@^4.0.0, eslint-visitor-keys@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1" - integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== - -eslint@^9.37.0: - version "9.37.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.37.0.tgz#ac0222127f76b09c0db63036f4fe289562072d74" - integrity sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig== - dependencies: - "@eslint-community/eslint-utils" "^4.8.0" - "@eslint-community/regexpp" "^4.12.1" - "@eslint/config-array" "^0.21.0" - "@eslint/config-helpers" "^0.4.0" - "@eslint/core" "^0.16.0" - "@eslint/eslintrc" "^3.3.1" - "@eslint/js" "9.37.0" - "@eslint/plugin-kit" "^0.4.0" - "@humanfs/node" "^0.16.6" - "@humanwhocodes/module-importer" "^1.0.1" - "@humanwhocodes/retry" "^0.4.2" - "@types/estree" "^1.0.6" - "@types/json-schema" "^7.0.15" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.6" - debug "^4.3.2" - escape-string-regexp "^4.0.0" - eslint-scope "^8.4.0" - eslint-visitor-keys "^4.2.1" - espree "^10.4.0" - esquery "^1.5.0" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^8.0.0" - find-up "^5.0.0" - glob-parent "^6.0.2" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - json-stable-stringify-without-jsonify "^1.0.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - -espree@^10.0.0, espree@^10.0.1, espree@^10.4.0: - version "10.4.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-10.4.0.tgz#d54f4949d4629005a1fa168d937c3ff1f7e2a837" - integrity sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ== - dependencies: - acorn "^8.15.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^4.2.1" - -esquery@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" - integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -estree-walker@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" - integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== - -estree-walker@^3.0.0, estree-walker@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" - integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== - dependencies: - "@types/estree" "^1.0.0" - -esutils@^2.0.2, esutils@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -expect-type@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.2.2.tgz#c030a329fb61184126c8447585bc75a7ec6fbff3" - integrity sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA== - -ext-list@^2.0.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/ext-list/-/ext-list-2.2.2.tgz#0b98e64ed82f5acf0f2931babf69212ef52ddd37" - integrity sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA== - dependencies: - mime-db "^1.28.0" - -ext-name@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ext-name/-/ext-name-5.0.0.tgz#70781981d183ee15d13993c8822045c506c8f0a6" - integrity sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ== - dependencies: - ext-list "^2.0.0" - sort-keys-length "^1.0.0" - -extract-zip@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" - integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== - dependencies: - debug "^4.1.1" - get-stream "^5.1.0" - yauzl "^2.10.0" - optionalDependencies: - "@types/yauzl" "^2.9.1" - -fast-content-type-parse@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz#5590b6c807cc598be125e6740a9fde589d2b7afb" - integrity sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.2.5, fast-glob@^3.2.9: - version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-glob@^3.3.2: - version "3.3.3" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" - integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.8" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fastq@^1.6.0: - version "1.17.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" - integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== - dependencies: - reusify "^1.0.4" - -faye-websocket@0.11.4: - version "0.11.4" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" - integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== - dependencies: - websocket-driver ">=0.5.1" - -fd-slicer@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" - integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== - dependencies: - pend "~1.2.0" - -fdir@^6.5.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" - integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== - -fflate@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.8.2.tgz#fc8631f5347812ad6028bbe4a2308b2792aa1dea" - integrity sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A== - -file-entry-cache@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" - integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== - dependencies: - flat-cache "^4.0.0" - -file-type@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-11.1.0.tgz#93780f3fed98b599755d846b99a1617a2ad063b8" - integrity sha512-rM0UO7Qm9K7TWTtA6AShI/t7H5BPjDeGVDaNyg9BjHAj3PysKy7+8C8D137R88jnR3rFJZQB/tFgydl5sN5m7g== - -file-type@^3.8.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" - integrity sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA== - -file-type@^4.2.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-4.4.0.tgz#1b600e5fca1fbdc6e80c0a70c71c8dba5f7906c5" - integrity sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ== - -file-type@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6" - integrity sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ== - -file-type@^6.1.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919" - integrity sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg== - -filename-reserved-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229" - integrity sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ== - -filenamify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-3.0.0.tgz#9603eb688179f8c5d40d828626dcbb92c3a4672c" - integrity sha512-5EFZ//MsvJgXjBAFJ+Bh2YaCTRF/VP1YOmGrgt+KJ4SFRLjI87EIdwLLuT6wQX0I4F9W41xutobzczjsOKlI/g== - dependencies: - filename-reserved-regex "^2.0.0" - strip-outer "^1.0.0" - trim-repeated "^1.0.0" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -find-cache-dir@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-up@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -firebase@^9.19.0: - version "9.23.0" - resolved "https://registry.yarnpkg.com/firebase/-/firebase-9.23.0.tgz#71fea60d704bfed8e92162911544fd6564a04d0e" - integrity sha512-/4lUVY0lUvBDIaeY1q6dUYhS8Sd18Qb9CgWkPZICUo9IXpJNCEagfNZXBBFCkMTTN5L5gx2Hjr27y21a9NzUcA== - dependencies: - "@firebase/analytics" "0.10.0" - "@firebase/analytics-compat" "0.2.6" - "@firebase/app" "0.9.13" - "@firebase/app-check" "0.8.0" - "@firebase/app-check-compat" "0.3.7" - "@firebase/app-compat" "0.2.13" - "@firebase/app-types" "0.9.0" - "@firebase/auth" "0.23.2" - "@firebase/auth-compat" "0.4.2" - "@firebase/database" "0.14.4" - "@firebase/database-compat" "0.3.4" - "@firebase/firestore" "3.13.0" - "@firebase/firestore-compat" "0.3.12" - "@firebase/functions" "0.10.0" - "@firebase/functions-compat" "0.3.5" - "@firebase/installations" "0.6.4" - "@firebase/installations-compat" "0.2.4" - "@firebase/messaging" "0.12.4" - "@firebase/messaging-compat" "0.2.4" - "@firebase/performance" "0.6.4" - "@firebase/performance-compat" "0.2.4" - "@firebase/remote-config" "0.4.4" - "@firebase/remote-config-compat" "0.2.4" - "@firebase/storage" "0.11.2" - "@firebase/storage-compat" "0.3.2" - "@firebase/util" "1.9.3" - -flat-cache@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" - integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== - dependencies: - flatted "^3.2.9" - keyv "^4.5.4" - -flatted@^3.2.9: - version "3.3.3" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" - integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== - -foreground-child@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" - integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== - dependencies: - cross-spawn "^7.0.6" - signal-exit "^4.0.1" - -form-data@^2.5.0: - version "2.5.2" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.2.tgz#dc653743d1de2fcc340ceea38079daf6e9069fd2" - integrity sha512-GgwY0PS7DbXqajuGf4OYlsrIu3zgxD6Vvql43IBhm6MahqA5SK/7mwhtNj2AdH2z35YR34ujJ7BN+3fFC3jP5Q== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - safe-buffer "^5.2.1" - -from2@^2.1.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g== - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@~2.3.2, fsevents@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -generic-stream@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/generic-stream/-/generic-stream-1.2.6.tgz#4af618e1fd3c3e46d2a7e513d23592c72d1b2ea3" - integrity sha512-HVdPtxina7pshOCmTkFqzu8p/XCx5/6J6jMQPRdoDKnWEvkQzROEZa7n202NLt431lJ8+dTYMCFjB6DiPpCYsQ== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -get-port@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" - integrity sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg== - -get-stream@3.0.0, get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ== - -get-stream@^2.2.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de" - integrity sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA== - dependencies: - object-assign "^4.0.1" - pinkie-promise "^2.0.0" - -get-stream@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - -github-slugger@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-2.0.0.tgz#52cf2f9279a21eb6c59dd385b410f0c0adda8f1a" - integrity sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw== - -gl-matrix@^3.3.0: - version "3.4.3" - resolved "https://registry.yarnpkg.com/gl-matrix/-/gl-matrix-3.4.3.tgz#fc1191e8320009fd4d20e9339595c6041ddc22c9" - integrity sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA== - -glob-parent@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@^11.0.1: - version "11.0.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-11.0.3.tgz#9d8087e6d72ddb3c4707b1d2778f80ea3eaefcd6" - integrity sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA== - dependencies: - foreground-child "^3.3.1" - jackspeak "^4.1.1" - minimatch "^10.0.3" - minipass "^7.1.2" - package-json-from-dist "^1.0.0" - path-scurry "^2.0.0" - -glob@^7.1.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-agent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6" - integrity sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q== - dependencies: - boolean "^3.0.1" - es6-error "^4.1.1" - matcher "^3.0.0" - roarr "^2.15.3" - semver "^7.3.2" - serialize-error "^7.0.1" - -globals@^14.0.0: - version "14.0.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" - integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== - -globals@^16.0.0: - version "16.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-16.4.0.tgz#574bc7e72993d40cf27cf6c241f324ee77808e51" - integrity sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw== - -globalthis@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" - integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== - dependencies: - define-properties "^1.2.1" - gopd "^1.0.1" - -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -got@^11.8.5: - version "11.8.6" - resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" - integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== - dependencies: - "@sindresorhus/is" "^4.0.0" - "@szmarczak/http-timer" "^4.0.5" - "@types/cacheable-request" "^6.0.1" - "@types/responselike" "^1.0.0" - cacheable-lookup "^5.0.3" - cacheable-request "^7.0.2" - decompress-response "^6.0.0" - http2-wrapper "^1.0.0-beta.5.2" - lowercase-keys "^2.0.0" - p-cancelable "^2.0.0" - responselike "^2.0.0" - -got@^8.3.1: - version "8.3.2" - resolved "https://registry.yarnpkg.com/got/-/got-8.3.2.tgz#1d23f64390e97f776cac52e5b936e5f514d2e937" - integrity sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw== - dependencies: - "@sindresorhus/is" "^0.7.0" - cacheable-request "^2.1.1" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - into-stream "^3.1.0" - is-retry-allowed "^1.1.0" - isurl "^1.0.0-alpha5" - lowercase-keys "^1.0.0" - mimic-response "^1.0.0" - p-cancelable "^0.4.0" - p-timeout "^2.0.1" - pify "^3.0.0" - safe-buffer "^5.1.1" - timed-out "^4.0.1" - url-parse-lax "^3.0.0" - url-to-options "^1.0.1" - -graceful-fs@^4.1.10, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.2.0: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== - -has-symbol-support-x@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" - integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== - -has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-to-string-tag-x@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" - integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw== - dependencies: - has-symbol-support-x "^1.4.1" - -hasown@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -http-cache-semantics@3.8.1: - version "3.8.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" - integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== - -http-cache-semantics@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" - integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== - -http-parser-js@>=0.5.1: - version "0.5.8" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" - integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== - -http2-wrapper@^1.0.0-beta.5.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" - integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== - dependencies: - quick-lru "^5.1.1" - resolve-alpn "^1.0.0" - -idb@7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/idb/-/idb-7.0.1.tgz#d2875b3a2f205d854ee307f6d196f246fea590a7" - integrity sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg== - -idb@7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/idb/-/idb-7.1.1.tgz#d910ded866d32c7ced9befc5bfdf36f572ced72b" - integrity sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ== - -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore@^5.2.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== - -ignore@^7.0.0: - version "7.0.5" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.5.tgz#4cb5f6cd7d4c7ab0365738c7aea888baa6d7efd9" - integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== - -import-fresh@^3.2.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" - integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.1, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -into-stream@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6" - integrity sha512-TcdjPibTksa1NQximqep2r17ISRiNE9fwlfbg3F8ANdvP5/yrFTew86VcO//jk4QTaMlbjypPBq76HN2zaKfZQ== - dependencies: - from2 "^2.1.1" - p-is-promise "^1.1.0" - -is-buffer@~1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-natural-number@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8" - integrity sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ== - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf" - integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== - -is-plain-obj@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== - -is-reference@^3.0.0, is-reference@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-3.0.3.tgz#9ef7bf9029c70a67b2152da4adf57c23d718910f" - integrity sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw== - dependencies: - "@types/estree" "^1.0.6" - -is-retry-allowed@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" - integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== - -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isurl@^1.0.0-alpha5: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" - integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== - dependencies: - has-to-string-tag-x "^1.2.0" - is-object "^1.0.1" - -jackspeak@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-4.1.1.tgz#96876030f450502047fc7e8c7fcf8ce8124e43ae" - integrity sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ== - dependencies: - "@isaacs/cliui" "^8.0.2" - -jiti@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-2.6.1.tgz#178ef2fc9a1a594248c20627cd820187a4d78d92" - integrity sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ== - -js-tokens@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-9.0.1.tgz#2ec43964658435296f6761b34e10671c2d9527f4" - integrity sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ== - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -json-buffer@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json-stringify-safe@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== - optionalDependencies: - graceful-fs "^4.1.6" - -keyv@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373" - integrity sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA== - dependencies: - json-buffer "3.0.0" - -keyv@^4.0.0, keyv@^4.5.4: - version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -kleur@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -known-css-properties@^0.37.0: - version "0.37.0" - resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.37.0.tgz#10ebe49b9dbb6638860ff8a002fb65a053f4aec5" - integrity sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ== - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -lilconfig@^2.0.5: - version "2.1.0" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" - integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== - -local-access@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/local-access/-/local-access-1.1.0.tgz#e007c76ba2ca83d5877ba1a125fc8dfe23ba4798" - integrity sha512-XfegD5pyTAfb+GY6chk283Ox5z8WexG56OvM06RWLpAc/UHozO8X6xAxEkIitZOtsSMM1Yr3DkHgW5W+onLhCw== - -locate-character@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-character/-/locate-character-3.0.0.tgz#0305c5b8744f61028ef5d01f444009e00779f974" - integrity sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA== - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -long@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" - integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== - -long@^5.0.0: - version "5.2.3" - resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" - integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== - -loupe@^3.1.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.1.2.tgz#c86e0696804a02218f2206124c45d8b15291a240" - integrity sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg== - -loupe@^3.1.4: - version "3.2.1" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.2.1.tgz#0095cf56dc5b7a9a7c08ff5b1a8796ec8ad17e76" - integrity sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ== - -lowercase-keys@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" - integrity sha512-RPlX0+PHuvxVDZ7xX+EBVAp4RsVxP/TdDSN2mJYdiq1Lc4Hz7EUSjUI7RZrKKlmrIzVhf6Jo2stj7++gVarS0A== - -lowercase-keys@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== - -lowercase-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" - integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== - -lru-cache@^11.0.0: - version "11.2.2" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.2.2.tgz#40fd37edffcfae4b2940379c0722dc6eeaa75f24" - integrity sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg== - -magic-string@^0.30.10, magic-string@^0.30.5: - version "0.30.10" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.10.tgz#123d9c41a0cb5640c892b041d4cfb3bd0aa4b39e" - integrity sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ== - dependencies: - "@jridgewell/sourcemap-codec" "^1.4.15" - -magic-string@^0.30.17: - version "0.30.19" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.19.tgz#cebe9f104e565602e5d2098c5f2e79a77cc86da9" - integrity sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw== - dependencies: - "@jridgewell/sourcemap-codec" "^1.5.5" - -magic-string@^0.30.4: - version "0.30.17" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453" - integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== - dependencies: - "@jridgewell/sourcemap-codec" "^1.5.0" - -make-dir@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" - integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== - dependencies: - pify "^3.0.0" - -make-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== - dependencies: - pify "^4.0.1" - semver "^5.6.0" - -make-dir@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -marked-gfm-heading-id@^3.0.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/marked-gfm-heading-id/-/marked-gfm-heading-id-3.1.3.tgz#7bcfea85901843baf214b96ccc4ff67581c972a9" - integrity sha512-A0cRU4PCueX/5m8VE4mT8uTQ36l3xMYRojz3Eqnk4BmUFZ0T+9Xhn2KvHcANP4qbhfOeuMrWJCTQbASIBR5xeg== - dependencies: - github-slugger "^2.0.0" - -marked@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3" - integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== - -matcher@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca" - integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng== - dependencies: - escape-string-regexp "^4.0.0" - -mc-build@^3.6.7: - version "3.6.7" - resolved "https://registry.yarnpkg.com/mc-build/-/mc-build-3.6.7.tgz#f22bd9e7eaf0e565ad5bb04f5b5eb631b3c6ecb4" - integrity sha512-Cd0g/20e3h5/atUzj80689TjOkE7nZuMZg4YPwPzQ8oHRrKnlxnxDwumUfzEwFW6xw8Z52rfC06N8In7Xg3ang== - -md5@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" - integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g== - dependencies: - charenc "0.0.2" - crypt "0.0.2" - is-buffer "~1.1.6" - -mdn-data@2.0.30: - version "2.0.30" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc" - integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -micromatch@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" - integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== - dependencies: - braces "^3.0.3" - picomatch "^2.3.1" - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-db@^1.28.0: - version "1.53.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.53.0.tgz#3cb63cd820fc29896d9d4e8c32ab4fcd74ccb447" - integrity sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg== - -mime-types@^2.1.12: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mimic-response@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== - -mimic-response@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" - integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== - -min-indent@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" - integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== - -minimatch@^10.0.3: - version "10.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.0.3.tgz#cf7a0314a16c4d9ab73a7730a0e8e3c3502d47aa" - integrity sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw== - dependencies: - "@isaacs/brace-expansion" "^5.0.0" - -minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^9.0.4: - version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - -minimist@^1.2.0, minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -minipass@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== - -mkdirp@^0.5.1: - version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - -molangjs@^1.6.3: - version "1.6.4" - resolved "https://registry.yarnpkg.com/molangjs/-/molangjs-1.6.4.tgz#3e538fb2f4f79b3b31bbf1cabd566a07e8772144" - integrity sha512-Evi2MbMcfDFwcG4HVjsX4MAj+jc7itlp1Ncd+sQ+4jel7N1pADUJpiWEdg3d9IIK+0RQwJw7EE3GrM+ERWbcQA== - -mri@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" - integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== - -mrmime@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27" - integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -nanoid@^3.3.11: - version "3.3.11" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" - integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== - -nanoid@^3.3.7: - version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" - integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== - -natural-compare-lite@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" - integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -node-fetch@2.6.7: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" - -node-modules-vscode-problems-patch@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/node-modules-vscode-problems-patch/-/node-modules-vscode-problems-patch-1.0.9.tgz#8b099c72bb051c056d0a021ed506e8ce47c1e618" - integrity sha512-PYS8ozhWFbPvksJBIKbWrdrKOD2e+MZaxl75amn/oaVAzObgmGQeYnk4VT5tT/d5KHhWiuUwzWWSgbQ57GVMfA== - dependencies: - esbuild "^0.25.0" - glob "^11.0.1" - -normalize-url@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6" - integrity sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw== - dependencies: - prepend-http "^2.0.0" - query-string "^5.0.1" - sort-keys "^2.0.0" - -normalize-url@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" - integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== - -object-assign@^4.0.1, object-assign@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -octokit@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/octokit/-/octokit-5.0.3.tgz#1e4f110e28218ab9676c28da5f28ab403fe5b643" - integrity sha512-+bwYsAIRmYv30NTmBysPIlgH23ekVDriB07oRxlPIAH5PI0yTMSxg5i5Xy0OetcnZw+nk/caD4szD7a9YZ3QyQ== - dependencies: - "@octokit/app" "^16.0.1" - "@octokit/core" "^7.0.2" - "@octokit/oauth-app" "^8.0.1" - "@octokit/plugin-paginate-graphql" "^6.0.0" - "@octokit/plugin-paginate-rest" "^13.0.0" - "@octokit/plugin-rest-endpoint-methods" "^16.0.0" - "@octokit/plugin-retry" "^8.0.1" - "@octokit/plugin-throttling" "^11.0.1" - "@octokit/request-error" "^7.0.0" - "@octokit/types" "^14.0.0" - "@octokit/webhooks" "^14.0.0" - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -optionator@^0.9.3: - version "0.9.4" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" - integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.5" - -p-cancelable@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0" - integrity sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ== - -p-cancelable@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" - integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== - -p-event@^2.1.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/p-event/-/p-event-2.3.1.tgz#596279ef169ab2c3e0cae88c1cfbb08079993ef6" - integrity sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA== - dependencies: - p-timeout "^2.0.1" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== - -p-is-promise@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" - integrity sha512-zL7VE4JVS2IFSkR2GQKDSPEVxkoH43/p7oEnwpdCndKYJO0HVeRB7fA8TJwuLOTBREtK0ea8eHaxdwcpob5dmg== - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-timeout@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038" - integrity sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA== - dependencies: - p-finally "^1.0.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -package-json-from-dist@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" - integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== - -pako@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" - integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-scurry@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.0.tgz#9f052289f23ad8bf9397a2a0425e7b8615c58580" - integrity sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg== - dependencies: - lru-cache "^11.0.0" - minipass "^7.1.2" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pathe@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" - integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== - -pathval@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.0.tgz#7e2550b422601d4f6b8e26f1301bc8f15a741a25" - integrity sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA== - -pend@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== - -periscopic@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/periscopic/-/periscopic-3.1.0.tgz#7e9037bf51c5855bd33b48928828db4afa79d97a" - integrity sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw== - dependencies: - "@types/estree" "^1.0.0" - estree-walker "^3.0.0" - is-reference "^3.0.0" - -picocolors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" - integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== - -picocolors@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - -picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -picomatch@^4.0.2, picomatch@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" - integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== - -pify@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== - -pkg-dir@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -postcss-load-config@^3.1.4: - version "3.1.4" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz#1ab2571faf84bb078877e1d07905eabe9ebda855" - integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== - dependencies: - lilconfig "^2.0.5" - yaml "^1.10.2" - -postcss-safe-parser@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz#36e4f7e608111a0ca940fd9712ce034718c40ec0" - integrity sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A== - -postcss-scss@^4.0.9: - version "4.0.9" - resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-4.0.9.tgz#a03c773cd4c9623cb04ce142a52afcec74806685" - integrity sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A== - -postcss-selector-parser@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz#4d6af97eba65d73bc4d84bcb343e865d7dd16262" - integrity sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss@^8.4.38: - version "8.4.38" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" - integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== - dependencies: - nanoid "^3.3.7" - picocolors "^1.0.0" - source-map-js "^1.2.0" - -postcss@^8.4.49, postcss@^8.5.6: - version "8.5.6" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c" - integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== - dependencies: - nanoid "^3.3.11" - picocolors "^1.1.1" - source-map-js "^1.2.1" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== - -prettier@^2.5.1: - version "2.8.8" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" - integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== - -prismjs@^1.29.0: - version "1.29.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" - integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -progress@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -protobufjs@^6.11.3: - version "6.11.4" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.4.tgz#29a412c38bf70d89e537b6d02d904a6f448173aa" - integrity sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw== - dependencies: - "@protobufjs/aspromise" "^1.1.2" - "@protobufjs/base64" "^1.1.2" - "@protobufjs/codegen" "^2.0.4" - "@protobufjs/eventemitter" "^1.1.0" - "@protobufjs/fetch" "^1.1.0" - "@protobufjs/float" "^1.0.2" - "@protobufjs/inquire" "^1.1.0" - "@protobufjs/path" "^1.1.2" - "@protobufjs/pool" "^1.1.0" - "@protobufjs/utf8" "^1.1.0" - "@types/long" "^4.0.1" - "@types/node" ">=13.7.0" - long "^4.0.0" - -protobufjs@^7.2.5: - version "7.3.0" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.3.0.tgz#a32ec0422c039798c41a0700306a6e305b9cb32c" - integrity sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g== - dependencies: - "@protobufjs/aspromise" "^1.1.2" - "@protobufjs/base64" "^1.1.2" - "@protobufjs/codegen" "^2.0.4" - "@protobufjs/eventemitter" "^1.1.0" - "@protobufjs/fetch" "^1.1.0" - "@protobufjs/float" "^1.0.2" - "@protobufjs/inquire" "^1.1.0" - "@protobufjs/path" "^1.1.2" - "@protobufjs/pool" "^1.1.0" - "@protobufjs/utf8" "^1.1.0" - "@types/node" ">=13.7.0" - long "^5.0.0" - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@^2.1.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -query-string@^5.0.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" - integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== - dependencies: - decode-uri-component "^0.2.0" - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -quick-lru@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" - integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== - -readable-stream@^2.0.0, readable-stream@^2.3.0, readable-stream@^2.3.5: - version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -request-progress@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe" - integrity sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg== - dependencies: - throttleit "^1.0.0" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -resolve-alpn@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" - integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -responselike@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" - integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== - dependencies: - lowercase-keys "^1.0.0" - -responselike@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc" - integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== - dependencies: - lowercase-keys "^2.0.0" - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@^2.5.2: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -roarr@^2.15.3: - version "2.15.4" - resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd" - integrity sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A== - dependencies: - boolean "^3.0.1" - detect-node "^2.0.4" - globalthis "^1.0.1" - json-stringify-safe "^5.0.1" - semver-compare "^1.0.0" - sprintf-js "^1.1.2" - -rollup@^4.43.0: - version "4.52.4" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.52.4.tgz#71e64cce96a865fcbaa6bb62c6e82807f4e378a1" - integrity sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ== - dependencies: - "@types/estree" "1.0.8" - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.52.4" - "@rollup/rollup-android-arm64" "4.52.4" - "@rollup/rollup-darwin-arm64" "4.52.4" - "@rollup/rollup-darwin-x64" "4.52.4" - "@rollup/rollup-freebsd-arm64" "4.52.4" - "@rollup/rollup-freebsd-x64" "4.52.4" - "@rollup/rollup-linux-arm-gnueabihf" "4.52.4" - "@rollup/rollup-linux-arm-musleabihf" "4.52.4" - "@rollup/rollup-linux-arm64-gnu" "4.52.4" - "@rollup/rollup-linux-arm64-musl" "4.52.4" - "@rollup/rollup-linux-loong64-gnu" "4.52.4" - "@rollup/rollup-linux-ppc64-gnu" "4.52.4" - "@rollup/rollup-linux-riscv64-gnu" "4.52.4" - "@rollup/rollup-linux-riscv64-musl" "4.52.4" - "@rollup/rollup-linux-s390x-gnu" "4.52.4" - "@rollup/rollup-linux-x64-gnu" "4.52.4" - "@rollup/rollup-linux-x64-musl" "4.52.4" - "@rollup/rollup-openharmony-arm64" "4.52.4" - "@rollup/rollup-win32-arm64-msvc" "4.52.4" - "@rollup/rollup-win32-ia32-msvc" "4.52.4" - "@rollup/rollup-win32-x64-gnu" "4.52.4" - "@rollup/rollup-win32-x64-msvc" "4.52.4" - fsevents "~2.3.2" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -sade@^1.6.0: - version "1.8.1" - resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" - integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== - dependencies: - mri "^1.1.0" - -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -sander@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/sander/-/sander-0.5.1.tgz#741e245e231f07cafb6fdf0f133adfa216a502ad" - integrity sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA== - dependencies: - es6-promise "^3.1.2" - graceful-fs "^4.1.3" - mkdirp "^0.5.1" - rimraf "^2.5.2" - -seek-bzip@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.6.tgz#35c4171f55a680916b52a07859ecf3b5857f21c4" - integrity sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ== - dependencies: - commander "^2.8.1" - -semiver@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/semiver/-/semiver-1.1.0.tgz#9c97fb02c21c7ce4fcf1b73e2c7a24324bdddd5f" - integrity sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg== - -semver-compare@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" - integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== - -semver@^5.6.0: - version "5.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - -semver@^6.0.0, semver@^6.2.0: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.3.2, semver@^7.3.7: - version "7.6.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" - integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== - -semver@^7.6.0, semver@^7.6.3: - version "7.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" - integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== - -serialize-error@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" - integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw== - dependencies: - type-fest "^0.13.1" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -siginfo@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" - integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== - -signal-exit@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -sirv-cli@^1.0.0: - version "1.0.14" - resolved "https://registry.yarnpkg.com/sirv-cli/-/sirv-cli-1.0.14.tgz#4bc60421b3de9caea80ccd292b5004aca4ce3c81" - integrity sha512-yyUTNr984ANKDloqepkYbBSqvx3buwYg2sQKPWjSU+IBia5loaoka2If8N9CMwt8AfP179cdEl7kYJ//iWJHjQ== - dependencies: - console-clear "^1.1.0" - get-port "^3.2.0" - kleur "^3.0.0" - local-access "^1.0.1" - sade "^1.6.0" - semiver "^1.0.0" - sirv "^1.0.13" - tinydate "^1.0.0" - -sirv@^1.0.13: - version "1.0.19" - resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.19.tgz#1d73979b38c7fe91fcba49c85280daa9c2363b49" - integrity sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ== - dependencies: - "@polka/url" "^1.0.0-next.20" - mrmime "^1.0.0" - totalist "^1.0.0" - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -sorcery@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/sorcery/-/sorcery-0.11.0.tgz#310c80ee993433854bb55bb9aa4003acd147fca8" - integrity sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw== - dependencies: - "@jridgewell/sourcemap-codec" "^1.4.14" - buffer-crc32 "^0.2.5" - minimist "^1.2.0" - sander "^0.5.0" - -sort-keys-length@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sort-keys-length/-/sort-keys-length-1.0.1.tgz#9cb6f4f4e9e48155a6aa0671edd336ff1479a188" - integrity sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw== - dependencies: - sort-keys "^1.0.0" - -sort-keys@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" - integrity sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg== - dependencies: - is-plain-obj "^1.0.0" - -sort-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" - integrity sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg== - dependencies: - is-plain-obj "^1.0.0" - -source-map-js@^1.0.1, source-map-js@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" - integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== - -source-map-js@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" - integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== - -sprintf-js@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" - integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== - -stackback@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" - integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== - -std-env@^3.9.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.9.0.tgz#1a6f7243b339dca4c9fd55e1c7504c77ef23e8f1" - integrity sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw== - -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ== - -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.1.2" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.2.tgz#132875abde678c7ea8d691533f2e7e22bb744dba" - integrity sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA== - dependencies: - ansi-regex "^6.0.1" - -strip-dirs@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-2.1.0.tgz#4987736264fc344cf20f6c34aca9d13d1d4ed6c5" - integrity sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g== - dependencies: - is-natural-number "^4.0.1" - -strip-indent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" - integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== - dependencies: - min-indent "^1.0.0" - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -strip-literal@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-3.1.0.tgz#222b243dd2d49c0bcd0de8906adbd84177196032" - integrity sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg== - dependencies: - js-tokens "^9.0.1" - -strip-outer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" - integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== - dependencies: - escape-string-regexp "^1.0.2" - -sumchecker@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42" - integrity sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg== - dependencies: - debug "^4.1.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -svelte-ace@^1.0.21: - version "1.0.21" - resolved "https://registry.yarnpkg.com/svelte-ace/-/svelte-ace-1.0.21.tgz#01039fdf2ffae76965cc46f616b55a329a7fb632" - integrity sha512-Ek86AiCNcBYH84P90NmQh4GLW9TB5jZP0zBhqPJ/dGRdOP+LOQ+gQIQ1JyTzYpMGQVlDUb9Ug4yo0hCGWNnjaw== - dependencies: - brace "^0.11.1" - sirv-cli "^1.0.0" - -svelte-awesome-color-picker@^3.0.0-beta.7: - version "3.1.0" - resolved "https://registry.yarnpkg.com/svelte-awesome-color-picker/-/svelte-awesome-color-picker-3.1.0.tgz#b0e2d0abaf4d273bd7812d9313e2bd9eb3744da6" - integrity sha512-na9B9qLaV8XQ6W6eyP6vFyDV2TBF4qvGad6799D4GzbazkiFtoO+lbaFFViAWanz/eECwe/WUAUdg6Jy7LIKFw== - dependencies: - colord "^2.9.3" - svelte-awesome-slider "^1.1.0" - -svelte-awesome-slider@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/svelte-awesome-slider/-/svelte-awesome-slider-1.1.0.tgz#34c46b1e04860f1a88dd12184f7d2c2dc4c9156d" - integrity sha512-MgY6ZdBON42HVZqNWNjq2HOgyDlC35q0TNbV/YO1l1/bcb5yhM8EE97h1AJ/7F6t6sLzXhQ3qPf5nGyCdDSnCg== - -svelte-dnd-action@^0.9.38: - version "0.9.47" - resolved "https://registry.yarnpkg.com/svelte-dnd-action/-/svelte-dnd-action-0.9.47.tgz#f275b042aa23ea82054f2d797c8fd1b2a15f8821" - integrity sha512-Z343HCJfrGHgK98LCrp0ziGUwwWOd8UrpXk7b7A61OQErrB8nUS2tLVRZlaGzhMfE1UCivuqTGFLqxJ14KehfQ== - -svelte-eslint-parser@^1.3.0, svelte-eslint-parser@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/svelte-eslint-parser/-/svelte-eslint-parser-1.3.3.tgz#6ca9010e35ba2f870acbbe9da9396d5767a468d3" - integrity sha512-oTrDR8Z7Wnguut7QH3YKh7JR19xv1seB/bz4dxU5J/86eJtZOU4eh0/jZq4dy6tAlz/KROxnkRQspv5ZEt7t+Q== - dependencies: - eslint-scope "^8.2.0" - eslint-visitor-keys "^4.0.0" - espree "^10.0.0" - postcss "^8.4.49" - postcss-scss "^4.0.9" - postcss-selector-parser "^7.0.0" - -svelte-multiselect@^11.0.0-rc.1: - version "11.0.0-rc.1" - resolved "https://registry.yarnpkg.com/svelte-multiselect/-/svelte-multiselect-11.0.0-rc.1.tgz#1238a6b768902afbdde23165e6dc922555f27342" - integrity sha512-dyUzja9AJfDejfafDj6PKNk3F51HavArevkJxZ0upJKUlPnPx5pDKY24BQYQvUpitTqVtsEoHevKr93WebBtwA== - dependencies: - svelte "4.2.12" - -svelte-preprocess-esbuild@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/svelte-preprocess-esbuild/-/svelte-preprocess-esbuild-3.0.1.tgz#1f31c7a46f56d4c60dde3ec5fe72f2ddf40ad700" - integrity sha512-OV4P/onki7hfuzIpYOd92TT0JSm4y67PvkAAM7RigLd869VEvNh2f6J+ewrEqAgTnZzVQcOWzuaU4hPISNPFpA== - -svelte-preprocess@^5.0.1: - version "5.1.4" - resolved "https://registry.yarnpkg.com/svelte-preprocess/-/svelte-preprocess-5.1.4.tgz#14ada075c94bbd2b71c5ec70ff72f8ebe1c95b91" - integrity sha512-IvnbQ6D6Ao3Gg6ftiM5tdbR6aAETwjhHV+UKGf5bHGYR69RQvF1ho0JKPcbUON4vy4R7zom13jPjgdOWCQ5hDA== - dependencies: - "@types/pug" "^2.0.6" - detect-indent "^6.1.0" - magic-string "^0.30.5" - sorcery "^0.11.0" - strip-indent "^3.0.0" - -svelte@4.2.12: - version "4.2.12" - resolved "https://registry.yarnpkg.com/svelte/-/svelte-4.2.12.tgz#13d98d2274d24d3ad216c8fdc801511171c70bb1" - integrity sha512-d8+wsh5TfPwqVzbm4/HCXC783/KPHV60NvwitJnyTA5lWn1elhXMNWhXGCJ7PwPa8qFUnyJNIyuIRt2mT0WMug== - dependencies: - "@ampproject/remapping" "^2.2.1" - "@jridgewell/sourcemap-codec" "^1.4.15" - "@jridgewell/trace-mapping" "^0.3.18" - "@types/estree" "^1.0.1" - acorn "^8.9.0" - aria-query "^5.3.0" - axobject-query "^4.0.0" - code-red "^1.0.3" - css-tree "^2.3.1" - estree-walker "^3.0.3" - is-reference "^3.0.1" - locate-character "^3.0.0" - magic-string "^0.30.4" - periscopic "^3.1.0" - -svelte@^3.42.3, svelte@^3.55.1: - version "3.59.2" - resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.59.2.tgz#a137b28e025a181292b2ae2e3dca90bf8ec73aec" - integrity sha512-vzSyuGr3eEoAtT/A6bmajosJZIUWySzY2CzB3w2pgPvnkUjGqlDnsNnA0PMO+mMAhuyMul6C2uuZzY6ELSkzyA== - -tar-stream@^1.5.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" - integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== - dependencies: - bl "^1.0.0" - buffer-alloc "^1.2.0" - end-of-stream "^1.0.0" - fs-constants "^1.0.0" - readable-stream "^2.3.0" - to-buffer "^1.1.1" - xtend "^4.0.0" - -three@^0.134.0: - version "0.134.0" - resolved "https://registry.yarnpkg.com/three/-/three-0.134.0.tgz#d7ad4d85d050da0861bf39749b06ddfb5f17157f" - integrity sha512-LbBerg7GaSPjYtTOnu41AMp7tV6efUNR3p4Wk5NzkSsNTBuA5mDGOfwwZL1jhhVMLx9V20HolIUo0+U3AXehbg== - -throttleit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.1.tgz#304ec51631c3b770c65c6c6f76938b384000f4d5" - integrity sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ== - -through@^2.3.8: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== - -timed-out@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - integrity sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA== - -tinybench@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" - integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== - -tinycolor2@^1.4.2, tinycolor2@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.6.0.tgz#f98007460169b0263b97072c5ae92484ce02d09e" - integrity sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw== - -tinydate@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/tinydate/-/tinydate-1.3.0.tgz#e6ca8e5a22b51bb4ea1c3a2a4fd1352dbd4c57fb" - integrity sha512-7cR8rLy2QhYHpsBDBVYnnWXm8uRTr38RoZakFSW7Bs7PzfMPNZthuMLkwqZv7MTu8lhQ91cOFYS5a7iFj2oR3w== - -tinyexec@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.2.tgz#941794e657a85e496577995c6eef66f53f42b3d2" - integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA== - -tinyglobby@^0.2.14, tinyglobby@^0.2.15: - version "0.2.15" - resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.15.tgz#e228dd1e638cea993d2fdb4fcd2d4602a79951c2" - integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ== - dependencies: - fdir "^6.5.0" - picomatch "^4.0.3" - -tinypool@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.1.1.tgz#059f2d042bd37567fbc017d3d426bdd2a2612591" - integrity sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg== - -tinyrainbow@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-2.0.0.tgz#9509b2162436315e80e3eee0fcce4474d2444294" - integrity sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw== - -tinyspy@^4.0.3: - version "4.0.4" - resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-4.0.4.tgz#d77a002fb53a88aa1429b419c1c92492e0c81f78" - integrity sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q== - -to-buffer@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" - integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toad-cache@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/toad-cache/-/toad-cache-3.7.0.tgz#b9b63304ea7c45ec34d91f1d2fa513517025c441" - integrity sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw== - -totalist@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df" - integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -trim-repeated@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" - integrity sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg== - dependencies: - escape-string-regexp "^1.0.2" - -ts-api-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.1.0.tgz#595f7094e46eed364c13fd23e75f9513d29baf91" - integrity sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ== - -tslib@^1.8.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.1.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== - -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-fest@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" - integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== - -typescript-eslint@^8.45.0: - version "8.45.0" - resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.45.0.tgz#98ab164234dc04c112747ec0a4ae29a94efe123b" - integrity sha512-qzDmZw/Z5beNLUrXfd0HIW6MzIaAV5WNDxmMs9/3ojGOpYavofgNAAD/nC6tGV2PczIi0iw8vot2eAe/sBn7zg== - dependencies: - "@typescript-eslint/eslint-plugin" "8.45.0" - "@typescript-eslint/parser" "8.45.0" - "@typescript-eslint/typescript-estree" "8.45.0" - "@typescript-eslint/utils" "8.45.0" - -typescript@^4.5.5, typescript@^4.9.5: - version "4.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" - integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== - -unbzip2-stream@^1.0.9: - version "1.4.3" - resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" - integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== - dependencies: - buffer "^5.2.1" - through "^2.3.8" - -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== - -universal-github-app-jwt@^2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/universal-github-app-jwt/-/universal-github-app-jwt-2.2.2.tgz#38537e5a7d154085a35f97601a5e30e9e17717df" - integrity sha512-dcmbeSrOdTnsjGjUfAlqNDJrhxXizjAz94ija9Qw8YkZ1uu0d+GoZzyH+Jb9tIIqvGsadUfwg+22k5aDqqwzbw== - -universal-user-agent@^7.0.0, universal-user-agent@^7.0.2: - version "7.0.3" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-7.0.3.tgz#c05870a58125a2dc00431f2df815a77fe69736be" - integrity sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A== - -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -url-parse-lax@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" - integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ== - dependencies: - prepend-http "^2.0.0" - -url-to-options@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" - integrity sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A== - -util-deprecate@^1.0.2, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -vite-node@3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-3.2.4.tgz#f3676d94c4af1e76898c162c92728bca65f7bb07" - integrity sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg== - dependencies: - cac "^6.7.14" - debug "^4.4.1" - es-module-lexer "^1.7.0" - pathe "^2.0.3" - vite "^5.0.0 || ^6.0.0 || ^7.0.0-0" - -"vite@^5.0.0 || ^6.0.0 || ^7.0.0-0": - version "7.1.9" - resolved "https://registry.yarnpkg.com/vite/-/vite-7.1.9.tgz#ba844410e5d0c0f2a4eaf17a52af60ebea322cbf" - integrity sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg== - dependencies: - esbuild "^0.25.0" - fdir "^6.5.0" - picomatch "^4.0.3" - postcss "^8.5.6" - rollup "^4.43.0" - tinyglobby "^0.2.15" - optionalDependencies: - fsevents "~2.3.3" - -vitest@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/vitest/-/vitest-3.2.4.tgz#0637b903ad79d1539a25bc34c0ed54b5c67702ea" - integrity sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A== - dependencies: - "@types/chai" "^5.2.2" - "@vitest/expect" "3.2.4" - "@vitest/mocker" "3.2.4" - "@vitest/pretty-format" "^3.2.4" - "@vitest/runner" "3.2.4" - "@vitest/snapshot" "3.2.4" - "@vitest/spy" "3.2.4" - "@vitest/utils" "3.2.4" - chai "^5.2.0" - debug "^4.4.1" - expect-type "^1.2.1" - magic-string "^0.30.17" - pathe "^2.0.3" - picomatch "^4.0.2" - std-env "^3.9.0" - tinybench "^2.9.0" - tinyexec "^0.3.2" - tinyglobby "^0.2.14" - tinypool "^1.1.1" - tinyrainbow "^2.0.0" - vite "^5.0.0 || ^6.0.0 || ^7.0.0-0" - vite-node "3.2.4" - why-is-node-running "^2.3.0" - -vue@^3.2.45: - version "3.4.27" - resolved "https://registry.yarnpkg.com/vue/-/vue-3.4.27.tgz#40b7d929d3e53f427f7f5945386234d2854cc2a1" - integrity sha512-8s/56uK6r01r1icG/aEOHqyMVxd1bkYcSe9j8HcKtr/xTOFWvnzIVTehNW+5Yt89f+DLBe4A569pnZLS5HzAMA== - dependencies: - "@vue/compiler-dom" "3.4.27" - "@vue/compiler-sfc" "3.4.27" - "@vue/runtime-dom" "3.4.27" - "@vue/server-renderer" "3.4.27" - "@vue/shared" "3.4.27" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -websocket-driver@>=0.5.1: - version "0.7.4" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" - integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== - dependencies: - http-parser-js ">=0.5.1" - safe-buffer ">=5.1.0" - websocket-extensions ">=0.1.1" - -websocket-extensions@>=0.1.1: - version "0.1.4" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" - integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -why-is-node-running@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz#a3f69a97107f494b3cdc3bdddd883a7d65cebf04" - integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== - dependencies: - siginfo "^2.0.0" - stackback "0.0.2" - -wintersky@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/wintersky/-/wintersky-1.3.0.tgz#99af4b24bf1a93fdfbca91f3e3bf1c643c1432e4" - integrity sha512-ibeUF+sgoIrFAfgqcNsPlr8+4l0KOfhGw+JgjxKcgtbckSy3gAxqAeNX5LjuQK9y7jcBZDwUIXg9sZDGQ1W+hQ== - dependencies: - molangjs "^1.6.3" - three "^0.134.0" - tinycolor2 "^1.4.2" - -word-wrap@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -xtend@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yaml@^1.10.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yargs@^17.7.2: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yauzl@^2.10.0, yauzl@^2.4.2: - version "2.10.0" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" - integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== - dependencies: - buffer-crc32 "~0.2.3" - fd-slicer "~1.1.0" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==